diff --git a/app/app.iml b/app/app.iml
index 7dff500..744ea53 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -26,7 +26,7 @@
-
+
@@ -78,13 +78,6 @@
-
-
-
-
-
-
-
@@ -92,6 +85,13 @@
+
+
+
+
+
+
+
@@ -99,13 +99,6 @@
-
-
-
-
-
-
-
@@ -113,6 +106,13 @@
+
+
+
+
+
+
+
@@ -135,6 +135,7 @@
+
@@ -182,11 +183,12 @@
-
+
+
@@ -219,6 +221,7 @@
+
@@ -226,6 +229,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index 60132c3..09cee58 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -40,4 +40,5 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:cardview-v7:28.0.0'
+ implementation 'com.squareup.picasso:picasso:2.71828'
}
diff --git a/app/src/main/java/com/example/mear/activities/MainActivity.kt b/app/src/main/java/com/example/mear/activities/MainActivity.kt
index 5056c82..5df32ff 100644
--- a/app/src/main/java/com/example/mear/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt
@@ -1,9 +1,7 @@
package com.example.mear.activities
import android.content.Intent
-import android.graphics.BitmapFactory
import android.graphics.Color
-import android.media.MediaMetadataRetriever
import android.os.Bundle
import android.os.Handler
@@ -26,6 +24,8 @@ import com.example.mear.models.PlayControls
import com.example.mear.R
import com.example.mear.repositories.RepeatRepository
import com.example.mear.repositories.ShuffleRepository
+import com.example.mear.util.ConvertByteArray
+import com.example.mear.util.ExtractCover
class MainActivity : BaseServiceActivity() {
@@ -242,12 +242,19 @@ class MainActivity : BaseServiceActivity() {
(trackDuration % 60)
)
+ var coverExt = ExtractCover(currTrack.songPath)
+
+ if (coverExt.hasCover()) {
+ trackCover = coverExt.retrieveCover()
+ }
+ /**
val mmr = MediaMetadataRetriever()
mmr.setDataSource(currTrack.songPath)
if (mmr.embeddedPicture != null) {
trackCover = mmr.embeddedPicture
}
+ */
resetControls()
@@ -256,8 +263,8 @@ class MainActivity : BaseServiceActivity() {
AlbumTitle.text = albumTitle
TrackDuration.text = dur
if (trackCover != null) {
- val songImage = BitmapFactory
- .decodeByteArray(trackCover, 0, trackCover.size)
+ val convertToBmp = ConvertByteArray(trackCover!!)
+ var songImage = convertToBmp.convertToBmp()
TrackCover.imageBitmap = songImage
}
}
diff --git a/app/src/main/java/com/example/mear/activities/SongViewActivity.kt b/app/src/main/java/com/example/mear/activities/SongViewActivity.kt
index ecfacb2..44b3220 100644
--- a/app/src/main/java/com/example/mear/activities/SongViewActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/SongViewActivity.kt
@@ -1,44 +1,131 @@
package com.example.mear.activities
+import android.os.Build
import android.os.Bundle
+import android.support.annotation.RequiresApi
import android.support.v7.app.AppCompatActivity
-import android.widget.LinearLayout
-import android.widget.ListView
+import android.support.v7.widget.LinearLayoutManager
+import java.lang.Exception
import kotlinx.android.synthetic.main.activity_song_view.*
import kotlinx.android.synthetic.main.content_song_view.*
+import com.example.mear.adapters.RecyclerAdapter
+import com.example.mear.models.TrackItems
import com.example.mear.R
import com.example.mear.repositories.TrackRepository
+import com.example.mear.util.ExtractCover
class SongViewActivity : AppCompatActivity() {
+ private var trackListItems = arrayListOf()
+ private lateinit var adapter: RecyclerAdapter
+ private lateinit var linearLayoutManager: LinearLayoutManager
- private lateinit var listView: ListView
+ @RequiresApi(Build.VERSION_CODES.N)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_song_view)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
- initializeAdapter()
+ try {
+ window.statusBarColor = resources.getColor(R.color.track_seek)
+ initializeAdapter()
+ }
+ catch (ex: Exception) {
+ var exMsg = ex.message
+ }
+ }
+
+ override fun onStart() {
+ super.onStart()
+ if (trackListItems.size == 0) {
+ val df = ""
+ }
+
}
+ @RequiresApi(Build.VERSION_CODES.N)
private fun initializeAdapter() {
- listView = findViewById(R.id.recipe_list_view)
-// 1
- val recipeList = Recipe.getRecipesFromFile("recipes.json", this)
-// 2
- val listItems = arrayOfNulls(recipeList.size)
-// 3
- for (i in 0 until recipeList.size) {
- val recipe = recipeList[i]
- listItems[i] = recipe.title
+ try {
+ linearLayoutManager = LinearLayoutManager(this)
+ trackList.layoutManager = linearLayoutManager
+
+ trackListItems = retrieveTrackItems()
+
+ adapter = RecyclerAdapter(trackListItems)
+ trackList.adapter = adapter
+ trackList.setHasFixedSize(true)
+ //trackList.setItemViewCacheSize(20);
+ //trackList.setDrawingCacheEnabled(true);
+ //trackList.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
}
-// 4
- val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, listItems)
- listView.adapter = adapter
+ catch (ex: Exception) {
+ val exMsg = ex.message
+ }
+ }
+
+ @RequiresApi(Build.VERSION_CODES.N)
+ private fun retrieveTrackItems(): ArrayList {
+ var trackItems: ArrayList? = null
+ try {
+ trackItems = arrayListOf()
+
+ val tracks = TrackRepository(this).getAll()
+
+ var index = 0
+ val max = 200
+ var done = false
+ /**
+ tracks.parallelStream().map {track ->
+ val cover = ExtractCover(track.songPath)
+ var trackCover = ByteArray(0)
+ if (cover.hasCover() && !done) {
+ if (index < max ) {
+ trackCover = cover.retrieveCover()
+ }
+ else {
+ done = true
+ }
+ index++
+ }
+ if (done) {
+ //return trackItems
+ }
+
+ val trackItem = TrackItems(track.id, track.title, track.artist, trackCover!!)
+ trackItems.add(trackItem)
+
+ }
+ */
+ for (track in tracks) {
+ val cover = ExtractCover(track.songPath)
+ var trackCover = ByteArray(0)
+ if (cover.hasCover() && !done) {
+ if (index < max ) {
+ trackCover = cover.retrieveCover()
+ }
+ else {
+ done = true
+ }
+ index++
+ }
+ if (done) {
+ return trackItems
+ }
+
+ val trackItem = TrackItems(track.id, track.title, track.artist, trackCover!!)
+ trackItems.add(trackItem)
+ }
+ return trackItems
+ }
+ catch (ex: Exception) {
+ val exMsg = ex.message
+ }
+
+ return trackItems!!
}
}
diff --git a/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt b/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt
index b0a86d0..e183b98 100644
--- a/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt
+++ b/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt
@@ -1,63 +1,81 @@
-package com.example.mear.com.example.mear.adapters
+package com.example.mear.adapters
-import android.content.Context
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
+import android.content.Intent
import android.support.v7.widget.RecyclerView
-import android.support.v7.widget.RecyclerView.Adapter
-import android.view.LayoutInflater
-import android.widget.TextView
-import android.widget.ImageView
import android.view.View
import android.view.ViewGroup
-import android.widget.BaseAdapter
+import java.lang.Exception
+import kotlinx.android.synthetic.main.fragment_song_view.view.*
+
+import com.squareup.picasso.Picasso
+
+import com.example.mear.activities.SongViewActivity
+import com.example.mear.constants.Filenames
+import com.example.mear.inflate
import com.example.mear.models.TrackItems
import com.example.mear.R
-class RecyclerAdapter(private val context: Context,
- private val source: ArrayList): BaseAdapter() {
+class RecyclerAdapter( private val trackItemsSourceInit: ArrayList) :
+ RecyclerView.Adapter() {
-
- private val inflater: LayoutInflater
- = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
-
-
- override fun getCount(): Int {
- return source.size
+ override fun getItemCount(): Int {
+ return trackItemsSourceInit!!.size
}
- //2
- override fun getItem(position: Int): Any {
- return source[position]
+ override fun onBindViewHolder(holder: TrackItemsHolder, position: Int) {
+ val itemPhoto = trackItemsSourceInit!![position]
+ holder.bindTrackItems(itemPhoto)
}
- //3
- override fun getItemId(position: Int): Long {
- return position.toLong()
+ override fun onCreateViewHolder(parent: ViewGroup, position: Int): TrackItemsHolder {
+ val inflatedView = parent.inflate(R.layout.fragment_song_view, false)
+ return TrackItemsHolder(inflatedView)
}
- //4
- override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
- // Get view for row item
- val rowView = inflater.inflate(R.layout.fragment_song_view, parent, false)
- val trackTitleTextView = rowView.findViewById(R.id.trackTitle) as TextView
-
-// Get subtitle element
- val trackArtistTextView= rowView.findViewById(R.id.trackArtist) as TextView
-
-// Get detail element
- val trackCoverImageView = rowView.findViewById(R.id.trackCover) as ImageView
-
- val track = getItem(position) as TrackItems
-
-// 2
- trackTitleTextView.text = track.trackTitle
- trackArtistTextView.text = track.artistTitle
- trackCoverImageView.setImageBitmap(BitmapFactory.decodeByteArray(track.trackCover, 0, track.trackCover.size))
+ class TrackItemsHolder(v: View) : RecyclerView.ViewHolder(v), View.OnClickListener {
+ private var view: View = v
+ private var trackItem: TrackItems? = null
+ private val imgWidth = 90
+ private val imgHeight = 90
- return rowView
+ init {
+ v.setOnClickListener(this)
+ }
+
+ override fun onClick(v: View) {
+ try {
+ val context = itemView.context
+ val showPhotoIntent = Intent(context, SongViewActivity::class.java)
+ //showPhotoIntent.putExtra(PHOTO_KEY, trackItem)
+ context.startActivity(showPhotoIntent)
+ }
+ catch (ex: Exception) {
+ val exMsg = ex.message
+ }
+ }
+
+ fun bindTrackItems(trackItems: TrackItems) {
+ try {
+ var context = view.context
+ this.trackItem = trackItems
+ view.trackTitle.text = trackItem!!.trackTitle
+ view.trackArtist.text = trackItem!!.artistTitle
+ val id = trackItems.id
+
+ var trackCoverPath = "${context.filesDir}/${Filenames.TRACK_COVERS}"
+ trackCoverPath = "${trackCoverPath}${id}.bmp"
+ Picasso.get().load(trackCoverPath).into(view.trackCover)
+ }
+ catch (ex:Exception) {
+ val exMsg = ex.message
+ }
+ }
+
+ companion object {
+ private val PHOTO_KEY = "PHOTO"
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/mear/constants/Filenames.kt b/app/src/main/java/com/example/mear/constants/Filenames.kt
new file mode 100644
index 0000000..6e44120
--- /dev/null
+++ b/app/src/main/java/com/example/mear/constants/Filenames.kt
@@ -0,0 +1,5 @@
+package com.example.mear.constants
+
+object Filenames {
+ const val TRACK_COVERS = "TrackCover_"
+}
\ No newline at end of file
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 10583fa..3e7fb63 100644
--- a/app/src/main/java/com/example/mear/management/MusicFiles.kt
+++ b/app/src/main/java/com/example/mear/management/MusicFiles.kt
@@ -56,9 +56,11 @@ class MusicFiles (private val demoPath: File) {
println(it.absolutePath)
if (!ignoreThisDirectory(it.absolutePath)) {
if (it.isFile) {
+ /**
if (it.endsWith(FileTypes.Mp3)) {
pathList.add(it.absolutePath)
}
+ */
if (it.extension.toString().equals(FileTypes.Mp3)) {
pathList.add(it.absolutePath)
}
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 f74b4cb..7086f84 100644
--- a/app/src/main/java/com/example/mear/management/TrackManager.kt
+++ b/app/src/main/java/com/example/mear/management/TrackManager.kt
@@ -5,9 +5,11 @@ import android.media.MediaMetadataRetriever
import java.lang.Exception
+import com.example.mear.constants.Filenames
import com.example.mear.models.Track
import com.example.mear.repositories.PlayCountRepository
import com.example.mear.repositories.TrackRepository
+import com.example.mear.util.ConvertByteArray
class TrackManager(var allSongPath: MutableList) {
@@ -33,19 +35,31 @@ class TrackManager(var allSongPath: MutableList) {
val track = Track(id, trackTitle, trackArtist, trackAlbum, trackLength,
ByteArray(0), musicPath)
dumpToDatabase(ctx, track)
+ saveTrackCoverToDisk(ctx, id, mmr.embeddedPicture)
id++
}
- TrackRepository(ctx).createSongCount((id -1))
}
catch (ex: Exception) {
val exMsg = ex.message
}
+ TrackRepository(ctx).createSongCount((id -1))
return id.dec()
}
private fun dumpToDatabase(ctx: Context, track: Track) {
TrackRepository(ctx).insertTrack(track)
PlayCountRepository(ctx).insertPlayCount(track)
}
+ private fun saveTrackCoverToDisk(context: Context, id: Int, trackCover: ByteArray) {
+ val filename = "${Filenames.TRACK_COVERS}$id.bmp"
+ val fileContents = trackCover
+ var img = ConvertByteArray(trackCover).convertToBmp()
+
+ context.openFileOutput(filename, Context.MODE_PRIVATE).use {
+ it.write(fileContents)
+ }
+
+
+ }
var allTracks: MutableList