diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt index fba21e4ce..9f53714fd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt @@ -40,6 +40,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.card.MaterialCardView import dev.chrisbanes.insetter.applyInsetter +const val ANIM_DURATION = 300L + @Suppress("UNCHECKED_CAST") fun ViewGroup.inflate(@LayoutRes layout: Int): T { return LayoutInflater.from(context).inflate(layout, this, false) as T @@ -90,10 +92,10 @@ fun BottomNavigationView.show() { drawable.setBounds(left, parent.height, right, parent.height + height) parent.overlay.add(drawable) ValueAnimator.ofInt(parent.height, top).apply { - duration = 300 + duration = ANIM_DURATION interpolator = AnimationUtils.loadInterpolator( context, - android.R.interpolator.linear_out_slow_in + android.R.interpolator.accelerate_decelerate ) addUpdateListener { val newTop = it.animatedValue as Int @@ -130,10 +132,10 @@ fun BottomNavigationView.hide() { parent.overlay.add(drawable) isGone = true ValueAnimator.ofInt(top, parent.height).apply { - duration = 300L + duration = ANIM_DURATION interpolator = AnimationUtils.loadInterpolator( context, - android.R.interpolator.fast_out_linear_in + android.R.interpolator.accelerate_decelerate ) addUpdateListener { val newTop = it.animatedValue as Int @@ -164,7 +166,7 @@ fun View.translateYAnimate(value: Float): Animator { fun BottomSheetBehavior<*>.peekHeightAnimate(value: Int): Animator { return ObjectAnimator.ofInt(this, "peekHeight", value) .apply { - duration = 300 + duration = ANIM_DURATION start() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index 08831b0c6..a06c753ca 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -177,10 +177,9 @@ class FullPlaybackControlsFragment : private fun setUpPlayPauseFab() { binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) - binding.playPauseButton.post { - binding.playPauseButton.pivotX = (binding.playPauseButton.width / 2).toFloat() - binding.playPauseButton.pivotY = (binding.playPauseButton.height / 2).toFloat() - } + + binding.playPauseButton.pivotX = (binding.playPauseButton.width / 2).toFloat() + binding.playPauseButton.pivotY = (binding.playPauseButton.height / 2).toFloat() } private fun setUpMusicControllers() { diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index 81ab6a947..f85e1e89d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -65,9 +65,6 @@ object MusicPlayerRemote : KoinComponent { musicService?.nextSong } else Song.emptySong - /** - * Async - */ var position: Int get() = if (musicService != null) { musicService!!.position diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt index a10808726..c74c5bbdc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt @@ -46,7 +46,7 @@ import kotlin.math.abs class CoverLrcView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = null, - defStyleAttr: Int = 0 + defStyleAttr: Int = 0, ) : View(context, attrs, defStyleAttr) { private val mLrcEntryList: MutableList = ArrayList() private val mLrcPaint = TextPaint() @@ -109,7 +109,7 @@ class CoverLrcView @JvmOverloads constructor( e1: MotionEvent, e2: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { if (mOffset == getOffset(0) && distanceY < 0F) { return super.onScroll(e1, e2, distanceX, distanceY) @@ -129,7 +129,7 @@ class CoverLrcView @JvmOverloads constructor( e1: MotionEvent, e2: MotionEvent, velocityX: Float, - velocityY: Float + velocityY: Float, ): Boolean { if (hasLrc()) { mScroller!!.fling( @@ -598,7 +598,6 @@ class CoverLrcView @JvmOverloads constructor( mOffset = animation.animatedValue as Float invalidate() } - LrcUtils.resetDurationScale() start() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java index b81fc782a..5152bc4f8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java @@ -208,14 +208,4 @@ class LrcUtils { String ss = String.format(Locale.getDefault(), "%02d", s); return mm + ":" + ss; } - - static void resetDurationScale() { - try { - Field mField = ValueAnimator.class.getDeclaredField("sDurationScale"); - mField.setAccessible(true); - mField.setFloat(null, 1); - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java index 60f904bdb..ca450b621 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java @@ -684,7 +684,6 @@ public class LrcView extends View { mOffset = (float) animation.getAnimatedValue(); invalidate(); }); - LrcUtils.resetDurationScale(); mAnimator.start(); } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt b/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt index 8979327c4..f2e351357 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt @@ -12,9 +12,9 @@ class AudioFader { @JvmStatic inline fun createFadeAnimator( - fadeIn: Boolean /* fadeIn -> true fadeOut -> false*/, + fadeIn: Boolean, /* fadeIn -> true fadeOut -> false*/ mediaPlayer: MediaPlayer, - crossinline endAction: (animator: Animator) -> Unit /* Code to run when Animator Ends*/ + crossinline endAction: (animator: Animator) -> Unit, /* Code to run when Animator Ends*/ ): Animator? { val duration = PreferenceUtil.crossFadeDuration * 1000 if (duration == 0) { @@ -40,8 +40,8 @@ class AudioFader { @JvmStatic fun startFadeAnimator( playback: Playback, - fadeIn: Boolean /* fadeIn -> true fadeOut -> false*/, - callback: Runnable /* Code to run when Animator Ends*/ + fadeIn: Boolean, /* fadeIn -> true fadeOut -> false*/ + callback: Runnable, /* Code to run when Animator Ends*/ ) { val duration = PreferenceUtil.audioFadeDuration.toLong() if (duration == 0L) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt index 2e74530a0..d6d47270e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.util import android.app.Activity import android.content.SharedPreferences +import androidx.core.content.edit import com.google.android.play.core.review.ReviewManagerFactory object AppRater { @@ -34,28 +35,27 @@ object AppRater { return } - val editor = prefs.edit() + prefs.edit { - // Increment launch counter - val launchCount = prefs.getLong(LAUNCH_COUNT, 0) + 1 - editor.putLong(LAUNCH_COUNT, launchCount) + // Increment launch counter + val launchCount = prefs.getLong(LAUNCH_COUNT, 0) + 1 + putLong(LAUNCH_COUNT, launchCount) - // Get date of first launch - var dateFirstLaunch = prefs.getLong(DATE_FIRST_LAUNCH, 0) - if (dateFirstLaunch == 0L) { - dateFirstLaunch = System.currentTimeMillis() - editor.putLong(DATE_FIRST_LAUNCH, dateFirstLaunch) - } + // Get date of first launch + var dateFirstLaunch = prefs.getLong(DATE_FIRST_LAUNCH, 0) + if (dateFirstLaunch == 0L) { + dateFirstLaunch = System.currentTimeMillis() + putLong(DATE_FIRST_LAUNCH, dateFirstLaunch) + } - // Wait at least n days before opening - if (launchCount >= LAUNCHES_UNTIL_PROMPT) { - if (System.currentTimeMillis() >= dateFirstLaunch + DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000) { - //showRateDialog(context, editor) - showPlayStoreReviewDialog(context, editor) + // Wait at least n days before opening + if (launchCount >= LAUNCHES_UNTIL_PROMPT) { + if (System.currentTimeMillis() >= dateFirstLaunch + DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000) { + //showRateDialog(context, editor) + showPlayStoreReviewDialog(context, this) + } } } - - editor.apply() } private fun showPlayStoreReviewDialog(context: Activity, editor: SharedPreferences.Editor) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java index 903df0aab..6fa658bb4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java @@ -39,6 +39,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import code.name.monkey.retromusic.Constants; @@ -178,7 +179,7 @@ public final class FileUtil { if (dotPos == -1) { return false; } - String fileExtension = filename.substring(dotPos + 1).toLowerCase(); + String fileExtension = filename.substring(dotPos + 1).toLowerCase(Locale.ROOT); String fileType = mimeTypeMap.getMimeTypeFromExtension(fileExtension); if (fileType == null) { return false; @@ -304,7 +305,7 @@ public final class FileUtil { paths.add(path); try { Storage item = new Storage(); - if (path.toLowerCase().contains("sd")) { + if (path.toLowerCase(Locale.ROOT).contains("sd")) { item.title = "SD Card"; } else { item.title = "External Storage"; diff --git a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java index 71506e19c..10939c9fd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java @@ -83,7 +83,6 @@ public class SAFUtil { return false; } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void openFilePicker(Activity activity) { Intent i = new Intent(Intent.ACTION_CREATE_DOCUMENT); i.addCategory(Intent.CATEGORY_OPENABLE); @@ -92,7 +91,6 @@ public class SAFUtil { activity.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_FILE); } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void openFilePicker(Fragment fragment) { Intent i = new Intent(Intent.ACTION_CREATE_DOCUMENT); i.addCategory(Intent.CATEGORY_OPENABLE); @@ -101,21 +99,18 @@ public class SAFUtil { fragment.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_FILE); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void openTreePicker(Activity activity) { Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); i.putExtra("android.content.extra.SHOW_ADVANCED", true); activity.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_TREE); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void openTreePicker(Fragment fragment) { Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); i.putExtra("android.content.extra.SHOW_ADVANCED", true); fragment.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_TREE); } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void saveTreeUri(Context context, Intent data) { Uri uri = data.getData(); context @@ -125,12 +120,10 @@ public class SAFUtil { PreferenceUtil.INSTANCE.setSafSdCardUri(uri.toString()); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isTreeUriSaved(Context context) { return !TextUtils.isEmpty(PreferenceUtil.INSTANCE.getSafSdCardUri()); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isSDCardAccessGranted(Context context) { if (!isTreeUriSaved(context)) return false; @@ -267,7 +260,6 @@ public class SAFUtil { new File(path).delete(); } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void deleteSAF(Context context, String path, Uri safUri) { Uri uri = null; diff --git a/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java index 83d2a8f74..6aa903fe4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java @@ -35,6 +35,7 @@ import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import java.util.Locale; import java.util.WeakHashMap; import code.name.monkey.retromusic.R; @@ -329,7 +330,7 @@ public class NotificationColorUtil { } private static String contrastChange(int colorOld, int colorNew, int bg) { - return String.format( + return String.format(Locale.ROOT, "from %.2f:1 to %.2f:1", ColorUtilsFromCompat.calculateContrast(colorOld, bg), ColorUtilsFromCompat.calculateContrast(colorNew, bg)); diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt index dabc64eca..ac8db0c5d 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt @@ -1,6 +1,7 @@ package code.name.monkey.appthemehelper.util import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast /** * @author Hemanth S (h4h13). @@ -10,6 +11,7 @@ object VersionUtils { /** * @return true if device is running API >= 23 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.M) fun hasMarshmallow(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M } @@ -17,6 +19,7 @@ object VersionUtils { /** * @return true if device is running API >= 24 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N) fun hasNougat(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N } @@ -24,6 +27,7 @@ object VersionUtils { /** * @return true if device is running API >= 25 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N_MR1) fun hasNougatMR(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 } @@ -31,6 +35,7 @@ object VersionUtils { /** * @return true if device is running API >= 26 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) fun hasOreo(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O } @@ -38,6 +43,7 @@ object VersionUtils { /** * @return true if device is running API >= 27 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O_MR1) fun hasOreoMR1(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 } @@ -45,6 +51,7 @@ object VersionUtils { /** * @return true if device is running API >= 28 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.P) fun hasP(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P } @@ -52,6 +59,7 @@ object VersionUtils { /** * @return true if device is running API >= 29 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.Q) @JvmStatic fun hasQ(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q @@ -60,6 +68,7 @@ object VersionUtils { /** * @return true if device is running API >= 30 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.R) @JvmStatic fun hasR(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R @@ -68,6 +77,7 @@ object VersionUtils { /** * @return true if device is running API >= 31 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.S) @JvmStatic fun hasS(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S