()
- keyguardManager?.requestDismissKeyguard(this, null)
+ //setTurnScreenOn(true)
} else {
- this.window.addFlags(
- WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
- WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ window.addFlags(
+ WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ // or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
}
}
@@ -106,7 +107,7 @@ class LockScreenActivity : AbsMusicServiceActivity() {
private fun updateSongs() {
val song = MusicPlayerRemote.currentSong
- GlideApp.with(this)
+ Glide.with(this)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt
index 02bfd600a..e9cb29abe 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt
@@ -15,18 +15,15 @@
package code.name.monkey.retromusic.activities
import android.content.Intent
-import android.content.SharedPreferences
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import androidx.lifecycle.lifecycleScope
import androidx.navigation.contains
import androidx.navigation.ui.setupWithNavController
-import code.name.monkey.retromusic.*
+import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity
import code.name.monkey.retromusic.extensions.*
-import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SearchQueryHelper.getSongs
import code.name.monkey.retromusic.interfaces.IScrollHelper
@@ -35,20 +32,17 @@ import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.PlaylistSongsLoader
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.PreferenceUtil
+import code.name.monkey.retromusic.util.logE
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import org.koin.android.ext.android.get
-class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeListener {
+class MainActivity : AbsSlidingMusicPanelActivity() {
companion object {
const val TAG = "MainActivity"
const val EXPAND_PANEL = "expand_panel"
}
- override fun createContentView(): SlidingMusicPanelLayoutBinding {
- return wrapSlidingMusicPanel()
- }
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setTaskDescriptionColorAuto()
@@ -56,9 +50,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
updateTabs()
setupNavigationController()
- if (!hasPermissions()) {
- findNavController(R.id.fragment_container).navigate(R.id.permissionFragment)
- }
+
WhatsNewFragment.showChangeLog(this)
}
@@ -84,9 +76,9 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
)
}
navController.graph = navGraph
- bottomNavigationView.setupWithNavController(navController)
+ navigationView.setupWithNavController(navController)
// Scroll Fragment to top
- bottomNavigationView.setOnItemReselectedListener {
+ navigationView.setOnItemReselectedListener {
currentFragment(R.id.fragment_container).apply {
if (this is IScrollHelper) {
scrollToTop()
@@ -118,7 +110,9 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
}
private fun saveTab(id: Int) {
- PreferenceUtil.lastTab = id
+ if (PreferenceUtil.libraryCategory.firstOrNull { it.category.id == id }?.visible == true) {
+ PreferenceUtil.lastTab = id
+ }
}
override fun onSupportNavigateUp(): Boolean =
@@ -135,22 +129,6 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
}
}
- override fun onResume() {
- super.onResume()
- PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
- }
-
- override fun onDestroy() {
- super.onDestroy()
- PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
- }
-
- override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
- if (key == GENERAL_THEME || key == MATERIAL_YOU || key == WALLPAPER_ACCENT || key == BLACK_THEME || key == ADAPTIVE_COLOR_APP || key == USER_NAME || key == TOGGLE_FULL_SCREEN || key == TOGGLE_VOLUME || key == ROUND_CORNERS || key == CAROUSEL_EFFECT || key == NOW_PLAYING_SCREEN_ID || key == TOGGLE_GENRE || key == BANNER_IMAGE_PATH || key == PROFILE_IMAGE_PATH || key == CIRCULAR_ALBUM_ART || key == KEEP_SCREEN_ON || key == TOGGLE_SEPARATE_LINE || key == TOGGLE_HOME_BANNER || key == TOGGLE_ADD_CONTROLS || key == ALBUM_COVER_STYLE || key == HOME_ARTIST_GRID_STYLE || key == ALBUM_COVER_TRANSFORM || key == DESATURATED_COLOR || key == EXTRA_SONG_INFO || key == TAB_TEXT_MODE || key == LANGUAGE_NAME || key == LIBRARY_CATEGORIES || key == CUSTOM_FONT || key == APPBAR_MODE || key == CIRCLE_PLAY_BUTTON || key == SWIPE_DOWN_DISMISS) {
- postRecreate()
- }
- }
-
override fun onServiceConnected() {
super.onServiceConnected()
intent ?: return
@@ -218,7 +196,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
private fun parseLongFromIntent(
intent: Intent,
longKey: String,
- stringKey: String
+ stringKey: String,
): Long {
var id = intent.getLongExtra(longKey, -1)
if (id < 0) {
@@ -227,7 +205,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
try {
id = idString.toLong()
} catch (e: NumberFormatException) {
- println(e.message)
+ logE(e)
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
index 2758943a6..5bbb51d7d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
@@ -22,6 +22,7 @@ import android.content.res.ColorStateList
import android.os.Build
import android.os.Bundle
import android.provider.Settings
+import androidx.activity.OnBackPressedCallback
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.net.toUri
@@ -30,8 +31,8 @@ import androidx.core.view.isVisible
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
-import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.databinding.ActivityPermissionBinding
+import code.name.monkey.retromusic.extensions.*
class PermissionActivity : AbsMusicServiceActivity() {
private lateinit var binding: ActivityPermissionBinding
@@ -61,10 +62,14 @@ class PermissionActivity : AbsMusicServiceActivity() {
if (VersionUtils.hasS()) {
binding.bluetoothPermission.show()
binding.bluetoothPermission.setButtonClick {
- ActivityCompat.requestPermissions(this,
+ ActivityCompat.requestPermissions(
+ this,
arrayOf(BLUETOOTH_CONNECT),
- PERMISSION_REQUEST)
+ BLUETOOTH_PERMISSION_REQUEST
+ )
}
+ } else {
+ binding.audioPermission.setNumber("2")
}
binding.finish.accentBackgroundColor()
@@ -79,12 +84,20 @@ class PermissionActivity : AbsMusicServiceActivity() {
finish()
}
}
+ onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
+ override fun handleOnBackPressed() {
+ finishAffinity()
+ remove()
+ }
+ })
}
private fun setupTitle() {
val appName =
- getString(R.string.message_welcome,
- "Metro")
+ getString(
+ R.string.message_welcome,
+ "Metro"
+ )
.parseAsHtml()
binding.appNameText.text = appName
}
@@ -114,23 +127,22 @@ class PermissionActivity : AbsMusicServiceActivity() {
}
private fun hasStoragePermission(): Boolean {
- return ActivityCompat.checkSelfPermission(this,
- Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
+ return ActivityCompat.checkSelfPermission(
+ this,
+ Manifest.permission.READ_EXTERNAL_STORAGE
+ ) == PackageManager.PERMISSION_GRANTED
}
@RequiresApi(Build.VERSION_CODES.S)
private fun hasBluetoothPermission(): Boolean {
- return ActivityCompat.checkSelfPermission(this,
- BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
+ return ActivityCompat.checkSelfPermission(
+ this,
+ BLUETOOTH_CONNECT
+ ) == PackageManager.PERMISSION_GRANTED
}
@RequiresApi(Build.VERSION_CODES.M)
private fun hasAudioPermission(): Boolean {
return Settings.System.canWrite(this)
}
-
- override fun onBackPressed() {
- super.onBackPressed()
- finishAffinity()
- }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/ShareInstagramStory.kt b/app/src/main/java/code/name/monkey/retromusic/activities/ShareInstagramStory.kt
index 9ca6c4caf..546c9d794 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/ShareInstagramStory.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/ShareInstagramStory.kt
@@ -22,26 +22,28 @@ import android.os.Bundle
import android.provider.MediaStore.Images.Media
import android.view.MenuItem
import androidx.core.net.toUri
+import androidx.core.os.BundleCompat
import androidx.core.view.drawToBitmap
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
-import code.name.monkey.retromusic.activities.base.AbsBaseActivity
+import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import code.name.monkey.retromusic.databinding.ActivityShareInstagramBinding
import code.name.monkey.retromusic.extensions.accentColor
-import code.name.monkey.retromusic.extensions.setLightStatusBar
import code.name.monkey.retromusic.extensions.setStatusBarColor
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.Share
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
/**
* Created by hemanths on 2020-02-02.
*/
-class ShareInstagramStory : AbsBaseActivity() {
+class ShareInstagramStory : AbsThemeActivity() {
private lateinit var binding: ActivityShareInstagramBinding
@@ -51,7 +53,7 @@ class ShareInstagramStory : AbsBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
- onBackPressed()
+ onBackPressedDispatcher.onBackPressed()
return true
}
return super.onOptionsItemSelected(item)
@@ -66,16 +68,15 @@ class ShareInstagramStory : AbsBaseActivity() {
binding.toolbar.setBackgroundColor(Color.TRANSPARENT)
setSupportActionBar(binding.toolbar)
- val song = intent.extras?.getParcelable(EXTRA_SONG)
+ val song = intent.extras?.let { BundleCompat.getParcelable(it, EXTRA_SONG, Song::class.java) }
song?.let { songFinal ->
- GlideApp.with(this)
+ Glide.with(this)
.asBitmapPalette()
.songCoverOptions(songFinal)
.load(RetroGlideExtension.getSongModel(songFinal))
.into(object : RetroMusicColoredTarget(binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) {
- val isColorLight = ColorUtil.isColorLight(colors.backgroundColor)
- setColors(isColorLight, colors.backgroundColor)
+ setColors(colors.backgroundColor)
}
})
@@ -103,22 +104,7 @@ class ShareInstagramStory : AbsBaseActivity() {
ColorStateList.valueOf(accentColor())
}
- private fun setColors(colorLight: Boolean, color: Int) {
- setLightStatusBar(colorLight)
- binding.toolbar.setTitleTextColor(
- MaterialValueHelper.getPrimaryTextColor(
- this@ShareInstagramStory,
- colorLight
- )
- )
- binding.toolbar.navigationIcon?.setTintList(
- ColorStateList.valueOf(
- MaterialValueHelper.getPrimaryTextColor(
- this@ShareInstagramStory,
- colorLight
- )
- )
- )
+ private fun setColors(color: Int) {
binding.mainContent.background =
GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewFragment.kt
index dd0f50821..da801f60c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewFragment.kt
@@ -1,12 +1,17 @@
package code.name.monkey.retromusic.activities
import android.content.Context
+import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.webkit.WebResourceRequest
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.core.content.PackageManagerCompat
import androidx.core.content.pm.PackageInfoCompat
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.FragmentActivity
@@ -22,7 +27,7 @@ import code.name.monkey.retromusic.extensions.openUrl
import code.name.monkey.retromusic.util.PreferenceUtil.lastVersion
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import java.nio.charset.StandardCharsets
-import java.util.*
+import java.util.Locale
class WhatsNewFragment : BottomSheetDialogFragment() {
private var _binding: FragmentWhatsNewBinding? = null
@@ -41,7 +46,7 @@ class WhatsNewFragment : BottomSheetDialogFragment() {
super.onViewCreated(view, savedInstanceState)
try {
val buf = StringBuilder()
- val stream= requireContext().assets.open("retro-changelog.html")
+ val stream = requireContext().assets.open("retro-changelog.html")
stream.reader(StandardCharsets.UTF_8).buffered().use { br ->
var str: String?
while (br.readLine().also { str = it } != null) {
@@ -76,6 +81,17 @@ class WhatsNewFragment : BottomSheetDialogFragment() {
)
)
binding.webView.loadData(changeLog, "text/html", "UTF-8")
+ binding.webView.webViewClient = object : WebViewClient() {
+ override fun shouldOverrideUrlLoading(
+ view: WebView?,
+ request: WebResourceRequest?
+ ): Boolean {
+ val url = request?.url ?: return false
+ //you can do checks here e.g. url.host equals to target one
+ startActivity(Intent(Intent.ACTION_VIEW, url))
+ return true
+ }
+ }
} catch (e: Throwable) {
binding.webView.loadData(
"Unable to load
" + e.localizedMessage + "
", "text/html", "UTF-8"
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt
index 20bc42fb9..1e0c110d5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt
@@ -32,6 +32,8 @@ import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.accentColor
+import code.name.monkey.retromusic.extensions.rootView
+import code.name.monkey.retromusic.util.logD
import com.google.android.material.snackbar.Snackbar
abstract class AbsBaseActivity : AbsThemeActivity() {
@@ -52,7 +54,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
}
private val snackBarContainer: View
- get() = window.decorView
+ get() = rootView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -75,7 +77,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
protected open fun onHasPermissionsChanged(hasPermissions: Boolean) {
// implemented by sub classes
- println(hasPermissions)
+ logD(hasPermissions)
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@@ -114,33 +116,19 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
for (grantResult in grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
- this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE
+ this@AbsBaseActivity, Manifest.permission.READ_EXTERNAL_STORAGE,
+ ) || ActivityCompat.shouldShowRequestPermissionRationale(
+ this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE,
)
) {
// User has deny from permission dialog
Snackbar.make(
snackBarContainer,
permissionDeniedMessage!!,
- Snackbar.LENGTH_INDEFINITE
+ Snackbar.LENGTH_SHORT
)
.setAction(R.string.action_grant) { requestPermissions() }
.setActionTextColor(accentColor()).show()
- } else if (ActivityCompat.shouldShowRequestPermissionRationale(
- this@AbsBaseActivity, Manifest.permission.BLUETOOTH_CONNECT
- )
- ) {
- // User has deny from permission dialog
- Snackbar.make(
- snackBarContainer,
- R.string.permission_bluetooth_denied,
- Snackbar.LENGTH_INDEFINITE
- )
- .setAction(R.string.action_grant) {
- ActivityCompat.requestPermissions(this,
- arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
- PERMISSION_REQUEST)
- }
- .setActionTextColor(accentColor()).show()
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(
@@ -165,11 +153,34 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
}
hadPermissions = true
onHasPermissionsChanged(true)
+ } else if (requestCode == BLUETOOTH_PERMISSION_REQUEST) {
+ for (grantResult in grantResults) {
+ if (grantResult != PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(
+ this@AbsBaseActivity, Manifest.permission.BLUETOOTH_CONNECT
+ )
+ ) {
+ // User has deny from permission dialog
+ Snackbar.make(
+ snackBarContainer,
+ R.string.permission_bluetooth_denied,
+ Snackbar.LENGTH_SHORT
+ )
+ .setAction(R.string.action_grant) {
+ ActivityCompat.requestPermissions(this,
+ arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
+ BLUETOOTH_PERMISSION_REQUEST)
+ }
+ .setActionTextColor(accentColor()).show()
+ }
+ }
+ }
}
}
companion object {
const val PERMISSION_REQUEST = 100
+ const val BLUETOOTH_PERMISSION_REQUEST = 101
}
// this lets keyboard close when clicked in background
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
index efcd62edd..07937c7b5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
@@ -33,6 +33,7 @@ import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED
import code.name.monkey.retromusic.util.PreferenceUtil
+import code.name.monkey.retromusic.util.logD
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
@@ -185,12 +186,12 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
true
) // just in case we need to know this at some point
sendBroadcast(intent)
- println("sendBroadcast $hasPermissions")
+ logD("sendBroadcast $hasPermissions")
}
override fun getPermissionsToRequest(): Array {
return mutableListOf(Manifest.permission.READ_EXTERNAL_STORAGE).apply {
- if (!VersionUtils.hasQ()) {
+ if (!VersionUtils.hasR()) {
add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}.toTypedArray()
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
index 8ddcf65ec..b799790ab 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
@@ -16,6 +16,8 @@ package code.name.monkey.retromusic.activities.base
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
+import android.content.Intent
+import android.content.SharedPreferences
import android.content.res.ColorStateList
import android.graphics.Color
import android.os.Bundle
@@ -24,14 +26,31 @@ import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.view.animation.PathInterpolator
import android.widget.FrameLayout
+import androidx.activity.OnBackPressedCallback
import androidx.core.animation.doOnEnd
import androidx.core.view.*
-import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import code.name.monkey.appthemehelper.util.VersionUtils
-import code.name.monkey.retromusic.extensions.*
+import code.name.monkey.retromusic.ADAPTIVE_COLOR_APP
+import code.name.monkey.retromusic.ALBUM_COVER_STYLE
+import code.name.monkey.retromusic.ALBUM_COVER_TRANSFORM
+import code.name.monkey.retromusic.CAROUSEL_EFFECT
+import code.name.monkey.retromusic.CIRCLE_PLAY_BUTTON
+import code.name.monkey.retromusic.EXTRA_SONG_INFO
+import code.name.monkey.retromusic.KEEP_SCREEN_ON
+import code.name.monkey.retromusic.LIBRARY_CATEGORIES
+import code.name.monkey.retromusic.NOW_PLAYING_SCREEN_ID
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.SCREEN_ON_LYRICS
+import code.name.monkey.retromusic.SWIPE_ANYWHERE_NOW_PLAYING
+import code.name.monkey.retromusic.SWIPE_DOWN_DISMISS
+import code.name.monkey.retromusic.TAB_TEXT_MODE
+import code.name.monkey.retromusic.TOGGLE_ADD_CONTROLS
+import code.name.monkey.retromusic.TOGGLE_FULL_SCREEN
+import code.name.monkey.retromusic.TOGGLE_VOLUME
+import code.name.monkey.retromusic.activities.PermissionActivity
import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
@@ -60,12 +79,21 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ViewUtil
+import code.name.monkey.retromusic.util.logD
+import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomsheet.BottomSheetBehavior
-import com.google.android.material.bottomsheet.BottomSheetBehavior.*
+import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_DRAGGING
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HIDDEN
+import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_SETTLING
+import com.google.android.material.bottomsheet.BottomSheetBehavior.from
import org.koin.androidx.viewmodel.ext.android.viewModel
-abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
+abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
+ SharedPreferences.OnSharedPreferenceChangeListener {
companion object {
val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName
}
@@ -74,13 +102,13 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private var windowInsets: WindowInsetsCompat? = null
protected val libraryViewModel by viewModel()
private lateinit var bottomSheetBehavior: BottomSheetBehavior
- private var playerFragment: AbsPlayerFragment? = null
+ private lateinit var playerFragment: AbsPlayerFragment
private var miniPlayerFragment: MiniPlayerFragment? = null
private var nowPlayingScreen: NowPlayingScreen? = null
private var taskColor: Int = 0
private var paletteColor: Int = Color.WHITE
private var navigationBarColor = 0
- protected abstract fun createContentView(): SlidingMusicPanelLayoutBinding
+
private val panelState: Int
get() = bottomSheetBehavior.state
private lateinit var binding: SlidingMusicPanelLayoutBinding
@@ -89,45 +117,51 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private var navigationBarColorAnimator: ValueAnimator? = null
private val argbEvaluator: ArgbEvaluator = ArgbEvaluator()
- private val bottomSheetCallbackList = object : BottomSheetCallback() {
+ private val bottomSheetCallbackList by lazy {
+ object : BottomSheetCallback() {
- override fun onSlide(bottomSheet: View, slideOffset: Float) {
- setMiniPlayerAlphaProgress(slideOffset)
- navigationBarColorAnimator?.cancel()
- setNavigationBarColorPreOreo(
- argbEvaluator.evaluate(
- slideOffset,
- surfaceColor(),
- navigationBarColor
- ) as Int
- )
- }
+ override fun onSlide(bottomSheet: View, slideOffset: Float) {
+ setMiniPlayerAlphaProgress(slideOffset)
+ navigationBarColorAnimator?.cancel()
+ setNavigationBarColorPreOreo(
+ argbEvaluator.evaluate(
+ slideOffset,
+ surfaceColor(),
+ navigationBarColor
+ ) as Int
+ )
+ }
- override fun onStateChanged(bottomSheet: View, newState: Int) {
- when (newState) {
- STATE_EXPANDED -> {
- onPanelExpanded()
- if (PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) {
- keepScreenOn(true)
+ override fun onStateChanged(bottomSheet: View, newState: Int) {
+ when (newState) {
+ STATE_EXPANDED -> {
+ onPanelExpanded()
+ if (PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) {
+ keepScreenOn(true)
+ }
}
- }
- STATE_COLLAPSED -> {
- onPanelCollapsed()
- if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) {
- keepScreenOn(false)
+
+ STATE_COLLAPSED -> {
+ onPanelCollapsed()
+ if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) {
+ keepScreenOn(false)
+ }
}
- }
- STATE_SETTLING, STATE_DRAGGING -> {
- if (fromNotification) {
- binding.bottomNavigationView.bringToFront()
- fromNotification = false
+
+ STATE_SETTLING, STATE_DRAGGING -> {
+ if (fromNotification) {
+ binding.navigationView.bringToFront()
+ fromNotification = false
+ }
+ }
+
+ STATE_HIDDEN -> {
+ MusicPlayerRemote.clearQueue()
+ }
+
+ else -> {
+ logD("Do a flip")
}
- }
- STATE_HIDDEN -> {
- MusicPlayerRemote.clearQueue()
- }
- else -> {
- println("Do a flip")
}
}
}
@@ -137,12 +171,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- binding = createContentView()
+ if (!hasPermissions()) {
+ startActivity(Intent(this, PermissionActivity::class.java))
+ finish()
+ }
+ binding = SlidingMusicPanelLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
- ViewCompat.setOnApplyWindowInsetsListener(
- binding.root
- ) { _, insets ->
- windowInsets = insets
+ binding.root.setOnApplyWindowInsetsListener { _, insets ->
+ windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets)
insets
}
chooseFragmentForTheme()
@@ -151,7 +187,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
updateColor()
if (!PreferenceUtil.materialYou) {
binding.slidingPanel.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
- bottomNavigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
+ navigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
}
navigationBarColor = surfaceColor()
@@ -161,11 +197,13 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
bottomSheetBehavior = from(binding.slidingPanel)
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
+ bottomSheetBehavior.significantVelocityThreshold = 300
setMiniPlayerAlphaProgress(0F)
}
override fun onResume() {
super.onResume()
+ PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) {
postRecreate()
}
@@ -177,10 +215,69 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onDestroy() {
super.onDestroy()
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList)
+ PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
}
- protected fun wrapSlidingMusicPanel(): SlidingMusicPanelLayoutBinding {
- return SlidingMusicPanelLayoutBinding.inflate(layoutInflater)
+ override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
+ when (key) {
+ SWIPE_DOWN_DISMISS -> {
+ bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
+ }
+
+ TOGGLE_ADD_CONTROLS -> {
+ miniPlayerFragment?.setUpButtons()
+ }
+
+ NOW_PLAYING_SCREEN_ID -> {
+ chooseFragmentForTheme()
+ binding.slidingPanel.updateLayoutParams {
+ height = if (nowPlayingScreen != Peek) {
+ ViewGroup.LayoutParams.MATCH_PARENT
+ } else {
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ }
+ onServiceConnected()
+ }
+ }
+
+ ALBUM_COVER_TRANSFORM, CAROUSEL_EFFECT,
+ ALBUM_COVER_STYLE, TOGGLE_VOLUME, EXTRA_SONG_INFO, CIRCLE_PLAY_BUTTON,
+ -> {
+ chooseFragmentForTheme()
+ onServiceConnected()
+ }
+
+ SWIPE_ANYWHERE_NOW_PLAYING -> {
+ playerFragment.addSwipeDetector()
+ }
+
+ ADAPTIVE_COLOR_APP -> {
+ if (PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)) {
+ chooseFragmentForTheme()
+ onServiceConnected()
+ }
+ }
+
+ LIBRARY_CATEGORIES -> {
+ updateTabs()
+ }
+
+ TAB_TEXT_MODE -> {
+ navigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode
+ }
+
+ TOGGLE_FULL_SCREEN -> {
+ recreate()
+ }
+
+ SCREEN_ON_LYRICS -> {
+ keepScreenOn(bottomSheetBehavior.state == STATE_EXPANDED && PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics || PreferenceUtil.isScreenOnEnabled)
+ }
+
+ KEEP_SCREEN_ON -> {
+ maybeSetScreenOn()
+ }
+ }
}
fun collapsePanel() {
@@ -196,8 +293,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
val alpha = 1 - progress
miniPlayerFragment?.view?.alpha = 1 - (progress / 0.2F)
miniPlayerFragment?.view?.isGone = alpha == 0f
- binding.bottomNavigationView.translationY = progress * 500
- binding.bottomNavigationView.alpha = alpha
+ if (!isLandscape) {
+ binding.navigationView.translationY = progress * 500
+ binding.navigationView.alpha = alpha
+ }
binding.playerFragmentContainer.alpha = (progress - 0.2F) / 0.2F
}
@@ -224,13 +323,13 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
setLightStatusBarAuto()
setLightNavigationBarAuto()
setTaskDescriptionColor(taskColor)
- playerFragment?.onHide()
+ //playerFragment?.onHide()
}
open fun onPanelExpanded() {
setMiniPlayerAlphaProgress(1F)
onPaletteColorChanged()
- playerFragment?.onShow()
+ //playerFragment?.onShow()
}
private fun setupSlidingUpPanel() {
@@ -254,21 +353,15 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
})
}
- val bottomNavigationView get() = binding.bottomNavigationView
+ val navigationView get() = binding.navigationView
val slidingPanel get() = binding.slidingPanel
+ val isBottomNavVisible get() = navigationView.isVisible && navigationView is BottomNavigationView
+
override fun onServiceConnected() {
super.onServiceConnected()
- if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
- binding.slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object :
- ViewTreeObserver.OnGlobalLayoutListener {
- override fun onGlobalLayout() {
- binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
- hideBottomSheet(false)
- }
- })
- } // don't call hideBottomSheet(true) here as it causes a bug with the SlidingUpPanelLayout
+ hideBottomSheet(false)
}
override fun onQueueChanged() {
@@ -280,12 +373,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
}
- override fun onBackPressed() {
- if (!handleBackPress()) super.onBackPressed()
- }
-
private fun handleBackPress(): Boolean {
- if (bottomSheetBehavior.peekHeight != 0 && playerFragment!!.onBackPressed()) return true
+ if (bottomSheetBehavior.peekHeight != 0 && playerFragment.onBackPressed()) return true
if (panelState == STATE_EXPANDED) {
collapsePanel()
return true
@@ -332,18 +421,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
fun updateTabs() {
- binding.bottomNavigationView.menu.clear()
+ binding.navigationView.menu.clear()
val currentTabs: List = PreferenceUtil.libraryCategory
for (tab in currentTabs) {
if (tab.visible) {
val menu = tab.category
- binding.bottomNavigationView.menu.add(0, menu.id, 0, menu.stringRes)
+ binding.navigationView.menu.add(0, menu.id, 0, menu.stringRes)
.setIcon(menu.icon)
}
}
- if (binding.bottomNavigationView.menu.size() == 1) {
+ if (binding.navigationView.menu.size() == 1) {
isInOneTabMode = true
- binding.bottomNavigationView.hide()
+ binding.navigationView.isVisible = false
+ } else {
+ isInOneTabMode = false
}
}
@@ -359,7 +450,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
animate: Boolean = false,
hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty(),
) {
- if (!ViewCompat.isLaidOut(bottomNavigationView)) {
+ if (!ViewCompat.isLaidOut(navigationView)) {
return
}
if (isInOneTabMode) {
@@ -370,38 +461,38 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
)
return
}
- val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED
- if (mAnimate) {
- if (visible) {
- binding.bottomNavigationView.bringToFront()
- binding.bottomNavigationView.show()
+ if (visible xor navigationView.isVisible) {
+ val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED
+ if (mAnimate) {
+ if (visible) {
+ binding.navigationView.bringToFront()
+ binding.navigationView.show()
+ } else {
+ binding.navigationView.hide()
+ }
} else {
- binding.bottomNavigationView.hide()
- }
- } else {
- binding.bottomNavigationView.isVisible = false
- if (visible && bottomSheetBehavior.state != STATE_EXPANDED) {
- binding.bottomNavigationView.bringToFront()
+ binding.navigationView.isVisible = visible
+ if (visible && bottomSheetBehavior.state != STATE_EXPANDED) {
+ binding.navigationView.bringToFront()
+ }
}
}
hideBottomSheet(
hide = hideBottomSheet,
animate = animate,
- isBottomNavVisible = visible
+ isBottomNavVisible = visible && navigationView is BottomNavigationView
)
}
fun hideBottomSheet(
hide: Boolean,
animate: Boolean = false,
- isBottomNavVisible: Boolean = bottomNavigationView.isVisible,
+ isBottomNavVisible: Boolean = navigationView.isVisible && navigationView is BottomNavigationView,
) {
- val heightOfBar =
- windowInsets.safeGetBottomInsets() +
- if (MusicPlayerRemote.isCasting) dip(R.dimen.cast_mini_player_height) else dip(R.dimen.mini_player_height)
+ val heightOfBar = windowInsets.getBottomInsets() + dip(R.dimen.mini_player_height)
val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height)
if (hide) {
- bottomSheetBehavior.peekHeight = -windowInsets.safeGetBottomInsets()
+ bottomSheetBehavior.peekHeight = -windowInsets.getBottomInsets()
bottomSheetBehavior.state = STATE_COLLAPSED
libraryViewModel.setFabMargin(
this,
@@ -410,17 +501,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
} else {
if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.slidingPanel.elevation = 0F
- binding.bottomNavigationView.elevation = 5F
+ binding.navigationView.elevation = 5F
if (isBottomNavVisible) {
- println("List")
+ logD("List")
if (animate) {
bottomSheetBehavior.peekHeightAnimate(heightOfBarWithTabs)
} else {
bottomSheetBehavior.peekHeight = heightOfBarWithTabs
}
- libraryViewModel.setFabMargin(this, dip(R.dimen.mini_player_height_expanded))
+ libraryViewModel.setFabMargin(
+ this,
+ dip(R.dimen.bottom_nav_mini_player_height)
+ )
} else {
- println("Details")
+ logD("Details")
if (animate) {
bottomSheetBehavior.peekHeightAnimate(heightOfBar).doOnEnd {
binding.slidingPanel.bringToFront()
@@ -443,7 +537,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private fun chooseFragmentForTheme() {
nowPlayingScreen = PreferenceUtil.nowPlayingScreen
- val fragment: Fragment = when (nowPlayingScreen) {
+ val fragment: AbsPlayerFragment = when (nowPlayingScreen) {
Blur -> BlurPlayerFragment()
Adaptive -> AdaptiveFragment()
Normal -> PlayerFragment()
@@ -463,12 +557,12 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
Classic -> ClassicPlayerFragment()
MD3 -> MD3PlayerFragment()
else -> PlayerFragment()
- } // must implement AbsPlayerFragment
+ } // must extend AbsPlayerFragment
supportFragmentManager.commit {
replace(R.id.playerFragmentContainer, fragment)
}
supportFragmentManager.executePendingTransactions()
- playerFragment = whichFragment(R.id.playerFragmentContainer)
+ playerFragment = whichFragment(R.id.playerFragmentContainer)
miniPlayerFragment = whichFragment(R.id.miniPlayerFragment)
miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt
index 8ee90d0b6..6510dd38f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt
@@ -20,15 +20,15 @@ import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.KeyEvent
-import android.view.View
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
import androidx.core.os.ConfigurationCompat
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.LanguageContextWrapper
-import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.util.PreferenceUtil
+import code.name.monkey.retromusic.util.maybeShowAnnoyingToasts
import code.name.monkey.retromusic.util.theme.getNightMode
import code.name.monkey.retromusic.util.theme.getThemeResValue
import java.util.*
@@ -42,13 +42,13 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
hideStatusBar()
super.onCreate(savedInstanceState)
setEdgeToEdgeOrImmersive()
- registerSystemUiVisibility()
- toggleScreenOn()
+ maybeSetScreenOn()
setLightNavigationBarAuto()
setLightStatusBarAuto(surfaceColor())
if (VersionUtils.hasQ()) {
window.decorView.isForceDarkAllowed = false
}
+ maybeShowAnnoyingToasts()
}
private fun updateTheme() {
@@ -60,9 +60,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
if (PreferenceUtil.isCustomFont) {
setTheme(R.style.FontThemeOverlay)
}
- if (PreferenceUtil.circlePlayButton) {
- setTheme(R.style.CircleFABOverlay)
- }
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
@@ -76,20 +73,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
}
}
- private fun registerSystemUiVisibility() {
- val decorView = window.decorView
- decorView.setOnSystemUiVisibilityChangeListener { visibility ->
- if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
- setImmersiveFullscreen()
- }
- }
- }
-
- private fun unregisterSystemUiVisibility() {
- val decorView = window.decorView
- decorView.setOnSystemUiVisibilityChangeListener(null)
- }
-
override fun run() {
setImmersiveFullscreen()
}
@@ -101,7 +84,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
public override fun onDestroy() {
super.onDestroy()
- unregisterSystemUiVisibility()
exitFullscreen()
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt
index 5293f6690..e99881953 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt
@@ -64,7 +64,6 @@ open class BugReportActivity : AbsThemeActivity() {
private fun reportIssue() {
copyDeviceInfoToClipBoard()
-
val i = Intent(Intent.ACTION_VIEW)
i.data = ISSUE_TRACKER_LINK.toUri()
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
@@ -80,17 +79,11 @@ open class BugReportActivity : AbsThemeActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
- onBackPressed()
+ onBackPressedDispatcher.onBackPressed()
}
return super.onOptionsItemSelected(item)
}
- private fun tryToFinishActivity() {
- if (!isFinishing) {
- finish()
- }
- }
-
companion object {
private const val ISSUE_TRACKER_LINK =
"https://github.com/MuntashirAkon/Metro/issues/new"
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java
index e47c770ea..efd56210e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java
@@ -50,8 +50,8 @@ public class SAFGuideActivity extends IntroActivity {
? R.string.saf_guide_slide1_description_before_o
: R.string.saf_guide_slide1_description)
.image(R.drawable.saf_guide_1)
- .background(R.color.md_deep_purple_300)
- .backgroundDark(R.color.md_deep_purple_400)
+ .background(code.name.monkey.appthemehelper.R.color.md_deep_purple_300)
+ .backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_400)
.layout(R.layout.fragment_simple_slide_large_image)
.build());
addSlide(
@@ -59,8 +59,8 @@ public class SAFGuideActivity extends IntroActivity {
.title(R.string.saf_guide_slide2_title)
.description(R.string.saf_guide_slide2_description)
.image(R.drawable.saf_guide_2)
- .background(R.color.md_deep_purple_500)
- .backgroundDark(R.color.md_deep_purple_600)
+ .background(code.name.monkey.appthemehelper.R.color.md_deep_purple_500)
+ .backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_600)
.layout(R.layout.fragment_simple_slide_large_image)
.build());
addSlide(
@@ -68,8 +68,8 @@ public class SAFGuideActivity extends IntroActivity {
.title(R.string.saf_guide_slide3_title)
.description(R.string.saf_guide_slide3_description)
.image(R.drawable.saf_guide_3)
- .background(R.color.md_deep_purple_700)
- .backgroundDark(R.color.md_deep_purple_800)
+ .background(code.name.monkey.appthemehelper.R.color.md_deep_purple_700)
+ .backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_800)
.layout(R.layout.fragment_simple_slide_large_image)
.build());
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt
index a83e7b9f5..79ecca250 100755
--- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt
@@ -33,11 +33,10 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.lifecycleScope
import androidx.viewbinding.ViewBinding
-import code.name.monkey.appthemehelper.ThemeStore
-import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsBaseActivity
+import code.name.monkey.retromusic.activities.saf.SAFGuideActivity
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.hideSoftKeyboard
@@ -46,6 +45,7 @@ import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.model.AudioTagInfo
import code.name.monkey.retromusic.repository.Repository
import code.name.monkey.retromusic.util.SAFUtil
+import code.name.monkey.retromusic.util.logD
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.GlobalScope
@@ -55,7 +55,7 @@ import org.jaudiotagger.audio.AudioFileIO
import org.jaudiotagger.tag.FieldKey
import org.koin.android.ext.android.inject
import java.io.File
-import java.util.*
+import java.util.Collections
abstract class AbsTagEditorActivity : AbsBaseActivity() {
abstract val editorImage: ImageView
@@ -221,7 +221,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
getIntentExtras()
songPaths = getSongPaths()
- println(songPaths?.size)
+ logD(songPaths?.size)
if (songPaths!!.isEmpty()) {
finish()
}
@@ -274,7 +274,6 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
scaleY = 0f
isEnabled = false
setOnClickListener { save() }
- TintHelper.setTintAuto(this, ThemeStore.accentColor(this@AbsTagEditorActivity), true)
}
}
@@ -307,7 +306,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
- super.onBackPressed()
+ onBackPressedDispatcher.onBackPressed()
return true
}
}
@@ -350,7 +349,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
hideSoftKeyboard()
hideFab()
- println(fieldKeyValueMap)
+ logD(fieldKeyValueMap)
GlobalScope.launch {
if (VersionUtils.hasR()) {
cacheFiles = TagWriter.writeTagsToFilesR(
@@ -409,15 +408,18 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
loadImageFromFile(it)
}
}
- code.name.monkey.retromusic.activities.saf.SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
+
+ SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
SAFUtil.openTreePicker(this)
}
+
SAFUtil.REQUEST_SAF_PICK_TREE -> {
if (resultCode == Activity.RESULT_OK) {
SAFUtil.saveTreeUri(this, intent)
writeTags(savedSongPaths)
}
}
+
SAFUtil.REQUEST_SAF_PICK_FILE -> {
if (resultCode == Activity.RESULT_OK) {
writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString))
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt
index 8509c963e..1436da954 100755
--- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt
@@ -30,8 +30,12 @@ import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
-import code.name.monkey.retromusic.extensions.*
-import code.name.monkey.retromusic.glide.GlideApp
+import code.name.monkey.retromusic.extensions.appHandleColor
+import code.name.monkey.retromusic.extensions.defaultFooterColor
+import code.name.monkey.retromusic.extensions.isColorLight
+import code.name.monkey.retromusic.extensions.setTint
+import code.name.monkey.retromusic.extensions.showToast
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.model.Song
@@ -39,12 +43,14 @@ import code.name.monkey.retromusic.util.ImageUtil
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette
import code.name.monkey.retromusic.util.RetroColorUtil.getColor
+import code.name.monkey.retromusic.util.logD
+import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.shape.MaterialShapeDrawable
import org.jaudiotagger.tag.FieldKey
-import java.util.*
+import java.util.EnumMap
class AlbumTagEditorActivity : AbsTagEditorActivity() {
@@ -98,7 +104,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity(binding.editorImage) {
override fun onResourceReady(
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt
index 91582484c..93dd8a44f 100755
--- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt
@@ -31,13 +31,15 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding
import code.name.monkey.retromusic.extensions.*
-import code.name.monkey.retromusic.glide.GlideApp
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.repository.SongRepository
import code.name.monkey.retromusic.util.ImageUtil
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.RetroColorUtil
+import code.name.monkey.retromusic.util.logD
+import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition
@@ -102,7 +104,7 @@ class SongTagEditorActivity : AbsTagEditorActivity
binding.discNumberText.setText(discNumber)
binding.lyricsText.setText(lyrics)
binding.songComposerText.setText(composer)
- println(songTitle + songYear)
+ logD(songTitle + songYear)
}
override fun loadCurrentImage() {
@@ -170,8 +172,11 @@ class SongTagEditorActivity : AbsTagEditorActivity
override fun getSongUris(): List = listOf(MusicUtil.getSongFileUri(id))
override fun loadImageFromFile(selectedFile: Uri?) {
- GlideApp.with(this@SongTagEditorActivity).asBitmapPalette().load(selectedFile)
- .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
+ Glide.with(this@SongTagEditorActivity)
+ .asBitmapPalette()
+ .load(selectedFile)
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .skipMemoryCache(true)
.into(object : ImageViewTarget(binding.editorImage) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt
index 383c19e26..b139a0af8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt
@@ -23,13 +23,15 @@ import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ItemGenreBinding
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.interfaces.IGenreClickListener
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
import java.util.*
/**
@@ -68,10 +70,10 @@ class GenreAdapter(
private fun loadGenreImage(genre: Genre, holder: GenreAdapter.ViewHolder) {
val genreSong = MusicUtil.songByGenre(genre.id)
- GlideApp.with(activity)
+ Glide.with(activity)
.asBitmapPalette()
- .load(RetroGlideExtension.getSongModel(genreSong))
.songCoverOptions(genreSong)
+ .load(RetroGlideExtension.getSongModel(genreSong))
.into(object : RetroMusicColoredTarget(holder.binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(holder, colors)
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt
index 6a1e8c69d..e3f809b5f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt
@@ -18,7 +18,6 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.os.bundleOf
@@ -35,14 +34,14 @@ import code.name.monkey.retromusic.adapter.song.SongAdapter
import code.name.monkey.retromusic.fragments.home.HomeFragment
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
-import code.name.monkey.retromusic.interfaces.IGenreClickListener
-import code.name.monkey.retromusic.model.*
+import code.name.monkey.retromusic.model.Album
+import code.name.monkey.retromusic.model.Artist
+import code.name.monkey.retromusic.model.Home
+import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
-class HomeAdapter(
- private val activity: AppCompatActivity
-) : RecyclerView.Adapter(), IArtistClickListener, IAlbumClickListener,
- IGenreClickListener {
+class HomeAdapter(private val activity: AppCompatActivity) :
+ RecyclerView.Adapter(), IArtistClickListener, IAlbumClickListener {
private var list = listOf()
@@ -134,6 +133,7 @@ class HomeAdapter(
notifyDataSetChanged()
}
+ @Suppress("UNCHECKED_CAST")
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) {
title.setText(home.titleRes)
@@ -144,6 +144,7 @@ class HomeAdapter(
}
}
+ @Suppress("UNCHECKED_CAST")
private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) {
title.setText(home.titleRes)
@@ -154,6 +155,7 @@ class HomeAdapter(
}
}
+ @Suppress("UNCHECKED_CAST")
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) {
title.setText(home.titleRes)
@@ -161,7 +163,7 @@ class HomeAdapter(
val songAdapter = SongAdapter(
activity,
home.arrayList as MutableList,
- R.layout.item_favourite_card, null
+ R.layout.item_favourite_card
)
layoutManager = linearLayoutManager()
adapter = songAdapter
@@ -172,15 +174,14 @@ class HomeAdapter(
open class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView)
val title: AppCompatTextView = itemView.findViewById(R.id.title)
- val arrow: ImageView = itemView.findViewById(R.id.arrow)
val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area)
}
private fun artistsAdapter(artists: List) =
- ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this)
+ ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, this)
private fun albumAdapter(albums: List) =
- AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this)
+ AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, this)
private fun gridLayoutManager() =
GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
@@ -209,16 +210,4 @@ class HomeAdapter(
)
)
}
-
- override fun onClickGenre(genre: Genre, view: View) {
- activity.findNavController(R.id.fragment_container).navigate(
- R.id.genreDetailsFragment,
- bundleOf(EXTRA_GENRE to genre),
- null,
- FragmentNavigatorExtras(
- view to "genre"
- )
- )
- }
-
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt
index 57397f88d..22a60bd95 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt
@@ -27,9 +27,12 @@ import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.*
+import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.db.PlaylistWithSongs
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.model.Album
@@ -37,6 +40,7 @@ import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
+import com.bumptech.glide.Glide
import java.util.*
class SearchAdapter(
@@ -59,26 +63,28 @@ class SearchAdapter(
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
- return if (viewType == HEADER) ViewHolder(
- LayoutInflater.from(activity).inflate(
- R.layout.sub_header,
- parent,
- false
- ), viewType
- )
- else if (viewType == ALBUM || viewType == ARTIST || viewType== ALBUM_ARTIST)
- ViewHolder(
+ return when (viewType) {
+ HEADER -> ViewHolder(
+ LayoutInflater.from(activity).inflate(
+ R.layout.sub_header,
+ parent,
+ false
+ ), viewType
+ )
+
+ ALBUM, ARTIST, ALBUM_ARTIST -> ViewHolder(
LayoutInflater.from(activity).inflate(
R.layout.item_list_big,
parent,
false
), viewType
)
- else
- ViewHolder(
+
+ else -> ViewHolder(
LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false),
viewType
)
+ }
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@@ -88,25 +94,30 @@ class SearchAdapter(
val album = dataSet[position] as Album
holder.title?.text = album.title
holder.text?.text = album.artistName
- GlideApp.with(activity).asDrawable().albumCoverOptions(album.safeGetFirstSong()).load(
- RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
+ Glide.with(activity).asDrawable().albumCoverOptions(album.safeGetFirstSong())
+ .load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
.into(holder.image!!)
}
+
ARTIST -> {
holder.imageTextContainer?.isVisible = true
val artist = dataSet[position] as Artist
holder.title?.text = artist.name
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
- GlideApp.with(activity).asDrawable().artistImageOptions(artist).load(
- RetroGlideExtension.getArtistModel(artist)).into(holder.image!!)
+ Glide.with(activity).asDrawable().artistImageOptions(artist).load(
+ RetroGlideExtension.getArtistModel(artist)
+ ).into(holder.image!!)
}
+
SONG -> {
holder.imageTextContainer?.isVisible = true
val song = dataSet[position] as Song
holder.title?.text = song.title
holder.text?.text = song.albumName
- GlideApp.with(activity).asDrawable().songCoverOptions(song).load(RetroGlideExtension.getSongModel(song)).into(holder.image!!)
+ Glide.with(activity).asDrawable().songCoverOptions(song)
+ .load(RetroGlideExtension.getSongModel(song)).into(holder.image!!)
}
+
GENRE -> {
val genre = dataSet[position] as Genre
holder.title?.text = genre.name
@@ -119,19 +130,23 @@ class SearchAdapter(
)
)
}
+
PLAYLIST -> {
val playlist = dataSet[position] as PlaylistWithSongs
holder.title?.text = playlist.playlistEntity.playlistName
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
}
+
ALBUM_ARTIST -> {
holder.imageTextContainer?.isVisible = true
val artist = dataSet[position] as Artist
holder.title?.text = artist.name
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
- GlideApp.with(activity).asDrawable().artistImageOptions(artist).load(
- RetroGlideExtension.getArtistModel(artist)).into(holder.image!!)
+ Glide.with(activity).asDrawable().artistImageOptions(artist).load(
+ RetroGlideExtension.getArtistModel(artist)
+ ).into(holder.image!!)
}
+
else -> {
holder.title?.text = dataSet[position].toString()
holder.title?.setTextColor(ThemeStore.accentColor(activity))
@@ -143,7 +158,7 @@ class SearchAdapter(
return dataSet.size
}
- inner class ViewHolder(itemView: View, itemViewType: Int) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
+ inner class ViewHolder(itemView: View, itemViewType: Int) : MediaEntryViewHolder(itemView) {
init {
itemView.setOnLongClickListener(null)
imageTextContainer?.isInvisible = true
@@ -177,30 +192,35 @@ class SearchAdapter(
bundleOf(EXTRA_ALBUM_ID to (item as Album).id)
)
}
+
ARTIST -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to (item as Artist).id)
)
}
- ALBUM_ARTIST ->{
+
+ ALBUM_ARTIST -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.albumArtistDetailsFragment,
bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name)
)
}
+
GENRE -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.genreDetailsFragment,
bundleOf(EXTRA_GENRE to (item as Genre))
)
}
+
PLAYLIST -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.playlistDetailsFragment,
- bundleOf(EXTRA_PLAYLIST to (item as PlaylistWithSongs))
+ bundleOf(EXTRA_PLAYLIST_ID to (item as PlaylistWithSongs).playlistEntity.playListId)
)
}
+
SONG -> {
MusicPlayerRemote.playNext(item as Song)
MusicPlayerRemote.playNextSong()
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt
index 99a4ee806..4005c6e6c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt
@@ -25,12 +25,11 @@ import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.interfaces.ICallbacks
import code.name.monkey.retromusic.util.MusicUtil
+import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.signature.MediaStoreSignature
import me.zhanghai.android.fastscroll.PopupTextProvider
@@ -43,10 +42,9 @@ class SongFileAdapter(
override val activity: AppCompatActivity,
private var dataSet: List,
private val itemLayoutRes: Int,
- private val iCallbacks: ICallbacks?,
- iCabHolder: ICabHolder?,
+ private val iCallbacks: ICallbacks?
) : AbsMultiSelectAdapter(
- activity, iCabHolder, R.menu.menu_media_selection
+ activity, R.menu.menu_media_selection
), PopupTextProvider {
init {
@@ -96,7 +94,7 @@ class SongFileAdapter(
}
private fun loadFileImage(file: File, holder: ViewHolder) {
- val iconColor = ATHUtil.resolveColor(activity, R.attr.colorControlNormal)
+ val iconColor = ATHUtil.resolveColor(activity, androidx.appcompat.R.attr.colorControlNormal)
if (file.isDirectory) {
holder.image?.let {
it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN)
@@ -105,12 +103,12 @@ class SongFileAdapter(
holder.imageTextContainer?.setCardBackgroundColor(
ATHUtil.resolveColor(
activity,
- R.attr.colorSurface
+ com.google.android.material.R.attr.colorSurface
)
)
} else {
- val error = activity.getTintedDrawable(R.drawable.ic_file_music, iconColor)
- GlideApp.with(activity)
+ val error = activity.getTintedDrawable(R.drawable.ic_audio_file, iconColor)
+ Glide.with(activity)
.load(AudioFileCover(file.path))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error)
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt
index 7c4ff5ad5..160af7e47 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt
@@ -23,29 +23,29 @@ import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
-import code.name.monkey.retromusic.glide.GlideApp
+import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
open class AlbumAdapter(
override val activity: FragmentActivity,
var dataSet: List,
var itemLayoutRes: Int,
- iCabHolder: ICabHolder?,
val listener: IAlbumClickListener?
) : AbsMultiSelectAdapter(
activity,
- iCabHolder,
R.menu.menu_media_selection
), PopupTextProvider {
@@ -112,7 +112,9 @@ open class AlbumAdapter(
return
}
val song = album.safeGetFirstSong()
- GlideApp.with(activity).asBitmapPalette().albumCoverOptions(song)
+ Glide.with(activity)
+ .asBitmapPalette()
+ .albumCoverOptions(song)
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.into(object : RetroMusicColoredTarget(holder.image!!) {
@@ -162,6 +164,7 @@ open class AlbumAdapter(
when (PreferenceUtil.albumSortOrder) {
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName =
dataSet[position].title
+
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].albumArtist
SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(
dataSet[position].year
@@ -170,7 +173,7 @@ open class AlbumAdapter(
return MusicUtil.getSectionName(sectionName)
}
- inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
+ inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
menu?.isVisible = false
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt
index 7d0f1bd4d..5b371369b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt
@@ -19,6 +19,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
+import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
@@ -26,16 +27,24 @@ import androidx.lifecycle.lifecycleScope
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.fragments.AlbumCoverStyle
-import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Card
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Classic
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Fit
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Full
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Gradient
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Peek
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.Tiny
import code.name.monkey.retromusic.fragments.base.goToLyrics
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers
@@ -95,7 +104,7 @@ class AlbumCoverPagerAdapter(
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
- song = requireArguments().getParcelable(SONG_ARG)!!
+ song = BundleCompat.getParcelable(requireArguments(), SONG_ARG, Song::class.java)!!
}
}
@@ -119,7 +128,7 @@ class AlbumCoverPagerAdapter(
withContext(Dispatchers.Main) {
MaterialAlertDialogBuilder(
requireContext(),
- R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
+ com.google.android.material.R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
).apply {
setTitle(song.title)
setMessage(if (data.isNullOrEmpty()) "No lyrics found" else data)
@@ -164,7 +173,9 @@ class AlbumCoverPagerAdapter(
}
private fun loadAlbumCover(albumCover: ImageView) {
- GlideApp.with(this).asBitmapPalette().songCoverOptions(song)
+ Glide.with(this)
+ .asBitmapPalette()
+ .songCoverOptions(song)
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.dontAnimate()
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt
index 1457de7bc..7a9f7fa6e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt
@@ -17,23 +17,23 @@ package code.name.monkey.retromusic.adapter.album
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
class HorizontalAlbumAdapter(
activity: FragmentActivity,
dataSet: List,
- ICabHolder: ICabHolder?,
albumClickListener: IAlbumClickListener
) : AlbumAdapter(
- activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, ICabHolder, albumClickListener
+ activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, albumClickListener
) {
override fun createViewHolder(view: View, viewType: Int): ViewHolder {
@@ -49,7 +49,9 @@ class HorizontalAlbumAdapter(
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) return
- GlideApp.with(activity).asBitmapPalette().albumCoverOptions(album.safeGetFirstSong())
+ Glide.with(activity)
+ .asBitmapPalette()
+ .albumCoverOptions(album.safeGetFirstSong())
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt
index f04997f0e..e1ea2ca4c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt
@@ -26,30 +26,29 @@ import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.extensions.hide
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
class ArtistAdapter(
override val activity: FragmentActivity,
var dataSet: List,
var itemLayoutRes: Int,
- val ICabHolder: ICabHolder?,
val IArtistClickListener: IArtistClickListener,
val IAlbumArtistClickListener: IAlbumArtistClickListener? = null
-) : AbsMultiSelectAdapter(
- activity, ICabHolder, R.menu.menu_media_selection
-), PopupTextProvider {
+) : AbsMultiSelectAdapter(activity, R.menu.menu_media_selection),
+ PopupTextProvider {
var albumArtistsOnly = false
@@ -111,10 +110,10 @@ class ArtistAdapter(
if (holder.image == null) {
return
}
- GlideApp.with(activity)
+ Glide.with(activity)
.asBitmapPalette()
- .load(RetroGlideExtension.getArtistModel(artist))
.artistImageOptions(artist)
+ .load(RetroGlideExtension.getArtistModel(artist))
.transition(RetroGlideExtension.getDefaultTransition())
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt
index 675c3cbda..bb7b8491c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt
@@ -1,56 +1,58 @@
package code.name.monkey.retromusic.adapter.base
-import android.annotation.SuppressLint
import android.graphics.Color
+import android.view.ActionMode
import android.view.Menu
import android.view.MenuItem
+import androidx.activity.OnBackPressedCallback
import androidx.annotation.MenuRes
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.extensions.surfaceColor
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
-import code.name.monkey.retromusic.util.RetroColorUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
+import code.name.monkey.retromusic.databinding.NumberRollViewBinding
+import code.name.monkey.retromusic.views.NumberRollView
abstract class AbsMultiSelectAdapter(
- open val activity: FragmentActivity, private val ICabHolder: ICabHolder?, @MenuRes menuRes: Int
-) : RecyclerView.Adapter(), ICabCallback {
- private var cab: AttachedCab? = null
+ open val activity: FragmentActivity, @MenuRes menuRes: Int,
+) : RecyclerView.Adapter(), ActionMode.Callback {
+ var actionMode: ActionMode? = null
private val checked: MutableList
private var menuRes: Int
- override fun onCabCreated(cab: AttachedCab, menu: Menu): Boolean {
- activity.window.statusBarColor =
- RetroColorUtil.shiftBackgroundColor(activity.surfaceColor())
+
+ override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
+ val inflater = mode?.menuInflater
+ inflater?.inflate(menuRes, menu)
return true
}
- override fun onCabFinished(cab: AttachedCab): Boolean {
- clearChecked()
- activity.window.statusBarColor = when {
- VersionUtils.hasMarshmallow() -> Color.TRANSPARENT
- else -> Color.BLACK
- }
- return true
+ override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
+ return false
}
- override fun onCabItemClicked(item: MenuItem): Boolean {
- if (item.itemId == R.id.action_multi_select_adapter_check_all) {
+ override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
+ if (item?.itemId == R.id.action_multi_select_adapter_check_all) {
checkAll()
} else {
- onMultipleItemAction(item, ArrayList(checked))
- cab?.destroy()
+ onMultipleItemAction(item!!, ArrayList(checked))
+ actionMode?.finish()
clearChecked()
}
return true
}
+ override fun onDestroyActionMode(mode: ActionMode?) {
+ clearChecked()
+ activity.window.statusBarColor = when {
+ VersionUtils.hasMarshmallow() -> Color.TRANSPARENT
+ else -> Color.BLACK
+ }
+ actionMode = null
+ onBackPressedCallback.remove()
+ }
+
private fun checkAll() {
- if (ICabHolder != null) {
+ if (actionMode != null) {
checked.clear()
for (i in 0 until itemCount) {
val identifier = getIdentifier(i)
@@ -72,7 +74,7 @@ abstract class AbsMultiSelectAdapter(
}
protected val isInQuickSelectMode: Boolean
- get() = cab != null && cab!!.isActive()
+ get() = actionMode != null
protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List)
protected fun setMultiSelectMenuRes(@MenuRes menuRes: Int) {
@@ -80,16 +82,13 @@ abstract class AbsMultiSelectAdapter(
}
protected fun toggleChecked(position: Int): Boolean {
- if (ICabHolder != null) {
- val identifier = getIdentifier(position) ?: return false
- if (!checked.remove(identifier)) {
- checked.add(identifier)
- }
- notifyItemChanged(position)
- updateCab()
- return true
+ val identifier = getIdentifier(position) ?: return false
+ if (!checked.remove(identifier)) {
+ checked.add(identifier)
}
- return false
+ notifyItemChanged(position)
+ updateCab()
+ return true
}
private fun clearChecked() {
@@ -97,23 +96,21 @@ abstract class AbsMultiSelectAdapter(
notifyDataSetChanged()
}
- @SuppressLint("StringFormatInvalid", "StringFormatMatches")
private fun updateCab() {
- if (ICabHolder != null) {
- if (cab == null || !cab!!.isActive()) {
- cab = ICabHolder.openCab(menuRes, this)
+ if (actionMode == null) {
+ actionMode = activity.startActionMode(this)?.apply {
+ customView = NumberRollViewBinding.inflate(activity.layoutInflater).root
}
- val size = checked.size
- when {
- size <= 0 -> {
- cab?.destroy()
- }
- size == 1 -> {
- cab?.title(literal = getName(checked[0]))
- }
- else -> {
- cab?.title(literal = activity.getString(R.string.x_selected, size))
- }
+ activity.onBackPressedDispatcher.addCallback(onBackPressedCallback)
+ }
+ val size = checked.size
+ when {
+ size <= 0 -> {
+ actionMode?.finish()
+ }
+ else -> {
+ actionMode?.customView?.findViewById(R.id.selection_mode_number)
+ ?.setNumber(size, true)
}
}
}
@@ -122,4 +119,13 @@ abstract class AbsMultiSelectAdapter(
checked = ArrayList()
this.menuRes = menuRes
}
+
+ private val onBackPressedCallback = object : OnBackPressedCallback(true) {
+ override fun handleOnBackPressed() {
+ if (actionMode != null) {
+ actionMode?.finish()
+ remove()
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt
index 7704f12f4..6e5b0c001 100755
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt
@@ -15,6 +15,7 @@
package code.name.monkey.retromusic.adapter.playlist
import android.graphics.Color
+import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
@@ -23,33 +24,33 @@ import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isGone
import androidx.core.view.setPadding
import androidx.fragment.app.FragmentActivity
+import code.name.monkey.appthemehelper.util.ATHUtil
+import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.toSongs
import code.name.monkey.retromusic.extensions.dipToPix
-import code.name.monkey.retromusic.glide.GlideApp
+import code.name.monkey.retromusic.glide.RetroGlideExtension.playlistOptions
import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
+import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
class PlaylistAdapter(
override val activity: FragmentActivity,
var dataSet: List,
private var itemLayoutRes: Int,
- ICabHolder: ICabHolder?,
private val listener: IPlaylistClickListener
) : AbsMultiSelectAdapter(
activity,
- ICabHolder,
R.menu.menu_playlists_selection
), PopupTextProvider {
@@ -71,7 +72,7 @@ class PlaylistAdapter(
return createViewHolder(view)
}
- fun createViewHolder(view: View): ViewHolder {
+ private fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view)
}
@@ -100,17 +101,23 @@ class PlaylistAdapter(
holder.title?.text = getPlaylistTitle(playlist.playlistEntity)
holder.text?.text = getPlaylistText(playlist)
holder.menu?.isGone = isChecked(playlist)
- GlideApp.with(activity)
- .load(
- if (itemLayoutRes == R.layout.item_list) {
- holder.image?.setPadding(activity.dipToPix(8F).toInt())
- R.drawable.ic_playlist_play
- } else PlaylistPreview(playlist)
- )
- .playlistOptions()
- .into(holder.image!!)
+ if (itemLayoutRes == R.layout.item_list) {
+ holder.image?.setPadding(activity.dipToPix(8F).toInt())
+ holder.image?.setImageDrawable(getIconRes())
+ } else {
+ Glide.with(activity)
+ .load(PlaylistPreview(playlist))
+ .playlistOptions()
+ .into(holder.image!!)
+ }
}
+ private fun getIconRes(): Drawable = TintHelper.createTintedDrawable(
+ activity,
+ R.drawable.ic_playlist_play,
+ ATHUtil.resolveColor(activity, android.R.attr.colorControlNormal)
+ )
+
override fun getItemCount(): Int {
return dataSet.size
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt
index 03ed72337..2d5fd724f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt
@@ -21,15 +21,13 @@ import androidx.annotation.LayoutRes
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
abstract class AbsOffsetSongAdapter(
activity: FragmentActivity,
dataSet: MutableList,
- @LayoutRes itemLayoutRes: Int,
- ICabHolder: ICabHolder?
-) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
+ @LayoutRes itemLayoutRes: Int
+) : SongAdapter(activity, dataSet, itemLayoutRes) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
if (viewType == OFFSET_ITEM) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt
index 918ceb8de..88a0b7a8d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt
@@ -24,13 +24,8 @@ import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.db.toSongsEntity
import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
-import code.name.monkey.retromusic.extensions.accentColor
-import code.name.monkey.retromusic.extensions.accentOutlineColor
import code.name.monkey.retromusic.fragments.LibraryViewModel
-import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
-import com.google.android.material.button.MaterialButton
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import kotlinx.coroutines.Dispatchers
@@ -38,12 +33,11 @@ import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel
class OrderablePlaylistSongAdapter(
- private val playlist: PlaylistEntity,
+ private val playlistId: Long,
activity: FragmentActivity,
dataSet: MutableList,
itemLayoutRes: Int,
- ICabHolder: ICabHolder?,
-) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder),
+) : SongAdapter(activity, dataSet, itemLayoutRes),
DraggableItemAdapter {
val libraryViewModel: LibraryViewModel by activity.viewModel()
@@ -67,45 +61,20 @@ class OrderablePlaylistSongAdapter(
return ViewHolder(view)
}
- override fun getItemViewType(position: Int): Int {
- return if (position == 0) OFFSET_ITEM else SONG
- }
-
- override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
- if (holder.itemViewType == OFFSET_ITEM) {
- val viewHolder = holder as ViewHolder
- viewHolder.playAction?.let {
- it.setOnClickListener {
- MusicPlayerRemote.openQueue(dataSet, 0, true)
- }
- it.accentOutlineColor()
- }
- viewHolder.shuffleAction?.let {
- it.setOnClickListener {
- MusicPlayerRemote.openAndShuffleQueue(dataSet, true)
- }
- it.accentColor()
- }
- } else {
- super.onBindViewHolder(holder, position - 1)
- }
- }
-
override fun onMultipleItemAction(menuItem: MenuItem, selection: List) {
when (menuItem.itemId) {
R.id.action_remove_from_playlist -> RemoveSongFromPlaylistDialog.create(
selection.toSongsEntity(
- playlist
+ playlistId
)
)
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
+
else -> super.onMultipleItemAction(menuItem, selection)
}
}
- inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) {
- val playAction: MaterialButton? = itemView.findViewById(R.id.playAction)
- val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction)
+ inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) {
override var songMenuRes: Int
get() = R.menu.menu_item_playlist_song
@@ -116,7 +85,7 @@ class OrderablePlaylistSongAdapter(
override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_remove_from_playlist -> {
- RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlist.playListId))
+ RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlistId))
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
return true
}
@@ -149,7 +118,7 @@ class OrderablePlaylistSongAdapter(
}
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange {
- return ItemDraggableRange(1, itemCount - 1)
+ return ItemDraggableRange(0, itemCount - 1)
}
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt
index ae2de00c6..2d387be44 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt
@@ -19,8 +19,8 @@ import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicPlayerRemote.isPlaying
import code.name.monkey.retromusic.helper.MusicPlayerRemote.playNextSong
@@ -28,6 +28,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote.removeFromQueue
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.ViewUtil
+import com.bumptech.glide.Glide
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
@@ -42,10 +43,9 @@ class PlayingQueueAdapter(
activity: FragmentActivity,
dataSet: MutableList,
private var current: Int,
- itemLayoutRes: Int
-) : SongAdapter(
- activity, dataSet, itemLayoutRes, null
-), DraggableItemAdapter,
+ itemLayoutRes: Int,
+) : SongAdapter(activity, dataSet, itemLayoutRes),
+ DraggableItemAdapter,
SwipeableItemAdapter,
PopupTextProvider {
@@ -77,7 +77,7 @@ class PlayingQueueAdapter(
if (holder.image == null) {
return
}
- GlideApp.with(activity)
+ Glide.with(activity)
.load(RetroGlideExtension.getSongModel(song))
.songCoverOptions(song)
.into(holder.image!!)
@@ -153,6 +153,14 @@ class PlayingQueueAdapter(
dragView?.isVisible = true
}
+ override fun onClick(v: View?) {
+ if (isInQuickSelectMode) {
+ toggleChecked(layoutPosition)
+ } else {
+ MusicPlayerRemote.playSongAt(layoutPosition)
+ }
+ }
+
override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_remove_from_playing_queue -> {
@@ -188,7 +196,7 @@ class PlayingQueueAdapter(
return if (result == SwipeableItemConstants.RESULT_CANCELED) {
SwipeResultActionDefault()
} else {
- SwipedResultActionRemoveItem(this, position, activity)
+ SwipedResultActionRemoveItem(this, position)
}
}
@@ -209,12 +217,9 @@ class PlayingQueueAdapter(
internal class SwipedResultActionRemoveItem(
private val adapter: PlayingQueueAdapter,
private val position: Int,
- private val activity: FragmentActivity
) : SwipeResultActionRemoveItem() {
private var songToRemove: Song? = null
- private val isPlaying: Boolean = MusicPlayerRemote.isPlaying
- private val songProgressMillis = 0
override fun onPerformAction() {
// currentlyShownSnackbar = null
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt
index b8f053ec7..82ba1a7f7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt
@@ -21,7 +21,6 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.accentOutlineColor
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
@@ -30,9 +29,8 @@ import com.google.android.material.button.MaterialButton
class ShuffleButtonSongAdapter(
activity: FragmentActivity,
dataSet: MutableList,
- itemLayoutRes: Int,
- ICabHolder: ICabHolder?
-) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
+ itemLayoutRes: Int
+) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes) {
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt
index 5871df950..f1f50e627 100755
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt
@@ -17,16 +17,14 @@ package code.name.monkey.retromusic.adapter.song
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
class SimpleSongAdapter(
context: FragmentActivity,
songs: ArrayList,
- layoutRes: Int,
- ICabHolder: ICabHolder?
-) : SongAdapter(context, songs, layoutRes, ICabHolder) {
+ layoutRes: Int
+) : SongAdapter(context, songs, layoutRes) {
override fun swapDataSet(dataSet: List) {
this.dataSet = dataSet.toMutableList()
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt
index 2af3da7da..7b7b7bf99 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt
@@ -28,20 +28,21 @@ import androidx.navigation.findNavController
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
-import code.name.monkey.retromusic.glide.GlideApp
+import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
/**
@@ -52,13 +53,11 @@ open class SongAdapter(
override val activity: FragmentActivity,
var dataSet: MutableList,
protected var itemLayoutRes: Int,
- ICabHolder: ICabHolder?,
showSectionName: Boolean = true
) : AbsMultiSelectAdapter(
activity,
- ICabHolder,
R.menu.menu_media_selection
-), ICabCallback, PopupTextProvider {
+), PopupTextProvider {
private var showSectionName = true
@@ -119,7 +118,9 @@ open class SongAdapter(
if (holder.image == null) {
return
}
- GlideApp.with(activity).asBitmapPalette().songCoverOptions(song)
+ Glide.with(activity)
+ .asBitmapPalette()
+ .songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
@@ -158,6 +159,11 @@ open class SongAdapter(
override fun getPopupText(position: Int): String {
val sectionName: String? = when (PreferenceUtil.songSortOrder) {
+ SortOrder.SongSortOrder.SONG_DEFAULT -> return MusicUtil.getSectionName(
+ dataSet[position].title,
+ true
+ )
+
SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title
SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName
SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName
@@ -171,7 +177,7 @@ open class SongAdapter(
return MusicUtil.getSectionName(sectionName)
}
- open inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
+ open inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
protected open var songMenuRes = SongMenuHelper.MENU_RES
protected open val song: Song
get() = dataSet[layoutPosition]
@@ -215,6 +221,7 @@ open class SongAdapter(
}
override fun onLongClick(v: View?): Boolean {
+ println("Long click")
return toggleChecked(layoutPosition)
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt
index 0aea9d366..7d9497209 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt
@@ -29,7 +29,6 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
@@ -152,7 +151,7 @@ class AppWidgetBig : BaseAppWidget() {
if (target != null) {
Glide.with(service).clear(target)
}
- target = GlideApp.with(appContext)
+ target = Glide.with(appContext)
.asBitmap()
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt
index 80e0b09ea..471d908d6 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt
@@ -29,8 +29,9 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
@@ -143,7 +144,9 @@ class AppWidgetCard : BaseAppWidget() {
if (target != null) {
Glide.with(service).clear(target)
}
- target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
+ target = Glide.with(service)
+ .asBitmapPalette()
+ .songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.centerCrop()
.into(object : CustomTarget(imageSize, imageSize) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCircle.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCircle.kt
index cdb48a063..cb3ae0e44 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCircle.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCircle.kt
@@ -28,8 +28,9 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
@@ -89,7 +90,7 @@ class AppWidgetCircle : BaseAppWidget() {
).toBitmap()
)
val isFavorite = runBlocking(Dispatchers.IO) {
- return@runBlocking MusicUtil.repository.isSongFavorite(song.id)
+ return@runBlocking MusicUtil.isFavorite(song)
}
val favoriteRes =
if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border
@@ -114,7 +115,9 @@ class AppWidgetCircle : BaseAppWidget() {
if (target != null) {
Glide.with(service).clear(target)
}
- target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
+ target = Glide.with(service)
+ .asBitmapPalette()
+ .songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.apply(RequestOptions.circleCropTransform())
.into(object : CustomTarget(imageSize, imageSize) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt
index 2f1d7b173..ad04f8aae 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt
@@ -30,8 +30,9 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
@@ -119,7 +120,9 @@ class AppWidgetClassic : BaseAppWidget() {
if (target != null) {
Glide.with(service).clear(target)
}
- target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
+ target = Glide.with(service)
+ .asBitmapPalette()
+ .songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
//.checkIgnoreMediaStore()
.centerCrop()
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt
index cc07fa1d2..618914ff3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt
@@ -29,8 +29,9 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
@@ -144,7 +145,9 @@ class AppWidgetMD3 : BaseAppWidget() {
if (target != null) {
Glide.with(service).clear(target)
}
- target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
+ target = Glide.with(service)
+ .asBitmapPalette()
+ .songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.centerCrop()
.into(object : CustomTarget(imageSize, imageSize) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt
index 12246e860..ee4e87e99 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt
@@ -29,8 +29,9 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
@@ -122,7 +123,9 @@ class AppWidgetSmall : BaseAppWidget() {
if (target != null) {
Glide.with(service).clear(target)
}
- target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
+ target = Glide.with(service)
+ .asBitmapPalette()
+ .songCoverOptions(song)
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.centerCrop()
diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt
index 5e9004e98..b7abb6ee5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt
@@ -40,29 +40,29 @@ class AppWidgetText : BaseAppWidget() {
appWidgetView.setImageViewBitmap(
R.id.button_next,
context.getTintedDrawable(R.drawable.ic_skip_next, ContextCompat.getColor(
- context, R.color.md_white_1000
+ context, code.name.monkey.appthemehelper.R.color.md_white_1000
)).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
context.getTintedDrawable(R.drawable.ic_skip_previous, ContextCompat.getColor(
- context, R.color.md_white_1000
+ context, code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
context.getTintedDrawable(R.drawable.ic_play_arrow_white_32dp, ContextCompat.getColor(
- context, R.color.md_white_1000
+ context, code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
appWidgetView.setTextColor(
- R.id.title, ContextCompat.getColor(context, R.color.md_white_1000)
+ R.id.title, ContextCompat.getColor(context, code.name.monkey.appthemehelper.R.color.md_white_1000)
)
appWidgetView.setTextColor(
- R.id.text, ContextCompat.getColor(context, R.color.md_white_1000)
+ R.id.text, ContextCompat.getColor(context, code.name.monkey.appthemehelper.R.color.md_white_1000)
)
linkButtons(context, appWidgetView)
@@ -127,7 +127,7 @@ class AppWidgetText : BaseAppWidget() {
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
service.getTintedDrawable(playPauseRes, ContextCompat.getColor(
- service, R.color.md_white_1000)
+ service, code.name.monkey.appthemehelper.R.color.md_white_1000)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
@@ -136,7 +136,7 @@ class AppWidgetText : BaseAppWidget() {
R.drawable.ic_skip_next,
ContextCompat.getColor(
service,
- R.color.md_white_1000
+ code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
@@ -145,7 +145,7 @@ class AppWidgetText : BaseAppWidget() {
service.getTintedDrawable(
R.drawable.ic_skip_previous,
ContextCompat.getColor(
- service, R.color.md_white_1000
+ service, code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
diff --git a/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt b/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt
index 1b11510a0..b6e267ed2 100644
--- a/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt
@@ -31,7 +31,7 @@ import java.lang.ref.WeakReference
* Created by Beesham Sarendranauth (Beesham)
*/
class AutoMusicProvider(
- val mContext: Context,
+ private val mContext: Context,
private val songsRepository: SongRepository,
private val albumsRepository: AlbumRepository,
private val artistsRepository: ArtistRepository,
@@ -138,7 +138,7 @@ class AutoMusicProvider(
topPlayedRepository.notRecentlyPlayedTracks().take(8)
}
else -> {
- emptyList()
+ emptyList()
}
}
songs.forEach { song ->
diff --git a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt
index 64db1ae43..dea1e6b7d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt
@@ -41,6 +41,10 @@ interface PlaylistDao {
@Query("SELECT * FROM PlaylistEntity")
suspend fun playlistsWithSongs(): List
+ @Transaction
+ @Query("SELECT * FROM PlaylistEntity WHERE playlist_id= :playlistId")
+ fun getPlaylist(playlistId: Long): LiveData
+
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSongsToPlaylist(songEntities: List)
@@ -59,8 +63,9 @@ interface PlaylistDao {
@Delete
suspend fun deletePlaylistSongs(songs: List)
- @Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId")
- fun favoritesSongsLiveData(playlistId: Long): LiveData>
+ @RewriteQueriesToDropUnusedColumns
+ @Query("SELECT * FROM SongEntity ,(SELECT playlist_id FROM PlaylistEntity WHERE playlist_name= :playlistName LIMIT 1) AS playlist WHERE playlist_creator_id= playlist.playlist_id")
+ fun favoritesSongsLiveData(playlistName: String): LiveData>
@Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId")
fun favoritesSongs(playlistId: Long): List
diff --git a/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt b/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt
index 804342126..6401766aa 100644
--- a/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt
@@ -18,14 +18,12 @@ import androidx.room.Database
import androidx.room.RoomDatabase
@Database(
- entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class],
- version = 23,
+ entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class],
+ version = 24,
exportSchema = false
)
abstract class RetroDatabase : RoomDatabase() {
abstract fun playlistDao(): PlaylistDao
- abstract fun blackListStore(): BlackListStoreDao
abstract fun playCountDao(): PlayCountDao
abstract fun historyDao(): HistoryDao
- abstract fun lyricsDao(): LyricsDao
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/db/RoomMigrations.kt b/app/src/main/java/code/name/monkey/retromusic/db/RoomMigrations.kt
new file mode 100644
index 000000000..b8b383c31
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/db/RoomMigrations.kt
@@ -0,0 +1,11 @@
+package code.name.monkey.retromusic.db
+
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SupportSQLiteDatabase
+
+val MIGRATION_23_24 = object : Migration(23, 24) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("DROP TABLE LyricsEntity")
+ database.execSQL("DROP TABLE BlackListStoreEntity")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/db/SongExtension.kt b/app/src/main/java/code/name/monkey/retromusic/db/SongExtension.kt
index 4a3705de0..d6fe11b05 100644
--- a/app/src/main/java/code/name/monkey/retromusic/db/SongExtension.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/db/SongExtension.kt
@@ -145,3 +145,9 @@ fun List.toSongsEntity(playlistEntity: PlaylistEntity): List {
it.toSongEntity(playlistEntity.playListId)
}
}
+
+fun List.toSongsEntity(playlistId: Long): List {
+ return map {
+ it.toSongEntity(playlistId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt
index c4bdd047d..aa47f0fe2 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt
@@ -27,10 +27,10 @@ import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.model.Song
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class AddToPlaylistDialog : DialogFragment() {
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
companion object {
fun create(playlistEntities: List, song: Song): AddToPlaylistDialog {
@@ -58,8 +58,8 @@ class AddToPlaylistDialog : DialogFragment() {
playlistNames.add(entity.playlistName)
}
return materialDialog(R.string.add_playlist_title)
- .setItems(playlistNames.toTypedArray()) { dialog, which->
- if (which == 0) {
+ .setItems(playlistNames.toTypedArray()) { dialog, which ->
+ if (which == 0) {
showCreateDialog(songs)
} else {
libraryViewModel.addToPlaylist(requireContext(), playlistNames[which], songs)
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt
index bd9b3e258..7d7a01c90 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt
@@ -29,12 +29,12 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.model.Song
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class CreatePlaylistDialog : DialogFragment() {
private var _binding: DialogPlaylistBinding? = null
private val binding get() = _binding!!
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
companion object {
fun create(song: Song): CreatePlaylistDialog {
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt
index be133cbe5..30675d88a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt
@@ -27,11 +27,11 @@ import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.ReloadType
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class DeletePlaylistDialog : DialogFragment() {
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
companion object {
@@ -55,10 +55,13 @@ class DeletePlaylistDialog : DialogFragment() {
//noinspection ConstantConditions
if (playlists.size > 1) {
title = R.string.delete_playlists_title
- message = String.format(getString(R.string.delete_x_playlists), playlists.size).parseAsHtml()
+ message =
+ String.format(getString(R.string.delete_x_playlists), playlists.size).parseAsHtml()
} else {
title = R.string.delete_playlist_title
- message = String.format(getString(R.string.delete_playlist_x), playlists[0].playlistName).parseAsHtml()
+ message =
+ String.format(getString(R.string.delete_playlist_x), playlists[0].playlistName)
+ .parseAsHtml()
}
return materialDialog(title)
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/ImportPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/ImportPlaylistDialog.kt
index 2d16b223b..87e3b6dbd 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/ImportPlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/ImportPlaylistDialog.kt
@@ -21,10 +21,10 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.fragments.LibraryViewModel
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class ImportPlaylistDialog : DialogFragment() {
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return materialDialog(R.string.import_playlist)
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt
index a51479248..cd94bc480 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveSongFromPlaylistDialog.kt
@@ -26,10 +26,10 @@ import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.fragments.LibraryViewModel
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class RemoveSongFromPlaylistDialog : DialogFragment() {
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
companion object {
fun create(song: SongEntity): RemoveSongFromPlaylistDialog {
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt
index 18a3ab714..803315277 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt
@@ -29,11 +29,11 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.ReloadType
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class RenamePlaylistDialog : DialogFragment() {
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
companion object {
fun create(playlistEntity: PlaylistEntity): RenamePlaylistDialog {
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
index 9ee506958..32de5ba6c 100755
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
@@ -17,6 +17,7 @@ package code.name.monkey.retromusic.dialogs
import android.app.AlarmManager
import android.app.Dialog
import android.app.PendingIntent
+import android.content.DialogInterface
import android.content.Intent
import android.os.Bundle
import android.os.CountDownTimer
@@ -25,43 +26,45 @@ import android.widget.CheckBox
import android.widget.SeekBar
import android.widget.TextView
import android.widget.Toast
+import androidx.appcompat.app.AlertDialog
import androidx.core.content.getSystemService
+import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.DialogSleepTimerBinding
import code.name.monkey.retromusic.extensions.addAccentColor
-import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PENDING_QUIT
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_QUIT
+import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
-import com.afollestad.materialdialogs.MaterialDialog
-import com.afollestad.materialdialogs.WhichButton
-import com.afollestad.materialdialogs.actions.getActionButton
class SleepTimerDialog : DialogFragment() {
private var seekArcProgress: Int = 0
private lateinit var timerUpdater: TimerUpdater
- private lateinit var dialog: MaterialDialog
- private lateinit var shouldFinishLastSong: CheckBox
- private lateinit var timerDisplay: TextView
+ private lateinit var dialog: AlertDialog
+
+ private var _binding: DialogSleepTimerBinding? = null
+ private val binding get() = _binding!!
+
+ private val shouldFinishLastSong: CheckBox get() = binding.shouldFinishLastSong
+ private val seekBar: SeekBar get() = binding.seekBar
+ private val timerDisplay: TextView get() = binding.timerDisplay
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
timerUpdater = TimerUpdater()
- val binding = DialogSleepTimerBinding.inflate(layoutInflater)
- shouldFinishLastSong = binding.shouldFinishLastSong
- timerDisplay = binding.timerDisplay
+ _binding = DialogSleepTimerBinding.inflate(layoutInflater)
val finishMusic = PreferenceUtil.isSleepTimerFinishMusic
shouldFinishLastSong.apply {
addAccentColor()
isChecked = finishMusic
}
- binding.seekBar.apply {
+ seekBar.apply {
addAccentColor()
seekArcProgress = PreferenceUtil.lastSleepTimerValue
updateTimeDisplayTime()
@@ -85,47 +88,65 @@ class SleepTimerDialog : DialogFragment() {
PreferenceUtil.lastSleepTimerValue = seekArcProgress
}
})
- return materialDialog(R.string.action_sleep_timer)
- .setView(binding.root)
- .setPositiveButton(R.string.action_set) { _, _ ->
- PreferenceUtil.isSleepTimerFinishMusic = shouldFinishLastSong.isChecked
- val minutes = seekArcProgress
- val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT)
- val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000
- PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt()
- val am = requireContext().getSystemService()
- am?.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi)
- Toast.makeText(
- requireContext(),
- requireContext().resources.getString(R.string.sleep_timer_set, minutes),
- Toast.LENGTH_SHORT
- ).show()
- }
- .setNegativeButton(android.R.string.cancel) { _, _ ->
- val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE)
- if (previous != null) {
- val am = requireContext().getSystemService()
- am?.cancel(previous)
- previous.cancel()
- Toast.makeText(
- requireContext(),
- requireContext().resources.getString(R.string.sleep_timer_canceled),
- Toast.LENGTH_SHORT
- ).show()
- val musicService = MusicPlayerRemote.musicService
- if (musicService != null && musicService.pendingQuit) {
- musicService.pendingQuit = false
+ materialDialog(R.string.action_sleep_timer).apply {
+ if (PreferenceUtil.nextSleepTimerElapsedRealTime > System.currentTimeMillis()) {
+ seekBar.isVisible = false
+ shouldFinishLastSong.isVisible = false
+ timerUpdater.start()
+ setPositiveButton(android.R.string.ok, null)
+ setNegativeButton(R.string.action_cancel) { _, _ ->
+ timerUpdater.cancel()
+ val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE)
+ if (previous != null) {
+ val am = requireContext().getSystemService()
+ am?.cancel(previous)
+ previous.cancel()
Toast.makeText(
requireContext(),
requireContext().resources.getString(R.string.sleep_timer_canceled),
Toast.LENGTH_SHORT
).show()
+ val musicService = MusicPlayerRemote.musicService
+ if (musicService != null && musicService.pendingQuit) {
+ musicService.pendingQuit = false
+ Toast.makeText(
+ requireContext(),
+ requireContext().resources.getString(R.string.sleep_timer_canceled),
+ Toast.LENGTH_SHORT
+ ).show()
+ }
}
}
+ } else {
+ seekBar.isVisible = true
+ shouldFinishLastSong.isVisible = true
+ setPositiveButton(R.string.action_set) { _, _ ->
+ PreferenceUtil.isSleepTimerFinishMusic = shouldFinishLastSong.isChecked
+ val minutes = seekArcProgress
+ val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT)
+ val nextSleepTimerElapsedTime =
+ SystemClock.elapsedRealtime() + minutes * 60 * 1000
+ PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt()
+ val am = requireContext().getSystemService()
+ am?.setExact(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ nextSleepTimerElapsedTime,
+ pi
+ )
+
+ Toast.makeText(
+ requireContext(),
+ requireContext().resources.getString(R.string.sleep_timer_set, minutes),
+ Toast.LENGTH_SHORT
+ ).show()
+ }
}
- .create()
- .colorButtons()
+ setView(binding.root)
+ dialog = create()
+
+ }
+ return dialog
}
private fun updateTimeDisplayTime() {
@@ -147,14 +168,10 @@ class SleepTimerDialog : DialogFragment() {
} else intent.setAction(ACTION_QUIT)
}
- private fun updateCancelButton() {
- val musicService = MusicPlayerRemote.musicService
- if (musicService != null && musicService.pendingQuit) {
- dialog.getActionButton(WhichButton.NEUTRAL).text =
- dialog.context.getString(R.string.cancel_current_timer)
- } else {
- dialog.getActionButton(WhichButton.NEUTRAL).text = null
- }
+ override fun onDismiss(dialog: DialogInterface) {
+ super.onDismiss(dialog)
+ timerUpdater.cancel()
+ _binding = null
}
private inner class TimerUpdater :
@@ -164,10 +181,9 @@ class SleepTimerDialog : DialogFragment() {
) {
override fun onTick(millisUntilFinished: Long) {
+ timerDisplay.text = MusicUtil.getReadableDurationString(millisUntilFinished)
}
- override fun onFinish() {
- updateCancelButton()
- }
+ override fun onFinish() {}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt
index 5a5c90855..19995db30 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt
@@ -19,6 +19,7 @@ import android.content.Context
import android.os.Bundle
import android.text.Spanned
import android.util.Log
+import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf
import androidx.core.text.parseAsHtml
import androidx.fragment.app.DialogFragment
@@ -38,7 +39,7 @@ class SongDetailDialog : DialogFragment() {
val context: Context = requireContext()
val binding = DialogFileDetailsBinding.inflate(layoutInflater)
- val song = requireArguments().getParcelable(EXTRA_SONG)
+ val song = BundleCompat.getParcelable(requireArguments(), EXTRA_SONG, Song::class.java)
with(binding) {
fileName.text = makeTextWithTitle(context, R.string.label_file_name, "-")
filePath.text = makeTextWithTitle(context, R.string.label_file_path, "-")
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt
index ab50e3dc4..fcfad5a5d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt
@@ -17,6 +17,7 @@ package code.name.monkey.retromusic.dialogs
import android.app.Dialog
import android.content.Intent
import android.os.Bundle
+import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_SONG
@@ -29,7 +30,7 @@ import code.name.monkey.retromusic.util.MusicUtil
class SongShareDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- val song: Song? = requireArguments().getParcelable(EXTRA_SONG)
+ val song: Song? = BundleCompat.getParcelable(requireArguments(), EXTRA_SONG, Song::class.java)
val listening: String =
String.format(
getString(R.string.currently_listening_to_x_by_x),
@@ -60,8 +61,7 @@ class SongShareDialog : DialogFragment() {
0 -> {
startActivity(Intent.createChooser(song?.let {
MusicUtil.createShareSongFileIntent(
- it,
- requireContext()
+ requireContext(), it
)
}, null))
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityExtensions.kt
index bf3d9d8cd..043bcbea5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityExtensions.kt
@@ -20,6 +20,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.annotation.DimenRes
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.os.BundleCompat
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import com.google.android.material.appbar.MaterialToolbar
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt
index c4a5c7ee8..d6c5a559d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt
@@ -16,7 +16,7 @@ import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.PreferenceUtil
-fun AppCompatActivity.toggleScreenOn() {
+fun AppCompatActivity.maybeSetScreenOn() {
if (PreferenceUtil.isScreenOnEnabled) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} else {
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt
index cfd09a642..b1ae4bec8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt
@@ -52,7 +52,7 @@ fun Int.ripAlpha(): Int {
fun Dialog.colorControlNormal() = resolveColor(android.R.attr.colorControlNormal)
fun Toolbar.backgroundTintList() {
- val surfaceColor = ATHUtil.resolveColor(context, R.attr.colorSurface, Color.BLACK)
+ val surfaceColor = ATHUtil.resolveColor(context, com.google.android.material.R.attr.colorSurface, Color.BLACK)
val colorStateList = ColorStateList.valueOf(surfaceColor)
backgroundTintList = colorStateList
}
@@ -61,13 +61,13 @@ fun Context.accentColor() = ThemeStore.accentColor(this)
fun Fragment.accentColor() = ThemeStore.accentColor(requireContext())
-fun Context.surfaceColor() = resolveColor(R.attr.colorSurface, Color.WHITE)
+fun Context.surfaceColor() = resolveColor(com.google.android.material.R.attr.colorSurface, Color.WHITE)
-fun Fragment.surfaceColor() = resolveColor(R.attr.colorSurface, Color.WHITE)
+fun Fragment.surfaceColor() = resolveColor(com.google.android.material.R.attr.colorSurface, Color.WHITE)
-fun Context.surfaceColor(fallBackColor: Int) = resolveColor(R.attr.colorSurface, fallBackColor)
+fun Context.surfaceColor(fallBackColor: Int) = resolveColor(com.google.android.material.R.attr.colorSurface, fallBackColor)
-fun Fragment.surfaceColor(fallBackColor: Int) = resolveColor(R.attr.colorSurface, fallBackColor)
+fun Fragment.surfaceColor(fallBackColor: Int) = resolveColor(com.google.android.material.R.attr.colorSurface, fallBackColor)
fun Context.textColorSecondary() = resolveColor(android.R.attr.textColorSecondary)
@@ -135,7 +135,9 @@ fun Button.accentTextColor() {
fun MaterialButton.accentBackgroundColor() {
if (materialYou) return
- backgroundTintList = ColorStateList.valueOf(context.accentColor())
+ backgroundTintList = ColorStateList(
+ arrayOf(intArrayOf(android.R.attr.state_enabled), intArrayOf()),
+ intArrayOf(context.accentColor(), context.accentColor().addAlpha(0.12f)))
}
fun MaterialButton.accentOutlineColor() {
@@ -163,6 +165,15 @@ fun SeekBar.applyColor(@ColorInt color: Int) {
progressBackgroundTintList = ColorStateList.valueOf(color)
}
+fun Slider.applyColor(@ColorInt color: Int) {
+ ColorStateList.valueOf(color).run {
+ thumbTintList = this
+ trackActiveTintList = this
+ trackInactiveTintList = ColorStateList.valueOf(color.addAlpha(0.1f))
+ haloTintList = this
+ }
+}
+
fun ExtendedFloatingActionButton.accentColor() {
if (materialYou) return
val color = ThemeStore.accentColor(context)
@@ -301,5 +312,9 @@ inline val @receiver:ColorInt Int.lighterColor
inline val @receiver:ColorInt Int.darkerColor
get() = ColorUtil.darkenColor(this)
-inline val Int.colorStateList : ColorStateList
- get() = ColorStateList.valueOf(this)
\ No newline at end of file
+inline val Int.colorStateList: ColorStateList
+ get() = ColorStateList.valueOf(this)
+
+fun @receiver:ColorInt Int.addAlpha(alpha: Float): Int {
+ return ColorUtil.withAlpha(this, alpha)
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt
index bc2f1bde9..70c8a10f4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt
@@ -4,7 +4,7 @@ import androidx.core.view.WindowInsetsCompat
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
-fun WindowInsetsCompat?.safeGetBottomInsets(): Int {
+fun WindowInsetsCompat?.getBottomInsets(): Int {
return if (PreferenceUtil.isFullScreenMode) {
return 0
} else {
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/NavigationExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/NavigationExtensions.kt
index 6bb0cebc2..fc1f938d5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/NavigationExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/NavigationExtensions.kt
@@ -21,6 +21,7 @@ import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
+import androidx.navigation.navOptions
fun Fragment.navigate(@IdRes id: Int) = findNavController().navigate(id)
@@ -37,3 +38,13 @@ fun AppCompatActivity.findNavController(@IdRes id: Int): NavController {
val fragment = supportFragmentManager.findFragmentById(id) as NavHostFragment
return fragment.navController
}
+
+val fadeNavOptions
+ get() = navOptions {
+ anim {
+ enter = android.R.anim.fade_in
+ exit = android.R.anim.fade_out
+ popEnter = android.R.anim.fade_in
+ popExit = android.R.anim.fade_out
+ }
+ }
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt
index c8c7b70d1..f28f05624 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt
@@ -3,17 +3,20 @@ package code.name.monkey.retromusic.extensions
import android.support.v4.media.MediaDescriptionCompat
import android.support.v4.media.session.MediaSessionCompat.QueueItem
import code.name.monkey.retromusic.model.Song
+import code.name.monkey.retromusic.util.MusicUtil
-val Song.uri get() = code.name.monkey.retromusic.util.MusicUtil.getSongFileUri(songId = id)
+val Song.uri get() = MusicUtil.getSongFileUri(songId = id)
+val Song.albumArtUri get() = MusicUtil.getMediaStoreAlbumCoverUri(albumId)
fun ArrayList.toMediaSessionQueue(): List {
- return map {
+ return map { song ->
val mediaDescription = MediaDescriptionCompat.Builder()
- .setMediaId(it.id.toString())
- .setTitle(it.title)
- .setSubtitle(it.artistName)
+ .setMediaId(song.id.toString())
+ .setTitle(song.title)
+ .setSubtitle(song.artistName)
+ .setIconUri(song.albumArtUri)
.build()
- QueueItem(mediaDescription, it.hashCode().toLong())
+ QueueItem(mediaDescription, song.hashCode().toLong())
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
index 3399dec75..114ecf6d5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
@@ -16,6 +16,7 @@ package code.name.monkey.retromusic.extensions
import android.animation.Animator
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
+import android.content.res.ColorStateList
import android.graphics.drawable.BitmapDrawable
import android.view.LayoutInflater
import android.view.View
@@ -24,6 +25,7 @@ import android.view.ViewTreeObserver
import android.view.animation.AnimationUtils
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
+import androidx.annotation.ColorInt
import androidx.annotation.LayoutRes
import androidx.annotation.Px
import androidx.core.animation.doOnEnd
@@ -37,8 +39,12 @@ import code.name.monkey.retromusic.util.RetroUtil
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.card.MaterialCardView
+import com.google.android.material.navigation.NavigationBarView
+import com.google.android.material.navigationrail.NavigationRailView
import dev.chrisbanes.insetter.applyInsetter
+const val ANIM_DURATION = 300L
+
@Suppress("UNCHECKED_CAST")
fun ViewGroup.inflate(@LayoutRes layout: Int): T {
return LayoutInflater.from(context).inflate(layout, this, false) as T
@@ -62,6 +68,15 @@ fun EditText.appHandleColor(): EditText {
return this
}
+fun NavigationBarView.setItemColors(@ColorInt normalColor: Int, @ColorInt selectedColor: Int) {
+ val csl = ColorStateList(
+ arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)),
+ intArrayOf(normalColor, selectedColor)
+ )
+ itemIconTintList = csl
+ itemTextColor = csl
+}
+
/**
* Potentially animate showing a [BottomNavigationView].
*
@@ -71,7 +86,8 @@ fun EditText.appHandleColor(): EditText {
* Instead, take a snapshot of the view, and animate this in, only changing the visibility (and
* thus layout) when the animation completes.
*/
-fun BottomNavigationView.show() {
+fun NavigationBarView.show() {
+ if (this is NavigationRailView) return
if (isVisible) return
val parent = parent as ViewGroup
@@ -89,10 +105,10 @@ fun BottomNavigationView.show() {
drawable.setBounds(left, parent.height, right, parent.height + height)
parent.overlay.add(drawable)
ValueAnimator.ofInt(parent.height, top).apply {
- duration = 300
+ duration = ANIM_DURATION
interpolator = AnimationUtils.loadInterpolator(
context,
- android.R.interpolator.linear_out_slow_in
+ android.R.interpolator.accelerate_decelerate
)
addUpdateListener {
val newTop = it.animatedValue as Int
@@ -115,19 +131,25 @@ fun BottomNavigationView.show() {
* Instead, take a snapshot, instantly hide the view (so content lays out to fill), then animate
* out the snapshot.
*/
-fun BottomNavigationView.hide() {
+fun NavigationBarView.hide() {
+ if (this is NavigationRailView) return
if (isGone) return
+ if (!isLaidOut) {
+ isGone = true
+ return
+ }
+
val drawable = BitmapDrawable(context.resources, drawToBitmap())
val parent = parent as ViewGroup
drawable.setBounds(left, top, right, bottom)
parent.overlay.add(drawable)
isGone = true
ValueAnimator.ofInt(top, parent.height).apply {
- duration = 300L
+ duration = ANIM_DURATION
interpolator = AnimationUtils.loadInterpolator(
context,
- android.R.interpolator.fast_out_linear_in
+ android.R.interpolator.accelerate_decelerate
)
addUpdateListener {
val newTop = it.animatedValue as Int
@@ -158,7 +180,7 @@ fun View.translateYAnimate(value: Float): Animator {
fun BottomSheetBehavior<*>.peekHeightAnimate(value: Int): Animator {
return ObjectAnimator.ofInt(this, "peekHeight", value)
.apply {
- duration = 300
+ duration = ANIM_DURATION
start()
}
}
@@ -254,7 +276,7 @@ fun View.updateMargin(
@Px left: Int = marginLeft,
@Px top: Int = marginTop,
@Px right: Int = marginRight,
- @Px bottom: Int = marginBottom
+ @Px bottom: Int = marginBottom,
) {
(layoutParams as ViewGroup.MarginLayoutParams).updateMargins(left, top, right, bottom)
}
@@ -295,7 +317,7 @@ fun View.requestApplyInsetsWhenAttached() {
data class InitialPadding(
val left: Int, val top: Int,
- val right: Int, val bottom: Int
+ val right: Int, val bottom: Int,
)
fun recordInitialPaddingForView(view: View) = InitialPadding(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index 2a6e57fef..803cc07f6 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments
import android.animation.ValueAnimator
import android.content.Context
-import android.widget.Toast
import androidx.core.animation.doOnEnd
import androidx.lifecycle.*
import code.name.monkey.retromusic.RECENT_ALBUMS
@@ -34,6 +33,7 @@ import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.util.DensityUtil
import code.name.monkey.retromusic.util.PreferenceUtil
+import code.name.monkey.retromusic.util.logD
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.launch
@@ -145,48 +145,47 @@ class LibraryViewModel(
}
override fun onMediaStoreChanged() {
- println("onMediaStoreChanged")
+ logD("onMediaStoreChanged")
loadLibraryContent()
}
override fun onServiceConnected() {
- println("onServiceConnected")
+ logD("onServiceConnected")
}
override fun onServiceDisconnected() {
- println("onServiceDisconnected")
+ logD("onServiceDisconnected")
}
override fun onQueueChanged() {
- println("onQueueChanged")
+ logD("onQueueChanged")
}
override fun onPlayingMetaChanged() {
- println("onPlayingMetaChanged")
+ logD("onPlayingMetaChanged")
}
override fun onPlayStateChanged() {
- println("onPlayStateChanged")
+ logD("onPlayStateChanged")
}
override fun onRepeatModeChanged() {
- println("onRepeatModeChanged")
+ logD("onRepeatModeChanged")
}
override fun onShuffleModeChanged() {
- println("onShuffleModeChanged")
+ logD("onShuffleModeChanged")
}
override fun onFavoriteStateChanged() {
- println("onFavoriteStateChanged")
+ logD("onFavoriteStateChanged")
}
fun shuffleSongs() = viewModelScope.launch(IO) {
val songs = repository.allSongs()
- MusicPlayerRemote.openAndShuffleQueue(
- songs,
- true
- )
+ withContext(Main) {
+ MusicPlayerRemote.openAndShuffleQueue(songs, true)
+ }
}
fun renameRoomPlaylist(playListId: Long, name: String) = viewModelScope.launch(IO) {
@@ -351,8 +350,7 @@ class LibraryViewModel(
context.getString(
R.string.added_song_count_to_playlist,
songs.size,
- playlistName),
- Toast.LENGTH_SHORT)
+ playlistName))
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/MusicSeekSkipTouchListener.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/MusicSeekSkipTouchListener.kt
index 764dd84af..946b34e21 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/MusicSeekSkipTouchListener.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/MusicSeekSkipTouchListener.kt
@@ -1,13 +1,14 @@
package code.name.monkey.retromusic.fragments
import android.annotation.SuppressLint
-import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
+import android.view.ViewConfiguration
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import kotlinx.coroutines.*
+import kotlin.math.abs
/**
* @param activity, Activity
@@ -16,46 +17,63 @@ import kotlinx.coroutines.*
class MusicSeekSkipTouchListener(val activity: FragmentActivity, val next: Boolean) :
View.OnTouchListener {
- var job: Job? = null
- var counter = 0
- var wasSeeking = false
+ private var job: Job? = null
+ private var counter = 0
+ private var wasSeeking = false
- private val gestureDetector = GestureDetector(activity, object :
- GestureDetector.SimpleOnGestureListener() {
- override fun onDown(e: MotionEvent?): Boolean {
- job = activity.lifecycleScope.launch(Dispatchers.Default) {
- counter = 0
- while (isActive) {
- delay(500)
- wasSeeking = true
- var seekingDuration = MusicPlayerRemote.songProgressMillis
- if (next) {
- seekingDuration += 5000 * (counter.floorDiv(2) + 1)
- } else {
- seekingDuration -= 5000 * (counter.floorDiv(2) + 1)
- }
- MusicPlayerRemote.seekTo(seekingDuration)
- counter += 1
- }
- }
- return super.onDown(e)
- }
- })
+ private var startX = 0f
+ private var startY = 0f
+
+ private val scaledTouchSlop = ViewConfiguration.get(activity).scaledTouchSlop
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
- val action = event?.actionMasked
- if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- job?.cancel()
- if (!wasSeeking) {
- if (next) {
- MusicPlayerRemote.playNextSong()
- } else {
- MusicPlayerRemote.back()
+ when (event?.actionMasked) {
+ MotionEvent.ACTION_DOWN -> {
+ startX = event.x
+ startY = event.y
+ job = activity.lifecycleScope.launch(Dispatchers.Default) {
+ counter = 0
+ while (isActive) {
+ delay(500)
+ wasSeeking = true
+ var seekingDuration = MusicPlayerRemote.songProgressMillis
+ if (next) {
+ seekingDuration += 5000 * (counter.floorDiv(2) + 1)
+ } else {
+ seekingDuration -= 5000 * (counter.floorDiv(2) + 1)
+ }
+ withContext(Dispatchers.Main) {
+ MusicPlayerRemote.seekTo(seekingDuration)
+ }
+ counter += 1
+ }
}
}
- wasSeeking = false
+ MotionEvent.ACTION_UP -> {
+ job?.cancel()
+ val endX = event.x
+ val endY = event.y
+ if (!wasSeeking && isAClick(startX, endX, startY, endY)) {
+ if (next) {
+ MusicPlayerRemote.playNextSong()
+ } else {
+ MusicPlayerRemote.back()
+ }
+ }
+
+ wasSeeking = false
+ }
+ MotionEvent.ACTION_CANCEL -> {
+ job?.cancel()
+ }
}
- return gestureDetector.onTouchEvent(event)
+ return false
+ }
+
+ private fun isAClick(startX: Float, endX: Float, startY: Float, endY: Float): Boolean {
+ val differenceX = abs(startX - endX)
+ val differenceY = abs(startY - endY)
+ return !(differenceX > scaledTouchSlop || differenceY > scaledTouchSlop)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt
index 988c8c1e8..89edeb1af 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt
@@ -25,12 +25,11 @@ import code.name.monkey.retromusic.extensions.openUrl
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.util.NavigationUtil
import dev.chrisbanes.insetter.applyInsetter
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
class AboutFragment : Fragment(R.layout.fragment_about), View.OnClickListener {
private var _binding: FragmentAboutBinding? = null
private val binding get() = _binding!!
- private val libraryViewModel by sharedViewModel()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -40,7 +39,7 @@ class AboutFragment : Fragment(R.layout.fragment_about), View.OnClickListener {
binding.aboutContent.root.applyInsetter {
type(navigationBars = true) {
- padding()
+ padding(vertical = true)
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
index 33502c487..483ae4ffc 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
@@ -18,8 +18,11 @@ import android.app.ActivityOptions
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
-import android.view.*
-import androidx.activity.addCallback
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import android.view.SubMenu
+import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf
import androidx.core.view.doOnPreDraw
@@ -43,10 +46,16 @@ import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter
import code.name.monkey.retromusic.databinding.FragmentAlbumDetailsBinding
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
-import code.name.monkey.retromusic.extensions.*
+import code.name.monkey.retromusic.extensions.applyColor
+import code.name.monkey.retromusic.extensions.applyOutlineColor
+import code.name.monkey.retromusic.extensions.findActivityNavController
+import code.name.monkey.retromusic.extensions.show
+import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.SingleColorTarget
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_A_Z
@@ -54,18 +63,15 @@ import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_TRACK_LIST
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_Z_A
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.util.RetroColorUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
+import code.name.monkey.retromusic.util.RetroUtil
+import code.name.monkey.retromusic.util.logD
+import code.name.monkey.retromusic.util.logE
+import com.bumptech.glide.Glide
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform
@@ -78,7 +84,7 @@ import org.koin.core.parameter.parametersOf
import java.text.Collator
class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details),
- IAlbumClickListener, ICabHolder {
+ IAlbumClickListener {
private var _binding: FragmentAlbumDetailsBinding? = null
private val binding get() = _binding!!
@@ -114,12 +120,12 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
binding.toolbar.title = " "
binding.albumCoverContainer.transitionName = arguments.extraAlbumId.toString()
postponeEnterTransition()
- detailsViewModel.getAlbum().observe(viewLifecycleOwner) {
+ detailsViewModel.getAlbum().observe(viewLifecycleOwner) { album ->
view.doOnPreDraw {
startPostponedEnterTransition()
}
- albumArtistExists = !it.albumArtist.isNullOrEmpty()
- showAlbum(it)
+ albumArtistExists = !album.albumArtist.isNullOrEmpty()
+ showAlbum(album)
binding.artistImage.transitionName = if (albumArtistExists) {
album.albumArtist
} else {
@@ -158,12 +164,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
)
}
- requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
- if (!handleBackPress()) {
- remove()
- requireActivity().onBackPressed()
- }
- }
binding.appBarLayout?.statusBarForeground =
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
}
@@ -177,8 +177,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
simpleSongAdapter = SimpleSongAdapter(
requireActivity() as AppCompatActivity,
ArrayList(),
- R.layout.item_song,
- this
+ R.layout.item_song
)
binding.fragmentAlbumContent.recyclerView.apply {
layoutManager = LinearLayoutManager(requireContext())
@@ -237,7 +236,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
String.format(getString(R.string.label_more_from), album.artistName)
val albumAdapter =
- HorizontalAlbumAdapter(requireActivity() as AppCompatActivity, albums, this, this)
+ HorizontalAlbumAdapter(requireActivity() as AppCompatActivity, albums, this)
binding.fragmentAlbumContent.moreRecyclerView.layoutManager = GridLayoutManager(
requireContext(),
1,
@@ -251,7 +250,8 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner) {
moreAlbums(it)
}
- GlideApp.with(requireContext())
+ Glide.with(requireContext())
+ //.forceDownload(PreferenceUtil.isAllowedToDownloadMetadata())
.load(
RetroGlideExtension.getArtistModel(artist)
)
@@ -262,7 +262,8 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
}
private fun loadAlbumCover(album: Album) {
- GlideApp.with(requireContext()).asBitmapPalette()
+ Glide.with(requireContext())
+ .asBitmapPalette()
.albumCoverOptions(album.safeGetFirstSong())
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
@@ -294,7 +295,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_album_detail, menu)
val sortOrder = menu.findItem(R.id.action_sort_order)
- setUpSortOrderMenu(sortOrder.subMenu)
+ setUpSortOrderMenu(sortOrder.subMenu!!)
ToolbarContentTintHelper.handleOnCreateOptionsMenu(
requireContext(),
binding.toolbar,
@@ -407,38 +408,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
simpleSongAdapter.swapDataSet(album.songs)
}
- private fun handleBackPress(): Boolean {
- cab?.let {
- if (it.isActive()) {
- it.destroy()
- return true
- }
- }
- return false
- }
-
- private var cab: AttachedCab? = null
-
- override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
- cab?.let {
- if (it.isActive()) {
- it.destroy()
- }
- }
- cab = createCab(R.id.toolbar_container) {
- menu(menuRes)
- closeDrawable(R.drawable.ic_close)
- backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
- slideDown()
- onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
-
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt
index 883e421bc..1b021bdf2 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt
@@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.albums
import android.os.Bundle
import android.view.*
-import androidx.activity.addCallback
import androidx.core.os.bundleOf
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
@@ -24,26 +23,18 @@ import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
-import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.GridStyle
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.RetroUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(),
- IAlbumClickListener, ICabHolder {
+ IAlbumClickListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -53,12 +44,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
+ adapter?.actionMode?.finish()
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt
index 8661b9008..c962a0083 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt
@@ -8,7 +8,6 @@ import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
-import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.PopupMenu
import androidx.core.os.bundleOf
@@ -20,46 +19,36 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
-import code.name.monkey.retromusic.extensions.applyColor
-import code.name.monkey.retromusic.extensions.applyOutlineColor
-import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.album.HorizontalAlbumAdapter
import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter
import code.name.monkey.retromusic.databinding.FragmentArtistDetailsBinding
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
-import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.SingleColorTarget
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Artist
-import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.util.CustomArtistImageUtil
+import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.util.RetroColorUtil
-import code.name.monkey.retromusic.util.*
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
+import com.bumptech.glide.Glide
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialContainerTransform
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.ext.android.get
-import java.util.*
+import java.util.Locale
abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details),
- IAlbumClickListener, ICabHolder {
+ IAlbumClickListener {
private var _binding: FragmentArtistDetailsBinding? = null
private val binding get() = _binding!!
@@ -106,25 +95,19 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(artist.songs, true) }
}
- requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
- if (!handleBackPress()) {
- remove()
- requireActivity().onBackPressed()
- }
- }
setupSongSortButton()
binding.appBarLayout?.statusBarForeground =
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
}
private fun setupRecyclerView() {
- albumAdapter = HorizontalAlbumAdapter(requireActivity(), ArrayList(), this, this)
+ albumAdapter = HorizontalAlbumAdapter(requireActivity(), ArrayList(), this)
binding.fragmentArtistContent.albumRecyclerView.apply {
itemAnimator = DefaultItemAnimator()
layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false)
adapter = albumAdapter
}
- songAdapter = SimpleSongAdapter(requireActivity(), ArrayList(), R.layout.item_song, this)
+ songAdapter = SimpleSongAdapter(requireActivity(), ArrayList(), R.layout.item_song)
binding.fragmentArtistContent.recyclerView.apply {
itemAnimator = DefaultItemAnimator()
layoutManager = LinearLayoutManager(this.context)
@@ -162,7 +145,9 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
}
private fun loadArtistImage(artist: Artist) {
- GlideApp.with(requireContext()).asBitmapPalette().artistImageOptions(artist)
+ Glide.with(requireContext())
+ .asBitmapPalette()
+ .artistImageOptions(artist)
.load(RetroGlideExtension.getArtistModel(artist))
.dontAnimate()
.into(object : SingleColorTarget(binding.image) {
@@ -202,10 +187,12 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
MusicPlayerRemote.playNext(songs)
return true
}
+
R.id.action_add_to_current_playing -> {
MusicPlayerRemote.enqueue(songs)
return true
}
+
R.id.action_add_to_playlist -> {
lifecycleScope.launch(Dispatchers.IO) {
val playlists = get().fetchPlaylists()
@@ -216,13 +203,19 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
}
return true
}
+
R.id.action_set_artist_image -> {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "image/*"
- selectImageLauncher.launch(Intent.createChooser(intent,
- getString(R.string.pick_from_local_storage)))
+ selectImageLauncher.launch(
+ Intent.createChooser(
+ intent,
+ getString(R.string.pick_from_local_storage)
+ )
+ )
return true
}
+
R.id.action_reset_artist_image -> {
showToast(resources.getString(R.string.updating))
lifecycleScope.launch {
@@ -270,14 +263,19 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
when (savedSongSortOrder) {
SortOrder.ArtistSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked =
true
+
SortOrder.ArtistSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked =
true
+
SortOrder.ArtistSongSortOrder.SONG_ALBUM ->
sortOrder.findItem(R.id.action_sort_order_album).isChecked = true
+
SortOrder.ArtistSongSortOrder.SONG_YEAR ->
sortOrder.findItem(R.id.action_sort_order_year).isChecked = true
+
SortOrder.ArtistSongSortOrder.SONG_DURATION ->
sortOrder.findItem(R.id.action_sort_order_song_duration).isChecked = true
+
else -> {
throw IllegalArgumentException("invalid $savedSongSortOrder")
}
@@ -301,40 +299,6 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
inflater.inflate(R.menu.menu_artist_detail, menu)
}
-
- private fun handleBackPress(): Boolean {
- cab?.let {
- if (it.isActive()) {
- it.destroy()
- return true
- }
- }
- return false
- }
-
- private var cab: AttachedCab? = null
-
- override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
- cab?.let {
- if (it.isActive()) {
- it.destroy()
- }
- }
- cab = createCab(R.id.toolbar_container) {
- menu(menuRes)
- closeDrawable(R.drawable.ic_close)
- backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
- slideDown()
- onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
-
-
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt
index 29d5bf8a2..81d0f35f5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt
@@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.artists
import android.os.Bundle
import android.view.*
-import androidx.activity.addCallback
import androidx.core.os.bundleOf
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
@@ -25,7 +24,6 @@ import code.name.monkey.retromusic.EXTRA_ARTIST_ID
import code.name.monkey.retromusic.EXTRA_ARTIST_NAME
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
-import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.GridStyle
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
@@ -33,19 +31,12 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder.ArtistSortOrder
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.RetroUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment(),
- IArtistClickListener, IAlbumArtistClickListener, ICabHolder {
+ IArtistClickListener, IAlbumArtistClickListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
libraryViewModel.getArtists().observe(viewLifecycleOwner) {
@@ -54,12 +45,6 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
-
override fun onResume() {
super.onResume()
libraryViewModel.forceReload(ReloadType.Artists)
}
-
- override fun onPause() {
- super.onPause()
- if (cab.isActive()) {
- cab.destroy()
- }
- }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt
index f5dc5b069..bb4a57ecb 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt
@@ -22,7 +22,7 @@ import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.helper.BackupHelper
import code.name.monkey.retromusic.helper.sanitize
-import code.name.monkey.retromusic.util.BackupUtil
+import code.name.monkey.retromusic.util.Share
import com.afollestad.materialdialogs.input.input
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -128,12 +128,7 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
return true
}
R.id.action_share -> {
- activity?.startActivity(
- Intent.createChooser(
- BackupUtil.createShareFileIntent(file, requireContext()),
- null
- )
- )
+ Share.shareFile(requireContext(), file, "*/*")
return true
}
R.id.action_rename -> {
@@ -159,4 +154,9 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
}
return false
}
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt
index 6ef85b503..dbdba0a6a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt
@@ -71,7 +71,7 @@ class RestoreActivity : AppCompatActivity() {
DynamicColors.applyToActivityIfAvailable(
this,
DynamicColorsOptions.Builder()
- .setThemeOverlay(R.style.ThemeOverlay_Material3_DynamicColors_DayNight)
+ .setThemeOverlay(com.google.android.material.R.style.ThemeOverlay_Material3_DynamicColors_DayNight)
.build()
)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt
index 8571ffdcb..a97e96129 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt
@@ -22,11 +22,11 @@ import androidx.core.view.MenuProvider
import androidx.lifecycle.Lifecycle
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.fragments.LibraryViewModel
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
abstract class AbsMainActivityFragment(@LayoutRes layout: Int) : AbsMusicServiceFragment(layout),
MenuProvider {
- val libraryViewModel: LibraryViewModel by sharedViewModel()
+ val libraryViewModel: LibraryViewModel by activityViewModel()
val mainActivity: MainActivity
get() = activity as MainActivity
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt
index 536c46e1f..19dfc7b85 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt
@@ -17,6 +17,7 @@ package code.name.monkey.retromusic.fragments.base
import android.content.Context
import android.os.Bundle
import android.view.View
+import androidx.annotation.CallSuper
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.navigation.navOptions
@@ -60,11 +61,13 @@ open class AbsMusicServiceFragment(@LayoutRes layout: Int) : Fragment(layout),
serviceActivity = null
}
+ @CallSuper
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
serviceActivity?.addMusicServiceEventListener(this)
}
+ @CallSuper
override fun onDestroyView() {
super.onDestroyView()
serviceActivity?.removeMusicServiceEventListener(this)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt
index 4d3a63875..52a0b124c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt
@@ -35,11 +35,11 @@ import code.name.monkey.retromusic.fragments.MusicSeekSkipTouchListener
import code.name.monkey.retromusic.fragments.other.VolumeFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
-import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
/**
* Created by hemanths on 24/09/17.
@@ -58,10 +58,11 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi
var lastDisabledPlaybackControlsColor: Int = 0
- var isSeeking = false
- private set
+ private var isSeeking = false
- open val progressSlider: SeekBar? = null
+ open val progressSlider: Slider? = null
+
+ open val seekBar: SeekBar? = null
abstract val shuffleButton: ImageButton
@@ -78,45 +79,75 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi
private var progressAnimator: ObjectAnimator? = null
override fun onUpdateProgressViews(progress: Int, total: Int) {
- progressSlider?.max = total
+ if (seekBar == null) {
+ progressSlider?.valueTo = total.toFloat()
- if (isSeeking) {
- progressSlider?.progress = progress
+ progressSlider?.value =
+ progress.toFloat().coerceIn(progressSlider?.valueFrom, progressSlider?.valueTo)
} else {
- progressAnimator = ObjectAnimator.ofInt(progressSlider, "progress", progress).apply {
- duration = SLIDER_ANIMATION_TIME
- interpolator = LinearInterpolator()
- start()
- }
+ seekBar?.max = total
+ if (isSeeking) {
+ seekBar?.progress = progress
+ } else {
+ progressAnimator =
+ ObjectAnimator.ofInt(seekBar, "progress", progress).apply {
+ duration = SLIDER_ANIMATION_TIME
+ interpolator = LinearInterpolator()
+ start()
+ }
+
+ }
}
songTotalTime?.text = MusicUtil.getReadableDurationString(total.toLong())
songCurrentProgress?.text = MusicUtil.getReadableDurationString(progress.toLong())
}
private fun setUpProgressSlider() {
- progressSlider?.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() {
- override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
- if (fromUser) {
- onUpdateProgressViews(
- progress,
- MusicPlayerRemote.songDurationMillis
- )
- }
+ progressSlider?.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
+ onProgressChange(value.toInt(), fromUser)
+ })
+ progressSlider?.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
+ override fun onStartTrackingTouch(slider: Slider) {
+ onStartTrackingTouch()
}
- override fun onStartTrackingTouch(seekBar: SeekBar) {
- isSeeking = true
- progressViewUpdateHelper.stop()
- progressAnimator?.cancel()
- }
-
- override fun onStopTrackingTouch(seekBar: SeekBar) {
- isSeeking = false
- MusicPlayerRemote.seekTo(seekBar.progress)
- progressViewUpdateHelper.start()
+ override fun onStopTrackingTouch(slider: Slider) {
+ onStopTrackingTouch(slider.value.toInt())
}
})
+
+ seekBar?.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ onProgressChange(progress, fromUser)
+ }
+
+ override fun onStartTrackingTouch(seekBar: SeekBar?) {
+ onStartTrackingTouch()
+ }
+
+ override fun onStopTrackingTouch(seekBar: SeekBar?) {
+ onStopTrackingTouch(seekBar?.progress ?: 0)
+ }
+ })
+ }
+
+ private fun onProgressChange(value: Int, fromUser: Boolean) {
+ if (fromUser) {
+ onUpdateProgressViews(value, MusicPlayerRemote.songDurationMillis)
+ }
+ }
+
+ private fun onStartTrackingTouch() {
+ isSeeking = true
+ progressViewUpdateHelper.stop()
+ progressAnimator?.cancel()
+ }
+
+ private fun onStopTrackingTouch(value: Int) {
+ isSeeking = false
+ MusicPlayerRemote.seekTo(value)
+ progressViewUpdateHelper.start()
}
private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper
@@ -124,6 +155,11 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
+ if (PreferenceUtil.circlePlayButton) {
+ requireContext().theme.applyStyle(R.style.CircleFABOverlay, true)
+ } else {
+ requireContext().theme.applyStyle(R.style.RoundedFABOverlay, true)
+ }
}
fun View.showBounceAnimation() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt
index ec0340196..a267a09be 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt
@@ -70,13 +70,13 @@ import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.ext.android.get
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
import kotlin.math.abs
abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragment(layout),
Toolbar.OnMenuItemClickListener, IPaletteColorHolder, PlayerAlbumCoverFragment.Callbacks {
- val libraryViewModel: LibraryViewModel by sharedViewModel()
+ val libraryViewModel: LibraryViewModel by activityViewModel()
val mainActivity: MainActivity
get() = activity as MainActivity
@@ -92,6 +92,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
PlaybackSpeedDialog.newInstance().show(childFragmentManager, "PLAYBACK_SETTINGS")
return true
}
+
R.id.action_toggle_lyrics -> {
PreferenceUtil.showLyrics = !PreferenceUtil.showLyrics
showLyricsIcon(item)
@@ -102,26 +103,32 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
}
return true
}
+
R.id.action_go_to_lyrics -> {
goToLyrics(requireActivity())
return true
}
+
R.id.action_toggle_favorite -> {
toggleFavorite(song)
return true
}
+
R.id.action_share -> {
SongShareDialog.create(song).show(childFragmentManager, "SHARE_SONG")
return true
}
+
R.id.action_go_to_drive_mode -> {
NavigationUtil.gotoDriveMode(requireActivity())
return true
}
+
R.id.action_delete_from_device -> {
DeleteSongsDialog.create(song).show(childFragmentManager, "DELETE_SONGS")
return true
}
+
R.id.action_add_to_playlist -> {
lifecycleScope.launch(IO) {
val playlists = get().fetchPlaylists()
@@ -132,25 +139,30 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
}
return true
}
+
R.id.action_clear_playing_queue -> {
MusicPlayerRemote.clearQueue()
return true
}
+
R.id.action_save_playing_queue -> {
CreatePlaylistDialog.create(ArrayList(MusicPlayerRemote.playingQueue))
.show(childFragmentManager, "ADD_TO_PLAYLIST")
return true
}
+
R.id.action_tag_editor -> {
val intent = Intent(activity, SongTagEditorActivity::class.java)
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id)
startActivity(intent)
return true
}
+
R.id.action_details -> {
SongDetailDialog.create(song).show(childFragmentManager, "SONG_DETAIL")
return true
}
+
R.id.action_go_to_album -> {
//Hide Bottom Bar First, else Bottom Sheet doesn't collapse fully
mainActivity.setBottomNavVisibility(false)
@@ -161,29 +173,37 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
)
return true
}
+
R.id.action_go_to_artist -> {
goToArtist(requireActivity())
return true
}
+
R.id.now_playing -> {
requireActivity().findNavController(R.id.fragment_container).navigate(
R.id.playing_queue_fragment,
- null
+ null,
+ navOptions { launchSingleTop = true }
)
+ mainActivity.collapsePanel()
return true
}
+
R.id.action_show_lyrics -> {
goToLyrics(requireActivity())
return true
}
+
R.id.action_equalizer -> {
NavigationUtil.openEqualizer(requireActivity())
return true
}
+
R.id.action_sleep_timer -> {
SleepTimerDialog().show(parentFragmentManager, "SLEEP_TIMER")
return true
}
+
R.id.action_set_as_ringtone -> {
requireContext().run {
if (RingtoneManager.requiresDialog(this)) {
@@ -195,6 +215,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
return true
}
+
R.id.action_go_to_genre -> {
val retriever = MediaMetadataRetriever()
val trackUri =
@@ -294,6 +315,15 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
}
}
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (PreferenceUtil.circlePlayButton) {
+ requireContext().theme.applyStyle(R.style.CircleFABOverlay, true)
+ } else {
+ requireContext().theme.applyStyle(R.style.RoundedFABOverlay, true)
+ }
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (PreferenceUtil.isFullScreenMode &&
@@ -321,7 +351,15 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
showLyricsIcon(this)
}
}
- requireView().setOnTouchListener(
+ }
+
+ override fun onStart() {
+ super.onStart()
+ addSwipeDetector()
+ }
+
+ fun addSwipeDetector() {
+ view?.setOnTouchListener(
if (PreferenceUtil.swipeAnywhereToChangeSong) {
SwipeDetector(
requireContext(),
@@ -338,8 +376,8 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onScroll(
- e1: MotionEvent?,
- e2: MotionEvent?,
+ e1: MotionEvent,
+ e2: MotionEvent,
distanceX: Float,
distanceY: Float,
): Boolean {
@@ -349,6 +387,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
view.parent.requestDisallowInterceptTouchEvent(true)
true
}
+
else -> {
false
}
@@ -357,7 +396,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
})
@SuppressLint("ClickableViewAccessibility")
- override fun onTouch(v: View, event: MotionEvent?): Boolean {
+ override fun onTouch(v: View, event: MotionEvent): Boolean {
viewPager?.dispatchTouchEvent(event)
return flingPlayBackController.onTouchEvent(event)
}
@@ -386,9 +425,7 @@ fun goToArtist(activity: Activity) {
findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment,
- bundleOf(EXTRA_ARTIST_ID to song.artistId),
- null,
- null
+ bundleOf(EXTRA_ARTIST_ID to song.artistId)
)
}
}
@@ -407,9 +444,7 @@ fun goToAlbum(activity: Activity) {
findNavController(R.id.fragment_container).navigate(
R.id.albumDetailsFragment,
- bundleOf(EXTRA_ALBUM_ID to song.albumId),
- null,
- null
+ bundleOf(EXTRA_ALBUM_ID to song.albumId)
)
}
}
@@ -426,8 +461,7 @@ fun goToLyrics(activity: Activity) {
findNavController(R.id.fragment_container).navigate(
R.id.lyrics_fragment,
null,
- navOptions { launchSingleTop = true },
- null
+ navOptions { launchSingleTop = true }
)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt
index aa6d39d08..86fd7296f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt
@@ -19,6 +19,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.RetroUtil
+import code.name.monkey.retromusic.util.logD
import com.google.android.material.transition.MaterialFade
abstract class AbsRecyclerViewCustomGridSizeFragment, LM : RecyclerView.LayoutManager> :
@@ -73,7 +74,7 @@ abstract class AbsRecyclerViewCustomGridSizeFragment
fun setAndSaveSortOrder(sortOrder: String) {
this.sortOrder = sortOrder
- println(sortOrder)
+ logD(sortOrder)
saveSortOrder(sortOrder)
setSortOrder(sortOrder)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
index a3004be8b..80089a097 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
@@ -27,12 +27,12 @@ import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.databinding.FragmentMainRecyclerBinding
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.dip
-import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.IScrollHelper
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create
@@ -61,6 +61,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
mainActivity.supportActionBar?.title = null
initLayoutManager()
initAdapter()
+ checkForMargins()
setUpRecyclerView()
setupToolbar()
binding.shuffleButton.fitsSystemWindows = PreferenceUtil.isFullScreenMode
@@ -118,7 +119,6 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
adapter = this@AbsRecyclerViewFragment.adapter
create(this)
}
- checkForPadding()
}
protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller {
@@ -131,7 +131,6 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
override fun onChanged() {
super.onChanged()
checkIsEmpty()
- checkForPadding()
}
})
}
@@ -148,16 +147,12 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
binding.empty.isVisible = adapter!!.itemCount == 0
}
- private fun checkForPadding() {
- val itemCount: Int = adapter?.itemCount ?: 0
-
- binding.recyclerView.updatePadding(
- bottom = if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
- dip(R.dimen.mini_player_height_expanded)
- } else {
- dip(R.dimen.bottom_nav_height)
+ private fun checkForMargins() {
+ if (mainActivity.isBottomNavVisible) {
+ binding.recyclerView.updateLayoutParams {
+ bottomMargin = dip(R.dimen.bottom_nav_height)
}
- )
+ }
}
private fun initLayoutManager() {
@@ -169,16 +164,6 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
@NonNull
protected abstract fun createAdapter(): A
- override fun onQueueChanged() {
- super.onQueueChanged()
- checkForPadding()
- }
-
- override fun onServiceConnected() {
- super.onServiceConnected()
- checkForPadding()
- }
-
protected fun invalidateLayoutManager() {
initLayoutManager()
binding.recyclerView.layoutManager = layoutManager
@@ -216,7 +201,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
override fun onMenuItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_settings -> findNavController().navigate(
- R.id.settingsActivity,
+ R.id.settings_fragment,
null,
navOptions
)
@@ -232,8 +217,18 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
return false
}
+ override fun onResume() {
+ super.onResume()
+ checkForMargins()
+ }
+
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
+
+ override fun onPause() {
+ super.onPause()
+ (adapter as? AbsMultiSelectAdapter<*, *>)?.actionMode?.finish()
+ }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt
index 2f48fe1c1..f0f869cb7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt
@@ -21,11 +21,15 @@ import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
+import android.view.ViewGroup
import android.webkit.MimeTypeMap
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.PopupMenu
+import androidx.appcompat.widget.Toolbar
+import androidx.core.os.BundleCompat
import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible
+import androidx.core.view.updateLayoutParams
import androidx.lifecycle.lifecycleScope
import androidx.loader.app.LoaderManager
import androidx.loader.content.Loader
@@ -42,32 +46,29 @@ import code.name.monkey.retromusic.adapter.Storage
import code.name.monkey.retromusic.adapter.StorageAdapter
import code.name.monkey.retromusic.adapter.StorageClickListener
import code.name.monkey.retromusic.databinding.FragmentFolderBinding
-import code.name.monkey.retromusic.extensions.*
+import code.name.monkey.retromusic.extensions.dip
+import code.name.monkey.retromusic.extensions.showToast
+import code.name.monkey.retromusic.extensions.textColorPrimary
+import code.name.monkey.retromusic.extensions.textColorSecondary
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote.openQueue
-import code.name.monkey.retromusic.helper.MusicPlayerRemote.playingQueue
+import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.interfaces.ICallbacks
import code.name.monkey.retromusic.interfaces.IMainActivityFragmentCallbacks
+import code.name.monkey.retromusic.interfaces.IScrollHelper
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener
import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.providers.BlacklistStore
import code.name.monkey.retromusic.util.FileUtil
import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
-import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create
import code.name.monkey.retromusic.util.getExternalStorageDirectory
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
+import code.name.monkey.retromusic.views.BreadCrumbLayout
import code.name.monkey.retromusic.views.BreadCrumbLayout.Crumb
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
-import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialFadeThrough
import kotlinx.coroutines.Dispatchers
@@ -77,16 +78,19 @@ import java.io.File
import java.io.FileFilter
import java.io.IOException
import java.lang.ref.WeakReference
-import java.util.*
+import java.util.Collections
+import java.util.LinkedList
class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
- IMainActivityFragmentCallbacks, ICabHolder, SelectionCallback, ICallbacks,
- LoaderManager.LoaderCallbacks>, StorageClickListener {
+ IMainActivityFragmentCallbacks, SelectionCallback, ICallbacks,
+ LoaderManager.LoaderCallbacks>, StorageClickListener, IScrollHelper {
private var _binding: FragmentFolderBinding? = null
private val binding get() = _binding!!
+
+ val toolbar: Toolbar get() = binding.appBarLayout.toolbar
+
private var adapter: SongFileAdapter? = null
private var storageAdapter: StorageAdapter? = null
- private var cab: AttachedCab? = null
private val fileComparator = Comparator { lhs: File, rhs: File ->
if (lhs.isDirectory && !rhs.isDirectory) {
return@Comparator -1
@@ -99,14 +103,16 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
private var storageItems = ArrayList()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
_binding = FragmentFolderBinding.bind(view)
mainActivity.addMusicServiceEventListener(libraryViewModel)
- mainActivity.setSupportActionBar(binding.toolbar)
+ mainActivity.setSupportActionBar(toolbar)
mainActivity.supportActionBar?.title = null
enterTransition = MaterialFadeThrough()
reenterTransition = MaterialFadeThrough()
setUpBreadCrumbs()
+ checkForMargins()
setUpRecyclerView()
setUpAdapter()
setUpTitle()
@@ -116,24 +122,10 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
override fun handleOnBackPressed() {
if (!handleBackPress()) {
remove()
- requireActivity().onBackPressed()
+ requireActivity().onBackPressedDispatcher.onBackPressed()
}
}
})
- binding.toolbarContainer.drawNextToNavbar()
- binding.appBarLayout.statusBarForeground =
- MaterialShapeDrawable.createWithElevationOverlay(requireContext())
- }
-
- private fun setUpTitle() {
- binding.toolbar.setNavigationOnClickListener {
- findNavController().navigate(R.id.action_search, null, navOptions)
- }
- binding.appNameText.text = resources.getString(R.string.folders)
- }
-
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- super.onActivityCreated(savedInstanceState)
if (savedInstanceState == null) {
switchToFileAdapter()
setCrumb(
@@ -143,24 +135,38 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
true
)
} else {
- binding.breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS))
+ binding.breadCrumbs.restoreFromStateWrapper(
+ BundleCompat.getParcelable(
+ savedInstanceState,
+ CRUMBS,
+ BreadCrumbLayout.SavedStateWrapper::class.java
+ )
+ )
LoaderManager.getInstance(this).initLoader(LOADER_ID, null, this)
}
}
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ if (_binding != null) {
+ outState.putParcelable(CRUMBS, binding.breadCrumbs.stateWrapper)
+ }
+ }
+
+ private fun setUpTitle() {
+ toolbar.setNavigationOnClickListener {
+ findNavController().navigate(R.id.action_search, null, navOptions)
+ }
+ binding.appBarLayout.title = resources.getString(R.string.folders)
+ }
+
override fun onPause() {
super.onPause()
saveScrollPosition()
- if (cab.isActive()) {
- cab.destroy()
- }
+ adapter?.actionMode?.finish()
}
override fun handleBackPress(): Boolean {
- if (cab != null && cab!!.isActive()) {
- cab?.destroy()
- return true
- }
if (binding.breadCrumbs.popHistory()) {
setCrumb(binding.breadCrumbs.lastHistory(), false)
return true
@@ -186,7 +192,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
lifecycleScope.launch(Dispatchers.IO) {
listSongs(
requireContext(),
- toList(file),
+ listOf(file),
AUDIO_FILE_FILTER,
fileComparator
) { songs ->
@@ -199,10 +205,12 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
}
return@setOnMenuItemClickListener true
}
+
R.id.action_add_to_blacklist -> {
BlacklistStore.getInstance(requireContext()).addPath(file)
return@setOnMenuItemClickListener true
}
+
R.id.action_set_as_start_directory -> {
startDirectory = file
showToast(
@@ -210,6 +218,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
)
return@setOnMenuItemClickListener true
}
+
R.id.action_scan -> {
lifecycleScope.launch {
listPaths(file, AUDIO_FILE_FILTER) { paths -> scanPaths(paths) }
@@ -227,19 +236,21 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
lifecycleScope.launch(Dispatchers.IO) {
listSongs(
requireContext(),
- toList(file),
+ listOf(file),
AUDIO_FILE_FILTER,
fileComparator
) { songs ->
if (songs.isNotEmpty()) {
- SongsMenuHelper.handleMenuClick(
- requireActivity(), songs, itemId
+ val song = songs.first()
+ SongMenuHelper.handleMenuClick(
+ requireActivity(), song, itemId
)
}
}
}
return@setOnMenuItemClickListener true
}
+
R.id.action_scan -> {
lifecycleScope.launch {
listPaths(file, AUDIO_FILE_FILTER) { paths -> scanPaths(paths) }
@@ -265,7 +276,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
lifecycleScope.launch(Dispatchers.IO) {
listSongs(
requireContext(),
- toList(mFile.parentFile),
+ listOf(mFile.parentFile),
fileFilter,
fileComparator
) { songs ->
@@ -333,7 +344,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
}
override fun onPrepareMenu(menu: Menu) {
- ToolbarContentTintHelper.handleOnPrepareOptionsMenu(requireActivity(), binding.toolbar)
+ ToolbarContentTintHelper.handleOnPrepareOptionsMenu(requireActivity(), toolbar)
}
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
@@ -347,8 +358,8 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
menu.removeItem(R.id.action_layout_type)
menu.removeItem(R.id.action_sort_order)
ToolbarContentTintHelper.handleOnCreateOptionsMenu(
- requireContext(), binding.toolbar, menu, ATHToolbarActivity.getToolbarBackgroundColor(
- binding.toolbar
+ requireContext(), toolbar, menu, ATHToolbarActivity.getToolbarBackgroundColor(
+ toolbar
)
)
}
@@ -364,6 +375,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
)
return true
}
+
R.id.action_scan -> {
val crumb = activeCrumb
if (crumb != null) {
@@ -373,9 +385,10 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
}
return true
}
+
R.id.action_settings -> {
findNavController().navigate(
- R.id.settingsActivity,
+ R.id.settings_fragment,
null,
navOptions
)
@@ -385,41 +398,16 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
return false
}
- override fun onQueueChanged() {
- super.onQueueChanged()
- checkForPadding()
+ override fun onResume() {
+ super.onResume()
+ checkForMargins()
}
- override fun onServiceConnected() {
- super.onServiceConnected()
- checkForPadding()
- }
-
- override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
- if (cab != null && cab!!.isActive()) {
- cab?.destroy()
- }
- cab = createCab(R.id.toolbar_container) {
- menu(menuRes)
- closeDrawable(R.drawable.ic_close)
- backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
- slideDown()
- onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
+ private fun checkForMargins() {
+ if (mainActivity.isBottomNavVisible) {
+ binding.recyclerView.updateLayoutParams {
+ bottomMargin = dip(R.dimen.bottom_nav_height)
}
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
-
- private fun checkForPadding() {
- val count = adapter?.itemCount ?: 0
- if (_binding != null) {
- binding.recyclerView.updatePadding(
- bottom = if (count > 0 && playingQueue.isNotEmpty()) dip(R.dimen.mini_player_height_expanded)
- else dip(R.dimen.mini_player_height)
- )
}
}
@@ -440,13 +428,11 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
}
private fun saveScrollPosition() {
- val crumb = activeCrumb
- if (crumb != null) {
- crumb.scrollPosition =
- (binding.recyclerView.layoutManager as LinearLayoutManager?)!!.findFirstVisibleItemPosition()
- }
+ activeCrumb?.scrollPosition =
+ (binding.recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
}
+
private fun scanPaths(toBeScanned: Array) {
if (activity == null) {
return
@@ -496,24 +482,18 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
}
private fun setUpRecyclerView() {
- binding.recyclerView.layoutManager = LinearLayoutManager(activity)
+ binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
create(
binding.recyclerView
)
}
- private fun toList(file: File): ArrayList {
- val files = ArrayList(1)
- files.add(file)
- return files
- }
-
private fun updateAdapter(files: List) {
adapter?.swapDataSet(files)
val crumb = activeCrumb
if (crumb != null) {
- (binding.recyclerView.layoutManager as LinearLayoutManager?)
- ?.scrollToPositionWithOffset(crumb.scrollPosition, 0)
+ (binding.recyclerView.layoutManager as LinearLayoutManager)
+ .scrollToPositionWithOffset(crumb.scrollPosition, 0)
}
}
@@ -525,7 +505,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
private suspend fun listPaths(
file: File,
fileFilter: FileFilter,
- doOnPathListed: (paths: Array) -> Unit
+ doOnPathListed: (paths: Array) -> Unit,
) {
val paths = try {
val paths: Array
@@ -577,12 +557,12 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
}
}
- suspend fun listSongs(
+ private suspend fun listSongs(
context: Context,
- files: List,
+ files: List,
fileFilter: FileFilter,
fileComparator: Comparator,
- doOnSongsListed: (songs: List) -> Unit
+ doOnSongsListed: (songs: List) -> Unit,
) {
val songs = try {
val fileList = FileUtil.listFilesDeep(files, fileFilter)
@@ -607,14 +587,18 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
)
}
+ override fun scrollToTop() {
+ binding.recyclerView.scrollToPosition(0)
+ binding.appBarLayout.setExpanded(true, true)
+ }
+
private fun switchToFileAdapter() {
- adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this, this)
+ adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this)
adapter!!.registerAdapterDataObserver(
object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
checkIsEmpty()
- checkForPadding()
}
})
binding.recyclerView.adapter = adapter
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt
index 64b4aefa2..65d4e8594 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt
@@ -71,7 +71,7 @@ class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_
}
private fun setupRecyclerView() {
- songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list, null)
+ songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list)
binding.recyclerView.apply {
itemAnimator = DefaultItemAnimator()
layoutManager = LinearLayoutManager(requireContext())
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt
index 4f6a666ac..e581d7b26 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt
@@ -73,6 +73,7 @@ GenresFragment : AbsRecyclerViewFragment(),
}
+
override val titleRes: Int
get() = R.string.genres
@@ -97,9 +98,7 @@ GenresFragment : AbsRecyclerViewFragment(),
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
findNavController().navigate(
R.id.genreDetailsFragment,
- bundleOf(EXTRA_GENRE to genre),
- null,
- null
+ bundleOf(EXTRA_GENRE to genre)
)
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBinding.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBinding.kt
index 7ea737b7c..6970148a3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBinding.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeBinding.kt
@@ -9,7 +9,7 @@ class HomeBinding(
val container = homeBinding.container
val contentContainer = homeBinding.contentContainer
val appBarLayout = homeBinding.appBarLayout
- val toolbar = homeBinding.toolbar
+ val toolbar = homeBinding.appBarLayout.toolbar
val bannerImage = homeBinding.imageLayout.bannerImage
val userImage = homeBinding.imageLayout.userImage
val lastAdded = homeBinding.homeContent.absPlaylists.lastAdded
@@ -18,6 +18,5 @@ class HomeBinding(
val history = homeBinding.homeContent.absPlaylists.history
val recyclerView = homeBinding.homeContent.recyclerView
val titleWelcome = homeBinding.imageLayout.titleWelcome
- val appNameText = homeBinding.appNameText
val suggestions = homeBinding.homeContent.suggestions
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
index 177880bca..1950b4174 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
@@ -20,37 +20,40 @@ import android.view.MenuInflater
import android.view.MenuItem
import android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM
import android.view.View
+import android.view.ViewGroup
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.os.bundleOf
import androidx.core.view.doOnLayout
import androidx.core.view.doOnPreDraw
import androidx.core.view.isVisible
+import androidx.core.view.updateLayoutParams
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
-import code.name.monkey.retromusic.EXTRA_PLAYLIST_TYPE
-import code.name.monkey.retromusic.HISTORY_PLAYLIST
-import code.name.monkey.retromusic.LAST_ADDED_PLAYLIST
-import code.name.monkey.retromusic.TOP_PLAYED_PLAYLIST
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.adapter.HomeAdapter
import code.name.monkey.retromusic.databinding.FragmentHomeBinding
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
import code.name.monkey.retromusic.extensions.accentColor
+import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.extensions.drawNextToNavbar
import code.name.monkey.retromusic.extensions.elevatedAccentColor
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.profileBannerOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
+import code.name.monkey.retromusic.glide.RetroGlideExtension.userProfileOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.IScrollHelper
import code.name.monkey.retromusic.model.Song
+import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtil.userName
+import com.bumptech.glide.Glide
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialFadeThrough
import com.google.android.material.transition.MaterialSharedAxis
@@ -73,6 +76,8 @@ class HomeFragment :
enterTransition = MaterialFadeThrough().addTarget(binding.contentContainer)
reenterTransition = MaterialFadeThrough().addTarget(binding.contentContainer)
+ checkForMargins()
+
val homeAdapter = HomeAdapter(mainActivity)
binding.recyclerView.apply {
layoutManager = LinearLayoutManager(mainActivity)
@@ -90,9 +95,6 @@ class HomeFragment :
colorButtons()
postponeEnterTransition()
view.doOnPreDraw { startPostponedEnterTransition() }
- binding.appBarLayout.statusBarForeground =
- MaterialShapeDrawable.createWithElevationOverlay(requireContext())
- binding.toolbar.drawNextToNavbar()
view.doOnLayout {
adjustPlaylistButtons()
}
@@ -166,17 +168,17 @@ class HomeFragment :
binding.toolbar.setNavigationOnClickListener {
findNavController().navigate(R.id.action_search, null, navOptions)
}
- binding.appNameText.text = getString(R.string.app_name)
+ binding.appBarLayout.title = getString(R.string.app_name)
}
private fun loadProfile() {
binding.bannerImage?.let {
- GlideApp.with(requireContext())
+ Glide.with(requireContext())
.load(RetroGlideExtension.getBannerModel())
.profileBannerOptions(RetroGlideExtension.getBannerModel())
.into(it)
}
- GlideApp.with(requireActivity())
+ Glide.with(requireActivity())
.load(RetroGlideExtension.getUserModel())
.userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
.into(binding.userImage)
@@ -189,6 +191,14 @@ class HomeFragment :
binding.actionShuffle.elevatedAccentColor()
}
+ private fun checkForMargins() {
+ if (mainActivity.isBottomNavVisible) {
+ binding.recyclerView.updateLayoutParams {
+ bottomMargin = dip(R.dimen.bottom_nav_height)
+ }
+ }
+ }
+
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_main, menu)
menu.removeItem(R.id.action_grid_size)
@@ -209,17 +219,19 @@ class HomeFragment :
}
fun setSharedAxisXTransitions() {
- exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true).addTarget(CoordinatorLayout::class.java)
+ exitTransition =
+ MaterialSharedAxis(MaterialSharedAxis.X, true).addTarget(CoordinatorLayout::class.java)
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
}
private fun setSharedAxisYTransitions() {
- exitTransition = MaterialSharedAxis(MaterialSharedAxis.Y, true).addTarget(CoordinatorLayout::class.java)
+ exitTransition =
+ MaterialSharedAxis(MaterialSharedAxis.Y, true).addTarget(CoordinatorLayout::class.java)
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Y, false)
}
private fun loadSuggestions(songs: List) {
- if (songs.isEmpty()) {
+ if (!PreferenceUtil.homeSuggestions || songs.isEmpty()) {
binding.suggestions.root.isVisible = false
return
}
@@ -255,7 +267,7 @@ class HomeFragment :
MusicPlayerRemote.playNextSong()
}
}
- GlideApp.with(this)
+ Glide.with(this)
.load(RetroGlideExtension.getSongModel(songs[index]))
.songCoverOptions(songs[index])
.into(imageView)
@@ -275,14 +287,16 @@ class HomeFragment :
override fun onMenuItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_settings -> findNavController().navigate(
- R.id.settingsActivity,
+ R.id.settings_fragment,
null,
navOptions
)
+
R.id.action_import_playlist -> ImportPlaylistDialog().show(
childFragmentManager,
"ImportPlaylist"
)
+
R.id.action_add_to_playlist -> CreatePlaylistDialog.create(emptyList()).show(
childFragmentManager,
"ShowCreatePlaylistDialog"
@@ -298,7 +312,9 @@ class HomeFragment :
override fun onResume() {
super.onResume()
+ checkForMargins()
libraryViewModel.forceReload(ReloadType.HomeSections)
+ exitTransition = null
}
override fun onDestroyView() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
index 506c0dd43..2aa29e48d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
@@ -74,7 +74,7 @@ class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
navGraph.setStartDestination(categoryInfo.category.id)
}
navController.graph = navGraph
- NavigationUI.setupWithNavController(mainActivity.bottomNavigationView, navController)
+ NavigationUI.setupWithNavController(mainActivity.navigationView, navController)
navController.addOnDestinationChangedListener { _, _, _ ->
binding.appBarLayout.setExpanded(true, true)
}
@@ -97,7 +97,7 @@ class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
override fun onMenuItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_settings -> findNavController().navigate(
- R.id.settingsActivity,
+ R.id.settings_fragment,
null,
navOptions
)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/lyrics/LyricsFragment.kt
similarity index 55%
rename from app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt
rename to app/src/main/java/code/name/monkey/retromusic/fragments/lyrics/LyricsFragment.kt
index 0083464b2..a2980e382 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/lyrics/LyricsFragment.kt
@@ -12,11 +12,10 @@
* See the GNU General Public License for more details.
*
*/
-package code.name.monkey.retromusic.fragments.other
+package code.name.monkey.retromusic.fragments.lyrics
import android.annotation.SuppressLint
import android.app.Activity
-import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
@@ -26,23 +25,19 @@ import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.isVisible
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
import androidx.navigation.fragment.findNavController
import androidx.transition.Fade
-import androidx.viewpager2.adapter.FragmentStateAdapter
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.activities.tageditor.TagWriter
import code.name.monkey.retromusic.databinding.FragmentLyricsBinding
-import code.name.monkey.retromusic.databinding.FragmentNormalLyricsBinding
-import code.name.monkey.retromusic.databinding.FragmentSyncedLyricsBinding
-import code.name.monkey.retromusic.extensions.*
+import code.name.monkey.retromusic.extensions.accentColor
+import code.name.monkey.retromusic.extensions.materialDialog
+import code.name.monkey.retromusic.extensions.openUrl
+import code.name.monkey.retromusic.extensions.uri
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
-import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.lyrics.LrcView
@@ -52,7 +47,6 @@ import code.name.monkey.retromusic.util.FileUtils
import code.name.monkey.retromusic.util.LyricUtil
import code.name.monkey.retromusic.util.UriUtil
import com.afollestad.materialdialogs.input.input
-import com.google.android.material.tabs.TabLayoutMediator
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.jaudiotagger.audio.AudioFileIO
@@ -60,14 +54,23 @@ import org.jaudiotagger.tag.FieldKey
import java.io.File
import java.io.FileOutputStream
import java.util.*
+import kotlin.collections.set
-class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
+class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics),
+ MusicProgressViewUpdateHelper.Callback {
private var _binding: FragmentLyricsBinding? = null
private val binding get() = _binding!!
private lateinit var song: Song
- private lateinit var lyricsSectionsAdapter: LyricsSectionsAdapter
+ private lateinit var normalLyricsLauncher: ActivityResultLauncher
+ private lateinit var editSyncedLyricsLauncher: ActivityResultLauncher
+
+ private lateinit var cacheFile: File
+ private var syncedLyrics: String = ""
+ private lateinit var syncedFileUri: Uri
+
+ private var lyricsType: LyricsType = LyricsType.NORMAL_LYRICS
private val googleSearchLrcUrl: String
get() {
@@ -77,22 +80,8 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
baseUrl += query
return baseUrl
}
- private val syairSearchLrcUrl: String
- get() {
- var baseUrl = "https://www.syair.info/search?"
- var query = song.title + "+" + song.artistName
- query = "q=" + query.replace(" ", "+")
- baseUrl += query
- return baseUrl
- }
- private lateinit var normalLyricsLauncher: ActivityResultLauncher
- private lateinit var newSyncedLyricsLauncher: ActivityResultLauncher
- private lateinit var editSyncedLyricsLauncher: ActivityResultLauncher
-
- private lateinit var cacheFile: File
- private var syncedLyrics: String = ""
- private lateinit var syncedFileUri: Uri
+ private lateinit var updateHelper: MusicProgressViewUpdateHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -103,14 +92,6 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
FileUtils.copyFileToUri(requireContext(), cacheFile, song.uri)
}
}
- newSyncedLyricsLauncher =
- registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
- if (result.resultCode == Activity.RESULT_OK) {
- context?.contentResolver?.openOutputStream(result.data?.data!!)?.use {
- it.write(syncedLyrics.toByteArray())
- }
- }
- }
editSyncedLyricsLauncher =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
@@ -125,38 +106,44 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- updateTitleSong()
enterTransition = Fade()
exitTransition = Fade()
- lyricsSectionsAdapter = LyricsSectionsAdapter(requireActivity())
_binding = FragmentLyricsBinding.bind(view)
- binding.container.transitionName = "lyrics"
+ updateHelper = MusicProgressViewUpdateHelper(this, 500, 1000)
+ updateTitleSong()
+ setupLyricsView()
+ loadLyrics()
setupWakelock()
setupViews()
setupToolbar()
}
- private fun setupViews() {
- binding.lyricsPager.adapter = lyricsSectionsAdapter
- TabLayoutMediator(binding.tabLyrics, binding.lyricsPager) { tab, position ->
- tab.text = when (position) {
- 0 -> getString(R.string.synced_lyrics)
- 1 -> getString(R.string.normal_lyrics)
- else -> ""
- }
- }.attach()
-// lyricsPager.isUserInputEnabled = false
+ private fun setupLyricsView() {
+ binding.lyricsView.apply {
+ setCurrentColor(accentColor())
+ setTimeTextColor(accentColor())
+ setTimelineColor(accentColor())
+ setTimelineTextColor(accentColor())
+ setDraggable(true, LrcView.OnPlayClickListener {
+ MusicPlayerRemote.seekTo(it.toInt())
+ return@OnPlayClickListener true
+ })
+ }
+ }
- binding.tabLyrics.setSelectedTabIndicatorColor(accentColor())
- binding.tabLyrics.setTabTextColors(textColorSecondary(), accentColor())
+ override fun onUpdateProgressViews(progress: Int, total: Int) {
+ binding.lyricsView.updateTime(progress.toLong())
+ }
+
+ private fun setupViews() {
binding.editButton.accentColor()
binding.editButton.setOnClickListener {
- when (binding.lyricsPager.currentItem) {
- 0 -> {
+ when (lyricsType) {
+ LyricsType.SYNCED_LYRICS -> {
editSyncedLyrics()
}
- 1 -> {
+ LyricsType.NORMAL_LYRICS -> {
editNormalLyrics()
}
}
@@ -166,11 +153,13 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
override fun onPlayingMetaChanged() {
super.onPlayingMetaChanged()
updateTitleSong()
+ loadLyrics()
}
override fun onServiceConnected() {
super.onServiceConnected()
updateTitleSong()
+ loadLyrics()
}
private fun updateTitleSong() {
@@ -190,7 +179,7 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
}
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
- inflater.inflate(R.menu.menu_search, menu)
+ inflater.inflate(R.menu.menu_lyrics, menu)
ToolbarContentTintHelper.handleOnCreateOptionsMenu(
requireContext(),
binding.toolbar,
@@ -201,27 +190,23 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
override fun onMenuItemSelected(item: MenuItem): Boolean {
if (item.itemId == R.id.action_search) {
- openUrl(when (binding.lyricsPager.currentItem) {
- 0 -> syairSearchLrcUrl
- 1 -> googleSearchLrcUrl
- else -> googleSearchLrcUrl
- }
- )
+ openUrl(googleSearchLrcUrl)
}
return false
}
-
@SuppressLint("CheckResult")
- private fun editNormalLyrics() {
- var content = ""
- val file = File(MusicPlayerRemote.currentSong.data)
- try {
- content = AudioFileIO.read(file).tagOrCreateDefault.getFirst(FieldKey.LYRICS)
+ private fun editNormalLyrics(lyrics: String? = null) {
+ val file = File(song.data)
+ val content = lyrics ?: try {
+ AudioFileIO.read(file).tagOrCreateDefault.getFirst(FieldKey.LYRICS)
} catch (e: Exception) {
e.printStackTrace()
+ ""
}
+ val song = song
+
materialDialog().show {
title(res = R.string.edit_normal_lyrics)
input(
@@ -231,7 +216,6 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
) { _, input ->
val fieldKeyValueMap = EnumMap(FieldKey::class.java)
fieldKeyValueMap[FieldKey.LYRICS] = input.toString()
- syncedLyrics = input.toString()
GlobalScope.launch {
if (VersionUtils.hasR()) {
cacheFile = TagWriter.writeTagsToFilesR(
@@ -258,7 +242,7 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
}
}
positiveButton(res = R.string.save) {
- (lyricsSectionsAdapter.fragments[1].first as NormalLyrics).loadNormalLyrics()
+ loadNormalLyrics()
}
negativeButton(res = android.R.string.cancel)
}
@@ -266,9 +250,10 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
@SuppressLint("CheckResult")
- private fun editSyncedLyrics() {
- val content: String = LyricUtil.getStringFromLrc(LyricUtil.getSyncedLyricsFile(song))
+ private fun editSyncedLyrics(lyrics: String? = null) {
+ val content = lyrics ?: LyricUtil.getStringFromLrc(LyricUtil.getSyncedLyricsFile(song))
+ val song = song
materialDialog().show {
title(res = R.string.edit_synced_lyrics)
input(
@@ -291,145 +276,98 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) {
IntentSenderRequest.Builder(pendingIntent).build()
)
} else {
- val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
- intent.addCategory(Intent.CATEGORY_OPENABLE)
- intent.type = "*/*"
- intent.putExtra(
- Intent.EXTRA_TITLE,
- LyricUtil.getLrcOriginalPath(File(song.data).name)
- )
- newSyncedLyricsLauncher.launch(intent)
+ val fieldKeyValueMap = EnumMap(FieldKey::class.java)
+ fieldKeyValueMap[FieldKey.LYRICS] = input.toString()
+ GlobalScope.launch {
+ cacheFile = TagWriter.writeTagsToFilesR(
+ requireContext(),
+ AudioTagInfo(listOf(song.data), fieldKeyValueMap, null)
+ )[0]
+ val pendingIntent = MediaStore.createWriteRequest(
+ requireContext().contentResolver,
+ listOf(song.uri)
+ )
+
+ normalLyricsLauncher.launch(
+ IntentSenderRequest.Builder(pendingIntent).build()
+ )
+ }
}
} else {
LyricUtil.writeLrc(song, input.toString())
}
}
positiveButton(res = R.string.save) {
- (lyricsSectionsAdapter.fragments[0].first as SyncedLyrics).loadLRCLyrics()
+ loadLRCLyrics()
}
negativeButton(res = android.R.string.cancel)
}
}
- class LyricsSectionsAdapter(fragmentActivity: FragmentActivity) :
- FragmentStateAdapter(fragmentActivity) {
- val fragments = listOf(
- Pair(SyncedLyrics(), R.string.synced_lyrics),
- Pair(NormalLyrics(), R.string.normal_lyrics)
- )
-
-
- override fun getItemCount(): Int {
- return fragments.size
+ private fun loadNormalLyrics() {
+ val file = File(song.data)
+ val lyrics = try {
+ AudioFileIO.read(file).tagOrCreateDefault.getFirst(FieldKey.LYRICS)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
}
+ binding.normalLyrics.isVisible = !lyrics.isNullOrEmpty()
+ binding.noLyricsFound.isVisible = lyrics.isNullOrEmpty()
+ binding.normalLyrics.text = lyrics
+ }
- override fun createFragment(position: Int): Fragment {
- return fragments[position].first
+ /**
+ * @return success
+ */
+ private fun loadLRCLyrics(): Boolean {
+ val lrcFile = LyricUtil.getSyncedLyricsFile(song)
+ if (lrcFile != null) {
+ binding.lyricsView.loadLrc(lrcFile)
+ } else {
+ val embeddedLyrics = LyricUtil.getEmbeddedSyncedLyrics(song.data)
+ if (embeddedLyrics != null) {
+ binding.lyricsView.loadLrc(embeddedLyrics)
+ } else {
+ binding.lyricsView.setLabel(getString(R.string.empty))
+ return false
+ }
+ }
+ return true
+ }
+
+ private fun loadLyrics() {
+ lyricsType = if (!loadLRCLyrics()) {
+ binding.lyricsView.isVisible = false
+ loadNormalLyrics()
+ LyricsType.NORMAL_LYRICS
+ } else {
+ binding.normalLyrics.isVisible = false
+ binding.noLyricsFound.isVisible = false
+ binding.lyricsView.isVisible = true
+ LyricsType.SYNCED_LYRICS
}
}
- class NormalLyrics : AbsMusicServiceFragment(R.layout.fragment_normal_lyrics) {
-
- private var _binding: FragmentNormalLyricsBinding? = null
- private val binding get() = _binding!!
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- _binding = FragmentNormalLyricsBinding.bind(view)
- loadNormalLyrics()
- super.onViewCreated(view, savedInstanceState)
- }
-
- fun loadNormalLyrics() {
- var lyrics: String? = null
- val file = File(MusicPlayerRemote.currentSong.data)
- try {
- lyrics = AudioFileIO.read(file).tagOrCreateDefault.getFirst(FieldKey.LYRICS)
- } catch (e: Exception) {
- e.printStackTrace()
- }
- binding.noLyricsFound.isVisible = lyrics.isNullOrEmpty()
- binding.normalLyrics.text = lyrics
- }
-
- override fun onPlayingMetaChanged() {
- super.onPlayingMetaChanged()
- loadNormalLyrics()
- }
-
- override fun onServiceConnected() {
- super.onServiceConnected()
- loadNormalLyrics()
- }
-
- override fun onDestroyView() {
- super.onDestroyView()
- _binding = null
- }
+ override fun onResume() {
+ super.onResume()
+ updateHelper.start()
}
- class SyncedLyrics : AbsMusicServiceFragment(R.layout.fragment_synced_lyrics),
- MusicProgressViewUpdateHelper.Callback {
-
- private var _binding: FragmentSyncedLyricsBinding? = null
- private val binding get() = _binding!!
- private lateinit var updateHelper: MusicProgressViewUpdateHelper
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- updateHelper = MusicProgressViewUpdateHelper(this, 500, 1000)
- _binding = FragmentSyncedLyricsBinding.bind(view)
- setupLyricsView()
- loadLRCLyrics()
- super.onViewCreated(view, savedInstanceState)
- }
-
- fun loadLRCLyrics() {
- binding.lyricsView.setLabel(getString(R.string.empty))
- LyricUtil.getSyncedLyricsFile(MusicPlayerRemote.currentSong)?.let {
- binding.lyricsView.loadLrc(it)
- }
- }
-
- private fun setupLyricsView() {
- binding.lyricsView.apply {
- setCurrentColor(accentColor())
- setTimeTextColor(accentColor())
- setTimelineColor(accentColor())
- setTimelineTextColor(accentColor())
- setDraggable(true, LrcView.OnPlayClickListener {
- MusicPlayerRemote.seekTo(it.toInt())
- return@OnPlayClickListener true
- })
- }
- }
-
- override fun onUpdateProgressViews(progress: Int, total: Int) {
- binding.lyricsView.updateTime(progress.toLong())
- }
-
- override fun onPlayingMetaChanged() {
- super.onPlayingMetaChanged()
- loadLRCLyrics()
- }
-
- override fun onServiceConnected() {
- super.onServiceConnected()
- loadLRCLyrics()
- }
-
- override fun onResume() {
- super.onResume()
- updateHelper.start()
- }
-
- override fun onPause() {
- super.onPause()
- updateHelper.stop()
- }
+ override fun onPause() {
+ super.onPause()
+ updateHelper.stop()
}
override fun onDestroyView() {
super.onDestroyView()
if (MusicPlayerRemote.playingQueue.isNotEmpty())
- (requireActivity() as MainActivity).expandPanel()
+ mainActivity.expandPanel()
+ _binding = null
+ }
+
+ enum class LyricsType {
+ NORMAL_LYRICS,
+ SYNCED_LYRICS
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
index 6c2a4e4c1..53ce8f862 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
@@ -20,7 +20,6 @@ import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
-import androidx.activity.addCallback
import androidx.core.os.bundleOf
import androidx.core.view.doOnPreDraw
import androidx.core.view.isVisible
@@ -29,7 +28,6 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
@@ -38,28 +36,19 @@ import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
import code.name.monkey.retromusic.db.toSong
-import code.name.monkey.retromusic.extensions.dipToPix
-import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
-import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.RetroUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialSharedAxis
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
- IArtistClickListener, IAlbumClickListener, ICabHolder {
+ IArtistClickListener, IAlbumClickListener {
private val args by navArgs()
private var _binding: FragmentPlaylistDetailBinding? = null
private val binding get() = _binding!!
@@ -72,7 +61,8 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
RECENT_ARTISTS,
TOP_ALBUMS,
RECENT_ALBUMS,
- FAVOURITES -> {
+ FAVOURITES,
+ -> {
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
}
@@ -104,21 +94,8 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
TOP_PLAYED_PLAYLIST -> topPlayed()
}
- binding.recyclerView.adapter?.registerAdapterDataObserver(object : AdapterDataObserver() {
- override fun onChanged() {
- super.onChanged()
- val height = dipToPix(52f)
- binding.recyclerView.updatePadding(bottom = height.toInt())
- }
- })
binding.appBarLayout.statusBarForeground =
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
- requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
- if (!handleBackPress()) {
- remove()
- findNavController().navigateUp()
- }
- }
}
private fun lastAddedSongs() {
@@ -126,7 +103,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
val songAdapter = ShuffleButtonSongAdapter(
requireActivity(),
mutableListOf(),
- R.layout.item_list, this
+ R.layout.item_list
)
binding.recyclerView.apply {
adapter = songAdapter
@@ -143,7 +120,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
val songAdapter = ShuffleButtonSongAdapter(
requireActivity(),
mutableListOf(),
- R.layout.item_list, this
+ R.layout.item_list
)
binding.recyclerView.apply {
adapter = songAdapter
@@ -160,7 +137,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
val songAdapter = ShuffleButtonSongAdapter(
requireActivity(),
mutableListOf(),
- R.layout.item_list, this
+ R.layout.item_list
)
binding.recyclerView.apply {
adapter = songAdapter
@@ -179,7 +156,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
val songAdapter = SongAdapter(
requireActivity(),
mutableListOf(),
- R.layout.item_list, this
+ R.layout.item_list
)
binding.recyclerView.apply {
adapter = songAdapter
@@ -220,14 +197,14 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
requireActivity(),
artists,
R.layout.item_grid_circle,
- this, this@DetailListFragment
+ this
)
private fun albumAdapter(albums: List): AlbumAdapter = AlbumAdapter(
requireActivity(),
albums,
R.layout.item_grid,
- this, this@DetailListFragment
+ this
)
private fun linearLayoutManager(): LinearLayoutManager =
@@ -269,39 +246,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
_binding = null
}
- private var cab: AttachedCab? = null
-
- private fun handleBackPress(): Boolean {
- cab?.let {
- if (it.isActive()) {
- it.destroy()
- return true
- }
- }
- return false
- }
-
- override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
- cab?.let {
- println("Cab")
- if (it.isActive()) {
- it.destroy()
- }
- }
- cab = createCab(R.id.toolbar_container) {
- menu(menuRes)
- closeDrawable(R.drawable.ic_close)
- backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
- slideDown()
- onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
-
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_clear_history, menu)
if (showClearHistoryOption) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt
index d4eebd6d2..0ae18f6dd 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt
@@ -14,7 +14,6 @@
*/
package code.name.monkey.retromusic.fragments.other
-import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
@@ -23,7 +22,6 @@ import android.text.style.ForegroundColorSpan
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
-import android.view.animation.DecelerateInterpolator
import androidx.core.text.toSpannable
import androidx.core.view.isVisible
import code.name.monkey.retromusic.R
@@ -33,13 +31,14 @@ import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.extensions.textColorPrimary
import code.name.monkey.retromusic.extensions.textColorSecondary
import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
+import com.bumptech.glide.Glide
import kotlin.math.abs
open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_player),
@@ -66,7 +65,10 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p
_binding = FragmentMiniPlayerBinding.bind(view)
view.setOnTouchListener(FlingPlayBackController(requireContext()))
setUpMiniPlayer()
+ setUpButtons()
+ }
+ fun setUpButtons() {
if (RetroUtil.isTablet) {
binding.actionNext.show()
binding.actionPrevious.show()
@@ -112,7 +114,7 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p
private fun updateSongCover() {
val song = MusicPlayerRemote.currentSong
- GlideApp.with(requireContext())
+ Glide.with(requireContext())
.load(RetroGlideExtension.getSongModel(song))
.transition(RetroGlideExtension.getDefaultTransition())
.songCoverOptions(song)
@@ -136,10 +138,7 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p
override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.progressBar.max = total
- val animator = ObjectAnimator.ofInt(binding.progressBar, "progress", progress)
- animator.duration = 1000
- animator.interpolator = DecelerateInterpolator()
- animator.start()
+ binding.progressBar.progress = progress
}
override fun onResume() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/PlayingQueueRVFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/PlayingQueueRVFragment.kt
index cc169e940..ba2199833 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/PlayingQueueRVFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/PlayingQueueRVFragment.kt
@@ -55,7 +55,7 @@ class PlayingQueueRVFragment : AbsRecyclerViewFragment {
showToast(ImagePicker.getError(data))
}
+
else -> {
showToast("Task Cancelled")
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt
index 291ce2ebd..a8b10d297 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt
@@ -21,7 +21,6 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.SeekBar
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment
import code.name.monkey.appthemehelper.ThemeStore
@@ -32,8 +31,9 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.volume.AudioVolumeObserver
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
+import com.google.android.material.slider.Slider
-class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolumeChangedListener,
+class VolumeFragment : Fragment(), Slider.OnChangeListener, OnAudioVolumeChangedListener,
View.OnClickListener {
private var _binding: FragmentVolumeBinding? = null
@@ -47,7 +47,7 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View {
_binding = FragmentVolumeBinding.inflate(inflater, container, false)
return binding.root
@@ -68,15 +68,17 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
audioVolumeObserver?.register(AudioManager.STREAM_MUSIC, this)
val audioManager = audioManager
- binding.volumeSeekBar.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
- binding.volumeSeekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
- binding.volumeSeekBar.setOnSeekBarChangeListener(this)
+ binding.volumeSeekBar.valueTo =
+ audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
+ binding.volumeSeekBar.value =
+ audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat()
+ binding.volumeSeekBar.addOnChangeListener(this)
}
override fun onAudioVolumeChanged(currentVolume: Int, maxVolume: Int) {
if (_binding != null) {
- binding.volumeSeekBar.max = maxVolume
- binding.volumeSeekBar.progress = currentVolume
+ binding.volumeSeekBar.valueTo = maxVolume.toFloat()
+ binding.volumeSeekBar.value = currentVolume.toFloat()
binding.volumeDown.setImageResource(if (currentVolume == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
}
}
@@ -87,17 +89,11 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
_binding = null
}
- override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
+ override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
val audioManager = audioManager
- audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0)
- setPauseWhenZeroVolume(i < 1)
- binding.volumeDown.setImageResource(if (i == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
- }
-
- override fun onStartTrackingTouch(seekBar: SeekBar) {
- }
-
- override fun onStopTrackingTouch(seekBar: SeekBar) {
+ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0)
+ setPauseWhenZeroVolume(value < 1f)
+ binding.volumeDown.setImageResource(if (value == 0f) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
}
override fun onClick(view: View) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt
index d522877c1..ee32e72d3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt
@@ -11,6 +11,7 @@ import androidx.preference.PreferenceManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.SHOW_LYRICS
import code.name.monkey.retromusic.databinding.FragmentCoverLyricsBinding
+import code.name.monkey.retromusic.extensions.dipToPix
import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
@@ -21,6 +22,7 @@ import code.name.monkey.retromusic.model.lyrics.AbsSynchronizedLyrics
import code.name.monkey.retromusic.model.lyrics.Lyrics
import code.name.monkey.retromusic.util.LyricUtil
import code.name.monkey.retromusic.util.PreferenceUtil
+import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.jaudiotagger.audio.exceptions.CannotReadException
@@ -56,6 +58,17 @@ class CoverLyricsFragment : AbsMusicServiceFragment(R.layout.fragment_cover_lyri
}
}
+ fun setColors(color: MediaNotificationProcessor) {
+ binding.run {
+ playerLyrics.background = null
+ playerLyricsLine1.setTextColor(color.primaryTextColor)
+ playerLyricsLine1.setShadowLayer(dipToPix(10f), 0f, 0f, color.backgroundColor)
+ playerLyricsLine2.setTextColor(color.primaryTextColor)
+ playerLyricsLine2.setShadowLayer(dipToPix(10f), 0f, 0f, color.backgroundColor)
+ }
+
+ }
+
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == SHOW_LYRICS) {
if (sharedPreferences?.getBoolean(key, false) == true) {
@@ -102,8 +115,6 @@ class CoverLyricsFragment : AbsMusicServiceFragment(R.layout.fragment_cover_lyri
null
}
}
-
-
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt
index e99ad40cc..ca8bc97be 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt
@@ -45,8 +45,8 @@ import code.name.monkey.retromusic.lyrics.CoverLrcView
import code.name.monkey.retromusic.model.lyrics.Lyrics
import code.name.monkey.retromusic.transform.CarousalPagerTransformer
import code.name.monkey.retromusic.transform.ParallaxPagerTransformer
+import code.name.monkey.retromusic.util.CoverLyricsType
import code.name.monkey.retromusic.util.LyricUtil
-import code.name.monkey.retromusic.util.LyricsType
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.coroutines.Dispatchers
@@ -85,21 +85,19 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
}
private fun updateLyrics() {
- binding.lyricsView.setLabel(context?.getString(R.string.no_lyrics_found))
val song = MusicPlayerRemote.currentSong
lifecycleScope.launch(Dispatchers.IO) {
val lrcFile = LyricUtil.getSyncedLyricsFile(song)
if (lrcFile != null) {
- withContext(Dispatchers.Main) {
- binding.lyricsView.loadLrc(lrcFile)
- }
+ binding.lyricsView.loadLrc(lrcFile)
} else {
val embeddedLyrics = LyricUtil.getEmbeddedSyncedLyrics(song.data)
- withContext(Dispatchers.Main) {
- if (embeddedLyrics != null) {
- binding.lyricsView.loadLrc(embeddedLyrics)
- } else {
+ if (embeddedLyrics != null) {
+ binding.lyricsView.loadLrc(embeddedLyrics)
+ } else {
+ withContext(Dispatchers.Main) {
binding.lyricsView.reset()
+ binding.lyricsView.setLabel(context?.getString(R.string.no_lyrics_found))
}
}
}
@@ -115,6 +113,22 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentPlayerAlbumCoverBinding.bind(view)
+ setupViewPager()
+ progressViewUpdateHelper = MusicProgressViewUpdateHelper(this, 500, 1000)
+ maybeInitLyrics()
+ lrcView.apply {
+ setDraggable(true) { time ->
+ MusicPlayerRemote.seekTo(time.toInt())
+ MusicPlayerRemote.resumePlaying()
+ true
+ }
+ setOnClickListener {
+ goToLyrics(requireActivity())
+ }
+ }
+ }
+
+ private fun setupViewPager() {
binding.viewPager.addOnPageChangeListener(this)
val nps = PreferenceUtil.nowPlayingScreen
@@ -140,18 +154,6 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
PreferenceUtil.albumCoverTransform
)
}
- progressViewUpdateHelper = MusicProgressViewUpdateHelper(this, 500, 1000)
- maybeInitLyrics()
- lrcView.apply {
- setDraggable(true) { time ->
- MusicPlayerRemote.seekTo(time.toInt())
- MusicPlayerRemote.resumePlaying()
- true
- }
- setOnClickListener {
- goToLyrics(requireActivity())
- }
- }
}
override fun onResume() {
@@ -176,7 +178,9 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
}
override fun onPlayingMetaChanged() {
- binding.viewPager.currentItem = MusicPlayerRemote.position
+ if (viewPager.currentItem != MusicPlayerRemote.position) {
+ viewPager.setCurrentItem(MusicPlayerRemote.position, true)
+ }
updateLyrics()
}
@@ -185,15 +189,18 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
- if (key == SHOW_LYRICS) {
- if (sharedPreferences.getBoolean(key, false)) {
- maybeInitLyrics()
- } else {
- showLyrics(false)
- progressViewUpdateHelper?.stop()
+ when (key) {
+ SHOW_LYRICS -> {
+ if (PreferenceUtil.showLyrics) {
+ maybeInitLyrics()
+ } else {
+ showLyrics(false)
+ progressViewUpdateHelper?.stop()
+ }
+ }
+ LYRICS_TYPE -> {
+ maybeInitLyrics()
}
- } else if (key == LYRICS_TYPE) {
- maybeInitLyrics()
}
}
@@ -211,7 +218,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
binding.coverLyrics.isVisible = false
binding.lyricsView.isVisible = false
binding.viewPager.isVisible = true
- val lyrics: View = if (PreferenceUtil.lyricsType == LyricsType.REPLACE_COVER) {
+ val lyrics: View = if (PreferenceUtil.lyricsType == CoverLyricsType.REPLACE_COVER) {
ObjectAnimator.ofFloat(viewPager, View.ALPHA, if (visible) 0F else 1F).start()
lrcView
} else {
@@ -231,7 +238,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
// Don't show lyrics container for below conditions
if (lyricViewNpsList.contains(nps) && PreferenceUtil.showLyrics) {
showLyrics(true)
- if (PreferenceUtil.lyricsType == LyricsType.REPLACE_COVER) {
+ if (PreferenceUtil.lyricsType == CoverLyricsType.REPLACE_COVER) {
progressViewUpdateHelper?.start()
}
} else {
@@ -242,15 +249,13 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe
private fun updatePlayingQueue() {
binding.viewPager.apply {
- adapter = AlbumCoverPagerAdapter(childFragmentManager, MusicPlayerRemote.playingQueue)
- adapter?.notifyDataSetChanged()
- currentItem = MusicPlayerRemote.position
+ adapter = AlbumCoverPagerAdapter(parentFragmentManager, MusicPlayerRemote.playingQueue)
+ setCurrentItem(MusicPlayerRemote.position, true)
onPageSelected(MusicPlayerRemote.position)
}
}
- override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
- }
+ override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {
currentPosition = position
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptiveFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptiveFragment.kt
index c97085fe6..4071e7dbf 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptiveFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptiveFragment.kt
@@ -18,9 +18,9 @@ import android.os.Bundle
import android.view.View
import androidx.appcompat.widget.Toolbar
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
-import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentAdaptivePlayerBinding
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
@@ -60,7 +60,7 @@ class AdaptiveFragment : AbsPlayerFragment(R.layout.fragment_adaptive_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
ToolbarContentTintHelper.colorizeToolbar(this, surfaceColor(), requireActivity())
setTitleTextColor(textColorPrimary())
setSubtitleTextColor(textColorSecondary())
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt
index dcb0e964a..d954cfdb0 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt
@@ -17,9 +17,7 @@ package code.name.monkey.retromusic.fragments.player.adaptive
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
@@ -31,6 +29,7 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
class AdaptivePlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_adaptive_player_playback_controls) {
@@ -38,7 +37,7 @@ class AdaptivePlaybackControlsFragment :
private var _binding: FragmentAdaptivePlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -124,7 +123,7 @@ class AdaptivePlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext())
+ accentColor()
}.ripAlpha()
TintHelper.setTintAuto(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt
index 3ade61087..4a92f1ca4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt
@@ -19,7 +19,6 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.util.ColorUtil
@@ -37,13 +36,14 @@ import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
class BlurPlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_blur_player_playback_controls) {
private var _binding: FragmentBlurPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -118,7 +118,7 @@ class BlurPlaybackControlsFragment :
override fun setColor(color: MediaNotificationProcessor) {
lastPlaybackControlsColor = Color.WHITE
lastDisabledPlaybackControlsColor =
- ContextCompat.getColor(requireContext(), R.color.md_grey_500)
+ ContextCompat.getColor(requireContext(), code.name.monkey.appthemehelper.R.color.md_grey_500)
binding.title.setTextColor(lastPlaybackControlsColor)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt
index b580b1d1a..48798ff45 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt
@@ -29,20 +29,23 @@ import code.name.monkey.retromusic.databinding.FragmentBlurBinding
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
+import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.glide.BlurTransformation
import code.name.monkey.retromusic.glide.RetroGlideExtension
-import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
-import code.name.monkey.retromusic.glide.*
+import code.name.monkey.retromusic.glide.RetroGlideExtension.simpleSongCoverOptions
+import code.name.monkey.retromusic.glide.crossfadeListener
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
+import com.bumptech.glide.RequestBuilder
class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
SharedPreferences.OnSharedPreferenceChangeListener {
- private var lastRequest: GlideRequest? = null
+ private var lastRequest: RequestBuilder? = null
override fun playerToolbar(): Toolbar {
return binding.playerToolbar
@@ -74,7 +77,7 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
ToolbarContentTintHelper.colorizeToolbar(this, Color.WHITE, activity)
}.setOnMenuItemClickListener(this)
}
@@ -116,14 +119,14 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
private fun updateBlur() {
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
- GlideApp.with(this)
+ Glide.with(this)
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
.transform(
BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat())
.build()
).thumbnail(lastRequest)
- .error(GlideApp.with(this).load(ColorDrawable(Color.DKGRAY)).fitCenter())
+ .error(Glide.with(this).load(ColorDrawable(Color.DKGRAY)).fitCenter())
.also {
lastRequest = it.clone()
it.crossfadeListener()
@@ -141,9 +144,13 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
updateBlur()
}
+ override fun onPause() {
+ super.onPause()
+ lastRequest = null
+ }
+
override fun onResume() {
super.onResume()
- lastRequest = null
PreferenceManager.getDefaultSharedPreferences(requireContext())
.registerOnSharedPreferenceChangeListener(this)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardFragment.kt
index c75448b27..d2ce1d9cb 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardFragment.kt
@@ -97,7 +97,7 @@ class CardFragment : AbsPlayerFragment(R.layout.fragment_card_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@CardFragment)
ToolbarContentTintHelper.colorizeToolbar(this, Color.WHITE, activity)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt
index 830a7c6f3..306412da4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt
@@ -20,17 +20,13 @@ import android.view.View
import android.widget.ImageButton
import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentCardPlayerPlaybackControlsBinding
-import code.name.monkey.retromusic.extensions.getSongInfo
-import code.name.monkey.retromusic.extensions.hide
-import code.name.monkey.retromusic.extensions.ripAlpha
-import code.name.monkey.retromusic.extensions.show
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist
@@ -45,7 +41,7 @@ class CardPlaybackControlsFragment :
private var _binding: FragmentCardPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val seekBar: SeekBar
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -138,7 +134,7 @@ class CardPlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext()).ripAlpha()
+ accentColor().ripAlpha()
}
binding.image.setColorFilter(colorFinal, PorterDuff.Mode.SRC_IN)
TintHelper.setTintAuto(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt
index 6aa85b36d..9a4726610 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt
@@ -28,15 +28,18 @@ import code.name.monkey.retromusic.databinding.FragmentCardBlurPlayerBinding
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
-import code.name.monkey.retromusic.glide.BlurTransformation
-import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
-import code.name.monkey.retromusic.glide.*
+import code.name.monkey.retromusic.glide.BlurTransformation
+import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.simpleSongCoverOptions
+import code.name.monkey.retromusic.glide.crossfadeListener
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
+import com.bumptech.glide.RequestBuilder
class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
SharedPreferences.OnSharedPreferenceChangeListener {
@@ -51,7 +54,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
private var _binding: FragmentCardBlurPlayerBinding? = null
private val binding get() = _binding!!
- private var lastRequest: GlideRequest? = null
+ private var lastRequest: RequestBuilder? = null
override fun onShow() {
playbackControlsFragment.show()
@@ -76,8 +79,8 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
libraryViewModel.updateColor(color.backgroundColor)
ToolbarContentTintHelper.colorizeToolbar(binding.playerToolbar, Color.WHITE, activity)
- binding.playerToolbar.setTitleTextColor(Color.WHITE)
- binding.playerToolbar.setSubtitleTextColor(Color.WHITE)
+ binding.title.setTextColor(Color.WHITE)
+ binding.text.setTextColor(Color.WHITE)
}
override fun toggleFavorite(song: Song) {
@@ -96,7 +99,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
_binding = FragmentCardBlurPlayerBinding.bind(view)
setUpSubFragments()
setUpPlayerToolbar()
- binding.cardContainer?.drawAboveSystemBars()
+ binding.playerToolbar.drawAboveSystemBars()
}
private fun setUpSubFragments() {
@@ -110,7 +113,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setTitleTextColor(Color.WHITE)
setSubtitleTextColor(Color.WHITE)
ToolbarContentTintHelper.colorizeToolbar(binding.playerToolbar, Color.WHITE, activity)
@@ -132,15 +135,15 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
private fun updateSong() {
val song = MusicPlayerRemote.currentSong
- binding.playerToolbar.apply {
- title = song.title
- subtitle = song.artistName
+ binding.run {
+ title.text = song.title
+ text.text = song.artistName
}
}
private fun updateBlur() {
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
- GlideApp.with(this)
+ Glide.with(this)
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
.transform(
@@ -154,6 +157,11 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
}
}
+ override fun onPause() {
+ super.onPause()
+ lastRequest = null
+ }
+
override fun onResume() {
super.onResume()
lastRequest = null
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt
index 614bdc443..8ada49c95 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt
@@ -19,7 +19,6 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.TintHelper
@@ -34,6 +33,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
class CardBlurPlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_card_blur_player_playback_controls) {
@@ -41,7 +41,7 @@ class CardBlurPlaybackControlsFragment :
private var _binding: FragmentCardBlurPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt
index e9489f20f..eacc6e43d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt
@@ -25,10 +25,8 @@ import android.os.Bundle
import android.view.View
import android.view.animation.Animation
import android.view.animation.LinearInterpolator
-import android.widget.SeekBar
import androidx.appcompat.widget.Toolbar
import androidx.core.content.getSystemService
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
@@ -37,25 +35,24 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentCirclePlayerBinding
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.MusicSeekSkipTouchListener
-import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist
-import code.name.monkey.retromusic.glide.GlideApp
-import code.name.monkey.retromusic.glide.GlideRequest
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.simpleSongCoverOptions
import code.name.monkey.retromusic.glide.crossfadeListener
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
-import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import code.name.monkey.retromusic.volume.AudioVolumeObserver
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
+import com.bumptech.glide.Glide
+import com.bumptech.glide.RequestBuilder
+import com.google.android.material.slider.Slider
import me.tankery.lib.circularseekbar.CircularSeekBar
/**
@@ -76,7 +73,9 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private val binding get() = _binding!!
private var rotateAnimator: ObjectAnimator? = null
- private var lastRequest: GlideRequest? = null
+ private var lastRequest: RequestBuilder? = null
+
+ var isSeeking = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -101,7 +100,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@CirclePlayerFragment)
ToolbarContentTintHelper.colorizeToolbar(
this,
@@ -113,11 +112,6 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setupViews() {
setUpProgressSlider()
- ViewUtil.setProgressDrawable(
- binding.progressSlider,
- ThemeStore.accentColor(requireContext()),
- false
- )
binding.volumeSeekBar.circleProgressColor = accentColor()
binding.volumeSeekBar.circleColor = ColorUtil.withAlpha(accentColor(), 0.25f)
setUpPlayPauseFab()
@@ -135,11 +129,16 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setUpPrevNext() {
updatePrevNextColor()
binding.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true))
- binding.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), false))
+ binding.previousButton.setOnTouchListener(
+ MusicSeekSkipTouchListener(
+ requireActivity(),
+ false
+ )
+ )
}
private fun updatePrevNextColor() {
- val accentColor = ThemeStore.accentColor(requireContext())
+ val accentColor = accentColor()
binding.nextButton.setColorFilter(accentColor, PorterDuff.Mode.SRC_IN)
binding.previousButton.setColorFilter(accentColor, PorterDuff.Mode.SRC_IN)
}
@@ -147,7 +146,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setUpPlayPauseFab() {
TintHelper.setTintAuto(
binding.playPauseButton,
- ThemeStore.accentColor(requireContext()),
+ accentColor(),
false
)
binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler())
@@ -166,7 +165,6 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
override fun onResume() {
super.onResume()
- lastRequest = null
progressViewUpdateHelper.start()
if (audioVolumeObserver == null) {
audioVolumeObserver = AudioVolumeObserver(requireActivity())
@@ -183,6 +181,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
override fun onPause() {
super.onPause()
+ lastRequest = null
progressViewUpdateHelper.stop()
}
@@ -242,11 +241,11 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
} else {
binding.songInfo.hide()
}
- GlideApp.with(this)
+ Glide.with(this)
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
.thumbnail(lastRequest)
- .error(GlideApp.with(this).load(R.drawable.default_audio_art).fitCenter())
+ .error(Glide.with(this).load(R.drawable.default_audio_art).fitCenter())
.fitCenter().also {
lastRequest = it.clone()
it.crossfadeListener()
@@ -275,7 +274,11 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
}
- override fun onProgressChanged(seekBar: CircularSeekBar?, progress: Float, fromUser: Boolean) {
+ override fun onProgressChanged(
+ circularSeekBar: CircularSeekBar?,
+ progress: Float,
+ fromUser: Boolean,
+ ) {
val audioManager = audioManager
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress.toInt(), 0)
}
@@ -286,28 +289,39 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
override fun onStopTrackingTouch(seekBar: CircularSeekBar?) {
}
- fun setUpProgressSlider() {
+ private fun setUpProgressSlider() {
binding.progressSlider.applyColor(accentColor())
- binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() {
- override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
- if (fromUser) {
- MusicPlayerRemote.seekTo(progress)
- onUpdateProgressViews(
- MusicPlayerRemote.songProgressMillis,
- MusicPlayerRemote.songDurationMillis
- )
- }
+ val progressSlider = binding.progressSlider
+ progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
+ if (fromUser) {
+ onUpdateProgressViews(
+ value.toInt(),
+ MusicPlayerRemote.songDurationMillis
+ )
+ }
+ })
+ progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
+ override fun onStartTrackingTouch(slider: Slider) {
+ isSeeking = true
+ progressViewUpdateHelper.stop()
+ }
+
+ override fun onStopTrackingTouch(slider: Slider) {
+ isSeeking = false
+ MusicPlayerRemote.seekTo(slider.value.toInt())
+ progressViewUpdateHelper.start()
}
})
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
- binding.progressSlider.max = total
+ val progressSlider = binding.progressSlider
+ progressSlider.valueTo = total.toFloat()
- val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress)
- animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
- animator.interpolator = LinearInterpolator()
- animator.start()
+ progressSlider.valueTo = total.toFloat()
+
+ progressSlider.value =
+ progress.toFloat().coerceIn(progressSlider.valueFrom, progressSlider.valueTo)
binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong())
binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong())
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt
index 99d7aad61..eb0709792 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt
@@ -85,7 +85,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() {
override fun onSlide(bottomSheet: View, slideOffset: Float) {
- mainActivity.getBottomSheetBehavior().isDraggable = false
+ mainActivity.getBottomSheetBehavior().isDraggable = false
binding.playerQueueSheet.setContentPadding(
binding.playerQueueSheet.contentPaddingLeft,
(slideOffset * binding.statusBar.height).toInt(),
@@ -102,10 +102,12 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
BottomSheetBehavior.STATE_DRAGGING -> {
mainActivity.getBottomSheetBehavior().isDraggable = false
}
+
BottomSheetBehavior.STATE_COLLAPSED -> {
resetToCurrentPosition()
mainActivity.getBottomSheetBehavior().isDraggable = true
}
+
else -> {
mainActivity.getBottomSheetBehavior().isDraggable = true
}
@@ -377,7 +379,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
private fun setUpPlayerToolbar() {
binding.playerToolbar.inflateMenu(R.menu.menu_player)
- binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
+ binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
binding.playerToolbar.setOnMenuItemClickListener(this)
ToolbarContentTintHelper.colorizeToolbar(
@@ -491,6 +493,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
lastPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
)
+
else -> binding.playerControlsContainer.shuffleButton.setColorFilter(
lastDisabledPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
@@ -511,6 +514,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
PorterDuff.Mode.SRC_IN
)
}
+
MusicService.REPEAT_MODE_ALL -> {
binding.playerControlsContainer.repeatButton.setImageResource(R.drawable.ic_repeat)
binding.playerControlsContainer.repeatButton.setColorFilter(
@@ -518,6 +522,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
PorterDuff.Mode.SRC_IN
)
}
+
MusicService.REPEAT_MODE_THIS -> {
binding.playerControlsContainer.repeatButton.setImageResource(R.drawable.ic_repeat_one)
binding.playerControlsContainer.repeatButton.setColorFilter(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt
index bd5a29e46..7031f60bd 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt
@@ -124,7 +124,7 @@ class ColorFragment : AbsPlayerFragment(R.layout.fragment_color_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@ColorFragment)
ToolbarContentTintHelper.colorizeToolbar(
this,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt
index 60c7d0a85..084d2aaf3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt
@@ -22,7 +22,6 @@ import android.view.ViewAnimationUtils
import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.TintHelper
@@ -38,6 +37,7 @@ import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
import kotlin.math.sqrt
class ColorPlaybackControlsFragment :
@@ -46,7 +46,7 @@ class ColorPlaybackControlsFragment :
private var _binding: FragmentColorPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt
index 468ce3c1b..72d219bee 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt
@@ -100,7 +100,7 @@ class FitFragment : AbsPlayerFragment(R.layout.fragment_fit) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@FitFragment)
ToolbarContentTintHelper.colorizeToolbar(
this,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt
index 89deb182b..8cf981725 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt
@@ -20,7 +20,6 @@ import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
@@ -40,7 +39,7 @@ class FitPlaybackControlsFragment :
private var _binding: FragmentFitPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val seekBar: SeekBar
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -128,7 +127,7 @@ class FitPlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext()).ripAlpha()
+ accentColor().ripAlpha()
}
volumeFragment?.setTintable(colorFinal)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt
index c82881163..02bdcb7aa 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt
@@ -20,7 +20,6 @@ import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
@@ -43,7 +42,7 @@ class FlatPlaybackControlsFragment :
private var _binding: FragmentFlatPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val seekBar: SeekBar
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -110,7 +109,7 @@ class FlatPlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext()).ripAlpha()
+ accentColor().ripAlpha()
}
updateTextColors(colorFinal)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt
index bd84e4eca..12e5343b9 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt
@@ -61,7 +61,7 @@ class FlatPlayerFragment : AbsPlayerFragment(R.layout.fragment_flat_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.inflateMenu(R.menu.menu_player)
- binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
+ binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
binding.playerToolbar.setOnMenuItemClickListener(this)
ToolbarContentTintHelper.colorizeToolbar(
binding.playerToolbar,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt
index 08831b0c6..f42b204b7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt
@@ -23,7 +23,6 @@ import android.view.MenuItem
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import androidx.appcompat.widget.PopupMenu
import androidx.lifecycle.lifecycleScope
@@ -33,7 +32,11 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentFullPlayerControlsBinding
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.toSongEntity
-import code.name.monkey.retromusic.extensions.*
+import code.name.monkey.retromusic.extensions.applyColor
+import code.name.monkey.retromusic.extensions.getSongInfo
+import code.name.monkey.retromusic.extensions.getTintedDrawable
+import code.name.monkey.retromusic.extensions.hide
+import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
@@ -45,10 +48,11 @@ import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import org.koin.androidx.viewmodel.ext.android.sharedViewModel
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
/**
* Created by hemanths on 20/09/17.
@@ -58,11 +62,11 @@ class FullPlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_full_player_controls),
PopupMenu.OnMenuItemClickListener {
- private val libraryViewModel: LibraryViewModel by sharedViewModel()
+ private val libraryViewModel: LibraryViewModel by activityViewModel()
private var _binding: FragmentFullPlayerControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -177,10 +181,9 @@ class FullPlaybackControlsFragment :
private fun setUpPlayPauseFab() {
binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler())
- binding.playPauseButton.post {
- binding.playPauseButton.pivotX = (binding.playPauseButton.width / 2).toFloat()
- binding.playPauseButton.pivotY = (binding.playPauseButton.height / 2).toFloat()
- }
+
+ binding.playPauseButton.pivotX = (binding.playPauseButton.width / 2).toFloat()
+ binding.playPauseButton.pivotY = (binding.playPauseButton.height / 2).toFloat()
}
private fun setUpMusicControllers() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt
index 6e0cfa836..0470188f5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt
@@ -28,12 +28,14 @@ import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.base.goToArtist
+import code.name.monkey.retromusic.fragments.player.CoverLyricsFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
-import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
+import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.bumptech.glide.Glide
class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
private var _binding: FragmentFullBinding? = null
@@ -50,7 +52,7 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
}
}
@@ -98,6 +100,7 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
controlsFragment.setColor(color)
libraryViewModel.updateColor(color.backgroundColor)
ToolbarContentTintHelper.colorizeToolbar(binding.playerToolbar, Color.WHITE, activity)
+ binding.coverLyrics.getFragment().setColors(color)
}
override fun onFavoriteToggled() {
@@ -133,7 +136,7 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
libraryViewModel.artist(MusicPlayerRemote.currentSong.artistId)
.observe(viewLifecycleOwner) { artist ->
if (artist.id != -1L) {
- GlideApp.with(requireActivity())
+ Glide.with(requireActivity())
.load(RetroGlideExtension.getArtistModel(artist))
.artistImageOptions(artist)
.into(binding.artistImage)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt
index 1355021c8..9b601324f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt
@@ -14,7 +14,6 @@
*/
package code.name.monkey.retromusic.fragments.player.gradient
-import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.graphics.Color
@@ -22,8 +21,6 @@ import android.graphics.PorterDuff
import android.graphics.drawable.AnimatedVectorDrawable
import android.os.Bundle
import android.view.View
-import android.view.animation.LinearInterpolator
-import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.Toolbar
@@ -43,21 +40,21 @@ import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter
import code.name.monkey.retromusic.databinding.FragmentGradientPlayerBinding
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.MusicSeekSkipTouchListener
-import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.fragments.other.VolumeFragment
+import code.name.monkey.retromusic.fragments.player.CoverLyricsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
-import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.*
+import com.google.android.material.slider.Slider
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager
@@ -100,7 +97,8 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
override fun onStateChanged(bottomSheet: View, newState: Int) {
when (newState) {
STATE_EXPANDED,
- STATE_DRAGGING -> {
+ STATE_DRAGGING,
+ -> {
mainActivity.getBottomSheetBehavior().isDraggable = false
}
STATE_COLLAPSED -> {
@@ -162,7 +160,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
ViewCompat.setOnApplyWindowInsetsListener(
(binding.container)
) { v: View, insets: WindowInsetsCompat ->
- navBarHeight = insets.safeGetBottomInsets()
+ navBarHeight = insets.getBottomInsets()
v.updatePadding(bottom = navBarHeight)
insets
}
@@ -270,6 +268,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
updateRepeatState()
updateShuffleState()
updatePrevNextColor()
+ binding.coverLyrics.getFragment().setColors(color)
}
override fun onFavoriteToggled() {
@@ -313,7 +312,6 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
super.onServiceConnected()
updateSong()
updatePlayPauseDrawableState()
- updatePlayPauseDrawableState()
updateQueue()
updateIsFavoriteIcon()
}
@@ -387,8 +385,15 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
@SuppressLint("ClickableViewAccessibility")
private fun setUpPrevNext() {
updatePrevNextColor()
- binding.playbackControlsFragment.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true))
- binding.playbackControlsFragment.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), false))
+ binding.playbackControlsFragment.nextButton.setOnTouchListener(
+ MusicSeekSkipTouchListener(
+ requireActivity(),
+ true
+ )
+ )
+ binding.playbackControlsFragment.previousButton.setOnTouchListener(
+ MusicSeekSkipTouchListener(requireActivity(), false)
+ )
}
private fun updatePrevNextColor() {
@@ -470,7 +475,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
oldLeft: Int,
oldTop: Int,
oldRight: Int,
- oldBottom: Int
+ oldBottom: Int,
) {
val panel = getQueuePanel()
if (panel.state == STATE_COLLAPSED) {
@@ -543,30 +548,34 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
}
private fun setUpProgressSlider() {
- binding.playbackControlsFragment.progressSlider.setOnSeekBarChangeListener(object :
- SimpleOnSeekbarChangeListener() {
- override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
- if (fromUser) {
- MusicPlayerRemote.seekTo(progress)
- onUpdateProgressViews(
- MusicPlayerRemote.songProgressMillis,
- MusicPlayerRemote.songDurationMillis
- )
- }
+ val progressSlider = binding.playbackControlsFragment.progressSlider
+ progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
+ if (fromUser) {
+ onUpdateProgressViews(
+ value.toInt(),
+ MusicPlayerRemote.songDurationMillis
+ )
+ }
+ })
+ progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
+ override fun onStartTrackingTouch(slider: Slider) {
+ progressViewUpdateHelper.stop()
+ }
+
+ override fun onStopTrackingTouch(slider: Slider) {
+ MusicPlayerRemote.seekTo(slider.value.toInt())
+ progressViewUpdateHelper.start()
}
})
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
- binding.playbackControlsFragment.progressSlider.max = total
- val animator = ObjectAnimator.ofInt(
- binding.playbackControlsFragment.progressSlider,
- "progress",
- progress
- )
- animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
- animator.interpolator = LinearInterpolator()
- animator.start()
+ val progressSlider = binding.playbackControlsFragment.progressSlider
+ progressSlider.valueTo = total.toFloat()
+
+ progressSlider.value =
+ progress.toFloat().coerceIn(progressSlider.valueFrom, progressSlider.valueTo)
+
binding.playbackControlsFragment.songTotalTime.text =
MusicUtil.getReadableDurationString(total.toLong())
binding.playbackControlsFragment.songCurrentProgress.text =
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/home/HomePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/home/HomePlayerFragment.kt
index d9ae39ffa..f40a4433b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/home/HomePlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/home/HomePlayerFragment.kt
@@ -122,7 +122,7 @@ class HomePlayerFragment : AbsPlayerFragment(R.layout.fragment_home_player),
private fun setUpPlayerToolbar() {
binding.playerToolbar.inflateMenu(R.menu.menu_player)
- binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
+ binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
binding.playerToolbar.setOnMenuItemClickListener(this)
ToolbarContentTintHelper.colorizeToolbar(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt
index d970908b5..564cdfdc0 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt
@@ -18,7 +18,6 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
@@ -34,6 +33,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
/**
* @author Hemanth S (h4h13).
@@ -44,7 +44,7 @@ class LockScreenControlsFragment :
private var _binding: FragmentLockScreenPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -103,18 +103,19 @@ class LockScreenControlsFragment :
}
override fun setColor(color: MediaNotificationProcessor) {
+ val context = context ?: return
- val colorBg = ATHUtil.resolveColor(requireContext(), android.R.attr.colorBackground)
+ val colorBg = ATHUtil.resolveColor(context, android.R.attr.colorBackground)
if (ColorUtil.isColorLight(colorBg)) {
lastPlaybackControlsColor =
- MaterialValueHelper.getSecondaryTextColor(requireContext(), true)
+ MaterialValueHelper.getSecondaryTextColor(context, true)
lastDisabledPlaybackControlsColor =
- MaterialValueHelper.getSecondaryDisabledTextColor(requireContext(), true)
+ MaterialValueHelper.getSecondaryDisabledTextColor(context, true)
} else {
lastPlaybackControlsColor =
- MaterialValueHelper.getPrimaryTextColor(requireContext(), false)
+ MaterialValueHelper.getPrimaryTextColor(context, false)
lastDisabledPlaybackControlsColor =
- MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
+ MaterialValueHelper.getPrimaryDisabledTextColor(context, false)
}
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
@@ -135,7 +136,7 @@ class LockScreenControlsFragment :
TintHelper.setTintAuto(
binding.playPauseButton,
- MaterialValueHelper.getPrimaryTextColor(requireContext(), isDark),
+ MaterialValueHelper.getPrimaryTextColor(context, isDark),
false
)
TintHelper.setTintAuto(binding.playPauseButton, colorFinal, true)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt
index ff180e4e6..e5984476a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt
@@ -18,7 +18,6 @@ import android.graphics.PorterDuff
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.util.ATHUtil
@@ -33,6 +32,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
/**
* @author Hemanth S (h4h13).
@@ -44,7 +44,7 @@ class MaterialControlsFragment :
private var _binding: FragmentMaterialPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
index 1af54215d..cb00c8de0 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
@@ -144,7 +144,7 @@ class MaterialFragment : AbsPlayerFragment(R.layout.fragment_material) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@MaterialFragment)
ToolbarContentTintHelper.colorizeToolbar(
this,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt
index d7790c1b6..796bce973 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt
@@ -14,12 +14,9 @@
*/
package code.name.monkey.retromusic.fragments.player.md3
-import android.animation.ObjectAnimator
import android.os.Bundle
import android.view.View
-import android.view.animation.LinearInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
@@ -32,20 +29,18 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
-import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
class MD3PlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_md3_player_playback_controls) {
- private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper
private var _binding: FragmentMd3PlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -66,11 +61,6 @@ class MD3PlaybackControlsFragment :
override val songCurrentProgress: TextView
get() = binding.songCurrentProgress
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
- }
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentMd3PlayerPlaybackControlsBinding.bind(view)
@@ -139,16 +129,6 @@ class MD3PlaybackControlsFragment :
}
}
- override fun onResume() {
- super.onResume()
- progressViewUpdateHelper.start()
- }
-
- override fun onPause() {
- super.onPause()
- progressViewUpdateHelper.stop()
- }
-
override fun onServiceConnected() {
updatePlayPauseDrawableState()
updateRepeatState()
@@ -157,7 +137,6 @@ class MD3PlaybackControlsFragment :
}
override fun onPlayingMetaChanged() {
- super.onPlayingMetaChanged()
updateSong()
}
@@ -196,18 +175,6 @@ class MD3PlaybackControlsFragment :
public override fun hide() {}
- override fun onUpdateProgressViews(progress: Int, total: Int) {
- binding.progressSlider.max = total
-
- val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress)
- animator.duration = SLIDER_ANIMATION_TIME
- animator.interpolator = LinearInterpolator()
- animator.start()
-
- binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong())
- binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong())
- }
-
override fun onDestroyView() {
super.onDestroyView()
_binding = null
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlayerFragment.kt
index e0640349b..850316dc8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlayerFragment.kt
@@ -53,7 +53,7 @@ class MD3PlayerFragment : AbsPlayerFragment(R.layout.fragment_md3_player) {
}
override fun toolbarIconColor(): Int {
- return ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal)
+ return ATHUtil.resolveColor(requireContext(), androidx.appcompat.R.attr.colorControlNormal)
}
override fun onColorChanged(color: MediaNotificationProcessor) {
@@ -63,7 +63,7 @@ class MD3PlayerFragment : AbsPlayerFragment(R.layout.fragment_md3_player) {
ToolbarContentTintHelper.colorizeToolbar(
binding.playerToolbar,
- ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal),
+ ATHUtil.resolveColor(requireContext(), androidx.appcompat.R.attr.colorControlNormal),
requireActivity()
)
}
@@ -103,12 +103,12 @@ class MD3PlayerFragment : AbsPlayerFragment(R.layout.fragment_md3_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.inflateMenu(R.menu.menu_player)
//binding.playerToolbar.menu.setUpWithIcons()
- binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
+ binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
binding.playerToolbar.setOnMenuItemClickListener(this)
ToolbarContentTintHelper.colorizeToolbar(
binding.playerToolbar,
- ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal),
+ ATHUtil.resolveColor(requireContext(), androidx.appcompat.R.attr.colorControlNormal),
requireActivity()
)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt
index f3214a760..381ded676 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt
@@ -26,8 +26,8 @@ import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.SNOWFALL
-import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.databinding.FragmentPlayerBinding
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
@@ -147,7 +147,7 @@ class PlayerFragment : AbsPlayerFragment(R.layout.fragment_player),
private fun setUpPlayerToolbar() {
binding.playerToolbar.inflateMenu(R.menu.menu_player)
//binding.playerToolbar.menu.setUpWithIcons()
- binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
+ binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
binding.playerToolbar.setOnMenuItemClickListener(this)
ToolbarContentTintHelper.colorizeToolbar(
@@ -164,6 +164,7 @@ class PlayerFragment : AbsPlayerFragment(R.layout.fragment_player),
}
private fun startOrStopSnow(isSnowFalling: Boolean) {
+ if (_binding == null) return
if (isSnowFalling && !surfaceColor().isColorLight) {
binding.snowfallView.isVisible = true
binding.snowfallView.restartFalling()
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt
index 73c7acdc6..cf644dedf 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt
@@ -18,9 +18,7 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
@@ -34,6 +32,7 @@ import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
class PlayerPlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_player_playback_controls) {
@@ -41,7 +40,7 @@ class PlayerPlaybackControlsFragment :
private var _binding: FragmentPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -94,7 +93,7 @@ class PlayerPlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext())
+ accentColor()
}.ripAlpha()
TintHelper.setTintAuto(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt
index dd02d92ac..36150ad80 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt
@@ -19,20 +19,20 @@ import android.graphics.PorterDuff
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentPeekControlPlayerBinding
+import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.applyColor
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
/**
* Created by hemanths on 2019-10-04.
@@ -43,7 +43,7 @@ class PeekPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_pe
private var _binding: FragmentPeekControlPlayerBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -82,7 +82,7 @@ class PeekPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_pe
if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext())
+ accentColor()
}
binding.progressSlider.applyColor(controlsColor)
volumeFragment?.setTintableColor(controlsColor)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerFragment.kt
index 618e508be..e27ff6961 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerFragment.kt
@@ -18,9 +18,9 @@ import android.os.Bundle
import android.view.View
import androidx.appcompat.widget.Toolbar
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
-import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentPeekPlayerBinding
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist
@@ -68,7 +68,7 @@ class PeekPlayerFragment : AbsPlayerFragment(R.layout.fragment_peek_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@PeekPlayerFragment)
ToolbarContentTintHelper.colorizeToolbar(
this,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt
index d76958040..c5c7869ed 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt
@@ -18,23 +18,19 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import android.widget.SeekBar
import android.widget.TextView
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentPlainControlsFragmentBinding
-import code.name.monkey.retromusic.extensions.applyColor
-import code.name.monkey.retromusic.extensions.getSongInfo
-import code.name.monkey.retromusic.extensions.hide
-import code.name.monkey.retromusic.extensions.show
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.slider.Slider
/**
* @author Hemanth S (h4h13).
@@ -46,7 +42,7 @@ class PlainPlaybackControlsFragment :
private var _binding: FragmentPlainControlsFragmentBinding? = null
private val binding get() = _binding!!
- override val progressSlider: SeekBar
+ override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@@ -134,7 +130,7 @@ class PlainPlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext())
+ accentColor()
}
volumeFragment?.setTintable(colorFinal)
binding.progressSlider.applyColor(colorFinal)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlayerFragment.kt
index fbbb7cd26..4fc01cb6d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlayerFragment.kt
@@ -63,7 +63,7 @@ class PlainPlayerFragment : AbsPlayerFragment(R.layout.fragment_plain_player) {
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@PlainPlayerFragment)
ToolbarContentTintHelper.colorizeToolbar(
this,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt
index bcc6e4c9d..1d487ddb8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt
@@ -18,13 +18,13 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentSimpleControlsFragmentBinding
+import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.getSongInfo
import code.name.monkey.retromusic.extensions.hide
import code.name.monkey.retromusic.extensions.show
@@ -154,7 +154,7 @@ class SimplePlaybackControlsFragment :
val colorFinal = if (PreferenceUtil.isAdaptiveColor) {
color.primaryTextColor
} else {
- ThemeStore.accentColor(requireContext())
+ accentColor()
}
volumeFragment?.setTintable(colorFinal)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlayerFragment.kt
index 722ab28ba..63aac7083 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlayerFragment.kt
@@ -101,7 +101,7 @@ class SimplePlayerFragment : AbsPlayerFragment(R.layout.fragment_simple_player)
private fun setUpPlayerToolbar() {
binding.playerToolbar.inflateMenu(R.menu.menu_player)
- binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
+ binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
binding.playerToolbar.setOnMenuItemClickListener(this)
ToolbarContentTintHelper.colorizeToolbar(
binding.playerToolbar,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt
index cb3b2e04e..25b603e5b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt
@@ -160,7 +160,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
private fun setUpPlayerToolbar() {
binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player)
- setNavigationOnClickListener { requireActivity().onBackPressed() }
+ setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
setOnMenuItemClickListener(this@TinyPlayerFragment)
}
}
@@ -214,8 +214,8 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
gestureDetector = GestureDetector(context, object :
GestureDetector.SimpleOnGestureListener() {
- override fun onLongPress(e: MotionEvent?) {
- if (abs(e!!.y - initialY) <= 2) {
+ override fun onLongPress(e: MotionEvent) {
+ if (abs(e.y - initialY) <= 2) {
vibrate()
isDragEnabled = true
binding.progressBar.parent.requestDisallowInterceptTouchEvent(true)
@@ -252,6 +252,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
initialY = event.y.toInt()
progressViewUpdateHelper.stop()
}
+
MotionEvent.ACTION_UP,
MotionEvent.ACTION_CANCEL -> {
progressViewUpdateHelper.start()
@@ -261,6 +262,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
return true
}
}
+
MotionEvent.ACTION_MOVE -> {
if (isDragEnabled) {
val diffY = (initialY - event.y).toInt()
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt
index aa7f71bc1..a4e2152d3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt
@@ -14,22 +14,21 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
-import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
+import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailNewBinding
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.toSongs
-import code.name.monkey.retromusic.extensions.dip
+import code.name.monkey.retromusic.extensions.accentColor
+import code.name.monkey.retromusic.extensions.elevatedAccentColor
import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
+import code.name.monkey.retromusic.glide.RetroGlideExtension.playlistOptions
+import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
-import code.name.monkey.retromusic.util.RetroColorUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
+import code.name.monkey.retromusic.util.MusicUtil
+import code.name.monkey.retromusic.util.ThemedFastScroller
+import com.bumptech.glide.Glide
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform
@@ -41,14 +40,13 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
-class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
- ICabHolder {
+class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail_new) {
private val arguments by navArgs()
private val viewModel by viewModel {
- parametersOf(arguments.extraPlaylist)
+ parametersOf(arguments.extraPlaylistId)
}
- private var _binding: FragmentPlaylistDetailBinding? = null
+ private var _binding: FragmentPlaylistDetailNewBinding? = null
private val binding get() = _binding!!
private lateinit var playlist: PlaylistWithSongs
@@ -66,14 +64,26 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- _binding = FragmentPlaylistDetailBinding.bind(view)
+ _binding = FragmentPlaylistDetailNewBinding.bind(view)
enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).addTarget(view)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
mainActivity.setSupportActionBar(binding.toolbar)
- binding.container.transitionName = "playlist"
- playlist = arguments.extraPlaylist
- binding.toolbar.title = playlist.playlistEntity.playlistName
+ binding.toolbar.title = null
+// binding.container.transitionName = playlist.playlistEntity.playlistName
+
setUpRecyclerView()
+ setupButtons()
+ viewModel.getPlaylist().observe(viewLifecycleOwner) { playlistWithSongs ->
+ playlist = playlistWithSongs
+ Glide.with(this)
+ .load(PlaylistPreview(playlistWithSongs))
+ .playlistOptions()
+ .into(binding.image)
+ binding.title.text = playlist.playlistEntity.playlistName
+ binding.subtitle.text =
+ MusicUtil.getPlaylistInfoString(requireContext(), playlist.songs.toSongs())
+ binding.collapsingAppBarLayout.title = playlist.playlistEntity.playlistName
+ }
viewModel.getSongs().observe(viewLifecycleOwner) {
songs(it.toSongs())
}
@@ -88,13 +98,27 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
}
+ private fun setupButtons() {
+ binding.playButton.apply {
+ setOnClickListener {
+ MusicPlayerRemote.openQueue(playlistSongAdapter.dataSet, 0, true)
+ }
+ accentColor()
+ }
+ binding.shuffleButton.apply {
+ setOnClickListener {
+ MusicPlayerRemote.openAndShuffleQueue(playlistSongAdapter.dataSet, true)
+ }
+ elevatedAccentColor()
+ }
+ }
+
private fun setUpRecyclerView() {
playlistSongAdapter = OrderablePlaylistSongAdapter(
- playlist.playlistEntity,
+ arguments.extraPlaylistId,
requireActivity(),
ArrayList(),
- R.layout.item_queue,
- this
+ R.layout.item_queue
)
val dragDropManager = RecyclerViewDragDropManager()
@@ -111,6 +135,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
binding.recyclerView.apply {
layoutManager = LinearLayoutManager(requireContext())
binding.recyclerView.adapter = wrappedAdapter
+ ThemedFastScroller.create(this)
}
playlistSongAdapter.registerAdapterDataObserver(object :
RecyclerView.AdapterDataObserver() {
@@ -129,17 +154,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
return PlaylistMenuHelper.handleMenuClick(requireActivity(), playlist, item)
}
- private fun checkForPadding() {
- val itemCount: Int = playlistSongAdapter.itemCount
- if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
- binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height))
- } else {
- binding.recyclerView.updatePadding(bottom = 0)
- }
- }
-
private fun checkIsEmpty() {
- checkForPadding()
binding.empty.isVisible = playlistSongAdapter.itemCount == 0
binding.emptyText.isVisible = playlistSongAdapter.itemCount == 0
}
@@ -172,27 +187,4 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
super.onDestroyView()
_binding = null
}
-
- private var cab: AttachedCab? = null
-
- override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
- cab?.let {
- println("Cab")
- if (it.isActive()) {
- it.destroy()
- }
- }
- cab = createCab(R.id.toolbar_container) {
- menu(menuRes)
- closeDrawable(R.drawable.ic_close)
- backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
- slideDown()
- onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt
index 0d15a279d..23599d384 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt
@@ -18,15 +18,18 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.SongEntity
+import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.repository.RealRepository
class PlaylistDetailsViewModel(
private val realRepository: RealRepository,
- private var playlist: PlaylistWithSongs
+ private var playlistId: Long
) : ViewModel() {
fun getSongs(): LiveData> =
- realRepository.playlistSongs(playlist.playlistEntity.playListId)
+ realRepository.playlistSongs(playlistId)
fun playlistExists(): LiveData =
- realRepository.checkPlaylistExists(playlist.playlistEntity.playListId)
+ realRepository.checkPlaylistExists(playlistId)
+
+ fun getPlaylist(): LiveData = realRepository.getPlaylist(playlistId)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
index b77a725e6..258fb0ed2 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
@@ -20,7 +20,7 @@ import androidx.core.os.bundleOf
import androidx.core.view.MenuCompat
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager
-import code.name.monkey.retromusic.EXTRA_PLAYLIST
+import code.name.monkey.retromusic.EXTRA_PLAYLIST_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter
import code.name.monkey.retromusic.db.PlaylistWithSongs
@@ -65,7 +65,6 @@ class PlaylistsFragment :
requireActivity(),
dataSet,
itemLayoutRes(),
- null,
this
)
}
@@ -76,12 +75,12 @@ class PlaylistsFragment :
if (RetroUtil.isLandscape) {
gridSizeItem.setTitle(R.string.action_grid_size_land)
}
- setupGridSizeMenu(gridSizeItem.subMenu)
+ setupGridSizeMenu(gridSizeItem.subMenu!!)
menu.removeItem(R.id.action_layout_type)
menu.add(0, R.id.action_add_to_playlist, 0, R.string.new_playlist_title)
menu.add(0, R.id.action_import_playlist, 0, R.string.import_playlist)
menu.findItem(R.id.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
- setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu)
+ setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu!!)
MenuCompat.setGroupDividerEnabled(menu, true)
}
@@ -106,7 +105,7 @@ class PlaylistsFragment :
7 -> gridSizeMenu.findItem(R.id.action_grid_size_7).isChecked = true
8 -> gridSizeMenu.findItem(R.id.action_grid_size_8).isChecked = true
}
- val gridSize = if (RetroUtil.isLandscape) 4 else 2
+ val gridSize = if (RetroUtil.isLandscape) 4 else 3
if (gridSize < 8) {
gridSizeMenu.findItem(R.id.action_grid_size_8).isVisible = false
}
@@ -242,9 +241,7 @@ class PlaylistsFragment :
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
findNavController().navigate(
R.id.playlistDetailsFragment,
- bundleOf(EXTRA_PLAYLIST to playlistWithSongs),
- null,
- null
+ bundleOf(EXTRA_PLAYLIST_ID to playlistWithSongs.playlistEntity.playListId)
)
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt
index d384f3eb7..0747ccd86 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt
@@ -49,6 +49,9 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
private var playingQueueAdapter: PlayingQueueAdapter? = null
private lateinit var linearLayoutManager: LinearLayoutManager
+ val mainActivity: MainActivity
+ get() = activity as MainActivity
+
private fun getUpNextAndQueueTime(): String {
val duration = MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position)
return MusicUtil.buildInfoString(
@@ -68,6 +71,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
MusicPlayerRemote.clearQueue()
}
checkForPadding()
+ mainActivity.collapsePanel()
}
private fun setUpRecyclerView() {
@@ -174,7 +178,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
playingQueueAdapter = null
super.onDestroy()
if (MusicPlayerRemote.playingQueue.isNotEmpty())
- (requireActivity() as MainActivity).expandPanel()
+ mainActivity.expandPanel()
}
private fun setupToolbar() {
@@ -196,7 +200,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
}
setTitle(R.string.now_playing_queue)
setTitleTextAppearance(context, R.style.ToolbarTextAppearanceNormal)
- setNavigationIcon(R.drawable.ic_keyboard_backspace_black)
+ setNavigationIcon(R.drawable.ic_arrow_back)
ToolbarContentTintHelper.colorBackButton(this)
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
index eced42489..808aa6732 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
@@ -29,17 +29,12 @@ import androidx.core.widget.doAfterTextChanged
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
-import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.SearchAdapter
import code.name.monkey.retromusic.databinding.FragmentSearchBinding
-import code.name.monkey.retromusic.extensions.accentColor
-import code.name.monkey.retromusic.extensions.dipToPix
-import code.name.monkey.retromusic.extensions.focusAndShowKeyboard
-import code.name.monkey.retromusic.extensions.showToast
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.views.addAlpha
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.google.android.material.shape.MaterialShapeDrawable
@@ -133,7 +128,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search),
val colors = intArrayOf(
android.R.color.transparent,
- ThemeStore.accentColor(requireContext()).addAlpha(0.5F)
+ accentColor().addAlpha(0.5F)
)
chips.forEach {
@@ -151,14 +146,20 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search),
}
}
+ private fun checkForMargins() {
+ if (mainActivity.isBottomNavVisible) {
+ binding.recyclerView.updateLayoutParams {
+ bottomMargin = dip(R.dimen.bottom_nav_height)
+ }
+ }
+ }
+
private fun setupRecyclerView() {
searchAdapter = SearchAdapter(requireActivity(), emptyList())
searchAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
binding.empty.isVisible = searchAdapter.itemCount < 1
- val height = dipToPix(52f)
- binding.recyclerView.updatePadding(bottom = height.toInt())
}
})
binding.recyclerView.apply {
@@ -224,6 +225,11 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search),
}
}
+ override fun onResume() {
+ super.onResume()
+ checkForMargins()
+ }
+
override fun onDestroyView() {
hideKeyboard(view)
super.onDestroyView()
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
index e6d8f681c..3991dc229 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
@@ -10,6 +10,7 @@
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
+ *
*/
package code.name.monkey.retromusic.fragments.settings
@@ -18,13 +19,13 @@ import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Bundle
import android.view.View
+import androidx.core.view.updatePadding
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat
-import code.name.monkey.appthemehelper.util.VersionUtils
-import code.name.monkey.retromusic.preferences.*
-import code.name.monkey.retromusic.activities.OnThemeChangedListener
+import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.preferences.*
import dev.chrisbanes.insetter.applyInsetter
@@ -63,9 +64,10 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
listView.overScrollMode = View.OVER_SCROLL_NEVER
}
+ listView.updatePadding(bottom = dip(R.dimen.mini_player_height))
listView.applyInsetter {
type(navigationBars = true) {
- padding()
+ padding(vertical = true)
}
}
invalidateSettings()
@@ -98,10 +100,6 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
}
fun restartActivity() {
- if (activity is OnThemeChangedListener && !VersionUtils.hasS()) {
- (activity as OnThemeChangedListener).onThemeValuesChanged()
- } else {
- activity?.recreate()
- }
+ activity?.recreate()
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt
index 1dffcc857..17915712a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt
@@ -25,6 +25,7 @@ import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.BLUETOOTH_PLAYBACK
import code.name.monkey.retromusic.EQUALIZER
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.activities.base.AbsBaseActivity.Companion.BLUETOOTH_PERMISSION_REQUEST
import code.name.monkey.retromusic.util.NavigationUtil
/**
@@ -52,7 +53,7 @@ class AudioSettings : AbsSettingsFragment() {
BLUETOOTH_CONNECT) != PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(requireActivity(), arrayOf(
- BLUETOOTH_CONNECT), 100)
+ BLUETOOTH_CONNECT), BLUETOOTH_PERMISSION_REQUEST)
}
}
return@setOnPreferenceChangeListener true
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt
index 318a8b101..2d43fd948 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt
@@ -23,6 +23,7 @@ import code.name.monkey.retromusic.LAST_ADDED_CUTOFF
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.ReloadType.HomeSections
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
/**
@@ -30,12 +31,11 @@ import org.koin.androidx.viewmodel.ext.android.sharedViewModel
*/
class OtherSettingsFragment : AbsSettingsFragment() {
- private val libraryViewModel by sharedViewModel()
+ private val libraryViewModel by activityViewModel()
override fun invalidateSettings() {
val languagePreference: ATEListPreference? = findPreference(LANGUAGE_NAME)
languagePreference?.setOnPreferenceChangeListener { _, _ ->
- println("Invalidated")
restartActivity()
return@setOnPreferenceChangeListener true
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt
index 07b73e641..24218f6fb 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt
@@ -16,28 +16,21 @@ package code.name.monkey.retromusic.fragments.settings
import android.os.Bundle
import android.view.View
-import androidx.preference.TwoStatePreference
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference
+import code.name.monkey.retromusic.APPBAR_MODE
import code.name.monkey.retromusic.HOME_ALBUM_GRID_STYLE
import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE
+import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.TAB_TEXT_MODE
-import code.name.monkey.retromusic.TOGGLE_FULL_SCREEN
-import code.name.monkey.retromusic.*
class PersonalizeSettingsFragment : AbsSettingsFragment() {
- override fun invalidateSettings() {
- val toggleFullScreen: TwoStatePreference? = findPreference(TOGGLE_FULL_SCREEN)
- toggleFullScreen?.setOnPreferenceChangeListener { _, _ ->
- restartActivity()
- true
- }
- }
-
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_ui)
}
+ override fun invalidateSettings() {}
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val homeArtistStyle: ATEListPreference? = findPreference(HOME_ARTIST_GRID_STYLE)
@@ -55,5 +48,10 @@ class PersonalizeSettingsFragment : AbsSettingsFragment() {
setSummary(prefs, newValue)
true
}
+ val appBarMode: ATEListPreference? = findPreference(APPBAR_MODE)
+ appBarMode?.setOnPreferenceChangeListener { _, _ ->
+ restartActivity()
+ true
+ }
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt
similarity index 50%
rename from app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt
rename to app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt
index d6c6741b9..8c10b033d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt
@@ -12,46 +12,45 @@
* See the GNU General Public License for more details.
*
*/
-package code.name.monkey.retromusic.activities
+package code.name.monkey.retromusic.fragments.settings
-import android.Manifest.permission.BLUETOOTH_CONNECT
-import android.content.Intent
import android.os.Bundle
-import android.view.MenuItem
+import android.view.View
+import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.activities.base.AbsBaseActivity
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
-import code.name.monkey.retromusic.extensions.*
-import code.name.monkey.retromusic.databinding.ActivitySettingsBinding
+import code.name.monkey.retromusic.databinding.FragmentSettingsBinding
+import code.name.monkey.retromusic.extensions.applyToolbar
+import code.name.monkey.retromusic.extensions.findNavController
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.color.ColorCallback
-class SettingsActivity : AbsBaseActivity(), ColorCallback, OnThemeChangedListener {
- private lateinit var binding: ActivitySettingsBinding
- override fun onCreate(savedInstanceState: Bundle?) {
- val mSavedInstanceState = extra(TAG).value ?: savedInstanceState
- super.onCreate(mSavedInstanceState)
- binding = ActivitySettingsBinding.inflate(layoutInflater)
- setContentView(binding.root)
- setupToolbar()
- setPermissionDeniedMessage(getString(R.string.permission_bluetooth_denied))
- }
+class SettingsFragment : Fragment(R.layout.fragment_settings), ColorCallback {
+ private var _binding: FragmentSettingsBinding? = null
+ private val binding get() = _binding!!
- override fun onResume() {
- super.onResume()
- setNavigationBarColorPreOreo(surfaceColor())
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ _binding = FragmentSettingsBinding.bind(view)
+ setupToolbar()
}
private fun setupToolbar() {
- applyToolbar(binding.toolbar)
val navController: NavController = findNavController(R.id.contentFrame)
+ with (binding.appBarLayout.toolbar) {
+ setNavigationIcon(R.drawable.ic_arrow_back)
+ isTitleCentered = false
+ setNavigationOnClickListener {
+ requireActivity().onBackPressedDispatcher.onBackPressed()
+ }
+ }
+
navController.addOnDestinationChangedListener { _, _, _ ->
- binding.collapsingToolbarLayout.title =
- navController.currentDestination?.let { getStringFromDestination(it) }
+ binding.appBarLayout.title =
+ navController.currentDestination?.let { getStringFromDestination(it) }.toString()
}
}
@@ -72,51 +71,19 @@ class SettingsActivity : AbsBaseActivity(), ColorCallback, OnThemeChangedListene
return getString(idRes)
}
- override fun onSupportNavigateUp(): Boolean {
- return findNavController(R.id.contentFrame).navigateUp() || super.onSupportNavigateUp()
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (item.itemId == android.R.id.home) {
- onBackPressed()
- }
- return super.onOptionsItemSelected(item)
- }
-
- override fun getPermissionsToRequest(): Array {
- return if (VersionUtils.hasS()) {
- arrayOf(BLUETOOTH_CONNECT)
- } else {
- arrayOf()
- }
- }
-
override fun invoke(dialog: MaterialDialog, color: Int) {
- ThemeStore.editTheme(this).accentColor(color).commit()
+ ThemeStore.editTheme(requireContext()).accentColor(color).commit()
if (VersionUtils.hasNougatMR())
- DynamicShortcutManager(this).updateDynamicShortcuts()
- restart()
+ DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
+ activity?.recreate()
}
- override fun onThemeValuesChanged() {
- restart()
- }
-
- private fun restart() {
- val savedInstanceState = Bundle().apply {
- onSaveInstanceState(this)
- }
- finish()
- val intent = Intent(this, this::class.java).putExtra(TAG, savedInstanceState)
- startActivity(intent)
- overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
}
companion object {
- val TAG: String = SettingsActivity::class.java.simpleName
+ val TAG: String = SettingsFragment::class.java.simpleName
}
}
-
-interface OnThemeChangedListener {
- fun onThemeValuesChanged()
-}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt
index bbb5500ea..aea0e6858 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt
@@ -28,6 +28,7 @@ import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
import code.name.monkey.retromusic.extensions.materialDialog
+import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import code.name.monkey.retromusic.util.PreferenceUtil
import com.afollestad.materialdialogs.color.colorChooser
import com.google.android.material.color.DynamicColors
@@ -125,6 +126,10 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
restartActivity()
true
}
+
+ val adaptiveColor: ATESwitchPreference? = findPreference(ADAPTIVE_COLOR_APP)
+ adaptiveColor?.isEnabled =
+ PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt
index f6257f120..997fc327c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt
@@ -16,28 +16,18 @@ package code.name.monkey.retromusic.fragments.songs
import android.os.Bundle
import android.view.*
-import androidx.activity.addCallback
import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.SongAdapter
-import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.GridStyle
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.helper.SortOrder.SongSortOrder
-import code.name.monkey.retromusic.interfaces.ICabCallback
-import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.util.PreferenceUtil
-import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.RetroUtil
-import com.afollestad.materialcab.attached.AttachedCab
-import com.afollestad.materialcab.attached.destroy
-import com.afollestad.materialcab.attached.isActive
-import com.afollestad.materialcab.createCab
-class SongsFragment : AbsRecyclerViewCustomGridSizeFragment(),
- ICabHolder {
+class SongsFragment : AbsRecyclerViewCustomGridSizeFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
libraryViewModel.getSongs().observe(viewLifecycleOwner) {
@@ -46,12 +36,6 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment SongSortOrder.SONG_DEFAULT
R.id.action_song_sort_order_asc -> SongSortOrder.SONG_A_Z
R.id.action_song_sort_order_desc -> SongSortOrder.SONG_Z_A
R.id.action_song_sort_order_artist -> SongSortOrder.SONG_ARTIST
@@ -331,9 +322,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment callback.onCabCreated(cab, menu) }
- onSelection {
- callback.onCabItemClicked(it)
- }
- onDestroy { callback.onCabFinished(it) }
- }
- return cab as AttachedCab
- }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/BlurTransformation.kt b/app/src/main/java/code/name/monkey/retromusic/glide/BlurTransformation.kt
index fc0434d0b..a2bb033f8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/BlurTransformation.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/BlurTransformation.kt
@@ -15,26 +15,18 @@ import java.security.MessageDigest
@Suppress("Deprecation")
-class BlurTransformation : BitmapTransformation {
+class BlurTransformation private constructor(builder: Builder) : BitmapTransformation() {
private var context: Context? = null
private var blurRadius = 0f
private var sampling = 0
- private fun init(builder: Builder) {
+ init {
this.context = builder.context
this.blurRadius = builder.blurRadius
this.sampling = builder.sampling
}
- private constructor(builder: Builder) : super() {
- init(builder)
- }
-
- private constructor(builder: Builder, bitmapPool: BitmapPool) : super() {
- init(builder)
- }
-
class Builder(val context: Context) {
private var bitmapPool: BitmapPool? = null
var blurRadius = DEFAULT_BLUR_RADIUS
@@ -69,7 +61,7 @@ class BlurTransformation : BitmapTransformation {
fun build(): BlurTransformation {
return if (bitmapPool != null) {
- BlurTransformation(this, bitmapPool!!)
+ BlurTransformation(this)
} else BlurTransformation(this)
}
}
@@ -78,7 +70,7 @@ class BlurTransformation : BitmapTransformation {
pool: BitmapPool,
toTransform: Bitmap,
outWidth: Int,
- outHeight: Int
+ outHeight: Int,
): Bitmap {
val sampling = if (this.sampling == 0) {
ImageUtil.calculateInSampleSize(toTransform.width, toTransform.height, 100)
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt
index 71d42fc9f..11439ace9 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt
@@ -23,14 +23,11 @@ import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.GenericTransitionOptions
import com.bumptech.glide.Priority
import com.bumptech.glide.RequestBuilder
-import com.bumptech.glide.annotation.GlideExtension
-import com.bumptech.glide.annotation.GlideOption
-import com.bumptech.glide.annotation.GlideType
+import com.bumptech.glide.RequestManager
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.Key
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
-import com.bumptech.glide.request.BaseRequestOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
@@ -40,7 +37,6 @@ import com.bumptech.glide.signature.MediaStoreSignature
import java.io.File
-@GlideExtension
object RetroGlideExtension {
private const val DEFAULT_ARTIST_IMAGE =
@@ -54,10 +50,8 @@ object RetroGlideExtension {
private const val DEFAULT_ANIMATION = android.R.anim.fade_in
- @JvmStatic
- @GlideType(BitmapPaletteWrapper::class)
- fun asBitmapPalette(requestBuilder: RequestBuilder): RequestBuilder {
- return requestBuilder
+ fun RequestManager.asBitmapPalette(): RequestBuilder {
+ return this.`as`(BitmapPaletteWrapper::class.java)
}
private fun getSongModel(song: Song, ignoreMediaStore: Boolean): Any {
@@ -100,14 +94,10 @@ object RetroGlideExtension {
}
}
- @JvmStatic
- @GlideOption
- fun artistImageOptions(
- baseRequestOptions: BaseRequestOptions<*>,
+ fun RequestBuilder.artistImageOptions(
artist: Artist
- ): BaseRequestOptions<*> {
- return baseRequestOptions
- .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY_ARTIST)
+ ): RequestBuilder {
+ return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY_ARTIST)
.priority(Priority.LOW)
.error(getDrawable(DEFAULT_ARTIST_IMAGE))
.placeholder(getDrawable(DEFAULT_ARTIST_IMAGE))
@@ -115,70 +105,52 @@ object RetroGlideExtension {
.signature(createSignature(artist))
}
- @JvmStatic
- @GlideOption
- fun songCoverOptions(
- baseRequestOptions: BaseRequestOptions<*>,
+ fun RequestBuilder.songCoverOptions(
song: Song
- ): BaseRequestOptions<*> {
- return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
+ ): RequestBuilder {
+ return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.error(getDrawable(DEFAULT_SONG_IMAGE))
.placeholder(getDrawable(DEFAULT_SONG_IMAGE))
.signature(createSignature(song))
}
- @JvmStatic
- @GlideOption
- fun simpleSongCoverOptions(
- baseRequestOptions: BaseRequestOptions<*>,
+ fun RequestBuilder.simpleSongCoverOptions(
song: Song
- ): BaseRequestOptions<*> {
- return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
+ ): RequestBuilder {
+ return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.signature(createSignature(song))
}
- @JvmStatic
- @GlideOption
- fun albumCoverOptions(
- baseRequestOptions: BaseRequestOptions<*>,
+ fun RequestBuilder.albumCoverOptions(
song: Song
- ): BaseRequestOptions<*> {
- return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
+ ): RequestBuilder {
+ return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.error(ContextCompat.getDrawable(getContext(), DEFAULT_ALBUM_IMAGE))
.placeholder(ContextCompat.getDrawable(getContext(), DEFAULT_ALBUM_IMAGE))
.signature(createSignature(song))
}
- @JvmStatic
- @GlideOption
- fun userProfileOptions(
- baseRequestOptions: BaseRequestOptions<*>,
+ fun RequestBuilder.userProfileOptions(
file: File,
context: Context
- ): BaseRequestOptions<*> {
- return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
+ ): RequestBuilder {
+ return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.error(getErrorUserProfile(context))
.signature(createSignature(file))
}
- @JvmStatic
- @GlideOption
- fun profileBannerOptions(
- baseRequestOptions: BaseRequestOptions<*>,
+ fun RequestBuilder.profileBannerOptions(
file: File
- ): BaseRequestOptions<*> {
- return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
+ ): RequestBuilder {
+ return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
.placeholder(DEFAULT_ERROR_IMAGE_BANNER)
.error(DEFAULT_ERROR_IMAGE_BANNER)
.signature(createSignature(file))
}
- @JvmStatic
- @GlideOption
- fun playlistOptions(
- baseRequestOptions: BaseRequestOptions<*>
- ): BaseRequestOptions<*> {
- return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
+ fun RequestBuilder.playlistOptions(): RequestBuilder {
+ return diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
+ .placeholder(getDrawable(DEFAULT_ALBUM_IMAGE))
.error(getDrawable(DEFAULT_ALBUM_IMAGE))
}
@@ -223,7 +195,7 @@ object RetroGlideExtension {
}
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
-fun GlideRequest.crossfadeListener(): GlideRequest {
+fun RequestBuilder.crossfadeListener(): RequestBuilder {
return listener(object : RequestListener {
override fun onLoadFailed(
e: GlideException?,
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/SingleColorTarget.kt b/app/src/main/java/code/name/monkey/retromusic/glide/SingleColorTarget.kt
index 4991418ea..c60445fb5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/SingleColorTarget.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/SingleColorTarget.kt
@@ -26,7 +26,7 @@ import com.bumptech.glide.request.transition.Transition
abstract class SingleColorTarget(view: ImageView) : BitmapPaletteTarget(view) {
private val defaultFooterColor: Int
- get() = ATHUtil.resolveColor(view.context, R.attr.colorControlNormal)
+ get() = ATHUtil.resolveColor(view.context, androidx.appcompat.R.attr.colorControlNormal)
abstract fun onColorReady(color: Int)
@@ -43,7 +43,7 @@ abstract class SingleColorTarget(view: ImageView) : BitmapPaletteTarget(view) {
onColorReady(
ColorUtil.getColor(
resource.palette,
- ATHUtil.resolveColor(view.context, R.attr.colorPrimary)
+ ATHUtil.resolveColor(view.context, androidx.appcompat.R.attr.colorPrimary)
)
)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreview.kt b/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreview.kt
index b9257db62..7af7e0dae 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreview.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreview.kt
@@ -11,21 +11,20 @@ class PlaylistPreview(val playlistWithSongs: PlaylistWithSongs) {
val songs: List get() = playlistWithSongs.songs.toSongs()
override fun equals(other: Any?): Boolean {
- if (other is PlaylistPreview) {
- if (other.playlistEntity.playListId != playlistEntity.playListId) {
- return false
- }
- if (other.songs.size != songs.size) {
- return false
- }
- return true
- }
- return false
+ println("Glide equals $this $other")
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as PlaylistPreview
+ if (other.playlistEntity.playListId != playlistEntity.playListId) return false
+ if (other.songs.size != songs.size) return false
+ return true
}
override fun hashCode(): Int {
var result = playlistEntity.playListId.hashCode()
result = 31 * result + playlistWithSongs.songs.size
+ println("Glide $result")
return result
}
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreviewFetcher.kt b/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreviewFetcher.kt
index 07a2ec4b1..5443b5825 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreviewFetcher.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/playlistPreview/PlaylistPreviewFetcher.kt
@@ -17,7 +17,7 @@ class PlaylistPreviewFetcher(val context: Context, private val playlistPreview:
val bitmap =
AutoGeneratedPlaylistBitmap.getBitmap(
context,
- playlistPreview.songs.shuffled()
+ playlistPreview.songs
)
callback.onDataReady(bitmap)
} catch (e: Exception) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt
index fb03f95a6..3c20e2aca 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt
@@ -28,12 +28,13 @@ import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.SongRepository
import code.name.monkey.retromusic.service.MusicService
-import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.getExternalStorageDirectory
+import code.name.monkey.retromusic.util.logE
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.io.File
import java.util.*
+import kotlin.collections.set
object MusicPlayerRemote : KoinComponent {
@@ -43,14 +44,6 @@ object MusicPlayerRemote : KoinComponent {
private val songRepository by inject()
- var isCasting: Boolean = false
- set(value) {
- field = value
- if (value) {
- musicService?.quit()
- }
- }
-
@JvmStatic
val isPlaying: Boolean
get() = musicService != null && musicService!!.isPlaying
@@ -71,9 +64,6 @@ object MusicPlayerRemote : KoinComponent {
musicService?.nextSong
} else Song.emptySong
- /**
- * Async
- */
var position: Int
get() = if (musicService != null) {
musicService!!.position
@@ -121,20 +111,18 @@ object MusicPlayerRemote : KoinComponent {
fun bindToService(context: Context, callback: ServiceConnection): ServiceToken? {
- var realActivity: Activity? = (context as Activity).parent
- if (realActivity == null) {
- realActivity = context
- }
-
+ val realActivity = (context as Activity).parent ?: context
val contextWrapper = ContextWrapper(realActivity)
val intent = Intent(contextWrapper, MusicService::class.java)
+
+ // https://issuetracker.google.com/issues/76112072#comment184
+ // Workaround for ForegroundServiceDidNotStartInTimeException
try {
- contextWrapper.startService(intent)
- } catch (ignored: IllegalStateException) {
- runCatching {
- ContextCompat.startForegroundService(context, intent)
- }
+ context.startService(intent)
+ } catch (e: Exception) {
+ ContextCompat.startForegroundService(context, intent)
}
+
val binder = ServiceBinder(callback)
if (contextWrapper.bindService(
@@ -184,9 +172,6 @@ object MusicPlayerRemote : KoinComponent {
return musicService?.playingQueue?.size ?: -1
}
- /**
- * Async
- */
fun playSongAt(position: Int) {
musicService?.playSongAt(position)
}
@@ -232,14 +217,9 @@ object MusicPlayerRemote : KoinComponent {
) && musicService != null
) {
musicService?.openQueue(queue, startPosition, startPlaying)
- if (PreferenceUtil.isShuffleModeOn)
- setShuffleMode(MusicService.SHUFFLE_MODE_NONE)
}
}
- /**
- * Async
- */
@JvmStatic
fun openAndShuffleQueue(queue: List, startPlaying: Boolean) {
var startPosition = 0
@@ -437,13 +417,13 @@ object MusicPlayerRemote : KoinComponent {
}
}
}
- if (songs == null || songs.isEmpty()) {
+ if (songs.isNullOrEmpty()) {
var songFile: File? = null
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
- songFile = File(
- getExternalStorageDirectory(),
- uri.path?.split(":".toRegex(), 2)?.get(1)
- )
+ val path = uri.path?.split(":".toRegex(), 2)?.get(1)
+ if (path != null) {
+ songFile = File(getExternalStorageDirectory(), path)
+ }
}
if (songFile == null) {
val path = getFilePathFromUri(context, uri)
@@ -457,12 +437,14 @@ object MusicPlayerRemote : KoinComponent {
songs = songRepository.songsByFilePath(songFile.absolutePath, true)
}
}
- if (songs != null && songs.isNotEmpty()) {
+ if (!songs.isNullOrEmpty()) {
openQueue(songs, 0, true)
} else {
- // TODO the file is not listed in the media store
- context.showToast(R.string.unplayable_file)
- println("The file is not listed in the media store")
+ try {
+ context.showToast(R.string.unplayable_file)
+ } catch (e: Exception) {
+ logE("The file is not listed in the media store")
+ }
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt
index 2e6aefefb..37deb038e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt
@@ -15,6 +15,7 @@
package code.name.monkey.retromusic.helper
import android.os.Handler
+import android.os.Looper
import android.os.Message
import kotlin.math.max
@@ -23,22 +24,27 @@ class MusicProgressViewUpdateHelper : Handler {
private var callback: Callback? = null
private var intervalPlaying: Int = 0
private var intervalPaused: Int = 0
+ private var firstUpdate = true
fun start() {
- queueNextRefresh(1)
+ queueNextRefresh(refreshProgressViews().toLong())
}
fun stop() {
removeMessages(CMD_REFRESH_PROGRESS_VIEWS)
}
- constructor(callback: Callback) {
+ constructor(callback: Callback) : super(Looper.getMainLooper()) {
this.callback = callback
this.intervalPlaying = UPDATE_INTERVAL_PLAYING
this.intervalPaused = UPDATE_INTERVAL_PAUSED
}
- constructor(callback: Callback, intervalPlaying: Int, intervalPaused: Int) {
+ constructor(
+ callback: Callback,
+ intervalPlaying: Int,
+ intervalPaused: Int,
+ ) : super(Looper.getMainLooper()) {
this.callback = callback
this.intervalPlaying = intervalPlaying
this.intervalPaused = intervalPaused
@@ -54,10 +60,11 @@ class MusicProgressViewUpdateHelper : Handler {
private fun refreshProgressViews(): Int {
val progressMillis = MusicPlayerRemote.songProgressMillis
val totalMillis = MusicPlayerRemote.songDurationMillis
- if (totalMillis > 0)
+ if (totalMillis > 0) {
+ firstUpdate = false
callback?.onUpdateProgressViews(progressMillis, totalMillis)
-
- if (!MusicPlayerRemote.isPlaying) {
+ }
+ if (!MusicPlayerRemote.isPlaying && !firstUpdate) {
return intervalPaused
}
@@ -79,7 +86,7 @@ class MusicProgressViewUpdateHelper : Handler {
companion object {
private const val CMD_REFRESH_PROGRESS_VIEWS = 1
private const val MIN_INTERVAL = 20
- private const val UPDATE_INTERVAL_PLAYING = 1000
+ private const val UPDATE_INTERVAL_PLAYING = 500
private const val UPDATE_INTERVAL_PAUSED = 500
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt b/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt
index b77e39d09..ee3e2a018 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt
@@ -72,8 +72,10 @@ class SortOrder {
companion object {
+ const val SONG_DEFAULT = MediaStore.Audio.Media.DEFAULT_SORT_ORDER
+
/* Song sort order A-Z */
- const val SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER
+ const val SONG_A_Z = MediaStore.Audio.Media.TITLE
/* Song sort order Z-A */
const val SONG_Z_A = "$SONG_A_Z DESC"
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt b/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt
index 871904cef..8a72c9b45 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt
@@ -43,7 +43,7 @@ class WallpaperAccentManager(val context: Context) {
.getWallpaperColors(WallpaperManager.FLAG_SYSTEM)
if (colors != null) {
val primaryColor = colors.primaryColor.toArgb()
- ThemeStore.editTheme(context).wallpaperColor(context, primaryColor).commit()
+ ThemeStore.editTheme(context).wallpaperColor(context, primaryColor).commit()
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt
index 7e78cc03d..a6b8009dd 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt
@@ -65,7 +65,7 @@ object SongMenuHelper : KoinComponent {
R.id.action_share -> {
activity.startActivity(
Intent.createChooser(
- MusicUtil.createShareSongFileIntent(song, activity),
+ MusicUtil.createShareSongFileIntent(activity, song),
null
)
)
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt
index 1d7383429..b5d236734 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt
@@ -14,6 +14,7 @@
*/
package code.name.monkey.retromusic.helper.menu
+import android.content.Intent
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
@@ -21,6 +22,7 @@ import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.util.MusicUtil
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -53,6 +55,15 @@ object SongsMenuHelper : KoinComponent {
}
return true
}
+ R.id.action_share -> {
+ activity.startActivity(
+ Intent.createChooser(
+ MusicUtil.createShareMultipleSongIntent(activity, songs),
+ null
+ )
+ )
+ return true
+ }
R.id.action_delete_from_device -> {
DeleteSongsDialog.create(songs)
.show(activity.supportFragmentManager, "DELETE_SONGS")
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt
deleted file mode 100644
index 76750ff01..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2020 Hemanth Savarla.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- */
-package code.name.monkey.retromusic.interfaces
-
-import android.view.Menu
-import android.view.MenuItem
-import com.afollestad.materialcab.attached.AttachedCab
-
-interface ICabCallback {
- fun onCabCreated(cab: AttachedCab, menu: Menu): Boolean
-
- fun onCabItemClicked(item: MenuItem): Boolean
-
- fun onCabFinished(cab: AttachedCab): Boolean
-}
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt
deleted file mode 100644
index e04a4c326..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2020 Hemanth Savarla.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- */
-package code.name.monkey.retromusic.interfaces
-
-import com.afollestad.materialcab.attached.AttachedCab
-
-interface ICabHolder {
-
- fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab
-}
diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt
index bd421250a..891181c3d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt
@@ -19,7 +19,6 @@ import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.drawable.Drawable
-import android.os.AsyncTask
import android.os.Looper
import android.text.Layout
import android.text.StaticLayout
@@ -35,7 +34,9 @@ import android.widget.Scroller
import androidx.core.content.ContextCompat
import androidx.core.graphics.withSave
import code.name.monkey.retromusic.R
+import kotlinx.coroutines.*
import java.io.File
+import java.lang.Runnable
import kotlin.math.abs
/**
@@ -45,7 +46,7 @@ import kotlin.math.abs
class CoverLrcView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
- defStyleAttr: Int = 0
+ defStyleAttr: Int = 0,
) : View(context, attrs, defStyleAttr) {
private val mLrcEntryList: MutableList = ArrayList()
private val mLrcPaint = TextPaint()
@@ -71,7 +72,6 @@ class CoverLrcView @JvmOverloads constructor(
private var mScroller: Scroller? = null
private var mOffset = 0f
private var mCurrentLine = 0
- private var flag: Any? = null
private var isShowTimeline = false
private var isTouching = false
private var isFling = false
@@ -84,9 +84,8 @@ class CoverLrcView @JvmOverloads constructor(
}
}
- /**
- * 手势监听器
- */
+ private val viewScope = CoroutineScope(Dispatchers.Main + Job())
+
private val mSimpleOnGestureListener: SimpleOnGestureListener =
object : SimpleOnGestureListener() {
override fun onDown(e: MotionEvent): Boolean {
@@ -108,7 +107,7 @@ class CoverLrcView @JvmOverloads constructor(
e1: MotionEvent,
e2: MotionEvent,
distanceX: Float,
- distanceY: Float
+ distanceY: Float,
): Boolean {
if (mOffset == getOffset(0) && distanceY < 0F) {
return super.onScroll(e1, e2, distanceX, distanceY)
@@ -128,7 +127,7 @@ class CoverLrcView @JvmOverloads constructor(
e1: MotionEvent,
e2: MotionEvent,
velocityX: Float,
- velocityY: Float
+ velocityY: Float,
): Boolean {
if (hasLrc()) {
mScroller!!.fling(
@@ -250,52 +249,31 @@ class CoverLrcView @JvmOverloads constructor(
mScroller = Scroller(context)
}
- /** 设置非当前行歌词字体颜色 */
fun setNormalColor(normalColor: Int) {
mNormalTextColor = normalColor
postInvalidate()
}
- /** 普通歌词文本字体大小 */
- fun setNormalTextSize(size: Float) {
- mNormalTextSize = size
- }
-
- /** 当前歌词文本字体大小 */
- fun setCurrentTextSize(size: Float) {
- mCurrentTextSize = size
- }
-
- /** 设置当前行歌词的字体颜色 */
fun setCurrentColor(currentColor: Int) {
mCurrentTextColor = currentColor
postInvalidate()
}
- /** 设置拖动歌词时选中歌词的字体颜色 */
fun setTimelineTextColor(timelineTextColor: Int) {
mTimelineTextColor = timelineTextColor
postInvalidate()
}
- /** 设置拖动歌词时时间线的颜色 */
fun setTimelineColor(timelineColor: Int) {
mTimelineColor = timelineColor
postInvalidate()
}
- /** 设置拖动歌词时右侧时间字体颜色 */
fun setTimeTextColor(timeTextColor: Int) {
mTimeTextColor = timeTextColor
postInvalidate()
}
- /**
- * 设置歌词是否允许拖动
- *
- * @param draggable 是否允许拖动
- * @param onPlayClickListener 设置歌词拖动后播放按钮点击监听器,如果允许拖动,则不能为 null
- */
fun setDraggable(draggable: Boolean, onPlayClickListener: OnPlayClickListener?) {
mOnPlayClickListener = if (draggable) {
requireNotNull(onPlayClickListener) { "if draggable == true, onPlayClickListener must not be null" }
@@ -305,17 +283,6 @@ class CoverLrcView @JvmOverloads constructor(
}
}
- /**
- * 设置播放按钮点击监听器
- *
- * @param onPlayClickListener 如果为非 null ,则激活歌词拖动功能,否则将将禁用歌词拖动功能
- */
- @Deprecated("use {@link #setDraggable(boolean, OnPlayClickListener)} instead")
- fun setOnPlayClickListener(onPlayClickListener: OnPlayClickListener?) {
- mOnPlayClickListener = onPlayClickListener
- }
-
- /** 设置歌词为空时屏幕中央显示的文字,如“暂无歌词” */
fun setLabel(label: String?) {
runOnUi {
mDefaultLabel = label
@@ -323,128 +290,40 @@ class CoverLrcView @JvmOverloads constructor(
}
}
- /**
- * 加载歌词文件
- *
- * @param lrcFile 歌词文件
- */
fun loadLrc(lrcFile: File) {
- loadLrc(lrcFile, null)
- }
-
- /**
- * 加载双语歌词文件,两种语言的歌词时间戳需要一致
- *
- * @param mainLrcFile 第一种语言歌词文件
- * @param secondLrcFile 第二种语言歌词文件
- */
- private fun loadLrc(mainLrcFile: File, secondLrcFile: File?) {
runOnUi {
reset()
- val sb = StringBuilder("file://")
- sb.append(mainLrcFile.path)
- if (secondLrcFile != null) {
- sb.append("#").append(secondLrcFile.path)
+ viewScope.launch(Dispatchers.IO) {
+ val lrcEntries = LrcUtils.parseLrc(arrayOf(lrcFile, null))
+ withContext(Dispatchers.Main) {
+ onLrcLoaded(lrcEntries)
+ }
}
- val flag = sb.toString()
- this.flag = flag
- object : AsyncTask>() {
- override fun doInBackground(vararg params: File?): List? {
- return LrcUtils.parseLrc(params)
- }
-
- override fun onPostExecute(lrcEntries: List) {
- if (flag == flag) {
- onLrcLoaded(lrcEntries)
- this@CoverLrcView.flag = null
- }
- }
- }.execute(mainLrcFile, secondLrcFile)
}
}
- /**
- * 加载歌词文本
- *
- * @param lrcText 歌词文本
- */
fun loadLrc(lrcText: String?) {
- loadLrc(lrcText, null)
- }
-
- /**
- * 加载双语歌词文本,两种语言的歌词时间戳需要一致
- *
- * @param mainLrcText 第一种语言歌词文本
- * @param secondLrcText 第二种语言歌词文本
- */
- private fun loadLrc(mainLrcText: String?, secondLrcText: String?) {
runOnUi {
reset()
- val sb = StringBuilder("file://")
- sb.append(mainLrcText)
- if (secondLrcText != null) {
- sb.append("#").append(secondLrcText)
+ viewScope.launch(Dispatchers.IO) {
+ val lrcEntries = LrcUtils.parseLrc(arrayOf(lrcText, null))
+ withContext(Dispatchers.Main) {
+ onLrcLoaded(lrcEntries)
+ }
}
- val flag = sb.toString()
- this.flag = flag
- object : AsyncTask>() {
- override fun doInBackground(vararg params: String?): List? {
- return LrcUtils.parseLrc(params)
- }
-
- override fun onPostExecute(lrcEntries: List) {
- if (flag == flag) {
- onLrcLoaded(lrcEntries)
- this@CoverLrcView.flag = null
- }
- }
- }.execute(mainLrcText, secondLrcText)
}
}
- /**
- * 加载在线歌词,默认使用 utf-8 编码
- *
- * @param lrcUrl 歌词文件的网络地址
- */
- @JvmOverloads
- fun loadLrcByUrl(lrcUrl: String, charset: String? = "utf-8") {
- val flag = "url://$lrcUrl"
- this.flag = flag
- object : AsyncTask() {
- override fun doInBackground(vararg params: String?): String? {
- return LrcUtils.getContentFromNetwork(params[0], params[1])
- }
-
- override fun onPostExecute(lrcText: String) {
- if (flag == flag) {
- loadLrc(lrcText)
- }
- }
- }.execute(lrcUrl, charset)
- }
-
- /**
- * 歌词是否有效
- *
- * @return true,如果歌词有效,否则false
- */
fun hasLrc(): Boolean {
return mLrcEntryList.isNotEmpty()
}
- /**
- * 刷新歌词
- *
- * @param time 当前播放时间
- */
fun updateTime(time: Long) {
runOnUi {
if (!hasLrc()) {
return@runOnUi
}
- val line = findShowLine(time)
+ val line = findShowLine(time + 300L)
if (line != mCurrentLine) {
mCurrentLine = line
if (!isShowTimeline) {
@@ -472,9 +351,9 @@ class CoverLrcView @JvmOverloads constructor(
super.onDraw(canvas)
val centerY = height / 2
- // 无歌词文件
if (!hasLrc()) {
mLrcPaint.color = mCurrentTextColor
+ @Suppress("Deprecation")
@SuppressLint("DrawAllocation") val staticLayout = StaticLayout(
mDefaultLabel,
mLrcPaint,
@@ -516,11 +395,6 @@ class CoverLrcView @JvmOverloads constructor(
}
}
- /**
- * 画一行歌词
- *
- * @param y 歌词中心 Y 坐标
- */
private fun drawText(canvas: Canvas, staticLayout: StaticLayout, y: Float) {
canvas.withSave {
translate(mLrcPadding, y - (staticLayout.height shr 1))
@@ -570,6 +444,7 @@ class CoverLrcView @JvmOverloads constructor(
override fun onDetachedFromWindow() {
removeCallbacks(hideTimelineRunnable)
+ viewScope.cancel()
super.onDetachedFromWindow()
}
@@ -613,12 +488,10 @@ class CoverLrcView @JvmOverloads constructor(
invalidate()
}
- /** 将中心行微调至正中心 */
private fun adjustCenter() {
smoothScrollTo(centerLine, ADJUST_DURATION)
}
- /** 滚动到某一行 */
private fun smoothScrollTo(line: Int, duration: Long = mAnimationDuration) {
val offset = getOffset(line)
endAnimation()
@@ -629,19 +502,16 @@ class CoverLrcView @JvmOverloads constructor(
mOffset = animation.animatedValue as Float
invalidate()
}
- LrcUtils.resetDurationScale()
start()
}
}
- /** 结束滚动动画 */
private fun endAnimation() {
if (mAnimator != null && mAnimator!!.isRunning) {
mAnimator!!.end()
}
}
- /** 二分法查找当前时间应该显示的行数(最后一个 <= time 的行数) */
private fun findShowLine(time: Long): Int {
var left = 0
var right = mLrcEntryList.size
@@ -660,7 +530,6 @@ class CoverLrcView @JvmOverloads constructor(
return 0
}
- /** 获取当前在视图中央的行数 */
private val centerLine: Int
get() {
var centerLine = 0
@@ -674,7 +543,6 @@ class CoverLrcView @JvmOverloads constructor(
return centerLine
}
- /** 获取歌词距离视图顶部的距离 采用懒加载方式 */
private fun getOffset(line: Int): Float {
if (mLrcEntryList.isEmpty()) return 0F
if (mLrcEntryList[line].offset == Float.MIN_VALUE) {
@@ -688,11 +556,9 @@ class CoverLrcView @JvmOverloads constructor(
return mLrcEntryList[line].offset
}
- /** 获取歌词宽度 */
private val lrcWidth: Float
get() = width - mLrcPadding * 2
- /** 在主线程中运行 */
private fun runOnUi(r: Runnable) {
if (Looper.myLooper() == Looper.getMainLooper()) {
r.run()
@@ -701,20 +567,10 @@ class CoverLrcView @JvmOverloads constructor(
}
}
- /** 播放按钮点击监听器,点击后应该跳转到指定播放位置 */
fun interface OnPlayClickListener {
- /**
- * 播放按钮被点击,应该跳转到指定播放位置
- *
- * @return 是否成功消费该事件,如果成功消费,则会更新UI
- */
fun onPlayClick(time: Long): Boolean
}
- fun interface OnFlingXListener {
- fun onFlingX(velocityX: Float): Boolean
- }
-
companion object {
private const val ADJUST_DURATION: Long = 100
private const val TIMELINE_KEEP_TIME = 4 * DateUtils.SECOND_IN_MILLIS
diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java
index b81fc782a..7b7eba15e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java
+++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java
@@ -14,7 +14,6 @@
package code.name.monkey.retromusic.lyrics;
-import android.animation.ValueAnimator;
import android.text.TextUtils;
import android.text.format.DateUtils;
@@ -25,7 +24,6 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
@@ -208,14 +206,4 @@ class LrcUtils {
String ss = String.format(Locale.getDefault(), "%02d", s);
return mm + ":" + ss;
}
-
- static void resetDurationScale() {
- try {
- Field mField = ValueAnimator.class.getDeclaredField("sDurationScale");
- mField.setAccessible(true);
- mField.setFloat(null, 1);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java
index 60f904bdb..25ec996e8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java
+++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java
@@ -35,6 +35,8 @@ import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.Scroller;
+import androidx.core.content.ContextCompat;
+
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
@@ -48,732 +50,600 @@ import code.name.monkey.retromusic.R;
*/
@SuppressLint("StaticFieldLeak")
public class LrcView extends View {
- private static final long ADJUST_DURATION = 100;
- private static final long TIMELINE_KEEP_TIME = 4 * DateUtils.SECOND_IN_MILLIS;
+ private static final long ADJUST_DURATION = 100;
+ private static final long TIMELINE_KEEP_TIME = 4 * DateUtils.SECOND_IN_MILLIS;
- private final List mLrcEntryList = new ArrayList<>();
- private final TextPaint mLrcPaint = new TextPaint();
- private final TextPaint mTimePaint = new TextPaint();
- private Paint.FontMetrics mTimeFontMetrics;
- private Drawable mPlayDrawable;
- private float mDividerHeight;
- private long mAnimationDuration;
- private int mNormalTextColor;
- private float mNormalTextSize;
- private int mCurrentTextColor;
- private float mCurrentTextSize;
- private int mTimelineTextColor;
- private int mTimelineColor;
- private int mTimeTextColor;
- private int mDrawableWidth;
- private int mTimeTextWidth;
- private String mDefaultLabel;
- private float mLrcPadding;
- private OnPlayClickListener mOnPlayClickListener;
- private ValueAnimator mAnimator;
- private GestureDetector mGestureDetector;
- private Scroller mScroller;
- private float mOffset;
- private int mCurrentLine;
- private Object mFlag;
- private boolean isShowTimeline;
- private boolean isTouching;
- private boolean isFling;
- private int mTextGravity; // 歌词显示位置,靠左/居中/靠右
- private final Runnable hideTimelineRunnable =
- new Runnable() {
- @Override
- public void run() {
- if (hasLrc() && isShowTimeline) {
- isShowTimeline = false;
- smoothScrollTo(mCurrentLine);
- }
- }
- };
- /**
- * 手势监听器
- */
- private final GestureDetector.SimpleOnGestureListener mSimpleOnGestureListener =
- new GestureDetector.SimpleOnGestureListener() {
- @Override
- public boolean onDown(MotionEvent e) {
- if (hasLrc() && mOnPlayClickListener != null) {
- mScroller.forceFinished(true);
- removeCallbacks(hideTimelineRunnable);
- isTouching = true;
- isShowTimeline = true;
- invalidate();
- return true;
- }
- return super.onDown(e);
- }
+ private final List mLrcEntryList = new ArrayList<>();
+ private final TextPaint mLrcPaint = new TextPaint();
+ private final TextPaint mTimePaint = new TextPaint();
+ private Paint.FontMetrics mTimeFontMetrics;
+ private Drawable mPlayDrawable;
+ private float mDividerHeight;
+ private long mAnimationDuration;
+ private int mNormalTextColor;
+ private float mNormalTextSize;
+ private int mCurrentTextColor;
+ private float mCurrentTextSize;
+ private int mTimelineTextColor;
+ private int mTimelineColor;
+ private int mTimeTextColor;
+ private int mDrawableWidth;
+ private int mTimeTextWidth;
+ private String mDefaultLabel;
+ private float mLrcPadding;
+ private OnPlayClickListener mOnPlayClickListener;
+ private ValueAnimator mAnimator;
+ private GestureDetector mGestureDetector;
+ private Scroller mScroller;
+ private float mOffset;
+ private int mCurrentLine;
+ private Object mFlag;
+ private boolean isShowTimeline;
+ private boolean isTouching;
+ private boolean isFling;
+ private int mTextGravity; // 歌词显示位置,靠左/居中/靠右
+ private final Runnable hideTimelineRunnable =
+ new Runnable() {
+ @Override
+ public void run() {
+ if (hasLrc() && isShowTimeline) {
+ isShowTimeline = false;
+ smoothScrollTo(mCurrentLine);
+ }
+ }
+ };
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
- if (hasLrc()) {
- mOffset += -distanceY;
- mOffset = Math.min(mOffset, getOffset(0));
- mOffset = Math.max(mOffset, getOffset(mLrcEntryList.size() - 1));
- invalidate();
- getParent().requestDisallowInterceptTouchEvent(true);
- return true;
- }
- return super.onScroll(e1, e2, distanceX, distanceY);
- }
+ private final GestureDetector.SimpleOnGestureListener mSimpleOnGestureListener =
+ new GestureDetector.SimpleOnGestureListener() {
+ @Override
+ public boolean onDown(MotionEvent e) {
+ if (hasLrc() && mOnPlayClickListener != null) {
+ mScroller.forceFinished(true);
+ removeCallbacks(hideTimelineRunnable);
+ isTouching = true;
+ isShowTimeline = true;
+ invalidate();
+ return true;
+ }
+ return super.onDown(e);
+ }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
- if (hasLrc()) {
- mScroller.fling(
- 0,
- (int) mOffset,
- 0,
- (int) velocityY,
- 0,
- 0,
- (int) getOffset(mLrcEntryList.size() - 1),
- (int) getOffset(0));
- isFling = true;
- return true;
- }
- return super.onFling(e1, e2, velocityX, velocityY);
- }
+ @Override
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+ if (hasLrc()) {
+ mOffset -= distanceY;
+ mOffset = Math.min(mOffset, getOffset(0));
+ mOffset = Math.max(mOffset, getOffset(mLrcEntryList.size() - 1));
+ invalidate();
+ getParent().requestDisallowInterceptTouchEvent(true);
+ return true;
+ }
+ return super.onScroll(e1, e2, distanceX, distanceY);
+ }
- @Override
- public boolean onSingleTapConfirmed(MotionEvent e) {
- if (hasLrc()
- && isShowTimeline
- && mPlayDrawable.getBounds().contains((int) e.getX(), (int) e.getY())) {
- int centerLine = getCenterLine();
- long centerLineTime = mLrcEntryList.get(centerLine).getTime();
- // onPlayClick 消费了才更新 UI
- if (mOnPlayClickListener != null && mOnPlayClickListener.onPlayClick(centerLineTime)) {
- isShowTimeline = false;
- removeCallbacks(hideTimelineRunnable);
- mCurrentLine = centerLine;
- invalidate();
- return true;
- }
- }
- return super.onSingleTapConfirmed(e);
- }
- };
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ if (hasLrc()) {
+ mScroller.fling(
+ 0,
+ (int) mOffset,
+ 0,
+ (int) velocityY,
+ 0,
+ 0,
+ (int) getOffset(mLrcEntryList.size() - 1),
+ (int) getOffset(0));
+ isFling = true;
+ return true;
+ }
+ return super.onFling(e1, e2, velocityX, velocityY);
+ }
- public LrcView(Context context) {
- this(context, null);
- }
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent e) {
+ if (hasLrc()
+ && isShowTimeline
+ && mPlayDrawable.getBounds().contains((int) e.getX(), (int) e.getY())) {
+ int centerLine = getCenterLine();
+ long centerLineTime = mLrcEntryList.get(centerLine).getTime();
+ // onPlayClick 消费了才更新 UI
+ if (mOnPlayClickListener != null && mOnPlayClickListener.onPlayClick(centerLineTime)) {
+ isShowTimeline = false;
+ removeCallbacks(hideTimelineRunnable);
+ mCurrentLine = centerLine;
+ invalidate();
+ return true;
+ }
+ }
+ return super.onSingleTapConfirmed(e);
+ }
+ };
- public LrcView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public LrcView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init(attrs);
- }
-
- private void init(AttributeSet attrs) {
- TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.LrcView);
- mCurrentTextSize =
- ta.getDimension(
- R.styleable.LrcView_lrcTextSize, getResources().getDimension(R.dimen.lrc_text_size));
- mNormalTextSize =
- ta.getDimension(
- R.styleable.LrcView_lrcNormalTextSize,
- getResources().getDimension(R.dimen.lrc_text_size));
- if (mNormalTextSize == 0) {
- mNormalTextSize = mCurrentTextSize;
+ public LrcView(Context context) {
+ this(context, null);
}
- mDividerHeight =
- ta.getDimension(
- R.styleable.LrcView_lrcDividerHeight,
- getResources().getDimension(R.dimen.lrc_divider_height));
- int defDuration = getResources().getInteger(R.integer.lrc_animation_duration);
- mAnimationDuration = ta.getInt(R.styleable.LrcView_lrcAnimationDuration, defDuration);
- mAnimationDuration = (mAnimationDuration < 0) ? defDuration : mAnimationDuration;
- mNormalTextColor =
- ta.getColor(
- R.styleable.LrcView_lrcNormalTextColor,
- getResources().getColor(R.color.lrc_normal_text_color));
- mCurrentTextColor =
- ta.getColor(
- R.styleable.LrcView_lrcCurrentTextColor,
- getResources().getColor(R.color.lrc_current_text_color));
- mTimelineTextColor =
- ta.getColor(
- R.styleable.LrcView_lrcTimelineTextColor,
- getResources().getColor(R.color.lrc_timeline_text_color));
- mDefaultLabel = ta.getString(R.styleable.LrcView_lrcLabel);
- mDefaultLabel =
- TextUtils.isEmpty(mDefaultLabel) ? getContext().getString(R.string.empty) : mDefaultLabel;
- mLrcPadding = ta.getDimension(R.styleable.LrcView_lrcPadding, 0);
- mTimelineColor =
- ta.getColor(
- R.styleable.LrcView_lrcTimelineColor,
- getResources().getColor(R.color.lrc_timeline_color));
- float timelineHeight =
- ta.getDimension(
- R.styleable.LrcView_lrcTimelineHeight,
- getResources().getDimension(R.dimen.lrc_timeline_height));
- mPlayDrawable = ta.getDrawable(R.styleable.LrcView_lrcPlayDrawable);
- mPlayDrawable =
- (mPlayDrawable == null)
- ? getResources().getDrawable(R.drawable.ic_play_arrow)
- : mPlayDrawable;
- mTimeTextColor =
- ta.getColor(
- R.styleable.LrcView_lrcTimeTextColor,
- getResources().getColor(R.color.lrc_time_text_color));
- float timeTextSize =
- ta.getDimension(
- R.styleable.LrcView_lrcTimeTextSize,
- getResources().getDimension(R.dimen.lrc_time_text_size));
- mTextGravity = ta.getInteger(R.styleable.LrcView_lrcTextGravity, LrcEntry.GRAVITY_CENTER);
-
- ta.recycle();
-
- mDrawableWidth = (int) getResources().getDimension(R.dimen.lrc_drawable_width);
- mTimeTextWidth = (int) getResources().getDimension(R.dimen.lrc_time_width);
-
- mLrcPaint.setAntiAlias(true);
- mLrcPaint.setTextSize(mCurrentTextSize);
- mLrcPaint.setTextAlign(Paint.Align.LEFT);
- mTimePaint.setAntiAlias(true);
- mTimePaint.setTextSize(timeTextSize);
- mTimePaint.setTextAlign(Paint.Align.CENTER);
- //noinspection SuspiciousNameCombination
- mTimePaint.setStrokeWidth(timelineHeight);
- mTimePaint.setStrokeCap(Paint.Cap.ROUND);
- mTimeFontMetrics = mTimePaint.getFontMetrics();
-
- mGestureDetector = new GestureDetector(getContext(), mSimpleOnGestureListener);
- mGestureDetector.setIsLongpressEnabled(false);
- mScroller = new Scroller(getContext());
- }
-
- /** 设置非当前行歌词字体颜色 */
- public void setNormalColor(int normalColor) {
- mNormalTextColor = normalColor;
- postInvalidate();
- }
-
- /** 普通歌词文本字体大小 */
- public void setNormalTextSize(float size) {
- mNormalTextSize = size;
- }
-
- /** 当前歌词文本字体大小 */
- public void setCurrentTextSize(float size) {
- mCurrentTextSize = size;
- }
-
- /** 设置当前行歌词的字体颜色 */
- public void setCurrentColor(int currentColor) {
- mCurrentTextColor = currentColor;
- postInvalidate();
- }
-
- /** 设置拖动歌词时选中歌词的字体颜色 */
- public void setTimelineTextColor(int timelineTextColor) {
- mTimelineTextColor = timelineTextColor;
- postInvalidate();
- }
-
- /** 设置拖动歌词时时间线的颜色 */
- public void setTimelineColor(int timelineColor) {
- mTimelineColor = timelineColor;
- postInvalidate();
- }
-
- /** 设置拖动歌词时右侧时间字体颜色 */
- public void setTimeTextColor(int timeTextColor) {
- mTimeTextColor = timeTextColor;
- postInvalidate();
- }
-
- /**
- * 设置歌词是否允许拖动
- *
- * @param draggable 是否允许拖动
- * @param onPlayClickListener 设置歌词拖动后播放按钮点击监听器,如果允许拖动,则不能为 null
- */
- public void setDraggable(boolean draggable, OnPlayClickListener onPlayClickListener) {
- if (draggable) {
- if (onPlayClickListener == null) {
- throw new IllegalArgumentException(
- "if draggable == true, onPlayClickListener must not be null");
- }
- mOnPlayClickListener = onPlayClickListener;
- } else {
- mOnPlayClickListener = null;
+ public LrcView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
}
- }
- /**
- * 设置播放按钮点击监听器
- *
- * @param onPlayClickListener 如果为非 null ,则激活歌词拖动功能,否则将将禁用歌词拖动功能
- * @deprecated use {@link #setDraggable(boolean, OnPlayClickListener)} instead
- */
- @Deprecated
- public void setOnPlayClickListener(OnPlayClickListener onPlayClickListener) {
- mOnPlayClickListener = onPlayClickListener;
- }
+ public LrcView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(attrs);
+ }
- /** 设置歌词为空时屏幕中央显示的文字,如“暂无歌词” */
- public void setLabel(String label) {
- runOnUi(
- () -> {
- mDefaultLabel = label;
- invalidate();
- });
- }
-
- /**
- * 加载歌词文件
- *
- * @param lrcFile 歌词文件
- */
- public void loadLrc(File lrcFile) {
- loadLrc(lrcFile, null);
- }
-
- /**
- * 加载双语歌词文件,两种语言的歌词时间戳需要一致
- *
- * @param mainLrcFile 第一种语言歌词文件
- * @param secondLrcFile 第二种语言歌词文件
- */
- public void loadLrc(File mainLrcFile, File secondLrcFile) {
- runOnUi(
- () -> {
- reset();
-
- StringBuilder sb = new StringBuilder("file://");
- sb.append(mainLrcFile.getPath());
- if (secondLrcFile != null) {
- sb.append("#").append(secondLrcFile.getPath());
- }
- String flag = sb.toString();
- setFlag(flag);
- new AsyncTask>() {
- @Override
- protected List doInBackground(File... params) {
- return LrcUtils.parseLrc(params);
- }
-
- @Override
- protected void onPostExecute(List lrcEntries) {
- if (getFlag() == flag) {
- onLrcLoaded(lrcEntries);
- setFlag(null);
- }
- }
- }.execute(mainLrcFile, secondLrcFile);
- });
- }
-
- /**
- * 加载歌词文本
- *
- * @param lrcText 歌词文本
- */
- public void loadLrc(String lrcText) {
- loadLrc(lrcText, null);
- }
-
- /**
- * 加载双语歌词文本,两种语言的歌词时间戳需要一致
- *
- * @param mainLrcText 第一种语言歌词文本
- * @param secondLrcText 第二种语言歌词文本
- */
- public void loadLrc(String mainLrcText, String secondLrcText) {
- runOnUi(
- () -> {
- reset();
-
- StringBuilder sb = new StringBuilder("file://");
- sb.append(mainLrcText);
- if (secondLrcText != null) {
- sb.append("#").append(secondLrcText);
- }
- String flag = sb.toString();
- setFlag(flag);
- new AsyncTask>() {
- @Override
- protected List doInBackground(String... params) {
- return LrcUtils.parseLrc(params);
- }
-
- @Override
- protected void onPostExecute(List lrcEntries) {
- if (getFlag() == flag) {
- onLrcLoaded(lrcEntries);
- setFlag(null);
- }
- }
- }.execute(mainLrcText, secondLrcText);
- });
- }
-
- /**
- * 加载在线歌词,默认使用 utf-8 编码
- *
- * @param lrcUrl 歌词文件的网络地址
- */
- public void loadLrcByUrl(String lrcUrl) {
- loadLrcByUrl(lrcUrl, "utf-8");
- }
-
- /**
- * 加载在线歌词
- *
- * @param lrcUrl 歌词文件的网络地址
- * @param charset 编码格式
- */
- public void loadLrcByUrl(String lrcUrl, String charset) {
- String flag = "url://" + lrcUrl;
- setFlag(flag);
- new AsyncTask() {
- @Override
- protected String doInBackground(String... params) {
- return LrcUtils.getContentFromNetwork(params[0], params[1]);
- }
-
- @Override
- protected void onPostExecute(String lrcText) {
- if (getFlag() == flag) {
- loadLrc(lrcText);
+ private void init(AttributeSet attrs) {
+ TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.LrcView);
+ mCurrentTextSize =
+ ta.getDimension(
+ R.styleable.LrcView_lrcTextSize, getResources().getDimension(R.dimen.lrc_text_size));
+ mNormalTextSize =
+ ta.getDimension(
+ R.styleable.LrcView_lrcNormalTextSize,
+ getResources().getDimension(R.dimen.lrc_text_size));
+ if (mNormalTextSize == 0) {
+ mNormalTextSize = mCurrentTextSize;
}
- }
- }.execute(lrcUrl, charset);
- }
- /**
- * 歌词是否有效
- *
- * @return true,如果歌词有效,否则false
- */
- public boolean hasLrc() {
- return !mLrcEntryList.isEmpty();
- }
+ mDividerHeight =
+ ta.getDimension(
+ R.styleable.LrcView_lrcDividerHeight,
+ getResources().getDimension(R.dimen.lrc_divider_height));
+ int defDuration = getResources().getInteger(R.integer.lrc_animation_duration);
+ mAnimationDuration = ta.getInt(R.styleable.LrcView_lrcAnimationDuration, defDuration);
+ mAnimationDuration = (mAnimationDuration < 0) ? defDuration : mAnimationDuration;
+ mNormalTextColor =
+ ta.getColor(
+ R.styleable.LrcView_lrcNormalTextColor,
+ getResources().getColor(R.color.lrc_normal_text_color));
+ mCurrentTextColor =
+ ta.getColor(
+ R.styleable.LrcView_lrcCurrentTextColor,
+ getResources().getColor(R.color.lrc_current_text_color));
+ mTimelineTextColor =
+ ta.getColor(
+ R.styleable.LrcView_lrcTimelineTextColor,
+ getResources().getColor(R.color.lrc_timeline_text_color));
+ mDefaultLabel = ta.getString(R.styleable.LrcView_lrcLabel);
+ mDefaultLabel =
+ TextUtils.isEmpty(mDefaultLabel) ? getContext().getString(R.string.empty) : mDefaultLabel;
+ mLrcPadding = ta.getDimension(R.styleable.LrcView_lrcPadding, 0);
+ mTimelineColor =
+ ta.getColor(
+ R.styleable.LrcView_lrcTimelineColor,
+ getResources().getColor(R.color.lrc_timeline_color));
+ float timelineHeight =
+ ta.getDimension(
+ R.styleable.LrcView_lrcTimelineHeight,
+ getResources().getDimension(R.dimen.lrc_timeline_height));
+ mPlayDrawable = ta.getDrawable(R.styleable.LrcView_lrcPlayDrawable);
+ mPlayDrawable =
+ (mPlayDrawable == null)
+ ? ContextCompat.getDrawable(getContext(), R.drawable.ic_play_arrow)
+ : mPlayDrawable;
+ mTimeTextColor =
+ ta.getColor(
+ R.styleable.LrcView_lrcTimeTextColor,
+ getResources().getColor(R.color.lrc_time_text_color));
+ float timeTextSize =
+ ta.getDimension(
+ R.styleable.LrcView_lrcTimeTextSize,
+ getResources().getDimension(R.dimen.lrc_time_text_size));
+ mTextGravity = ta.getInteger(R.styleable.LrcView_lrcTextGravity, LrcEntry.GRAVITY_CENTER);
- /**
- * 刷新歌词
- *
- * @param time 当前播放时间
- */
- public void updateTime(long time) {
- runOnUi(
- () -> {
- if (!hasLrc()) {
- return;
- }
+ ta.recycle();
- int line = findShowLine(time);
- if (line != mCurrentLine) {
- mCurrentLine = line;
- if (!isShowTimeline) {
- smoothScrollTo(line);
- } else {
- invalidate();
- }
- }
- });
- }
+ mDrawableWidth = (int) getResources().getDimension(R.dimen.lrc_drawable_width);
+ mTimeTextWidth = (int) getResources().getDimension(R.dimen.lrc_time_width);
- /**
- * 将歌词滚动到指定时间
- *
- * @param time 指定的时间
- * @deprecated 请使用 {@link #updateTime(long)} 代替
- */
- @Deprecated
- public void onDrag(long time) {
- updateTime(time);
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- if (changed) {
- initPlayDrawable();
- initEntryList();
- if (hasLrc()) {
- smoothScrollTo(mCurrentLine, 0L);
- }
- }
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- int centerY = getHeight() / 2;
-
- // 无歌词文件
- if (!hasLrc()) {
- mLrcPaint.setColor(mCurrentTextColor);
- @SuppressLint("DrawAllocation")
- StaticLayout staticLayout =
- new StaticLayout(
- mDefaultLabel,
- mLrcPaint,
- (int) getLrcWidth(),
- Layout.Alignment.ALIGN_CENTER,
- 1f,
- 0f,
- false);
- drawText(canvas, staticLayout, centerY);
- return;
- }
-
- int centerLine = getCenterLine();
-
- if (isShowTimeline) {
- mPlayDrawable.draw(canvas);
-
- mTimePaint.setColor(mTimelineColor);
- canvas.drawLine(mTimeTextWidth, centerY, getWidth() - mTimeTextWidth, centerY, mTimePaint);
-
- mTimePaint.setColor(mTimeTextColor);
- String timeText = LrcUtils.formatTime(mLrcEntryList.get(centerLine).getTime());
- float timeX = getWidth() - mTimeTextWidth / 2;
- float timeY = centerY - (mTimeFontMetrics.descent + mTimeFontMetrics.ascent) / 2;
- canvas.drawText(timeText, timeX, timeY, mTimePaint);
- }
-
- canvas.translate(0, mOffset);
-
- float y = 0;
- for (int i = 0; i < mLrcEntryList.size(); i++) {
- if (i > 0) {
- y +=
- ((mLrcEntryList.get(i - 1).getHeight() + mLrcEntryList.get(i).getHeight()) >> 1)
- + mDividerHeight;
- }
- if (BuildConfig.DEBUG) {
- // mLrcPaint.setTypeface(ResourcesCompat.getFont(getContext(), R.font.sans));
- }
- if (i == mCurrentLine) {
+ mLrcPaint.setAntiAlias(true);
mLrcPaint.setTextSize(mCurrentTextSize);
- mLrcPaint.setColor(mCurrentTextColor);
- } else if (isShowTimeline && i == centerLine) {
- mLrcPaint.setColor(mTimelineTextColor);
- } else {
- mLrcPaint.setTextSize(mNormalTextSize);
- mLrcPaint.setColor(mNormalTextColor);
- }
- drawText(canvas, mLrcEntryList.get(i).getStaticLayout(), y);
- }
- }
+ mLrcPaint.setTextAlign(Paint.Align.LEFT);
+ mTimePaint.setAntiAlias(true);
+ mTimePaint.setTextSize(timeTextSize);
+ mTimePaint.setTextAlign(Paint.Align.CENTER);
+ //noinspection SuspiciousNameCombination
+ mTimePaint.setStrokeWidth(timelineHeight);
+ mTimePaint.setStrokeCap(Paint.Cap.ROUND);
+ mTimeFontMetrics = mTimePaint.getFontMetrics();
- /**
- * 画一行歌词
- *
- * @param y 歌词中心 Y 坐标
- */
- private void drawText(Canvas canvas, StaticLayout staticLayout, float y) {
- canvas.save();
- canvas.translate(mLrcPadding, y - (staticLayout.getHeight() >> 1));
- staticLayout.draw(canvas);
- canvas.restore();
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_UP
- || event.getAction() == MotionEvent.ACTION_CANCEL) {
- isTouching = false;
- if (hasLrc() && !isFling) {
- adjustCenter();
- postDelayed(hideTimelineRunnable, TIMELINE_KEEP_TIME);
- }
- }
- return mGestureDetector.onTouchEvent(event);
- }
-
- @Override
- public void computeScroll() {
- if (mScroller.computeScrollOffset()) {
- mOffset = mScroller.getCurrY();
- invalidate();
+ mGestureDetector = new GestureDetector(getContext(), mSimpleOnGestureListener);
+ mGestureDetector.setIsLongpressEnabled(false);
+ mScroller = new Scroller(getContext());
}
- if (isFling && mScroller.isFinished()) {
- isFling = false;
- if (hasLrc() && !isTouching) {
- adjustCenter();
- postDelayed(hideTimelineRunnable, TIMELINE_KEEP_TIME);
- }
- }
- }
-
- @Override
- protected void onDetachedFromWindow() {
- removeCallbacks(hideTimelineRunnable);
- super.onDetachedFromWindow();
- }
-
- private void onLrcLoaded(List entryList) {
- if (entryList != null && !entryList.isEmpty()) {
- mLrcEntryList.addAll(entryList);
+ public void setCurrentColor(int currentColor) {
+ mCurrentTextColor = currentColor;
+ postInvalidate();
}
- Collections.sort(mLrcEntryList);
-
- initEntryList();
- invalidate();
- }
-
- private void initPlayDrawable() {
- int l = (mTimeTextWidth - mDrawableWidth) / 2;
- int t = getHeight() / 2 - mDrawableWidth / 2;
- int r = l + mDrawableWidth;
- int b = t + mDrawableWidth;
- mPlayDrawable.setBounds(l, t, r, b);
- }
-
- private void initEntryList() {
- if (!hasLrc() || getWidth() == 0) {
- return;
+ public void setTimelineTextColor(int timelineTextColor) {
+ mTimelineTextColor = timelineTextColor;
+ postInvalidate();
}
- for (LrcEntry lrcEntry : mLrcEntryList) {
- lrcEntry.init(mLrcPaint, (int) getLrcWidth(), mTextGravity);
+ public void setTimelineColor(int timelineColor) {
+ mTimelineColor = timelineColor;
+ postInvalidate();
}
- mOffset = getHeight() / 2;
- }
- private void reset() {
- endAnimation();
- mScroller.forceFinished(true);
- isShowTimeline = false;
- isTouching = false;
- isFling = false;
- removeCallbacks(hideTimelineRunnable);
- mLrcEntryList.clear();
- mOffset = 0;
- mCurrentLine = 0;
- invalidate();
- }
+ public void setTimeTextColor(int timeTextColor) {
+ mTimeTextColor = timeTextColor;
+ postInvalidate();
+ }
- /** 将中心行微调至正中心 */
- private void adjustCenter() {
- smoothScrollTo(getCenterLine(), ADJUST_DURATION);
- }
- /** 滚动到某一行 */
- private void smoothScrollTo(int line) {
- smoothScrollTo(line, mAnimationDuration);
- }
+ public void setDraggable(boolean draggable, OnPlayClickListener onPlayClickListener) {
+ if (draggable) {
+ if (onPlayClickListener == null) {
+ throw new IllegalArgumentException(
+ "if draggable == true, onPlayClickListener must not be null");
+ }
+ mOnPlayClickListener = onPlayClickListener;
+ } else {
+ mOnPlayClickListener = null;
+ }
+ }
- /** 滚动到某一行 */
- private void smoothScrollTo(int line, long duration) {
- float offset = getOffset(line);
- endAnimation();
+ public void setLabel(String label) {
+ runOnUi(
+ () -> {
+ mDefaultLabel = label;
+ invalidate();
+ });
+ }
- mAnimator = ValueAnimator.ofFloat(mOffset, offset);
- mAnimator.setDuration(duration);
- mAnimator.setInterpolator(new LinearInterpolator());
- mAnimator.addUpdateListener(
- animation -> {
- mOffset = (float) animation.getAnimatedValue();
- invalidate();
+ public void loadLrc(File lrcFile) {
+ loadLrc(lrcFile, null);
+ }
+
+ public void loadLrc(File mainLrcFile, File secondLrcFile) {
+ runOnUi(() -> {
+ reset();
+
+ StringBuilder sb = new StringBuilder("file://");
+ sb.append(mainLrcFile.getPath());
+ if (secondLrcFile != null) {
+ sb.append("#").append(secondLrcFile.getPath());
+ }
+ String flag = sb.toString();
+ setFlag(flag);
+ new AsyncTask>() {
+ @Override
+ protected List doInBackground(File... params) {
+ return LrcUtils.parseLrc(params);
+ }
+
+ @Override
+ protected void onPostExecute(List lrcEntries) {
+ if (getFlag() == flag) {
+ onLrcLoaded(lrcEntries);
+ setFlag(null);
+ }
+ }
+ }.execute(mainLrcFile, secondLrcFile);
});
- LrcUtils.resetDurationScale();
- mAnimator.start();
- }
-
- /** 结束滚动动画 */
- private void endAnimation() {
- if (mAnimator != null && mAnimator.isRunning()) {
- mAnimator.end();
}
- }
- /** 二分法查找当前时间应该显示的行数(最后一个 <= time 的行数) */
- private int findShowLine(long time) {
- int left = 0;
- int right = mLrcEntryList.size();
- while (left <= right) {
- int middle = (left + right) / 2;
- long middleTime = mLrcEntryList.get(middle).getTime();
+ public void loadLrc(String lrcText) {
+ loadLrc(lrcText, null);
+ }
- if (time < middleTime) {
- right = middle - 1;
- } else {
- if (middle + 1 >= mLrcEntryList.size() || time < mLrcEntryList.get(middle + 1).getTime()) {
- return middle;
+ public void loadLrc(String mainLrcText, String secondLrcText) {
+ runOnUi(
+ () -> {
+ reset();
+
+ StringBuilder sb = new StringBuilder("file://");
+ sb.append(mainLrcText);
+ if (secondLrcText != null) {
+ sb.append("#").append(secondLrcText);
+ }
+ String flag = sb.toString();
+ setFlag(flag);
+ new AsyncTask>() {
+ @Override
+ protected List doInBackground(String... params) {
+ return LrcUtils.parseLrc(params);
+ }
+
+ @Override
+ protected void onPostExecute(List lrcEntries) {
+ if (getFlag() == flag) {
+ onLrcLoaded(lrcEntries);
+ setFlag(null);
+ }
+ }
+ }.execute(mainLrcText, secondLrcText);
+ });
+ }
+
+ public boolean hasLrc() {
+ return !mLrcEntryList.isEmpty();
+ }
+
+ public void updateTime(long time) {
+ runOnUi(
+ () -> {
+ if (!hasLrc()) {
+ return;
+ }
+
+ int line = findShowLine(time);
+ if (line != mCurrentLine) {
+ mCurrentLine = line;
+ if (!isShowTimeline) {
+ smoothScrollTo(line);
+ } else {
+ invalidate();
+ }
+ }
+ });
+ }
+
+ @Deprecated
+ public void onDrag(long time) {
+ updateTime(time);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ if (changed) {
+ initPlayDrawable();
+ initEntryList();
+ if (hasLrc()) {
+ smoothScrollTo(mCurrentLine, 0L);
+ }
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ int centerY = getHeight() / 2;
+
+ if (!hasLrc()) {
+ mLrcPaint.setColor(mCurrentTextColor);
+ @SuppressLint("DrawAllocation")
+ StaticLayout staticLayout =
+ new StaticLayout(
+ mDefaultLabel,
+ mLrcPaint,
+ (int) getLrcWidth(),
+ Layout.Alignment.ALIGN_CENTER,
+ 1f,
+ 0f,
+ false);
+ drawText(canvas, staticLayout, centerY);
+ return;
}
- left = middle + 1;
- }
+ int centerLine = getCenterLine();
+
+ if (isShowTimeline) {
+ mPlayDrawable.draw(canvas);
+
+ mTimePaint.setColor(mTimelineColor);
+ canvas.drawLine(mTimeTextWidth, centerY, getWidth() - mTimeTextWidth, centerY, mTimePaint);
+
+ mTimePaint.setColor(mTimeTextColor);
+ String timeText = LrcUtils.formatTime(mLrcEntryList.get(centerLine).getTime());
+ float timeX = getWidth() - mTimeTextWidth / 2F;
+ float timeY = centerY - (mTimeFontMetrics.descent + mTimeFontMetrics.ascent) / 2;
+ canvas.drawText(timeText, timeX, timeY, mTimePaint);
+ }
+
+ canvas.translate(0, mOffset);
+
+ float y = 0;
+ for (int i = 0; i < mLrcEntryList.size(); i++) {
+ if (i > 0) {
+ y +=
+ ((mLrcEntryList.get(i - 1).getHeight() + mLrcEntryList.get(i).getHeight()) >> 1)
+ + mDividerHeight;
+ }
+ if (BuildConfig.DEBUG) {
+ // mLrcPaint.setTypeface(ResourcesCompat.getFont(getContext(), R.font.sans));
+ }
+ if (i == mCurrentLine) {
+ mLrcPaint.setTextSize(mCurrentTextSize);
+ mLrcPaint.setColor(mCurrentTextColor);
+ } else if (isShowTimeline && i == centerLine) {
+ mLrcPaint.setColor(mTimelineTextColor);
+ } else {
+ mLrcPaint.setTextSize(mNormalTextSize);
+ mLrcPaint.setColor(mNormalTextColor);
+ }
+ drawText(canvas, mLrcEntryList.get(i).getStaticLayout(), y);
+ }
}
- return 0;
- }
-
- /** 获取当前在视图中央的行数 */
- private int getCenterLine() {
- int centerLine = 0;
- float minDistance = Float.MAX_VALUE;
- for (int i = 0; i < mLrcEntryList.size(); i++) {
- if (Math.abs(mOffset - getOffset(i)) < minDistance) {
- minDistance = Math.abs(mOffset - getOffset(i));
- centerLine = i;
- }
- }
- return centerLine;
- }
-
- /** 获取歌词距离视图顶部的距离 采用懒加载方式 */
- private float getOffset(int line) {
- if (mLrcEntryList.get(line).getOffset() == Float.MIN_VALUE) {
- float offset = getHeight() / 2;
- for (int i = 1; i <= line; i++) {
- offset -=
- ((mLrcEntryList.get(i - 1).getHeight() + mLrcEntryList.get(i).getHeight()) >> 1)
- + mDividerHeight;
- }
- mLrcEntryList.get(line).setOffset(offset);
+ private void drawText(Canvas canvas, StaticLayout staticLayout, float y) {
+ canvas.save();
+ canvas.translate(mLrcPadding, y - (staticLayout.getHeight() >> 1));
+ staticLayout.draw(canvas);
+ canvas.restore();
}
- return mLrcEntryList.get(line).getOffset();
- }
-
- /** 获取歌词宽度 */
- private float getLrcWidth() {
- return getWidth() - mLrcPadding * 2;
- }
-
- /** 在主线程中运行 */
- private void runOnUi(Runnable r) {
- if (Looper.myLooper() == Looper.getMainLooper()) {
- r.run();
- } else {
- post(r);
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_UP
+ || event.getAction() == MotionEvent.ACTION_CANCEL) {
+ isTouching = false;
+ if (hasLrc() && !isFling) {
+ adjustCenter();
+ postDelayed(hideTimelineRunnable, TIMELINE_KEEP_TIME);
+ }
+ }
+ return mGestureDetector.onTouchEvent(event);
}
- }
- private Object getFlag() {
- return mFlag;
- }
+ @Override
+ public void computeScroll() {
+ if (mScroller.computeScrollOffset()) {
+ mOffset = mScroller.getCurrY();
+ invalidate();
+ }
- private void setFlag(Object flag) {
- this.mFlag = flag;
- }
+ if (isFling && mScroller.isFinished()) {
+ isFling = false;
+ if (hasLrc() && !isTouching) {
+ adjustCenter();
+ postDelayed(hideTimelineRunnable, TIMELINE_KEEP_TIME);
+ }
+ }
+ }
- /** 播放按钮点击监听器,点击后应该跳转到指定播放位置 */
- public interface OnPlayClickListener {
- /**
- * 播放按钮被点击,应该跳转到指定播放位置
- *
- * @return 是否成功消费该事件,如果成功消费,则会更新UI
- */
- boolean onPlayClick(long time);
- }
+ @Override
+ protected void onDetachedFromWindow() {
+ removeCallbacks(hideTimelineRunnable);
+ super.onDetachedFromWindow();
+ }
+
+ private void onLrcLoaded(List entryList) {
+ if (entryList != null && !entryList.isEmpty()) {
+ mLrcEntryList.addAll(entryList);
+ }
+
+ Collections.sort(mLrcEntryList);
+
+ initEntryList();
+ invalidate();
+ }
+
+ private void initPlayDrawable() {
+ int l = (mTimeTextWidth - mDrawableWidth) / 2;
+ int t = getHeight() / 2 - mDrawableWidth / 2;
+ int r = l + mDrawableWidth;
+ int b = t + mDrawableWidth;
+ mPlayDrawable.setBounds(l, t, r, b);
+ }
+
+ private void initEntryList() {
+ if (!hasLrc() || getWidth() == 0) {
+ return;
+ }
+
+ for (LrcEntry lrcEntry : mLrcEntryList) {
+ lrcEntry.init(mLrcPaint, (int) getLrcWidth(), mTextGravity);
+ }
+
+ mOffset = getHeight() / 2F;
+ }
+
+ private void reset() {
+ endAnimation();
+ mScroller.forceFinished(true);
+ isShowTimeline = false;
+ isTouching = false;
+ isFling = false;
+ removeCallbacks(hideTimelineRunnable);
+ mLrcEntryList.clear();
+ mOffset = 0;
+ mCurrentLine = 0;
+ //invalidate();
+ }
+
+ private void adjustCenter() {
+ smoothScrollTo(getCenterLine(), ADJUST_DURATION);
+ }
+
+ private void smoothScrollTo(int line) {
+ smoothScrollTo(line, mAnimationDuration);
+ }
+
+ private void smoothScrollTo(int line, long duration) {
+ float offset = getOffset(line);
+ endAnimation();
+
+ mAnimator = ValueAnimator.ofFloat(mOffset, offset);
+ mAnimator.setDuration(duration);
+ mAnimator.setInterpolator(new LinearInterpolator());
+ mAnimator.addUpdateListener(
+ animation -> {
+ mOffset = (float) animation.getAnimatedValue();
+ invalidate();
+ });
+ mAnimator.start();
+ }
+
+ private void endAnimation() {
+ if (mAnimator != null && mAnimator.isRunning()) {
+ mAnimator.end();
+ }
+ }
+
+ private int findShowLine(long time) {
+ int left = 0;
+ int right = mLrcEntryList.size();
+ while (left <= right) {
+ int middle = (left + right) / 2;
+ long middleTime = mLrcEntryList.get(middle).getTime();
+
+ if (time < middleTime) {
+ right = middle - 1;
+ } else {
+ if (middle + 1 >= mLrcEntryList.size() || time < mLrcEntryList.get(middle + 1).getTime()) {
+ return middle;
+ }
+
+ left = middle + 1;
+ }
+ }
+
+ return 0;
+ }
+
+ private int getCenterLine() {
+ int centerLine = 0;
+ float minDistance = Float.MAX_VALUE;
+ for (int i = 0; i < mLrcEntryList.size(); i++) {
+ if (Math.abs(mOffset - getOffset(i)) < minDistance) {
+ minDistance = Math.abs(mOffset - getOffset(i));
+ centerLine = i;
+ }
+ }
+ return centerLine;
+ }
+
+ private float getOffset(int line) {
+ if (mLrcEntryList.get(line).getOffset() == Float.MIN_VALUE) {
+ float offset = getHeight() / 2F;
+ for (int i = 1; i <= line; i++) {
+ offset -=
+ ((mLrcEntryList.get(i - 1).getHeight() + mLrcEntryList.get(i).getHeight()) >> 1)
+ + mDividerHeight;
+ }
+ mLrcEntryList.get(line).setOffset(offset);
+ }
+
+ return mLrcEntryList.get(line).getOffset();
+ }
+
+ private float getLrcWidth() {
+ return getWidth() - mLrcPadding * 2;
+ }
+
+ private void runOnUi(Runnable r) {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ r.run();
+ } else {
+ post(r);
+ }
+ }
+
+ private Object getFlag() {
+ return mFlag;
+ }
+
+ private void setFlag(Object flag) {
+ this.mFlag = flag;
+ }
+
+ public interface OnPlayClickListener {
+ boolean onPlayClick(long time);
+ }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/misc/GenericFileProvider.java b/app/src/main/java/code/name/monkey/retromusic/misc/GenericFileProvider.java
deleted file mode 100644
index 61a0a80a5..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/misc/GenericFileProvider.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by
- * the Free Software Foundation either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- */
-
-package code.name.monkey.retromusic.misc;
-
-import androidx.core.content.FileProvider;
-
-public class GenericFileProvider extends FileProvider {}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.kt b/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.kt
index 78e6a1966..19218e9c3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/model/CategoryInfo.kt
@@ -22,7 +22,6 @@ import kotlinx.parcelize.Parcelize
@Parcelize
data class CategoryInfo(
val category: Category,
- @get:JvmName("isVisible")
var visible: Boolean
) : Parcelable {
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/NotPlayedPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/NotPlayedPlaylist.kt
index f77565daf..a6786ac78 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/NotPlayedPlaylist.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/NotPlayedPlaylist.kt
@@ -8,7 +8,7 @@ import kotlinx.parcelize.Parcelize
@Parcelize
class NotPlayedPlaylist : AbsSmartPlaylist(
name = App.getContext().getString(R.string.not_recently_played),
- iconRes = R.drawable.ic_watch_later
+ iconRes = R.drawable.ic_audiotrack
) {
override fun songs(): List {
return topPlayedRepository.notRecentlyPlayedTracks()
diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt
index 2a9e899e7..15e95fedc 100644
--- a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt
@@ -23,9 +23,7 @@ import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat.SRC_IN
import androidx.core.text.parseAsHtml
import androidx.fragment.app.DialogFragment
-import androidx.fragment.app.FragmentActivity
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEDialogPreference
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.BlacklistFolderChooserDialog
import code.name.monkey.retromusic.extensions.accentTextColor
@@ -33,6 +31,7 @@ import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.colorControlNormal
import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.providers.BlacklistStore
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.io.File
class BlacklistPreference @JvmOverloads constructor(
@@ -53,21 +52,18 @@ class BlacklistPreference @JvmOverloads constructor(
class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog.FolderCallback {
companion object {
- private var mContext: Context? = null
- private var mActivity: FragmentActivity? = null
-
fun newInstance(): BlacklistPreferenceDialog {
return BlacklistPreferenceDialog()
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- mContext = requireContext()
- mActivity = requireActivity()
val chooserDialog =
childFragmentManager.findFragmentByTag("FOLDER_CHOOSER") as BlacklistFolderChooserDialog?
chooserDialog?.setCallback(this)
- refreshBlacklistData()
+ val context = requireActivity()
+
+ refreshBlacklistData(context)
return materialDialog(R.string.blacklist)
.setPositiveButton(R.string.done) { _, _ ->
dismiss()
@@ -75,7 +71,9 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog
.setNeutralButton(R.string.clear_action) { _, _ ->
materialDialog(R.string.clear_blacklist)
.setMessage(R.string.do_you_want_to_clear_the_blacklist)
- .setPositiveButton(R.string.clear_action, null)
+ .setPositiveButton(R.string.clear_action) { _, _ ->
+ BlacklistStore.getInstance(context).clear()
+ }
.setNegativeButton(android.R.string.cancel, null)
.create()
.colorButtons()
@@ -84,7 +82,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog
.setNegativeButton(R.string.add_action) { _, _ ->
val dialog = BlacklistFolderChooserDialog.create()
dialog.setCallback(this@BlacklistPreferenceDialog)
- dialog.show(mActivity!!.supportFragmentManager, "FOLDER_CHOOSER")
+ dialog.show(requireActivity().supportFragmentManager, "FOLDER_CHOOSER")
}
.setItems(paths.toTypedArray()) { _, which ->
materialDialog(R.string.remove_from_blacklist)
@@ -95,9 +93,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog
).parseAsHtml()
)
.setPositiveButton(R.string.remove_action) { _, _ ->
- BlacklistStore.getInstance(mContext!!)
- .removePath(File(paths[which]))
- refreshBlacklistData()
+ BlacklistStore.getInstance(context).removePath(File(paths[which]))
}
.setNegativeButton(android.R.string.cancel, null)
.create()
@@ -108,21 +104,16 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog
setOnShowListener {
getButton(AlertDialog.BUTTON_POSITIVE).accentTextColor()
getButton(AlertDialog.BUTTON_NEGATIVE).accentTextColor()
- getButton(AlertDialog.BUTTON_NEUTRAL).apply {
- accentTextColor()
- setOnClickListener {
- BlacklistStore.getInstance(mContext!!).clear()
- dismiss()
- }
- }
+ getButton(AlertDialog.BUTTON_NEUTRAL).accentTextColor()
}
}
}
private lateinit var paths: ArrayList
- private fun refreshBlacklistData() {
- this.paths = BlacklistStore.getInstance(requireContext()).paths
+ private fun refreshBlacklistData(context: Context?) {
+ if (context == null) return
+ this.paths = BlacklistStore.getInstance(context).paths
val dialog = dialog as MaterialAlertDialogBuilder?
dialog?.setItems(paths.toTypedArray(), null)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt
index deaf35551..16603b6af 100644
--- a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt
@@ -54,7 +54,7 @@ class LibraryPreferenceDialog : DialogFragment() {
val categoryAdapter = CategoryInfoAdapter()
binding.recyclerView.apply {
- layoutManager = LinearLayoutManager(activity)
+ layoutManager = LinearLayoutManager(requireContext())
adapter = categoryAdapter
categoryAdapter.attachToRecyclerView(this)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
index 52e62db27..541d98cba 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
@@ -72,9 +72,11 @@ class RealAlbumRepository(private val songRepository: RealSongRepository) :
// We don't need sorted list of songs (with sortAlbumSongs())
// cuz we are just displaying Albums(Cover Arts) anyway and not songs
fun splitIntoAlbums(
- songs: List
+ songs: List,
+ sorted: Boolean = true
): List {
val grouped = songs.groupBy { it.albumId }.map { Album(it.key, it.value) }
+ if (!sorted) return grouped
val collator = Collator.getInstance()
return when (PreferenceUtil.albumSortOrder) {
SortOrder.AlbumSortOrder.ALBUM_A_Z -> {
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/LastAddedSongsRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/LastAddedSongsRepository.kt
index 153eb3752..dae6854c7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/LastAddedSongsRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/LastAddedSongsRepository.kt
@@ -42,7 +42,7 @@ class RealLastAddedRepository(
}
override fun recentAlbums(): List {
- return albumRepository.splitIntoAlbums(recentSongs())
+ return albumRepository.splitIntoAlbums(recentSongs(), sorted = false)
}
override fun recentArtists(): List {
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt
index 895939328..7d5f9d0fa 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt
@@ -16,15 +16,18 @@ package code.name.monkey.retromusic.repository
import android.content.Context
import androidx.lifecycle.LiveData
-import androidx.lifecycle.Transformations
+import androidx.lifecycle.map
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.db.*
-import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.fragments.search.Filter
+import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.model.smartplaylist.NotPlayedPlaylist
-import code.name.monkey.retromusic.util.PreferenceUtil
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
interface Repository {
+
fun historySong(): List
fun favorites(): LiveData>
fun observableHistorySongs(): LiveData>
@@ -51,7 +54,6 @@ interface Repository {
suspend fun topAlbumsHome(): Home
suspend fun recentAlbumsHome(): Home
suspend fun favoritePlaylistHome(): Home
- suspend fun suggestionsHome(): Home
suspend fun suggestions(): List
suspend fun genresHome(): Home
suspend fun playlists(): Home
@@ -84,7 +86,6 @@ interface Repository {
suspend fun clearSongHistory()
suspend fun checkSongExistInPlayCount(songId: Long): List
suspend fun playCountSongs(): List
- suspend fun blackListPaths(): List
suspend fun deleteSongs(songs: List)
suspend fun searchArtists(query: String): List
suspend fun searchSongs(query: String): List
@@ -92,6 +93,7 @@ interface Repository {
suspend fun isSongFavorite(songId: Long): Boolean
fun getSongByGenre(genreId: Long): Song
fun checkPlaylistExists(playListId: Long): LiveData
+ fun getPlaylist(playlistId: Long): LiveData
}
class RealRepository(
@@ -107,7 +109,6 @@ class RealRepository(
private val roomRepository: RoomRepository,
) : Repository {
-
override suspend fun deleteSongs(songs: List) = roomRepository.deleteSongs(songs)
override suspend fun searchSongs(query: String): List = songRepository.songs(query)
@@ -187,6 +188,8 @@ class RealRepository(
override suspend fun fetchPlaylistWithSongs(): List =
roomRepository.playlistWithSongs()
+ override fun getPlaylist(playlistId: Long): LiveData = roomRepository.getPlaylist(playlistId)
+
override suspend fun playlistSongs(playlistWithSongs: PlaylistWithSongs): List =
playlistWithSongs.songs.map {
it.toSong()
@@ -268,11 +271,8 @@ class RealRepository(
override suspend fun playCountSongs(): List