From 3a0e130e06f65913f30514a011e7af53daba189e Mon Sep 17 00:00:00 2001 From: h4h13 Date: Wed, 12 Feb 2020 23:44:19 +0530 Subject: [PATCH] Code refactor --- app/build.gradle | 8 +- app/src/main/assets/retro-changelog.html | 2 +- .../code/name/monkey/retromusic/Constants.kt | 2 +- .../dialogs/BlacklistFolderChooserDialog.kt | 11 +- .../retromusic/fragments/NowPlayingScreen.kt | 12 +- .../player/blur/BlurPlayerFragment.kt | 4 +- .../player/cardblur/CardBlurFragment.kt | 23 +- .../fragments/player/normal/PlayerFragment.kt | 45 ++- .../glide/RetroMusicColoredTarget.kt | 14 +- .../monkey/retromusic/loaders/GenreLoader.kt | 4 +- .../retromusic/loaders/PlaylistSongsLoader.kt | 4 +- .../monkey/retromusic/loaders/SongLoader.kt | 114 ++++--- .../name/monkey/retromusic/model/Artist.kt | 46 --- .../preferences/BlacklistPreferenceDialog.kt | 38 ++- .../NowPlayingScreenPreferenceDialog.kt | 80 +++-- .../name/monkey/retromusic/util/FileUtil.java | 313 +++++++++--------- app/src/main/res/drawable/line_button.xml | 26 +- app/src/main/res/layout/fragment_blur.xml | 5 +- .../res/layout/fragment_card_blur_player.xml | 9 +- .../preference_now_playing_screen_item.xml | 17 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_advanced.xml | 1 + app/src/main/res/xml/pref_general.xml | 9 +- 23 files changed, 399 insertions(+), 389 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b1584cf7c..137e6fbff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,8 +22,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 405 - versionName '3.4.900' + versionCode 408 + versionName '3.5.000' multiDexEnabled true @@ -129,8 +129,8 @@ dependencies { implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.core:core-ktx:1.1.0' - implementation 'androidx.fragment:fragment:1.2.0' + implementation 'androidx.core:core-ktx:1.2.0' + implementation 'androidx.fragment:fragment:1.2.1' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.android.material:material:1.2.0-alpha04' diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index 72af2878f..b5cdef453 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -1 +1 @@ -

v.3.5.000

v3.4.900

v3.4.850

v3.4.800

v3.4.700

v3.4.600

v3.4.500

If you see entire app white or dark or black select same theme in settings to fix

FAQ's

*If you face any UI related issues you clear app data and cache, if its not working try to uninstall and install again.

\ No newline at end of file +

v.3.5.000

v3.4.900

v3.4.850

v3.4.800

v3.4.700

v3.4.600

v3.4.500

If you see entire app white or dark or black select same theme in settings to fix

FAQ's

*If you face any UI related issues you clear app data and cache, if its not working try to uninstall and install again.

\ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt index 3da9b5471..d7cf6fc36 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -31,7 +31,7 @@ object Constants { const val FAQ_LINK = "https://github.com/h4h13/RetroMusicPlayer/blob/master/FAQ.md" const val PINTEREST = "https://in.pinterest.com/retromusicapp/" - const val BASE_SELECTION = MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''" + const val baseSelection = MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''" val baseProjection = arrayOf(BaseColumns._ID, // 0 MediaStore.Audio.AudioColumns.TITLE, // 1 diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt index be3b01d30..5870d135c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt @@ -29,8 +29,8 @@ import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.list.listItems import java.io.File -import java.util.* -import kotlin.collections.ArrayList +import java.util.Collections +import java.util.Comparator class BlacklistFolderChooserDialog : DialogFragment() { @@ -40,7 +40,6 @@ class BlacklistFolderChooserDialog : DialogFragment() { private var canGoUp = false private var callback: FolderCallback? = null - private fun contentsArray(): List { if (parentContents == null) { return if (canGoUp) { @@ -81,7 +80,11 @@ class BlacklistFolderChooserDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { var savedInstanceStateFinal = savedInstanceState if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && - ActivityCompat.checkSelfPermission(requireActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { return MaterialDialog(requireActivity(), BottomSheet(LayoutMode.WRAP_CONTENT)).show { title(R.string.md_error_label) cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt index acb67d598..070942532 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt @@ -10,21 +10,19 @@ enum class NowPlayingScreen constructor( @param:DrawableRes @field:DrawableRes val drawableResId: Int, val id: Int ) { - - NORMAL(R.string.normal, R.drawable.np_normal, 0), - FLAT(R.string.flat, R.drawable.np_flat, 1), - FIT(R.string.fit, R.drawable.np_fit, 12), - TINY(R.string.tiny, R.drawable.np_tiny, 7), - PEAK(R.string.peak, R.drawable.np_peak, 14), - ADAPTIVE(R.string.adaptive, R.drawable.np_adaptive, 10), BLUR(R.string.blur, R.drawable.np_blur, 4), BLUR_CARD(R.string.blur_card, R.drawable.np_blur_card, 9), CARD(R.string.card, R.drawable.np_card, 6), COLOR(R.string.color, R.drawable.np_color, 5), CIRCLE(R.string.circle, R.drawable.np_minimalistic_circle, 15), + FIT(R.string.fit, R.drawable.np_fit, 12), + FLAT(R.string.flat, R.drawable.np_flat, 1), FULL(R.string.full, R.drawable.np_full, 2), MATERIAL(R.string.material, R.drawable.np_material, 11), + NORMAL(R.string.normal, R.drawable.np_normal, 0), + PEAK(R.string.peak, R.drawable.np_peak, 14), PLAIN(R.string.plain, R.drawable.np_plain, 3), SIMPLE(R.string.simple, R.drawable.np_simple, 8), + TINY(R.string.tiny, R.drawable.np_tiny, 7), } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt index dd5c3cd3f..8bcfa1737 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt @@ -99,7 +99,7 @@ class BlurPlayerFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPrefer private fun updateBlur() { val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext()) .getInt(PreferenceUtil.NEW_BLUR_AMOUNT, 25) - colorBackground!!.clearColorFilter() + colorBackground?.clearColorFilter() SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) .checkIgnoreMediaStore(requireContext()) .generatePalette(requireContext()).build() @@ -109,7 +109,7 @@ class BlurPlayerFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPrefer .into(object : RetroMusicColoredTarget(colorBackground) { override fun onColorReady(color: Int) { if (color == defaultFooterColor) { - colorBackground!!.setColorFilter(color) + colorBackground?.setColorFilter(color) } } }) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt index 5ff6e16c8..bfbc617ed 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt @@ -13,9 +13,9 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment +import code.name.monkey.retromusic.glide.AlbumGlideRequest import code.name.monkey.retromusic.glide.BlurTransformation import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil @@ -53,7 +53,7 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen override fun onColorChanged(color: Int) { playbackControlsFragment.setDark(color) lastColor = color - callbacks!!.onPaletteColorChanged() + callbacks?.onPaletteColorChanged() ToolbarContentTintHelper.colorizeToolbar(playerToolbar, Color.WHITE, activity) playerToolbar.setTitleTextColor(Color.WHITE) @@ -127,10 +127,19 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen } private fun updateBlur() { + colorBackground?.clearColorFilter() val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext()) .getInt(PreferenceUtil.NEW_BLUR_AMOUNT, 25) - colorBackground!!.clearColorFilter() - SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) + AlbumGlideRequest.Builder.from(Glide.with(requireContext()), MusicPlayerRemote.currentSong.albumId) + .generatePalette(requireContext()) + .build() + .transform(BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat()).build()) + .into(object : RetroMusicColoredTarget(colorBackground) { + override fun onColorReady(color: Int) { + } + }) + //colorBackground?.clearColorFilter() + /*SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) .checkIgnoreMediaStore(requireContext()) .generatePalette(requireContext()).build() .transform(BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat()).build()) @@ -138,11 +147,9 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen //.override(320, 480) .into(object : RetroMusicColoredTarget(colorBackground) { override fun onColorReady(color: Int) { - if (color == defaultFooterColor) { - colorBackground!!.setColorFilter(color) - } + } - }) + })*/ } override fun onResume() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt index f31e4883e..15c198468 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt @@ -18,8 +18,8 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.views.DrawableGradient -import kotlinx.android.synthetic.main.fragment_player.* - +import kotlinx.android.synthetic.main.fragment_player.colorGradientBackground +import kotlinx.android.synthetic.main.fragment_player.playerToolbar class PlayerFragment : AbsPlayerFragment() { @@ -30,18 +30,21 @@ class PlayerFragment : AbsPlayerFragment() { private lateinit var playbackControlsFragment: PlayerPlaybackControlsFragment private var valueAnimator: ValueAnimator? = null - private fun colorize(i: Int) { if (valueAnimator != null) { valueAnimator?.cancel() } - valueAnimator = ValueAnimator.ofObject(ArgbEvaluator(), ATHUtil.resolveColor(requireContext(), R.attr.colorSurface), i) + valueAnimator = ValueAnimator.ofObject(ArgbEvaluator(), lastColor, i) valueAnimator?.addUpdateListener { animation -> if (isAdded) { - val drawable = DrawableGradient(GradientDrawable.Orientation.TOP_BOTTOM, - intArrayOf(animation.animatedValue as Int, - ATHUtil.resolveColor(requireContext(), R.attr.colorSurface)), 0) + val drawable = DrawableGradient( + GradientDrawable.Orientation.TOP_BOTTOM, + intArrayOf( + animation.animatedValue as Int, + ATHUtil.resolveColor(requireContext(), R.attr.colorSurface) + ), 0 + ) colorGradientBackground?.background = drawable } } @@ -70,7 +73,11 @@ class PlayerFragment : AbsPlayerFragment() { lastColor = color callbacks?.onPaletteColorChanged() - ToolbarContentTintHelper.colorizeToolbar(playerToolbar, ATHUtil.resolveColor(context, R.attr.colorControlNormal), requireActivity()) + ToolbarContentTintHelper.colorizeToolbar( + playerToolbar, + ATHUtil.resolveColor(context, R.attr.colorControlNormal), + requireActivity() + ) if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { colorize(color) @@ -88,9 +95,10 @@ class PlayerFragment : AbsPlayerFragment() { toggleFavorite(MusicPlayerRemote.currentSong) } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { return inflater.inflate(R.layout.fragment_player, container, false) } @@ -101,19 +109,24 @@ class PlayerFragment : AbsPlayerFragment() { setUpPlayerToolbar() } - private fun setUpSubFragments() { - playbackControlsFragment = childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as PlayerPlaybackControlsFragment - val playerAlbumCoverFragment = childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment + playbackControlsFragment = + childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as PlayerPlaybackControlsFragment + val playerAlbumCoverFragment = + childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment playerAlbumCoverFragment.setCallbacks(this) } private fun setUpPlayerToolbar() { playerToolbar.inflateMenu(R.menu.menu_player) - playerToolbar.setNavigationOnClickListener {requireActivity().onBackPressed() } + playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() } playerToolbar.setOnMenuItemClickListener(this) - ToolbarContentTintHelper.colorizeToolbar(playerToolbar, ATHUtil.resolveColor(context, R.attr.colorControlNormal), requireActivity()) + ToolbarContentTintHelper.colorizeToolbar( + playerToolbar, + ATHUtil.resolveColor(context, R.attr.colorControlNormal), + requireActivity() + ) } override fun onServiceConnected() { diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/RetroMusicColoredTarget.kt b/app/src/main/java/code/name/monkey/retromusic/glide/RetroMusicColoredTarget.kt index 63a20dfb1..f4425533b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/RetroMusicColoredTarget.kt +++ b/app/src/main/java/code/name/monkey/retromusic/glide/RetroMusicColoredTarget.kt @@ -20,11 +20,9 @@ import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.glide.palette.BitmapPaletteTarget import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper -import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroColorUtil import com.bumptech.glide.request.animation.GlideAnimation - abstract class RetroMusicColoredTarget(view: ImageView) : BitmapPaletteTarget(view) { protected val defaultFooterColor: Int @@ -40,15 +38,17 @@ abstract class RetroMusicColoredTarget(view: ImageView) : BitmapPaletteTarget(vi onColorReady(defaultFooterColor) } - override fun onResourceReady(resource: BitmapPaletteWrapper?, glideAnimation: GlideAnimation?) { + override fun onResourceReady( + resource: BitmapPaletteWrapper?, + glideAnimation: GlideAnimation? + ) { super.onResourceReady(resource, glideAnimation) val defaultColor = defaultFooterColor resource?.let { - onColorReady(if (PreferenceUtil.getInstance(getView().context).isDominantColor) - RetroColorUtil.getDominantColor(it.bitmap, defaultColor) - else - RetroColorUtil.getColor(it.palette, defaultColor)) + onColorReady( + RetroColorUtil.getColor(it.palette, defaultColor) + ) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/GenreLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/GenreLoader.kt index 09afd12ac..e539abc0e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/GenreLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/GenreLoader.kt @@ -19,7 +19,7 @@ import android.database.Cursor import android.net.Uri import android.provider.BaseColumns import android.provider.MediaStore.Audio.Genres -import code.name.monkey.retromusic.Constants.BASE_SELECTION +import code.name.monkey.retromusic.Constants.baseSelection import code.name.monkey.retromusic.Constants.baseProjection import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.model.Song @@ -94,7 +94,7 @@ object GenreLoader { try { return context.contentResolver.query( Genres.Members.getContentUri("external", genreId.toLong()), - baseProjection, BASE_SELECTION, null, PreferenceUtil.getInstance(context).songSortOrder) + baseProjection, baseSelection, null, PreferenceUtil.getInstance(context).songSortOrder) } catch (e: SecurityException) { return null } diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt index 3073db67d..a1e041e0e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt @@ -18,7 +18,7 @@ import android.content.Context import android.database.Cursor import android.provider.MediaStore import android.provider.MediaStore.Audio.AudioColumns -import code.name.monkey.retromusic.Constants.BASE_SELECTION +import code.name.monkey.retromusic.Constants.baseSelection import code.name.monkey.retromusic.model.AbsCustomPlaylist import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.PlaylistSong @@ -104,7 +104,7 @@ object PlaylistSongsLoader { MediaStore.Audio.Playlists.Members._ID,//11 AudioColumns.COMPOSER )// 12 - , BASE_SELECTION, null, + , baseSelection, null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER ) } catch (e: SecurityException) { diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt index 33b9ee1aa..bf24f0f98 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt @@ -18,10 +18,9 @@ import android.content.Context import android.database.Cursor import android.provider.MediaStore import android.provider.MediaStore.Audio.AudioColumns -import code.name.monkey.retromusic.Constants.BASE_SELECTION import code.name.monkey.retromusic.Constants.baseProjection +import code.name.monkey.retromusic.Constants.baseSelection import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.providers.BlacklistStore import code.name.monkey.retromusic.util.PreferenceUtil import java.util.ArrayList @@ -61,7 +60,7 @@ object SongLoader { return getSongs(cursor) } - fun getSong( + private fun getSong( cursor: Cursor? ): Song { val song: Song @@ -84,71 +83,70 @@ object SongLoader { cursor: Cursor ): Song = Song.fromCursor(cursor) + @JvmStatic @JvmOverloads fun makeSongCursor( context: Context, - selection: String?, - selectionValues: Array?, + selectionString: String?, + selectionValuesArray: Array?, sortOrder: String = PreferenceUtil.getInstance(context).songSortOrder - ): Cursor? { - var selectionFinal = selection - var selectionValuesFinal = selectionValues - selectionFinal = if (selection != null && selection.trim { it <= ' ' } != "") { - "$BASE_SELECTION AND $selectionFinal" + ): Cursor { + var selectionValues: Array? = arrayOf() + var selection = if (selectionString != null && selectionString.trim() != "") { + "$baseSelection AND $selectionString" } else { - BASE_SELECTION + baseSelection } // Blacklist - val paths = BlacklistStore.getInstance(context).paths + /*val paths = BlacklistStore.getInstance(context).paths if (paths.isNotEmpty()) { - selectionFinal = generateBlacklistSelection(selectionFinal, paths.size) - selectionValuesFinal = addBlacklistSelectionValues(selectionValuesFinal, paths) + selection = generateBlacklistSelection(selection, paths.size) + selectionValues = addBlacklistSelectionValues(selectionValuesArray, paths) + }*/ + if (PreferenceUtil.getInstance(context).filterLength != 0) { + selection = + "$selection AND ${MediaStore.Audio.Media.DURATION} >= ${PreferenceUtil.getInstance(context).filterLength * 1000}" } - try { - return context.contentResolver.query( - MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, - baseProjection, - selectionFinal + " AND " + MediaStore.Audio.Media.DURATION + ">= " + (PreferenceUtil.getInstance( - context - ).filterLength * 1000), - selectionValuesFinal, - sortOrder - ) - } catch (e: SecurityException) { - return null - } - } - - private fun generateBlacklistSelection( - selection: String?, - pathCount: Int - ): String { - val newSelection = StringBuilder( - if (selection != null && selection.trim { it <= ' ' } != "") "$selection AND " else "") - newSelection.append(AudioColumns.DATA + " NOT LIKE ?") - for (i in 0 until pathCount - 1) { - newSelection.append(" AND " + AudioColumns.DATA + " NOT LIKE ?") - } - return newSelection.toString() - } - - private fun addBlacklistSelectionValues( - selectionValues: Array?, - paths: ArrayList - ): Array? { - var selectionValuesFinal = selectionValues - if (selectionValuesFinal == null) { - selectionValuesFinal = emptyArray() - } - val newSelectionValues = Array(selectionValuesFinal.size + paths.size) { - "n = $it" - } - System.arraycopy(selectionValuesFinal, 0, newSelectionValues, 0, selectionValuesFinal.size) - for (i in selectionValuesFinal.size until newSelectionValues.size) { - newSelectionValues[i] = paths[i - selectionValuesFinal.size] + "%" - } - return newSelectionValues + return context.contentResolver.query( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + baseProjection, + selection, + selectionValuesArray, + sortOrder + ) + ?: throw IllegalStateException("Unable to query ${MediaStore.Audio.Media.EXTERNAL_CONTENT_URI}, system returned null.") } } + +fun generateBlacklistSelection( + selection: String?, + pathCount: Int +): String { + val newSelection = StringBuilder( + if (selection != null && selection.trim { it <= ' ' } != "") "$selection AND " else "") + newSelection.append(AudioColumns.DATA + " NOT LIKE ?") + for (i in 0 until pathCount - 1) { + newSelection.append(" AND " + AudioColumns.DATA + " NOT LIKE ?") + } + return newSelection.toString() +} + +fun addBlacklistSelectionValues( + selectionValues: Array?, + paths: ArrayList +): Array? { + var selectionValuesFinal = selectionValues + if (selectionValuesFinal == null) { + selectionValuesFinal = emptyArray() + } + val newSelectionValues = Array(selectionValuesFinal.size + paths.size) { + "n = $it" + } + System.arraycopy(selectionValuesFinal, 0, newSelectionValues, 0, selectionValuesFinal.size) + for (i in selectionValuesFinal.size until newSelectionValues.size) { + newSelectionValues[i] = paths[i - selectionValuesFinal.size] + "%" + } + return newSelectionValues +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt index 52aa13472..45374ce69 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt @@ -27,52 +27,6 @@ class Artist( var albumCount: Int = 0 ) { - /*val albums: ArrayList? - - val id: Int - get() = safeGetFirstAlbum().artistId - - val name: String - get() { - val name = safeGetFirstAlbum().artist - return if (MusicUtil.isArtistNameUnknown(name)) { - UNKNOWN_ARTIST_DISPLAY_NAME - } else name!! - } - - val songCount: Int - get() { - var songCount = 0 - for (album in albums!!) { - songCount += album.songCount - } - return songCount - } - - val albumCount: Int - get() = albums!!.size - - val songs: ArrayList - get() { - val songs = ArrayList() - for (album in albums!!) { - //songs.addAll(album.songs!!) - } - return songs - } - - constructor(albums: ArrayList) { - this.albums = albums - } - - constructor() { - this.albums = ArrayList() - } - - fun safeGetFirstAlbum(): Album { - return if (albums!!.isEmpty()) Album() else albums[0] - } -*/ companion object { fun fromCursor(cursor: Cursor): Artist { diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt index 8271e7159..3c1c164dd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt @@ -41,7 +41,12 @@ class BlacklistPreference : ATEDialogPreference { constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super( + context, + attrs, + defStyleAttr, + defStyleRes + ) init { icon?.setColorFilter(ThemeStore.textColorSecondary(context), PorterDuff.Mode.SRC_IN) @@ -55,23 +60,23 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog } } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val blacklistFolderChooserDialog = childFragmentManager.findFragmentByTag("FOLDER_CHOOSER") as BlacklistFolderChooserDialog? + val blacklistFolderChooserDialog = + childFragmentManager.findFragmentByTag("FOLDER_CHOOSER") as BlacklistFolderChooserDialog? blacklistFolderChooserDialog?.setCallback(this) refreshBlacklistData() return MaterialDialog(requireContext(), BottomSheet(LayoutMode.WRAP_CONTENT)).show { - title(code.name.monkey.retromusic.R.string.blacklist) + title(R.string.blacklist) cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) positiveButton(android.R.string.ok) { dismiss() } neutralButton(text = getString(R.string.clear_action)) { MaterialDialog(requireContext(), BottomSheet(LayoutMode.WRAP_CONTENT)).show { - title(code.name.monkey.retromusic.R.string.clear_blacklist) - message(code.name.monkey.retromusic.R.string.do_you_want_to_clear_the_blacklist) + title(R.string.clear_blacklist) + message(R.string.do_you_want_to_clear_the_blacklist) cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - positiveButton(code.name.monkey.retromusic.R.string.clear_action) { + positiveButton(R.string.clear_action) { BlacklistStore.getInstance(context).clear() refreshBlacklistData() } @@ -81,13 +86,20 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog negativeButton(R.string.add_action) { val dialog = BlacklistFolderChooserDialog.create() dialog.setCallback(this@BlacklistPreferenceDialog) - dialog.show(childFragmentManager, "FOLDER_CHOOSER"); + dialog.show(childFragmentManager, "FOLDER_CHOOSER") } listItems(items = paths, waitForPositiveButton = false) { _, _, text -> - MaterialDialog(context, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + MaterialDialog(requireContext(), BottomSheet(LayoutMode.WRAP_CONTENT)).show { cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - title(code.name.monkey.retromusic.R.string.remove_from_blacklist) - message(text = Html.fromHtml(getString(code.name.monkey.retromusic.R.string.do_you_want_to_remove_from_the_blacklist, text))) + title(R.string.remove_from_blacklist) + message( + text = Html.fromHtml( + getString( + R.string.do_you_want_to_remove_from_the_blacklist, + text + ) + ) + ) positiveButton(code.name.monkey.retromusic.R.string.remove_action) { BlacklistStore.getInstance(context).removePath(File(text.toString())) refreshBlacklistData() @@ -108,7 +120,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog } override fun onFolderSelection(dialog: BlacklistFolderChooserDialog, folder: File) { - BlacklistStore.getInstance(context!!).addPath(folder); - refreshBlacklistData(); + BlacklistStore.getInstance(context!!).addPath(folder) + refreshBlacklistData() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/NowPlayingScreenPreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/NowPlayingScreenPreferenceDialog.kt index 1532c8388..05ae00ac8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/NowPlayingScreenPreferenceDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/NowPlayingScreenPreferenceDialog.kt @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.preferences import android.app.Dialog import android.content.Context +import android.content.res.ColorStateList import android.graphics.PorterDuff import android.os.Bundle import android.util.AttributeSet @@ -30,8 +31,12 @@ import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEDialogPreference +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.hide +import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.fragments.NowPlayingScreen import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.PreferenceUtil @@ -42,18 +47,23 @@ import com.bumptech.glide.Glide class NowPlayingScreenPreference : ATEDialogPreference { - constructor(context: Context) : super(context) {} + constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {} + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super( + context, + attrs, + defStyleAttr, + defStyleRes + ) private val mLayoutRes = R.layout.preference_dialog_now_playing_screen override fun getDialogLayoutResource(): Int { - return mLayoutRes; + return mLayoutRes } init { @@ -66,11 +76,9 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), ViewP private var viewPagerPosition: Int = 0 override fun onPageScrollStateChanged(state: Int) { - } override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - } override fun onPageSelected(position: Int) { @@ -78,13 +86,12 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), ViewP } override fun onDialogClosed(positiveResult: Boolean) { - } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val view = LayoutInflater.from(activity).inflate(R.layout.preference_dialog_now_playing_screen, null) val viewPager = view.findViewById(R.id.now_playing_screen_view_pager) - ?: throw IllegalStateException("Dialog view must contain a ViewPager with id 'now_playing_screen_view_pager'") + ?: throw IllegalStateException("Dialog view must contain a ViewPager with id 'now_playing_screen_view_pager'") viewPager.adapter = NowPlayingScreenAdapter(activity!!) viewPager.addOnPageChangeListener(this) viewPager.pageMargin = ViewUtil.convertDpToPixel(32f, resources).toInt() @@ -109,24 +116,6 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), ViewP } } - private fun isNowPlayingThemes(nowPlayingScreen: NowPlayingScreen): Boolean { - if (nowPlayingScreen == NowPlayingScreen.BLUR_CARD) { - PreferenceUtil.getInstance(requireContext()).resetCarouselEffect() - PreferenceUtil.getInstance(requireContext()).resetCircularAlbumArt() - } - - return (nowPlayingScreen == NowPlayingScreen.FULL || - nowPlayingScreen == NowPlayingScreen.CARD || - nowPlayingScreen == NowPlayingScreen.PLAIN || - nowPlayingScreen == NowPlayingScreen.BLUR || - nowPlayingScreen == NowPlayingScreen.COLOR || - nowPlayingScreen == NowPlayingScreen.SIMPLE || - nowPlayingScreen == NowPlayingScreen.BLUR_CARD || - nowPlayingScreen == NowPlayingScreen.CIRCLE || - nowPlayingScreen == NowPlayingScreen.ADAPTIVE) - && !App.isProVersion() - } - companion object { fun newInstance(key: String): NowPlayingScreenPreferenceDialog { val bundle = Bundle() @@ -138,7 +127,7 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), ViewP } } -private class NowPlayingScreenAdapter internal constructor(private val context: Context) : PagerAdapter() { +private class NowPlayingScreenAdapter(private val context: Context) : PagerAdapter() { override fun instantiateItem(collection: ViewGroup, position: Int): Any { val nowPlayingScreen = NowPlayingScreen.values()[position] @@ -148,16 +137,26 @@ private class NowPlayingScreenAdapter internal constructor(private val context: collection.addView(layout) val image = layout.findViewById(R.id.image) + val proText = layout.findViewById(R.id.proText) val title = layout.findViewById(R.id.title) Glide.with(context).load(nowPlayingScreen.drawableResId).into(image) title.setText(nowPlayingScreen.titleRes) - + if (isNowPlayingThemes(nowPlayingScreen)) { + proText.show() + } else { + proText.hide() + } + val color = ThemeStore.accentColor(context) + proText.backgroundTintList = ColorStateList.valueOf(color) + proText.setTextColor(MaterialValueHelper.getPrimaryTextColor(context,ColorUtil.isColorLight(color))) return layout } - override fun destroyItem(collection: ViewGroup, - position: Int, - view: Any) { + override fun destroyItem( + collection: ViewGroup, + position: Int, + view: Any + ) { collection.removeView(view as View) } @@ -172,4 +171,19 @@ private class NowPlayingScreenAdapter internal constructor(private val context: override fun getPageTitle(position: Int): CharSequence? { return context.getString(NowPlayingScreen.values()[position].titleRes) } -} \ No newline at end of file +} + +fun isNowPlayingThemes(nowPlayingScreen: NowPlayingScreen): Boolean { + return (nowPlayingScreen == NowPlayingScreen.FULL || + nowPlayingScreen == NowPlayingScreen.CARD || + nowPlayingScreen == NowPlayingScreen.PLAIN || + nowPlayingScreen == NowPlayingScreen.BLUR || + nowPlayingScreen == NowPlayingScreen.COLOR || + nowPlayingScreen == NowPlayingScreen.SIMPLE || + nowPlayingScreen == NowPlayingScreen.BLUR_CARD || + nowPlayingScreen == NowPlayingScreen.CIRCLE || + nowPlayingScreen == NowPlayingScreen.ADAPTIVE || + nowPlayingScreen == NowPlayingScreen.MATERIAL || + nowPlayingScreen == NowPlayingScreen.PEAK) + && !App.isProVersion() +} 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 9476e86d1..6243a0ca9 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 @@ -19,10 +19,11 @@ import android.database.Cursor; import android.os.Environment; import android.provider.MediaStore; import android.webkit.MimeTypeMap; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - +import code.name.monkey.retromusic.loaders.SongLoader; +import code.name.monkey.retromusic.loaders.SortedCursor; +import code.name.monkey.retromusic.model.Song; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; @@ -37,137 +38,9 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; -import code.name.monkey.retromusic.loaders.SongLoader; -import code.name.monkey.retromusic.loaders.SortedCursor; -import code.name.monkey.retromusic.model.Song; - public final class FileUtil { - private FileUtil() { - } - - public static byte[] readBytes(InputStream stream) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[4096]; - int count; - while ((count = stream.read(buffer)) != -1) { - baos.write(buffer, 0, count); - } - stream.close(); - return baos.toByteArray(); - } - - @NonNull - public static ArrayList matchFilesWithMediaStore(@NonNull Context context, - @Nullable List files) { - return SongLoader.INSTANCE.getSongs(makeSongCursor(context, files)); - } - - public static String safeGetCanonicalPath(File file) { - try { - return file.getCanonicalPath(); - } catch (IOException e) { - e.printStackTrace(); - return file.getAbsolutePath(); - } - } - - @Nullable - public static SortedCursor makeSongCursor(@NonNull final Context context, - @Nullable final List files) { - String selection = null; - String[] paths = null; - - if (files != null) { - paths = toPathArray(files); - - if (files.size() > 0 - && files.size() < 999) { // 999 is the max amount Androids SQL implementation can handle. - selection = - MediaStore.Audio.AudioColumns.DATA + " IN (" + makePlaceholders(files.size()) + ")"; - } - } - - Cursor songCursor = SongLoader.INSTANCE.makeSongCursor(context, selection, selection == null ? null : paths); - - return songCursor == null ? null - : new SortedCursor(songCursor, paths, MediaStore.Audio.AudioColumns.DATA); - } - - private static String makePlaceholders(int len) { - StringBuilder sb = new StringBuilder(len * 2 - 1); - sb.append("?"); - for (int i = 1; i < len; i++) { - sb.append(",?"); - } - return sb.toString(); - } - - @Nullable - private static String[] toPathArray(@Nullable List files) { - if (files != null) { - String[] paths = new String[files.size()]; - for (int i = 0; i < files.size(); i++) { - /*try { - paths[i] = files.get(i).getCanonicalPath(); // canonical path is important here because we want to compare the path with the media store entry later - } catch (IOException e) { - e.printStackTrace(); - paths[i] = files.get(i).getPath(); - }*/ - paths[i] = safeGetCanonicalPath(files.get(i)); - } - return paths; - } - return null; - } - - @NonNull - public static List listFiles(@NonNull File directory, @Nullable FileFilter fileFilter) { - List fileList = new LinkedList<>(); - File[] found = directory.listFiles(fileFilter); - if (found != null) { - Collections.addAll(fileList, found); - } - return fileList; - } - - @NonNull - public static List listFilesDeep(@NonNull File directory, @Nullable FileFilter fileFilter) { - List files = new LinkedList<>(); - internalListFilesDeep(files, directory, fileFilter); - return files; - } - - @NonNull - public static List listFilesDeep(@NonNull Collection files, - @Nullable FileFilter fileFilter) { - List resFiles = new LinkedList<>(); - for (File file : files) { - if (file.isDirectory()) { - internalListFilesDeep(resFiles, file, fileFilter); - } else if (fileFilter == null || fileFilter.accept(file)) { - resFiles.add(file); - } - } - return resFiles; - } - - private static void internalListFilesDeep(@NonNull Collection files, - @NonNull File directory, @Nullable FileFilter fileFilter) { - File[] found = directory.listFiles(fileFilter); - - if (found != null) { - for (File file : found) { - if (file.isDirectory()) { - internalListFilesDeep(files, file, fileFilter); - } else { - files.add(file); - } - } - } - } - public static boolean fileIsMimeType(File file, String mimeType, MimeTypeMap mimeTypeMap) { if (mimeType == null || mimeType.equals("*/*")) { return true; @@ -209,15 +82,95 @@ public final class FileUtil { } } - public static String stripExtension(String str) { - if (str == null) { - return null; + public static boolean isExternalMemoryAvailable() { + Boolean isSDPresent = Environment.getExternalStorageState() + .equals(android.os.Environment.MEDIA_MOUNTED); + Boolean isSDSupportedDevice = Environment.isExternalStorageRemovable(); + + if (isSDSupportedDevice && isSDPresent) { + // yes SD-card is present + return true; + } else { + return false; + // Sorry } - int pos = str.lastIndexOf('.'); - if (pos == -1) { - return str; + } + + @NonNull + public static List listFiles(@NonNull File directory, @Nullable FileFilter fileFilter) { + List fileList = new LinkedList<>(); + File[] found = directory.listFiles(fileFilter); + if (found != null) { + Collections.addAll(fileList, found); } - return str.substring(0, pos); + return fileList; + } + + @NonNull + public static List listFilesDeep(@NonNull File directory, @Nullable FileFilter fileFilter) { + List files = new LinkedList<>(); + internalListFilesDeep(files, directory, fileFilter); + return files; + } + + @NonNull + public static List listFilesDeep(@NonNull Collection files, + @Nullable FileFilter fileFilter) { + List resFiles = new LinkedList<>(); + for (File file : files) { + if (file.isDirectory()) { + internalListFilesDeep(resFiles, file, fileFilter); + } else if (fileFilter == null || fileFilter.accept(file)) { + resFiles.add(file); + } + } + return resFiles; + } + + @Nullable + public static SortedCursor makeSongCursor(@NonNull final Context context, + @Nullable final List files) { + String selection = null; + String[] paths = null; + + if (files != null) { + paths = toPathArray(files); + + if (files.size() > 0 + && files.size() < 999) { // 999 is the max amount Androids SQL implementation can handle. + selection = + MediaStore.Audio.AudioColumns.DATA + " IN (" + makePlaceholders(files.size()) + ")"; + } + } + + Cursor songCursor = SongLoader.makeSongCursor(context, selection, selection == null ? null : paths); + + return songCursor == null ? null + : new SortedCursor(songCursor, paths, MediaStore.Audio.AudioColumns.DATA); + } + + @NonNull + public static ArrayList matchFilesWithMediaStore(@NonNull Context context, + @Nullable List files) { + return SongLoader.INSTANCE.getSongs(makeSongCursor(context, files)); + } + + public static String read(File file) throws Exception { + FileInputStream fin = new FileInputStream(file); + String ret = readFromStream(fin); + fin.close(); + return ret; + } + + public static byte[] readBytes(InputStream stream) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int count; + while ((count = stream.read(buffer)) != -1) { + baos.write(buffer, 0, count); + } + stream.close(); + return baos.toByteArray(); } public static String readFromStream(InputStream is) throws Exception { @@ -234,27 +187,6 @@ public final class FileUtil { return sb.toString(); } - public static String read(File file) throws Exception { - FileInputStream fin = new FileInputStream(file); - String ret = readFromStream(fin); - fin.close(); - return ret; - } - - public static boolean isExternalMemoryAvailable() { - Boolean isSDPresent = Environment.getExternalStorageState() - .equals(android.os.Environment.MEDIA_MOUNTED); - Boolean isSDSupportedDevice = Environment.isExternalStorageRemovable(); - - if (isSDSupportedDevice && isSDPresent) { - // yes SD-card is present - return true; - } else { - return false; - // Sorry - } - } - public static File safeGetCanonicalFile(File file) { try { return file.getCanonicalFile(); @@ -264,5 +196,70 @@ public final class FileUtil { } } + public static String safeGetCanonicalPath(File file) { + try { + return file.getCanonicalPath(); + } catch (IOException e) { + e.printStackTrace(); + return file.getAbsolutePath(); + } + } + + public static String stripExtension(String str) { + if (str == null) { + return null; + } + int pos = str.lastIndexOf('.'); + if (pos == -1) { + return str; + } + return str.substring(0, pos); + } + + private FileUtil() { + } + + private static void internalListFilesDeep(@NonNull Collection files, + @NonNull File directory, @Nullable FileFilter fileFilter) { + File[] found = directory.listFiles(fileFilter); + + if (found != null) { + for (File file : found) { + if (file.isDirectory()) { + internalListFilesDeep(files, file, fileFilter); + } else { + files.add(file); + } + } + } + } + + private static String makePlaceholders(int len) { + StringBuilder sb = new StringBuilder(len * 2 - 1); + sb.append("?"); + for (int i = 1; i < len; i++) { + sb.append(",?"); + } + return sb.toString(); + } + + @Nullable + private static String[] toPathArray(@Nullable List files) { + if (files != null) { + String[] paths = new String[files.size()]; + for (int i = 0; i < files.size(); i++) { + /*try { + paths[i] = files.get(i).getCanonicalPath(); // canonical path is important here because we want to compare the path with the media store entry later + } catch (IOException e) { + e.printStackTrace(); + paths[i] = files.get(i).getPath(); + }*/ + paths[i] = safeGetCanonicalPath(files.get(i)); + } + return paths; + } + return null; + } + } diff --git a/app/src/main/res/drawable/line_button.xml b/app/src/main/res/drawable/line_button.xml index ee063c5a4..9abfdfdfd 100644 --- a/app/src/main/res/drawable/line_button.xml +++ b/app/src/main/res/drawable/line_button.xml @@ -1,9 +1,21 @@ - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_blur.xml b/app/src/main/res/layout/fragment_blur.xml index 0007814e9..2fb9be28f 100644 --- a/app/src/main/res/layout/fragment_blur.xml +++ b/app/src/main/res/layout/fragment_blur.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="?attr/colorSurface" android:clickable="true" android:focusable="true"> @@ -18,10 +19,6 @@ android:layout_height="wrap_content" android:background="@drawable/shadow_up_full_theme" /> - - - @@ -86,5 +82,4 @@ tools:layout="@layout/fragment_card_blur_player_playback_controls" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_now_playing_screen_item.xml b/app/src/main/res/layout/preference_now_playing_screen_item.xml index 9de1f01bb..4ff206089 100644 --- a/app/src/main/res/layout/preference_now_playing_screen_item.xml +++ b/app/src/main/res/layout/preference_now_playing_screen_item.xml @@ -25,10 +25,25 @@ android:id="@+id/image" android:layout_width="0dp" android:layout_height="0dp" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/proText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/title" tools:src="@tools:sample/backgrounds/scenic" /> + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 714e6f090..b1a0ecca4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -826,4 +826,5 @@ Drive mode Retro Music Player Number of songs + Pro diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml index edfd7029a..27a62a665 100755 --- a/app/src/main/res/xml/pref_advanced.xml +++ b/app/src/main/res/xml/pref_advanced.xml @@ -7,6 +7,7 @@ - - - + \ No newline at end of file