commit
74b317e159
116 changed files with 1069 additions and 647 deletions
|
@ -1,11 +1,11 @@
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlin-kapt'
|
|
||||||
apply plugin: "androidx.navigation.safeargs.kotlin"
|
apply plugin: "androidx.navigation.safeargs.kotlin"
|
||||||
apply plugin: 'kotlin-parcelize'
|
apply plugin: 'kotlin-parcelize'
|
||||||
|
apply plugin: 'com.google.devtools.ksp'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdk 32
|
compileSdk 33
|
||||||
namespace "code.name.monkey.retromusic"
|
namespace "code.name.monkey.retromusic"
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
@ -15,8 +15,8 @@ android {
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
|
|
||||||
applicationId namespace
|
applicationId namespace
|
||||||
versionCode 10597
|
versionCode 10600
|
||||||
versionName '6.0.2-beta'
|
versionName '6.0.4'
|
||||||
|
|
||||||
buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"")
|
buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"")
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ android {
|
||||||
versionNameSuffix ' DEBUG'
|
versionNameSuffix ' DEBUG'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flavorDimensions "version"
|
flavorDimensions = ["version"]
|
||||||
productFlavors {
|
productFlavors {
|
||||||
normal {
|
normal {
|
||||||
dimension "version"
|
dimension "version"
|
||||||
|
@ -78,7 +78,7 @@ android {
|
||||||
includeInApk = false
|
includeInApk = false
|
||||||
includeInBundle = false
|
includeInBundle = false
|
||||||
}
|
}
|
||||||
configurations.all {
|
configurations.configureEach {
|
||||||
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
|
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,16 +103,16 @@ dependencies {
|
||||||
implementation "androidx.gridlayout:gridlayout:1.0.0"
|
implementation "androidx.gridlayout:gridlayout:1.0.0"
|
||||||
|
|
||||||
implementation "androidx.appcompat:appcompat:$appcompat_version"
|
implementation "androidx.appcompat:appcompat:$appcompat_version"
|
||||||
implementation 'androidx.annotation:annotation:1.4.0'
|
implementation 'androidx.annotation:annotation:1.6.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
implementation 'androidx.recyclerview:recyclerview:1.2.1'
|
implementation 'androidx.recyclerview:recyclerview:1.3.0'
|
||||||
implementation "androidx.preference:preference-ktx:$preference_version"
|
implementation "androidx.preference:preference-ktx:$preference_version"
|
||||||
implementation "androidx.core:core-ktx:$core_version"
|
implementation "androidx.core:core-ktx:$core_version"
|
||||||
implementation 'androidx.palette:palette-ktx:1.0.0'
|
implementation 'androidx.palette:palette-ktx:1.0.0'
|
||||||
|
|
||||||
implementation 'androidx.mediarouter:mediarouter:1.3.1'
|
implementation 'androidx.mediarouter:mediarouter:1.3.1'
|
||||||
//Cast Dependencies
|
//Cast Dependencies
|
||||||
normalImplementation 'com.google.android.gms:play-services-cast-framework:21.1.0'
|
normalImplementation 'com.google.android.gms:play-services-cast-framework:21.2.0'
|
||||||
//WebServer by NanoHttpd
|
//WebServer by NanoHttpd
|
||||||
normalImplementation "org.nanohttpd:nanohttpd:2.3.1"
|
normalImplementation "org.nanohttpd:nanohttpd:2.3.1"
|
||||||
|
|
||||||
|
@ -120,10 +120,10 @@ dependencies {
|
||||||
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
|
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
|
||||||
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
|
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
|
||||||
|
|
||||||
def room_version = '2.5.0-alpha02'
|
def room_version = '2.5.0'
|
||||||
implementation "androidx.room:room-runtime:$room_version"
|
implementation "androidx.room:room-runtime:$room_version"
|
||||||
implementation "androidx.room:room-ktx:$room_version"
|
implementation "androidx.room:room-ktx:$room_version"
|
||||||
kapt "androidx.room:room-compiler:$room_version"
|
ksp "androidx.room:room-compiler:$room_version"
|
||||||
|
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
|
||||||
|
@ -131,8 +131,8 @@ dependencies {
|
||||||
|
|
||||||
implementation "androidx.core:core-splashscreen:1.0.0"
|
implementation "androidx.core:core-splashscreen:1.0.0"
|
||||||
|
|
||||||
normalImplementation 'com.google.android.play:feature-delivery:2.0.0'
|
normalImplementation 'com.google.android.play:feature-delivery:2.0.1'
|
||||||
normalImplementation 'com.google.android.play:review:2.0.0'
|
normalImplementation 'com.google.android.play:review:2.0.1'
|
||||||
|
|
||||||
implementation "com.google.android.material:material:$mdc_version"
|
implementation "com.google.android.material:material:$mdc_version"
|
||||||
|
|
||||||
|
@ -150,13 +150,13 @@ dependencies {
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
||||||
|
|
||||||
def koin_version = '3.2.0'
|
def koin_version = '3.3.3'
|
||||||
implementation "io.insert-koin:koin-core:$koin_version"
|
implementation "io.insert-koin:koin-core:$koin_version"
|
||||||
implementation "io.insert-koin:koin-android:$koin_version"
|
implementation "io.insert-koin:koin-android:$koin_version"
|
||||||
|
|
||||||
def glide_version = '4.13.2'
|
def glide_version = '4.15.0'
|
||||||
implementation "com.github.bumptech.glide:glide:$glide_version"
|
implementation "com.github.bumptech.glide:glide:$glide_version"
|
||||||
kapt "com.github.bumptech.glide:compiler:$glide_version"
|
ksp "com.github.bumptech.glide:ksp:$glide_version"
|
||||||
implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
|
implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
|
||||||
|
|
||||||
implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0'
|
implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0'
|
||||||
|
@ -174,7 +174,7 @@ dependencies {
|
||||||
implementation 'com.r0adkll:slidableactivity:2.1.0'
|
implementation 'com.r0adkll:slidableactivity:2.1.0'
|
||||||
implementation 'com.heinrichreimersoftware:material-intro:2.0.0'
|
implementation 'com.heinrichreimersoftware:material-intro:2.0.0'
|
||||||
implementation 'com.github.dhaval2404:imagepicker:2.1'
|
implementation 'com.github.dhaval2404:imagepicker:2.1'
|
||||||
implementation 'me.zhanghai.android.fastscroll:library:1.1.8'
|
implementation 'me.zhanghai.android.fastscroll:library:1.2.0'
|
||||||
implementation 'cat.ereza:customactivityoncrash:2.4.0'
|
implementation 'cat.ereza:customactivityoncrash:2.4.0'
|
||||||
implementation 'me.tankery.lib:circularSeekBar:1.4.1'
|
implementation 'me.tankery.lib:circularSeekBar:1.4.1'
|
||||||
}
|
}
|
|
@ -62,6 +62,31 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<div>
|
||||||
|
<h3>Looking for maintainers/contributors</h3>
|
||||||
|
<p>
|
||||||
|
We are currently seeking maintainers/contributors to help us continue developing and
|
||||||
|
improving our project. If you want to contribute your skills and expertise, you can visit our Github
|
||||||
|
<a style="color: lightblue;" href="https://github.com/RetroMusicPlayer/RetroMusicPlayer">here</a>, pull requests are welcome.
|
||||||
|
The app heavily relies on Kotlin.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h5>March 13, 2023</h5>
|
||||||
|
<h2>v6.0.4</h2>
|
||||||
|
<h3>What's New</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Minor redesign in Playlist details screen</li>
|
||||||
|
<li>Updated translations</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Fixed</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed file popup menu actions in Folders tab</li>
|
||||||
|
<li>Fixed playlist image loading</li>
|
||||||
|
<li>Fixed blurry album art in Android 13</li>
|
||||||
|
<li>Minor bug fixes and improvements</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h5>July 10, 2022</h5>
|
<h5>July 10, 2022</h5>
|
||||||
<h2>v6.0.3<span class="tag"><i>Beta</i></span></h2>
|
<h2>v6.0.3<span class="tag"><i>Beta</i></span></h2>
|
||||||
|
|
|
@ -168,10 +168,10 @@ private val viewModules = module {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
viewModel { (playlist: PlaylistWithSongs) ->
|
viewModel { (playlistId: Long) ->
|
||||||
PlaylistDetailsViewModel(
|
PlaylistDetailsViewModel(
|
||||||
get(),
|
get(),
|
||||||
playlist
|
playlistId
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@ import code.name.monkey.retromusic.db.toSongEntity
|
||||||
import code.name.monkey.retromusic.extensions.accentColor
|
import code.name.monkey.retromusic.extensions.accentColor
|
||||||
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
|
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
|
||||||
import code.name.monkey.retromusic.glide.BlurTransformation
|
import code.name.monkey.retromusic.glide.BlurTransformation
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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
|
||||||
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
||||||
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
|
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
|
||||||
|
@ -36,6 +36,7 @@ import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.repository.RealRepository
|
import code.name.monkey.retromusic.repository.RealRepository
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.google.android.material.slider.Slider
|
import com.google.android.material.slider.Slider
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -64,7 +65,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
|
||||||
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
|
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
|
||||||
lastPlaybackControlsColor = accentColor()
|
lastPlaybackControlsColor = accentColor()
|
||||||
binding.close.setOnClickListener {
|
binding.close.setOnClickListener {
|
||||||
onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
}
|
}
|
||||||
binding.repeatButton.drawAboveSystemBars()
|
binding.repeatButton.drawAboveSystemBars()
|
||||||
}
|
}
|
||||||
|
@ -185,6 +186,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
|
||||||
lastPlaybackControlsColor,
|
lastPlaybackControlsColor,
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
)
|
)
|
||||||
|
|
||||||
else -> binding.shuffleButton.setColorFilter(
|
else -> binding.shuffleButton.setColorFilter(
|
||||||
lastDisabledPlaybackControlsColor,
|
lastDisabledPlaybackControlsColor,
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
|
@ -201,6 +203,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
MusicService.REPEAT_MODE_ALL -> {
|
MusicService.REPEAT_MODE_ALL -> {
|
||||||
binding.repeatButton.setImageResource(R.drawable.ic_repeat)
|
binding.repeatButton.setImageResource(R.drawable.ic_repeat)
|
||||||
binding.repeatButton.setColorFilter(
|
binding.repeatButton.setColorFilter(
|
||||||
|
@ -208,6 +211,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
MusicService.REPEAT_MODE_THIS -> {
|
MusicService.REPEAT_MODE_THIS -> {
|
||||||
binding.repeatButton.setImageResource(R.drawable.ic_repeat_one)
|
binding.repeatButton.setImageResource(R.drawable.ic_repeat_one)
|
||||||
binding.repeatButton.setColorFilter(
|
binding.repeatButton.setColorFilter(
|
||||||
|
@ -235,7 +239,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
|
||||||
binding.songTitle.text = song.title
|
binding.songTitle.text = song.title
|
||||||
binding.songText.text = song.artistName
|
binding.songText.text = song.artistName
|
||||||
|
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.songCoverOptions(song)
|
.songCoverOptions(song)
|
||||||
.transform(BlurTransformation.Builder(this).build())
|
.transform(BlurTransformation.Builder(this).build())
|
||||||
|
|
|
@ -77,7 +77,7 @@ class LicenseActivity : AbsThemeActivity() {
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
if (item.itemId == android.R.id.home) {
|
if (item.itemId == android.R.id.home) {
|
||||||
onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
||||||
|
|
|
@ -26,11 +26,13 @@ import code.name.monkey.retromusic.extensions.hideStatusBar
|
||||||
import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
|
import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
|
||||||
import code.name.monkey.retromusic.extensions.whichFragment
|
import code.name.monkey.retromusic.extensions.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.lockscreen.LockScreenControlsFragment
|
import code.name.monkey.retromusic.fragments.player.lockscreen.LockScreenControlsFragment
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.r0adkll.slidr.Slidr
|
import com.r0adkll.slidr.Slidr
|
||||||
import com.r0adkll.slidr.model.SlidrConfig
|
import com.r0adkll.slidr.model.SlidrConfig
|
||||||
import com.r0adkll.slidr.model.SlidrListener
|
import com.r0adkll.slidr.model.SlidrListener
|
||||||
|
@ -105,7 +107,7 @@ class LockScreenActivity : AbsMusicServiceActivity() {
|
||||||
|
|
||||||
private fun updateSongs() {
|
private fun updateSongs() {
|
||||||
val song = MusicPlayerRemote.currentSong
|
val song = MusicPlayerRemote.currentSong
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.asBitmapPalette()
|
.asBitmapPalette()
|
||||||
.songCoverOptions(song)
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
|
|
|
@ -22,6 +22,7 @@ import android.content.res.ColorStateList
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
|
@ -61,9 +62,11 @@ class PermissionActivity : AbsMusicServiceActivity() {
|
||||||
if (VersionUtils.hasS()) {
|
if (VersionUtils.hasS()) {
|
||||||
binding.bluetoothPermission.show()
|
binding.bluetoothPermission.show()
|
||||||
binding.bluetoothPermission.setButtonClick {
|
binding.bluetoothPermission.setButtonClick {
|
||||||
ActivityCompat.requestPermissions(this,
|
ActivityCompat.requestPermissions(
|
||||||
|
this,
|
||||||
arrayOf(BLUETOOTH_CONNECT),
|
arrayOf(BLUETOOTH_CONNECT),
|
||||||
BLUETOOTH_PERMISSION_REQUEST)
|
BLUETOOTH_PERMISSION_REQUEST
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
binding.audioPermission.setNumber("2")
|
binding.audioPermission.setNumber("2")
|
||||||
|
@ -81,14 +84,22 @@ class PermissionActivity : AbsMusicServiceActivity() {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
|
||||||
|
override fun handleOnBackPressed() {
|
||||||
|
finishAffinity()
|
||||||
|
remove()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupTitle() {
|
private fun setupTitle() {
|
||||||
val color = accentColor()
|
val color = accentColor()
|
||||||
val hexColor = String.format("#%06X", 0xFFFFFF and color)
|
val hexColor = String.format("#%06X", 0xFFFFFF and color)
|
||||||
val appName =
|
val appName =
|
||||||
getString(R.string.message_welcome,
|
getString(
|
||||||
"<b>Retro <span style='color:$hexColor';>Music</span></b>")
|
R.string.message_welcome,
|
||||||
|
"<b>Retro <span style='color:$hexColor';>Music</span></b>"
|
||||||
|
)
|
||||||
.parseAsHtml()
|
.parseAsHtml()
|
||||||
binding.appNameText.text = appName
|
binding.appNameText.text = appName
|
||||||
}
|
}
|
||||||
|
@ -118,23 +129,22 @@ class PermissionActivity : AbsMusicServiceActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hasStoragePermission(): Boolean {
|
private fun hasStoragePermission(): Boolean {
|
||||||
return ActivityCompat.checkSelfPermission(this,
|
return ActivityCompat.checkSelfPermission(
|
||||||
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
|
this,
|
||||||
|
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||||
|
) == PackageManager.PERMISSION_GRANTED
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(Build.VERSION_CODES.S)
|
@RequiresApi(Build.VERSION_CODES.S)
|
||||||
private fun hasBluetoothPermission(): Boolean {
|
private fun hasBluetoothPermission(): Boolean {
|
||||||
return ActivityCompat.checkSelfPermission(this,
|
return ActivityCompat.checkSelfPermission(
|
||||||
BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
|
this,
|
||||||
|
BLUETOOTH_CONNECT
|
||||||
|
) == PackageManager.PERMISSION_GRANTED
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(Build.VERSION_CODES.M)
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
private fun hasAudioPermission(): Boolean {
|
private fun hasAudioPermission(): Boolean {
|
||||||
return Settings.System.canWrite(this)
|
return Settings.System.canWrite(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
|
||||||
super.onBackPressed()
|
|
||||||
finishAffinity()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,20 +22,22 @@ import android.os.Bundle
|
||||||
import android.provider.MediaStore.Images.Media
|
import android.provider.MediaStore.Images.Media
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import androidx.core.view.drawToBitmap
|
import androidx.core.view.drawToBitmap
|
||||||
import code.name.monkey.appthemehelper.util.ColorUtil
|
import code.name.monkey.appthemehelper.util.ColorUtil
|
||||||
import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
||||||
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
|
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
|
||||||
import code.name.monkey.retromusic.databinding.ActivityShareInstagramBinding
|
import code.name.monkey.retromusic.databinding.ActivityShareInstagramBinding
|
||||||
import code.name.monkey.retromusic.extensions.accentColor
|
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.extensions.setStatusBarColor
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.Share
|
import code.name.monkey.retromusic.util.Share
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by hemanths on 2020-02-02.
|
* Created by hemanths on 2020-02-02.
|
||||||
|
@ -51,7 +53,7 @@ class ShareInstagramStory : AbsThemeActivity() {
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
if (item.itemId == android.R.id.home) {
|
if (item.itemId == android.R.id.home) {
|
||||||
onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
||||||
|
@ -66,16 +68,15 @@ class ShareInstagramStory : AbsThemeActivity() {
|
||||||
binding.toolbar.setBackgroundColor(Color.TRANSPARENT)
|
binding.toolbar.setBackgroundColor(Color.TRANSPARENT)
|
||||||
setSupportActionBar(binding.toolbar)
|
setSupportActionBar(binding.toolbar)
|
||||||
|
|
||||||
val song = intent.extras?.getParcelable<Song>(EXTRA_SONG)
|
val song = intent.extras?.let { BundleCompat.getParcelable(it, EXTRA_SONG, Song::class.java) }
|
||||||
song?.let { songFinal ->
|
song?.let { songFinal ->
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.asBitmapPalette()
|
.asBitmapPalette()
|
||||||
.songCoverOptions(songFinal)
|
.songCoverOptions(songFinal)
|
||||||
.load(RetroGlideExtension.getSongModel(songFinal))
|
.load(RetroGlideExtension.getSongModel(songFinal))
|
||||||
.into(object : RetroMusicColoredTarget(binding.image) {
|
.into(object : RetroMusicColoredTarget(binding.image) {
|
||||||
override fun onColorReady(colors: MediaNotificationProcessor) {
|
override fun onColorReady(colors: MediaNotificationProcessor) {
|
||||||
val isColorLight = ColorUtil.isColorLight(colors.backgroundColor)
|
setColors(colors.backgroundColor)
|
||||||
setColors(isColorLight, colors.backgroundColor)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -103,22 +104,7 @@ class ShareInstagramStory : AbsThemeActivity() {
|
||||||
ColorStateList.valueOf(accentColor())
|
ColorStateList.valueOf(accentColor())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setColors(colorLight: Boolean, color: Int) {
|
private fun setColors(color: Int) {
|
||||||
setLightStatusBar(colorLight)
|
|
||||||
binding.toolbar.setTitleTextColor(
|
|
||||||
MaterialValueHelper.getPrimaryTextColor(
|
|
||||||
this@ShareInstagramStory,
|
|
||||||
colorLight
|
|
||||||
)
|
|
||||||
)
|
|
||||||
binding.toolbar.navigationIcon?.setTintList(
|
|
||||||
ColorStateList.valueOf(
|
|
||||||
MaterialValueHelper.getPrimaryTextColor(
|
|
||||||
this@ShareInstagramStory,
|
|
||||||
colorLight
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
binding.mainContent.background =
|
binding.mainContent.background =
|
||||||
GradientDrawable(
|
GradientDrawable(
|
||||||
GradientDrawable.Orientation.TOP_BOTTOM,
|
GradientDrawable.Orientation.TOP_BOTTOM,
|
||||||
|
|
|
@ -30,7 +30,7 @@ class SupportDevelopmentActivity : AbsThemeActivity() {
|
||||||
lateinit var binding: ActivityDonationBinding
|
lateinit var binding: ActivityDonationBinding
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
if (item.itemId == android.R.id.home) {
|
if (item.itemId == android.R.id.home) {
|
||||||
onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
||||||
|
|
|
@ -1,12 +1,17 @@
|
||||||
package code.name.monkey.retromusic.activities
|
package code.name.monkey.retromusic.activities
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
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.content.pm.PackageInfoCompat
|
||||||
import androidx.core.widget.NestedScrollView
|
import androidx.core.widget.NestedScrollView
|
||||||
import androidx.fragment.app.FragmentActivity
|
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 code.name.monkey.retromusic.util.PreferenceUtil.lastVersion
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
|
|
||||||
class WhatsNewFragment : BottomSheetDialogFragment() {
|
class WhatsNewFragment : BottomSheetDialogFragment() {
|
||||||
private var _binding: FragmentWhatsNewBinding? = null
|
private var _binding: FragmentWhatsNewBinding? = null
|
||||||
|
@ -76,6 +81,17 @@ class WhatsNewFragment : BottomSheetDialogFragment() {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
binding.webView.loadData(changeLog, "text/html", "UTF-8")
|
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) {
|
} catch (e: Throwable) {
|
||||||
binding.webView.loadData(
|
binding.webView.loadData(
|
||||||
"<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8"
|
"<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8"
|
||||||
|
|
|
@ -26,6 +26,7 @@ import android.view.ViewGroup
|
||||||
import android.view.ViewTreeObserver
|
import android.view.ViewTreeObserver
|
||||||
import android.view.animation.PathInterpolator
|
import android.view.animation.PathInterpolator
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.core.animation.doOnEnd
|
import androidx.core.animation.doOnEnd
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
|
@ -33,10 +34,44 @@ import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
import code.name.monkey.retromusic.*
|
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.activities.PermissionActivity
|
||||||
import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
|
import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
import code.name.monkey.retromusic.extensions.currentFragment
|
||||||
|
import code.name.monkey.retromusic.extensions.darkAccentColor
|
||||||
|
import code.name.monkey.retromusic.extensions.dip
|
||||||
|
import code.name.monkey.retromusic.extensions.getBottomInsets
|
||||||
|
import code.name.monkey.retromusic.extensions.hide
|
||||||
|
import code.name.monkey.retromusic.extensions.isColorLight
|
||||||
|
import code.name.monkey.retromusic.extensions.isLandscape
|
||||||
|
import code.name.monkey.retromusic.extensions.keepScreenOn
|
||||||
|
import code.name.monkey.retromusic.extensions.maybeSetScreenOn
|
||||||
|
import code.name.monkey.retromusic.extensions.peekHeightAnimate
|
||||||
|
import code.name.monkey.retromusic.extensions.setLightNavigationBar
|
||||||
|
import code.name.monkey.retromusic.extensions.setLightNavigationBarAuto
|
||||||
|
import code.name.monkey.retromusic.extensions.setLightStatusBar
|
||||||
|
import code.name.monkey.retromusic.extensions.setLightStatusBarAuto
|
||||||
|
import code.name.monkey.retromusic.extensions.setNavigationBarColorPreOreo
|
||||||
|
import code.name.monkey.retromusic.extensions.setTaskDescriptionColor
|
||||||
|
import code.name.monkey.retromusic.extensions.show
|
||||||
|
import code.name.monkey.retromusic.extensions.surfaceColor
|
||||||
|
import code.name.monkey.retromusic.extensions.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.fragments.NowPlayingScreen
|
import code.name.monkey.retromusic.fragments.NowPlayingScreen
|
||||||
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
|
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
|
||||||
|
@ -68,7 +103,13 @@ import code.name.monkey.retromusic.util.ViewUtil
|
||||||
import code.name.monkey.retromusic.util.logD
|
import code.name.monkey.retromusic.util.logD
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
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.*
|
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
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,21 +161,25 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
keepScreenOn(true)
|
keepScreenOn(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATE_COLLAPSED -> {
|
STATE_COLLAPSED -> {
|
||||||
onPanelCollapsed()
|
onPanelCollapsed()
|
||||||
if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) {
|
if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) {
|
||||||
keepScreenOn(false)
|
keepScreenOn(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATE_SETTLING, STATE_DRAGGING -> {
|
STATE_SETTLING, STATE_DRAGGING -> {
|
||||||
if (fromNotification) {
|
if (fromNotification) {
|
||||||
binding.navigationView.bringToFront()
|
binding.navigationView.bringToFront()
|
||||||
fromNotification = false
|
fromNotification = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATE_HIDDEN -> {
|
STATE_HIDDEN -> {
|
||||||
MusicPlayerRemote.clearQueue()
|
MusicPlayerRemote.clearQueue()
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
logD("Do a flip")
|
logD("Do a flip")
|
||||||
}
|
}
|
||||||
|
@ -173,6 +218,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
bottomSheetBehavior = from(binding.slidingPanel)
|
bottomSheetBehavior = from(binding.slidingPanel)
|
||||||
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
|
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
|
||||||
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
|
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
|
||||||
|
bottomSheetBehavior.significantVelocityThreshold = 300
|
||||||
setMiniPlayerAlphaProgress(0F)
|
setMiniPlayerAlphaProgress(0F)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,6 +231,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
if (bottomSheetBehavior.state == STATE_EXPANDED) {
|
if (bottomSheetBehavior.state == STATE_EXPANDED) {
|
||||||
setMiniPlayerAlphaProgress(1f)
|
setMiniPlayerAlphaProgress(1f)
|
||||||
}
|
}
|
||||||
|
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
|
||||||
|
override fun handleOnBackPressed() {
|
||||||
|
if (!handleBackPress()) {
|
||||||
|
remove()
|
||||||
|
onBackPressedDispatcher.onBackPressed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
@ -198,9 +252,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
SWIPE_DOWN_DISMISS -> {
|
SWIPE_DOWN_DISMISS -> {
|
||||||
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
|
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
|
||||||
}
|
}
|
||||||
|
|
||||||
TOGGLE_ADD_CONTROLS -> {
|
TOGGLE_ADD_CONTROLS -> {
|
||||||
miniPlayerFragment?.setUpButtons()
|
miniPlayerFragment?.setUpButtons()
|
||||||
}
|
}
|
||||||
|
|
||||||
NOW_PLAYING_SCREEN_ID -> {
|
NOW_PLAYING_SCREEN_ID -> {
|
||||||
chooseFragmentForTheme()
|
chooseFragmentForTheme()
|
||||||
binding.slidingPanel.updateLayoutParams<ViewGroup.LayoutParams> {
|
binding.slidingPanel.updateLayoutParams<ViewGroup.LayoutParams> {
|
||||||
|
@ -212,33 +268,41 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
onServiceConnected()
|
onServiceConnected()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ALBUM_COVER_TRANSFORM, CAROUSEL_EFFECT,
|
ALBUM_COVER_TRANSFORM, CAROUSEL_EFFECT,
|
||||||
ALBUM_COVER_STYLE, TOGGLE_VOLUME, EXTRA_SONG_INFO, CIRCLE_PLAY_BUTTON,
|
ALBUM_COVER_STYLE, TOGGLE_VOLUME, EXTRA_SONG_INFO, CIRCLE_PLAY_BUTTON,
|
||||||
-> {
|
-> {
|
||||||
chooseFragmentForTheme()
|
chooseFragmentForTheme()
|
||||||
onServiceConnected()
|
onServiceConnected()
|
||||||
}
|
}
|
||||||
|
|
||||||
SWIPE_ANYWHERE_NOW_PLAYING -> {
|
SWIPE_ANYWHERE_NOW_PLAYING -> {
|
||||||
playerFragment.addSwipeDetector()
|
playerFragment.addSwipeDetector()
|
||||||
}
|
}
|
||||||
|
|
||||||
ADAPTIVE_COLOR_APP -> {
|
ADAPTIVE_COLOR_APP -> {
|
||||||
if (PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)) {
|
if (PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)) {
|
||||||
chooseFragmentForTheme()
|
chooseFragmentForTheme()
|
||||||
onServiceConnected()
|
onServiceConnected()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBRARY_CATEGORIES -> {
|
LIBRARY_CATEGORIES -> {
|
||||||
updateTabs()
|
updateTabs()
|
||||||
}
|
}
|
||||||
|
|
||||||
TAB_TEXT_MODE -> {
|
TAB_TEXT_MODE -> {
|
||||||
navigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode
|
navigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode
|
||||||
}
|
}
|
||||||
|
|
||||||
TOGGLE_FULL_SCREEN -> {
|
TOGGLE_FULL_SCREEN -> {
|
||||||
recreate()
|
recreate()
|
||||||
}
|
}
|
||||||
|
|
||||||
SCREEN_ON_LYRICS -> {
|
SCREEN_ON_LYRICS -> {
|
||||||
keepScreenOn(bottomSheetBehavior.state == STATE_EXPANDED && PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics || PreferenceUtil.isScreenOnEnabled)
|
keepScreenOn(bottomSheetBehavior.state == STATE_EXPANDED && PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics || PreferenceUtil.isScreenOnEnabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
KEEP_SCREEN_ON -> {
|
KEEP_SCREEN_ON -> {
|
||||||
maybeSetScreenOn()
|
maybeSetScreenOn()
|
||||||
}
|
}
|
||||||
|
@ -338,10 +402,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
|
||||||
if (!handleBackPress()) super.onBackPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
private fun handleBackPress(): Boolean {
|
||||||
if (bottomSheetBehavior.peekHeight != 0 && playerFragment.onBackPressed()) return true
|
if (bottomSheetBehavior.peekHeight != 0 && playerFragment.onBackPressed()) return true
|
||||||
if (panelState == STATE_EXPANDED) {
|
if (panelState == STATE_EXPANDED) {
|
||||||
|
@ -475,8 +535,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
|
||||||
} else {
|
} else {
|
||||||
bottomSheetBehavior.peekHeight = heightOfBarWithTabs
|
bottomSheetBehavior.peekHeight = heightOfBarWithTabs
|
||||||
}
|
}
|
||||||
libraryViewModel.setFabMargin(this,
|
libraryViewModel.setFabMargin(
|
||||||
dip(R.dimen.bottom_nav_mini_player_height))
|
this,
|
||||||
|
dip(R.dimen.bottom_nav_mini_player_height)
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
logD("Details")
|
logD("Details")
|
||||||
if (animate) {
|
if (animate) {
|
||||||
|
|
|
@ -79,7 +79,7 @@ open class BugReportActivity : AbsThemeActivity() {
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
if (item.itemId == android.R.id.home) {
|
if (item.itemId == android.R.id.home) {
|
||||||
onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ import org.jaudiotagger.audio.AudioFileIO
|
||||||
import org.jaudiotagger.tag.FieldKey
|
import org.jaudiotagger.tag.FieldKey
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.Collections
|
||||||
|
|
||||||
abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
abstract val editorImage: ImageView
|
abstract val editorImage: ImageView
|
||||||
|
@ -307,7 +307,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
android.R.id.home -> {
|
android.R.id.home -> {
|
||||||
super.onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -409,15 +409,18 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
loadImageFromFile(it)
|
loadImageFromFile(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
|
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
|
||||||
SAFUtil.openTreePicker(this)
|
SAFUtil.openTreePicker(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFUtil.REQUEST_SAF_PICK_TREE -> {
|
SAFUtil.REQUEST_SAF_PICK_TREE -> {
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
SAFUtil.saveTreeUri(this, intent)
|
SAFUtil.saveTreeUri(this, intent)
|
||||||
writeTags(savedSongPaths)
|
writeTags(savedSongPaths)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFUtil.REQUEST_SAF_PICK_FILE -> {
|
SAFUtil.REQUEST_SAF_PICK_FILE -> {
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString))
|
writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString))
|
||||||
|
|
|
@ -30,8 +30,12 @@ import androidx.core.widget.doAfterTextChanged
|
||||||
import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
|
import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
import code.name.monkey.retromusic.extensions.appHandleColor
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.model.ArtworkInfo
|
import code.name.monkey.retromusic.model.ArtworkInfo
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
|
@ -40,12 +44,13 @@ import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette
|
import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil.getColor
|
import code.name.monkey.retromusic.util.RetroColorUtil.getColor
|
||||||
import code.name.monkey.retromusic.util.logD
|
import code.name.monkey.retromusic.util.logD
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.bumptech.glide.request.target.ImageViewTarget
|
import com.bumptech.glide.request.target.ImageViewTarget
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import org.jaudiotagger.tag.FieldKey
|
import org.jaudiotagger.tag.FieldKey
|
||||||
import java.util.*
|
import java.util.EnumMap
|
||||||
|
|
||||||
class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBinding>() {
|
class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBinding>() {
|
||||||
|
|
||||||
|
@ -132,7 +137,9 @@ class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBindin
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun loadImageFromFile(selectedFile: Uri?) {
|
override fun loadImageFromFile(selectedFile: Uri?) {
|
||||||
GlideApp.with(this@AlbumTagEditorActivity).asBitmapPalette().load(selectedFile)
|
Glide.with(this@AlbumTagEditorActivity)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.load(selectedFile)
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
|
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
|
||||||
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
|
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
|
||||||
override fun onResourceReady(
|
override fun onResourceReady(
|
||||||
|
|
|
@ -31,7 +31,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding
|
import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.model.ArtworkInfo
|
import code.name.monkey.retromusic.model.ArtworkInfo
|
||||||
import code.name.monkey.retromusic.repository.SongRepository
|
import code.name.monkey.retromusic.repository.SongRepository
|
||||||
|
@ -39,6 +39,7 @@ import code.name.monkey.retromusic.util.ImageUtil
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
import code.name.monkey.retromusic.util.RetroColorUtil
|
||||||
import code.name.monkey.retromusic.util.logD
|
import code.name.monkey.retromusic.util.logD
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.bumptech.glide.request.target.ImageViewTarget
|
import com.bumptech.glide.request.target.ImageViewTarget
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
|
@ -171,8 +172,11 @@ class SongTagEditorActivity : AbsTagEditorActivity<ActivitySongTagEditorBinding>
|
||||||
override fun getSongUris(): List<Uri> = listOf(MusicUtil.getSongFileUri(id))
|
override fun getSongUris(): List<Uri> = listOf(MusicUtil.getSongFileUri(id))
|
||||||
|
|
||||||
override fun loadImageFromFile(selectedFile: Uri?) {
|
override fun loadImageFromFile(selectedFile: Uri?) {
|
||||||
GlideApp.with(this@SongTagEditorActivity).asBitmapPalette().load(selectedFile)
|
Glide.with(this@SongTagEditorActivity)
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
|
.asBitmapPalette()
|
||||||
|
.load(selectedFile)
|
||||||
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||||
|
.skipMemoryCache(true)
|
||||||
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
|
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
|
||||||
override fun onResourceReady(
|
override fun onResourceReady(
|
||||||
resource: BitmapPaletteWrapper,
|
resource: BitmapPaletteWrapper,
|
||||||
|
|
|
@ -23,13 +23,15 @@ import androidx.fragment.app.FragmentActivity
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.databinding.ItemGenreBinding
|
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
|
||||||
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.interfaces.IGenreClickListener
|
import code.name.monkey.retromusic.interfaces.IGenreClickListener
|
||||||
import code.name.monkey.retromusic.model.Genre
|
import code.name.monkey.retromusic.model.Genre
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -68,10 +70,10 @@ class GenreAdapter(
|
||||||
|
|
||||||
private fun loadGenreImage(genre: Genre, holder: GenreAdapter.ViewHolder) {
|
private fun loadGenreImage(genre: Genre, holder: GenreAdapter.ViewHolder) {
|
||||||
val genreSong = MusicUtil.songByGenre(genre.id)
|
val genreSong = MusicUtil.songByGenre(genre.id)
|
||||||
GlideApp.with(activity)
|
Glide.with(activity)
|
||||||
.asBitmapPalette()
|
.asBitmapPalette()
|
||||||
.load(RetroGlideExtension.getSongModel(genreSong))
|
|
||||||
.songCoverOptions(genreSong)
|
.songCoverOptions(genreSong)
|
||||||
|
.load(RetroGlideExtension.getSongModel(genreSong))
|
||||||
.into(object : RetroMusicColoredTarget(holder.binding.image) {
|
.into(object : RetroMusicColoredTarget(holder.binding.image) {
|
||||||
override fun onColorReady(colors: MediaNotificationProcessor) {
|
override fun onColorReady(colors: MediaNotificationProcessor) {
|
||||||
setColors(holder, colors)
|
setColors(holder, colors)
|
||||||
|
|
|
@ -29,8 +29,10 @@ import code.name.monkey.appthemehelper.ThemeStore
|
||||||
import code.name.monkey.retromusic.*
|
import code.name.monkey.retromusic.*
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
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
|
||||||
|
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.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
|
@ -38,6 +40,7 @@ import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.model.Genre
|
import code.name.monkey.retromusic.model.Genre
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class SearchAdapter(
|
class SearchAdapter(
|
||||||
|
@ -68,6 +71,7 @@ class SearchAdapter(
|
||||||
false
|
false
|
||||||
), viewType
|
), viewType
|
||||||
)
|
)
|
||||||
|
|
||||||
ALBUM, ARTIST, ALBUM_ARTIST -> ViewHolder(
|
ALBUM, ARTIST, ALBUM_ARTIST -> ViewHolder(
|
||||||
LayoutInflater.from(activity).inflate(
|
LayoutInflater.from(activity).inflate(
|
||||||
R.layout.item_list_big,
|
R.layout.item_list_big,
|
||||||
|
@ -75,6 +79,7 @@ class SearchAdapter(
|
||||||
false
|
false
|
||||||
), viewType
|
), viewType
|
||||||
)
|
)
|
||||||
|
|
||||||
else -> ViewHolder(
|
else -> ViewHolder(
|
||||||
LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false),
|
LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false),
|
||||||
viewType
|
viewType
|
||||||
|
@ -89,24 +94,30 @@ class SearchAdapter(
|
||||||
val album = dataSet[position] as Album
|
val album = dataSet[position] as Album
|
||||||
holder.title?.text = album.title
|
holder.title?.text = album.title
|
||||||
holder.text?.text = album.artistName
|
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!!)
|
.into(holder.image!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
ARTIST -> {
|
ARTIST -> {
|
||||||
holder.imageTextContainer?.isVisible = true
|
holder.imageTextContainer?.isVisible = true
|
||||||
val artist = dataSet[position] as Artist
|
val artist = dataSet[position] as Artist
|
||||||
holder.title?.text = artist.name
|
holder.title?.text = artist.name
|
||||||
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
|
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
|
||||||
GlideApp.with(activity).asDrawable().artistImageOptions(artist).load(
|
Glide.with(activity).asDrawable().artistImageOptions(artist).load(
|
||||||
RetroGlideExtension.getArtistModel(artist)).into(holder.image!!)
|
RetroGlideExtension.getArtistModel(artist)
|
||||||
|
).into(holder.image!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
SONG -> {
|
SONG -> {
|
||||||
holder.imageTextContainer?.isVisible = true
|
holder.imageTextContainer?.isVisible = true
|
||||||
val song = dataSet[position] as Song
|
val song = dataSet[position] as Song
|
||||||
holder.title?.text = song.title
|
holder.title?.text = song.title
|
||||||
holder.text?.text = song.albumName
|
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 -> {
|
GENRE -> {
|
||||||
val genre = dataSet[position] as Genre
|
val genre = dataSet[position] as Genre
|
||||||
holder.title?.text = genre.name
|
holder.title?.text = genre.name
|
||||||
|
@ -119,19 +130,23 @@ class SearchAdapter(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
PLAYLIST -> {
|
PLAYLIST -> {
|
||||||
val playlist = dataSet[position] as PlaylistWithSongs
|
val playlist = dataSet[position] as PlaylistWithSongs
|
||||||
holder.title?.text = playlist.playlistEntity.playlistName
|
holder.title?.text = playlist.playlistEntity.playlistName
|
||||||
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
|
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
|
||||||
}
|
}
|
||||||
|
|
||||||
ALBUM_ARTIST -> {
|
ALBUM_ARTIST -> {
|
||||||
holder.imageTextContainer?.isVisible = true
|
holder.imageTextContainer?.isVisible = true
|
||||||
val artist = dataSet[position] as Artist
|
val artist = dataSet[position] as Artist
|
||||||
holder.title?.text = artist.name
|
holder.title?.text = artist.name
|
||||||
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
|
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
|
||||||
GlideApp.with(activity).asDrawable().artistImageOptions(artist).load(
|
Glide.with(activity).asDrawable().artistImageOptions(artist).load(
|
||||||
RetroGlideExtension.getArtistModel(artist)).into(holder.image!!)
|
RetroGlideExtension.getArtistModel(artist)
|
||||||
|
).into(holder.image!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
holder.title?.text = dataSet[position].toString()
|
holder.title?.text = dataSet[position].toString()
|
||||||
holder.title?.setTextColor(ThemeStore.accentColor(activity))
|
holder.title?.setTextColor(ThemeStore.accentColor(activity))
|
||||||
|
@ -177,30 +192,35 @@ class SearchAdapter(
|
||||||
bundleOf(EXTRA_ALBUM_ID to (item as Album).id)
|
bundleOf(EXTRA_ALBUM_ID to (item as Album).id)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
ARTIST -> {
|
ARTIST -> {
|
||||||
activity.findNavController(R.id.fragment_container).navigate(
|
activity.findNavController(R.id.fragment_container).navigate(
|
||||||
R.id.artistDetailsFragment,
|
R.id.artistDetailsFragment,
|
||||||
bundleOf(EXTRA_ARTIST_ID to (item as Artist).id)
|
bundleOf(EXTRA_ARTIST_ID to (item as Artist).id)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
ALBUM_ARTIST -> {
|
ALBUM_ARTIST -> {
|
||||||
activity.findNavController(R.id.fragment_container).navigate(
|
activity.findNavController(R.id.fragment_container).navigate(
|
||||||
R.id.albumArtistDetailsFragment,
|
R.id.albumArtistDetailsFragment,
|
||||||
bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name)
|
bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
GENRE -> {
|
GENRE -> {
|
||||||
activity.findNavController(R.id.fragment_container).navigate(
|
activity.findNavController(R.id.fragment_container).navigate(
|
||||||
R.id.genreDetailsFragment,
|
R.id.genreDetailsFragment,
|
||||||
bundleOf(EXTRA_GENRE to (item as Genre))
|
bundleOf(EXTRA_GENRE to (item as Genre))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
PLAYLIST -> {
|
PLAYLIST -> {
|
||||||
activity.findNavController(R.id.fragment_container).navigate(
|
activity.findNavController(R.id.fragment_container).navigate(
|
||||||
R.id.playlistDetailsFragment,
|
R.id.playlistDetailsFragment,
|
||||||
bundleOf(EXTRA_PLAYLIST to (item as PlaylistWithSongs))
|
bundleOf(EXTRA_PLAYLIST_ID to (item as PlaylistWithSongs).playlistEntity.playListId)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
SONG -> {
|
SONG -> {
|
||||||
MusicPlayerRemote.playNext(item as Song)
|
MusicPlayerRemote.playNext(item as Song)
|
||||||
MusicPlayerRemote.playNextSong()
|
MusicPlayerRemote.playNextSong()
|
||||||
|
|
|
@ -26,11 +26,11 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
|
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
|
||||||
import code.name.monkey.retromusic.interfaces.ICallbacks
|
import code.name.monkey.retromusic.interfaces.ICallbacks
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.bumptech.glide.signature.MediaStoreSignature
|
import com.bumptech.glide.signature.MediaStoreSignature
|
||||||
import me.zhanghai.android.fastscroll.PopupTextProvider
|
import me.zhanghai.android.fastscroll.PopupTextProvider
|
||||||
|
@ -109,7 +109,7 @@ class SongFileAdapter(
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val error = activity.getTintedDrawable(R.drawable.ic_audio_file, iconColor)
|
val error = activity.getTintedDrawable(R.drawable.ic_audio_file, iconColor)
|
||||||
GlideApp.with(activity)
|
Glide.with(activity)
|
||||||
.load(AudioFileCover(file.path))
|
.load(AudioFileCover(file.path))
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||||
.error(error)
|
.error(error)
|
||||||
|
|
|
@ -24,8 +24,9 @@ import androidx.fragment.app.FragmentActivity
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
|
@ -35,6 +36,7 @@ import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import me.zhanghai.android.fastscroll.PopupTextProvider
|
import me.zhanghai.android.fastscroll.PopupTextProvider
|
||||||
|
|
||||||
open class AlbumAdapter(
|
open class AlbumAdapter(
|
||||||
|
@ -110,7 +112,9 @@ open class AlbumAdapter(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val song = album.safeGetFirstSong()
|
val song = album.safeGetFirstSong()
|
||||||
GlideApp.with(activity).asBitmapPalette().albumCoverOptions(song)
|
Glide.with(activity)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.albumCoverOptions(song)
|
||||||
//.checkIgnoreMediaStore()
|
//.checkIgnoreMediaStore()
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
|
@ -160,6 +164,7 @@ open class AlbumAdapter(
|
||||||
when (PreferenceUtil.albumSortOrder) {
|
when (PreferenceUtil.albumSortOrder) {
|
||||||
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName =
|
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName =
|
||||||
dataSet[position].title
|
dataSet[position].title
|
||||||
|
|
||||||
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].albumArtist
|
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].albumArtist
|
||||||
SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(
|
SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(
|
||||||
dataSet[position].year
|
dataSet[position].year
|
||||||
|
|
|
@ -19,6 +19,7 @@ import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
|
@ -26,16 +27,24 @@ import androidx.lifecycle.lifecycleScope
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.fragments.AlbumCoverStyle
|
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.fragments.base.goToLyrics
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
|
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
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.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -95,7 +104,7 @@ class AlbumCoverPagerAdapter(
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
if (arguments != null) {
|
if (arguments != null) {
|
||||||
song = requireArguments().getParcelable(SONG_ARG)!!
|
song = BundleCompat.getParcelable(requireArguments(), SONG_ARG, Song::class.java)!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,7 +173,9 @@ class AlbumCoverPagerAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadAlbumCover(albumCover: ImageView) {
|
private fun loadAlbumCover(albumCover: ImageView) {
|
||||||
GlideApp.with(this).asBitmapPalette().songCoverOptions(song)
|
Glide.with(this)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
//.checkIgnoreMediaStore()
|
//.checkIgnoreMediaStore()
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
|
|
|
@ -17,14 +17,16 @@ package code.name.monkey.retromusic.adapter.album
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.FragmentActivity
|
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
|
||||||
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
|
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
|
||||||
class HorizontalAlbumAdapter(
|
class HorizontalAlbumAdapter(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
|
@ -47,7 +49,9 @@ class HorizontalAlbumAdapter(
|
||||||
|
|
||||||
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
|
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
|
||||||
if (holder.image == null) return
|
if (holder.image == null) return
|
||||||
GlideApp.with(activity).asBitmapPalette().albumCoverOptions(album.safeGetFirstSong())
|
Glide.with(activity)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.albumCoverOptions(album.safeGetFirstSong())
|
||||||
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
|
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
override fun onColorReady(colors: MediaNotificationProcessor) {
|
override fun onColorReady(colors: MediaNotificationProcessor) {
|
||||||
|
|
|
@ -27,8 +27,9 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.extensions.hide
|
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
|
||||||
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
|
||||||
|
@ -38,6 +39,7 @@ import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import me.zhanghai.android.fastscroll.PopupTextProvider
|
import me.zhanghai.android.fastscroll.PopupTextProvider
|
||||||
|
|
||||||
class ArtistAdapter(
|
class ArtistAdapter(
|
||||||
|
@ -109,10 +111,10 @@ class ArtistAdapter(
|
||||||
if (holder.image == null) {
|
if (holder.image == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
GlideApp.with(activity)
|
Glide.with(activity)
|
||||||
.asBitmapPalette()
|
.asBitmapPalette()
|
||||||
.load(RetroGlideExtension.getArtistModel(artist))
|
|
||||||
.artistImageOptions(artist)
|
.artistImageOptions(artist)
|
||||||
|
.load(RetroGlideExtension.getArtistModel(artist))
|
||||||
.transition(RetroGlideExtension.getDefaultTransition())
|
.transition(RetroGlideExtension.getDefaultTransition())
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
override fun onColorReady(colors: MediaNotificationProcessor) {
|
override fun onColorReady(colors: MediaNotificationProcessor) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ import code.name.monkey.retromusic.db.PlaylistEntity
|
||||||
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
||||||
import code.name.monkey.retromusic.db.toSongs
|
import code.name.monkey.retromusic.db.toSongs
|
||||||
import code.name.monkey.retromusic.extensions.dipToPix
|
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.glide.playlistPreview.PlaylistPreview
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
|
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
|
||||||
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
||||||
|
@ -42,6 +42,7 @@ import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import me.zhanghai.android.fastscroll.PopupTextProvider
|
import me.zhanghai.android.fastscroll.PopupTextProvider
|
||||||
|
|
||||||
class PlaylistAdapter(
|
class PlaylistAdapter(
|
||||||
|
@ -105,10 +106,8 @@ class PlaylistAdapter(
|
||||||
holder.image?.setPadding(activity.dipToPix(8F).toInt())
|
holder.image?.setPadding(activity.dipToPix(8F).toInt())
|
||||||
holder.image?.setImageDrawable(getIconRes())
|
holder.image?.setImageDrawable(getIconRes())
|
||||||
} else {
|
} else {
|
||||||
GlideApp.with(activity)
|
Glide.with(activity)
|
||||||
.load(
|
.load(PlaylistPreview(playlist))
|
||||||
PlaylistPreview(playlist)
|
|
||||||
)
|
|
||||||
.playlistOptions()
|
.playlistOptions()
|
||||||
.into(holder.image!!)
|
.into(holder.image!!)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,8 @@ import code.name.monkey.retromusic.db.PlaylistEntity
|
||||||
import code.name.monkey.retromusic.db.toSongEntity
|
import code.name.monkey.retromusic.db.toSongEntity
|
||||||
import code.name.monkey.retromusic.db.toSongsEntity
|
import code.name.monkey.retromusic.db.toSongsEntity
|
||||||
import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
|
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.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
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.DraggableItemAdapter
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -37,11 +33,11 @@ import kotlinx.coroutines.launch
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
|
||||||
class OrderablePlaylistSongAdapter(
|
class OrderablePlaylistSongAdapter(
|
||||||
private val playlist: PlaylistEntity,
|
private val playlistId: Long,
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
dataSet: MutableList<Song>,
|
dataSet: MutableList<Song>,
|
||||||
itemLayoutRes: Int,
|
itemLayoutRes: Int,
|
||||||
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes),
|
) : SongAdapter(activity, dataSet, itemLayoutRes),
|
||||||
DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
|
DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
|
||||||
|
|
||||||
val libraryViewModel: LibraryViewModel by activity.viewModel()
|
val libraryViewModel: LibraryViewModel by activity.viewModel()
|
||||||
|
@ -65,45 +61,20 @@ class OrderablePlaylistSongAdapter(
|
||||||
return ViewHolder(view)
|
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<Song>) {
|
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<Song>) {
|
||||||
when (menuItem.itemId) {
|
when (menuItem.itemId) {
|
||||||
R.id.action_remove_from_playlist -> RemoveSongFromPlaylistDialog.create(
|
R.id.action_remove_from_playlist -> RemoveSongFromPlaylistDialog.create(
|
||||||
selection.toSongsEntity(
|
selection.toSongsEntity(
|
||||||
playlist
|
playlistId
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
|
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
|
||||||
|
|
||||||
else -> super.onMultipleItemAction(menuItem, selection)
|
else -> super.onMultipleItemAction(menuItem, selection)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) {
|
inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) {
|
||||||
val playAction: MaterialButton? = itemView.findViewById(R.id.playAction)
|
|
||||||
val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction)
|
|
||||||
|
|
||||||
override var songMenuRes: Int
|
override var songMenuRes: Int
|
||||||
get() = R.menu.menu_item_playlist_song
|
get() = R.menu.menu_item_playlist_song
|
||||||
|
@ -114,7 +85,7 @@ class OrderablePlaylistSongAdapter(
|
||||||
override fun onSongMenuItemClick(item: MenuItem): Boolean {
|
override fun onSongMenuItemClick(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_remove_from_playlist -> {
|
R.id.action_remove_from_playlist -> {
|
||||||
RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlist.playListId))
|
RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlistId))
|
||||||
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
|
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -147,7 +118,7 @@ class OrderablePlaylistSongAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange {
|
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 {
|
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
|
||||||
|
|
|
@ -19,8 +19,8 @@ import android.view.View
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import code.name.monkey.retromusic.R
|
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
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote.isPlaying
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote.isPlaying
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote.playNextSong
|
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.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.ViewUtil
|
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.DraggableItemAdapter
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
|
||||||
|
@ -76,7 +77,7 @@ class PlayingQueueAdapter(
|
||||||
if (holder.image == null) {
|
if (holder.image == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
GlideApp.with(activity)
|
Glide.with(activity)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.songCoverOptions(song)
|
.songCoverOptions(song)
|
||||||
.into(holder.image!!)
|
.into(holder.image!!)
|
||||||
|
@ -195,7 +196,7 @@ class PlayingQueueAdapter(
|
||||||
return if (result == SwipeableItemConstants.RESULT_CANCELED) {
|
return if (result == SwipeableItemConstants.RESULT_CANCELED) {
|
||||||
SwipeResultActionDefault()
|
SwipeResultActionDefault()
|
||||||
} else {
|
} else {
|
||||||
SwipedResultActionRemoveItem(this, position, activity)
|
SwipedResultActionRemoveItem(this, position)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,12 +217,9 @@ class PlayingQueueAdapter(
|
||||||
internal class SwipedResultActionRemoveItem(
|
internal class SwipedResultActionRemoveItem(
|
||||||
private val adapter: PlayingQueueAdapter,
|
private val adapter: PlayingQueueAdapter,
|
||||||
private val position: Int,
|
private val position: Int,
|
||||||
private val activity: FragmentActivity,
|
|
||||||
) : SwipeResultActionRemoveItem() {
|
) : SwipeResultActionRemoveItem() {
|
||||||
|
|
||||||
private var songToRemove: Song? = null
|
private var songToRemove: Song? = null
|
||||||
private val isPlaying: Boolean = MusicPlayerRemote.isPlaying
|
|
||||||
private val songProgressMillis = 0
|
|
||||||
override fun onPerformAction() {
|
override fun onPerformAction() {
|
||||||
// currentlyShownSnackbar = null
|
// currentlyShownSnackbar = null
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,9 @@ import code.name.monkey.retromusic.EXTRA_ALBUM_ID
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
||||||
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
|
@ -41,6 +42,7 @@ import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import me.zhanghai.android.fastscroll.PopupTextProvider
|
import me.zhanghai.android.fastscroll.PopupTextProvider
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -116,7 +118,9 @@ open class SongAdapter(
|
||||||
if (holder.image == null) {
|
if (holder.image == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
GlideApp.with(activity).asBitmapPalette().songCoverOptions(song)
|
Glide.with(activity)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
.into(object : RetroMusicColoredTarget(holder.image!!) {
|
||||||
override fun onColorReady(colors: MediaNotificationProcessor) {
|
override fun onColorReady(colors: MediaNotificationProcessor) {
|
||||||
|
@ -155,7 +159,11 @@ open class SongAdapter(
|
||||||
|
|
||||||
override fun getPopupText(position: Int): String {
|
override fun getPopupText(position: Int): String {
|
||||||
val sectionName: String? = when (PreferenceUtil.songSortOrder) {
|
val sectionName: String? = when (PreferenceUtil.songSortOrder) {
|
||||||
SortOrder.SongSortOrder.SONG_DEFAULT -> return MusicUtil.getSectionName(dataSet[position].title, true)
|
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_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title
|
||||||
SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName
|
SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName
|
||||||
SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName
|
SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName
|
||||||
|
|
|
@ -29,7 +29,6 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
|
@ -152,7 +151,7 @@ class AppWidgetBig : BaseAppWidget() {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.with(service).clear(target)
|
Glide.with(service).clear(target)
|
||||||
}
|
}
|
||||||
target = GlideApp.with(appContext)
|
target = Glide.with(appContext)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
//.checkIgnoreMediaStore()
|
//.checkIgnoreMediaStore()
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
|
|
|
@ -29,8 +29,9 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
|
@ -143,7 +144,9 @@ class AppWidgetCard : BaseAppWidget() {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.with(service).clear(target)
|
Glide.with(service).clear(target)
|
||||||
}
|
}
|
||||||
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
|
target = Glide.with(service)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
@ -28,8 +28,9 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
||||||
|
@ -114,7 +115,9 @@ class AppWidgetCircle : BaseAppWidget() {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.with(service).clear(target)
|
Glide.with(service).clear(target)
|
||||||
}
|
}
|
||||||
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
|
target = Glide.with(service)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.apply(RequestOptions.circleCropTransform())
|
.apply(RequestOptions.circleCropTransform())
|
||||||
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
@ -30,8 +30,9 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
|
@ -119,7 +120,9 @@ class AppWidgetClassic : BaseAppWidget() {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.with(service).clear(target)
|
Glide.with(service).clear(target)
|
||||||
}
|
}
|
||||||
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
|
target = Glide.with(service)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
//.checkIgnoreMediaStore()
|
//.checkIgnoreMediaStore()
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
|
|
|
@ -29,8 +29,9 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
|
@ -144,7 +145,9 @@ class AppWidgetMD3 : BaseAppWidget() {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.with(service).clear(target)
|
Glide.with(service).clear(target)
|
||||||
}
|
}
|
||||||
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
|
target = Glide.with(service)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
|
||||||
|
|
|
@ -29,8 +29,9 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
|
||||||
import code.name.monkey.retromusic.extensions.getTintedDrawable
|
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
|
||||||
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
|
@ -122,7 +123,9 @@ class AppWidgetSmall : BaseAppWidget() {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
Glide.with(service).clear(target)
|
Glide.with(service).clear(target)
|
||||||
}
|
}
|
||||||
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song)
|
target = Glide.with(service)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
//.checkIgnoreMediaStore()
|
//.checkIgnoreMediaStore()
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
|
|
|
@ -41,6 +41,10 @@ interface PlaylistDao {
|
||||||
@Query("SELECT * FROM PlaylistEntity")
|
@Query("SELECT * FROM PlaylistEntity")
|
||||||
suspend fun playlistsWithSongs(): List<PlaylistWithSongs>
|
suspend fun playlistsWithSongs(): List<PlaylistWithSongs>
|
||||||
|
|
||||||
|
@Transaction
|
||||||
|
@Query("SELECT * FROM PlaylistEntity WHERE playlist_id= :playlistId")
|
||||||
|
fun getPlaylist(playlistId: Long): LiveData<PlaylistWithSongs>
|
||||||
|
|
||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
suspend fun insertSongsToPlaylist(songEntities: List<SongEntity>)
|
suspend fun insertSongsToPlaylist(songEntities: List<SongEntity>)
|
||||||
|
|
||||||
|
|
|
@ -145,3 +145,9 @@ fun List<Song>.toSongsEntity(playlistEntity: PlaylistEntity): List<SongEntity> {
|
||||||
it.toSongEntity(playlistEntity.playListId)
|
it.toSongEntity(playlistEntity.playListId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun List<Song>.toSongsEntity(playlistId: Long): List<SongEntity> {
|
||||||
|
return map {
|
||||||
|
it.toSongEntity(playlistId)
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,10 +27,10 @@ import code.name.monkey.retromusic.extensions.extraNotNull
|
||||||
import code.name.monkey.retromusic.extensions.materialDialog
|
import code.name.monkey.retromusic.extensions.materialDialog
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.model.Song
|
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() {
|
class AddToPlaylistDialog : DialogFragment() {
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun create(playlistEntities: List<PlaylistEntity>, song: Song): AddToPlaylistDialog {
|
fun create(playlistEntities: List<PlaylistEntity>, song: Song): AddToPlaylistDialog {
|
||||||
|
|
|
@ -29,12 +29,12 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import com.google.android.material.textfield.TextInputEditText
|
import com.google.android.material.textfield.TextInputEditText
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
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() {
|
class CreatePlaylistDialog : DialogFragment() {
|
||||||
private var _binding: DialogPlaylistBinding? = null
|
private var _binding: DialogPlaylistBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun create(song: Song): CreatePlaylistDialog {
|
fun create(song: Song): CreatePlaylistDialog {
|
||||||
|
|
|
@ -27,11 +27,11 @@ import code.name.monkey.retromusic.extensions.extraNotNull
|
||||||
import code.name.monkey.retromusic.extensions.materialDialog
|
import code.name.monkey.retromusic.extensions.materialDialog
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
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() {
|
class DeletePlaylistDialog : DialogFragment() {
|
||||||
|
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
@ -55,10 +55,13 @@ class DeletePlaylistDialog : DialogFragment() {
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
if (playlists.size > 1) {
|
if (playlists.size > 1) {
|
||||||
title = R.string.delete_playlists_title
|
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 {
|
} else {
|
||||||
title = R.string.delete_playlist_title
|
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)
|
return materialDialog(title)
|
||||||
|
|
|
@ -21,10 +21,10 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.colorButtons
|
import code.name.monkey.retromusic.extensions.colorButtons
|
||||||
import code.name.monkey.retromusic.extensions.materialDialog
|
import code.name.monkey.retromusic.extensions.materialDialog
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
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() {
|
class ImportPlaylistDialog : DialogFragment() {
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
return materialDialog(R.string.import_playlist)
|
return materialDialog(R.string.import_playlist)
|
||||||
|
|
|
@ -26,10 +26,10 @@ import code.name.monkey.retromusic.extensions.colorButtons
|
||||||
import code.name.monkey.retromusic.extensions.extraNotNull
|
import code.name.monkey.retromusic.extensions.extraNotNull
|
||||||
import code.name.monkey.retromusic.extensions.materialDialog
|
import code.name.monkey.retromusic.extensions.materialDialog
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
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() {
|
class RemoveSongFromPlaylistDialog : DialogFragment() {
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun create(song: SongEntity): RemoveSongFromPlaylistDialog {
|
fun create(song: SongEntity): RemoveSongFromPlaylistDialog {
|
||||||
|
|
|
@ -29,11 +29,11 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
import code.name.monkey.retromusic.fragments.ReloadType
|
||||||
import com.google.android.material.textfield.TextInputEditText
|
import com.google.android.material.textfield.TextInputEditText
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
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() {
|
class RenamePlaylistDialog : DialogFragment() {
|
||||||
|
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun create(playlistEntity: PlaylistEntity): RenamePlaylistDialog {
|
fun create(playlistEntity: PlaylistEntity): RenamePlaylistDialog {
|
||||||
|
|
|
@ -19,6 +19,7 @@ import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Spanned
|
import android.text.Spanned
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
|
@ -38,7 +39,7 @@ class SongDetailDialog : DialogFragment() {
|
||||||
val context: Context = requireContext()
|
val context: Context = requireContext()
|
||||||
val binding = DialogFileDetailsBinding.inflate(layoutInflater)
|
val binding = DialogFileDetailsBinding.inflate(layoutInflater)
|
||||||
|
|
||||||
val song = requireArguments().getParcelable<Song>(EXTRA_SONG)
|
val song = BundleCompat.getParcelable(requireArguments(), EXTRA_SONG, Song::class.java)
|
||||||
with(binding) {
|
with(binding) {
|
||||||
fileName.text = makeTextWithTitle(context, R.string.label_file_name, "-")
|
fileName.text = makeTextWithTitle(context, R.string.label_file_name, "-")
|
||||||
filePath.text = makeTextWithTitle(context, R.string.label_file_path, "-")
|
filePath.text = makeTextWithTitle(context, R.string.label_file_path, "-")
|
||||||
|
|
|
@ -17,6 +17,7 @@ package code.name.monkey.retromusic.dialogs
|
||||||
import android.app.Dialog
|
import android.app.Dialog
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
import code.name.monkey.retromusic.EXTRA_SONG
|
import code.name.monkey.retromusic.EXTRA_SONG
|
||||||
|
@ -29,7 +30,7 @@ import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
|
||||||
class SongShareDialog : DialogFragment() {
|
class SongShareDialog : DialogFragment() {
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
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 =
|
val listening: String =
|
||||||
String.format(
|
String.format(
|
||||||
getString(R.string.currently_listening_to_x_by_x),
|
getString(R.string.currently_listening_to_x_by_x),
|
||||||
|
|
|
@ -20,6 +20,7 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.annotation.DimenRes
|
import androidx.annotation.DimenRes
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
||||||
import com.google.android.material.appbar.MaterialToolbar
|
import com.google.android.material.appbar.MaterialToolbar
|
||||||
|
|
||||||
|
|
|
@ -30,12 +30,12 @@ import code.name.monkey.retromusic.extensions.openUrl
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.util.NavigationUtil
|
import code.name.monkey.retromusic.util.NavigationUtil
|
||||||
import dev.chrisbanes.insetter.applyInsetter
|
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 {
|
class AboutFragment : Fragment(R.layout.fragment_about), View.OnClickListener {
|
||||||
private var _binding: FragmentAboutBinding? = null
|
private var _binding: FragmentAboutBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
|
@ -18,7 +18,11 @@ import android.app.ActivityOptions
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
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.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
|
@ -43,10 +47,16 @@ import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter
|
||||||
import code.name.monkey.retromusic.databinding.FragmentAlbumDetailsBinding
|
import code.name.monkey.retromusic.databinding.FragmentAlbumDetailsBinding
|
||||||
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
|
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
|
||||||
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
|
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.fragments.base.AbsMainActivityFragment
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.SingleColorTarget
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_A_Z
|
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_A_Z
|
||||||
|
@ -59,7 +69,12 @@ import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.network.Result
|
import code.name.monkey.retromusic.network.Result
|
||||||
import code.name.monkey.retromusic.network.model.LastFmAlbum
|
import code.name.monkey.retromusic.network.model.LastFmAlbum
|
||||||
import code.name.monkey.retromusic.repository.RealRepository
|
import code.name.monkey.retromusic.repository.RealRepository
|
||||||
import code.name.monkey.retromusic.util.*
|
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.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.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialArcMotion
|
import com.google.android.material.transition.MaterialArcMotion
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
|
@ -230,9 +245,11 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
is Result.Loading -> {
|
is Result.Loading -> {
|
||||||
logD("Loading")
|
logD("Loading")
|
||||||
}
|
}
|
||||||
|
|
||||||
is Result.Error -> {
|
is Result.Error -> {
|
||||||
logE("Error")
|
logE("Error")
|
||||||
}
|
}
|
||||||
|
|
||||||
is Result.Success -> {
|
is Result.Success -> {
|
||||||
aboutAlbum(result.data)
|
aboutAlbum(result.data)
|
||||||
}
|
}
|
||||||
|
@ -285,7 +302,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner) {
|
detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner) {
|
||||||
moreAlbums(it)
|
moreAlbums(it)
|
||||||
}
|
}
|
||||||
GlideApp.with(requireContext())
|
Glide.with(requireContext())
|
||||||
//.forceDownload(PreferenceUtil.isAllowedToDownloadMetadata())
|
//.forceDownload(PreferenceUtil.isAllowedToDownloadMetadata())
|
||||||
.load(
|
.load(
|
||||||
RetroGlideExtension.getArtistModel(
|
RetroGlideExtension.getArtistModel(
|
||||||
|
@ -300,7 +317,8 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadAlbumCover(album: Album) {
|
private fun loadAlbumCover(album: Album) {
|
||||||
GlideApp.with(requireContext()).asBitmapPalette()
|
Glide.with(requireContext())
|
||||||
|
.asBitmapPalette()
|
||||||
.albumCoverOptions(album.safeGetFirstSong())
|
.albumCoverOptions(album.safeGetFirstSong())
|
||||||
//.checkIgnoreMediaStore()
|
//.checkIgnoreMediaStore()
|
||||||
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
|
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
|
||||||
|
@ -332,7 +350,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
inflater.inflate(R.menu.menu_album_detail, menu)
|
inflater.inflate(R.menu.menu_album_detail, menu)
|
||||||
val sortOrder = menu.findItem(R.id.action_sort_order)
|
val sortOrder = menu.findItem(R.id.action_sort_order)
|
||||||
setUpSortOrderMenu(sortOrder.subMenu)
|
setUpSortOrderMenu(sortOrder.subMenu!!)
|
||||||
ToolbarContentTintHelper.handleOnCreateOptionsMenu(
|
ToolbarContentTintHelper.handleOnCreateOptionsMenu(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
binding.toolbar,
|
binding.toolbar,
|
||||||
|
@ -354,10 +372,12 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
MusicPlayerRemote.playNext(songs)
|
MusicPlayerRemote.playNext(songs)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_add_to_current_playing -> {
|
R.id.action_add_to_current_playing -> {
|
||||||
MusicPlayerRemote.enqueue(songs)
|
MusicPlayerRemote.enqueue(songs)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_add_to_playlist -> {
|
R.id.action_add_to_playlist -> {
|
||||||
lifecycleScope.launch(Dispatchers.IO) {
|
lifecycleScope.launch(Dispatchers.IO) {
|
||||||
val playlists = get<RealRepository>().fetchPlaylists()
|
val playlists = get<RealRepository>().fetchPlaylists()
|
||||||
|
@ -368,10 +388,12 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_delete_from_device -> {
|
R.id.action_delete_from_device -> {
|
||||||
DeleteSongsDialog.create(songs).show(childFragmentManager, "DELETE_SONGS")
|
DeleteSongsDialog.create(songs).show(childFragmentManager, "DELETE_SONGS")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_tag_editor -> {
|
R.id.action_tag_editor -> {
|
||||||
val intent = Intent(requireContext(), AlbumTagEditorActivity::class.java)
|
val intent = Intent(requireContext(), AlbumTagEditorActivity::class.java)
|
||||||
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.id)
|
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.id)
|
||||||
|
@ -385,6 +407,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_sort_order_title -> sortOrder = SONG_A_Z
|
R.id.action_sort_order_title -> sortOrder = SONG_A_Z
|
||||||
R.id.action_sort_order_title_desc -> sortOrder = SONG_Z_A
|
R.id.action_sort_order_title_desc -> sortOrder = SONG_Z_A
|
||||||
R.id.action_sort_order_track_list -> sortOrder = SONG_TRACK_LIST
|
R.id.action_sort_order_track_list -> sortOrder = SONG_TRACK_LIST
|
||||||
|
@ -403,6 +426,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = true
|
SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = true
|
||||||
SONG_TRACK_LIST ->
|
SONG_TRACK_LIST ->
|
||||||
sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = true
|
sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = true
|
||||||
|
|
||||||
SONG_DURATION ->
|
SONG_DURATION ->
|
||||||
sortOrder.findItem(R.id.action_sort_order_artist_song_duration).isChecked = true
|
sortOrder.findItem(R.id.action_sort_order_artist_song_duration).isChecked = true
|
||||||
}
|
}
|
||||||
|
@ -416,19 +440,23 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
o2.trackNumber
|
o2.trackNumber
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
SONG_A_Z -> {
|
SONG_A_Z -> {
|
||||||
val collator = Collator.getInstance()
|
val collator = Collator.getInstance()
|
||||||
album.songs.sortedWith { o1, o2 -> collator.compare(o1.title, o2.title) }
|
album.songs.sortedWith { o1, o2 -> collator.compare(o1.title, o2.title) }
|
||||||
}
|
}
|
||||||
|
|
||||||
SONG_Z_A -> {
|
SONG_Z_A -> {
|
||||||
val collator = Collator.getInstance()
|
val collator = Collator.getInstance()
|
||||||
album.songs.sortedWith { o1, o2 -> collator.compare(o2.title, o1.title) }
|
album.songs.sortedWith { o1, o2 -> collator.compare(o2.title, o1.title) }
|
||||||
}
|
}
|
||||||
|
|
||||||
SONG_DURATION -> album.songs.sortedWith { o1, o2 ->
|
SONG_DURATION -> album.songs.sortedWith { o1, o2 ->
|
||||||
o1.duration.compareTo(
|
o1.duration.compareTo(
|
||||||
o2.duration
|
o2.duration
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> throw IllegalArgumentException("invalid $sortOrder")
|
else -> throw IllegalArgumentException("invalid $sortOrder")
|
||||||
}
|
}
|
||||||
album = album.copy(songs = songs)
|
album = album.copy(songs = songs)
|
||||||
|
|
|
@ -148,10 +148,10 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
|
||||||
if (RetroUtil.isLandscape) {
|
if (RetroUtil.isLandscape) {
|
||||||
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
||||||
}
|
}
|
||||||
setUpGridSizeMenu(gridSizeItem.subMenu)
|
setUpGridSizeMenu(gridSizeItem.subMenu!!)
|
||||||
val layoutItem = menu.findItem(R.id.action_layout_type)
|
val layoutItem = menu.findItem(R.id.action_layout_type)
|
||||||
setupLayoutMenu(layoutItem.subMenu)
|
setupLayoutMenu(layoutItem.subMenu!!)
|
||||||
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu)
|
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu!!)
|
||||||
//Setting up cast button
|
//Setting up cast button
|
||||||
requireContext().setUpMediaRouteButton(menu)
|
requireContext().setUpMediaRouteButton(menu)
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,15 @@ import code.name.monkey.retromusic.adapter.album.HorizontalAlbumAdapter
|
||||||
import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter
|
import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter
|
||||||
import code.name.monkey.retromusic.databinding.FragmentArtistDetailsBinding
|
import code.name.monkey.retromusic.databinding.FragmentArtistDetailsBinding
|
||||||
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
|
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
|
||||||
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.show
|
||||||
|
import code.name.monkey.retromusic.extensions.showToast
|
||||||
|
import code.name.monkey.retromusic.extensions.surfaceColor
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
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
|
||||||
|
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.glide.SingleColorTarget
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
|
@ -39,14 +44,20 @@ import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.network.Result
|
import code.name.monkey.retromusic.network.Result
|
||||||
import code.name.monkey.retromusic.network.model.LastFmArtist
|
import code.name.monkey.retromusic.network.model.LastFmArtist
|
||||||
import code.name.monkey.retromusic.repository.RealRepository
|
import code.name.monkey.retromusic.repository.RealRepository
|
||||||
import code.name.monkey.retromusic.util.*
|
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.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.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.koin.android.ext.android.get
|
import org.koin.android.ext.android.get
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
|
|
||||||
abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details),
|
abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details),
|
||||||
IAlbumClickListener {
|
IAlbumClickListener {
|
||||||
|
@ -203,7 +214,9 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadArtistImage(artist: Artist) {
|
private fun loadArtistImage(artist: Artist) {
|
||||||
GlideApp.with(requireContext()).asBitmapPalette().artistImageOptions(artist)
|
Glide.with(requireContext())
|
||||||
|
.asBitmapPalette()
|
||||||
|
.artistImageOptions(artist)
|
||||||
.load(RetroGlideExtension.getArtistModel(artist))
|
.load(RetroGlideExtension.getArtistModel(artist))
|
||||||
.dontAnimate()
|
.dontAnimate()
|
||||||
.into(object : SingleColorTarget(binding.image) {
|
.into(object : SingleColorTarget(binding.image) {
|
||||||
|
@ -243,10 +256,12 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
MusicPlayerRemote.playNext(songs)
|
MusicPlayerRemote.playNext(songs)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_add_to_current_playing -> {
|
R.id.action_add_to_current_playing -> {
|
||||||
MusicPlayerRemote.enqueue(songs)
|
MusicPlayerRemote.enqueue(songs)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_add_to_playlist -> {
|
R.id.action_add_to_playlist -> {
|
||||||
lifecycleScope.launch(Dispatchers.IO) {
|
lifecycleScope.launch(Dispatchers.IO) {
|
||||||
val playlists = get<RealRepository>().fetchPlaylists()
|
val playlists = get<RealRepository>().fetchPlaylists()
|
||||||
|
@ -257,6 +272,7 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_set_artist_image -> {
|
R.id.action_set_artist_image -> {
|
||||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
||||||
intent.type = "image/*"
|
intent.type = "image/*"
|
||||||
|
@ -268,6 +284,7 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_reset_artist_image -> {
|
R.id.action_reset_artist_image -> {
|
||||||
showToast(resources.getString(R.string.updating))
|
showToast(resources.getString(R.string.updating))
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
|
@ -315,14 +332,19 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
when (savedSongSortOrder) {
|
when (savedSongSortOrder) {
|
||||||
SortOrder.ArtistSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked =
|
SortOrder.ArtistSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked =
|
||||||
true
|
true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked =
|
SortOrder.ArtistSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked =
|
||||||
true
|
true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_ALBUM ->
|
SortOrder.ArtistSongSortOrder.SONG_ALBUM ->
|
||||||
sortOrder.findItem(R.id.action_sort_order_album).isChecked = true
|
sortOrder.findItem(R.id.action_sort_order_album).isChecked = true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_YEAR ->
|
SortOrder.ArtistSongSortOrder.SONG_YEAR ->
|
||||||
sortOrder.findItem(R.id.action_sort_order_year).isChecked = true
|
sortOrder.findItem(R.id.action_sort_order_year).isChecked = true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_DURATION ->
|
SortOrder.ArtistSongSortOrder.SONG_DURATION ->
|
||||||
sortOrder.findItem(R.id.action_sort_order_song_duration).isChecked = true
|
sortOrder.findItem(R.id.action_sort_order_song_duration).isChecked = true
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
throw IllegalArgumentException("invalid $savedSongSortOrder")
|
throw IllegalArgumentException("invalid $savedSongSortOrder")
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,10 +159,10 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
|
||||||
if (RetroUtil.isLandscape) {
|
if (RetroUtil.isLandscape) {
|
||||||
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
||||||
}
|
}
|
||||||
setUpGridSizeMenu(gridSizeItem.subMenu)
|
setUpGridSizeMenu(gridSizeItem.subMenu!!)
|
||||||
val layoutItem = menu.findItem(R.id.action_layout_type)
|
val layoutItem = menu.findItem(R.id.action_layout_type)
|
||||||
setupLayoutMenu(layoutItem.subMenu)
|
setupLayoutMenu(layoutItem.subMenu!!)
|
||||||
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu)
|
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu!!)
|
||||||
setupAlbumArtistMenu(menu)
|
setupAlbumArtistMenu(menu)
|
||||||
//Setting up cast button
|
//Setting up cast button
|
||||||
requireContext().setUpMediaRouteButton(menu)
|
requireContext().setUpMediaRouteButton(menu)
|
||||||
|
|
|
@ -22,18 +22,18 @@ import androidx.core.view.MenuProvider
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
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),
|
abstract class AbsMainActivityFragment(@LayoutRes layout: Int) : AbsMusicServiceFragment(layout),
|
||||||
MenuProvider {
|
MenuProvider {
|
||||||
val libraryViewModel: LibraryViewModel by sharedViewModel()
|
val libraryViewModel: LibraryViewModel by activityViewModel()
|
||||||
|
|
||||||
val mainActivity: MainActivity
|
val mainActivity: MainActivity
|
||||||
get() = activity as MainActivity
|
get() = activity as MainActivity
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
val menuHost: MenuHost = requireActivity() as MenuHost
|
val menuHost: MenuHost = requireActivity()
|
||||||
menuHost.addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.STARTED)
|
menuHost.addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.STARTED)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,13 +65,13 @@ import kotlinx.coroutines.Dispatchers.Main
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.koin.android.ext.android.get
|
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
|
import kotlin.math.abs
|
||||||
|
|
||||||
abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragment(layout),
|
abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragment(layout),
|
||||||
Toolbar.OnMenuItemClickListener, IPaletteColorHolder, PlayerAlbumCoverFragment.Callbacks {
|
Toolbar.OnMenuItemClickListener, IPaletteColorHolder, PlayerAlbumCoverFragment.Callbacks {
|
||||||
|
|
||||||
val libraryViewModel: LibraryViewModel by sharedViewModel()
|
val libraryViewModel: LibraryViewModel by activityViewModel()
|
||||||
|
|
||||||
val mainActivity: MainActivity
|
val mainActivity: MainActivity
|
||||||
get() = activity as MainActivity
|
get() = activity as MainActivity
|
||||||
|
@ -87,6 +87,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
PlaybackSpeedDialog.newInstance().show(childFragmentManager, "PLAYBACK_SETTINGS")
|
PlaybackSpeedDialog.newInstance().show(childFragmentManager, "PLAYBACK_SETTINGS")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_toggle_lyrics -> {
|
R.id.action_toggle_lyrics -> {
|
||||||
PreferenceUtil.showLyrics = !PreferenceUtil.showLyrics
|
PreferenceUtil.showLyrics = !PreferenceUtil.showLyrics
|
||||||
showLyricsIcon(item)
|
showLyricsIcon(item)
|
||||||
|
@ -97,26 +98,32 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_go_to_lyrics -> {
|
R.id.action_go_to_lyrics -> {
|
||||||
goToLyrics(requireActivity())
|
goToLyrics(requireActivity())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_toggle_favorite -> {
|
R.id.action_toggle_favorite -> {
|
||||||
toggleFavorite(song)
|
toggleFavorite(song)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_share -> {
|
R.id.action_share -> {
|
||||||
SongShareDialog.create(song).show(childFragmentManager, "SHARE_SONG")
|
SongShareDialog.create(song).show(childFragmentManager, "SHARE_SONG")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_go_to_drive_mode -> {
|
R.id.action_go_to_drive_mode -> {
|
||||||
NavigationUtil.gotoDriveMode(requireActivity())
|
NavigationUtil.gotoDriveMode(requireActivity())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_delete_from_device -> {
|
R.id.action_delete_from_device -> {
|
||||||
DeleteSongsDialog.create(song).show(childFragmentManager, "DELETE_SONGS")
|
DeleteSongsDialog.create(song).show(childFragmentManager, "DELETE_SONGS")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_add_to_playlist -> {
|
R.id.action_add_to_playlist -> {
|
||||||
lifecycleScope.launch(IO) {
|
lifecycleScope.launch(IO) {
|
||||||
val playlists = get<RealRepository>().fetchPlaylists()
|
val playlists = get<RealRepository>().fetchPlaylists()
|
||||||
|
@ -127,25 +134,30 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_clear_playing_queue -> {
|
R.id.action_clear_playing_queue -> {
|
||||||
MusicPlayerRemote.clearQueue()
|
MusicPlayerRemote.clearQueue()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_save_playing_queue -> {
|
R.id.action_save_playing_queue -> {
|
||||||
CreatePlaylistDialog.create(ArrayList(MusicPlayerRemote.playingQueue))
|
CreatePlaylistDialog.create(ArrayList(MusicPlayerRemote.playingQueue))
|
||||||
.show(childFragmentManager, "ADD_TO_PLAYLIST")
|
.show(childFragmentManager, "ADD_TO_PLAYLIST")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_tag_editor -> {
|
R.id.action_tag_editor -> {
|
||||||
val intent = Intent(activity, SongTagEditorActivity::class.java)
|
val intent = Intent(activity, SongTagEditorActivity::class.java)
|
||||||
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id)
|
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_details -> {
|
R.id.action_details -> {
|
||||||
SongDetailDialog.create(song).show(childFragmentManager, "SONG_DETAIL")
|
SongDetailDialog.create(song).show(childFragmentManager, "SONG_DETAIL")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_go_to_album -> {
|
R.id.action_go_to_album -> {
|
||||||
//Hide Bottom Bar First, else Bottom Sheet doesn't collapse fully
|
//Hide Bottom Bar First, else Bottom Sheet doesn't collapse fully
|
||||||
mainActivity.setBottomNavVisibility(false)
|
mainActivity.setBottomNavVisibility(false)
|
||||||
|
@ -156,10 +168,12 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_go_to_artist -> {
|
R.id.action_go_to_artist -> {
|
||||||
goToArtist(requireActivity())
|
goToArtist(requireActivity())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.now_playing -> {
|
R.id.now_playing -> {
|
||||||
requireActivity().findNavController(R.id.fragment_container).navigate(
|
requireActivity().findNavController(R.id.fragment_container).navigate(
|
||||||
R.id.playing_queue_fragment,
|
R.id.playing_queue_fragment,
|
||||||
|
@ -169,18 +183,22 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
mainActivity.collapsePanel()
|
mainActivity.collapsePanel()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_show_lyrics -> {
|
R.id.action_show_lyrics -> {
|
||||||
goToLyrics(requireActivity())
|
goToLyrics(requireActivity())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_equalizer -> {
|
R.id.action_equalizer -> {
|
||||||
NavigationUtil.openEqualizer(requireActivity())
|
NavigationUtil.openEqualizer(requireActivity())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_sleep_timer -> {
|
R.id.action_sleep_timer -> {
|
||||||
SleepTimerDialog().show(parentFragmentManager, "SLEEP_TIMER")
|
SleepTimerDialog().show(parentFragmentManager, "SLEEP_TIMER")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_set_as_ringtone -> {
|
R.id.action_set_as_ringtone -> {
|
||||||
requireContext().run {
|
requireContext().run {
|
||||||
if (RingtoneManager.requiresDialog(this)) {
|
if (RingtoneManager.requiresDialog(this)) {
|
||||||
|
@ -192,6 +210,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_go_to_genre -> {
|
R.id.action_go_to_genre -> {
|
||||||
val retriever = MediaMetadataRetriever()
|
val retriever = MediaMetadataRetriever()
|
||||||
val trackUri =
|
val trackUri =
|
||||||
|
@ -352,8 +371,8 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
context,
|
context,
|
||||||
object : GestureDetector.SimpleOnGestureListener() {
|
object : GestureDetector.SimpleOnGestureListener() {
|
||||||
override fun onScroll(
|
override fun onScroll(
|
||||||
e1: MotionEvent?,
|
e1: MotionEvent,
|
||||||
e2: MotionEvent?,
|
e2: MotionEvent,
|
||||||
distanceX: Float,
|
distanceX: Float,
|
||||||
distanceY: Float,
|
distanceY: Float,
|
||||||
): Boolean {
|
): Boolean {
|
||||||
|
@ -363,6 +382,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
view.parent.requestDisallowInterceptTouchEvent(true)
|
view.parent.requestDisallowInterceptTouchEvent(true)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
@ -371,7 +391,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
|
||||||
})
|
})
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
override fun onTouch(v: View, event: MotionEvent?): Boolean {
|
override fun onTouch(v: View, event: MotionEvent): Boolean {
|
||||||
viewPager?.dispatchTouchEvent(event)
|
viewPager?.dispatchTouchEvent(event)
|
||||||
return flingPlayBackController.onTouchEvent(event)
|
return flingPlayBackController.onTouchEvent(event)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,11 +17,16 @@ import android.content.Context
|
||||||
import android.media.MediaScannerConnection
|
import android.media.MediaScannerConnection
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.view.*
|
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 android.webkit.MimeTypeMap
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.appcompat.widget.Toolbar
|
import androidx.appcompat.widget.Toolbar
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
|
@ -50,6 +55,7 @@ import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.ICallbacks
|
import code.name.monkey.retromusic.interfaces.ICallbacks
|
||||||
import code.name.monkey.retromusic.interfaces.IMainActivityFragmentCallbacks
|
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.UpdateToastMediaScannerCompletionListener
|
||||||
import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader
|
import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
|
@ -59,6 +65,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
|
||||||
import code.name.monkey.retromusic.util.ThemedFastScroller.create
|
import code.name.monkey.retromusic.util.ThemedFastScroller.create
|
||||||
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
||||||
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
|
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.Crumb
|
||||||
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
|
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
@ -70,11 +77,12 @@ import java.io.File
|
||||||
import java.io.FileFilter
|
import java.io.FileFilter
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import java.util.*
|
import java.util.Collections
|
||||||
|
import java.util.LinkedList
|
||||||
|
|
||||||
class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
IMainActivityFragmentCallbacks, SelectionCallback, ICallbacks,
|
IMainActivityFragmentCallbacks, SelectionCallback, ICallbacks,
|
||||||
LoaderManager.LoaderCallbacks<List<File>>, StorageClickListener {
|
LoaderManager.LoaderCallbacks<List<File>>, StorageClickListener, IScrollHelper {
|
||||||
private var _binding: FragmentFolderBinding? = null
|
private var _binding: FragmentFolderBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
@ -113,21 +121,10 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
override fun handleOnBackPressed() {
|
override fun handleOnBackPressed() {
|
||||||
if (!handleBackPress()) {
|
if (!handleBackPress()) {
|
||||||
remove()
|
remove()
|
||||||
requireActivity().onBackPressed()
|
requireActivity().onBackPressedDispatcher.onBackPressed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
private fun setUpTitle() {
|
|
||||||
toolbar.setNavigationOnClickListener {
|
|
||||||
findNavController().navigate(R.id.action_search, null, navOptions)
|
|
||||||
}
|
|
||||||
binding.appBarLayout.title = resources.getString(R.string.folders)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
|
||||||
super.onActivityCreated(savedInstanceState)
|
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
switchToFileAdapter()
|
switchToFileAdapter()
|
||||||
setCrumb(
|
setCrumb(
|
||||||
|
@ -137,11 +134,31 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
} else {
|
} 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)
|
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() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
saveScrollPosition()
|
saveScrollPosition()
|
||||||
|
@ -187,10 +204,12 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
}
|
}
|
||||||
return@setOnMenuItemClickListener true
|
return@setOnMenuItemClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_add_to_blacklist -> {
|
R.id.action_add_to_blacklist -> {
|
||||||
BlacklistStore.getInstance(requireContext()).addPath(file)
|
BlacklistStore.getInstance(requireContext()).addPath(file)
|
||||||
return@setOnMenuItemClickListener true
|
return@setOnMenuItemClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_set_as_start_directory -> {
|
R.id.action_set_as_start_directory -> {
|
||||||
startDirectory = file
|
startDirectory = file
|
||||||
showToast(
|
showToast(
|
||||||
|
@ -198,6 +217,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
)
|
)
|
||||||
return@setOnMenuItemClickListener true
|
return@setOnMenuItemClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_scan -> {
|
R.id.action_scan -> {
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
listPaths(file, AUDIO_FILE_FILTER) { paths -> scanPaths(paths) }
|
listPaths(file, AUDIO_FILE_FILTER) { paths -> scanPaths(paths) }
|
||||||
|
@ -229,6 +249,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
}
|
}
|
||||||
return@setOnMenuItemClickListener true
|
return@setOnMenuItemClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_scan -> {
|
R.id.action_scan -> {
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
listPaths(file, AUDIO_FILE_FILTER) { paths -> scanPaths(paths) }
|
listPaths(file, AUDIO_FILE_FILTER) { paths -> scanPaths(paths) }
|
||||||
|
@ -353,6 +374,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_scan -> {
|
R.id.action_scan -> {
|
||||||
val crumb = activeCrumb
|
val crumb = activeCrumb
|
||||||
if (crumb != null) {
|
if (crumb != null) {
|
||||||
|
@ -362,6 +384,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_settings -> {
|
R.id.action_settings -> {
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
R.id.settings_fragment,
|
R.id.settings_fragment,
|
||||||
|
@ -404,13 +427,11 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun saveScrollPosition() {
|
private fun saveScrollPosition() {
|
||||||
val crumb = activeCrumb
|
activeCrumb?.scrollPosition =
|
||||||
if (crumb != null) {
|
(binding.recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
|
||||||
crumb.scrollPosition =
|
|
||||||
(binding.recyclerView.layoutManager as LinearLayoutManager?)!!.findFirstVisibleItemPosition()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun scanPaths(toBeScanned: Array<String?>) {
|
private fun scanPaths(toBeScanned: Array<String?>) {
|
||||||
if (activity == null) {
|
if (activity == null) {
|
||||||
return
|
return
|
||||||
|
@ -470,8 +491,8 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
adapter?.swapDataSet(files)
|
adapter?.swapDataSet(files)
|
||||||
val crumb = activeCrumb
|
val crumb = activeCrumb
|
||||||
if (crumb != null) {
|
if (crumb != null) {
|
||||||
(binding.recyclerView.layoutManager as LinearLayoutManager?)
|
(binding.recyclerView.layoutManager as LinearLayoutManager)
|
||||||
?.scrollToPositionWithOffset(crumb.scrollPosition, 0)
|
.scrollToPositionWithOffset(crumb.scrollPosition, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,7 +556,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun listSongs(
|
private suspend fun listSongs(
|
||||||
context: Context,
|
context: Context,
|
||||||
files: List<File?>,
|
files: List<File?>,
|
||||||
fileFilter: FileFilter,
|
fileFilter: FileFilter,
|
||||||
|
@ -565,6 +586,11 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun scrollToTop() {
|
||||||
|
binding.recyclerView.scrollToPosition(0)
|
||||||
|
binding.appBarLayout.setExpanded(true, true)
|
||||||
|
}
|
||||||
|
|
||||||
private fun switchToFileAdapter() {
|
private fun switchToFileAdapter() {
|
||||||
adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this)
|
adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this)
|
||||||
adapter!!.registerAdapterDataObserver(
|
adapter!!.registerAdapterDataObserver(
|
||||||
|
|
|
@ -9,7 +9,7 @@ class HomeBinding(
|
||||||
val container = homeBinding.container
|
val container = homeBinding.container
|
||||||
val contentContainer = homeBinding.contentContainer
|
val contentContainer = homeBinding.contentContainer
|
||||||
val appBarLayout = homeBinding.appBarLayout
|
val appBarLayout = homeBinding.appBarLayout
|
||||||
val toolbar = homeBinding.toolbar
|
val toolbar = homeBinding.appBarLayout.toolbar
|
||||||
val bannerImage = homeBinding.imageLayout.bannerImage
|
val bannerImage = homeBinding.imageLayout.bannerImage
|
||||||
val userImage = homeBinding.imageLayout.userImage
|
val userImage = homeBinding.imageLayout.userImage
|
||||||
val lastAdded = homeBinding.homeContent.absPlaylists.lastAdded
|
val lastAdded = homeBinding.homeContent.absPlaylists.lastAdded
|
||||||
|
@ -18,6 +18,5 @@ class HomeBinding(
|
||||||
val history = homeBinding.homeContent.absPlaylists.history
|
val history = homeBinding.homeContent.absPlaylists.history
|
||||||
val recyclerView = homeBinding.homeContent.recyclerView
|
val recyclerView = homeBinding.homeContent.recyclerView
|
||||||
val titleWelcome = homeBinding.imageLayout.titleWelcome
|
val titleWelcome = homeBinding.imageLayout.titleWelcome
|
||||||
val appNameText = homeBinding.appNameText
|
|
||||||
val suggestions = homeBinding.homeContent.suggestions
|
val suggestions = homeBinding.homeContent.suggestions
|
||||||
}
|
}
|
|
@ -15,8 +15,12 @@
|
||||||
package code.name.monkey.retromusic.fragments.home
|
package code.name.monkey.retromusic.fragments.home
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
import android.view.Menu
|
||||||
|
import android.view.MenuInflater
|
||||||
|
import android.view.MenuItem
|
||||||
import android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM
|
import android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
|
@ -30,21 +34,32 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
|
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
|
||||||
import code.name.monkey.appthemehelper.util.ColorUtil
|
import code.name.monkey.appthemehelper.util.ColorUtil
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
||||||
import code.name.monkey.retromusic.*
|
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.R
|
||||||
|
import code.name.monkey.retromusic.TOP_PLAYED_PLAYLIST
|
||||||
import code.name.monkey.retromusic.adapter.HomeAdapter
|
import code.name.monkey.retromusic.adapter.HomeAdapter
|
||||||
import code.name.monkey.retromusic.databinding.FragmentHomeBinding
|
import code.name.monkey.retromusic.databinding.FragmentHomeBinding
|
||||||
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
|
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
|
||||||
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
|
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
|
||||||
import code.name.monkey.retromusic.extensions.*
|
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.extensions.setUpMediaRouteButton
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
import code.name.monkey.retromusic.fragments.ReloadType
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
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
|
||||||
|
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.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.interfaces.IScrollHelper
|
import code.name.monkey.retromusic.interfaces.IScrollHelper
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.userName
|
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.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialFadeThrough
|
import com.google.android.material.transition.MaterialFadeThrough
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
|
@ -86,9 +101,6 @@ class HomeFragment :
|
||||||
colorButtons()
|
colorButtons()
|
||||||
postponeEnterTransition()
|
postponeEnterTransition()
|
||||||
view.doOnPreDraw { startPostponedEnterTransition() }
|
view.doOnPreDraw { startPostponedEnterTransition() }
|
||||||
binding.appBarLayout.statusBarForeground =
|
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
|
||||||
binding.toolbar.drawNextToNavbar()
|
|
||||||
view.doOnLayout {
|
view.doOnLayout {
|
||||||
adjustPlaylistButtons()
|
adjustPlaylistButtons()
|
||||||
}
|
}
|
||||||
|
@ -163,18 +175,18 @@ class HomeFragment :
|
||||||
findNavController().navigate(R.id.action_search, null, navOptions)
|
findNavController().navigate(R.id.action_search, null, navOptions)
|
||||||
}
|
}
|
||||||
val hexColor = String.format("#%06X", 0xFFFFFF and accentColor())
|
val hexColor = String.format("#%06X", 0xFFFFFF and accentColor())
|
||||||
val appName = "Retro <span style='color:$hexColor';>Music</span>".parseAsHtml()
|
val appName = "<font color=$hexColor>Retro Music</font>".parseAsHtml()
|
||||||
binding.appNameText.text = appName
|
binding.appBarLayout.title = appName
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadProfile() {
|
private fun loadProfile() {
|
||||||
binding.bannerImage?.let {
|
binding.bannerImage?.let {
|
||||||
GlideApp.with(requireContext())
|
Glide.with(requireContext())
|
||||||
.load(RetroGlideExtension.getBannerModel())
|
.load(RetroGlideExtension.getBannerModel())
|
||||||
.profileBannerOptions(RetroGlideExtension.getBannerModel())
|
.profileBannerOptions(RetroGlideExtension.getBannerModel())
|
||||||
.into(it)
|
.into(it)
|
||||||
}
|
}
|
||||||
GlideApp.with(requireActivity())
|
Glide.with(requireActivity())
|
||||||
.load(RetroGlideExtension.getUserModel())
|
.load(RetroGlideExtension.getUserModel())
|
||||||
.userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
|
.userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
|
||||||
.into(binding.userImage)
|
.into(binding.userImage)
|
||||||
|
@ -265,7 +277,7 @@ class HomeFragment :
|
||||||
MusicPlayerRemote.playNextSong()
|
MusicPlayerRemote.playNextSong()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getSongModel(songs[index]))
|
.load(RetroGlideExtension.getSongModel(songs[index]))
|
||||||
.songCoverOptions(songs[index])
|
.songCoverOptions(songs[index])
|
||||||
.into(imageView)
|
.into(imageView)
|
||||||
|
@ -289,10 +301,12 @@ class HomeFragment :
|
||||||
null,
|
null,
|
||||||
navOptions
|
navOptions
|
||||||
)
|
)
|
||||||
|
|
||||||
R.id.action_import_playlist -> ImportPlaylistDialog().show(
|
R.id.action_import_playlist -> ImportPlaylistDialog().show(
|
||||||
childFragmentManager,
|
childFragmentManager,
|
||||||
"ImportPlaylist"
|
"ImportPlaylist"
|
||||||
)
|
)
|
||||||
|
|
||||||
R.id.action_add_to_playlist -> CreatePlaylistDialog.create(emptyList()).show(
|
R.id.action_add_to_playlist -> CreatePlaylistDialog.create(emptyList()).show(
|
||||||
childFragmentManager,
|
childFragmentManager,
|
||||||
"ShowCreatePlaylistDialog"
|
"ShowCreatePlaylistDialog"
|
||||||
|
|
|
@ -31,13 +31,14 @@ import code.name.monkey.retromusic.extensions.show
|
||||||
import code.name.monkey.retromusic.extensions.textColorPrimary
|
import code.name.monkey.retromusic.extensions.textColorPrimary
|
||||||
import code.name.monkey.retromusic.extensions.textColorSecondary
|
import code.name.monkey.retromusic.extensions.textColorSecondary
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment
|
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
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
||||||
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
|
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_player),
|
open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_player),
|
||||||
|
@ -113,7 +114,7 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p
|
||||||
|
|
||||||
private fun updateSongCover() {
|
private fun updateSongCover() {
|
||||||
val song = MusicPlayerRemote.currentSong
|
val song = MusicPlayerRemote.currentSong
|
||||||
GlideApp.with(requireContext())
|
Glide.with(requireContext())
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.transition(RetroGlideExtension.getDefaultTransition())
|
.transition(RetroGlideExtension.getDefaultTransition())
|
||||||
.songCoverOptions(song)
|
.songCoverOptions(song)
|
||||||
|
|
|
@ -37,8 +37,9 @@ import code.name.monkey.retromusic.extensions.accentColor
|
||||||
import code.name.monkey.retromusic.extensions.applyToolbar
|
import code.name.monkey.retromusic.extensions.applyToolbar
|
||||||
import code.name.monkey.retromusic.extensions.showToast
|
import code.name.monkey.retromusic.extensions.showToast
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.profileBannerOptions
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.userProfileOptions
|
||||||
import code.name.monkey.retromusic.util.ImageUtil
|
import code.name.monkey.retromusic.util.ImageUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.userName
|
import code.name.monkey.retromusic.util.PreferenceUtil.userName
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
|
@ -54,14 +55,14 @@ import com.google.android.material.transition.MaterialContainerTransform
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
import org.koin.androidx.viewmodel.ext.android.activityViewModel
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class UserInfoFragment : Fragment() {
|
class UserInfoFragment : Fragment() {
|
||||||
|
|
||||||
private var _binding: FragmentUserInfoBinding? = null
|
private var _binding: FragmentUserInfoBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
private val libraryViewModel: LibraryViewModel by sharedViewModel()
|
private val libraryViewModel: LibraryViewModel by activityViewModel()
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
|
@ -155,12 +156,12 @@ class UserInfoFragment : Fragment() {
|
||||||
|
|
||||||
private fun loadProfile() {
|
private fun loadProfile() {
|
||||||
binding.bannerImage.let {
|
binding.bannerImage.let {
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getBannerModel())
|
.load(RetroGlideExtension.getBannerModel())
|
||||||
.profileBannerOptions(RetroGlideExtension.getBannerModel())
|
.profileBannerOptions(RetroGlideExtension.getBannerModel())
|
||||||
.into(it)
|
.into(it)
|
||||||
}
|
}
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getUserModel())
|
.load(RetroGlideExtension.getUserModel())
|
||||||
.userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
|
.userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
|
||||||
.into(binding.userImage)
|
.into(binding.userImage)
|
||||||
|
@ -209,9 +210,11 @@ class UserInfoFragment : Fragment() {
|
||||||
doIfResultOk(uri)
|
doIfResultOk(uri)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagePicker.RESULT_ERROR -> {
|
ImagePicker.RESULT_ERROR -> {
|
||||||
showToast(ImagePicker.getError(data))
|
showToast(ImagePicker.getError(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
showToast("Task Cancelled")
|
showToast("Task Cancelled")
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,12 @@ import androidx.appcompat.widget.Toolbar
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.databinding.FragmentAdaptivePlayerBinding
|
import code.name.monkey.retromusic.databinding.FragmentAdaptivePlayerBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
import code.name.monkey.retromusic.extensions.colorControlNormal
|
||||||
|
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
|
||||||
|
import code.name.monkey.retromusic.extensions.surfaceColor
|
||||||
|
import code.name.monkey.retromusic.extensions.textColorPrimary
|
||||||
|
import code.name.monkey.retromusic.extensions.textColorSecondary
|
||||||
|
import code.name.monkey.retromusic.extensions.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
|
@ -60,7 +65,7 @@ class AdaptiveFragment : AbsPlayerFragment(R.layout.fragment_adaptive_player) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
ToolbarContentTintHelper.colorizeToolbar(this, surfaceColor(), requireActivity())
|
ToolbarContentTintHelper.colorizeToolbar(this, surfaceColor(), requireActivity())
|
||||||
setTitleTextColor(textColorPrimary())
|
setTitleTextColor(textColorPrimary())
|
||||||
setSubtitleTextColor(textColorSecondary())
|
setSubtitleTextColor(textColorSecondary())
|
||||||
|
|
|
@ -30,17 +30,22 @@ import code.name.monkey.retromusic.extensions.drawAboveSystemBars
|
||||||
import code.name.monkey.retromusic.extensions.whichFragment
|
import code.name.monkey.retromusic.extensions.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
||||||
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.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
|
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
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),
|
class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
|
||||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
private var lastRequest: GlideRequest<Drawable>? = null
|
private var lastRequest: RequestBuilder<Drawable>? = null
|
||||||
|
|
||||||
override fun playerToolbar(): Toolbar {
|
override fun playerToolbar(): Toolbar {
|
||||||
return binding.playerToolbar
|
return binding.playerToolbar
|
||||||
|
@ -72,7 +77,7 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
ToolbarContentTintHelper.colorizeToolbar(this, Color.WHITE, activity)
|
ToolbarContentTintHelper.colorizeToolbar(this, Color.WHITE, activity)
|
||||||
}.setOnMenuItemClickListener(this)
|
}.setOnMenuItemClickListener(this)
|
||||||
}
|
}
|
||||||
|
@ -114,14 +119,14 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
|
||||||
|
|
||||||
private fun updateBlur() {
|
private fun updateBlur() {
|
||||||
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
|
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
|
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
|
||||||
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
|
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
|
||||||
.transform(
|
.transform(
|
||||||
BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat())
|
BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat())
|
||||||
.build()
|
.build()
|
||||||
).thumbnail(lastRequest)
|
).thumbnail(lastRequest)
|
||||||
.error(GlideApp.with(this).load(ColorDrawable(Color.DKGRAY)).fitCenter())
|
.error(Glide.with(this).load(ColorDrawable(Color.DKGRAY)).fitCenter())
|
||||||
.also {
|
.also {
|
||||||
lastRequest = it.clone()
|
lastRequest = it.clone()
|
||||||
it.crossfadeListener()
|
it.crossfadeListener()
|
||||||
|
|
|
@ -97,7 +97,7 @@ class CardFragment : AbsPlayerFragment(R.layout.fragment_card_player) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@CardFragment)
|
setOnMenuItemClickListener(this@CardFragment)
|
||||||
|
|
||||||
ToolbarContentTintHelper.colorizeToolbar(this, Color.WHITE, activity)
|
ToolbarContentTintHelper.colorizeToolbar(this, Color.WHITE, activity)
|
||||||
|
|
|
@ -30,11 +30,16 @@ import code.name.monkey.retromusic.extensions.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
|
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.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
|
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
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),
|
class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
|
||||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
@ -49,7 +54,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
|
||||||
|
|
||||||
private var _binding: FragmentCardBlurPlayerBinding? = null
|
private var _binding: FragmentCardBlurPlayerBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
private var lastRequest: GlideRequest<Drawable>? = null
|
private var lastRequest: RequestBuilder<Drawable>? = null
|
||||||
|
|
||||||
override fun onShow() {
|
override fun onShow() {
|
||||||
playbackControlsFragment.show()
|
playbackControlsFragment.show()
|
||||||
|
@ -108,7 +113,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setTitleTextColor(Color.WHITE)
|
setTitleTextColor(Color.WHITE)
|
||||||
setSubtitleTextColor(Color.WHITE)
|
setSubtitleTextColor(Color.WHITE)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(binding.playerToolbar, Color.WHITE, activity)
|
ToolbarContentTintHelper.colorizeToolbar(binding.playerToolbar, Color.WHITE, activity)
|
||||||
|
@ -138,7 +143,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
|
||||||
|
|
||||||
private fun updateBlur() {
|
private fun updateBlur() {
|
||||||
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
|
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
|
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
|
||||||
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
|
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
|
||||||
.transform(
|
.transform(
|
||||||
|
|
|
@ -38,9 +38,8 @@ import code.name.monkey.retromusic.fragments.MusicSeekSkipTouchListener
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.goToAlbum
|
import code.name.monkey.retromusic.fragments.base.goToAlbum
|
||||||
import code.name.monkey.retromusic.fragments.base.goToArtist
|
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
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.simpleSongCoverOptions
|
||||||
import code.name.monkey.retromusic.glide.crossfadeListener
|
import code.name.monkey.retromusic.glide.crossfadeListener
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
|
||||||
|
@ -51,6 +50,8 @@ import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
import code.name.monkey.retromusic.volume.AudioVolumeObserver
|
import code.name.monkey.retromusic.volume.AudioVolumeObserver
|
||||||
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
|
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 com.google.android.material.slider.Slider
|
||||||
import me.tankery.lib.circularseekbar.CircularSeekBar
|
import me.tankery.lib.circularseekbar.CircularSeekBar
|
||||||
|
|
||||||
|
@ -72,9 +73,8 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
private var rotateAnimator: ObjectAnimator? = null
|
private var rotateAnimator: ObjectAnimator? = null
|
||||||
private var lastRequest: GlideRequest<Drawable>? = null
|
private var lastRequest: RequestBuilder<Drawable>? = null
|
||||||
|
|
||||||
private var progressAnimator: ObjectAnimator? = null
|
|
||||||
var isSeeking = false
|
var isSeeking = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
@ -100,7 +100,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@CirclePlayerFragment)
|
setOnMenuItemClickListener(this@CirclePlayerFragment)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
this,
|
this,
|
||||||
|
@ -129,8 +129,12 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
|
||||||
private fun setUpPrevNext() {
|
private fun setUpPrevNext() {
|
||||||
updatePrevNextColor()
|
updatePrevNextColor()
|
||||||
binding.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true))
|
binding.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true))
|
||||||
binding.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(),
|
binding.previousButton.setOnTouchListener(
|
||||||
false))
|
MusicSeekSkipTouchListener(
|
||||||
|
requireActivity(),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updatePrevNextColor() {
|
private fun updatePrevNextColor() {
|
||||||
|
@ -237,11 +241,11 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
|
||||||
} else {
|
} else {
|
||||||
binding.songInfo.hide()
|
binding.songInfo.hide()
|
||||||
}
|
}
|
||||||
GlideApp.with(this)
|
Glide.with(this)
|
||||||
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
|
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
|
||||||
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
|
.simpleSongCoverOptions(MusicPlayerRemote.currentSong)
|
||||||
.thumbnail(lastRequest)
|
.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 {
|
.fitCenter().also {
|
||||||
lastRequest = it.clone()
|
lastRequest = it.clone()
|
||||||
it.crossfadeListener()
|
it.crossfadeListener()
|
||||||
|
|
|
@ -102,10 +102,12 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
|
||||||
BottomSheetBehavior.STATE_DRAGGING -> {
|
BottomSheetBehavior.STATE_DRAGGING -> {
|
||||||
mainActivity.getBottomSheetBehavior().isDraggable = false
|
mainActivity.getBottomSheetBehavior().isDraggable = false
|
||||||
}
|
}
|
||||||
|
|
||||||
BottomSheetBehavior.STATE_COLLAPSED -> {
|
BottomSheetBehavior.STATE_COLLAPSED -> {
|
||||||
resetToCurrentPosition()
|
resetToCurrentPosition()
|
||||||
mainActivity.getBottomSheetBehavior().isDraggable = true
|
mainActivity.getBottomSheetBehavior().isDraggable = true
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
mainActivity.getBottomSheetBehavior().isDraggable = true
|
mainActivity.getBottomSheetBehavior().isDraggable = true
|
||||||
}
|
}
|
||||||
|
@ -377,7 +379,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
|
||||||
|
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
||||||
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
|
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
binding.playerToolbar.setOnMenuItemClickListener(this)
|
binding.playerToolbar.setOnMenuItemClickListener(this)
|
||||||
|
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
|
@ -491,6 +493,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
|
||||||
lastPlaybackControlsColor,
|
lastPlaybackControlsColor,
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
)
|
)
|
||||||
|
|
||||||
else -> binding.playerControlsContainer.shuffleButton.setColorFilter(
|
else -> binding.playerControlsContainer.shuffleButton.setColorFilter(
|
||||||
lastDisabledPlaybackControlsColor,
|
lastDisabledPlaybackControlsColor,
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
|
@ -511,6 +514,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
MusicService.REPEAT_MODE_ALL -> {
|
MusicService.REPEAT_MODE_ALL -> {
|
||||||
binding.playerControlsContainer.repeatButton.setImageResource(R.drawable.ic_repeat)
|
binding.playerControlsContainer.repeatButton.setImageResource(R.drawable.ic_repeat)
|
||||||
binding.playerControlsContainer.repeatButton.setColorFilter(
|
binding.playerControlsContainer.repeatButton.setColorFilter(
|
||||||
|
@ -518,6 +522,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
|
||||||
PorterDuff.Mode.SRC_IN
|
PorterDuff.Mode.SRC_IN
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
MusicService.REPEAT_MODE_THIS -> {
|
MusicService.REPEAT_MODE_THIS -> {
|
||||||
binding.playerControlsContainer.repeatButton.setImageResource(R.drawable.ic_repeat_one)
|
binding.playerControlsContainer.repeatButton.setImageResource(R.drawable.ic_repeat_one)
|
||||||
binding.playerControlsContainer.repeatButton.setColorFilter(
|
binding.playerControlsContainer.repeatButton.setColorFilter(
|
||||||
|
|
|
@ -124,7 +124,7 @@ class ColorFragment : AbsPlayerFragment(R.layout.fragment_color_player) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@ColorFragment)
|
setOnMenuItemClickListener(this@ColorFragment)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -100,7 +100,7 @@ class FitFragment : AbsPlayerFragment(R.layout.fragment_fit) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@FitFragment)
|
setOnMenuItemClickListener(this@FitFragment)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -61,7 +61,7 @@ class FlatPlayerFragment : AbsPlayerFragment(R.layout.fragment_flat_player) {
|
||||||
|
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
||||||
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
|
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
binding.playerToolbar.setOnMenuItemClickListener(this)
|
binding.playerToolbar.setOnMenuItemClickListener(this)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
binding.playerToolbar,
|
binding.playerToolbar,
|
||||||
|
|
|
@ -32,7 +32,11 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.databinding.FragmentFullPlayerControlsBinding
|
import code.name.monkey.retromusic.databinding.FragmentFullPlayerControlsBinding
|
||||||
import code.name.monkey.retromusic.db.PlaylistEntity
|
import code.name.monkey.retromusic.db.PlaylistEntity
|
||||||
import code.name.monkey.retromusic.db.toSongEntity
|
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.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
import code.name.monkey.retromusic.fragments.ReloadType
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
|
||||||
|
@ -48,7 +52,7 @@ import com.google.android.material.slider.Slider
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
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.
|
* Created by hemanths on 20/09/17.
|
||||||
|
@ -58,7 +62,7 @@ class FullPlaybackControlsFragment :
|
||||||
AbsPlayerControlsFragment(R.layout.fragment_full_player_controls),
|
AbsPlayerControlsFragment(R.layout.fragment_full_player_controls),
|
||||||
PopupMenu.OnMenuItemClickListener {
|
PopupMenu.OnMenuItemClickListener {
|
||||||
|
|
||||||
private val libraryViewModel: LibraryViewModel by sharedViewModel()
|
private val libraryViewModel: LibraryViewModel by activityViewModel()
|
||||||
private var _binding: FragmentFullPlayerControlsBinding? = null
|
private var _binding: FragmentFullPlayerControlsBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
|
|
@ -30,11 +30,12 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.goToArtist
|
import code.name.monkey.retromusic.fragments.base.goToArtist
|
||||||
import code.name.monkey.retromusic.fragments.player.CoverLyricsFragment
|
import code.name.monkey.retromusic.fragments.player.CoverLyricsFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
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
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
|
||||||
class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
|
class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
|
||||||
private var _binding: FragmentFullBinding? = null
|
private var _binding: FragmentFullBinding? = null
|
||||||
|
@ -51,7 +52,7 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
|
||||||
|
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,7 +136,7 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full) {
|
||||||
libraryViewModel.artist(MusicPlayerRemote.currentSong.artistId)
|
libraryViewModel.artist(MusicPlayerRemote.currentSong.artistId)
|
||||||
.observe(viewLifecycleOwner) { artist ->
|
.observe(viewLifecycleOwner) { artist ->
|
||||||
if (artist.id != -1L) {
|
if (artist.id != -1L) {
|
||||||
GlideApp.with(requireActivity())
|
Glide.with(requireActivity())
|
||||||
.load(RetroGlideExtension.getArtistModel(artist))
|
.load(RetroGlideExtension.getArtistModel(artist))
|
||||||
.artistImageOptions(artist)
|
.artistImageOptions(artist)
|
||||||
.into(binding.artistImage)
|
.into(binding.artistImage)
|
||||||
|
|
|
@ -122,7 +122,7 @@ class HomePlayerFragment : AbsPlayerFragment(R.layout.fragment_home_player),
|
||||||
|
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
||||||
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
|
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
binding.playerToolbar.setOnMenuItemClickListener(this)
|
binding.playerToolbar.setOnMenuItemClickListener(this)
|
||||||
|
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
|
|
|
@ -144,7 +144,7 @@ class MaterialFragment : AbsPlayerFragment(R.layout.fragment_material) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@MaterialFragment)
|
setOnMenuItemClickListener(this@MaterialFragment)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -103,7 +103,7 @@ class MD3PlayerFragment : AbsPlayerFragment(R.layout.fragment_md3_player) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
||||||
//binding.playerToolbar.menu.setUpWithIcons()
|
//binding.playerToolbar.menu.setUpWithIcons()
|
||||||
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
|
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
binding.playerToolbar.setOnMenuItemClickListener(this)
|
binding.playerToolbar.setOnMenuItemClickListener(this)
|
||||||
|
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
|
|
|
@ -27,7 +27,11 @@ import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.SNOWFALL
|
import code.name.monkey.retromusic.SNOWFALL
|
||||||
import code.name.monkey.retromusic.databinding.FragmentPlayerBinding
|
import code.name.monkey.retromusic.databinding.FragmentPlayerBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
import code.name.monkey.retromusic.extensions.colorControlNormal
|
||||||
|
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
|
||||||
|
import code.name.monkey.retromusic.extensions.isColorLight
|
||||||
|
import code.name.monkey.retromusic.extensions.surfaceColor
|
||||||
|
import code.name.monkey.retromusic.extensions.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
|
@ -147,7 +151,7 @@ class PlayerFragment : AbsPlayerFragment(R.layout.fragment_player),
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
||||||
//binding.playerToolbar.menu.setUpWithIcons()
|
//binding.playerToolbar.menu.setUpWithIcons()
|
||||||
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
|
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
binding.playerToolbar.setOnMenuItemClickListener(this)
|
binding.playerToolbar.setOnMenuItemClickListener(this)
|
||||||
|
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
|
|
|
@ -20,7 +20,12 @@ import androidx.appcompat.widget.Toolbar
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.databinding.FragmentPeekPlayerBinding
|
import code.name.monkey.retromusic.databinding.FragmentPeekPlayerBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
import code.name.monkey.retromusic.extensions.colorControlNormal
|
||||||
|
import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding
|
||||||
|
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.whichFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
|
||||||
import code.name.monkey.retromusic.fragments.base.goToAlbum
|
import code.name.monkey.retromusic.fragments.base.goToAlbum
|
||||||
import code.name.monkey.retromusic.fragments.base.goToArtist
|
import code.name.monkey.retromusic.fragments.base.goToArtist
|
||||||
|
@ -68,7 +73,7 @@ class PeekPlayerFragment : AbsPlayerFragment(R.layout.fragment_peek_player) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@PeekPlayerFragment)
|
setOnMenuItemClickListener(this@PeekPlayerFragment)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -63,7 +63,7 @@ class PlainPlayerFragment : AbsPlayerFragment(R.layout.fragment_plain_player) {
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@PlainPlayerFragment)
|
setOnMenuItemClickListener(this@PlainPlayerFragment)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -101,7 +101,7 @@ class SimplePlayerFragment : AbsPlayerFragment(R.layout.fragment_simple_player)
|
||||||
|
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
binding.playerToolbar.inflateMenu(R.menu.menu_player)
|
||||||
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
|
binding.playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
binding.playerToolbar.setOnMenuItemClickListener(this)
|
binding.playerToolbar.setOnMenuItemClickListener(this)
|
||||||
ToolbarContentTintHelper.colorizeToolbar(
|
ToolbarContentTintHelper.colorizeToolbar(
|
||||||
binding.playerToolbar,
|
binding.playerToolbar,
|
||||||
|
|
|
@ -159,7 +159,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
|
||||||
private fun setUpPlayerToolbar() {
|
private fun setUpPlayerToolbar() {
|
||||||
binding.playerToolbar.apply {
|
binding.playerToolbar.apply {
|
||||||
inflateMenu(R.menu.menu_player)
|
inflateMenu(R.menu.menu_player)
|
||||||
setNavigationOnClickListener { requireActivity().onBackPressed() }
|
setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
|
||||||
setOnMenuItemClickListener(this@TinyPlayerFragment)
|
setOnMenuItemClickListener(this@TinyPlayerFragment)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,8 +213,8 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
|
||||||
gestureDetector = GestureDetector(context, object :
|
gestureDetector = GestureDetector(context, object :
|
||||||
GestureDetector.SimpleOnGestureListener() {
|
GestureDetector.SimpleOnGestureListener() {
|
||||||
|
|
||||||
override fun onLongPress(e: MotionEvent?) {
|
override fun onLongPress(e: MotionEvent) {
|
||||||
if (abs(e!!.y - initialY) <= 2) {
|
if (abs(e.y - initialY) <= 2) {
|
||||||
vibrate()
|
vibrate()
|
||||||
isDragEnabled = true
|
isDragEnabled = true
|
||||||
binding.progressBar.parent.requestDisallowInterceptTouchEvent(true)
|
binding.progressBar.parent.requestDisallowInterceptTouchEvent(true)
|
||||||
|
@ -251,6 +251,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
|
||||||
initialY = event.y.toInt()
|
initialY = event.y.toInt()
|
||||||
progressViewUpdateHelper.stop()
|
progressViewUpdateHelper.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
MotionEvent.ACTION_UP,
|
MotionEvent.ACTION_UP,
|
||||||
MotionEvent.ACTION_CANCEL -> {
|
MotionEvent.ACTION_CANCEL -> {
|
||||||
progressViewUpdateHelper.start()
|
progressViewUpdateHelper.start()
|
||||||
|
@ -260,6 +261,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MotionEvent.ACTION_MOVE -> {
|
MotionEvent.ACTION_MOVE -> {
|
||||||
if (isDragEnabled) {
|
if (isDragEnabled) {
|
||||||
val diffY = (initialY - event.y).toInt()
|
val diffY = (initialY - event.y).toInt()
|
||||||
|
|
|
@ -14,15 +14,21 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
|
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.PlaylistWithSongs
|
||||||
import code.name.monkey.retromusic.db.toSongs
|
import code.name.monkey.retromusic.db.toSongs
|
||||||
|
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.extensions.surfaceColor
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
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.helper.menu.PlaylistMenuHelper
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.ThemedFastScroller
|
import code.name.monkey.retromusic.util.ThemedFastScroller
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialArcMotion
|
import com.google.android.material.transition.MaterialArcMotion
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
|
@ -34,13 +40,13 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
|
|
||||||
|
|
||||||
class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) {
|
class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail_new) {
|
||||||
private val arguments by navArgs<PlaylistDetailsFragmentArgs>()
|
private val arguments by navArgs<PlaylistDetailsFragmentArgs>()
|
||||||
private val viewModel by viewModel<PlaylistDetailsViewModel> {
|
private val viewModel by viewModel<PlaylistDetailsViewModel> {
|
||||||
parametersOf(arguments.extraPlaylist)
|
parametersOf(arguments.extraPlaylistId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var _binding: FragmentPlaylistDetailBinding? = null
|
private var _binding: FragmentPlaylistDetailNewBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
private lateinit var playlist: PlaylistWithSongs
|
private lateinit var playlist: PlaylistWithSongs
|
||||||
|
@ -58,16 +64,26 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
_binding = FragmentPlaylistDetailBinding.bind(view)
|
_binding = FragmentPlaylistDetailNewBinding.bind(view)
|
||||||
enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).addTarget(view)
|
enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).addTarget(view)
|
||||||
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
||||||
mainActivity.setSupportActionBar(binding.toolbar)
|
mainActivity.setSupportActionBar(binding.toolbar)
|
||||||
binding.container.transitionName = "playlist"
|
binding.toolbar.title = null
|
||||||
playlist = arguments.extraPlaylist
|
// binding.container.transitionName = playlist.playlistEntity.playlistName
|
||||||
binding.toolbar.title = playlist.playlistEntity.playlistName
|
|
||||||
binding.toolbar.subtitle =
|
|
||||||
MusicUtil.getPlaylistInfoString(requireContext(), playlist.songs.toSongs())
|
|
||||||
setUpRecyclerView()
|
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) {
|
viewModel.getSongs().observe(viewLifecycleOwner) {
|
||||||
songs(it.toSongs())
|
songs(it.toSongs())
|
||||||
}
|
}
|
||||||
|
@ -82,9 +98,24 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
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() {
|
private fun setUpRecyclerView() {
|
||||||
playlistSongAdapter = OrderablePlaylistSongAdapter(
|
playlistSongAdapter = OrderablePlaylistSongAdapter(
|
||||||
playlist.playlistEntity,
|
arguments.extraPlaylistId,
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
ArrayList(),
|
ArrayList(),
|
||||||
R.layout.item_queue
|
R.layout.item_queue
|
||||||
|
|
|
@ -18,15 +18,18 @@ import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
||||||
import code.name.monkey.retromusic.db.SongEntity
|
import code.name.monkey.retromusic.db.SongEntity
|
||||||
|
import code.name.monkey.retromusic.model.Playlist
|
||||||
import code.name.monkey.retromusic.repository.RealRepository
|
import code.name.monkey.retromusic.repository.RealRepository
|
||||||
|
|
||||||
class PlaylistDetailsViewModel(
|
class PlaylistDetailsViewModel(
|
||||||
private val realRepository: RealRepository,
|
private val realRepository: RealRepository,
|
||||||
private var playlist: PlaylistWithSongs
|
private var playlistId: Long
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
fun getSongs(): LiveData<List<SongEntity>> =
|
fun getSongs(): LiveData<List<SongEntity>> =
|
||||||
realRepository.playlistSongs(playlist.playlistEntity.playListId)
|
realRepository.playlistSongs(playlistId)
|
||||||
|
|
||||||
fun playlistExists(): LiveData<Boolean> =
|
fun playlistExists(): LiveData<Boolean> =
|
||||||
realRepository.checkPlaylistExists(playlist.playlistEntity.playListId)
|
realRepository.checkPlaylistExists(playlistId)
|
||||||
|
|
||||||
|
fun getPlaylist(): LiveData<PlaylistWithSongs> = realRepository.getPlaylist(playlistId)
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import androidx.core.view.MenuCompat
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import code.name.monkey.retromusic.EXTRA_PLAYLIST
|
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.R
|
||||||
import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter
|
import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter
|
||||||
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
import code.name.monkey.retromusic.db.PlaylistWithSongs
|
||||||
|
@ -76,12 +77,12 @@ class PlaylistsFragment :
|
||||||
if (RetroUtil.isLandscape) {
|
if (RetroUtil.isLandscape) {
|
||||||
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
||||||
}
|
}
|
||||||
setupGridSizeMenu(gridSizeItem.subMenu)
|
setupGridSizeMenu(gridSizeItem.subMenu!!)
|
||||||
menu.removeItem(R.id.action_layout_type)
|
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_add_to_playlist, 0, R.string.new_playlist_title)
|
||||||
menu.add(0, R.id.action_import_playlist, 0, R.string.import_playlist)
|
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)
|
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)
|
MenuCompat.setGroupDividerEnabled(menu, true)
|
||||||
//Setting up cast button
|
//Setting up cast button
|
||||||
requireContext().setUpMediaRouteButton(menu)
|
requireContext().setUpMediaRouteButton(menu)
|
||||||
|
@ -244,7 +245,7 @@ class PlaylistsFragment :
|
||||||
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
R.id.playlistDetailsFragment,
|
R.id.playlistDetailsFragment,
|
||||||
bundleOf(EXTRA_PLAYLIST to playlistWithSongs)
|
bundleOf(EXTRA_PLAYLIST_ID to playlistWithSongs.playlistEntity.playListId)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,14 +24,14 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.installLanguageAndRecreate
|
import code.name.monkey.retromusic.extensions.installLanguageAndRecreate
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType.HomeSections
|
import code.name.monkey.retromusic.fragments.ReloadType.HomeSections
|
||||||
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
import org.koin.androidx.viewmodel.ext.android.activityViewModel
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Hemanth S (h4h13).
|
* @author Hemanth S (h4h13).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class OtherSettingsFragment : AbsSettingsFragment() {
|
class OtherSettingsFragment : AbsSettingsFragment() {
|
||||||
private val libraryViewModel by sharedViewModel<LibraryViewModel>()
|
private val libraryViewModel by activityViewModel<LibraryViewModel>()
|
||||||
|
|
||||||
override fun invalidateSettings() {
|
override fun invalidateSettings() {
|
||||||
val languagePreference: ATEListPreference? = findPreference(LANGUAGE_NAME)
|
val languagePreference: ATEListPreference? = findPreference(LANGUAGE_NAME)
|
||||||
|
|
|
@ -17,6 +17,7 @@ package code.name.monkey.retromusic.fragments.settings
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference
|
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_ALBUM_GRID_STYLE
|
||||||
import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE
|
import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
|
@ -47,5 +48,10 @@ class PersonalizeSettingsFragment : AbsSettingsFragment() {
|
||||||
setSummary(prefs, newValue)
|
setSummary(prefs, newValue)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
val appBarMode: ATEListPreference? = findPreference(APPBAR_MODE)
|
||||||
|
appBarMode?.setOnPreferenceChangeListener { _, _ ->
|
||||||
|
restartActivity()
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,14 +39,18 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), ColorCallback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupToolbar() {
|
private fun setupToolbar() {
|
||||||
applyToolbar(binding.toolbar)
|
|
||||||
binding.toolbar.setNavigationOnClickListener {
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
val navController: NavController = findNavController(R.id.contentFrame)
|
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 { _, _, _ ->
|
navController.addOnDestinationChangedListener { _, _, _ ->
|
||||||
binding.collapsingToolbarLayout.title =
|
binding.appBarLayout.title =
|
||||||
navController.currentDestination?.let { getStringFromDestination(it) }
|
navController.currentDestination?.let { getStringFromDestination(it) }.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,10 +114,10 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
|
||||||
if (RetroUtil.isLandscape) {
|
if (RetroUtil.isLandscape) {
|
||||||
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
gridSizeItem.setTitle(R.string.action_grid_size_land)
|
||||||
}
|
}
|
||||||
setUpGridSizeMenu(gridSizeItem.subMenu)
|
setUpGridSizeMenu(gridSizeItem.subMenu!!)
|
||||||
val layoutItem = menu.findItem(R.id.action_layout_type)
|
val layoutItem = menu.findItem(R.id.action_layout_type)
|
||||||
setupLayoutMenu(layoutItem.subMenu)
|
setupLayoutMenu(layoutItem.subMenu!!)
|
||||||
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu)
|
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu!!)
|
||||||
//Setting up cast button
|
//Setting up cast button
|
||||||
requireContext().setUpMediaRouteButton(menu)
|
requireContext().setUpMediaRouteButton(menu)
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,14 +23,11 @@ import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import com.bumptech.glide.GenericTransitionOptions
|
import com.bumptech.glide.GenericTransitionOptions
|
||||||
import com.bumptech.glide.Priority
|
import com.bumptech.glide.Priority
|
||||||
import com.bumptech.glide.RequestBuilder
|
import com.bumptech.glide.RequestBuilder
|
||||||
import com.bumptech.glide.annotation.GlideExtension
|
import com.bumptech.glide.RequestManager
|
||||||
import com.bumptech.glide.annotation.GlideOption
|
|
||||||
import com.bumptech.glide.annotation.GlideType
|
|
||||||
import com.bumptech.glide.load.DataSource
|
import com.bumptech.glide.load.DataSource
|
||||||
import com.bumptech.glide.load.Key
|
import com.bumptech.glide.load.Key
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import com.bumptech.glide.load.engine.GlideException
|
import com.bumptech.glide.load.engine.GlideException
|
||||||
import com.bumptech.glide.request.BaseRequestOptions
|
|
||||||
import com.bumptech.glide.request.RequestListener
|
import com.bumptech.glide.request.RequestListener
|
||||||
import com.bumptech.glide.request.target.Target
|
import com.bumptech.glide.request.target.Target
|
||||||
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
||||||
|
@ -40,7 +37,6 @@ import com.bumptech.glide.signature.MediaStoreSignature
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
@GlideExtension
|
|
||||||
object RetroGlideExtension {
|
object RetroGlideExtension {
|
||||||
|
|
||||||
private const val DEFAULT_ARTIST_IMAGE =
|
private const val DEFAULT_ARTIST_IMAGE =
|
||||||
|
@ -54,10 +50,8 @@ object RetroGlideExtension {
|
||||||
|
|
||||||
private const val DEFAULT_ANIMATION = android.R.anim.fade_in
|
private const val DEFAULT_ANIMATION = android.R.anim.fade_in
|
||||||
|
|
||||||
@JvmStatic
|
fun RequestManager.asBitmapPalette(): RequestBuilder<BitmapPaletteWrapper> {
|
||||||
@GlideType(BitmapPaletteWrapper::class)
|
return this.`as`(BitmapPaletteWrapper::class.java)
|
||||||
fun asBitmapPalette(requestBuilder: RequestBuilder<BitmapPaletteWrapper>): RequestBuilder<BitmapPaletteWrapper> {
|
|
||||||
return requestBuilder
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getSongModel(song: Song, ignoreMediaStore: Boolean): Any {
|
private fun getSongModel(song: Song, ignoreMediaStore: Boolean): Any {
|
||||||
|
@ -100,14 +94,10 @@ object RetroGlideExtension {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.artistImageOptions(
|
||||||
@GlideOption
|
|
||||||
fun artistImageOptions(
|
|
||||||
baseRequestOptions: BaseRequestOptions<*>,
|
|
||||||
artist: Artist
|
artist: Artist
|
||||||
): BaseRequestOptions<*> {
|
): RequestBuilder<T> {
|
||||||
return baseRequestOptions
|
return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY_ARTIST)
|
||||||
.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY_ARTIST)
|
|
||||||
.priority(Priority.LOW)
|
.priority(Priority.LOW)
|
||||||
.error(getDrawable(DEFAULT_ARTIST_IMAGE))
|
.error(getDrawable(DEFAULT_ARTIST_IMAGE))
|
||||||
.placeholder(getDrawable(DEFAULT_ARTIST_IMAGE))
|
.placeholder(getDrawable(DEFAULT_ARTIST_IMAGE))
|
||||||
|
@ -115,70 +105,52 @@ object RetroGlideExtension {
|
||||||
.signature(createSignature(artist))
|
.signature(createSignature(artist))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.songCoverOptions(
|
||||||
@GlideOption
|
|
||||||
fun songCoverOptions(
|
|
||||||
baseRequestOptions: BaseRequestOptions<*>,
|
|
||||||
song: Song
|
song: Song
|
||||||
): BaseRequestOptions<*> {
|
): RequestBuilder<T> {
|
||||||
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(getDrawable(DEFAULT_SONG_IMAGE))
|
.error(getDrawable(DEFAULT_SONG_IMAGE))
|
||||||
.placeholder(getDrawable(DEFAULT_SONG_IMAGE))
|
.placeholder(getDrawable(DEFAULT_SONG_IMAGE))
|
||||||
.signature(createSignature(song))
|
.signature(createSignature(song))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.simpleSongCoverOptions(
|
||||||
@GlideOption
|
|
||||||
fun simpleSongCoverOptions(
|
|
||||||
baseRequestOptions: BaseRequestOptions<*>,
|
|
||||||
song: Song
|
song: Song
|
||||||
): BaseRequestOptions<*> {
|
): RequestBuilder<T> {
|
||||||
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.signature(createSignature(song))
|
.signature(createSignature(song))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.albumCoverOptions(
|
||||||
@GlideOption
|
|
||||||
fun albumCoverOptions(
|
|
||||||
baseRequestOptions: BaseRequestOptions<*>,
|
|
||||||
song: Song
|
song: Song
|
||||||
): BaseRequestOptions<*> {
|
): RequestBuilder<T> {
|
||||||
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(ContextCompat.getDrawable(getContext(), DEFAULT_ALBUM_IMAGE))
|
.error(ContextCompat.getDrawable(getContext(), DEFAULT_ALBUM_IMAGE))
|
||||||
.placeholder(ContextCompat.getDrawable(getContext(), DEFAULT_ALBUM_IMAGE))
|
.placeholder(ContextCompat.getDrawable(getContext(), DEFAULT_ALBUM_IMAGE))
|
||||||
.signature(createSignature(song))
|
.signature(createSignature(song))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.userProfileOptions(
|
||||||
@GlideOption
|
|
||||||
fun userProfileOptions(
|
|
||||||
baseRequestOptions: BaseRequestOptions<*>,
|
|
||||||
file: File,
|
file: File,
|
||||||
context: Context
|
context: Context
|
||||||
): BaseRequestOptions<*> {
|
): RequestBuilder<T> {
|
||||||
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.error(getErrorUserProfile(context))
|
.error(getErrorUserProfile(context))
|
||||||
.signature(createSignature(file))
|
.signature(createSignature(file))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.profileBannerOptions(
|
||||||
@GlideOption
|
|
||||||
fun profileBannerOptions(
|
|
||||||
baseRequestOptions: BaseRequestOptions<*>,
|
|
||||||
file: File
|
file: File
|
||||||
): BaseRequestOptions<*> {
|
): RequestBuilder<T> {
|
||||||
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
return diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
||||||
.placeholder(DEFAULT_ERROR_IMAGE_BANNER)
|
.placeholder(DEFAULT_ERROR_IMAGE_BANNER)
|
||||||
.error(DEFAULT_ERROR_IMAGE_BANNER)
|
.error(DEFAULT_ERROR_IMAGE_BANNER)
|
||||||
.signature(createSignature(file))
|
.signature(createSignature(file))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun <T> RequestBuilder<T>.playlistOptions(): RequestBuilder<T> {
|
||||||
@GlideOption
|
return diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
|
||||||
fun playlistOptions(
|
.placeholder(getDrawable(DEFAULT_ALBUM_IMAGE))
|
||||||
baseRequestOptions: BaseRequestOptions<*>
|
|
||||||
): BaseRequestOptions<*> {
|
|
||||||
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
|
|
||||||
.error(getDrawable(DEFAULT_ALBUM_IMAGE))
|
.error(getDrawable(DEFAULT_ALBUM_IMAGE))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,7 +195,7 @@ object RetroGlideExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
|
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
|
||||||
fun GlideRequest<Drawable>.crossfadeListener(): GlideRequest<Drawable> {
|
fun RequestBuilder<Drawable>.crossfadeListener(): RequestBuilder<Drawable> {
|
||||||
return listener(object : RequestListener<Drawable> {
|
return listener(object : RequestListener<Drawable> {
|
||||||
override fun onLoadFailed(
|
override fun onLoadFailed(
|
||||||
e: GlideException?,
|
e: GlideException?,
|
||||||
|
|
|
@ -11,21 +11,20 @@ class PlaylistPreview(val playlistWithSongs: PlaylistWithSongs) {
|
||||||
val songs: List<Song> get() = playlistWithSongs.songs.toSongs()
|
val songs: List<Song> get() = playlistWithSongs.songs.toSongs()
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (other is PlaylistPreview) {
|
println("Glide equals $this $other")
|
||||||
if (other.playlistEntity.playListId != playlistEntity.playListId) {
|
if (this === other) return true
|
||||||
return false
|
if (javaClass != other?.javaClass) return false
|
||||||
}
|
|
||||||
if (other.songs.size != songs.size) {
|
other as PlaylistPreview
|
||||||
return false
|
if (other.playlistEntity.playListId != playlistEntity.playListId) return false
|
||||||
}
|
if (other.songs.size != songs.size) return false
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
var result = playlistEntity.playListId.hashCode()
|
var result = playlistEntity.playListId.hashCode()
|
||||||
result = 31 * result + playlistWithSongs.songs.size
|
result = 31 * result + playlistWithSongs.songs.size
|
||||||
|
println("Glide $result")
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -17,7 +17,7 @@ class PlaylistPreviewFetcher(val context: Context, private val playlistPreview:
|
||||||
val bitmap =
|
val bitmap =
|
||||||
AutoGeneratedPlaylistBitmap.getBitmap(
|
AutoGeneratedPlaylistBitmap.getBitmap(
|
||||||
context,
|
context,
|
||||||
playlistPreview.songs.shuffled()
|
playlistPreview.songs
|
||||||
)
|
)
|
||||||
callback.onDataReady(bitmap)
|
callback.onDataReady(bitmap)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
|
|
@ -115,13 +115,15 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
val realActivity = (context as Activity).parent ?: context
|
val realActivity = (context as Activity).parent ?: context
|
||||||
val contextWrapper = ContextWrapper(realActivity)
|
val contextWrapper = ContextWrapper(realActivity)
|
||||||
val intent = Intent(contextWrapper, MusicService::class.java)
|
val intent = Intent(contextWrapper, MusicService::class.java)
|
||||||
|
|
||||||
|
// https://issuetracker.google.com/issues/76112072#comment184
|
||||||
|
// Workaround for ForegroundServiceDidNotStartInTimeException
|
||||||
try {
|
try {
|
||||||
contextWrapper.startService(intent)
|
context.startService(intent)
|
||||||
} catch (ignored: IllegalStateException) {
|
} catch (e: Exception) {
|
||||||
runCatching {
|
|
||||||
ContextCompat.startForegroundService(context, intent)
|
ContextCompat.startForegroundService(context, intent)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
val binder = ServiceBinder(callback)
|
val binder = ServiceBinder(callback)
|
||||||
|
|
||||||
if (contextWrapper.bindService(
|
if (contextWrapper.bindService(
|
||||||
|
@ -416,7 +418,7 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (songs == null || songs.isEmpty()) {
|
if (songs.isNullOrEmpty()) {
|
||||||
var songFile: File? = null
|
var songFile: File? = null
|
||||||
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
|
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
|
||||||
val path = uri.path?.split(":".toRegex(), 2)?.get(1)
|
val path = uri.path?.split(":".toRegex(), 2)?.get(1)
|
||||||
|
@ -436,7 +438,7 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
songs = songRepository.songsByFilePath(songFile.absolutePath, true)
|
songs = songRepository.songsByFilePath(songFile.absolutePath, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (songs != null && songs.isNotEmpty()) {
|
if (!songs.isNullOrEmpty()) {
|
||||||
openQueue(songs, 0, true)
|
openQueue(songs, 0, true)
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -16,7 +16,7 @@ package code.name.monkey.retromusic.repository
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.Transformations
|
import androidx.lifecycle.map
|
||||||
import code.name.monkey.retromusic.*
|
import code.name.monkey.retromusic.*
|
||||||
import code.name.monkey.retromusic.db.*
|
import code.name.monkey.retromusic.db.*
|
||||||
import code.name.monkey.retromusic.fragments.search.Filter
|
import code.name.monkey.retromusic.fragments.search.Filter
|
||||||
|
@ -99,6 +99,7 @@ interface Repository {
|
||||||
suspend fun isSongFavorite(songId: Long): Boolean
|
suspend fun isSongFavorite(songId: Long): Boolean
|
||||||
fun getSongByGenre(genreId: Long): Song
|
fun getSongByGenre(genreId: Long): Song
|
||||||
fun checkPlaylistExists(playListId: Long): LiveData<Boolean>
|
fun checkPlaylistExists(playListId: Long): LiveData<Boolean>
|
||||||
|
fun getPlaylist(playlistId: Long): LiveData<PlaylistWithSongs>
|
||||||
}
|
}
|
||||||
|
|
||||||
class RealRepository(
|
class RealRepository(
|
||||||
|
@ -223,6 +224,8 @@ class RealRepository(
|
||||||
override suspend fun fetchPlaylistWithSongs(): List<PlaylistWithSongs> =
|
override suspend fun fetchPlaylistWithSongs(): List<PlaylistWithSongs> =
|
||||||
roomRepository.playlistWithSongs()
|
roomRepository.playlistWithSongs()
|
||||||
|
|
||||||
|
override fun getPlaylist(playlistId: Long): LiveData<PlaylistWithSongs> = roomRepository.getPlaylist(playlistId)
|
||||||
|
|
||||||
override suspend fun playlistSongs(playlistWithSongs: PlaylistWithSongs): List<Song> =
|
override suspend fun playlistSongs(playlistWithSongs: PlaylistWithSongs): List<Song> =
|
||||||
playlistWithSongs.songs.map {
|
playlistWithSongs.songs.map {
|
||||||
it.toSong()
|
it.toSong()
|
||||||
|
@ -305,7 +308,7 @@ class RealRepository(
|
||||||
roomRepository.playCountSongs()
|
roomRepository.playCountSongs()
|
||||||
|
|
||||||
override fun observableHistorySongs(): LiveData<List<Song>> =
|
override fun observableHistorySongs(): LiveData<List<Song>> =
|
||||||
Transformations.map(roomRepository.observableHistorySongs()) {
|
roomRepository.observableHistorySongs().map {
|
||||||
it.fromHistoryToSongs()
|
it.fromHistoryToSongs()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ interface RoomRepository {
|
||||||
suspend fun deleteSongs(songs: List<Song>)
|
suspend fun deleteSongs(songs: List<Song>)
|
||||||
suspend fun isSongFavorite(context: Context, songId: Long): Boolean
|
suspend fun isSongFavorite(context: Context, songId: Long): Boolean
|
||||||
fun checkPlaylistExists(playListId: Long): LiveData<Boolean>
|
fun checkPlaylistExists(playListId: Long): LiveData<Boolean>
|
||||||
|
fun getPlaylist(playlistId: Long): LiveData<PlaylistWithSongs>
|
||||||
}
|
}
|
||||||
|
|
||||||
class RealRoomRepository(
|
class RealRoomRepository(
|
||||||
|
@ -81,6 +82,9 @@ class RealRoomRepository(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WorkerThread
|
||||||
|
override fun getPlaylist(playlistId: Long): LiveData<PlaylistWithSongs> = playlistDao.getPlaylist(playlistId)
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
override suspend fun insertSongs(songs: List<SongEntity>) {
|
override suspend fun insertSongs(songs: List<SongEntity>) {
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,7 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun seek(whereto: Int): Int {
|
override fun seek(whereto: Int): Int {
|
||||||
|
endFade()
|
||||||
getNextPlayer()?.stop()
|
getNextPlayer()?.stop()
|
||||||
return try {
|
return try {
|
||||||
getCurrentPlayer()?.seekTo(whereto)
|
getCurrentPlayer()?.seekTo(whereto)
|
||||||
|
@ -235,6 +236,11 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) {
|
||||||
crossFadeAnimator?.start()
|
crossFadeAnimator?.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun endFade() {
|
||||||
|
crossFadeAnimator?.end()
|
||||||
|
crossFadeAnimator = null
|
||||||
|
}
|
||||||
|
|
||||||
private fun cancelFade() {
|
private fun cancelFade() {
|
||||||
crossFadeAnimator?.cancel()
|
crossFadeAnimator?.cancel()
|
||||||
crossFadeAnimator = null
|
crossFadeAnimator = null
|
||||||
|
|
|
@ -26,6 +26,7 @@ import android.util.Log
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
import androidx.media.session.MediaButtonReceiver
|
import androidx.media.session.MediaButtonReceiver
|
||||||
import code.name.monkey.retromusic.BuildConfig
|
import code.name.monkey.retromusic.BuildConfig
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PAUSE
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PAUSE
|
||||||
|
@ -91,7 +92,7 @@ class MediaButtonIntentReceiver : MediaButtonReceiver() {
|
||||||
println("Intent Action: ${intent.action}")
|
println("Intent Action: ${intent.action}")
|
||||||
val intentAction = intent.action
|
val intentAction = intent.action
|
||||||
if (Intent.ACTION_MEDIA_BUTTON == intentAction) {
|
if (Intent.ACTION_MEDIA_BUTTON == intentAction) {
|
||||||
val event = intent.getParcelableExtra<KeyEvent>(Intent.EXTRA_KEY_EVENT)
|
val event = intent.extras?.let { BundleCompat.getParcelable(it, Intent.EXTRA_KEY_EVENT, KeyEvent::class.java) }
|
||||||
?: return false
|
?: return false
|
||||||
|
|
||||||
val keycode = event.keyCode
|
val keycode = event.keyCode
|
||||||
|
@ -106,6 +107,7 @@ class MediaButtonIntentReceiver : MediaButtonReceiver() {
|
||||||
KeyEvent.KEYCODE_MEDIA_STOP -> command = ACTION_STOP
|
KeyEvent.KEYCODE_MEDIA_STOP -> command = ACTION_STOP
|
||||||
KeyEvent.KEYCODE_HEADSETHOOK, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> command =
|
KeyEvent.KEYCODE_HEADSETHOOK, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> command =
|
||||||
ACTION_TOGGLE_PAUSE
|
ACTION_TOGGLE_PAUSE
|
||||||
|
|
||||||
KeyEvent.KEYCODE_MEDIA_NEXT -> command = ACTION_SKIP
|
KeyEvent.KEYCODE_MEDIA_NEXT -> command = ACTION_SKIP
|
||||||
KeyEvent.KEYCODE_MEDIA_PREVIOUS -> command = ACTION_REWIND
|
KeyEvent.KEYCODE_MEDIA_PREVIOUS -> command = ACTION_REWIND
|
||||||
KeyEvent.KEYCODE_MEDIA_PAUSE -> command = ACTION_PAUSE
|
KeyEvent.KEYCODE_MEDIA_PAUSE -> command = ACTION_PAUSE
|
||||||
|
@ -155,14 +157,8 @@ class MediaButtonIntentReceiver : MediaButtonReceiver() {
|
||||||
val intent = Intent(context, MusicService::class.java)
|
val intent = Intent(context, MusicService::class.java)
|
||||||
intent.action = command
|
intent.action = command
|
||||||
try {
|
try {
|
||||||
// IMPORTANT NOTE: (kind of a hack)
|
|
||||||
// on Android O and above the following crashes when the app is not running
|
|
||||||
// there is no good way to check whether the app is running so we catch the exception
|
|
||||||
// we do not always want to use startForegroundService() because then one gets an ANR
|
|
||||||
// if no notification is displayed via startForeground()
|
|
||||||
// according to Play analytics this happens a lot, I suppose for example if command = PAUSE
|
|
||||||
context.startService(intent)
|
context.startService(intent)
|
||||||
} catch (ignored: IllegalStateException) {
|
} catch (e: Exception) {
|
||||||
ContextCompat.startForegroundService(context, intent)
|
ContextCompat.startForegroundService(context, intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,11 @@ import android.support.v4.media.session.MediaSessionCompat
|
||||||
import android.support.v4.media.session.PlaybackStateCompat
|
import android.support.v4.media.session.PlaybackStateCompat
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.core.app.ServiceCompat
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
|
import androidx.core.os.BundleCompat
|
||||||
|
import androidx.core.os.ParcelCompat
|
||||||
import androidx.media.MediaBrowserServiceCompat
|
import androidx.media.MediaBrowserServiceCompat
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
|
@ -47,12 +50,14 @@ import code.name.monkey.retromusic.activities.LockScreenActivity
|
||||||
import code.name.monkey.retromusic.appwidgets.*
|
import code.name.monkey.retromusic.appwidgets.*
|
||||||
import code.name.monkey.retromusic.auto.AutoMediaIDHelper
|
import code.name.monkey.retromusic.auto.AutoMediaIDHelper
|
||||||
import code.name.monkey.retromusic.auto.AutoMusicProvider
|
import code.name.monkey.retromusic.auto.AutoMusicProvider
|
||||||
|
import code.name.monkey.retromusic.extensions.extra
|
||||||
import code.name.monkey.retromusic.extensions.showToast
|
import code.name.monkey.retromusic.extensions.showToast
|
||||||
import code.name.monkey.retromusic.extensions.toMediaSessionQueue
|
import code.name.monkey.retromusic.extensions.toMediaSessionQueue
|
||||||
import code.name.monkey.retromusic.extensions.uri
|
import code.name.monkey.retromusic.extensions.uri
|
||||||
import code.name.monkey.retromusic.glide.BlurTransformation
|
import code.name.monkey.retromusic.glide.BlurTransformation
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.getDefaultTransition
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension.getSongModel
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.getSongModel
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
|
||||||
import code.name.monkey.retromusic.helper.ShuffleHelper.makeShuffleList
|
import code.name.monkey.retromusic.helper.ShuffleHelper.makeShuffleList
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.model.Song.Companion.emptySong
|
import code.name.monkey.retromusic.model.Song.Companion.emptySong
|
||||||
|
@ -82,6 +87,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil.registerOnSharedPreferenc
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.unregisterOnSharedPreferenceChangedListener
|
import code.name.monkey.retromusic.util.PreferenceUtil.unregisterOnSharedPreferenceChangedListener
|
||||||
import code.name.monkey.retromusic.volume.AudioVolumeObserver
|
import code.name.monkey.retromusic.volume.AudioVolumeObserver
|
||||||
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
|
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.request.target.CustomTarget
|
import com.bumptech.glide.request.target.CustomTarget
|
||||||
import com.bumptech.glide.request.target.Target
|
import com.bumptech.glide.request.target.Target
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
|
@ -134,21 +140,27 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
AppWidgetClassic.NAME -> {
|
AppWidgetClassic.NAME -> {
|
||||||
appWidgetClassic.performUpdate(this@MusicService, ids)
|
appWidgetClassic.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppWidgetSmall.NAME -> {
|
AppWidgetSmall.NAME -> {
|
||||||
appWidgetSmall.performUpdate(this@MusicService, ids)
|
appWidgetSmall.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppWidgetBig.NAME -> {
|
AppWidgetBig.NAME -> {
|
||||||
appWidgetBig.performUpdate(this@MusicService, ids)
|
appWidgetBig.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppWidgetCard.NAME -> {
|
AppWidgetCard.NAME -> {
|
||||||
appWidgetCard.performUpdate(this@MusicService, ids)
|
appWidgetCard.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppWidgetText.NAME -> {
|
AppWidgetText.NAME -> {
|
||||||
appWidgetText.performUpdate(this@MusicService, ids)
|
appWidgetText.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppWidgetMD3.NAME -> {
|
AppWidgetMD3.NAME -> {
|
||||||
appWidgetMd3.performUpdate(this@MusicService, ids)
|
appWidgetMd3.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
AppWidgetCircle.NAME -> {
|
AppWidgetCircle.NAME -> {
|
||||||
appWidgetCircle.performUpdate(this@MusicService, ids)
|
appWidgetCircle.performUpdate(this@MusicService, ids)
|
||||||
}
|
}
|
||||||
|
@ -412,6 +424,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
REPEAT_MODE_ALL -> if (isLastTrack) {
|
REPEAT_MODE_ALL -> if (isLastTrack) {
|
||||||
position = 0
|
position = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
REPEAT_MODE_THIS -> if (force) {
|
REPEAT_MODE_THIS -> if (force) {
|
||||||
if (isLastTrack) {
|
if (isLastTrack) {
|
||||||
position = 0
|
position = 0
|
||||||
|
@ -419,9 +432,11 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
} else {
|
} else {
|
||||||
position -= 1
|
position -= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
REPEAT_MODE_NONE -> if (isLastTrack) {
|
REPEAT_MODE_NONE -> if (isLastTrack) {
|
||||||
position -= 1
|
position -= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> if (isLastTrack) {
|
else -> if (isLastTrack) {
|
||||||
position -= 1
|
position -= 1
|
||||||
}
|
}
|
||||||
|
@ -447,6 +462,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
REPEAT_MODE_ALL -> if (newPosition < 0) {
|
REPEAT_MODE_ALL -> if (newPosition < 0) {
|
||||||
newPosition = playingQueue.size - 1
|
newPosition = playingQueue.size - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
REPEAT_MODE_THIS -> if (force) {
|
REPEAT_MODE_THIS -> if (force) {
|
||||||
if (newPosition < 0) {
|
if (newPosition < 0) {
|
||||||
newPosition = playingQueue.size - 1
|
newPosition = playingQueue.size - 1
|
||||||
|
@ -454,9 +470,11 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
} else {
|
} else {
|
||||||
newPosition = getPosition()
|
newPosition = getPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
REPEAT_MODE_NONE -> if (newPosition < 0) {
|
REPEAT_MODE_NONE -> if (newPosition < 0) {
|
||||||
newPosition = 0
|
newPosition = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> if (newPosition < 0) {
|
else -> if (newPosition < 0) {
|
||||||
newPosition = 0
|
newPosition = 0
|
||||||
}
|
}
|
||||||
|
@ -486,6 +504,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
makeShuffleList(playingQueue, getPosition())
|
makeShuffleList(playingQueue, getPosition())
|
||||||
position = 0
|
position = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
SHUFFLE_MODE_NONE -> {
|
SHUFFLE_MODE_NONE -> {
|
||||||
this.shuffleMode = shuffleMode
|
this.shuffleMode = shuffleMode
|
||||||
val currentSongId = Objects.requireNonNull(currentSong).id
|
val currentSongId = Objects.requireNonNull(currentSong).id
|
||||||
|
@ -553,9 +572,11 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
currentPosition in to until from -> {
|
currentPosition in to until from -> {
|
||||||
position = currentPosition + 1
|
position = currentPosition + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPosition in (from + 1)..to -> {
|
currentPosition in (from + 1)..to -> {
|
||||||
position = currentPosition - 1
|
position = currentPosition - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
from == currentPosition -> {
|
from == currentPosition -> {
|
||||||
position = to
|
position = to
|
||||||
}
|
}
|
||||||
|
@ -617,6 +638,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
updateMediaSessionPlaybackState()
|
updateMediaSessionPlaybackState()
|
||||||
playbackManager.setPlaybackSpeedPitch(playbackSpeed, playbackPitch)
|
playbackManager.setPlaybackSpeedPitch(playbackSpeed, playbackPitch)
|
||||||
}
|
}
|
||||||
|
|
||||||
CROSS_FADE_DURATION -> {
|
CROSS_FADE_DURATION -> {
|
||||||
val progress = songProgressMillis
|
val progress = songProgressMillis
|
||||||
val wasPlaying = isPlaying
|
val wasPlaying = isPlaying
|
||||||
|
@ -627,6 +649,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
playbackManager.setCrossFadeDuration(crossFadeDuration)
|
playbackManager.setCrossFadeDuration(crossFadeDuration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ALBUM_ART_ON_LOCK_SCREEN, BLURRED_ALBUM_ART -> updateMediaSessionMetaData(::updateMediaSessionPlaybackState)
|
ALBUM_ART_ON_LOCK_SCREEN, BLURRED_ALBUM_ART -> updateMediaSessionMetaData(::updateMediaSessionPlaybackState)
|
||||||
COLORED_NOTIFICATION -> {
|
COLORED_NOTIFICATION -> {
|
||||||
playingNotification?.updateMetadata(currentSong) {
|
playingNotification?.updateMetadata(currentSong) {
|
||||||
|
@ -634,6 +657,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
startForegroundOrNotify()
|
startForegroundOrNotify()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CLASSIC_NOTIFICATION -> {
|
CLASSIC_NOTIFICATION -> {
|
||||||
updateNotification()
|
updateNotification()
|
||||||
playingNotification?.updateMetadata(currentSong) {
|
playingNotification?.updateMetadata(currentSong) {
|
||||||
|
@ -641,6 +665,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
startForegroundOrNotify()
|
startForegroundOrNotify()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TOGGLE_HEADSET -> registerHeadsetEvents()
|
TOGGLE_HEADSET -> registerHeadsetEvents()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -655,6 +680,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
} else {
|
} else {
|
||||||
play()
|
play()
|
||||||
}
|
}
|
||||||
|
|
||||||
ACTION_PAUSE -> pause()
|
ACTION_PAUSE -> pause()
|
||||||
ACTION_PLAY -> play()
|
ACTION_PLAY -> play()
|
||||||
ACTION_PLAY_PLAYLIST -> playFromPlaylist(intent)
|
ACTION_PLAY_PLAYLIST -> playFromPlaylist(intent)
|
||||||
|
@ -664,6 +690,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
pendingQuit = false
|
pendingQuit = false
|
||||||
quit()
|
quit()
|
||||||
}
|
}
|
||||||
|
|
||||||
ACTION_PENDING_QUIT -> pendingQuit = true
|
ACTION_PENDING_QUIT -> pendingQuit = true
|
||||||
TOGGLE_FAVORITE -> toggleFavorite()
|
TOGGLE_FAVORITE -> toggleFavorite()
|
||||||
}
|
}
|
||||||
|
@ -727,7 +754,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
startPosition: Int,
|
startPosition: Int,
|
||||||
startPlaying: Boolean,
|
startPlaying: Boolean,
|
||||||
) {
|
) {
|
||||||
if (playingQueue != null && playingQueue.isNotEmpty()
|
if (!playingQueue.isNullOrEmpty()
|
||||||
&& startPosition >= 0 && startPosition < playingQueue.size
|
&& startPosition >= 0 && startPosition < playingQueue.size
|
||||||
) {
|
) {
|
||||||
// it is important to copy the playing queue here first as we might add/remove songs later
|
// it is important to copy the playing queue here first as we might add/remove songs later
|
||||||
|
@ -829,7 +856,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
|
|
||||||
fun quit() {
|
fun quit() {
|
||||||
pause()
|
pause()
|
||||||
stopForeground(true)
|
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
|
||||||
isForeground = false
|
isForeground = false
|
||||||
notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID)
|
notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID)
|
||||||
|
|
||||||
|
@ -1023,7 +1050,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
|
|
||||||
if (isAlbumArtOnLockScreen) {
|
if (isAlbumArtOnLockScreen) {
|
||||||
// val screenSize: Point = RetroUtil.getScreenSize(this)
|
// val screenSize: Point = RetroUtil.getScreenSize(this)
|
||||||
val request = GlideApp.with(this)
|
val request = Glide.with(this)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.songCoverOptions(song)
|
.songCoverOptions(song)
|
||||||
.load(getSongModel(song))
|
.load(getSongModel(song))
|
||||||
|
@ -1078,12 +1105,14 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
playingNotification?.setPlaying(isPlaying)
|
playingNotification?.setPlaying(isPlaying)
|
||||||
startForegroundOrNotify()
|
startForegroundOrNotify()
|
||||||
}
|
}
|
||||||
|
|
||||||
FAVORITE_STATE_CHANGED -> {
|
FAVORITE_STATE_CHANGED -> {
|
||||||
isCurrentFavorite { isFavorite ->
|
isCurrentFavorite { isFavorite ->
|
||||||
playingNotification?.updateFavorite(isFavorite)
|
playingNotification?.updateFavorite(isFavorite)
|
||||||
startForegroundOrNotify()
|
startForegroundOrNotify()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
META_CHANGED -> {
|
META_CHANGED -> {
|
||||||
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
|
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
|
||||||
isCurrentFavorite { isFavorite ->
|
isCurrentFavorite { isFavorite ->
|
||||||
|
@ -1107,6 +1136,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
storage.saveSong(currentSong)
|
storage.saveSong(currentSong)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QUEUE_CHANGED -> {
|
QUEUE_CHANGED -> {
|
||||||
mediaSession?.setQueueTitle(getString(R.string.now_playing_queue))
|
mediaSession?.setQueueTitle(getString(R.string.now_playing_queue))
|
||||||
mediaSession?.setQueue(playingQueue.toMediaSessionQueue())
|
mediaSession?.setQueue(playingQueue.toMediaSessionQueue())
|
||||||
|
@ -1128,7 +1158,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
// We can't call stopForeground(false) on A12 though, which may result in crashes
|
// We can't call stopForeground(false) on A12 though, which may result in crashes
|
||||||
// when we call startForeground after that e.g. when Alarm goes off,
|
// when we call startForeground after that e.g. when Alarm goes off,
|
||||||
if (!VersionUtils.hasS()) {
|
if (!VersionUtils.hasS()) {
|
||||||
stopForeground(false)
|
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_DETACH)
|
||||||
isForeground = false
|
isForeground = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1156,7 +1186,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun stopForegroundAndNotification() {
|
private fun stopForegroundAndNotification() {
|
||||||
stopForeground(true)
|
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
|
||||||
notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID)
|
notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID)
|
||||||
isForeground = false
|
isForeground = false
|
||||||
}
|
}
|
||||||
|
@ -1198,7 +1228,13 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun playFromPlaylist(intent: Intent) {
|
private fun playFromPlaylist(intent: Intent) {
|
||||||
val playlist: AbsSmartPlaylist? = intent.getParcelableExtra(INTENT_EXTRA_PLAYLIST)
|
val playlist: AbsSmartPlaylist? = intent.extras?.let {
|
||||||
|
BundleCompat.getParcelable(
|
||||||
|
it,
|
||||||
|
INTENT_EXTRA_PLAYLIST,
|
||||||
|
AbsSmartPlaylist::class.java
|
||||||
|
)
|
||||||
|
}
|
||||||
val shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode())
|
val shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode())
|
||||||
if (playlist != null) {
|
if (playlist != null) {
|
||||||
val playlistSongs = playlist.songs()
|
val playlistSongs = playlist.songs()
|
||||||
|
@ -1355,7 +1391,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
const val INTENT_EXTRA_PLAYLIST = RETRO_MUSIC_PACKAGE_NAME + "intentextra.playlist"
|
const val INTENT_EXTRA_PLAYLIST = RETRO_MUSIC_PACKAGE_NAME + "intentextra.playlist"
|
||||||
const val INTENT_EXTRA_SHUFFLE_MODE =
|
const val INTENT_EXTRA_SHUFFLE_MODE =
|
||||||
"$RETRO_MUSIC_PACKAGE_NAME.intentextra.shufflemode"
|
"$RETRO_MUSIC_PACKAGE_NAME.intentextra.shufflemode"
|
||||||
const val APP_WIDGET_UPDATE = "$RETRO_MUSIC_PACKAGE_NAME.appreciate"
|
const val APP_WIDGET_UPDATE = "$RETRO_MUSIC_PACKAGE_NAME.appwidgetupdate"
|
||||||
const val EXTRA_APP_WIDGET_NAME = RETRO_MUSIC_PACKAGE_NAME + "app_widget_name"
|
const val EXTRA_APP_WIDGET_NAME = RETRO_MUSIC_PACKAGE_NAME + "app_widget_name"
|
||||||
|
|
||||||
// Do not change these three strings as it will break support with other apps (e.g. last.fm
|
// Do not change these three strings as it will break support with other apps (e.g. last.fm
|
||||||
|
|
|
@ -36,8 +36,9 @@ import code.name.monkey.retromusic.extensions.getTintedDrawable
|
||||||
import code.name.monkey.retromusic.extensions.isColorLight
|
import code.name.monkey.retromusic.extensions.isColorLight
|
||||||
import code.name.monkey.retromusic.extensions.isSystemDarkModeEnabled
|
import code.name.monkey.retromusic.extensions.isSystemDarkModeEnabled
|
||||||
import code.name.monkey.retromusic.extensions.toBitmap
|
import code.name.monkey.retromusic.extensions.toBitmap
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
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.glide.palette.BitmapPaletteWrapper
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
|
@ -47,6 +48,7 @@ import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.request.target.CustomTarget
|
import com.bumptech.glide.request.target.CustomTarget
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
|
|
||||||
|
@ -105,7 +107,9 @@ class PlayingNotificationClassic(
|
||||||
setOngoing(true)
|
setOngoing(true)
|
||||||
val bigNotificationImageSize = context.resources
|
val bigNotificationImageSize = context.resources
|
||||||
.getDimensionPixelSize(R.dimen.notification_big_image_size)
|
.getDimensionPixelSize(R.dimen.notification_big_image_size)
|
||||||
GlideApp.with(context).asBitmapPalette().songCoverOptions(song)
|
Glide.with(context)
|
||||||
|
.asBitmapPalette()
|
||||||
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
.into(object : CustomTarget<BitmapPaletteWrapper>(
|
.into(object : CustomTarget<BitmapPaletteWrapper>(
|
||||||
|
@ -124,14 +128,22 @@ class PlayingNotificationClassic(
|
||||||
super.onLoadFailed(errorDrawable)
|
super.onLoadFailed(errorDrawable)
|
||||||
update(
|
update(
|
||||||
null,
|
null,
|
||||||
resolveColor(context, com.google.android.material.R.attr.colorSurface, Color.WHITE)
|
resolveColor(
|
||||||
|
context,
|
||||||
|
com.google.android.material.R.attr.colorSurface,
|
||||||
|
Color.WHITE
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLoadCleared(placeholder: Drawable?) {
|
override fun onLoadCleared(placeholder: Drawable?) {
|
||||||
update(
|
update(
|
||||||
null,
|
null,
|
||||||
resolveColor(context, com.google.android.material.R.attr.colorSurface, Color.WHITE)
|
resolveColor(
|
||||||
|
context,
|
||||||
|
com.google.android.material.R.attr.colorSurface,
|
||||||
|
Color.WHITE
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +169,11 @@ class PlayingNotificationClassic(
|
||||||
if (!VersionUtils.hasS()) {
|
if (!VersionUtils.hasS()) {
|
||||||
if (!PreferenceUtil.isColoredNotification) {
|
if (!PreferenceUtil.isColoredNotification) {
|
||||||
bgColorFinal =
|
bgColorFinal =
|
||||||
resolveColor(context, com.google.android.material.R.attr.colorSurface, Color.WHITE)
|
resolveColor(
|
||||||
|
context,
|
||||||
|
com.google.android.material.R.attr.colorSurface,
|
||||||
|
Color.WHITE
|
||||||
|
)
|
||||||
}
|
}
|
||||||
setBackgroundColor(bgColorFinal)
|
setBackgroundColor(bgColorFinal)
|
||||||
setNotificationContent(ColorUtil.isColorLight(bgColorFinal))
|
setNotificationContent(ColorUtil.isColorLight(bgColorFinal))
|
||||||
|
|
|
@ -28,8 +28,8 @@ import androidx.media.app.NotificationCompat.MediaStyle
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.activities.MainActivity
|
import code.name.monkey.retromusic.activities.MainActivity
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
||||||
|
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_QUIT
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_QUIT
|
||||||
|
@ -38,6 +38,7 @@ import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE
|
import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.request.target.CustomTarget
|
import com.bumptech.glide.request.target.CustomTarget
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@ class PlayingNotificationImpl24(
|
||||||
setSubText(song.albumName)
|
setSubText(song.albumName)
|
||||||
val bigNotificationImageSize = context.resources
|
val bigNotificationImageSize = context.resources
|
||||||
.getDimensionPixelSize(R.dimen.notification_big_image_size)
|
.getDimensionPixelSize(R.dimen.notification_big_image_size)
|
||||||
GlideApp.with(context)
|
Glide.with(context)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.songCoverOptions(song)
|
.songCoverOptions(song)
|
||||||
.load(RetroGlideExtension.getSongModel(song))
|
.load(RetroGlideExtension.getSongModel(song))
|
||||||
|
|
|
@ -4,10 +4,10 @@ import android.content.Context
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MergedImageUtils.joinImages
|
import code.name.monkey.retromusic.util.MergedImageUtils.joinImages
|
||||||
import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri
|
import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
||||||
|
|
||||||
object AutoGeneratedPlaylistBitmap {
|
object AutoGeneratedPlaylistBitmap {
|
||||||
|
@ -31,7 +31,7 @@ object AutoGeneratedPlaylistBitmap {
|
||||||
|
|
||||||
private fun getBitmapWithAlbumId(context: Context, id: Long): Bitmap? {
|
private fun getBitmapWithAlbumId(context: Context, id: Long): Bitmap? {
|
||||||
return try {
|
return try {
|
||||||
GlideApp.with(context)
|
Glide.with(context)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.transform(RoundedCorners(20))
|
.transform(RoundedCorners(20))
|
||||||
.load(getMediaStoreAlbumCoverUri(id))
|
.load(getMediaStoreAlbumCoverUri(id))
|
||||||
|
|
|
@ -24,14 +24,14 @@ import androidx.core.content.edit
|
||||||
import code.name.monkey.retromusic.App
|
import code.name.monkey.retromusic.App
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.showToast
|
import code.name.monkey.retromusic.extensions.showToast
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
|
|
||||||
|
|
||||||
class CustomArtistImageUtil private constructor(context: Context) {
|
class CustomArtistImageUtil private constructor(context: Context) {
|
||||||
|
@ -45,7 +45,7 @@ class CustomArtistImageUtil private constructor(context: Context) {
|
||||||
val context = App.getContext()
|
val context = App.getContext()
|
||||||
withContext(IO) {
|
withContext(IO) {
|
||||||
runCatching {
|
runCatching {
|
||||||
GlideApp.with(context)
|
Glide.with(context)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.load(uri)
|
.load(uri)
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||||
|
|
|
@ -11,6 +11,7 @@ import code.name.monkey.retromusic.databinding.SimpleAppbarLayoutBinding
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import com.google.android.material.appbar.AppBarLayout
|
import com.google.android.material.appbar.AppBarLayout
|
||||||
import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL
|
import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL
|
||||||
|
import com.google.android.material.appbar.MaterialToolbar
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import dev.chrisbanes.insetter.applyInsetter
|
import dev.chrisbanes.insetter.applyInsetter
|
||||||
|
|
||||||
|
@ -52,24 +53,24 @@ class TopAppBarLayout @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val toolbar: Toolbar
|
val toolbar: MaterialToolbar
|
||||||
get() = if (mode == AppBarMode.COLLAPSING) {
|
get() = if (mode == AppBarMode.COLLAPSING) {
|
||||||
collapsingAppbarBinding?.toolbar!!
|
collapsingAppbarBinding?.toolbar!!
|
||||||
} else {
|
} else {
|
||||||
simpleAppbarBinding?.toolbar!!
|
simpleAppbarBinding?.toolbar!!
|
||||||
}
|
}
|
||||||
|
|
||||||
var title: String
|
var title: CharSequence
|
||||||
get() = if (mode == AppBarMode.COLLAPSING) {
|
get() = if (mode == AppBarMode.COLLAPSING) {
|
||||||
collapsingAppbarBinding?.collapsingToolbarLayout?.title.toString()
|
collapsingAppbarBinding?.collapsingToolbarLayout?.title.toString()
|
||||||
} else {
|
} else {
|
||||||
simpleAppbarBinding?.appNameText?.text.toString()
|
simpleAppbarBinding?.toolbar?.title.toString()
|
||||||
}
|
}
|
||||||
set(value) {
|
set(value) {
|
||||||
if (mode == AppBarMode.COLLAPSING) {
|
if (mode == AppBarMode.COLLAPSING) {
|
||||||
collapsingAppbarBinding?.collapsingToolbarLayout?.title = value
|
collapsingAppbarBinding?.collapsingToolbarLayout?.title = value
|
||||||
} else {
|
} else {
|
||||||
simpleAppbarBinding?.appNameText?.text = value
|
simpleAppbarBinding?.toolbar?.title = value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,24 +7,17 @@
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:transitionGroup="true"
|
android:transitionGroup="true"
|
||||||
android:transitionName="@string/transition_album_art"
|
android:transitionName="@string/transition_album_art">
|
||||||
tools:ignore="UnusedAttribute">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/toolbar_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
style="@style/Toolbar"
|
style="@style/Toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:navigationIcon="@drawable/ic_arrow_back" />
|
app:navigationIcon="@drawable/ic_arrow_back" />
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
android:id="@+id/albumCoverContainer"
|
android:id="@+id/albumCoverContainer"
|
||||||
|
@ -37,7 +30,7 @@
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintDimensionRatio="1:1"
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/toolbar_container">
|
app:layout_constraintTop_toBottomOf="@id/toolbar">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/image"
|
android:id="@+id/image"
|
||||||
|
@ -61,7 +54,7 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
app:layout_constraintHorizontal_bias="0.5"
|
||||||
app:layout_constraintStart_toEndOf="@+id/albumCoverContainer"
|
app:layout_constraintStart_toEndOf="@+id/albumCoverContainer"
|
||||||
app:layout_constraintTop_toBottomOf="@id/toolbar_container">
|
app:layout_constraintTop_toBottomOf="@id/toolbar">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -5,24 +5,17 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
tools:ignore="UnusedAttribute">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/toolbar_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
style="@style/Toolbar"
|
style="@style/Toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:navigationIcon="@drawable/ic_arrow_back" />
|
app:navigationIcon="@drawable/ic_arrow_back" />
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
android:id="@+id/artistCoverContainer"
|
android:id="@+id/artistCoverContainer"
|
||||||
|
@ -36,7 +29,7 @@
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintDimensionRatio="1:1"
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/toolbar_container">
|
app:layout_constraintTop_toBottomOf="@id/toolbar">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
android:id="@+id/image"
|
android:id="@+id/image"
|
||||||
|
@ -60,7 +53,7 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
app:layout_constraintHorizontal_bias="0.5"
|
||||||
app:layout_constraintStart_toEndOf="@+id/artistCoverContainer"
|
app:layout_constraintStart_toEndOf="@+id/artistCoverContainer"
|
||||||
app:layout_constraintTop_toBottomOf="@id/toolbar_container">
|
app:layout_constraintTop_toBottomOf="@id/toolbar">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -18,42 +18,12 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true">
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
<code.name.monkey.retromusic.views.TopAppBarLayout
|
||||||
android:id="@+id/appBarLayout"
|
android:id="@+id/appBarLayout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
app:liftOnScroll="true">
|
app:liftOnScroll="true" />
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layout_scrollFlags="scroll|enterAlways">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
|
||||||
android:id="@+id/toolbar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:navigationIcon="@drawable/ic_search"
|
|
||||||
app:popupTheme="?attr/toolbarPopupTheme"
|
|
||||||
app:title="@null"
|
|
||||||
tools:ignore="UnusedAttribute">
|
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
|
||||||
android:id="@+id/appNameText"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:textAppearance="@style/TextViewHeadline6"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
</androidx.appcompat.widget.Toolbar>
|
|
||||||
|
|
||||||
<ViewStub
|
|
||||||
android:id="@+id/cab_stub"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="@dimen/toolbar_height" />
|
|
||||||
</FrameLayout>
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
|
||||||
|
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
android:id="@+id/container"
|
android:id="@+id/container"
|
||||||
|
|
|
@ -22,9 +22,4 @@
|
||||||
app:navigationIcon="@drawable/ic_search"
|
app:navigationIcon="@drawable/ic_search"
|
||||||
app:titleTextAppearance="@style/ToolbarTextAppearanceNormal"
|
app:titleTextAppearance="@style/ToolbarTextAppearanceNormal"
|
||||||
tools:title="@string/songs" />
|
tools:title="@string/songs" />
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/toolbar_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
|
@ -14,18 +14,12 @@
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
app:liftOnScroll="true">
|
app:liftOnScroll="true">
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/toolbar_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
style="@style/Toolbar"
|
style="@style/Toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:navigationIcon="@drawable/ic_arrow_back" />
|
app:navigationIcon="@drawable/ic_arrow_back" />
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue