Merge pull request #1257 from prathameshmm02/dev

Fixed some crashes and bugs
This commit is contained in:
Daksh P. Jain 2022-02-17 21:50:45 +05:30 committed by GitHub
commit eaa036936a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
93 changed files with 317 additions and 309 deletions

View file

@ -35,9 +35,9 @@
|:-----: |:-----: |:-----: |:-----: |:-----: | |:-----: |:-----: |:-----: |:-----: |:-----: |
| Normal | Fit | Flat | Color | Material | | Normal | Fit | Flat | Color | Material |
| <img src="screenshots/classic.jpg" width="200"/> |<img src="screenshots/adaptive.jpg" width="200"/>| <img src="screenshots/blur.jpg" width="200"/> | <img src="screenshots/tiny.jpg" width="200"/> | <img src="screenshots/peak.jpg" width="200"/> | | <img src="screenshots/classic.jpg" width="200"/> |<img src="screenshots/adaptive.jpg" width="200"/>| <img src="screenshots/blur.jpg" width="200"/> | <img src="screenshots/tiny.jpg" width="200"/> | <img src="screenshots/peek.jpg" width="200"/> |
|:-----: |:-----: |:-----: |:-----: |:-----: | |:-----: |:-----: |:-----: |:-----: |:-----: |
| Classic | Adaptive | Blur | Tiny | Peak | | Classic | Adaptive | Blur | Tiny | Peek |
### 🧭 Navigation never made easier ### 🧭 Navigation never made easier
Self-explanatory interface without overloaded menus. Self-explanatory interface without overloaded menus.

View file

@ -14,8 +14,8 @@ android {
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
applicationId "code.name.monkey.retromusic" applicationId "code.name.monkey.retromusic"
versionCode 10564 versionCode 10567
versionName '5.7.1' versionName '5.7.2'
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')}\"")
} }
@ -113,7 +113,7 @@ dependencies {
implementation "androidx.room:room-ktx:$room_version" implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version" kapt "androidx.room:room-compiler:$room_version"
def lifecycle_version = "2.5.0-alpha01" def lifecycle_version = "2.4.1"
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"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
@ -126,7 +126,7 @@ dependencies {
def retrofit_version = '2.9.0' def retrofit_version = '2.9.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.3' implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.4'
def material_dialog_version = "3.3.0" def material_dialog_version = "3.3.0"
implementation "com.afollestad.material-dialogs:core:$material_dialog_version" implementation "com.afollestad.material-dialogs:core:$material_dialog_version"
@ -146,9 +146,10 @@ dependencies {
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"
implementation 'com.github.bumptech.glide:glide:4.12.0' def glide_version = '4.13.0'
kapt 'com.github.bumptech.glide:compiler:4.12.0' implementation "com.github.bumptech.glide:glide:$glide_version"
implementation 'com.github.bumptech.glide:okhttp3-integration:4.12.0' kapt "com.github.bumptech.glide:compiler:$glide_version"
implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'

View file

@ -38,7 +38,8 @@
android:name=".activities.MainActivity" android:name=".activities.MainActivity"
android:exported="true" android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/SplashTheme"> android:theme="@style/SplashTheme"
android:launchMode="singleTop">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MUSIC_PLAYER" /> <action android:name="android.intent.action.MUSIC_PLAYER" />

View file

@ -58,21 +58,28 @@
} }
{style-placeholder} {style-placeholder}
</style> </style>
</head> </head>
<body> <body>
<div>
<h5>February 13, 2022</h5>
<h2>v5.7.2<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Animated splash screen on Android 12 devices</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed crash when removing song from Playing queue</li>
<li>Fixed lyrics editing crash</li>
<li>Fixed shuffle button not working</li>
<li>Fixed crash on song deletion</li>
</ul>
</div>
<div> <div>
<h5>February 1, 2022</h5> <h5>February 1, 2022</h5>
<h2>v5.7.1</h2> <h2>v5.7.1<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3> <h3>What's New</h3>
<ul> <ul>
<li>Added option to disable changing song by swiping anywhere on the now playing screen</li> <li>Added option to disable changing song by swiping anywhere on the now playing screen</li>

View file

@ -15,10 +15,10 @@
package code.name.monkey.retromusic.activities package code.name.monkey.retromusic.activities
import android.app.KeyguardManager import android.app.KeyguardManager
import android.content.Context
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.WindowManager import android.view.WindowManager
import androidx.core.content.getSystemService
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
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
@ -63,8 +63,8 @@ class LockScreenActivity : AbsMusicServiceActivity() {
override fun onSlideClosed(): Boolean { override fun onSlideClosed(): Boolean {
if (VersionUtils.hasOreo()) { if (VersionUtils.hasOreo()) {
val keyguardManager = val keyguardManager =
getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager getSystemService<KeyguardManager>()
keyguardManager.requestDismissKeyguard(this@LockScreenActivity, null) keyguardManager?.requestDismissKeyguard(this@LockScreenActivity, null)
} }
finish() finish()
return true return true
@ -86,8 +86,8 @@ class LockScreenActivity : AbsMusicServiceActivity() {
private fun lockScreenInit() { private fun lockScreenInit() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true) setShowWhenLocked(true)
val keyguardManager: KeyguardManager = getSystemService(KeyguardManager::class.java) val keyguardManager = getSystemService<KeyguardManager>()
keyguardManager.requestDismissKeyguard(this, null) keyguardManager?.requestDismissKeyguard(this, null)
} else { } else {
this.window.addFlags( this.window.addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or

View file

@ -129,15 +129,15 @@ class MainActivity : AbsCastActivity(), OnSharedPreferenceChangeListener {
override fun onSupportNavigateUp(): Boolean = override fun onSupportNavigateUp(): Boolean =
findNavController(R.id.fragment_container).navigateUp() findNavController(R.id.fragment_container).navigateUp()
override fun onResume() { override fun onNewIntent(intent: Intent?) {
super.onResume() super.onNewIntent(intent)
PreferenceUtil.registerOnSharedPreferenceChangedListener(this) PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
val expand = extra<Boolean>(EXPAND_PANEL).value ?: false val expand = intent?.extra<Boolean>(EXPAND_PANEL)?.value ?: false
if (expand && PreferenceUtil.isExpandPanel) { if (expand && PreferenceUtil.isExpandPanel) {
fromNotification = true fromNotification = true
slidingPanel.bringToFront() slidingPanel.bringToFront()
expandPanel() expandPanel()
intent.removeExtra(EXPAND_PANEL) intent?.removeExtra(EXPAND_PANEL)
} }
} }

View file

@ -54,7 +54,7 @@ import code.name.monkey.retromusic.fragments.player.full.FullPlayerFragment
import code.name.monkey.retromusic.fragments.player.gradient.GradientPlayerFragment import code.name.monkey.retromusic.fragments.player.gradient.GradientPlayerFragment
import code.name.monkey.retromusic.fragments.player.material.MaterialFragment import code.name.monkey.retromusic.fragments.player.material.MaterialFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
import code.name.monkey.retromusic.fragments.player.peak.PeakPlayerFragment import code.name.monkey.retromusic.fragments.player.peek.PeekPlayerFragment
import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment
import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment
import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment
@ -241,7 +241,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
ViewTreeObserver.OnGlobalLayoutListener { ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() { override fun onGlobalLayout() {
binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
if (nowPlayingScreen != Peak) { if (nowPlayingScreen != Peek) {
val params = binding.slidingPanel.layoutParams as ViewGroup.LayoutParams val params = binding.slidingPanel.layoutParams as ViewGroup.LayoutParams
params.height = ViewGroup.LayoutParams.MATCH_PARENT params.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.slidingPanel.layoutParams = params binding.slidingPanel.layoutParams = params
@ -454,7 +454,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
Color -> ColorFragment() Color -> ColorFragment()
Gradient -> GradientPlayerFragment() Gradient -> GradientPlayerFragment()
Tiny -> TinyPlayerFragment() Tiny -> TinyPlayerFragment()
Peak -> PeakPlayerFragment() Peek -> PeekPlayerFragment()
Circle -> CirclePlayerFragment() Circle -> CirclePlayerFragment()
Classic -> ClassicPlayerFragment() Classic -> ClassicPlayerFragment()
else -> PlayerFragment() else -> PlayerFragment()

View file

@ -29,6 +29,7 @@ import android.widget.Toast
import androidx.annotation.StringDef import androidx.annotation.StringDef
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.appthemehelper.util.MaterialUtil
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
@ -161,9 +162,9 @@ open class BugReportActivity : AbsThemeActivity() {
} }
private fun copyDeviceInfoToClipBoard() { private fun copyDeviceInfoToClipBoard() {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clipboard = getSystemService<ClipboardManager>()
val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown()) val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown())
clipboard.setPrimaryClip(clip) clipboard?.setPrimaryClip(clip)
Toast.makeText( Toast.makeText(
this@BugReportActivity, this@BugReportActivity,
R.string.copied_device_info_to_clipboard, R.string.copied_device_info_to_clipboard,

View file

@ -138,7 +138,7 @@ class AlbumCoverPagerAdapter(
private fun getLayoutWithPlayerTheme(): Int { private fun getLayoutWithPlayerTheme(): Int {
return when (PreferenceUtil.nowPlayingScreen) { return when (PreferenceUtil.nowPlayingScreen) {
Card, Fit, Tiny, Classic, Gradient, Full -> R.layout.fragment_album_full_cover Card, Fit, Tiny, Classic, Gradient, Full -> R.layout.fragment_album_full_cover
Peak -> R.layout.fragment_peak_album_cover Peek -> R.layout.fragment_peek_album_cover
else -> { else -> {
if (PreferenceUtil.isCarouselEffect) { if (PreferenceUtil.isCarouselEffect) {
R.layout.fragment_album_carousel_cover R.layout.fragment_album_carousel_cover

View file

@ -21,14 +21,15 @@ import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon import android.graphics.drawable.Icon
import android.os.Build import android.os.Build
import androidx.core.content.getSystemService
import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
@TargetApi(Build.VERSION_CODES.N_MR1) @TargetApi(Build.VERSION_CODES.N_MR1)
class DynamicShortcutManager(private val context: Context) { class DynamicShortcutManager(private val context: Context) {
private val shortcutManager: ShortcutManager = private val shortcutManager: ShortcutManager? =
this.context.getSystemService(ShortcutManager::class.java) this.context.getSystemService()
private val defaultShortcuts: List<ShortcutInfo> private val defaultShortcuts: List<ShortcutInfo>
get() = listOf( get() = listOf(
@ -39,12 +40,12 @@ class DynamicShortcutManager(private val context: Context) {
fun initDynamicShortcuts() { fun initDynamicShortcuts() {
// if (shortcutManager.dynamicShortcuts.size == 0) { // if (shortcutManager.dynamicShortcuts.size == 0) {
shortcutManager.dynamicShortcuts = defaultShortcuts shortcutManager?.dynamicShortcuts = defaultShortcuts
// } // }
} }
fun updateDynamicShortcuts() { fun updateDynamicShortcuts() {
shortcutManager.updateShortcuts(defaultShortcuts) shortcutManager?.updateShortcuts(defaultShortcuts)
} }
companion object { companion object {
@ -66,7 +67,7 @@ class DynamicShortcutManager(private val context: Context) {
} }
fun reportShortcutUsed(context: Context, shortcutId: String) { fun reportShortcutUsed(context: Context, shortcutId: String) {
context.getSystemService(ShortcutManager::class.java).reportShortcutUsed(shortcutId) context.getSystemService<ShortcutManager>()?.reportShortcutUsed(shortcutId)
} }
} }
} }

View file

@ -18,6 +18,9 @@ import android.app.Activity
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 android.provider.MediaStore
import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
@ -61,56 +64,75 @@ class DeleteSongsDialog : DialogFragment() {
libraryViewModel = activity?.getViewModel() as LibraryViewModel libraryViewModel = activity?.getViewModel() as LibraryViewModel
val songs = extraNotNull<List<Song>>(EXTRA_SONG).value val songs = extraNotNull<List<Song>>(EXTRA_SONG).value
if (VersionUtils.hasR()) { if (VersionUtils.hasR()) {
dismiss() val deleteResultLauncher =
MusicUtil.deleteTracksR(requireActivity(), songs) registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
reloadTabs() if (result.resultCode == Activity.RESULT_OK) {
} if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) {
val pair = if (songs.size > 1) { MusicPlayerRemote.playNextSong()
Pair( }
R.string.delete_songs_title, MusicPlayerRemote.removeFromQueue(songs)
HtmlCompat.fromHtml(
String.format(getString(R.string.delete_x_songs), songs.size),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
)
} else {
Pair(
R.string.delete_song_title,
HtmlCompat.fromHtml(
String.format(getString(R.string.delete_song_x), songs[0].title),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
)
}
return materialDialog()
.title(pair.first)
.message(text = pair.second)
.noAutoDismiss()
.negativeButton(android.R.string.cancel) {
dismiss()
}
.positiveButton(R.string.action_delete) {
if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) {
MusicPlayerRemote.playNextSong()
}
if (!SAFUtil.isSAFRequiredForSongs(songs)) {
CoroutineScope(Dispatchers.IO).launch {
dismiss()
MusicUtil.deleteTracks(requireContext(), songs)
reloadTabs() reloadTabs()
} }
} else { dismiss()
if (SAFUtil.isSDCardAccessGranted(requireActivity())) { }
deleteSongs(songs) val pendingIntent =
MediaStore.createDeleteRequest(requireActivity().contentResolver, songs.map {
MusicUtil.getSongFileUri(it.id)
})
deleteResultLauncher.launch(
IntentSenderRequest.Builder(pendingIntent.intentSender).build()
)
return super.onCreateDialog(savedInstanceState)
} else {
val pair = if (songs.size > 1) {
Pair(
R.string.delete_songs_title,
HtmlCompat.fromHtml(
String.format(getString(R.string.delete_x_songs), songs.size),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
)
} else {
Pair(
R.string.delete_song_title,
HtmlCompat.fromHtml(
String.format(getString(R.string.delete_song_x), songs[0].title),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
)
}
return materialDialog()
.title(pair.first)
.message(text = pair.second)
.noAutoDismiss()
.negativeButton(android.R.string.cancel)
{
dismiss()
}
.positiveButton(R.string.action_delete)
{
if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) {
MusicPlayerRemote.playNextSong()
}
if (!SAFUtil.isSAFRequiredForSongs(songs)) {
CoroutineScope(Dispatchers.IO).launch {
dismiss()
MusicUtil.deleteTracks(requireContext(), songs)
reloadTabs()
}
} else { } else {
startActivityForResult( if (SAFUtil.isSDCardAccessGranted(requireActivity())) {
Intent(requireActivity(), SAFGuideActivity::class.java), deleteSongs(songs)
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE } else {
) startActivityForResult(
Intent(requireActivity(), SAFGuideActivity::class.java),
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE
)
}
} }
} }
} }
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

View file

@ -17,7 +17,6 @@ package code.name.monkey.retromusic.dialogs
import android.app.AlarmManager import android.app.AlarmManager
import android.app.Dialog import android.app.Dialog
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.CountDownTimer import android.os.CountDownTimer
@ -26,6 +25,7 @@ import android.widget.CheckBox
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.core.content.getSystemService
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
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
@ -93,8 +93,8 @@ class SleepTimerDialog : DialogFragment() {
val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT)
val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000 val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000
PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt()
val am = requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager val am = requireContext().getSystemService<AlarmManager>()
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi) am?.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi)
Toast.makeText( Toast.makeText(
requireContext(), requireContext(),
@ -105,9 +105,8 @@ class SleepTimerDialog : DialogFragment() {
.setNegativeButton(android.R.string.cancel) { _, _ -> .setNegativeButton(android.R.string.cancel) { _, _ ->
val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE)
if (previous != null) { if (previous != null) {
val am = val am = requireContext().getSystemService<AlarmManager>()
requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager am?.cancel(previous)
am.cancel(previous)
previous.cancel() previous.cancel()
Toast.makeText( Toast.makeText(
requireContext(), requireContext(),

View file

@ -14,8 +14,8 @@
*/ */
package code.name.monkey.retromusic.extensions package code.name.monkey.retromusic.extensions
import android.R
import android.app.Activity import android.app.Activity
import android.content.Intent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.DimenRes import androidx.annotation.DimenRes
@ -33,6 +33,11 @@ inline fun <reified T : Any> Activity.extra(key: String, default: T? = null) = l
if (value is T) value else default if (value is T) value else default
} }
inline fun <reified T : Any> Intent.extra(key: String, default: T? = null) = lazy {
val value = extras?.get(key)
if (value is T) value else default
}
inline fun <reified T : Any> Activity.extraNotNull(key: String, default: T? = null) = lazy { inline fun <reified T : Any> Activity.extraNotNull(key: String, default: T? = null) = lazy {
val value = intent?.extras?.get(key) val value = intent?.extras?.get(key)
requireNotNull(if (value is T) value else default) { key } requireNotNull(if (value is T) value else default) { key }
@ -42,4 +47,4 @@ fun Activity.dip(@DimenRes id: Int): Int {
return resources.getDimensionPixelSize(id) return resources.getDimensionPixelSize(id)
} }
inline val Activity.rootView: View get() = findViewById<ViewGroup>(R.id.content).getChildAt(0) inline val Activity.rootView: View get() = findViewById<ViewGroup>(android.R.id.content).getChildAt(0)

View file

@ -39,5 +39,5 @@ fun AlertDialog.colorButtons(): AlertDialog {
fun Fragment.materialDialog(): MaterialDialog { fun Fragment.materialDialog(): MaterialDialog {
return MaterialDialog(requireContext()) return MaterialDialog(requireContext())
.cornerRadius(res = R.dimen.m3_alert_dialog_corner_size) .cornerRadius(res = R.dimen.m3_dialog_corner_size)
} }

View file

@ -22,6 +22,7 @@ import android.widget.Toast
import androidx.annotation.* import androidx.annotation.*
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
@ -41,7 +42,7 @@ val Context.generalThemeValue
fun Context.isSystemDarkModeEnabled(): Boolean { fun Context.isSystemDarkModeEnabled(): Boolean {
val isBatterySaverEnabled = val isBatterySaverEnabled =
(getSystemService(Context.POWER_SERVICE) as PowerManager?)?.isPowerSaveMode ?: false (getSystemService<PowerManager>())?.isPowerSaveMode ?: false
val isDarkModeEnabled = val isDarkModeEnabled =
(resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
return isBatterySaverEnabled or isDarkModeEnabled return isBatterySaverEnabled or isDarkModeEnabled

View file

@ -16,7 +16,6 @@ package code.name.monkey.retromusic.extensions
import android.animation.Animator import android.animation.Animator
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -27,6 +26,7 @@ import androidx.annotation.LayoutRes
import androidx.annotation.Px import androidx.annotation.Px
import androidx.core.animation.doOnEnd import androidx.core.animation.doOnEnd
import androidx.core.animation.doOnStart import androidx.core.animation.doOnStart
import androidx.core.content.getSystemService
import androidx.core.view.* import androidx.core.view.*
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
@ -95,8 +95,8 @@ fun View.focusAndShowKeyboard() {
// We still post the call, just in case we are being notified of the windows focus // We still post the call, just in case we are being notified of the windows focus
// but InputMethodManager didn't get properly setup yet. // but InputMethodManager didn't get properly setup yet.
val imm = val imm =
context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager context.getSystemService<InputMethodManager>()
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
} }
} }
} }

View file

@ -40,7 +40,7 @@ enum class NowPlayingScreen constructor(
Gradient(R.string.gradient, R.drawable.np_gradient, 17, AlbumCoverStyle.Full), Gradient(R.string.gradient, R.drawable.np_gradient, 17, AlbumCoverStyle.Full),
Material(R.string.material, R.drawable.np_material, 11, AlbumCoverStyle.Normal), Material(R.string.material, R.drawable.np_material, 11, AlbumCoverStyle.Normal),
Normal(R.string.normal, R.drawable.np_normal, 0, AlbumCoverStyle.Normal), Normal(R.string.normal, R.drawable.np_normal, 0, AlbumCoverStyle.Normal),
Peak(R.string.peak, R.drawable.np_peak, 14, AlbumCoverStyle.Normal), Peek(R.string.peek, R.drawable.np_peek, 14, AlbumCoverStyle.Normal),
Plain(R.string.plain, R.drawable.np_plain, 3, AlbumCoverStyle.Normal), Plain(R.string.plain, R.drawable.np_plain, 3, AlbumCoverStyle.Normal),
Simple(R.string.simple, R.drawable.np_simple, 8, AlbumCoverStyle.Normal), Simple(R.string.simple, R.drawable.np_simple, 8, AlbumCoverStyle.Normal),
Tiny(R.string.tiny, R.drawable.np_tiny, 7, null), Tiny(R.string.tiny, R.drawable.np_tiny, 7, null),

View file

@ -82,7 +82,6 @@ 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.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
import java.util.*
class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details), class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details),
IAlbumClickListener, ICabHolder { IAlbumClickListener, ICabHolder {

View file

@ -5,7 +5,10 @@ import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.text.Spanned import android.text.Spanned
import android.view.* import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
@ -51,7 +54,6 @@ 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.*
import kotlin.collections.ArrayList
abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details), abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details),
IAlbumClickListener, ICabHolder { IAlbumClickListener, ICabHolder {

View file

@ -306,7 +306,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme
super.onResume() super.onResume()
val nps = PreferenceUtil.nowPlayingScreen val nps = PreferenceUtil.nowPlayingScreen
if (nps == NowPlayingScreen.Circle || nps == NowPlayingScreen.Peak || nps == NowPlayingScreen.Tiny) { if (nps == NowPlayingScreen.Circle || nps == NowPlayingScreen.Peek || nps == NowPlayingScreen.Tiny) {
playerToolbar()?.menu?.removeItem(R.id.action_toggle_lyrics) playerToolbar()?.menu?.removeItem(R.id.action_toggle_lyrics)
} else { } else {
playerToolbar()?.menu?.findItem(R.id.action_toggle_lyrics)?.apply { playerToolbar()?.menu?.findItem(R.id.action_toggle_lyrics)?.apply {

View file

@ -19,7 +19,10 @@ import android.media.MediaScannerConnection
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.text.Html import android.text.Html
import android.view.* import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.webkit.MimeTypeMap import android.webkit.MimeTypeMap
import android.widget.Toast import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
@ -57,8 +60,9 @@ import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListene
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
import code.name.monkey.retromusic.providers.BlacklistStore import code.name.monkey.retromusic.providers.BlacklistStore
import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.FileUtil
import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create import code.name.monkey.retromusic.util.ThemedFastScroller.create
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
@ -70,7 +74,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialFadeThrough import com.google.android.material.transition.MaterialFadeThrough
import java.io.* import java.io.File
import java.io.FileFilter
import java.io.IOException
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.*

View file

@ -38,7 +38,6 @@ import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialSharedAxis import com.google.android.material.transition.MaterialSharedAxis
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
import java.util.*
class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) { class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) {
private val arguments by navArgs<GenreDetailsFragmentArgs>() private val arguments by navArgs<GenreDetailsFragmentArgs>()

View file

@ -145,6 +145,7 @@ class LyricsFragment : AbsMusicServiceFragment(R.layout.fragment_lyrics) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
updateTitleSong()
enterTransition = Fade() enterTransition = Fade()
exitTransition = Fade() exitTransition = Fade()
lyricsSectionsAdapter = LyricsSectionsAdapter(requireActivity()) lyricsSectionsAdapter = LyricsSectionsAdapter(requireActivity())

View file

@ -14,7 +14,6 @@
*/ */
package code.name.monkey.retromusic.fragments.other package code.name.monkey.retromusic.fragments.other
import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.media.AudioManager import android.media.AudioManager
@ -23,6 +22,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.SeekBar import android.widget.SeekBar
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
@ -42,7 +42,7 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
private var audioVolumeObserver: AudioVolumeObserver? = null private var audioVolumeObserver: AudioVolumeObserver? = null
private val audioManager: AudioManager private val audioManager: AudioManager
get() = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager get() = requireContext().getSystemService()!!
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,

View file

@ -14,10 +14,8 @@
*/ */
package code.name.monkey.retromusic.fragments.player.adaptive package code.name.monkey.retromusic.fragments.player.adaptive
import android.animation.ObjectAnimator
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -31,7 +29,6 @@ import code.name.monkey.retromusic.databinding.FragmentAdaptivePlayerPlaybackCon
import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
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

View file

@ -14,11 +14,9 @@
*/ */
package code.name.monkey.retromusic.fragments.player.card package code.name.monkey.retromusic.fragments.player.card
import android.animation.ObjectAnimator
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
@ -36,7 +34,6 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
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.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
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

View file

@ -14,12 +14,10 @@
*/ */
package code.name.monkey.retromusic.fragments.player.cardblur package code.name.monkey.retromusic.fragments.player.cardblur
import android.animation.ObjectAnimator
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.ColorUtil
@ -33,7 +31,6 @@ import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor

View file

@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.player.circle
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
@ -28,8 +27,12 @@ import android.view.animation.Animation
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import android.widget.SeekBar import android.widget.SeekBar
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.* import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentCirclePlayerBinding import code.name.monkey.retromusic.databinding.FragmentCirclePlayerBinding
import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.extensions.*
@ -38,7 +41,10 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
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.* 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.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
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
@ -64,7 +70,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private var audioVolumeObserver: AudioVolumeObserver? = null private var audioVolumeObserver: AudioVolumeObserver? = null
private val audioManager: AudioManager private val audioManager: AudioManager
get() = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager get() = requireContext().getSystemService()!!
private var _binding: FragmentCirclePlayerBinding? = null private var _binding: FragmentCirclePlayerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!

View file

@ -15,14 +15,12 @@
package code.name.monkey.retromusic.fragments.player.color package code.name.monkey.retromusic.fragments.player.color
import android.animation.Animator import android.animation.Animator
import android.animation.ObjectAnimator
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewAnimationUtils import android.view.ViewAnimationUtils
import android.view.animation.AccelerateInterpolator import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -38,7 +36,6 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
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.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
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 kotlin.math.sqrt import kotlin.math.sqrt

View file

@ -14,11 +14,9 @@
*/ */
package code.name.monkey.retromusic.fragments.player.fit package code.name.monkey.retromusic.fragments.player.fit
import android.animation.ObjectAnimator
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -33,7 +31,6 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
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.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
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

View file

@ -14,7 +14,6 @@
*/ */
package code.name.monkey.retromusic.fragments.player.full package code.name.monkey.retromusic.fragments.player.full
import android.animation.ObjectAnimator
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
@ -24,7 +23,6 @@ import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -49,7 +47,6 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
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.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

View file

@ -14,11 +14,9 @@
*/ */
package code.name.monkey.retromusic.fragments.player.lockscreen package code.name.monkey.retromusic.fragments.player.lockscreen
import android.animation.ObjectAnimator
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -34,7 +32,6 @@ import code.name.monkey.retromusic.extensions.textColorSecondary
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor

View file

@ -14,11 +14,9 @@
*/ */
package code.name.monkey.retromusic.fragments.player.material package code.name.monkey.retromusic.fragments.player.material
import android.animation.ObjectAnimator
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -33,7 +31,6 @@ 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.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor

View file

@ -12,14 +12,12 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package code.name.monkey.retromusic.fragments.player.peak package code.name.monkey.retromusic.fragments.player.peek
import android.animation.ObjectAnimator
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -28,12 +26,11 @@ import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentPeakControlPlayerBinding import code.name.monkey.retromusic.databinding.FragmentPeekControlPlayerBinding
import code.name.monkey.retromusic.extensions.applyColor import code.name.monkey.retromusic.extensions.applyColor
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
@ -41,9 +38,9 @@ import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
* Created by hemanths on 2019-10-04. * Created by hemanths on 2019-10-04.
*/ */
class PeakPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_peak_control_player) { class PeekPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_peek_control_player) {
private var _binding: FragmentPeakControlPlayerBinding? = null private var _binding: FragmentPeekControlPlayerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
override val progressSlider: SeekBar override val progressSlider: SeekBar
@ -72,7 +69,7 @@ class PeakPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_pe
savedInstanceState: Bundle? savedInstanceState: Bundle?
) { ) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentPeakControlPlayerBinding.bind(view) _binding = FragmentPeekControlPlayerBinding.bind(view)
setUpPlayPauseFab() setUpPlayPauseFab()
} }

View file

@ -12,14 +12,14 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package code.name.monkey.retromusic.fragments.player.peak package code.name.monkey.retromusic.fragments.player.peek
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.widget.Toolbar 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.FragmentPeakPlayerBinding import code.name.monkey.retromusic.databinding.FragmentPeekPlayerBinding
import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.extensions.*
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
@ -33,17 +33,17 @@ import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
* Created by hemanths on 2019-10-03. * Created by hemanths on 2019-10-03.
*/ */
class PeakPlayerFragment : AbsPlayerFragment(R.layout.fragment_peak_player) { class PeekPlayerFragment : AbsPlayerFragment(R.layout.fragment_peek_player) {
private lateinit var controlsFragment: PeakPlayerControlFragment private lateinit var controlsFragment: PeekPlayerControlFragment
private var lastColor: Int = 0 private var lastColor: Int = 0
private var _binding: FragmentPeakPlayerBinding? = null private var _binding: FragmentPeekPlayerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentPeakPlayerBinding.bind(view) _binding = FragmentPeekPlayerBinding.bind(view)
setUpPlayerToolbar() setUpPlayerToolbar()
setUpSubFragments() setUpSubFragments()
binding.title.isSelected = true binding.title.isSelected = true
@ -58,7 +58,7 @@ class PeakPlayerFragment : AbsPlayerFragment(R.layout.fragment_peak_player) {
private fun setUpSubFragments() { private fun setUpSubFragments() {
controlsFragment = controlsFragment =
childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as PeakPlayerControlFragment childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as PeekPlayerControlFragment
val coverFragment = val coverFragment =
childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment
@ -69,7 +69,7 @@ class PeakPlayerFragment : AbsPlayerFragment(R.layout.fragment_peak_player) {
binding.playerToolbar.apply { binding.playerToolbar.apply {
inflateMenu(R.menu.menu_player) inflateMenu(R.menu.menu_player)
setNavigationOnClickListener { requireActivity().onBackPressed() } setNavigationOnClickListener { requireActivity().onBackPressed() }
setOnMenuItemClickListener(this@PeakPlayerFragment) setOnMenuItemClickListener(this@PeekPlayerFragment)
ToolbarContentTintHelper.colorizeToolbar( ToolbarContentTintHelper.colorizeToolbar(
this, this,
colorControlNormal(), colorControlNormal(),

View file

@ -14,11 +14,9 @@
*/ */
package code.name.monkey.retromusic.fragments.player.plain package code.name.monkey.retromusic.fragments.player.plain
import android.animation.ObjectAnimator
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -35,7 +33,6 @@ import code.name.monkey.retromusic.extensions.hide
import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
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

View file

@ -24,6 +24,7 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.content.getSystemService
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.FragmentTinyPlayerBinding import code.name.monkey.retromusic.databinding.FragmentTinyPlayerBinding
@ -281,7 +282,7 @@ class TinyPlayerFragment : AbsPlayerFragment(R.layout.fragment_tiny_player),
@Suppress("Deprecation") @Suppress("Deprecation")
private fun vibrate() { private fun vibrate() {
val v = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator? val v = requireContext().getSystemService<Vibrator>()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v?.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE)) v?.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE))
} else { } else {

View file

@ -15,7 +15,6 @@
package code.name.monkey.retromusic.fragments.search package code.name.monkey.retromusic.fragments.search
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.os.Bundle import android.os.Bundle
@ -26,6 +25,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.core.content.getSystemService
import androidx.core.view.* import androidx.core.view.*
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -34,7 +34,10 @@ import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.SearchAdapter import code.name.monkey.retromusic.adapter.SearchAdapter
import code.name.monkey.retromusic.databinding.FragmentSearchBinding import code.name.monkey.retromusic.databinding.FragmentSearchBinding
import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.dipToPix
import code.name.monkey.retromusic.extensions.focusAndShowKeyboard
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.views.addAlpha import code.name.monkey.retromusic.views.addAlpha
@ -45,7 +48,6 @@ import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.transition.MaterialFadeThrough import com.google.android.material.transition.MaterialFadeThrough
import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent
import java.util.* import java.util.*
import kotlin.collections.ArrayList
class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWatcher, class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWatcher,
@ -229,9 +231,9 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
private fun hideKeyboard(view: View?) { private fun hideKeyboard(view: View?) {
if (view != null) { if (view != null) {
val imm: InputMethodManager = val imm =
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager requireContext().getSystemService<InputMethodManager>()
imm.hideSoftInputFromWindow(view.windowToken, 0) imm?.hideSoftInputFromWindow(view.windowToken, 0)
} }
} }

View file

@ -34,7 +34,6 @@ import code.name.monkey.retromusic.extensions.materialDialog
import code.name.monkey.retromusic.providers.BlacklistStore import code.name.monkey.retromusic.providers.BlacklistStore
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.io.File import java.io.File
import java.util.*
class BlacklistPreference @JvmOverloads constructor( class BlacklistPreference @JvmOverloads constructor(
context: Context, context: Context,

View file

@ -30,7 +30,6 @@ import code.name.monkey.retromusic.extensions.getStringOrNull
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.providers.BlacklistStore import code.name.monkey.retromusic.providers.BlacklistStore
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import java.util.*
/** /**
* Created by hemanths on 10/08/17. * Created by hemanths on 10/08/17.

View file

@ -26,6 +26,7 @@ import android.os.PowerManager.WakeLock
import android.util.Log 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 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
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PLAY import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PLAY
@ -169,8 +170,8 @@ class MediaButtonIntentReceiver : BroadcastReceiver() {
private fun acquireWakeLockAndSendMessage(context: Context, msg: Message, delay: Long) { private fun acquireWakeLockAndSendMessage(context: Context, msg: Message, delay: Long) {
if (wakeLock == null) { if (wakeLock == null) {
val appContext = context.applicationContext val appContext = context.applicationContext
val pm = appContext.getSystemService(Context.POWER_SERVICE) as PowerManager val pm = appContext.getSystemService<PowerManager>()
wakeLock = pm.newWakeLock( wakeLock = pm?.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, PowerManager.PARTIAL_WAKE_LOCK,
"RetroMusicApp:Wakelock headset button" "RetroMusicApp:Wakelock headset button"
) )

View file

@ -40,6 +40,7 @@ import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.content.edit
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.media.AudioAttributesCompat import androidx.media.AudioAttributesCompat
import androidx.media.AudioAttributesCompat.CONTENT_TYPE_MUSIC import androidx.media.AudioAttributesCompat.CONTENT_TYPE_MUSIC
@ -123,6 +124,7 @@ class MusicService : MediaBrowserServiceCompat(),
private val appWidgetSmall = AppWidgetSmall.instance private val appWidgetSmall = AppWidgetSmall.instance
private val appWidgetText = AppWidgetText.instance private val appWidgetText = AppWidgetText.instance
private val appWidgetMd3 = AppWidgetMD3.instance private val appWidgetMd3 = AppWidgetMD3.instance
private val appWidgetCircle = AppWidgetCircle.instance
private val widgetIntentReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val widgetIntentReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
val command = intent.getStringExtra(EXTRA_APP_WIDGET_NAME) val command = intent.getStringExtra(EXTRA_APP_WIDGET_NAME)
@ -147,17 +149,20 @@ class MusicService : MediaBrowserServiceCompat(),
AppWidgetMD3.NAME -> { AppWidgetMD3.NAME -> {
appWidgetMd3.performUpdate(this@MusicService, ids) appWidgetMd3.performUpdate(this@MusicService, ids)
} }
AppWidgetCircle.NAME -> {
appWidgetCircle.performUpdate(this@MusicService, ids)
}
} }
} }
} }
} }
private var audioManager: AudioManager? = null private var audioManager: AudioManager? = null
get() { get() {
if (field == null) { if (field == null) {
field = getSystemService() field = getSystemService()
}
return field
} }
return field
}
private val becomingNoisyReceiverIntentFilter = private val becomingNoisyReceiverIntentFilter =
IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY) IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
@ -185,15 +190,15 @@ class MusicService : MediaBrowserServiceCompat(),
} }
} }
private var playerHandler: PlaybackHandler? = null private var playerHandler: PlaybackHandler? = null
private val audioFocusListener: OnAudioFocusChangeListener = private val audioFocusListener = OnAudioFocusChangeListener { focusChange ->
OnAudioFocusChangeListener { focusChange -> playerHandler?.obtainMessage(FOCUS_CHANGE, focusChange, 0)?.sendToTarget()
playerHandler?.obtainMessage(FOCUS_CHANGE, focusChange, 0)?.sendToTarget() }
}
private var playingNotification: PlayingNotification? = null private var playingNotification: PlayingNotification? = null
private val updateFavoriteReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val updateFavoriteReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
playingNotification!!.updateFavorite(currentSong) { startForegroundOrNotify() } playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() }
startForegroundOrNotify() startForegroundOrNotify()
appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED)
} }
} }
private val lockScreenReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val lockScreenReceiver: BroadcastReceiver = object : BroadcastReceiver() {
@ -209,8 +214,19 @@ class MusicService : MediaBrowserServiceCompat(),
private var queueSaveHandlerThread: HandlerThread? = null private var queueSaveHandlerThread: HandlerThread? = null
private var queuesRestored = false private var queuesRestored = false
@JvmField
var repeatMode = 0 var repeatMode = 0
private set(value) {
when (value) {
REPEAT_MODE_NONE, REPEAT_MODE_ALL, REPEAT_MODE_THIS -> {
field = value
PreferenceManager.getDefaultSharedPreferences(this).edit {
putInt(SAVED_REPEAT_MODE, value)
}
prepareNext()
handleAndSendChangeInternal(REPEAT_MODE_CHANGED)
}
}
}
@JvmField @JvmField
var shuffleMode = 0 var shuffleMode = 0
@ -222,7 +238,7 @@ class MusicService : MediaBrowserServiceCompat(),
if (action != null) { if (action != null) {
if (BluetoothDevice.ACTION_ACL_CONNECTED == action && isBluetoothSpeaker) { if (BluetoothDevice.ACTION_ACL_CONNECTED == action && isBluetoothSpeaker) {
if (audioManager!!.isBluetoothA2dpOn) { if (audioManager!!.isBluetoothA2dpOn) {
play() play()
} }
} }
} }
@ -364,12 +380,12 @@ class MusicService : MediaBrowserServiceCompat(),
unregisterReceiver(bluetoothReceiver) unregisterReceiver(bluetoothReceiver)
bluetoothConnectedRegistered = false bluetoothConnectedRegistered = false
} }
mediaSession!!.isActive = false mediaSession?.isActive = false
quit() quit()
releaseResources() releaseResources()
contentResolver.unregisterContentObserver(mediaStoreObserver) contentResolver.unregisterContentObserver(mediaStoreObserver)
unregisterOnSharedPreferenceChangedListener(this) unregisterOnSharedPreferenceChangedListener(this)
wakeLock!!.release() wakeLock?.release()
sendBroadcast(Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED")) sendBroadcast(Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED"))
} }
@ -432,10 +448,10 @@ class MusicService : MediaBrowserServiceCompat(),
} }
fun cycleRepeatMode() { fun cycleRepeatMode() {
when (getRepeatMode()) { repeatMode = when (repeatMode) {
REPEAT_MODE_NONE -> setRepeatMode(REPEAT_MODE_ALL) REPEAT_MODE_NONE -> REPEAT_MODE_ALL
REPEAT_MODE_ALL -> setRepeatMode(REPEAT_MODE_THIS) REPEAT_MODE_ALL -> REPEAT_MODE_THIS
else -> setRepeatMode(REPEAT_MODE_NONE) else -> REPEAT_MODE_NONE
} }
} }
@ -454,7 +470,7 @@ class MusicService : MediaBrowserServiceCompat(),
private fun getNextPosition(force: Boolean): Int { private fun getNextPosition(force: Boolean): Int {
var position = getPosition() + 1 var position = getPosition() + 1
when (getRepeatMode()) { when (repeatMode) {
REPEAT_MODE_ALL -> if (isLastTrack) { REPEAT_MODE_ALL -> if (isLastTrack) {
position = 0 position = 0
} }
@ -493,11 +509,11 @@ class MusicService : MediaBrowserServiceCompat(),
var newPosition = getPosition() - 1 var newPosition = getPosition() - 1
when (repeatMode) { when (repeatMode) {
REPEAT_MODE_ALL -> if (newPosition < 0) { REPEAT_MODE_ALL -> if (newPosition < 0) {
newPosition = getPlayingQueue().size - 1 newPosition = playingQueue.size - 1
} }
REPEAT_MODE_THIS -> if (force) { REPEAT_MODE_THIS -> if (force) {
if (newPosition < 0) { if (newPosition < 0) {
newPosition = getPlayingQueue().size - 1 newPosition = playingQueue.size - 1
} }
} else { } else {
newPosition = getPosition() newPosition = getPosition()
@ -520,24 +536,6 @@ class MusicService : MediaBrowserServiceCompat(),
return duration return duration
} }
fun getRepeatMode(): Int {
return repeatMode
}
fun setRepeatMode(repeatMode: Int) {
when (repeatMode) {
REPEAT_MODE_NONE, REPEAT_MODE_ALL, REPEAT_MODE_THIS -> {
this.repeatMode = repeatMode
PreferenceManager.getDefaultSharedPreferences(this)
.edit()
.putInt(SAVED_REPEAT_MODE, repeatMode)
.apply()
prepareNext()
handleAndSendChangeInternal(REPEAT_MODE_CHANGED)
}
}
}
private fun getShuffleMode(): Int { private fun getShuffleMode(): Int {
return shuffleMode return shuffleMode
} }
@ -550,7 +548,7 @@ class MusicService : MediaBrowserServiceCompat(),
when (shuffleMode) { when (shuffleMode) {
SHUFFLE_MODE_SHUFFLE -> { SHUFFLE_MODE_SHUFFLE -> {
this.shuffleMode = shuffleMode this.shuffleMode = shuffleMode
makeShuffleList(getPlayingQueue().toMutableList(), getPosition()) makeShuffleList(playingQueue, getPosition())
position = 0 position = 0
} }
SHUFFLE_MODE_NONE -> { SHUFFLE_MODE_NONE -> {
@ -558,9 +556,9 @@ class MusicService : MediaBrowserServiceCompat(),
val currentSongId = Objects.requireNonNull(currentSong).id val currentSongId = Objects.requireNonNull(currentSong).id
playingQueue = ArrayList(originalPlayingQueue) playingQueue = ArrayList(originalPlayingQueue)
var newPosition = 0 var newPosition = 0
for (song in getPlayingQueue()) { for (song in playingQueue) {
if (song.id == currentSongId) { if (song.id == currentSongId) {
newPosition = getPlayingQueue().indexOf(song) newPosition = playingQueue.indexOf(song)
} }
} }
position = newPosition position = newPosition
@ -571,8 +569,8 @@ class MusicService : MediaBrowserServiceCompat(),
} }
private fun getSongAt(position: Int): Song { private fun getSongAt(position: Int): Song {
return if ((position >= 0) && (position < getPlayingQueue().size)) { return if ((position >= 0) && (position < playingQueue.size)) {
getPlayingQueue()[position] playingQueue[position]
} else { } else {
emptySong emptySong
} }
@ -737,7 +735,7 @@ class MusicService : MediaBrowserServiceCompat(),
COLORED_NOTIFICATION -> updateNotification() COLORED_NOTIFICATION -> updateNotification()
CLASSIC_NOTIFICATION -> { CLASSIC_NOTIFICATION -> {
updateNotification() updateNotification()
playingNotification?.setPlaying(isPlaying){ startForegroundOrNotify()} playingNotification?.setPlaying(isPlaying) { startForegroundOrNotify() }
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() } playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
} }
PLAYBACK_SPEED -> updateMediaSessionPlaybackState() PLAYBACK_SPEED -> updateMediaSessionPlaybackState()
@ -980,16 +978,16 @@ class MusicService : MediaBrowserServiceCompat(),
} }
private fun removeSongImpl(song: Song) { private fun removeSongImpl(song: Song) {
for (i in playingQueue.indices) { val deletePosition = playingQueue.indexOf(song)
if (playingQueue[i].id == song.id) { if (deletePosition != -1) {
playingQueue.removeAt(i) playingQueue.removeAt(deletePosition)
rePosition(i) rePosition(deletePosition)
}
} }
for (i in originalPlayingQueue.indices) {
if (originalPlayingQueue[i].id == song.id) { val originalDeletePosition = originalPlayingQueue.indexOf(song)
originalPlayingQueue.removeAt(i) if (originalDeletePosition != -1) {
} originalPlayingQueue.removeAt(originalDeletePosition)
rePosition(originalDeletePosition)
} }
} }
@ -1005,6 +1003,19 @@ class MusicService : MediaBrowserServiceCompat(),
notifyChange(QUEUE_CHANGED) notifyChange(QUEUE_CHANGED)
} }
private fun rePosition(deletedPosition: Int) {
val currentPosition = getPosition()
if (deletedPosition < currentPosition) {
position = currentPosition - 1
} else if (deletedPosition == currentPosition) {
if (playingQueue.size > deletedPosition) {
setPosition(position)
} else {
setPosition(position - 1)
}
}
}
@Synchronized @Synchronized
fun restoreQueuesAndPositionIfNecessary() { fun restoreQueuesAndPositionIfNecessary() {
if (!queuesRestored && playingQueue.isEmpty()) { if (!queuesRestored && playingQueue.isEmpty()) {
@ -1040,10 +1051,9 @@ class MusicService : MediaBrowserServiceCompat(),
} }
fun savePositionInTrack() { fun savePositionInTrack() {
PreferenceManager.getDefaultSharedPreferences(this) PreferenceManager.getDefaultSharedPreferences(this).edit {
.edit() putInt(SAVED_POSITION_IN_TRACK, songProgressMillis)
.putInt(SAVED_POSITION_IN_TRACK, songProgressMillis) }
.apply()
} }
fun saveQueuesImpl() { fun saveQueuesImpl() {
@ -1131,7 +1141,7 @@ class MusicService : MediaBrowserServiceCompat(),
.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, null) .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, null)
metaData.putLong( metaData.putLong(
MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, MediaMetadataCompat.METADATA_KEY_NUM_TRACKS,
getPlayingQueue().size.toLong() playingQueue.size.toLong()
) )
if (isAlbumArtOnLockScreen) { if (isAlbumArtOnLockScreen) {
val screenSize = RetroUtil.getScreenSize(this@MusicService) val screenSize = RetroUtil.getScreenSize(this@MusicService)
@ -1184,7 +1194,7 @@ class MusicService : MediaBrowserServiceCompat(),
savePositionInTrack() savePositionInTrack()
} }
songPlayCountHelper.notifyPlayStateChanged(isPlaying) songPlayCountHelper.notifyPlayStateChanged(isPlaying)
playingNotification?.setPlaying(isPlaying){ startForegroundOrNotify()} playingNotification?.setPlaying(isPlaying) { startForegroundOrNotify() }
startForegroundOrNotify() startForegroundOrNotify()
} }
FAVORITE_STATE_CHANGED -> { FAVORITE_STATE_CHANGED -> {
@ -1315,19 +1325,6 @@ class MusicService : MediaBrowserServiceCompat(),
playerHandler?.obtainMessage(PREPARE_NEXT)?.sendToTarget() playerHandler?.obtainMessage(PREPARE_NEXT)?.sendToTarget()
} }
private fun rePosition(deletedPosition: Int) {
val currentPosition = getPosition()
if (deletedPosition < currentPosition) {
position = currentPosition - 1
} else if (deletedPosition == currentPosition) {
if (playingQueue.size > deletedPosition) {
setPosition(position)
} else {
setPosition(position - 1)
}
}
}
private fun registerBluetoothConnected() { private fun registerBluetoothConnected() {
Log.i(TAG, "registerBluetoothConnected: ") Log.i(TAG, "registerBluetoothConnected: ")
if (!bluetoothConnectedRegistered) { if (!bluetoothConnectedRegistered) {
@ -1380,10 +1377,9 @@ class MusicService : MediaBrowserServiceCompat(),
} }
private fun savePosition() { private fun savePosition() {
PreferenceManager.getDefaultSharedPreferences(this) PreferenceManager.getDefaultSharedPreferences(this).edit {
.edit() putInt(SAVED_POSITION, getPosition())
.putInt(SAVED_POSITION, getPosition()) }
.apply()
} }
private fun saveQueues() { private fun saveQueues() {
@ -1399,13 +1395,14 @@ class MusicService : MediaBrowserServiceCompat(),
appWidgetCard.notifyChange(this, what) appWidgetCard.notifyChange(this, what)
appWidgetText.notifyChange(this, what) appWidgetText.notifyChange(this, what)
appWidgetMd3.notifyChange(this, what) appWidgetMd3.notifyChange(this, what)
appWidgetCircle.notifyChange(this, what)
} }
private fun setCustomAction(stateBuilder: PlaybackStateCompat.Builder) { private fun setCustomAction(stateBuilder: PlaybackStateCompat.Builder) {
var repeatIcon = R.drawable.ic_repeat // REPEAT_MODE_NONE var repeatIcon = R.drawable.ic_repeat // REPEAT_MODE_NONE
if (getRepeatMode() == REPEAT_MODE_THIS) { if (repeatMode == REPEAT_MODE_THIS) {
repeatIcon = R.drawable.ic_repeat_one repeatIcon = R.drawable.ic_repeat_one
} else if (getRepeatMode() == REPEAT_MODE_ALL) { } else if (repeatMode == REPEAT_MODE_ALL) {
repeatIcon = R.drawable.ic_repeat_white_circle repeatIcon = R.drawable.ic_repeat_white_circle
} }
stateBuilder.addCustomAction( stateBuilder.addCustomAction(

View file

@ -1,20 +1,17 @@
package code.name.monkey.retromusic.util package code.name.monkey.retromusic.util
import android.app.Activity
import android.content.ContentUris import android.content.ContentUris
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Environment import android.os.Environment
import android.provider.BaseColumns import android.provider.BaseColumns
import android.provider.MediaStore import android.provider.MediaStore
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
@ -524,15 +521,6 @@ object MusicUtil : KoinComponent {
} }
} }
@RequiresApi(Build.VERSION_CODES.R)
fun deleteTracksR(activity: Activity, songs: List<Song>) {
removeFromQueue(songs)
val pendingIntent = MediaStore.createDeleteRequest(activity.contentResolver, songs.map {
getSongFileUri(it.id)
})
activity.startIntentSenderForResult(pendingIntent.intentSender, 45, null, 0, 0, 0, null)
}
fun songByGenre(genreId: Long): Song { fun songByGenre(genreId: Long): Song {
return repository.getSongByGenre(genreId) return repository.getSongByGenre(genreId)
} }

View file

@ -3,8 +3,8 @@ package code.name.monkey.retromusic.util
import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.NetworkInfo import android.net.NetworkInfo
import androidx.core.content.ContextCompat
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.content.getSystemService
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
@ -332,10 +332,7 @@ object PreferenceUtil {
return when (autoDownloadImagesPolicy) { return when (autoDownloadImagesPolicy) {
"always" -> true "always" -> true
"only_wifi" -> { "only_wifi" -> {
val connectivityManager = ContextCompat.getSystemService( val connectivityManager = App.getContext().getSystemService<ConnectivityManager>()
App.getContext(),
ConnectivityManager::class.java
)
var netInfo: NetworkInfo? = null var netInfo: NetworkInfo? = null
if (connectivityManager != null) { if (connectivityManager != null) {
netInfo = connectivityManager.activeNetworkInfo netInfo = connectivityManager.activeNetworkInfo
@ -691,7 +688,7 @@ object PreferenceUtil {
set(value) = sharedPreferences.edit { putFloat(PLAYBACK_PITCH, value) } set(value) = sharedPreferences.edit { putFloat(PLAYBACK_PITCH, value) }
val appBarMode: TopAppBarLayout.AppBarMode val appBarMode: TopAppBarLayout.AppBarMode
get() = if (sharedPreferences.getString(APPBAR_MODE, "0") == "0") { get() = if (sharedPreferences.getString(APPBAR_MODE, "1") == "0") {
TopAppBarLayout.AppBarMode.COLLAPSING TopAppBarLayout.AppBarMode.COLLAPSING
} else { } else {
TopAppBarLayout.AppBarMode.SIMPLE TopAppBarLayout.AppBarMode.SIMPLE
@ -712,6 +709,7 @@ object PreferenceUtil {
val swipeAnywhereToChangeSong val swipeAnywhereToChangeSong
get() = sharedPreferences.getBoolean(SWIPE_ANYWHERE_NOW_PLAYING, true) get() = sharedPreferences.getBoolean(SWIPE_ANYWHERE_NOW_PLAYING, true)
} }
enum class LyricsType { enum class LyricsType {
REPLACE_COVER, OVER_COVER REPLACE_COVER, OVER_COVER
} }

View file

@ -17,10 +17,11 @@ import android.content.Context
import android.media.AudioManager import android.media.AudioManager
import android.os.Handler import android.os.Handler
import android.provider.Settings import android.provider.Settings
import androidx.core.content.getSystemService
class AudioVolumeObserver(private val context: Context) { class AudioVolumeObserver(private val context: Context) {
private val mAudioManager: AudioManager = private val mAudioManager: AudioManager =
context.getSystemService(Context.AUDIO_SERVICE) as AudioManager context.getSystemService()!!
private var contentObserver: AudioVolumeContentObserver? = null private var contentObserver: AudioVolumeContentObserver? = null
fun register(audioStreamType: Int, listener: OnAudioVolumeChangedListener) { fun register(audioStreamType: Int, listener: OnAudioVolumeChangedListener) {

View file

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before After
Before After

View file

@ -101,12 +101,12 @@
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/playbackControlsFragment" android:id="@+id/playbackControlsFragment"
android:name="code.name.monkey.retromusic.fragments.player.peak.PeakPlayerControlFragment" android:name="code.name.monkey.retromusic.fragments.player.peek.PeekPlayerControlFragment"
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_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/playerAlbumCoverFragment" app:layout_constraintTop_toBottomOf="@+id/playerAlbumCoverFragment"
tools:layout="@layout/fragment_peak_control_player" /> tools:layout="@layout/fragment_peek_control_player" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -278,7 +278,7 @@
<string name="past_three_months">أخر 3 أشهر</string> <string name="past_three_months">أخر 3 أشهر</string>
<string name="paste_lyrics_here">لصق كلمات الاغنية هنا</string> <string name="paste_lyrics_here">لصق كلمات الاغنية هنا</string>
<string name="paste_timeframe_lyrics_here">لصق كلمات الإطار الزمني هنا</string> <string name="paste_timeframe_lyrics_here">لصق كلمات الإطار الزمني هنا</string>
<string name="peak">الذروة</string> <string name="peek">الذروة</string>
<string name="permission_external_storage_denied">تم رفض إذن الوصول إلى وحدة التخزين الخارجي.</string> <string name="permission_external_storage_denied">تم رفض إذن الوصول إلى وحدة التخزين الخارجي.</string>
<string name="permission_summary">يحتاج التطبيق إلى إذن للوصول إلى وحدة تخزين جهازك لتشغيل الموسيقى</string> <string name="permission_summary">يحتاج التطبيق إلى إذن للوصول إلى وحدة تخزين جهازك لتشغيل الموسيقى</string>
<string name="permission_title">الوصول إلى التخزين</string> <string name="permission_title">الوصول إلى التخزين</string>

View file

@ -271,7 +271,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Povolení přístupu k externímu úložišti bylo zamítnuto.</string> <string name="permission_external_storage_denied">Povolení přístupu k externímu úložišti bylo zamítnuto.</string>
<string name="permission_summary">Aplikace potřebuje přístup k úložišti vašeho zařízení, aby mohla přehráváat hudbu</string> <string name="permission_summary">Aplikace potřebuje přístup k úložišti vašeho zařízení, aby mohla přehráváat hudbu</string>
<string name="permission_title">Přístup k úložišti</string> <string name="permission_title">Přístup k úložišti</string>

View file

@ -254,7 +254,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Letzte 3 Monate</string> <string name="past_three_months">Letzte 3 Monate</string>
<string name="paste_lyrics_here">Songtext hier einfügen</string> <string name="paste_lyrics_here">Songtext hier einfügen</string>
<string name="paste_timeframe_lyrics_here">Songtexte mit Zeitfenster hier einfügen</string> <string name="paste_timeframe_lyrics_here">Songtexte mit Zeitfenster hier einfügen</string>
<string name="peak">Spitze</string> <string name="peek">Spitze</string>
<string name="permission_external_storage_denied">Berechtigung für den Zugriff auf externen Speicher verweigert.</string> <string name="permission_external_storage_denied">Berechtigung für den Zugriff auf externen Speicher verweigert.</string>
<string name="permission_summary">Die App benötigt die Berechtigung für den Zugriff auf den Gerätespeicher, um Musik abspielen zu können</string> <string name="permission_summary">Die App benötigt die Berechtigung für den Zugriff auf den Gerätespeicher, um Musik abspielen zu können</string>
<string name="permission_title">Speicherzugriff</string> <string name="permission_title">Speicherzugriff</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Τους περασμένους 3 μήνες</string> <string name="past_three_months">Τους περασμένους 3 μήνες</string>
<string name="paste_lyrics_here">Επικολλήστε τους στίχους εδω</string> <string name="paste_lyrics_here">Επικολλήστε τους στίχους εδω</string>
<string name="paste_timeframe_lyrics_here">Επικόλληση στίχων χρονικού πλαισίου εδώ</string> <string name="paste_timeframe_lyrics_here">Επικόλληση στίχων χρονικού πλαισίου εδώ</string>
<string name="peak">Κορυφή</string> <string name="peek">Κορυφή</string>
<string name="permission_external_storage_denied">Η άδεια για προσπέλαση του external storage δεν παραχωρήθηκε.</string> <string name="permission_external_storage_denied">Η άδεια για προσπέλαση του external storage δεν παραχωρήθηκε.</string>
<string name="permission_summary">Η εφαρμογή χρειάζεται άδεια για πρόσβαση στον αποθηκευτικό χώρο της συσκευής σας για την αναπαραγωγή μουσικής</string> <string name="permission_summary">Η εφαρμογή χρειάζεται άδεια για πρόσβαση στον αποθηκευτικό χώρο της συσκευής σας για την αναπαραγωγή μουσικής</string>
<string name="permission_title">Πρόσβαση Χώρου Αποθήκευσης</string> <string name="permission_title">Πρόσβαση Χώρου Αποθήκευσης</string>

View file

@ -340,7 +340,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>

View file

@ -266,7 +266,7 @@
<string name="past_three_months">Más de 3 meses</string> <string name="past_three_months">Más de 3 meses</string>
<string name="paste_lyrics_here">Pega las Letras Aquí</string> <string name="paste_lyrics_here">Pega las Letras Aquí</string>
<string name="paste_timeframe_lyrics_here">Pegar las letras con marcas de tiempo aquí</string> <string name="paste_timeframe_lyrics_here">Pegar las letras con marcas de tiempo aquí</string>
<string name="peak">Pico</string> <string name="peek">Pico</string>
<string name="permission_external_storage_denied">Permiso para acceder al almacenamiento externo denegado.</string> <string name="permission_external_storage_denied">Permiso para acceder al almacenamiento externo denegado.</string>
<string name="permission_summary">La aplicación necesita permiso para acceder al almacenamiento de tu dispositivo y reproducir música</string> <string name="permission_summary">La aplicación necesita permiso para acceder al almacenamiento de tu dispositivo y reproducir música</string>
<string name="permission_title">Acceso al Almacenamiento</string> <string name="permission_title">Acceso al Almacenamiento</string>

View file

@ -247,7 +247,7 @@
<string name="others">Bestelako</string> <string name="others">Bestelako</string>
<string name="password">Pasahitza</string> <string name="password">Pasahitza</string>
<string name="past_three_months">Azken 3 hilabeteak</string> <string name="past_three_months">Azken 3 hilabeteak</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Kanpoko biltegiratzera sarbidea ukatua</string> <string name="permission_external_storage_denied">Kanpoko biltegiratzera sarbidea ukatua</string>
<string name="permissions_denied">Baimenak ukatuak izan dira</string> <string name="permissions_denied">Baimenak ukatuak izan dira</string>
<string name="personalize">Pertsonalizatu</string> <string name="personalize">Pertsonalizatu</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">3 ماه گذشته</string> <string name="past_three_months">3 ماه گذشته</string>
<string name="paste_lyrics_here">متن را در اینجا بارگزاری کنید</string> <string name="paste_lyrics_here">متن را در اینجا بارگزاری کنید</string>
<string name="paste_timeframe_lyrics_here">متون زمان دار را در اینجا بارگزاری کنید</string> <string name="paste_timeframe_lyrics_here">متون زمان دار را در اینجا بارگزاری کنید</string>
<string name="peak">حالت peak</string> <string name="peek">حالت peek</string>
<string name="permission_external_storage_denied">مجوز دسترسی به حافظه رد شد</string> <string name="permission_external_storage_denied">مجوز دسترسی به حافظه رد شد</string>
<string name="permission_summary">برنامه نیاز به دسترسی به حافظه برای پخش آهنگ ها دارد</string> <string name="permission_summary">برنامه نیاز به دسترسی به حافظه برای پخش آهنگ ها دارد</string>
<string name="permission_title">دسترسی به حافظه</string> <string name="permission_title">دسترسی به حافظه</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Nakalipas na 3 buwan</string> <string name="past_three_months">Nakalipas na 3 buwan</string>
<string name="paste_lyrics_here">Idikit ang Lyrics Dito</string> <string name="paste_lyrics_here">Idikit ang Lyrics Dito</string>
<string name="paste_timeframe_lyrics_here">Idikit ang timeframe lyrics dito</string> <string name="paste_timeframe_lyrics_here">Idikit ang timeframe lyrics dito</string>
<string name="peak">Tuktok</string> <string name="peek">Tuktok</string>
<string name="permission_external_storage_denied">Tinanggihan ang pahintulot na ma-access ang panlabas na storage.</string> <string name="permission_external_storage_denied">Tinanggihan ang pahintulot na ma-access ang panlabas na storage.</string>
<string name="permission_summary">Ang app ay nangangailangan ng permiso upang ma-access ang storage ng iyong device para ma-play ang musika</string> <string name="permission_summary">Ang app ay nangangailangan ng permiso upang ma-access ang storage ng iyong device para ma-play ang musika</string>
<string name="permission_title">Access sa Storage</string> <string name="permission_title">Access sa Storage</string>

View file

@ -266,7 +266,7 @@
<string name="past_three_months">3 derniers mois</string> <string name="past_three_months">3 derniers mois</string>
<string name="paste_lyrics_here">Copiez les paroles ici</string> <string name="paste_lyrics_here">Copiez les paroles ici</string>
<string name="paste_timeframe_lyrics_here">Collez les paroles de la période ici</string> <string name="paste_timeframe_lyrics_here">Collez les paroles de la période ici</string>
<string name="peak">Aperçu</string> <string name="peek">Aperçu</string>
<string name="permission_external_storage_denied">La permission pour accéder au stockage externe a été refusée.</string> <string name="permission_external_storage_denied">La permission pour accéder au stockage externe a été refusée.</string>
<string name="permission_summary">L\'application a besoin d\'accéder au stockage de votre appareil pour lire votre musique</string> <string name="permission_summary">L\'application a besoin d\'accéder au stockage de votre appareil pour lire votre musique</string>
<string name="permission_title">Accès au stockage</string> <string name="permission_title">Accès au stockage</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -269,7 +269,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Elmúlt 3 hónap</string> <string name="past_three_months">Elmúlt 3 hónap</string>
<string name="paste_lyrics_here">Dalszöveg beillesztése ide</string> <string name="paste_lyrics_here">Dalszöveg beillesztése ide</string>
<string name="paste_timeframe_lyrics_here">Időzített dalszöveg beillesztése ide</string> <string name="paste_timeframe_lyrics_here">Időzített dalszöveg beillesztése ide</string>
<string name="peak">Csúcs</string> <string name="peek">Csúcs</string>
<string name="permission_external_storage_denied">A külső tárolási hozzáférés engedélyezése tiltva.</string> <string name="permission_external_storage_denied">A külső tárolási hozzáférés engedélyezése tiltva.</string>
<string name="permission_summary">Az alkalmazásnak engedélyre van szüksége az eszköz tárhelyéhez a zenék lejátszásához</string> <string name="permission_summary">Az alkalmazásnak engedélyre van szüksége az eszköz tárhelyéhez a zenék lejátszásához</string>
<string name="permission_title">Tárhely engedély</string> <string name="permission_title">Tárhely engedély</string>

View file

@ -265,7 +265,7 @@
<string name="past_three_months">3 bulan terakhir</string> <string name="past_three_months">3 bulan terakhir</string>
<string name="paste_lyrics_here">Tempel Lirik Disini</string> <string name="paste_lyrics_here">Tempel Lirik Disini</string>
<string name="paste_timeframe_lyrics_here">Tempel kerangka waktu lirik di sini</string> <string name="paste_timeframe_lyrics_here">Tempel kerangka waktu lirik di sini</string>
<string name="peak">Puncak</string> <string name="peek">Puncak</string>
<string name="permission_external_storage_denied">Izin untuk mengakses penyimpanan eksternal ditolak.</string> <string name="permission_external_storage_denied">Izin untuk mengakses penyimpanan eksternal ditolak.</string>
<string name="permission_summary">Aplikasi memerlukan izin untuk mengakses penyimpanan perangkat Anda untuk memutar musik</string> <string name="permission_summary">Aplikasi memerlukan izin untuk mengakses penyimpanan perangkat Anda untuk memutar musik</string>
<string name="permission_title">Akses Penyimpanan</string> <string name="permission_title">Akses Penyimpanan</string>

View file

@ -282,7 +282,7 @@ https://play.google.com/store/apps/details?id=%s</string>
<string name="past_three_months">Ultimi 3 mesi</string> <string name="past_three_months">Ultimi 3 mesi</string>
<string name="paste_lyrics_here">Incolla i testi qui</string> <string name="paste_lyrics_here">Incolla i testi qui</string>
<string name="paste_timeframe_lyrics_here">Incolla i testi sincronizzati qui</string> <string name="paste_timeframe_lyrics_here">Incolla i testi sincronizzati qui</string>
<string name="peak">Picco</string> <string name="peek">Picco</string>
<string name="permission_external_storage_denied">Autorizzazione ad accedere all\'archiviazione esterna negata.</string> <string name="permission_external_storage_denied">Autorizzazione ad accedere all\'archiviazione esterna negata.</string>
<string name="permission_summary">L\'app necessita dell\'autorizzazione ad accedere all\'archiviazione del dispositivo per riprodurre musica</string> <string name="permission_summary">L\'app necessita dell\'autorizzazione ad accedere all\'archiviazione del dispositivo per riprodurre musica</string>
<string name="permission_title">Accesso all\'archiviazione</string> <string name="permission_title">Accesso all\'archiviazione</string>

View file

@ -265,7 +265,7 @@
<string name="past_three_months">過去3ヶ月</string> <string name="past_three_months">過去3ヶ月</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">ピーク</string> <string name="peek">ピーク</string>
<string name="permission_external_storage_denied">外部ストレージへのアクセスが拒否されました</string> <string name="permission_external_storage_denied">外部ストレージへのアクセスが拒否されました</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -268,7 +268,7 @@ https://play.google.com/store/apps/details?id=%s</string>
<string name="past_three_months">3 mehên borî</string> <string name="past_three_months">3 mehên borî</string>
<string name="paste_lyrics_here">Peyvên stranê Li vir pêve bike</string> <string name="paste_lyrics_here">Peyvên stranê Li vir pêve bike</string>
<string name="paste_timeframe_lyrics_here">Peyvê stranên demsazkirî li vir binivisîne</string> <string name="paste_timeframe_lyrics_here">Peyvê stranên demsazkirî li vir binivisîne</string>
<string name="peak">Serî</string> <string name="peek">Serî</string>
<string name="permission_external_storage_denied">Mafa gihiştînê bo bîrgeha derveyî hate têkbirin.</string> <string name="permission_external_storage_denied">Mafa gihiştînê bo bîrgeha derveyî hate têkbirin.</string>
<string name="permission_summary">Pêdiviya sepanê bi gihiştîna bîrgeha derveyî ya amûra te heye ji bo lêdana muzîkê</string> <string name="permission_summary">Pêdiviya sepanê bi gihiştîna bîrgeha derveyî ya amûra te heye ji bo lêdana muzîkê</string>
<string name="permission_title">Gihîştina bergehê</string> <string name="permission_title">Gihîştina bergehê</string>

View file

@ -265,7 +265,7 @@
<string name="past_three_months">이전 3개월</string> <string name="past_three_months">이전 3개월</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">외부 저장소 접근 권한이 거부되었습니다.</string> <string name="permission_external_storage_denied">외부 저장소 접근 권한이 거부되었습니다.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -265,7 +265,7 @@
<string name="past_three_months">လွန်ခဲ့သော (၃)လ</string> <string name="past_three_months">လွန်ခဲ့သော (၃)လ</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak ပုံစံ</string> <string name="peek">Peek ပုံစံ</string>
<string name="permission_external_storage_denied">External Storage ကြည့်ရှုခွင့်အားငြင်းပယ်ခဲ့သည်။</string> <string name="permission_external_storage_denied">External Storage ကြည့်ရှုခွင့်အားငြင်းပယ်ခဲ့သည်။</string>
<string name="permission_summary">သီချင်းဖွင့်ရန်အတွက် ယခု App အား Storage ကြည့်ရှုခွင့်ပေးရန်လိုသည်။</string> <string name="permission_summary">သီချင်းဖွင့်ရန်အတွက် ယခု App အား Storage ကြည့်ရှုခွင့်ပေးရန်လိုသည်။</string>
<string name="permission_title">Storage ကြည့်ရှုခွင့်</string> <string name="permission_title">Storage ကြည့်ရှုခွင့်</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Laatste 3 maanden</string> <string name="past_three_months">Laatste 3 maanden</string>
<string name="paste_lyrics_here">Plak tekst/lyrics hier</string> <string name="paste_lyrics_here">Plak tekst/lyrics hier</string>
<string name="paste_timeframe_lyrics_here">Plak timeframe tekst/lyrics hier</string> <string name="paste_timeframe_lyrics_here">Plak timeframe tekst/lyrics hier</string>
<string name="peak">Piek</string> <string name="peek">Piek</string>
<string name="permission_external_storage_denied">Permissie voor toegang tot extern opslag is afgewezen</string> <string name="permission_external_storage_denied">Permissie voor toegang tot extern opslag is afgewezen</string>
<string name="permission_summary">De app heeft toestemming nodig tot je apparaat\'s opslag om muziek af te kunnen spelen</string> <string name="permission_summary">De app heeft toestemming nodig tot je apparaat\'s opslag om muziek af te kunnen spelen</string>
<string name="permission_title">Toegang tot opslag</string> <string name="permission_title">Toegang tot opslag</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -271,7 +271,7 @@
<string name="past_three_months">Ostatnie 3 miesiące</string> <string name="past_three_months">Ostatnie 3 miesiące</string>
<string name="paste_lyrics_here">Wklej tekst tutaj</string> <string name="paste_lyrics_here">Wklej tekst tutaj</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Szczyt</string> <string name="peek">Szczyt</string>
<string name="permission_external_storage_denied">Odmowa dostępu do pamięci zewnętrznej.</string> <string name="permission_external_storage_denied">Odmowa dostępu do pamięci zewnętrznej.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -266,7 +266,7 @@
<string name="past_three_months">Últimos 3 meses</string> <string name="past_three_months">Últimos 3 meses</string>
<string name="paste_lyrics_here">Colar Letras Aqui</string> <string name="paste_lyrics_here">Colar Letras Aqui</string>
<string name="paste_timeframe_lyrics_here">Colar letras sincronizadas aqui</string> <string name="paste_timeframe_lyrics_here">Colar letras sincronizadas aqui</string>
<string name="peak">Pico</string> <string name="peek">Pico</string>
<string name="permission_external_storage_denied">Permissão para acessar o armazenamento externo negada.</string> <string name="permission_external_storage_denied">Permissão para acessar o armazenamento externo negada.</string>
<string name="permission_summary">O aplicativo precisa de permissão para acessar o armazenamento do seu dispositivo para reproduzir músicas</string> <string name="permission_summary">O aplicativo precisa de permissão para acessar o armazenamento do seu dispositivo para reproduzir músicas</string>
<string name="permission_title">Acesso ao Armazenamento</string> <string name="permission_title">Acesso ao Armazenamento</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Últimos 3 meses</string> <string name="past_three_months">Últimos 3 meses</string>
<string name="paste_lyrics_here">Colar letras aqui</string> <string name="paste_lyrics_here">Colar letras aqui</string>
<string name="paste_timeframe_lyrics_here">Colar letras do cronograma aqui</string> <string name="paste_timeframe_lyrics_here">Colar letras do cronograma aqui</string>
<string name="peak">Espreitar</string> <string name="peek">Espreitar</string>
<string name="permission_external_storage_denied">Permissão para aceder ao armazenamento externo negada.</string> <string name="permission_external_storage_denied">Permissão para aceder ao armazenamento externo negada.</string>
<string name="permission_summary">Esta aplicação necessita de permissão para aceder ao armazenamento para tocar músicas</string> <string name="permission_summary">Esta aplicação necessita de permissão para aceder ao armazenamento para tocar músicas</string>
<string name="permission_title">Acesso ao armazenamento</string> <string name="permission_title">Acesso ao armazenamento</string>

View file

@ -269,7 +269,7 @@
<string name="past_three_months">Ultimele 3 luni</string> <string name="past_three_months">Ultimele 3 luni</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Accesul la stocarea externă este respinsă.</string> <string name="permission_external_storage_denied">Accesul la stocarea externă este respinsă.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -270,7 +270,7 @@
<string name="past_three_months">Последние 3 месяца</string> <string name="past_three_months">Последние 3 месяца</string>
<string name="paste_lyrics_here">Вставьте текст песни</string> <string name="paste_lyrics_here">Вставьте текст песни</string>
<string name="paste_timeframe_lyrics_here">Вставьте синхронизированный текст песни</string> <string name="paste_timeframe_lyrics_here">Вставьте синхронизированный текст песни</string>
<string name="peak">Панель снизу</string> <string name="peek">Панель снизу</string>
<string name="permission_external_storage_denied">Разрешение для доступа у внешнему хранилищу не получено.</string> <string name="permission_external_storage_denied">Разрешение для доступа у внешнему хранилищу не получено.</string>
<string name="permission_summary">Приложению требуется разрешение на доступ к внутренней памяти вашего устройства для воспроизведения музыки.</string> <string name="permission_summary">Приложению требуется разрешение на доступ к внутренней памяти вашего устройства для воспроизведения музыки.</string>
<string name="permission_title">Доступ к внутренней памяти</string> <string name="permission_title">Доступ к внутренней памяти</string>

View file

@ -269,7 +269,7 @@
<string name="past_three_months">Prosla 3 meseca</string> <string name="past_three_months">Prosla 3 meseca</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Dozvola za pristup spoljasnjem skladistu je odbijena</string> <string name="permission_external_storage_denied">Dozvola za pristup spoljasnjem skladistu je odbijena</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">De senaste 3 månaderna</string> <string name="past_three_months">De senaste 3 månaderna</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Behörighet att få tillgång till extern lagring nekas.</string> <string name="permission_external_storage_denied">Behörighet att få tillgång till extern lagring nekas.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -231,7 +231,7 @@
<string name="password">పాస్వర్డ్</string> <string name="password">పాస్వర్డ్</string>
<string name="past_three_months">గత 3 నెలలు</string> <string name="past_three_months">గత 3 నెలలు</string>
<string name="paste_lyrics_here">సాహిత్యాన్ని ఇక్కడ అతికించండి</string> <string name="paste_lyrics_here">సాహిత్యాన్ని ఇక్కడ అతికించండి</string>
<string name="peak">శిఖరం</string> <string name="peek">శిఖరం</string>
<string name="permission_external_storage_denied">బాహ్య నిల్వను యాక్సెస్ చేయడానికి అనుమతి నిరాకరించబడింది.</string> <string name="permission_external_storage_denied">బాహ్య నిల్వను యాక్సెస్ చేయడానికి అనుమతి నిరాకరించబడింది.</string>
<string name="permissions_denied">అనుమతులు తిరస్కరించబడ్డాయి.</string> <string name="permissions_denied">అనుమతులు తిరస్కరించబడ్డాయి.</string>
<string name="personalize">వ్యక్తిగతీకరించండి</string> <string name="personalize">వ్యక్తిగతీకరించండి</string>

View file

@ -265,7 +265,7 @@
<string name="past_three_months">3 เดือนผ่านไป</string> <string name="past_three_months">3 เดือนผ่านไป</string>
<string name="paste_lyrics_here">วางเนื้อเพลงที่นี่</string> <string name="paste_lyrics_here">วางเนื้อเพลงที่นี่</string>
<string name="paste_timeframe_lyrics_here">วางเนื้อเพลงในกรอบเวลาที่นี่</string> <string name="paste_timeframe_lyrics_here">วางเนื้อเพลงในกรอบเวลาที่นี่</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">สิทธิ์ในการเข้าถึงถูกปฏิเสธ</string> <string name="permission_external_storage_denied">สิทธิ์ในการเข้าถึงถูกปฏิเสธ</string>
<string name="permission_summary">ต้องการสิทธิ์ในการเข้าถึงข้อมูลในเครื่องเพื่อเล่นเพลง</string> <string name="permission_summary">ต้องการสิทธิ์ในการเข้าถึงข้อมูลในเครื่องเพื่อเล่นเพลง</string>
<string name="permission_title">เข้าถึงการจัดเก็บข้อมูล</string> <string name="permission_title">เข้าถึงการจัดเก็บข้อมูล</string>

View file

@ -267,7 +267,7 @@
<string name="past_three_months">Son 3 ay</string> <string name="past_three_months">Son 3 ay</string>
<string name="paste_lyrics_here">Sözleri buraya yapıştır</string> <string name="paste_lyrics_here">Sözleri buraya yapıştır</string>
<string name="paste_timeframe_lyrics_here">Zaman dilimli şarkı sözlerini buraya yapıştır</string> <string name="paste_timeframe_lyrics_here">Zaman dilimli şarkı sözlerini buraya yapıştır</string>
<string name="peak">Zirve</string> <string name="peek">Zirve</string>
<string name="permission_external_storage_denied">Harici depolama izni reddedildi.</string> <string name="permission_external_storage_denied">Harici depolama izni reddedildi.</string>
<string name="permission_summary">Uygulamanın müzik çalması için cihazınızın depolama erişimine ihtiyacı var</string> <string name="permission_summary">Uygulamanın müzik çalması için cihazınızın depolama erişimine ihtiyacı var</string>
<string name="permission_title">Depolama Erişimi</string> <string name="permission_title">Depolama Erişimi</string>

View file

@ -271,7 +271,7 @@
<string name="past_three_months">Останні 3 місяці</string> <string name="past_three_months">Останні 3 місяці</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Пік</string> <string name="peek">Пік</string>
<string name="permission_external_storage_denied">Відмовлено у доступі до зовнішнього сховища.</string> <string name="permission_external_storage_denied">Відмовлено у доступі до зовнішнього сховища.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -266,7 +266,7 @@ tiếp tục xảy ra hãy \"Xóa dữ liệu ứng dụng\"</string>
<string name="past_three_months">Mỗi tháng</string> <string name="past_three_months">Mỗi tháng</string>
<string name="paste_lyrics_here">Dán lời ở đây</string> <string name="paste_lyrics_here">Dán lời ở đây</string>
<string name="paste_timeframe_lyrics_here">Dán lời theo thời gian ở đây</string> <string name="paste_timeframe_lyrics_here">Dán lời theo thời gian ở đây</string>
<string name="peak">Thu nhỏ</string> <string name="peek">Thu nhỏ</string>
<string name="permission_external_storage_denied">Quyền truy cập bộ nhớ ngoài bị từ chối.</string> <string name="permission_external_storage_denied">Quyền truy cập bộ nhớ ngoài bị từ chối.</string>
<string name="permission_summary">Ứng dụng cần quyền truy cập bộ nhớ thiết bị của bạn để phát nhạc</string> <string name="permission_summary">Ứng dụng cần quyền truy cập bộ nhớ thiết bị của bạn để phát nhạc</string>
<string name="permission_title">Truy cập bộ nhớ</string> <string name="permission_title">Truy cập bộ nhớ</string>

View file

@ -279,7 +279,7 @@
<string name="past_three_months">最近三个月</string> <string name="past_three_months">最近三个月</string>
<string name="paste_lyrics_here">在此粘贴歌词</string> <string name="paste_lyrics_here">在此粘贴歌词</string>
<string name="paste_timeframe_lyrics_here">在此粘贴时段歌词</string> <string name="paste_timeframe_lyrics_here">在此粘贴时段歌词</string>
<string name="peak">顶点</string> <string name="peek">顶点</string>
<string name="permission_external_storage_denied">访问外部存储权限被拒绝。</string> <string name="permission_external_storage_denied">访问外部存储权限被拒绝。</string>
<string name="permission_summary">应用需要设备存储访问权限来播放音乐</string> <string name="permission_summary">应用需要设备存储访问权限来播放音乐</string>
<string name="permission_title">存储空间权限</string> <string name="permission_title">存储空间权限</string>

View file

@ -229,7 +229,7 @@
<string name="password">密碼</string> <string name="password">密碼</string>
<string name="past_three_months">在3個月內</string> <string name="past_three_months">在3個月內</string>
<string name="paste_lyrics_here">在此貼上歌詞</string> <string name="paste_lyrics_here">在此貼上歌詞</string>
<string name="peak">波紋</string> <string name="peek">波紋</string>
<string name="permission_external_storage_denied">存取外置儲存空間權限被拒。</string> <string name="permission_external_storage_denied">存取外置儲存空間權限被拒。</string>
<string name="permissions_denied">存取權限被拒。</string> <string name="permissions_denied">存取權限被拒。</string>
<string name="personalize">個人化</string> <string name="personalize">個人化</string>

View file

@ -265,7 +265,7 @@
<string name="past_three_months">過去 3 個月</string> <string name="past_three_months">過去 3 個月</string>
<string name="paste_lyrics_here">在這裡貼上歌詞</string> <string name="paste_lyrics_here">在這裡貼上歌詞</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">無法取得存取外部儲存空間的權限。</string> <string name="permission_external_storage_denied">無法取得存取外部儲存空間的權限。</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -68,6 +68,7 @@
<dimen name="m3_card_corner_radius">16dp</dimen> <dimen name="m3_card_corner_radius">16dp</dimen>
<dimen name="m3_card_medium_radius">24dp</dimen> <dimen name="m3_card_medium_radius">24dp</dimen>
<dimen name="m3_card_large_radius">40dp</dimen> <dimen name="m3_card_large_radius">40dp</dimen>
<dimen name="m3_dialog_corner_size">28dp</dimen>
<dimen name="padding_album_cover">16dp</dimen> <dimen name="padding_album_cover">16dp</dimen>
<dimen name="seekbar_padding">16dp</dimen> <dimen name="seekbar_padding">16dp</dimen>

View file

@ -282,7 +282,7 @@
<string name="past_three_months">Past 3 months</string> <string name="past_three_months">Past 3 months</string>
<string name="paste_lyrics_here">Paste Lyrics Here</string> <string name="paste_lyrics_here">Paste Lyrics Here</string>
<string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string> <string name="paste_timeframe_lyrics_here">Paste timeframe lyrics here</string>
<string name="peak">Peak</string> <string name="peek">Peek</string>
<string name="permission_external_storage_denied">Permission to access external storage denied.</string> <string name="permission_external_storage_denied">Permission to access external storage denied.</string>
<string name="permission_summary">The app needs permission to access your device storage for playing music</string> <string name="permission_summary">The app needs permission to access your device storage for playing music</string>
<string name="permission_title">Storage Access</string> <string name="permission_title">Storage Access</string>

View file

@ -71,7 +71,7 @@
android:title="@string/pref_title_tab_text_mode" /> android:title="@string/pref_title_tab_text_mode" />
<code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference <code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference
android:defaultValue="0" android:defaultValue="1"
android:entries="@array/pref_appbar_mode_titles" android:entries="@array/pref_appbar_mode_titles"
android:entryValues="@array/pref_appbar_mode_values" android:entryValues="@array/pref_appbar_mode_values"
android:key="appbar_mode" android:key="appbar_mode"

View file

@ -3,7 +3,7 @@
buildscript { buildscript {
ext { ext {
kotlin_version = '1.6.10' kotlin_version = '1.6.10'
navigation_version = '2.5.0-alpha01' navigation_version = '2.4.1'
mdc_version = '1.5.0' mdc_version = '1.5.0'
preference_version = '1.2.0' preference_version = '1.2.0'
appcompat_version = '1.4.1' appcompat_version = '1.4.1'
@ -14,7 +14,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.1.0' classpath 'com.android.tools.build:gradle:7.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigation_version" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
} }