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
- Added playlist search
- Added Drive mode
- Added Album and Artist layout change option in library
- Added Show more album and artist information in details
- Added Pixel style scroller bar
- Added current now playing share
- Fix font issues and colors in some places
- Improved Full now playing theme
v3.4.850
- Added new theme called circle
- Added tiny color card style for home artists
- Added extra track info details to now playing themes
- Added scroll animation
- Added smooth transition animations 🤔
- Added current playing tab options for Bottom Navigation View
- Added search in genre
- Improved selecting feedback effect(ripple with corners)
- Fix bugs & crashes
- Fix crashing on lyrics
- Fix genre details last song is under mini player
- Fix colors mistakes and font sizes
- Fix slider jumping while scrolling in now playing themes
v3.4.800
- Improved dark theme colors and Follow system theme
- Rounded rectangle ripple for BottomNavigationView
- Follow sleep timer dialog checkbox color as accent
- Added song list selection for Album and Artist details
- Fixed Toolbar popup text color when selecting songs
v3.4.700
- Added splash screen(for app loading time)
- Updated dark theme colors
- Added circular progress view
- Hiding year if not showing
v3.4.600
- Fix notification layout height
- Fix folder list last item not showing
- Added auto hide/ show controls according to first and last item
v3.4.500
- Added peak theme
- Added app rating dialog
- Fix song name scrolling in now playing themes if it's long
- Fix playing queue last item hiding FAB
- Added desaturated color option for dark mode
- Fix slow search loading
- Fix last added slow loading
- Fix home banner toolbar corner
- Fix home crashing when switching between two tabs
- Fix remaining time in playing queue
- Fix font not applied for some components
- Fix crashing on album details sorting
- Fixed lot of internal bugs
- Fix dialog expand
- Fix list card color
- Removed SlidingUpPanel to replace with BottomSheet
- Removed color theme as per material design guidelines
- Removed classic theme(We're bringing back)
- Replace line switch to Material Switch in settings
- Performance improved
- Updated internal libraries
- Updated translation
- Limiting the use of Theme engine for making use of system colors
- Change home icon from the user icon
- Corrected all toolbar with elevation when scrolling
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
- Major code refactor for Album and Artist loading
v3.4.900
- Added playlist search
- Added Drive mode
- Added Album and Artist layout change option in library
- Added Show more album and artist information in details
- Added Pixel style scroller bar
- Added current now playing share
- Fix font issues and colors in some places
- Improved Full now playing theme
v3.4.850
- Added new theme called circle
- Added tiny color card style for home artists
- Added extra track info details to now playing themes
- Added scroll animation
- Added smooth transition animations 🤔
- Added current playing tab options for Bottom Navigation View
- Added search in genre
- Improved selecting feedback effect(ripple with corners)
- Fix bugs & crashes
- Fix crashing on lyrics
- Fix genre details last song is under mini player
- Fix colors mistakes and font sizes
- Fix slider jumping while scrolling in now playing themes
v3.4.800
- Improved dark theme colors and Follow system theme
- Rounded rectangle ripple for BottomNavigationView
- Follow sleep timer dialog checkbox color as accent
- Added song list selection for Album and Artist details
- Fixed Toolbar popup text color when selecting songs
v3.4.700
- Added splash screen(for app loading time)
- Updated dark theme colors
- Added circular progress view
- Hiding year if not showing
v3.4.600
- Fix notification layout height
- Fix folder list last item not showing
- Added auto hide/ show controls according to first and last item
v3.4.500
- Added peak theme
- Added app rating dialog
- Fix song name scrolling in now playing themes if it's long
- Fix playing queue last item hiding FAB
- Added desaturated color option for dark mode
- Fix slow search loading
- Fix last added slow loading
- Fix home banner toolbar corner
- Fix home crashing when switching between two tabs
- Fix remaining time in playing queue
- Fix font not applied for some components
- Fix crashing on album details sorting
- Fixed lot of internal bugs
- Fix dialog expand
- Fix list card color
- Removed SlidingUpPanel to replace with BottomSheet
- Removed color theme as per material design guidelines
- Removed classic theme(We're bringing back)
- Replace line switch to Material Switch in settings
- Performance improved
- Updated internal libraries
- Updated translation
- Limiting the use of Theme engine for making use of system colors
- Change home icon from the user icon
- Corrected all toolbar with elevation when scrolling
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