diff --git a/app/src/main/java/com/example/mear/MainActivity.kt b/app/src/main/java/com/example/mear/MainActivity.kt index 85bdd1f..a580d76 100644 --- a/app/src/main/java/com/example/mear/MainActivity.kt +++ b/app/src/main/java/com/example/mear/MainActivity.kt @@ -1,28 +1,22 @@ package com.example.mear -import android.content.Context -import android.database.sqlite.SQLiteDatabase -import android.database.sqlite.SQLiteQuery +import android.graphics.Bitmap import android.graphics.BitmapFactory import android.media.MediaPlayer +import android.media.MediaMetadataRetriever import android.os.Bundle import android.os.Environment -import android.support.v7.app.AppCompatActivity; +import android.support.v7.app.AppCompatActivity import java.lang.Exception import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.content_main.* -import kotlinx.coroutines.selects.select import kotlin.io.* import kotlin.random.Random -import org.jetbrains.anko.db.* - -import com.example.mear.management.TrackRepository -import com.example.mear.management.DatabaseManager import com.example.mear.management.MusicFiles import com.example.mear.management.TrackManager -import com.example.mear.models.Track +import com.example.mear.repositories.TrackRepository class MainActivity : AppCompatActivity() { @@ -31,10 +25,21 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) setSupportActionBar(toolbar) - loadTracks(loadSongPaths()) + //loadTracks(loadSongPaths()) + initialize() + } + + + private fun initialize() { + songCount = TrackRepository(this).getSongCount() + currentSong = fetchSongIndex(PlayTypes.PlaySong) initializeMediaPlayer() + initializeClickListeners() + initializeCompletionListener() + } + private fun initializeClickListeners() { PlayTrack.setOnClickListener { playSongTrack() } @@ -44,73 +49,78 @@ class MainActivity : AppCompatActivity() { PreviousTrack.setOnClickListener { playPreviousSongTrack() } - TrackPayer!!.setOnCompletionListener { + } + private fun initializeCompletionListener() { + trackPlayer!!.setOnCompletionListener { playNextSongTrack() } } - - private fun initializeMediaPlayer() { - if (TrackPayer == null) { - TrackPayer = MediaPlayer() + if (trackPlayer == null) { + trackPlayer = MediaPlayer() playerInitialized = true val tr = TrackRepository(this).getTrack(currentSong!!) - TrackPayer!!.setDataSource(tr.songPath) - TrackPayer!!.prepare() + trackPlayer!!.setDataSource(tr.songPath) + trackPlayer!!.prepare() } } private fun playSongTrack() { - + PlayTrack.isEnabled = true try { - if (!TrackPayer!!.isPlaying) { - TrackPayer!!.start() + if (!trackPlayer!!.isPlaying) { + trackPlayer!!.start() configureTrackDisplay() } else { - TrackPayer!!.pause() + trackPlayer!!.pause() } } catch (ex: Exception) { val exMsg = ex.message } + PlayTrack.isEnabled = true } private fun playNextSongTrack() { + NextTrack.isEnabled = false try { currentSong = fetchSongIndex(PlayTypes.PlayNextSong) - if (TrackPayer!!.isPlaying) { - TrackPayer!!.stop() + if (trackPlayer!!.isPlaying) { + trackPlayer!!.stop() } - TrackPayer!!.reset() - TrackPayer!!.setDataSource(TrackRepository(this).getTrack(currentSong!!).songPath) - TrackPayer!!.prepare() - TrackPayer!!.start() + trackPlayer!!.reset() + trackPlayer!!.setDataSource(TrackRepository(this).getTrack(currentSong!!).songPath) + trackPlayer!!.prepare() + trackPlayer!!.start() configureTrackDisplay() } catch (ex: Exception) { val exMsg = ex.message print(exMsg) } + NextTrack.isEnabled = true } private fun playPreviousSongTrack() { + PreviousTrack.isEnabled = false try { currentSong = fetchSongIndex(PlayTypes.PlayPreviousSong) - if (TrackPayer!!.isPlaying) { - TrackPayer!!.stop() + if (trackPlayer!!.isPlaying) { + trackPlayer!!.stop() } - TrackPayer!!.reset() - TrackPayer!!.setDataSource(TrackRepository(this).getTrack(currentSong!!).songPath) - TrackPayer!!.prepare() - TrackPayer!!.start() + trackPlayer!!.reset() + trackPlayer!!.setDataSource(TrackRepository(this).getTrack(currentSong!!).songPath) + trackPlayer!!.prepare() + trackPlayer!!.start() configureTrackDisplay() } catch (ex: Exception) { val exMsg = ex.message print(exMsg) } + PreviousTrack.isEnabled = true } private fun configureTrackDisplay() { val currTrack = TrackRepository(this).getTrack(currentSong!!) @@ -118,8 +128,11 @@ class MainActivity : AppCompatActivity() { val albumTitle = currTrack.album var trackCover: ByteArray? = null - if (!(currTrack.TrackCover == null)) { - trackCover = currTrack.TrackCover + var mmr = MediaMetadataRetriever() + mmr.setDataSource(currTrack.songPath) + + if (mmr.embeddedPicture != null) { + trackCover = mmr.embeddedPicture } TrackTitle.text.clear() @@ -129,8 +142,8 @@ class MainActivity : AppCompatActivity() { TrackTitle.setText(trackTitle) AlbumTitle.setText(albumTitle) if (trackCover != null) { - var songImage = BitmapFactory - .decodeByteArray(trackCover, 0, trackCover!!.size) + val songImage = BitmapFactory + .decodeByteArray(trackCover, 0, trackCover.size) TrackCover.setImageBitmap(songImage) } } @@ -141,9 +154,8 @@ class MainActivity : AppCompatActivity() { try { when (playType) { PlayTypes.PlayPreviousSong -> { - if (currentSong!! == 0) { - songIndex = songCount - } else { + songIndex = songCount + if (currentSong!! != 0) { songIndex = currentSong!!.dec() } } @@ -151,9 +163,8 @@ class MainActivity : AppCompatActivity() { songIndex = Random.nextInt(0, songCount!!) } PlayTypes.PlayNextSong -> { - if (currentSong!! == songCount!!) { - songIndex = 0 - } else { + songIndex = 0 + if (currentSong!! != songCount!!) { songIndex = currentSong!!.inc() } } @@ -177,23 +188,10 @@ class MainActivity : AppCompatActivity() { } private fun loadTracks(allSongs: MutableList) { try { + val trackMgr = TrackManager(allSongs) + songCount = trackMgr.configureTracks(this) - //var trackMgr = TrackManager(allSongs!!) - //trackMgr.deleteTable(this) - //songCount = trackMgr.configureTracks(this) - //songCount = trackMgr.configureTracks(this) - //TrackRepository(this).createSongCount(songCount!!) - //var sC = TrackRepository(this).getSongCount() - //trackMgr.dumpToDatabase(this) - //trackMgr.dumpToDatabase() - //val allTracks = trackMgr.allTracks - //databaseInit(allTracks!!) - //databaseInit(trackMgr.allTracks!!) - //trackMgr = TrackManager( mutableListOf()) - - //val obk = TrackRepository(this).getAll() - //TrackRepository(this).songCount = TrackRepository(this).getAll().size - songCount = TrackRepository(this).getSongCount() + songCount = TrackRepository(this).getSongCount() currentSong = fetchSongIndex(PlayTypes.PlaySong) } @@ -202,15 +200,8 @@ class MainActivity : AppCompatActivity() { } } - private fun databaseInit(allTracks: MutableList) { - TrackRepository(this).delete() - for (songData in allTracks) { - TrackRepository(this).create(songData) - } - } - - private var TrackPayer: MediaPlayer? = null + private var trackPlayer: MediaPlayer? = null private var currentSong: Int? = null private var playerInitialized: Boolean? = null private var songCount: Int? = null diff --git a/app/src/main/java/com/example/mear/management/DatabaseManager.kt b/app/src/main/java/com/example/mear/management/DatabaseManager.kt index 006475d..b9d58ef 100644 --- a/app/src/main/java/com/example/mear/management/DatabaseManager.kt +++ b/app/src/main/java/com/example/mear/management/DatabaseManager.kt @@ -5,6 +5,7 @@ import android.database.sqlite.SQLiteDatabase import org.jetbrains.anko.db.* import org.jetbrains.anko.db.ManagedSQLiteOpenHelper +import java.lang.Exception class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear", null, 1) { @@ -22,24 +23,45 @@ class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear", override fun onCreate(db: SQLiteDatabase?) { - //db!!.dropTable("Track") - db!!.createTable("Track", true, - "Id" to INTEGER + PRIMARY_KEY + UNIQUE, - "Title" to TEXT, "Album" to TEXT, "Artist" to TEXT, - "Cover" to BLOB, "Duration" to INTEGER, - "FilePath" to TEXT) - db!!.createTable("TrackCount", true, - "Id" to INTEGER + PRIMARY_KEY + UNIQUE, - "TotalSongs" to INTEGER) + try { + db!!.createTable( + "Track", true, + "Id" to INTEGER + PRIMARY_KEY + UNIQUE, + "Title" to TEXT, "Album" to TEXT, "Artist" to TEXT, + "Cover" to BLOB, "Duration" to INTEGER, + "FilePath" to TEXT + ) + db!!.createTable( + "TrackCount", true, + "Id" to INTEGER + PRIMARY_KEY + UNIQUE, + "TotalSongs" to INTEGER + ) + db!!.createTable( + "PlayCount", true, + "Id" to INTEGER + PRIMARY_KEY + AUTOINCREMENT, + "PlayCount" to INTEGER, + "TrackId" to INTEGER + ) + db!!.createTable( + "Settings", true, + "Id" to INTEGER + PRIMARY_KEY + UNIQUE, + "DarkTheme" to org.jetbrains.anko.db.REAL + ) + } + catch (ex: Exception) { + } } override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { + try { db!!.dropTable("Track") db!!.dropTable("TrackCount") - } + db!!.dropTable("PlayCount") + db!!.dropTable("Settings") - - private fun createSettingsTable() { + } + catch (ex: Exception) { + } } } diff --git a/app/src/main/java/com/example/mear/management/MusicFiles.kt b/app/src/main/java/com/example/mear/management/MusicFiles.kt index 1b8bff5..a58f190 100644 --- a/app/src/main/java/com/example/mear/management/MusicFiles.kt +++ b/app/src/main/java/com/example/mear/management/MusicFiles.kt @@ -34,7 +34,6 @@ class MusicFiles (private val demoPath: File) { } } } - songCount = count } catch (ex: Exception) { var exMsg = ex.message @@ -43,6 +42,5 @@ class MusicFiles (private val demoPath: File) { var allSongs: MutableList?= null - var songCount: Int? = null val musicSongLimit = Int.MAX_VALUE } \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/management/TrackManager.kt b/app/src/main/java/com/example/mear/management/TrackManager.kt index f258223..f731cd1 100644 --- a/app/src/main/java/com/example/mear/management/TrackManager.kt +++ b/app/src/main/java/com/example/mear/management/TrackManager.kt @@ -1,12 +1,13 @@ package com.example.mear.management import android.content.Context -import android.graphics.BitmapFactory import android.media.MediaMetadataRetriever import java.lang.Exception import com.example.mear.models.Track +import com.example.mear.repositories.PlayCountRepository +import com.example.mear.repositories.TrackRepository class TrackManager(var allSongPath: MutableList) { @@ -37,7 +38,7 @@ class TrackManager(var allSongPath: MutableList) { println("dd") } - var track = Track(id, trackTitle, trackArtist, trackAlbum, trackLength, + val track = Track(id, trackTitle, trackArtist, trackAlbum, trackLength, art!!, musicPath) dumpToDatabase(ctx, track) id++ @@ -52,7 +53,7 @@ class TrackManager(var allSongPath: MutableList) { fun dumpToDatabase(ctx: Context) { TrackRepository(ctx).delete() for (songData in allTracks!!) { - TrackRepository(ctx).create(songData) + TrackRepository(ctx).insertTrack(songData) allTracks!!.removeAt(songData.id ) } } @@ -60,7 +61,8 @@ class TrackManager(var allSongPath: MutableList) { TrackRepository(ctx).delete() } private fun dumpToDatabase(ctx: Context, track: Track) { - TrackRepository(ctx).create(track) + TrackRepository(ctx).insertTrack(track) + PlayCountRepository(ctx).insertPlayCount(track) } var allTracks: MutableList? = null diff --git a/app/src/main/java/com/example/mear/models/PlayCount.kt b/app/src/main/java/com/example/mear/models/PlayCount.kt new file mode 100644 index 0000000..e6a600d --- /dev/null +++ b/app/src/main/java/com/example/mear/models/PlayCount.kt @@ -0,0 +1,4 @@ +package com.example.mear.models + +data class PlayCount(val id: Int, val playCount: Int, val trackId: Int) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/models/Settings.kt b/app/src/main/java/com/example/mear/models/Settings.kt new file mode 100644 index 0000000..eafc77d --- /dev/null +++ b/app/src/main/java/com/example/mear/models/Settings.kt @@ -0,0 +1,4 @@ +package com.example.mear.models + +data class Settings(val id: Int, val darkTheme: Boolean) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/models/Track.kt b/app/src/main/java/com/example/mear/models/Track.kt index 4ae4fdc..2635db2 100644 --- a/app/src/main/java/com/example/mear/models/Track.kt +++ b/app/src/main/java/com/example/mear/models/Track.kt @@ -2,14 +2,4 @@ package com.example.mear.models data class Track (val id: Int, val title: String, val artist: String, val album: String, val length: Int, val TrackCover: ByteArray, val songPath: String) { - companion object { - //val Track.COLUMN_ID = "id" - val TABLE_NAME = "Track" - val COLUMN_TITLE = "Title" - val COLUMN_ARTIST = "Artist" - val COLUMN_ALBUM = "Album" - val COLUMN_DURATION = "Duration" - val COLUMN_COVER = "Cover" - val COLUMN_SONGPATH = "SongPath" - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt b/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt new file mode 100644 index 0000000..80018af --- /dev/null +++ b/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt @@ -0,0 +1,62 @@ +package com.example.mear.repositories + +import android.content.Context + +import org.jetbrains.anko.db.* + +import com.example.mear.database +import com.example.mear.models.PlayCount +import com.example.mear.models.Track + +class PlayCountRepository(val context: Context) { + fun getAll(): List = context.database.use { + val playCounts = mutableListOf() + + select("PlayCount" ) + .parseList(object : MapRowParser{ + override fun parseRow(columns: Map): PlayCount { + val id = columns.getValue("Id").toString().toInt() + val songPlayedAmount = columns.getValue("PlayCount").toString().toInt() + val trackId = columns.getValue("TrackId").toString().toInt() + + val playCount = PlayCount(id, songPlayedAmount, trackId) + playCounts.add(playCount) + + return playCount + } + }) + playCounts + } + fun getPlayCount(id: Int): PlayCount = context.database.use { + select("PlayCount").where("Id = $id") + .parseSingle(object: MapRowParser{ + override fun parseRow(columns: Map): PlayCount { + val id = columns.getValue("Id").toString().toInt() + val songPlayedAmount = columns.getValue("PlayCount").toString().toInt() + val trackId = columns.getValue("TrackId").toString().toInt() + + val playCount = PlayCount(id, songPlayedAmount, trackId) + + return playCount + } + }) + } + fun insertPlayCount(track: Track) = context.database.use { + insert("PlayCount", + "Id" to track.id, + "PlayCount" to 0, + "TrackId" to track.id) + } + fun updatePlayCount(playCount: PlayCount) = context.database.use { + update("PlayCount", + "PlayCount" to playCount.playCount + 1) + .where("Id = {playCountId}", "playCountId" to playCount.id).exec() + } + + fun delete(table: PlayCount?) = context.database.use { + delete("PlayCount", whereClause = "id = {$table.id}") + } + fun delete() = context.database.use { + delete("PlayCount") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/repositories/SettingRepository.kt b/app/src/main/java/com/example/mear/repositories/SettingRepository.kt new file mode 100644 index 0000000..eba889a --- /dev/null +++ b/app/src/main/java/com/example/mear/repositories/SettingRepository.kt @@ -0,0 +1,41 @@ +package com.example.mear.repositories + +import android.content.Context + +import org.jetbrains.anko.db.* + +import com.example.mear.database +import com.example.mear.models.Settings + +class SettingRepository(val context: Context) { + fun getSettings(id: Int): Settings = context.database.use { + select("Settings").where("Id = $id") + .parseSingle(object: MapRowParser{ + override fun parseRow(columns: Map): Settings { + val id = columns.getValue("Id").toString().toInt() + val darkTheme = columns.getValue("DarkTheme").toString().toBoolean() + + val settings = Settings (id, darkTheme) + + return settings + } + }) + } + fun insertSettings(settings: Settings) = context.database.use { + insert("Settings", + "Id" to settings.id, + "DarkTheme" to false) + } + fun updateSettings(settings: Settings) = context.database.use { + update("Settings", + "DarkTheme" to settings.darkTheme) + .where("Id = {settingId}", "settingId" to settings.id).exec() + } + + fun delete(table: Settings?) = context.database.use { + delete("Settings", whereClause = "id = {$table.id}") + } + fun delete() = context.database.use { + delete("Settings") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/management/TrackRepository.kt b/app/src/main/java/com/example/mear/repositories/TrackRepository.kt similarity index 90% rename from app/src/main/java/com/example/mear/management/TrackRepository.kt rename to app/src/main/java/com/example/mear/repositories/TrackRepository.kt index 1eb04f5..e4d9544 100644 --- a/app/src/main/java/com/example/mear/management/TrackRepository.kt +++ b/app/src/main/java/com/example/mear/repositories/TrackRepository.kt @@ -1,4 +1,4 @@ -package com.example.mear.management +package com.example.mear.repositories import android.content.Context @@ -30,7 +30,6 @@ class TrackRepository(val context: Context) { return track } }) - sonC = tracks.count() tracks } fun getTrack(id: Int): Track = context.database.use { @@ -62,7 +61,7 @@ class TrackRepository(val context: Context) { }) } - fun create(track: Track) = context.database.use { + fun insertTrack(track: Track) = context.database.use { insert("Track", "Id" to track.id, "Title" to track.title, @@ -78,17 +77,10 @@ class TrackRepository(val context: Context) { "TotalSongs" to songCount) } - fun delete(track: Track) = context.database.use { - delete("Track", whereClause = "id = {$track.id}") + fun delete(table: Any?) = context.database.use { + delete("Track", whereClause = "id = {$table.id}") } fun delete() = context.database.use { delete("Track") } - - - var songCount: Int? = null - - companion object { - var sonC: Int = 0 - } } \ No newline at end of file