diff --git a/app/build.gradle b/app/build.gradle index ebb6025a..37bcac79 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,17 +2,8 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' -apply plugin: "ru.cleverpumpkin.proguard-dictionaries-generator" apply plugin: "androidx.navigation.safeargs.kotlin" -proguardDictionaries { - dictionaryNames = [ - "build/class-dictionary", - "build/package-dictionary", - "build/obfuscation-dictionary" - ] -} - android { compileSdkVersion 29 buildToolsVersion = '29.0.3' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5e2e2be5..a7f474df 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -41,25 +41,14 @@ public *; } --keep class !android.support.v7.internal.view.menu.**,** {*;} -dontwarn -ignorewarnings --keep public class android.support.design.widget.BottomNavigationView { *; } --keep public class android.support.design.internal.BottomNavigationMenuView { *; } --keep public class android.support.design.internal.BottomNavigationPresenter { *; } --keep public class android.support.design.internal.BottomNavigationItemView { *; } - #-dontwarn android.support.v8.renderscript.* #-keepclassmembers class android.support.v8.renderscript.RenderScript { # native *** rsn*(...); # native *** n*(...); #} -#-keep class org.jaudiotagger.** { *; } - - --obfuscationdictionary build/obfuscation-dictionary.txt --classobfuscationdictionary build/class-dictionary.txt --packageobfuscationdictionary build/package-dictionary.txt +#-keep class org.jaudiotagger.** { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11590b31..742fd571 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -118,6 +118,7 @@ + Welcome to Retro Music", + HtmlCompat.FROM_HTML_MODE_COMPACT + ) + appNameText.text = appName + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt index 1afa57b4..71192a72 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt @@ -46,7 +46,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() { override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) if (!hasPermissions()) { - requestPermissions() + //requestPermissions() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index 54098279..729adee2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -178,6 +178,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { behavior.isHideable = true behavior.peekHeight = 0 collapsePanel() + ViewCompat.setElevation(slidingPanel, 0f) ViewCompat.setElevation(bottomNavigationView, 10f) } else { ViewCompat.setElevation(bottomNavigationView, 10f) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt index 8cb9f9d8..9e9fc505 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt @@ -170,6 +170,7 @@ open class AlbumAdapter( if (isInQuickSelectMode) { toggleChecked(layoutPosition) } else { + println(dataSet[layoutPosition].id) image?.let { albumClickListener?.onAlbumClick(dataSet[layoutPosition].id, it) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt index 9afbd431..242bb287 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExt.kt @@ -49,6 +49,7 @@ fun Int.ripAlpha(): Int { } fun Dialog.colorControlNormal() = resolveColor(android.R.attr.colorControlNormal) + fun Toolbar.backgroundTintList() { val surfaceColor = ATHUtil.resolveColor(context, R.attr.colorSurface, Color.BLACK) val colorStateList = ColorStateList.valueOf(surfaceColor) @@ -84,7 +85,6 @@ fun Fragment.resolveColor(@AttrRes attr: Int, fallBackColor: Int = 0) = fun Dialog.resolveColor(@AttrRes attr: Int, fallBackColor: Int = 0) = ATHUtil.resolveColor(context, attr, fallBackColor) - fun CheckBox.addAccentColor() { buttonTintList = ColorStateList.valueOf(ThemeStore.accentColor(context)) } @@ -103,6 +103,19 @@ fun MaterialButton.accentTextColor() { setTextColor(ThemeStore.accentColor(App.getContext())) } +fun MaterialButton.accentBackgroundColor() { + backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(App.getContext())) +} + +fun MaterialButton.accentOutlineColor() { + val color = ThemeStore.accentColor(context) + val colorStateList = ColorStateList.valueOf(color) + iconTint = colorStateList + strokeColor = colorStateList + setTextColor(colorStateList) + rippleColor = colorStateList +} + fun SeekBar.applyColor(@ColorInt color: Int) { thumbTintList = ColorStateList.valueOf(color) progressTintList = ColorStateList.valueOf(color) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index a60b9256..3999ee70 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -74,6 +74,7 @@ class LibraryViewModel( } fun getHome(): LiveData> { + fetchHomeSections() return home } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt index bade59ff..fefdf40a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt @@ -79,6 +79,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det toolbar.title = " " postponeEnterTransition() detailsViewModel.getAlbum().observe(viewLifecycleOwner, Observer { + println(Thread.currentThread().name) startPostponedEnterTransition() showAlbum(it) }) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt index 3311046e..8f4e4197 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt @@ -12,23 +12,23 @@ import code.name.monkey.retromusic.repository.RealRepository import kotlinx.coroutines.Dispatchers.IO class AlbumDetailsViewModel( - private val realRepository: RealRepository, + private val repository: RealRepository, private val albumId: Int ) : ViewModel(), MusicServiceEventListener { fun getAlbum(): LiveData = liveData(IO) { - val album = realRepository.albumByIdAsync(albumId) + val album = repository.albumByIdAsync(albumId) emit(album) } fun getArtist(artistId: Int): LiveData = liveData(IO) { - val artist = realRepository.artistById(artistId) + val artist = repository.artistById(artistId) emit(artist) } fun getAlbumInfo(album: Album): LiveData> = liveData { emit(Result.Loading) - emit( realRepository.albumInfo(album.artistName ?: "-", album.title ?: "-")) + emit(repository.albumInfo(album.artistName ?: "-", album.title ?: "-")) } fun getMoreAlbums(artist: Artist): LiveData> = liveData(IO) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt index a78f1618..00352314 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt @@ -78,8 +78,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle return String(Character.toChars(unicode)) } - private fun checkIsEmpty() { - emptyEmoji.text = getEmojiByUnicode(0x1F631) + private fun checkIsEmpty() { emptyText.setText(emptyMessage) empty.visibility = if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index 8f78f518..a47e29a6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -114,15 +114,10 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli private fun checkIsEmpty() { checkForPadding() - emptyEmoji.text = getEmojiByUnicode(0x1F631) empty.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE emptyText.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE } - private fun getEmojiByUnicode(unicode: Int): String { - return String(Character.toChars(unicode)) - } - override fun onPause() { if (recyclerViewDragDropManager != null) { recyclerViewDragDropManager!!.cancelDrag() diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt index 5e83a641..5fd9e6f7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt @@ -60,13 +60,12 @@ class RealAlbumRepository(private val songRepository: RealSongRepository) : } override fun album(albumId: Int): Album { - val songs = songRepository.songs( - songRepository.makeSongCursor( - AudioColumns.ALBUM_ID + "=?", - arrayOf(albumId.toString()), - getSongLoaderSortOrder() - ) + val cursor = songRepository.makeSongCursor( + AudioColumns.ALBUM_ID + "=?", + arrayOf(albumId.toString()), + getSongLoaderSortOrder() ) + val songs = songRepository.songs(cursor) val album = Album(ArrayList(songs)) sortAlbumSongs(album) return album diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt index fcfded6a..10165a7f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt @@ -18,12 +18,10 @@ import android.content.Context import android.database.Cursor import android.provider.MediaStore import android.provider.MediaStore.Audio.AudioColumns -import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.Constants.IS_MUSIC import code.name.monkey.retromusic.Constants.baseProjection import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.providers.BlacklistStore - import code.name.monkey.retromusic.util.PreferenceUtil import java.util.* @@ -124,6 +122,7 @@ class RealSongRepository(private val context: Context) : SongRepository { @JvmOverloads fun makeSongCursor( + selection: String?, selectionValues: Array?, sortOrder: String = PreferenceUtil.songSortOrder @@ -139,34 +138,22 @@ class RealSongRepository(private val context: Context) : SongRepository { // Blacklist val paths = BlacklistStore.getInstance(context).paths if (paths.isNotEmpty()) { - selectionFinal = - generateBlacklistSelection( - selectionFinal, - paths.size - ) - selectionValuesFinal = - addBlacklistSelectionValues( - selectionValuesFinal, - paths - ) + selectionFinal = generateBlacklistSelection(selectionFinal, paths.size) + selectionValuesFinal = addBlacklistSelectionValues(selectionValuesFinal, paths) } selectionFinal = selectionFinal + " AND " + MediaStore.Audio.Media.DURATION + ">= " + (PreferenceUtil.filterLength * 1000) - - - val uri = if (VersionUtils.hasQ()) { - MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL) - } else { - MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + try { + return context.contentResolver.query( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + baseProjection, + selectionFinal, + selectionValuesFinal, + sortOrder + ) + } catch (e: SecurityException) { + return null } - - return context.contentResolver.query( - uri, - baseProjection, - selectionFinal, - selectionValuesFinal, - sortOrder - ) } private fun generateBlacklistSelection( diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt index 00052977..5a969105 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt @@ -74,7 +74,7 @@ class RingtoneManager(val context: Context) { } fun getDialog(context: Context): AlertDialog { - return MaterialAlertDialogBuilder(context) + return MaterialAlertDialogBuilder(context, R.style.MaterialAlertDialogTheme) .setTitle(R.string.dialog_title_set_ringtone) .setMessage(R.string.dialog_message_set_ringtone) .setPositiveButton(android.R.string.ok) { _, _ -> diff --git a/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt b/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt new file mode 100644 index 00000000..7e627f24 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt @@ -0,0 +1,43 @@ +package code.name.monkey.retromusic.views + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import android.widget.FrameLayout +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.accentOutlineColor +import kotlinx.android.synthetic.main.item_permission.view.* + +class PermissionItem @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = -1, + defStyleRes: Int = -1 +) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) { + init { + val attributes = context.obtainStyledAttributes(attrs, R.styleable.PermissionItem, 0, 0) + inflate(context, R.layout.item_permission, this) + + title.text = attributes.getText(R.styleable.PermissionItem_permissionTitle) + summary.text = attributes.getText(R.styleable.PermissionItem_permissionTitleSubTitle) + number.text = attributes.getText(R.styleable.PermissionItem_permissionTitleNumber) + button.text = attributes.getText(R.styleable.PermissionItem_permissionButtonTitle) + button.setIconResource( + attributes.getResourceId( + R.styleable.PermissionItem_permissionIcon, + R.drawable.ic_album + ) + ) + val color = ThemeStore.accentColor(context) + number.backgroundTintList = ColorStateList.valueOf(ColorUtil.withAlpha(color, 0.22f)) + + button.accentOutlineColor() + attributes.recycle() + } + + fun setButtonClick(callBack: () -> Unit) { + button.setOnClickListener { callBack.invoke() } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_phonelink_ring.xml b/app/src/main/res/drawable/ic_phonelink_ring.xml new file mode 100644 index 00000000..b2c8313e --- /dev/null +++ b/app/src/main/res/drawable/ic_phonelink_ring.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_sd_storage.xml b/app/src/main/res/drawable/ic_sd_storage.xml new file mode 100644 index 00000000..839b9fb2 --- /dev/null +++ b/app/src/main/res/drawable/ic_sd_storage.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_permission.xml b/app/src/main/res/layout/activity_permission.xml new file mode 100644 index 00000000..784da5c4 --- /dev/null +++ b/app/src/main/res/layout/activity_permission.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_permission.xml b/app/src/main/res/layout/item_permission.xml new file mode 100644 index 00000000..1901dca8 --- /dev/null +++ b/app/src/main/res/layout/item_permission.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml index 009217c2..9876285b 100644 --- a/app/src/main/res/navigation/main_graph.xml +++ b/app/src/main/res/navigation/main_graph.xml @@ -71,5 +71,9 @@ android:name="code.name.monkey.retromusic.activities.SettingsActivity" android:label="SettingsActivity" /> - + \ No newline at end of file diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index d723a895..4ffe8a06 100755 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -20,5 +20,5 @@ @string/action_shuffle_all @string/my_top_tracks - 🤔 + 😱 \ No newline at end of file diff --git a/app/src/main/res/values/permission_item.xml b/app/src/main/res/values/permission_item.xml new file mode 100644 index 00000000..8bf73d45 --- /dev/null +++ b/app/src/main/res/values/permission_item.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_images.xml b/app/src/main/res/xml/pref_images.xml index f8a6dc3e..b6ad8fa2 100755 --- a/app/src/main/res/xml/pref_images.xml +++ b/app/src/main/res/xml/pref_images.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto">