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 08ac6e0..a826377 100644 --- a/app/src/main/java/com/example/mear/management/MusicFiles.kt +++ b/app/src/main/java/com/example/mear/management/MusicFiles.kt @@ -48,7 +48,7 @@ class MusicFiles (private val demoPath: File) { fun searchForMp3Songs() { try { - var pathList: MutableList? = null + var pathList: MutableList? pathList = mutableListOf() var fileSearch = File(demoPath.absolutePath) @@ -56,12 +56,13 @@ class MusicFiles (private val demoPath: File) { println(it.absolutePath) if (!ignoreThisDirectory(it.absolutePath)) { if (it.isFile) { - if (it.extension.toString().equals(FileTypes.Mp3)) { + if (it.extension == (FileTypes.Mp3)) { pathList.add(it.absolutePath) } } } } + allSongs = pathList } catch (ex: Exception) { 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 e9333bf..71a071a 100644 --- a/app/src/main/java/com/example/mear/management/TrackManager.kt +++ b/app/src/main/java/com/example/mear/management/TrackManager.kt @@ -3,7 +3,9 @@ package com.example.mear.management import android.content.Context import android.media.MediaMetadataRetriever +import java.io.FileInputStream import java.lang.Exception +import kotlinx.coroutines.* import com.example.mear.constants.Filenames import com.example.mear.constants.SongSearch @@ -13,8 +15,17 @@ import com.example.mear.repositories.TrackRepository import com.example.mear.util.ConvertByteArray class TrackManager(var allSongPath: MutableList) { - private var songCount: Int? = null + private var allTracks: MutableList? = null + private var ctx: Context? = null + private var songCount: Int? = null + private var songIndex: Int? = null + private var moreSongs = true + var allTracksAdded = false + + fun initializeContext(context: Context) { + ctx = context + } fun configureTracks(ctx: Context): Int { var id = 0 @@ -49,21 +60,57 @@ class TrackManager(var allSongPath: MutableList) { TrackRepository(ctx).createSongCount(id) return id.dec() } - fun addTracks(ctx: Context) { + fun addTracks() { var initTracks = initialTracks() - addToDatabase(ctx, initTracks) - TrackRepository(ctx).createSongCount(songCount!!) + addToDatabase(initTracks) + + if (moreSongs) { + GlobalScope.launch { + val remainingTracks = remainingTracks() + addToDatabase(remainingTracks) + allTracksAdded = true + } + } } private fun initialTracks(): MutableList { var tracks = mutableListOf() + try { - for (i in 0.. (SongSearch.INITIAL_SEARCH_AMOUNT - 1)) { + var initSongSearch = SongSearch.INITIAL_SEARCH_AMOUNT -1 + + if (allSongPath!!.size < SongSearch.INITIAL_SEARCH_AMOUNT) { + initSongSearch = allSongPath.size + moreSongs = false + } + + for (i in 0.. initSongSearch) { var songPath = allSongPath[i] val track = configureTrack(songPath, i) tracks.add(track) } + songCount = tracks.size + songIndex = songCount!! + } + catch (ex: Exception) { + val exMsg = ex.message + } + + return tracks + } + private fun remainingTracks(): MutableList { + val tracks = mutableListOf() + try { + for (i in songIndex!! .. (allSongPath.size - 1)) { + val songPath = allSongPath[i] + val track = configureTrack(songPath, i) + if (track.id != Int.MAX_VALUE) { + tracks.add(track) + } + } + + songCount = songCount!!.plus(tracks.size) } catch (ex: Exception) { val exMsg = ex.message @@ -73,17 +120,33 @@ class TrackManager(var allSongPath: MutableList) { } private fun configureTrack(songPath: String, id: Int): Track { - val metaData = MediaMetadataRetriever() - metaData.setDataSource(songPath) + try { + val metaData = MediaMetadataRetriever() + val fp = FileInputStream(songPath) + metaData.setDataSource(fp.fd) - val title = metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) - val artist = metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) - val album = metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM) - val duration = (metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION).toInt()) / 1000 + val title = metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) + val artist = metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) + val album = metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM) + val duration = (metaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION).toInt()) / 1000 - return Track(id, title, artist, album, duration, ByteArray(0), songPath) + fp.close() + metaData.release() + + return Track(id, title, artist, album, duration, ByteArray(0), songPath) + } + catch (ex: Exception) { + val exMsg = ex.message + } + + return Track() } + private fun addToDatabase(tracks: List) { + TrackRepository(ctx!!).insertTracks(tracks) + PlayCountRepository(ctx!!).insertPlayCounts(tracks) + TrackRepository(ctx!!).createSongCount(songCount!!) + } private fun addToDatabase(ctx: Context, tracks: List) { TrackRepository(ctx).insertTracks(tracks) PlayCountRepository(ctx).insertPlayCounts(tracks) 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 2635db2..089b433 100644 --- a/app/src/main/java/com/example/mear/models/Track.kt +++ b/app/src/main/java/com/example/mear/models/Track.kt @@ -1,5 +1,6 @@ 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) { +data class Track (val id: Int = Int.MAX_VALUE, val title: String = "UNTITLED", val artist: String = "UNTITLED", + val album: String = "UNTITLED", val length: Int = Int.MAX_VALUE, + val TrackCover: ByteArray = ByteArray(0), val songPath: String = "UNTITLED") { } \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/playback/service/MusicService.kt b/app/src/main/java/com/example/mear/playback/service/MusicService.kt index 53c8d98..d69fef2 100644 --- a/app/src/main/java/com/example/mear/playback/service/MusicService.kt +++ b/app/src/main/java/com/example/mear/playback/service/MusicService.kt @@ -27,7 +27,9 @@ class MusicService: Service() { } private var trackPlayer: MediaPlayer? = null - private var currentSongIndex: Int? = null + private var trackMgr: TrackManager? = null + private var currentTrack = Track() + private var currentSongIndex: Int? = null private var shuffleOn: Boolean? = null private var repeatOn: Boolean? = null private val mBinder = LocalBinder() @@ -70,11 +72,17 @@ class MusicService: Service() { } fun playTrack(id: Int) { - currentSongIndex = id - trackPlayer!!.reset() - trackPlayer!!.setDataSource(TrackRepository(this).getTrack(id).songPath) - trackPlayer!!.prepare() - trackPlayer!!.start() + try { + currentSongIndex = id + trackPlayer!!.reset() + currentTrack = TrackRepository(this).getTrack(id) + trackPlayer!!.setDataSource(currentTrack.songPath) + trackPlayer!!.prepare() + trackPlayer!!.start() + } + catch (ex: Exception) { + val exMsg = ex.message + } } fun goToPosition(progress: Int) { @@ -102,14 +110,15 @@ class MusicService: Service() { shuffleOn = retrieveShuffleMode() trackPlayer!!.reset() if (duration > seconds) { - trackPlayer!!.setDataSource(TrackRepository(this).getTrack(currentSongIndex!!).songPath) + currentTrack = TrackRepository(this).getTrack(currentSongIndex!!) + trackPlayer!!.setDataSource(currentTrack.songPath) trackPlayer!!.prepare() trackPlayer!!.start() } else { val previousTrackNumber = fetchSongIndex(PlayTypes.PlayPreviousSong) - val track = TrackRepository(this).getTrack(previousTrackNumber) - trackPlayer!!.setDataSource(track.songPath) + currentTrack = TrackRepository(this).getTrack(previousTrackNumber) + trackPlayer!!.setDataSource(currentTrack.songPath) trackPlayer!!.prepare() trackPlayer!!.start() } @@ -123,8 +132,9 @@ class MusicService: Service() { trackPlayer!!.reset() shuffleOn = retrieveShuffleMode() var nextTrack = fetchSongIndex(PlayTypes.PlayNextSong) - val track = TrackRepository(this).getTrack(nextTrack) - trackPlayer!!.setDataSource(track.songPath) + val allTracks = TrackRepository(this).getAll() + currentTrack = TrackRepository(this).getTrack(nextTrack) + trackPlayer!!.setDataSource(currentTrack.songPath) trackPlayer!!.prepare() trackPlayer!!.start() } @@ -180,16 +190,8 @@ class MusicService: Service() { } fun getCurrentTrack(): Track { - var track: Track? = null - track = TrackRepository(this).getTrack(currentSongIndex!!) - val info = trackPlayer!!.trackInfo - - if (trackPlayer!!.isPlaying) { - val res = "songs are being played" - } - - return track!! + return currentTrack } @@ -266,8 +268,8 @@ class MusicService: Service() { } currentSongIndex = Random.nextInt(0, TrackRepository(this).getSongCount()) - val trackToPlay = TrackRepository(this).getTrack(currentSongIndex!!) - trackPlayer!!.setDataSource(trackToPlay.songPath) + currentTrack = TrackRepository(this).getTrack(currentSongIndex!!) + trackPlayer!!.setDataSource(currentTrack.songPath) trackPlayer!!.prepareAsync() trackPlayer!!.setOnCompletionListener { playNextTrack() @@ -281,8 +283,9 @@ class MusicService: Service() { var mp3Paths = MusicFiles(android.os.Environment.getExternalStorageDirectory()) mp3Paths.searchForMp3Songs() val paths = mp3Paths.allSongs - val trackMgr = TrackManager(paths!!) - trackMgr.addTracks(this) + trackMgr = TrackManager(paths!!) + trackMgr!!.initializeContext(this) + trackMgr!!.addTracks() initializeShuffleMode() initializeRepeatMode() } @@ -375,11 +378,8 @@ class MusicService: Service() { try { val count = TrackRepository(this).getSongCount() - TrackRepository(this).delete() - // TODO: Replace this with the local count varialbe when issue #43 is resolved - // as well as remove the call to delete the Track table - return 0 + return count } catch (ex: Exception) { val exMsg = ex.message diff --git a/app/src/main/res/drawable-hdpi/ic_action_more_vert.png b/app/src/main/res/drawable-hdpi/ic_action_more_vert.png new file mode 100644 index 0000000..13bb36e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_more_vert.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_more_vert.png b/app/src/main/res/drawable-mdpi/ic_action_more_vert.png new file mode 100644 index 0000000..3acd7f4 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_more_vert.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_more_vert.png b/app/src/main/res/drawable-xhdpi/ic_action_more_vert.png new file mode 100644 index 0000000..5efd581 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_more_vert.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_more_vert.png b/app/src/main/res/drawable-xxhdpi/ic_action_more_vert.png new file mode 100644 index 0000000..41f1aa8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_more_vert.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_more_vert.png b/app/src/main/res/drawable-xxxhdpi/ic_action_more_vert.png new file mode 100644 index 0000000..553814c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_more_vert.png differ