diff --git a/app/build.gradle b/app/build.gradle index 72d67218e..266fbde92 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,10 +75,12 @@ android { abortOnError false } compileOptions { - sourceCompatibility '1.8' - targetCompatibility '1.8' + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" } - configurations.all { resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' @@ -89,7 +91,6 @@ android { kapt { generateStubs = true } - } def getProperties(String fileName) { @@ -118,15 +119,16 @@ dependencies { implementation "androidx.gridlayout:gridlayout:1.0.0" implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.palette:palette:1.0.0" - implementation 'androidx.palette:palette-ktx:1.0.0' implementation "androidx.viewpager2:viewpager2:1.1.0-alpha01" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.preference:preference:1.1.1' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.core:core-ktx:1.2.0' - implementation 'androidx.fragment:fragment:1.2.4' + implementation 'androidx.fragment:fragment-ktx:1.2.4' + implementation 'androidx.palette:palette-ktx:1.0.0' + + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.android.material:material:1.2.0-alpha06' diff --git a/app/src/main/assets/oldindex.html b/app/src/main/assets/oldindex.html index b29773666..a6ce8895f 100644 --- a/app/src/main/assets/oldindex.html +++ b/app/src/main/assets/oldindex.html @@ -25,6 +25,7 @@ } + diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index 4c86d4d49..04dcc205e 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -53,27 +53,29 @@ font-size: 1rem; } {style-placeholder} + -
April 30, 2020
-

v3.5.110

- Beta version -

What's New

- -

Improved

- - -

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

+
April 30, 2020
+

v3.5.110

+Beta version +

What's New

+ +

Improved

+ + +

*If you face any UI related issues you clear app data and cache, if itsnot 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 0b3c6fa9d..1f871b583 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -50,4 +50,81 @@ object Constants { MediaStore.Audio.AudioColumns.COMPOSER )// 11 const val NUMBER_OF_TOP_TRACKS = 99 + + } + +const val EXTRA_SONG = "extra_songs" +const val EXTRA_PLAYLIST = "extra_list" +const val LIBRARY_CATEGORIES = "library_categories" +const val EXTRA_SONG_INFO = "extra_song_info" +const val DESATURATED_COLOR = "desaturated_color" +const val BLACK_THEME = "black_theme" +const val KEEP_SCREEN_ON = "keep_screen_on" +const val TOGGLE_HOME_BANNER = "toggle_home_banner" +const val NOW_PLAYING_SCREEN_ID = "now_playing_screen_id" +const val CAROUSEL_EFFECT = "carousel_effect" +const val COLORED_NOTIFICATION = "colored_notification" +const val CLASSIC_NOTIFICATION = "classic_notification" +const val GAPLESS_PLAYBACK = "gapless_playback" +const val ALBUM_ART_ON_LOCKSCREEN = "album_art_on_lockscreen" +const val BLURRED_ALBUM_ART = "blurred_album_art" +const val NEW_BLUR_AMOUNT = "new_blur_amount" +const val TOGGLE_HEADSET = "toggle_headset" +const val GENERAL_THEME = "general_theme" +const val CIRCULAR_ALBUM_ART = "circular_album_art" +const val USER_NAME = "user_name" +const val TOGGLE_FULL_SCREEN = "toggle_full_screen" +const val TOGGLE_VOLUME = "toggle_volume" +const val ROUND_CORNERS = "corner_window" +const val TOGGLE_GENRE = "toggle_genre" +const val PROFILE_IMAGE_PATH = "profile_image_path" +const val BANNER_IMAGE_PATH = "banner_image_path" +const val ADAPTIVE_COLOR_APP = "adaptive_color_app" +const val TOGGLE_SEPARATE_LINE = "toggle_separate_line" +const val HOME_ARTIST_GRID_STYLE = "home_artist_grid_style" +const val TOGGLE_ADD_CONTROLS = "toggle_add_controls" +const val ALBUM_COVER_STYLE = "album_cover_style_id" +const val ALBUM_COVER_TRANSFORM = "album_cover_transform" +const val TAB_TEXT_MODE = "tab_text_mode" +const val LANGUAGE_NAME = "language_name" +const val DIALOG_CORNER = "dialog_corner" +const val SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_song" +const val ALBUM_GRID_STYLE = "album_grid_style_home" +const val ARTIST_GRID_STYLE = "artist_grid_style_home" +const val SAF_SDCARD_URI = "saf_sdcard_uri" +const val SONG_SORT_ORDER = "song_sort_order" +const val SONG_GRID_SIZE = "song_grid_size" +const val GENRE_SORT_ORDER = "genre_sort_order" +const val LAST_PAGE = "last_start_page" +const val BLUETOOTH_PLAYBACK = "bluetooth_playback" +const val INITIALIZED_BLACKLIST = "initialized_blacklist" +const val ARTIST_SORT_ORDER = "artist_sort_order" +const val ARTIST_ALBUM_SORT_ORDER = "artist_album_sort_order" +const val ALBUM_SORT_ORDER = "album_sort_order" +const val ALBUM_SONG_SORT_ORDER = "album_song_sort_order" +const val ARTIST_SONG_SORT_ORDER = "artist_song_sort_order" +const val ALBUM_GRID_SIZE = "album_grid_size" +const val ALBUM_GRID_SIZE_LAND = "album_grid_size_land" +const val SONG_GRID_SIZE_LAND = "song_grid_size_land" +const val ARTIST_GRID_SIZE = "artist_grid_size" +const val ARTIST_GRID_SIZE_LAND = "artist_grid_size_land" +const val COLORED_APP_SHORTCUTS = "colored_app_shortcuts" +const val AUDIO_DUCKING = "audio_ducking" +const val LAST_ADDED_CUTOFF = "last_added_interval" +const val LAST_SLEEP_TIMER_VALUE = "last_sleep_timer_value" +const val NEXT_SLEEP_TIMER_ELAPSED_REALTIME = + "next_sleep_timer_elapsed_real_time" +const val IGNORE_MEDIA_STORE_ARTWORK = "ignore_media_store_artwork" +const val LAST_CHANGELOG_VERSION = "last_changelog_version" +const val AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy" +const val START_DIRECTORY = "start_directory" +const val LOCK_SCREEN = "lock_screen" +const val ALBUM_DETAIL_SONG_SORT_ORDER = "album_detail_song_sort_order" +const val LYRICS_OPTIONS = "lyrics_tab_position" +const val CHOOSE_EQUALIZER = "choose_equalizer" +const val TOGGLE_SHUFFLE = "toggle_shuffle" +const val SONG_GRID_STYLE = "song_grid_style" +const val PAUSE_ON_ZERO_VOLUME = "pause_on_zero_volume" +const val FILTER_SONG = "filter_song" +const val EXPAND_NOW_PLAYING_PANEL = "expand_now_playing_panel" \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt index 045597d9e..58650582e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt @@ -25,9 +25,6 @@ import code.name.monkey.retromusic.adapter.ContributorAdapter import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.model.Contributor import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItems import com.google.gson.Gson import com.google.gson.reflect.TypeToken import kotlinx.android.synthetic.main.activity_about.* @@ -57,7 +54,6 @@ class AboutActivity : AbsBaseActivity(), View.OnClickListener { return json } - override fun onCreate(savedInstanceState: Bundle?) { setDrawUnderStatusBar() super.onCreate(savedInstanceState) @@ -121,19 +117,6 @@ class AboutActivity : AbsBaseActivity(), View.OnClickListener { } } - private fun showChangeLogOptions() { - MaterialDialog(this).show { - cornerRadius(PreferenceUtil.getInstance(this@AboutActivity).dialogCorner) - listItems(items = listOf("Telegram Channel", "App")) { _, position, _ -> - if (position == 0) { - openUrl(TELEGRAM_CHANGE_LOG) - } else { - NavigationUtil.gotoWhatNews(this@AboutActivity) - } - } - } - } - private fun getAppVersion(): String { return try { val isPro = if (App.isProVersion()) "Pro" else "Free" diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt index 7acd79bff..c3c1c5e59 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt @@ -74,7 +74,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C private lateinit var artistImage: ImageView private var cab: MaterialCab? = null private val savedSortOrder: String - get() = PreferenceUtil.getInstance(this).albumDetailSongSortOrder + get() = PreferenceUtilKT.albumDetailSongSortOrder override fun createContentView(): View { return wrapSlidingMusicPanel(R.layout.activity_album) @@ -256,7 +256,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C private fun loadAlbumCover() { AlbumGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong()) .checkIgnoreMediaStore(this) - .ignoreMediaStore(PreferenceUtil.getInstance(this).ignoreMediaStoreArtwork()) + .ignoreMediaStore(PreferenceUtilKT.isIgnoreMediaStoreArtwork) .generatePalette(this) .build() .dontAnimate() @@ -269,7 +269,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C } private fun setColors(color: MediaNotificationProcessor) { - val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) + val buttonColor = if (PreferenceUtilKT.isAdaptiveColor) color.backgroundColor.ripAlpha() else ATHUtil.resolveColor(this, R.attr.colorSurface) @@ -362,8 +362,8 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C } } - private fun setSaveSortOrder(sortOrder: String?) { - PreferenceUtil.getInstance(this).albumDetailSongSortOrder = sortOrder + private fun setSaveSortOrder(sortOrder: String) { + PreferenceUtilKT.albumDetailSongSortOrder = sortOrder when (sortOrder) { AlbumSongSortOrder.SONG_TRACK_LIST -> album.songs?.sortWith(Comparator { o1, o2 -> o1.trackNumber.compareTo( diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt index 844f80cba..6b2154a66 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt @@ -255,7 +255,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, } private fun setColors(color: MediaNotificationProcessor) { - val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) + val buttonColor = if (PreferenceUtilKT.isAdaptiveColor) color.backgroundColor.ripAlpha() else ATHUtil.resolveColor(this, R.attr.colorSurface) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt index a7dc36de1..a6d5dd39f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt @@ -33,7 +33,7 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.lyrics.Lyrics import code.name.monkey.retromusic.util.LyricUtil import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroUtil import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.input.getInputLayout @@ -61,7 +61,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, } override fun onPageSelected(position: Int) { - PreferenceUtil.getInstance(this).lyricsOptions = position + PreferenceUtilKT.lyricsOption = position if (position == 0) fab.text = getString(R.string.synced_lyrics) else if (position == 1) fab.text = getString(R.string.lyrics) } @@ -107,7 +107,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, viewPager.apply { adapter = PagerAdapter(supportFragmentManager) - currentItem = PreferenceUtil.getInstance(this@LyricsActivity).lyricsOptions + currentItem = PreferenceUtilKT.lyricsOption addOnPageChangeListener(this@LyricsActivity) } @@ -172,7 +172,6 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, val materialDialog = MaterialDialog(this) .show { - cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner) title(R.string.add_time_framed_lryics) negativeButton(R.string.action_search) { RetroUtil.openUrl(this@LyricsActivity, googleSearchLrcUrl) @@ -210,7 +209,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, val materialDialog = MaterialDialog( this ).show { - cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner) + title(R.string.add_lyrics) negativeButton(R.string.action_search) { RetroUtil.openUrl(this@LyricsActivity, getGoogleSearchUrl()) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java deleted file mode 100644 index 452bbd610..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java +++ /dev/null @@ -1,836 +0,0 @@ -/* - * Copyright (c) 2020 Hemanth Savarala. - * - * Licensed under the GNU General Public License v3 - * - * This is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by - * the Free Software Foundation either version 3 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - */ - -package code.name.monkey.retromusic.activities; - -import android.app.ActivityOptions; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.IntentSender; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.net.Uri; -import android.os.Bundle; -import android.provider.MediaStore; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.SubMenu; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.Fragment; - -import com.afollestad.materialcab.MaterialCab; -import com.afollestad.materialcab.MaterialCab.Callback; -import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.snackbar.Snackbar; -import com.google.android.play.core.appupdate.AppUpdateInfo; -import com.google.android.play.core.appupdate.AppUpdateManager; -import com.google.android.play.core.appupdate.AppUpdateManagerFactory; -import com.google.android.play.core.install.InstallState; -import com.google.android.play.core.install.InstallStateUpdatedListener; -import com.google.android.play.core.install.model.AppUpdateType; -import com.google.android.play.core.install.model.InstallStatus; -import com.google.android.play.core.install.model.UpdateAvailability; -import com.google.android.play.core.tasks.Task; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -import code.name.monkey.appthemehelper.ThemeStore; -import code.name.monkey.appthemehelper.util.ATHUtil; -import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; -import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity; -import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog; -import code.name.monkey.retromusic.fragments.albums.AlbumsFragment; -import code.name.monkey.retromusic.fragments.artists.ArtistsFragment; -import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment; -import code.name.monkey.retromusic.fragments.genres.GenresFragment; -import code.name.monkey.retromusic.fragments.home.BannerHomeFragment; -import code.name.monkey.retromusic.fragments.mainactivity.FoldersFragment; -import code.name.monkey.retromusic.fragments.playlists.PlaylistsFragment; -import code.name.monkey.retromusic.fragments.queue.PlayingQueueFragment; -import code.name.monkey.retromusic.fragments.songs.SongsFragment; -import code.name.monkey.retromusic.helper.MusicPlayerRemote; -import code.name.monkey.retromusic.helper.SearchQueryHelper; -import code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder; -import code.name.monkey.retromusic.helper.SortOrder.ArtistSortOrder; -import code.name.monkey.retromusic.helper.SortOrder.SongSortOrder; -import code.name.monkey.retromusic.interfaces.CabHolder; -import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks; -import code.name.monkey.retromusic.loaders.AlbumLoader; -import code.name.monkey.retromusic.loaders.ArtistLoader; -import code.name.monkey.retromusic.loaders.PlaylistSongsLoader; -import code.name.monkey.retromusic.model.Song; -import code.name.monkey.retromusic.service.MusicService; -import code.name.monkey.retromusic.util.AppRater; -import code.name.monkey.retromusic.util.NavigationUtil; -import code.name.monkey.retromusic.util.PreferenceUtil; -import code.name.monkey.retromusic.util.RetroColorUtil; -import code.name.monkey.retromusic.util.RetroUtil; - -/** - * Created by hemanths on 2020-02-19. - */ -public class MainActivity extends AbsSlidingMusicPanelActivity - implements CabHolder, SharedPreferences.OnSharedPreferenceChangeListener { - - public static final String TAG = MainActivity.class.getSimpleName(); - public static final int APP_INTRO_REQUEST = 100; - public static final String EXPAND_PANEL = "expand_panel"; - private static final int APP_UPDATE_REQUEST_CODE = 9002; - private final IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); - private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(final Context context, final Intent intent) { - String action = intent.getAction(); - if (action != null && action.equals(Intent.ACTION_SCREEN_OFF)) { - if (PreferenceUtil.getInstance(context).getLockScreen() && MusicPlayerRemote.isPlaying()) { - final Intent activity = new Intent(context, LockScreenActivity.class); - activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - ActivityCompat.startActivity(context, activity, null); - } - } - } - }; - private MainActivityFragmentCallbacks currentFragment; - private boolean blockRequestPermissions = false; - private MaterialCab cab; - private AppBarLayout mAppBarLayout; - private Toolbar mToolbar; - private AppUpdateManager appUpdateManager; - InstallStateUpdatedListener listener = new InstallStateUpdatedListener() { - @Override - public void onStateUpdate(InstallState state) { - if (state.installStatus() == InstallStatus.DOWNLOADED) { - popupSnackBarForCompleteUpdate(); - } else if (state.installStatus() == InstallStatus.INSTALLED) { - appUpdateManager.unregisterListener(listener); - } else { - Log.i(TAG, "InstallStateUpdatedListener: state: " + state.installStatus()); - } - } - }; - - private void popupSnackBarForCompleteUpdate() { - Snackbar snackbar = Snackbar.make(findViewById(R.id.mainContent), "New app is ready!", Snackbar.LENGTH_INDEFINITE); - snackbar.setAction("Install", view -> { - if (appUpdateManager != null) { - appUpdateManager.completeUpdate(); - } - }); - snackbar.setActionTextColor(ThemeStore.Companion.accentColor(this)); - snackbar.show(); - } - - @Override - protected void onCreate(@Nullable final Bundle savedInstanceState) { - setDrawUnderStatusBar(); - super.onCreate(savedInstanceState); - setStatusbarColorAuto(); - setNavigationbarColorAuto(); - setLightNavigationBar(true); - setTaskDescriptionColorAuto(); - hideStatusBar(); - setBottomBarVisibility(View.VISIBLE); - - if (savedInstanceState == null) { - selectedFragment(PreferenceUtil.getInstance(this).getLastPage()); - } else { - restoreCurrentFragment(); - } - - mToolbar = findViewById(R.id.toolbar); - mAppBarLayout = findViewById(R.id.appBarLayout); - - //checkShowChangelog(); - AppRater.appLaunched(this); - //PremiumShow.launch(this); - setupToolbar(); - checkUpdate(); - updateTabs(); - getBottomNavigationView().setSelectedItemId(PreferenceUtil.getInstance(this).getLastPage()); - getBottomNavigationView().setOnNavigationItemSelectedListener(item -> { - PreferenceUtil.getInstance(MainActivity.this).setLastPage(item.getItemId()); - selectedFragment(item.getItemId()); - return true; - }); - mIntentFilter.addAction(MusicService.MEDIA_STORE_CHANGED); - } - - - private void checkUpdate() { - appUpdateManager = AppUpdateManagerFactory.create(this); - appUpdateManager.registerListener(listener); - - Task appUpdateInfoTask = appUpdateManager.getAppUpdateInfo(); - appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> { - if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE - && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { - try { - appUpdateManager.startUpdateFlowForResult( - appUpdateInfo, - AppUpdateType.IMMEDIATE, - this, - APP_UPDATE_REQUEST_CODE); - } catch (IntentSender.SendIntentException e) { - e.printStackTrace(); - } - } - }); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == APP_INTRO_REQUEST) { - blockRequestPermissions = false; - if (!hasPermissions()) { - requestPermissions(); - } - } else if (requestCode == APP_UPDATE_REQUEST_CODE) { - if (resultCode != RESULT_OK) { - - } - } - } - - @Override - protected void onResume() { - super.onResume(); - registerReceiver(mBroadcastReceiver, mIntentFilter); - PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this); - - if (getIntent().hasExtra(EXPAND_PANEL) && getIntent().getBooleanExtra(EXPAND_PANEL, false) && PreferenceUtil.getInstance(this).isExpandPanel()) { - expandPanel(); - getIntent().putExtra(EXPAND_PANEL, false); - } - appUpdateManager.getAppUpdateInfo() - .addOnSuccessListener(appUpdateInfo -> { - if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) { - popupSnackBarForCompleteUpdate(); - } - try { - if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { - appUpdateManager.startUpdateFlowForResult( - appUpdateInfo, - AppUpdateType.IMMEDIATE, - this, - APP_UPDATE_REQUEST_CODE); - } - } catch (IntentSender.SendIntentException e) { - e.printStackTrace(); - } - }); - } - - @Override - public void onDestroy() { - super.onDestroy(); - unregisterReceiver(mBroadcastReceiver); - PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this); - } - - public void addOnAppBarOffsetChangedListener( - @NonNull AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { - mAppBarLayout.addOnOffsetChangedListener(onOffsetChangedListener); - } - - public int getTotalAppBarScrollingRange() { - return mAppBarLayout.getTotalScrollRange(); - } - - @Override - public boolean handleBackPress() { - if (cab != null && cab.isActive()) { - cab.finish(); - return true; - } - return super.handleBackPress() || (currentFragment != null && currentFragment.handleBackPress()); - } - - @Override - public boolean onCreateOptionsMenu(final Menu menu) { - getMenuInflater().inflate(R.menu.menu_main, menu); - if (isPlaylistPage()) { - menu.add(0, R.id.action_new_playlist, 1, R.string.new_playlist_title) - .setIcon(R.drawable.ic_playlist_add_white_24dp) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - } - if (isHomePage()) { - menu.add(0, R.id.action_mic, 1, getString(R.string.action_search)) - .setIcon(R.drawable.ic_mic_white_24dp) - .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); - - } - if (isFolderPage()) { - menu.add(0, R.id.action_scan, 0, R.string.scan_media) - .setIcon(R.drawable.ic_scanner_white_24dp) - .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); - menu.add(0, R.id.action_go_to_start_directory, 1, R.string.action_go_to_start_directory) - .setIcon(R.drawable.ic_bookmark_music_white_24dp) - .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); - } - Fragment fragment = getCurrentFragment(); - if (fragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment) { - AbsLibraryPagerRecyclerViewCustomGridSizeFragment currentFragment - = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) fragment; - - MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size); - if (RetroUtil.isLandscape()) { - gridSizeItem.setTitle(R.string.action_grid_size_land); - } - setUpGridSizeMenu(currentFragment, gridSizeItem.getSubMenu()); - MenuItem layoutItem = menu.findItem(R.id.action_layout_type); - setupLayoutMenu(currentFragment, layoutItem.getSubMenu()); - setUpSortOrderMenu(currentFragment, menu.findItem(R.id.action_sort_order).getSubMenu()); - } else { - menu.removeItem(R.id.action_layout_type); - menu.removeItem(R.id.action_grid_size); - menu.removeItem(R.id.action_sort_order); - } - menu.add(0, R.id.action_settings, 6, getString(R.string.action_settings)) - .setIcon(R.drawable.ic_settings_white_24dp) - .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); - menu.add(0, R.id.action_search, 0, getString(R.string.action_search)) - .setIcon(R.drawable.ic_search_white_24dp) - .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(@NonNull final MenuItem item) { - Fragment fragment = getCurrentFragment(); - if (fragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment) { - AbsLibraryPagerRecyclerViewCustomGridSizeFragment currentFragment - = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) fragment; - if (handleGridSizeMenuItem(currentFragment, item)) { - return true; - } - if (handleLayoutResType(currentFragment, item)) { - return true; - } - if (handleSortOrderMenuItem(currentFragment, item)) { - return true; - } - } - int id = item.getItemId(); - switch (id) { - case R.id.action_search: - NavigationUtil.goToSearch(this); - break; - case R.id.action_new_playlist: - CreatePlaylistDialog.create().show(getSupportFragmentManager(), "CREATE_PLAYLIST"); - return true; - case R.id.action_mic: - ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mToolbar, - getString(R.string.transition_toolbar)); - NavigationUtil.goToSearch(this, true, options); - return true; - case R.id.action_settings: - NavigationUtil.goToSettings(this); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public boolean onPrepareOptionsMenu(final Menu menu) { - ToolbarContentTintHelper.handleOnPrepareOptionsMenu(this, mToolbar); - return super.onPrepareOptionsMenu(menu); - } - - @Override - public void onServiceConnected() { - super.onServiceConnected(); - handlePlaybackIntent(getIntent()); - } - - @Override - public void onSharedPreferenceChanged(final @NonNull SharedPreferences sharedPreferences, - final @NonNull String key) { - if (key.equals(PreferenceUtil.GENERAL_THEME) || key.equals(PreferenceUtil.BLACK_THEME) || - key.equals(PreferenceUtil.ADAPTIVE_COLOR_APP) || - key.equals(PreferenceUtil.USER_NAME) || key.equals(PreferenceUtil.TOGGLE_FULL_SCREEN) || - key.equals(PreferenceUtil.TOGGLE_VOLUME) || key.equals(PreferenceUtil.ROUND_CORNERS) || - key.equals(PreferenceUtil.CAROUSEL_EFFECT) || key.equals(PreferenceUtil.NOW_PLAYING_SCREEN_ID) || - key.equals(PreferenceUtil.TOGGLE_GENRE) || key.equals(PreferenceUtil.BANNER_IMAGE_PATH) || - key.equals(PreferenceUtil.PROFILE_IMAGE_PATH) || key.equals(PreferenceUtil.CIRCULAR_ALBUM_ART) || - key.equals(PreferenceUtil.KEEP_SCREEN_ON) || key.equals(PreferenceUtil.TOGGLE_SEPARATE_LINE) || - key.equals(PreferenceUtil.TOGGLE_HOME_BANNER) || key.equals(PreferenceUtil.TOGGLE_ADD_CONTROLS) || - key.equals(PreferenceUtil.ALBUM_COVER_STYLE) || key.equals(PreferenceUtil.HOME_ARTIST_GRID_STYLE) || - key.equals(PreferenceUtil.ALBUM_COVER_TRANSFORM) || key.equals(PreferenceUtil.DESATURATED_COLOR) || - key.equals(PreferenceUtil.EXTRA_SONG_INFO) || key.equals(PreferenceUtil.TAB_TEXT_MODE) || - key.equals(PreferenceUtil.LANGUAGE_NAME) || key.equals(PreferenceUtil.LIBRARY_CATEGORIES) - ) { - postRecreate(); - } - } - - @NotNull - @Override - public MaterialCab openCab(final int menuRes, @NotNull final Callback callback) { - if (cab != null && cab.isActive()) { - cab.finish(); - } - cab = new MaterialCab(this, R.id.cab_stub) - .setMenu(menuRes) - .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor( - RetroColorUtil.shiftBackgroundColorForLightText( - ATHUtil.INSTANCE.resolveColor(this, R.attr.colorSurface))) - .start(callback); - return cab; - } - - public void removeOnAppBarOffsetChangedListener( - @NonNull AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { - mAppBarLayout.removeOnOffsetChangedListener(onOffsetChangedListener); - } - - public void setCurrentFragment(@NonNull Fragment fragment, @NonNull String tag) { - String currentTag = null; - if (getSupportFragmentManager().findFragmentByTag(tag) != null) { - currentTag = getSupportFragmentManager().findFragmentByTag(tag).getTag(); - } - - if (!tag.equals(currentTag)) { - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.fragment_container, fragment, tag) - .commit(); - currentFragment = (MainActivityFragmentCallbacks) fragment; - } - } - - @NotNull - @Override - protected View createContentView() { - return wrapSlidingMusicPanel(R.layout.activity_main_content); - } - - @Override - protected void requestPermissions() { - if (!blockRequestPermissions) { - super.requestPermissions(); - } - } - - private void checkShowChangelog() { - try { - final PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); - final int currentVersion = pInfo.versionCode; - if (currentVersion != PreferenceUtil.getInstance(this).getLastChangelogVersion()) { - startActivityForResult(new Intent(this, WhatsNewActivity.class), APP_INTRO_REQUEST); - } - } catch (NameNotFoundException e) { - e.printStackTrace(); - } - } - - @Nullable - private Fragment getCurrentFragment() { - return getSupportFragmentManager().findFragmentById(R.id.fragment_container); - } - - private boolean handleGridSizeMenuItem( - @NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment, - @NonNull MenuItem item) { - int gridSize = 0; - switch (item.getItemId()) { - case R.id.action_grid_size_1: - gridSize = 1; - break; - case R.id.action_grid_size_2: - gridSize = 2; - break; - case R.id.action_grid_size_3: - gridSize = 3; - break; - case R.id.action_grid_size_4: - gridSize = 4; - break; - case R.id.action_grid_size_5: - gridSize = 5; - break; - case R.id.action_grid_size_6: - gridSize = 6; - break; - case R.id.action_grid_size_7: - gridSize = 7; - break; - case R.id.action_grid_size_8: - gridSize = 8; - break; - } - - if (gridSize > 0) { - item.setChecked(true); - fragment.setAndSaveGridSize(gridSize); - return true; - } - return false; - } - - private boolean handleLayoutResType( - final AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment, - final MenuItem item) { - int layoutRes = -1; - switch (item.getItemId()) { - case R.id.action_layout_normal: - layoutRes = R.layout.item_grid; - break; - case R.id.action_layout_card: - layoutRes = R.layout.item_card; - break; - case R.id.action_layout_colored_card: - layoutRes = R.layout.item_card_color; - break; - case R.id.action_layout_circular: - layoutRes = R.layout.item_grid_circle; - break; - case R.id.action_layout_image: - layoutRes = R.layout.image; - break; - case R.id.action_layout_gradient_image: - layoutRes = R.layout.item_image_gradient; - break; - } - Log.i(TAG, "handleLayoutResType: " + layoutRes); - - if (layoutRes != -1) { - item.setChecked(true); - fragment.setAndSaveLayoutRes(layoutRes); - return true; - } - - return false; - } - - private void handlePlaybackIntent(@Nullable Intent intent) { - if (intent == null) { - return; - } - - Uri uri = intent.getData(); - String mimeType = intent.getType(); - boolean handled = false; - - if (intent.getAction() != null && intent.getAction() - .equals(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH)) { - final List songs = SearchQueryHelper.getSongs(this, intent.getExtras()); - if (MusicPlayerRemote.getShuffleMode() == MusicService.SHUFFLE_MODE_SHUFFLE) { - MusicPlayerRemote.openAndShuffleQueue(songs, true); - } else { - MusicPlayerRemote.openQueue(songs, 0, true); - } - handled = true; - } - - if (uri != null && uri.toString().length() > 0) { - MusicPlayerRemote.playFromUri(uri); - handled = true; - } else if (MediaStore.Audio.Playlists.CONTENT_TYPE.equals(mimeType)) { - final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist"); - if (id >= 0) { - int position = intent.getIntExtra("position", 0); - List songs = new ArrayList<>(PlaylistSongsLoader.getPlaylistSongList(this, id)); - MusicPlayerRemote.openQueue(songs, position, true); - handled = true; - } - } else if (MediaStore.Audio.Albums.CONTENT_TYPE.equals(mimeType)) { - final int id = (int) parseIdFromIntent(intent, "albumId", "album"); - if (id >= 0) { - int position = intent.getIntExtra("position", 0); - MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).getSongs(), position, true); - handled = true; - } - } else if (MediaStore.Audio.Artists.CONTENT_TYPE.equals(mimeType)) { - final int id = (int) parseIdFromIntent(intent, "artistId", "artist"); - if (id >= 0) { - int position = intent.getIntExtra("position", 0); - MusicPlayerRemote.openQueue(ArtistLoader.getArtist(this, id).getSongs(), position, true); - handled = true; - } - } - if (handled) { - setIntent(new Intent()); - } - } - - private boolean handleSortOrderMenuItem( - @NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment - fragment, @NonNull MenuItem item) { - String sortOrder = null; - if (fragment instanceof AlbumsFragment) { - switch (item.getItemId()) { - case R.id.action_album_sort_order_asc: - sortOrder = AlbumSortOrder.ALBUM_A_Z; - break; - case R.id.action_album_sort_order_desc: - sortOrder = AlbumSortOrder.ALBUM_Z_A; - break; - case R.id.action_album_sort_order_artist: - sortOrder = AlbumSortOrder.ALBUM_ARTIST; - break; - case R.id.action_album_sort_order_year: - sortOrder = AlbumSortOrder.ALBUM_YEAR; - break; - } - } else if (fragment instanceof ArtistsFragment) { - switch (item.getItemId()) { - case R.id.action_artist_sort_order_asc: - sortOrder = ArtistSortOrder.ARTIST_A_Z; - break; - case R.id.action_artist_sort_order_desc: - sortOrder = ArtistSortOrder.ARTIST_Z_A; - break; - } - } else if (fragment instanceof SongsFragment) { - switch (item.getItemId()) { - case R.id.action_song_sort_order_asc: - sortOrder = SongSortOrder.SONG_A_Z; - break; - case R.id.action_song_sort_order_desc: - sortOrder = SongSortOrder.SONG_Z_A; - break; - case R.id.action_song_sort_order_artist: - sortOrder = SongSortOrder.SONG_ARTIST; - break; - case R.id.action_song_sort_order_album: - sortOrder = SongSortOrder.SONG_ALBUM; - break; - case R.id.action_song_sort_order_year: - sortOrder = SongSortOrder.SONG_YEAR; - break; - case R.id.action_song_sort_order_date: - sortOrder = SongSortOrder.SONG_DATE; - break; - case R.id.action_song_sort_order_composer: - sortOrder = SongSortOrder.COMPOSER; - break; - case R.id.action_song_sort_order_date_modified: - sortOrder = SongSortOrder.SONG_DATE_MODIFIED; - break; - } - } - - if (sortOrder != null) { - item.setChecked(true); - fragment.setAndSaveSortOrder(sortOrder); - return true; - } - - return false; - } - - private boolean isFolderPage() { - return getSupportFragmentManager().findFragmentByTag(FoldersFragment.TAG) instanceof FoldersFragment; - } - - private boolean isHomePage() { - return getSupportFragmentManager().findFragmentByTag(BannerHomeFragment.TAG) instanceof BannerHomeFragment; - } - - private boolean isPlaylistPage() { - return getSupportFragmentManager().findFragmentByTag(PlaylistsFragment.TAG) instanceof PlaylistsFragment; - } - - private long parseIdFromIntent(@NonNull Intent intent, String longKey, - String stringKey) { - long id = intent.getLongExtra(longKey, -1); - if (id < 0) { - String idString = intent.getStringExtra(stringKey); - if (idString != null) { - try { - id = Long.parseLong(idString); - } catch (NumberFormatException e) { - Log.e(TAG, e.getMessage()); - } - } - } - return id; - } - - private void restoreCurrentFragment() { - currentFragment = (MainActivityFragmentCallbacks) getSupportFragmentManager() - .findFragmentById(R.id.fragment_container); - } - - private void selectedFragment(final int itemId) { - switch (itemId) { - case R.id.action_album: - setCurrentFragment(AlbumsFragment.newInstance(), AlbumsFragment.TAG); - break; - case R.id.action_artist: - setCurrentFragment(ArtistsFragment.newInstance(), ArtistsFragment.TAG); - break; - case R.id.action_playlist: - setCurrentFragment(PlaylistsFragment.newInstance(), PlaylistsFragment.TAG); - break; - case R.id.action_genre: - setCurrentFragment(GenresFragment.newInstance(), GenresFragment.TAG); - break; - case R.id.action_playing_queue: - setCurrentFragment(PlayingQueueFragment.newInstance(), PlayingQueueFragment.TAG); - break; - case R.id.action_song: - setCurrentFragment(SongsFragment.newInstance(), SongsFragment.TAG); - break; - case R.id.action_folder: - setCurrentFragment(FoldersFragment.newInstance(this), FoldersFragment.TAG); - break; - default: - case R.id.action_home: - setCurrentFragment(BannerHomeFragment.newInstance(), BannerHomeFragment.TAG); - break; - } - } - - - private void setUpGridSizeMenu(@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment, - @NonNull SubMenu gridSizeMenu) { - - switch (fragment.getGridSize()) { - case 1: - gridSizeMenu.findItem(R.id.action_grid_size_1).setChecked(true); - break; - case 2: - gridSizeMenu.findItem(R.id.action_grid_size_2).setChecked(true); - break; - case 3: - gridSizeMenu.findItem(R.id.action_grid_size_3).setChecked(true); - break; - case 4: - gridSizeMenu.findItem(R.id.action_grid_size_4).setChecked(true); - break; - case 5: - gridSizeMenu.findItem(R.id.action_grid_size_5).setChecked(true); - break; - case 6: - gridSizeMenu.findItem(R.id.action_grid_size_6).setChecked(true); - break; - case 7: - gridSizeMenu.findItem(R.id.action_grid_size_7).setChecked(true); - break; - case 8: - gridSizeMenu.findItem(R.id.action_grid_size_8).setChecked(true); - break; - } - int maxGridSize = fragment.getMaxGridSize(); - if (maxGridSize < 8) { - gridSizeMenu.findItem(R.id.action_grid_size_8).setVisible(false); - } - if (maxGridSize < 7) { - gridSizeMenu.findItem(R.id.action_grid_size_7).setVisible(false); - } - if (maxGridSize < 6) { - gridSizeMenu.findItem(R.id.action_grid_size_6).setVisible(false); - } - if (maxGridSize < 5) { - gridSizeMenu.findItem(R.id.action_grid_size_5).setVisible(false); - } - if (maxGridSize < 4) { - gridSizeMenu.findItem(R.id.action_grid_size_4).setVisible(false); - } - if (maxGridSize < 3) { - gridSizeMenu.findItem(R.id.action_grid_size_3).setVisible(false); - } - } - - private void setUpSortOrderMenu( - @NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment, - @NonNull SubMenu sortOrderMenu) { - String currentSortOrder = fragment.getSortOrder(); - sortOrderMenu.clear(); - - if (fragment instanceof AlbumsFragment) { - sortOrderMenu.add(0, R.id.action_album_sort_order_asc, 0, R.string.sort_order_a_z) - .setChecked(currentSortOrder.equals(AlbumSortOrder.ALBUM_A_Z)); - sortOrderMenu.add(0, R.id.action_album_sort_order_desc, 1, R.string.sort_order_z_a) - .setChecked(currentSortOrder.equals(AlbumSortOrder.ALBUM_Z_A)); - sortOrderMenu.add(0, R.id.action_album_sort_order_artist, 2, R.string.sort_order_artist) - .setChecked(currentSortOrder.equals(AlbumSortOrder.ALBUM_ARTIST)); - sortOrderMenu.add(0, R.id.action_album_sort_order_year, 3, R.string.sort_order_year) - .setChecked(currentSortOrder.equals(AlbumSortOrder.ALBUM_YEAR)); - } else if (fragment instanceof ArtistsFragment) { - sortOrderMenu.add(0, R.id.action_artist_sort_order_asc, 0, R.string.sort_order_a_z) - .setChecked(currentSortOrder.equals(ArtistSortOrder.ARTIST_A_Z)); - sortOrderMenu.add(0, R.id.action_artist_sort_order_desc, 1, R.string.sort_order_z_a) - .setChecked(currentSortOrder.equals(ArtistSortOrder.ARTIST_Z_A)); - } else if (fragment instanceof SongsFragment) { - sortOrderMenu.add(0, R.id.action_song_sort_order_asc, 0, R.string.sort_order_a_z) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_A_Z)); - sortOrderMenu.add(0, R.id.action_song_sort_order_desc, 1, R.string.sort_order_z_a) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_Z_A)); - sortOrderMenu.add(0, R.id.action_song_sort_order_artist, 2, R.string.sort_order_artist) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_ARTIST)); - sortOrderMenu.add(0, R.id.action_song_sort_order_album, 3, R.string.sort_order_album) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_ALBUM)); - sortOrderMenu.add(0, R.id.action_song_sort_order_year, 4, R.string.sort_order_year) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_YEAR)); - sortOrderMenu.add(0, R.id.action_song_sort_order_date, 5, R.string.sort_order_date) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_DATE)); - sortOrderMenu.add(0, R.id.action_song_sort_order_date_modified, 6, R.string.sort_order_date_modified) - .setChecked(currentSortOrder.equals(SongSortOrder.SONG_DATE_MODIFIED)); - sortOrderMenu.add(0, R.id.action_song_sort_order_composer, 7, R.string.sort_order_composer) - .setChecked(currentSortOrder.equals(SongSortOrder.COMPOSER)); - } - sortOrderMenu.setGroupCheckable(0, true, true); - } - - private void setupLayoutMenu( - @NonNull final AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment, - @NonNull final SubMenu subMenu) { - switch (fragment.itemLayoutRes()) { - case R.layout.item_card: - subMenu.findItem(R.id.action_layout_card).setChecked(true); - break; - case R.layout.item_card_color: - subMenu.findItem(R.id.action_layout_colored_card).setChecked(true); - break; - case R.layout.item_grid_circle: - subMenu.findItem(R.id.action_layout_circular).setChecked(true); - break; - case R.layout.image: - subMenu.findItem(R.id.action_layout_image).setChecked(true); - break; - case R.layout.item_image_gradient: - subMenu.findItem(R.id.action_layout_gradient_image).setChecked(true); - break; - default: - case R.layout.item_grid: - subMenu.findItem(R.id.action_layout_normal).setChecked(true); - break; - } - } - - private void setupToolbar() { - setTitle(null); - mToolbar.setBackgroundColor(ATHUtil.INSTANCE.resolveColor(this, R.attr.colorSurface)); - mAppBarLayout.setBackgroundColor(ATHUtil.INSTANCE.resolveColor(this, R.attr.colorSurface)); - setSupportActionBar(mToolbar); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt new file mode 100644 index 000000000..c0c9f71a1 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -0,0 +1,780 @@ +package code.name.monkey.retromusic.activities + +import android.app.ActivityOptions +import android.content.* +import android.content.IntentSender.SendIntentException +import android.os.Bundle +import android.provider.MediaStore +import android.util.Log +import android.view.Menu +import android.view.MenuItem +import android.view.SubMenu +import android.view.View +import androidx.core.app.ActivityCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.commit +import androidx.lifecycle.ViewModelProvider +import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor +import code.name.monkey.appthemehelper.util.ATHUtil +import code.name.monkey.appthemehelper.util.ATHUtil.resolveColor +import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity +import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog.Companion.create +import code.name.monkey.retromusic.fragments.LibraryViewModel +import code.name.monkey.retromusic.fragments.albums.AlbumsFragment +import code.name.monkey.retromusic.fragments.artists.ArtistsFragment +import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment +import code.name.monkey.retromusic.fragments.genres.GenresFragment +import code.name.monkey.retromusic.fragments.home.BannerHomeFragment +import code.name.monkey.retromusic.fragments.mainactivity.FoldersFragment +import code.name.monkey.retromusic.fragments.playlists.PlaylistsFragment +import code.name.monkey.retromusic.fragments.queue.PlayingQueueFragment +import code.name.monkey.retromusic.fragments.songs.SongsFragment +import code.name.monkey.retromusic.helper.MusicPlayerRemote.isPlaying +import code.name.monkey.retromusic.helper.MusicPlayerRemote.openAndShuffleQueue +import code.name.monkey.retromusic.helper.MusicPlayerRemote.openQueue +import code.name.monkey.retromusic.helper.MusicPlayerRemote.playFromUri +import code.name.monkey.retromusic.helper.MusicPlayerRemote.shuffleMode +import code.name.monkey.retromusic.helper.SearchQueryHelper.getSongs +import code.name.monkey.retromusic.helper.SortOrder.* +import code.name.monkey.retromusic.interfaces.CabHolder +import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks +import code.name.monkey.retromusic.loaders.AlbumLoader.getAlbum +import code.name.monkey.retromusic.loaders.ArtistLoader.getArtist +import code.name.monkey.retromusic.loaders.PlaylistSongsLoader.getPlaylistSongList +import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.service.MusicService +import code.name.monkey.retromusic.util.AppRater.appLaunched +import code.name.monkey.retromusic.util.NavigationUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT +import code.name.monkey.retromusic.util.RetroColorUtil +import code.name.monkey.retromusic.util.RetroUtil +import com.afollestad.materialcab.MaterialCab +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.snackbar.Snackbar +import com.google.android.play.core.appupdate.AppUpdateInfo +import com.google.android.play.core.appupdate.AppUpdateManager +import com.google.android.play.core.appupdate.AppUpdateManagerFactory +import com.google.android.play.core.install.InstallState +import com.google.android.play.core.install.InstallStateUpdatedListener +import com.google.android.play.core.install.model.AppUpdateType +import com.google.android.play.core.install.model.InstallStatus +import com.google.android.play.core.install.model.InstallStatus.* +import com.google.android.play.core.install.model.UpdateAvailability +import com.google.android.play.core.tasks.Task +import kotlinx.android.synthetic.main.activity_main_content.* +import java.math.BigInteger +import java.util.* + +class MainActivity : AbsSlidingMusicPanelActivity(), + SharedPreferences.OnSharedPreferenceChangeListener, CabHolder { + companion object { + const val TAG = "MainActivity" + const val EXPAND_PANEL = "expand_panel" + const val APP_UPDATE_REQUEST_CODE = 9002 + } + + lateinit var libraryViewModel: LibraryViewModel + private var cab: MaterialCab? = null + private val intentFilter = IntentFilter(Intent.ACTION_SCREEN_OFF) + private lateinit var currentFragment: MainActivityFragmentCallbacks + private var appUpdateManager: AppUpdateManager? = null + private var blockRequestPermissions = false + private val listener = object : InstallStateUpdatedListener { + override fun onStateUpdate(state: InstallState) { + when { + state.installStatus() == DOWNLOADED -> { + popupSnackBarForCompleteUpdate() + } + state.installStatus() == INSTALLED -> { + appUpdateManager?.unregisterListener(this) + } + else -> { + Log.i(TAG, "InstallStateUpdatedListener: state: " + state.installStatus()) + } + } + } + } + private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val action = intent.action + if (action != null && action == Intent.ACTION_SCREEN_OFF) { + if (PreferenceUtilKT.isLockScreen && isPlaying) { + val activity = Intent(context, LockScreenActivity::class.java) + activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + ActivityCompat.startActivity(context, activity, null) + } + } + } + } + + override fun createContentView(): View { + return wrapSlidingMusicPanel(R.layout.activity_main_content) + } + + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + setStatusbarColorAuto() + setNavigationbarColorAuto() + setLightNavigationBar(true) + setTaskDescriptionColorAuto() + hideStatusBar() + setBottomBarVisibility(View.VISIBLE) + + libraryViewModel = ViewModelProvider(this).get(LibraryViewModel::class.java) + addMusicServiceEventListener(libraryViewModel) + + if (savedInstanceState == null) { + selectedFragment(PreferenceUtilKT.lastPage) + } else { + restoreCurrentFragment() + } + + appLaunched(this) + setupToolbar() + checkUpdate() + getBottomNavigationView().selectedItemId = PreferenceUtilKT.lastPage + getBottomNavigationView().setOnNavigationItemSelectedListener { + PreferenceUtilKT.lastPage = it.itemId + selectedFragment(it.itemId) + true + } + updateTabs() + } + + override fun onResume() { + super.onResume() + registerReceiver(broadcastReceiver, intentFilter) + PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this) + if (intent.hasExtra(EXPAND_PANEL) && + intent.getBooleanExtra(EXPAND_PANEL, false) && + PreferenceUtilKT.isExpandPanel + ) { + expandPanel() + intent.removeExtra(EXPAND_PANEL) + } + + appUpdateManager?.appUpdateInfo + ?.addOnSuccessListener { appUpdateInfo: AppUpdateInfo -> + if (appUpdateInfo.installStatus() == DOWNLOADED) { + popupSnackBarForCompleteUpdate() + } + try { + if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { + appUpdateManager!!.startUpdateFlowForResult( + appUpdateInfo, + AppUpdateType.IMMEDIATE, + this, + APP_UPDATE_REQUEST_CODE + ) + } + } catch (e: SendIntentException) { + e.printStackTrace() + } + } + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver(broadcastReceiver) + PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this) + } + + override fun onPrepareOptionsMenu(menu: Menu?): Boolean { + ToolbarContentTintHelper.handleOnPrepareOptionsMenu(this, toolbar) + return super.onPrepareOptionsMenu(menu) + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.menu_main, menu) + menu ?: return super.onCreateOptionsMenu(menu) + if (isPlaylistPage()) { + menu.add(0, R.id.action_new_playlist, 1, R.string.new_playlist_title) + .setIcon(R.drawable.ic_playlist_add_white_24dp) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + } + if (isHomePage()) { + menu.add(0, R.id.action_mic, 1, getString(R.string.action_search)) + .setIcon(R.drawable.ic_mic_white_24dp) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) + } + if (isFolderPage()) { + menu.add(0, R.id.action_scan, 0, R.string.scan_media) + .setIcon(R.drawable.ic_scanner_white_24dp) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) + menu.add(0, R.id.action_go_to_start_directory, 1, R.string.action_go_to_start_directory) + .setIcon(R.drawable.ic_bookmark_music_white_24dp) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) + } + val fragment: Fragment? = getCurrentFragment() + if (fragment != null && fragment is AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>) { + val gridSizeItem: MenuItem = menu.findItem(R.id.action_grid_size) + if (RetroUtil.isLandscape()) { + gridSizeItem.setTitle(R.string.action_grid_size_land) + } + setUpGridSizeMenu(fragment, gridSizeItem.subMenu) + setupLayoutMenu(fragment, menu.findItem(R.id.action_layout_type).subMenu) + setUpSortOrderMenu(fragment, menu.findItem(R.id.action_sort_order).subMenu) + } else { + menu.removeItem(R.id.action_layout_type) + menu.removeItem(R.id.action_grid_size) + menu.removeItem(R.id.action_sort_order) + } + menu.add(0, R.id.action_settings, 6, getString(R.string.action_settings)) + .setIcon(R.drawable.ic_settings_white_24dp) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) + menu.add(0, R.id.action_search, 0, getString(R.string.action_search)) + .setIcon(R.drawable.ic_search_white_24dp) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + val fragment = getCurrentFragment() + if (fragment is AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>) { + if (handleGridSizeMenuItem(fragment, item)) { + return true + } + if (handleLayoutResType(fragment, item)) { + return true + } + if (handleSortOrderMenuItem(fragment, item)) { + return true + } + } + when (item.itemId) { + R.id.action_search -> NavigationUtil.goToSearch(this) + R.id.action_new_playlist -> { + create().show(supportFragmentManager, "CREATE_PLAYLIST") + return true + } + R.id.action_mic -> { + val options = ActivityOptions.makeSceneTransitionAnimation( + this, toolbar, + getString(R.string.transition_toolbar) + ) + NavigationUtil.goToSearch(this, true, options) + return true + } + R.id.action_settings -> { + NavigationUtil.goToSettings(this) + return true + } + } + return super.onOptionsItemSelected(item) + } + + private fun handleSortOrderMenuItem( + fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, + item: MenuItem + ): Boolean { + var sortOrder: String? = null + when (fragment) { + is AlbumsFragment -> { + when (item.itemId) { + R.id.action_album_sort_order_asc -> sortOrder = AlbumSortOrder.ALBUM_A_Z + R.id.action_album_sort_order_desc -> sortOrder = AlbumSortOrder.ALBUM_Z_A + R.id.action_album_sort_order_artist -> sortOrder = AlbumSortOrder.ALBUM_ARTIST + R.id.action_album_sort_order_year -> sortOrder = AlbumSortOrder.ALBUM_YEAR + } + } + is ArtistsFragment -> { + when (item.itemId) { + R.id.action_artist_sort_order_asc -> sortOrder = ArtistSortOrder.ARTIST_A_Z + R.id.action_artist_sort_order_desc -> sortOrder = ArtistSortOrder.ARTIST_Z_A + } + } + is SongsFragment -> { + when (item.itemId) { + R.id.action_song_sort_order_asc -> sortOrder = SongSortOrder.SONG_A_Z + R.id.action_song_sort_order_desc -> sortOrder = SongSortOrder.SONG_Z_A + R.id.action_song_sort_order_artist -> sortOrder = SongSortOrder.SONG_ARTIST + R.id.action_song_sort_order_album -> sortOrder = SongSortOrder.SONG_ALBUM + R.id.action_song_sort_order_year -> sortOrder = SongSortOrder.SONG_YEAR + R.id.action_song_sort_order_date -> sortOrder = SongSortOrder.SONG_DATE + R.id.action_song_sort_order_composer -> sortOrder = SongSortOrder.COMPOSER + R.id.action_song_sort_order_date_modified -> + sortOrder = SongSortOrder.SONG_DATE_MODIFIED + } + } + } + + if (sortOrder != null) { + item.isChecked = true + fragment.setAndSaveSortOrder(sortOrder) + return true + } + + return false + } + + private fun handleLayoutResType( + fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, + item: MenuItem + ): Boolean { + var layoutRes = -1 + when (item.itemId) { + R.id.action_layout_normal -> layoutRes = R.layout.item_grid + R.id.action_layout_card -> layoutRes = R.layout.item_card + R.id.action_layout_colored_card -> layoutRes = R.layout.item_card_color + R.id.action_layout_circular -> layoutRes = R.layout.item_grid_circle + R.id.action_layout_image -> layoutRes = R.layout.image + R.id.action_layout_gradient_image -> layoutRes = R.layout.item_image_gradient + } + if (layoutRes != -1) { + item.isChecked = true + fragment.setAndSaveLayoutRes(layoutRes) + return true + } + return false + } + + private fun handleGridSizeMenuItem( + fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, + item: MenuItem + ): Boolean { + var gridSize = 0 + when (item.itemId) { + R.id.action_grid_size_1 -> gridSize = 1 + R.id.action_grid_size_2 -> gridSize = 2 + R.id.action_grid_size_3 -> gridSize = 3 + R.id.action_grid_size_4 -> gridSize = 4 + R.id.action_grid_size_5 -> gridSize = 5 + R.id.action_grid_size_6 -> gridSize = 6 + R.id.action_grid_size_7 -> gridSize = 7 + R.id.action_grid_size_8 -> gridSize = 8 + } + if (gridSize > 0) { + item.isChecked = true + fragment.setAndSaveGridSize(gridSize) + return true + } + return false + } + + private fun setUpGridSizeMenu( + fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, + gridSizeMenu: SubMenu + ) { + when (fragment.getGridSize()) { + 1 -> gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = true + 2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true + 3 -> gridSizeMenu.findItem(R.id.action_grid_size_3).isChecked = true + 4 -> gridSizeMenu.findItem(R.id.action_grid_size_4).isChecked = true + 5 -> gridSizeMenu.findItem(R.id.action_grid_size_5).isChecked = true + 6 -> gridSizeMenu.findItem(R.id.action_grid_size_6).isChecked = true + 7 -> gridSizeMenu.findItem(R.id.action_grid_size_7).isChecked = true + 8 -> gridSizeMenu.findItem(R.id.action_grid_size_8).isChecked = true + } + val maxGridSize = fragment.maxGridSize + if (maxGridSize < 8) { + gridSizeMenu.findItem(R.id.action_grid_size_8).isVisible = false + } + if (maxGridSize < 7) { + gridSizeMenu.findItem(R.id.action_grid_size_7).isVisible = false + } + if (maxGridSize < 6) { + gridSizeMenu.findItem(R.id.action_grid_size_6).isVisible = false + } + if (maxGridSize < 5) { + gridSizeMenu.findItem(R.id.action_grid_size_5).isVisible = false + } + if (maxGridSize < 4) { + gridSizeMenu.findItem(R.id.action_grid_size_4).isVisible = false + } + if (maxGridSize < 3) { + gridSizeMenu.findItem(R.id.action_grid_size_3).isVisible = false + } + } + + private fun setupLayoutMenu( + fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, + subMenu: SubMenu + ) { + when (fragment.itemLayoutRes()) { + R.layout.item_card -> + subMenu.findItem(R.id.action_layout_card).isChecked = true + R.layout.item_card_color -> + subMenu.findItem(R.id.action_layout_colored_card).isChecked = true + R.layout.item_grid_circle -> + subMenu.findItem(R.id.action_layout_circular).isChecked = true + R.layout.image -> + subMenu.findItem(R.id.action_layout_image).isChecked = true + R.layout.item_image_gradient -> + subMenu.findItem(R.id.action_layout_gradient_image).isChecked = true + R.layout.item_grid -> + subMenu.findItem(R.id.action_layout_normal).isChecked = true + else -> + subMenu.findItem(R.id.action_layout_normal).isChecked = true + } + } + + private fun setUpSortOrderMenu( + fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, + sortOrderMenu: SubMenu + ) { + val currentSortOrder = fragment.getSortOrder() + sortOrderMenu.clear() + when (fragment) { + is AlbumsFragment -> { + sortOrderMenu.add( + 0, + R.id.action_album_sort_order_asc, + 0, + R.string.sort_order_a_z + ).isChecked = currentSortOrder == AlbumSortOrder.ALBUM_A_Z + sortOrderMenu.add( + 0, + R.id.action_album_sort_order_desc, + 1, + R.string.sort_order_z_a + ).isChecked = + currentSortOrder == AlbumSortOrder.ALBUM_Z_A + sortOrderMenu.add( + 0, + R.id.action_album_sort_order_artist, + 2, + R.string.sort_order_artist + ).isChecked = + currentSortOrder == AlbumSortOrder.ALBUM_ARTIST + sortOrderMenu.add( + 0, + R.id.action_album_sort_order_year, + 3, + R.string.sort_order_year + ).isChecked = + currentSortOrder == AlbumSortOrder.ALBUM_YEAR + } + is ArtistsFragment -> { + sortOrderMenu.add( + 0, + R.id.action_artist_sort_order_asc, + 0, + R.string.sort_order_a_z + ).isChecked = + currentSortOrder == ArtistSortOrder.ARTIST_A_Z + sortOrderMenu.add( + 0, + R.id.action_artist_sort_order_desc, + 1, + R.string.sort_order_z_a + ).isChecked = + currentSortOrder == ArtistSortOrder.ARTIST_Z_A + } + is SongsFragment -> { + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_asc, + 0, + R.string.sort_order_a_z + ).isChecked = + currentSortOrder == SongSortOrder.SONG_A_Z + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_desc, + 1, + R.string.sort_order_z_a + ).isChecked = + currentSortOrder == SongSortOrder.SONG_Z_A + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_artist, + 2, + R.string.sort_order_artist + ).isChecked = + currentSortOrder == SongSortOrder.SONG_ARTIST + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_album, + 3, + R.string.sort_order_album + ).isChecked = + currentSortOrder == SongSortOrder.SONG_ALBUM + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_year, + 4, + R.string.sort_order_year + ).isChecked = + currentSortOrder == SongSortOrder.SONG_YEAR + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_date, + 5, + R.string.sort_order_date + ).isChecked = + currentSortOrder == SongSortOrder.SONG_DATE + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_date_modified, + 6, + R.string.sort_order_date_modified + ).isChecked = currentSortOrder == SongSortOrder.SONG_DATE_MODIFIED + sortOrderMenu.add( + 0, + R.id.action_song_sort_order_composer, + 7, + R.string.sort_order_composer + ).isChecked = currentSortOrder == SongSortOrder.COMPOSER + } + } + sortOrderMenu.setGroupCheckable(0, true, true) + } + + private fun getCurrentFragment(): Fragment? { + return supportFragmentManager.findFragmentById(R.id.fragment_container) + } + + private fun isFolderPage(): Boolean { + return supportFragmentManager.findFragmentByTag(FoldersFragment.TAG) is FoldersFragment + } + + private fun isHomePage(): Boolean { + return supportFragmentManager.findFragmentByTag(BannerHomeFragment.TAG) is BannerHomeFragment + } + + private fun isPlaylistPage(): Boolean { + return supportFragmentManager.findFragmentByTag(PlaylistsFragment.TAG) is PlaylistsFragment + } + + fun addOnAppBarOffsetChangedListener( + changedListener: AppBarLayout.OnOffsetChangedListener + ) { + appBarLayout.addOnOffsetChangedListener(changedListener) + } + + fun removeOnAppBarOffsetChangedListener( + changedListener: AppBarLayout.OnOffsetChangedListener + ) { + appBarLayout.removeOnOffsetChangedListener(changedListener) + } + + fun getTotalAppBarScrollingRange(): Int { + return appBarLayout.totalScrollRange + } + + override fun requestPermissions() { + if (!blockRequestPermissions) { + super.requestPermissions() + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (!hasPermissions()) { + requestPermissions() + } + } + + private fun setupToolbar() { + toolbar.setBackgroundColor(resolveColor(this, R.attr.colorSurface)) + appBarLayout.setBackgroundColor(resolveColor(this, R.attr.colorSurface)) + setSupportActionBar(toolbar) + } + + private fun checkUpdate() { + appUpdateManager = AppUpdateManagerFactory.create(this) + appUpdateManager?.registerListener(listener) + + val appUpdateInfoTask: Task? = appUpdateManager?.appUpdateInfo + appUpdateInfoTask?.addOnSuccessListener { appUpdateInfo -> + if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE + && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) + ) { + try { + appUpdateManager?.startUpdateFlowForResult( + appUpdateInfo, + AppUpdateType.IMMEDIATE, + this, + APP_UPDATE_REQUEST_CODE + ) + } catch (e: SendIntentException) { + e.printStackTrace() + } + } + } + } + + private fun popupSnackBarForCompleteUpdate() { + val snackBar = + Snackbar.make( + findViewById(R.id.mainContent), + "New app is ready!", + Snackbar.LENGTH_INDEFINITE + ) + snackBar.setAction( + "Install" + ) { + appUpdateManager?.completeUpdate() + } + snackBar.setActionTextColor(accentColor(this)) + snackBar.show() + } + + private fun setCurrentFragment( + fragment: Fragment, + tag: String + ) { + supportFragmentManager.commit { + replace(R.id.fragment_container, fragment, tag) + } + } + + private fun selectedFragment(itemId: Int) { + when (itemId) { + R.id.action_album -> setCurrentFragment( + AlbumsFragment.newInstance(), + AlbumsFragment.TAG + ) + R.id.action_artist -> setCurrentFragment( + ArtistsFragment.newInstance(), + ArtistsFragment.TAG + ) + R.id.action_playlist -> setCurrentFragment( + PlaylistsFragment.newInstance(), + PlaylistsFragment.TAG + ) + R.id.action_genre -> setCurrentFragment( + GenresFragment.newInstance(), + GenresFragment.TAG + ) + R.id.action_playing_queue -> setCurrentFragment( + PlayingQueueFragment.newInstance(), + PlayingQueueFragment.TAG + ) + R.id.action_song -> setCurrentFragment( + SongsFragment.newInstance(), + SongsFragment.TAG + ) + R.id.action_folder -> setCurrentFragment( + FoldersFragment.newInstance(this), + FoldersFragment.TAG + ) + R.id.action_home -> setCurrentFragment( + BannerHomeFragment.newInstance(), + BannerHomeFragment.TAG + ) + else -> setCurrentFragment( + BannerHomeFragment.newInstance(), + BannerHomeFragment.TAG + ) + } + } + + private fun restoreCurrentFragment() { + val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) + if (fragment != null) { + currentFragment = fragment as MainActivityFragmentCallbacks + } + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == GENERAL_THEME || key == BLACK_THEME || key == ADAPTIVE_COLOR_APP || key == USER_NAME || key == TOGGLE_FULL_SCREEN || key == TOGGLE_VOLUME || key == ROUND_CORNERS || key == CAROUSEL_EFFECT || key == NOW_PLAYING_SCREEN_ID || key == TOGGLE_GENRE || key == BANNER_IMAGE_PATH || key == PROFILE_IMAGE_PATH || key == CIRCULAR_ALBUM_ART || key == KEEP_SCREEN_ON || key == TOGGLE_SEPARATE_LINE || key == TOGGLE_HOME_BANNER || key == TOGGLE_ADD_CONTROLS || key == ALBUM_COVER_STYLE || key == HOME_ARTIST_GRID_STYLE || key == ALBUM_COVER_TRANSFORM || key == DESATURATED_COLOR || key == EXTRA_SONG_INFO || key == TAB_TEXT_MODE || key == LANGUAGE_NAME || key == LIBRARY_CATEGORIES + ) { + postRecreate() + } + } + + override fun onServiceConnected() { + super.onServiceConnected() + handlePlaybackIntent(intent) + } + + private fun handlePlaybackIntent(intent: Intent?) { + if (intent == null) { + return + } + val uri = intent.data + val mimeType = intent.type + var handled = false + if (intent.action != null && (intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) + ) { + val songs: List = + getSongs(this, intent.extras!!) + if (shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) { + openAndShuffleQueue(songs, true) + } else { + openQueue(songs, 0, true) + } + handled = true + } + if (uri != null && uri.toString().isNotEmpty()) { + playFromUri(uri) + handled = true + } else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "playlistId", "playlist").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + val songs: List = + ArrayList(getPlaylistSongList(this, id)) + openQueue(songs, position, true) + handled = true + } + } else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "albumId", "album").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + openQueue(getAlbum(this, id).songs!!, position, true) + handled = true + } + } else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "artistId", "artist").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + openQueue(getArtist(this, id).songs, position, true) + handled = true + } + } + if (handled) { + setIntent(Intent()) + } + } + + private fun parseIdFromIntent( + intent: Intent, longKey: String, + stringKey: String + ): Long { + var id = intent.getLongExtra(longKey, -1) + if (id < 0) { + val idString = intent.getStringExtra(stringKey) + if (idString != null) { + try { + id = idString.toLong() + } catch (e: NumberFormatException) { + Log.e(TAG, e.message) + } + } + } + return id + } + + override fun handleBackPress(): Boolean { + if (cab != null && cab!!.isActive) { + cab?.finish() + return true + } + return super.handleBackPress() || currentFragment.handleBackPress() + } + + override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab { + cab?.let { + if (it.isActive) it.finish() + } + cab = MaterialCab(this, R.id.cab_stub) + .setMenu(menuRes) + .setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText( + ATHUtil.resolveColor( + this, + R.attr.colorSurface + ) + ) + ) + .start(callback) + return cab as MaterialCab + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt index 494b6dd58..d198bd5ca 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt @@ -33,8 +33,6 @@ import kotlinx.android.synthetic.main.activity_search.* import java.util.* import javax.inject.Inject import kotlin.collections.ArrayList -import kotlin.collections.MutableList -import kotlin.collections.emptyList class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatcher, SearchView { @Inject diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt index a5502acb2..6872f1ea2 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt @@ -4,8 +4,6 @@ import android.os.Bundle import android.view.MenuItem import androidx.annotation.StringRes import androidx.fragment.app.Fragment -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.extensions.applyToolbar @@ -23,7 +21,6 @@ class SettingsActivity : AbsBaseActivity() { setStatusbarColorAuto() setNavigationbarColorAuto() setLightNavigationBar(true) - setupToolbar() if (savedInstanceState == null) { @@ -49,7 +46,6 @@ class SettingsActivity : AbsBaseActivity() { fragmentTransaction.replace(R.id.contentFrame, fragment, fragment.tag) fragmentTransaction.addToBackStack(null) fragmentTransaction.commit() - setTitle(titleName) } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt index 652e0e93a..65b97ee50 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt @@ -21,7 +21,7 @@ import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.glide.ProfileBannerGlideRequest import code.name.monkey.retromusic.glide.UserProfileGlideRequest import code.name.monkey.retromusic.util.ImageUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestListener @@ -50,7 +50,7 @@ class UserInfoActivity : AbsBaseActivity() { applyToolbar(toolbar) MaterialUtil.setTint(nameContainer, false) - name.setText(PreferenceUtil.getInstance(this).userName) + name.setText(PreferenceUtilKT.userName) userImage.setOnClickListener { pickNewPhoto() @@ -66,7 +66,7 @@ class UserInfoActivity : AbsBaseActivity() { Toast.makeText(this, "Umm name is empty", Toast.LENGTH_SHORT).show() return@setOnClickListener } - PreferenceUtil.getInstance(this).userName = nameString + PreferenceUtilKT.userName = nameString setResult(Activity.RESULT_OK) finish() } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java index 8aadbff12..0e681412c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java @@ -25,7 +25,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.activities.base.AbsBaseActivity; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; public class WhatsNewActivity extends AbsBaseActivity { @@ -38,7 +38,7 @@ public class WhatsNewActivity extends AbsBaseActivity { try { PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); int currentVersion = pInfo.versionCode; - PreferenceUtil.getInstance(context).setLastChangeLogVersion(currentVersion); + PreferenceUtilKT.INSTANCE.setLastVersion(currentVersion); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } 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 d198cff67..1afa57b44 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 @@ -137,7 +137,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() { } } hadPermissions = true - onHasPermissionsChanged(true) + onHasPermissionsChanged(true) } } 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 077cac51d..1c8692afe 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 @@ -39,7 +39,7 @@ import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.util.DensityUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.views.BottomNavigationBarTinted import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.shape.MaterialShapeDrawable @@ -117,7 +117,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), override fun onResume() { super.onResume() - if (cps != PreferenceUtil.getInstance(this).nowPlayingScreen) { + if (cps != PreferenceUtilKT.nowPlayingScreen) { postRecreate() } behavior.addBottomSheetCallback(bottomSheetCallbackList) @@ -239,8 +239,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } private fun chooseFragmentForTheme() { - cps = PreferenceUtil.getInstance(this).nowPlayingScreen - + cps = PreferenceUtilKT.nowPlayingScreen val fragment: Fragment = when (cps) { Blur -> BlurPlayerFragment() Adaptive -> AdaptiveFragment() @@ -311,7 +310,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), val isColorLight = ColorUtil.isColorLight(paletteColor) - if (PreferenceUtil.getInstance(this).adaptiveColor && (cps == Normal || cps == Flat)) { + if (PreferenceUtilKT.isAdaptiveColor && (cps == Normal || cps == Flat)) { super.setLightNavigationBar(true) super.setLightStatusbar(isColorLight) } else if (cps == Card || cps == Blur || cps == BlurCard) { @@ -375,8 +374,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), fun updateTabs() { bottomNavigationView.menu.clear() - val currentTabs: List = - PreferenceUtil.getInstance(this).libraryCategoryInfos + val currentTabs: List = PreferenceUtilKT.libraryCategory for (tab in currentTabs) { if (tab.visible) { val menu = tab.category diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt index 14550e5ef..fac356ecd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt @@ -2,7 +2,6 @@ package code.name.monkey.retromusic.activities.base import android.content.Context import android.graphics.Color -import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler import android.view.KeyEvent @@ -10,17 +9,15 @@ import android.view.View import android.view.WindowManager import androidx.annotation.ColorInt import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode -import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ATH import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.common.ATHToolbarActivity import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.LanguageContextWrapper import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.theme.ThemeManager import java.util.* @@ -45,7 +42,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } private fun toggleScreenOn() { - if (PreferenceUtil.getInstance(this).isScreenOnEnabled) { + if (PreferenceUtilKT.isScreenOnEnabled) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } else { window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -64,7 +61,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } fun hideStatusBar() { - hideStatusBar(PreferenceUtil.getInstance(this).fullScreenMode) + hideStatusBar(PreferenceUtilKT.isFullScreenMode) } private fun hideStatusBar(fullscreen: Boolean) { @@ -74,18 +71,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } } - private fun changeBackgroundShape() { - var background: Drawable? = if (PreferenceUtil.getInstance(this).isRoundCorners) - ContextCompat.getDrawable(this, R.drawable.round_window) - else ContextCompat.getDrawable(this, R.drawable.square_window) - background = - TintHelper.createTintedDrawable( - background, - ATHUtil.resolveColor(this, android.R.attr.windowBackground) - ) - window.setBackgroundDrawable(background) - } - fun setDrawUnderStatusBar() { RetroUtil.setAllowDrawUnderStatusBar(window) } @@ -179,7 +164,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) - if (PreferenceUtil.getInstance(this).fullScreenMode) { + if (PreferenceUtilKT.isFullScreenMode) { window.decorView.systemUiVisibility = flags } } @@ -212,7 +197,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } override fun attachBaseContext(newBase: Context?) { - val code = PreferenceUtil.getInstance(newBase).languageCode + val code = PreferenceUtilKT.languageCode if (code != "auto") { super.attachBaseContext(LanguageContextWrapper.wrap(newBase, Locale(code))) } else super.attachBaseContext(newBase) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java index 5a2661277..ee3b73e9e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java @@ -11,7 +11,7 @@ import androidx.annotation.IntRange; import java.util.Arrays; import java.util.Locale; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; public class DeviceInfo { @@ -75,10 +75,10 @@ public class DeviceInfo { versionCode = -1; versionName = null; } - baseTheme = PreferenceUtil.getInstance(context).getBaseTheme(); - nowPlayingTheme = context.getString(PreferenceUtil.getInstance(context).getNowPlayingScreen().getTitleRes()); - isAdaptive = PreferenceUtil.getInstance(context).getAdaptiveColor(); - selectedLang = PreferenceUtil.getInstance(context).getLanguageCode(); + baseTheme = PreferenceUtilKT.INSTANCE.getBaseTheme(); + nowPlayingTheme = context.getString(PreferenceUtilKT.INSTANCE.getNowPlayingScreen().getTitleRes()); + isAdaptive = PreferenceUtilKT.INSTANCE.isAdaptiveColor(); + selectedLang = PreferenceUtilKT.INSTANCE.getLanguageCode(); } public String toMarkdown() { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt index 3964d6660..7d81bcee3 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt @@ -22,12 +22,9 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R.drawable import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.saf.SAFGuideActivity -import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.SAFUtil -import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.list.listItems import com.google.android.material.button.MaterialButton import kotlinx.android.synthetic.main.activity_album_tag_editor.* @@ -53,7 +50,6 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { protected val show: MaterialDialog get() = MaterialDialog(this).show { - cornerRadius(PreferenceUtil.getInstance(this@AbsTagEditorActivity).dialogCorner) title(R.string.update_image) listItems(items = items) { _, position, _ -> when (position) { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java b/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java index 8c169ef6f..58d6ce759 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java @@ -42,8 +42,7 @@ public class CategoryInfoAdapter extends RecyclerView.Adapter categoryInfos; private ItemTouchHelper touchHelper; - public CategoryInfoAdapter(@NonNull List categoryInfos) { - this.categoryInfos = categoryInfos; + public CategoryInfoAdapter() { SwipeAndDragHelper swipeAndDragHelper = new SwipeAndDragHelper(this); touchHelper = new ItemTouchHelper(swipeAndDragHelper); } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt index bd7a6a563..213f09da2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt @@ -20,7 +20,8 @@ import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.model.Playlist -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT class HomeAdapter( private val activity: AppCompatActivity, @@ -117,7 +118,7 @@ class HomeAdapter( val artistAdapter = ArtistAdapter( activity, list, - PreferenceUtil.getInstance(activity).getHomeGridStyle(activity), + PreferenceUtilKT.homeGridStyle, null ) recyclerView.apply { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt index 4909ad372..daaba32dc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package code.name.monkey.retromusic.adapter import android.graphics.PorterDuff 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 7b209ac6e..83f97aee4 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 @@ -22,7 +22,7 @@ import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide import me.zhanghai.android.fastscroll.PopupTextProvider @@ -153,7 +153,7 @@ open class AlbumAdapter( private fun getSectionName(position: Int): String { var sectionName: String? = null - when (PreferenceUtil.getInstance(activity).albumSortOrder) { + when (PreferenceUtilKT.albumSortOrder) { SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName = dataSet[position].title SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt index 3cd623837..8c15aa594 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt @@ -15,7 +15,8 @@ import code.name.monkey.retromusic.glide.SongGlideRequest import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide @@ -90,7 +91,7 @@ class AlbumCoverPagerAdapter( } private fun getLayoutWithPlayerTheme(): Int { - return when (PreferenceUtil.getInstance(requireContext()).nowPlayingScreen) { + return when (PreferenceUtilKT.nowPlayingScreen) { Card, Fit, Tiny, @@ -99,11 +100,10 @@ class AlbumCoverPagerAdapter( Gradient, Full -> R.layout.fragment_album_full_cover else -> { - if (PreferenceUtil.getInstance(requireContext()).carouselEffect() - ) { + if (PreferenceUtilKT.isCarouselEffect) { R.layout.fragment_album_carousel_cover } else { - when (PreferenceUtil.getInstance(requireContext()).albumCoverStyle) { + when (PreferenceUtilKT.albumCoverStyle) { AlbumCoverStyle.NORMAL -> R.layout.fragment_album_cover AlbumCoverStyle.FLAT -> R.layout.fragment_album_flat_cover AlbumCoverStyle.CIRCLE -> R.layout.fragment_album_circle_cover @@ -111,7 +111,6 @@ class AlbumCoverPagerAdapter( AlbumCoverStyle.MATERIAL -> R.layout.fragment_album_material_cover AlbumCoverStyle.FULL -> R.layout.fragment_album_full_cover AlbumCoverStyle.FULL_CARD -> R.layout.fragment_album_full_card_cover - else -> R.layout.fragment_album_cover } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt index a550a1fb3..f5bf2b7e7 100755 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt @@ -17,8 +17,6 @@ import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder -import code.name.monkey.retromusic.dialogs.ClearSmartPlaylistDialog -import code.name.monkey.retromusic.dialogs.DeletePlaylistDialog import code.name.monkey.retromusic.extensions.hide import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper @@ -29,7 +27,6 @@ import code.name.monkey.retromusic.model.AbsCustomPlaylist import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist -import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist import code.name.monkey.retromusic.util.AutoGeneratedPlaylistBitmap import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.NavigationUtil @@ -125,24 +122,6 @@ class PlaylistAdapter( override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { when (menuItem.itemId) { - R.id.action_delete_playlist -> { - var i = 0 - while (i < selection.size) { - val playlist = selection[i] - if (playlist is AbsSmartPlaylist) { - ClearSmartPlaylistDialog.create(playlist).show( - activity.supportFragmentManager, "CLEAR_PLAYLIST_" + playlist.name - ) - selection.remove(playlist) - i-- - } - i++ - } - if (selection.size > 0) { - DeletePlaylistDialog.create(selection) - .show(activity.supportFragmentManager, "DELETE_PLAYLIST") - } - } else -> SongsMenuHelper.handleMenuClick( activity, getSongList(selection), @@ -183,25 +162,9 @@ class PlaylistAdapter( } menu?.setOnClickListener { view -> - val playlist = dataSet[layoutPosition] val popupMenu = PopupMenu(activity, view) - popupMenu.inflate( - if (itemViewType == SMART_PLAYLIST) R.menu.menu_item_smart_playlist - else R.menu.menu_item_playlist - ) - if (playlist is LastAddedPlaylist) { - popupMenu.menu.findItem(R.id.action_clear_playlist).isVisible = false - } + popupMenu.inflate(R.menu.menu_item_playlist) popupMenu.setOnMenuItemClickListener { item -> - if (item.itemId == R.id.action_clear_playlist) { - if (playlist is AbsSmartPlaylist) { - ClearSmartPlaylistDialog.create(playlist).show( - activity.supportFragmentManager, - "CLEAR_SMART_PLAYLIST_" + playlist.name - ) - return@setOnMenuItemClickListener true - } - } PlaylistMenuHelper.handleMenuClick( activity, dataSet[layoutPosition], item ) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt index f744b3dad..e82d05137 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt @@ -24,7 +24,8 @@ import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.afollestad.materialcab.MaterialCab import com.bumptech.glide.Glide @@ -144,7 +145,7 @@ open class SongAdapter( } override fun getPopupText(position: Int): String { - val sectionName: String? = when (PreferenceUtil.getInstance(activity).songSortOrder) { + val sectionName: String? = when (PreferenceUtilKT.songSortOrder) { SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt index 15e1b3020..fa7fa35a0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt @@ -25,13 +25,13 @@ import android.util.TypedValue import androidx.annotation.RequiresApi import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroUtil @RequiresApi(Build.VERSION_CODES.N_MR1) object AppShortcutIconGenerator { fun generateThemedIcon(context: Context, iconId: Int): Icon { - return if (PreferenceUtil.getInstance(context).coloredAppShortcuts()) { + return if (PreferenceUtilKT.isColoredAppShortcuts) { generateUserThemedIcon(context, iconId) } else { generateDefaultThemedIcon(context, iconId) diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt index b590a9439..ef80bc0ec 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt @@ -36,7 +36,8 @@ class LastAddedShortcutType(context: Context) : BaseShortcutType(context) { context, R.drawable.ic_app_shortcut_last_added ) - ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_LAST_ADDED)).build() + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_LAST_ADDED)) + .build() companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt index 60c918831..dfcd55d03 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt @@ -34,7 +34,8 @@ class SearchShortCutType(context: Context) : BaseShortcutType(context) { get() = ShortcutInfo.Builder( context, id - ).setShortLabel(context.getString(R.string.action_search)).setLongLabel(context.getString(R.string.search_hint)).setIcon( + ).setShortLabel(context.getString(R.string.action_search)) + .setLongLabel(context.getString(R.string.search_hint)).setIcon( AppShortcutIconGenerator.generateThemedIcon( context, R.drawable.ic_app_shortcut_search diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt index 8f869d206..dc86fa830 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt @@ -34,7 +34,8 @@ class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) { AppShortcutIconGenerator.generateThemedIcon( context, R.drawable.ic_app_shortcut_shuffle_all ) - ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL)).build() + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL)) + .build() companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt index ed274cdd7..1317977c8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt @@ -34,7 +34,8 @@ class TopTracksShortcutType(context: Context) : BaseShortcutType(context) { AppShortcutIconGenerator.generateThemedIcon( context, R.drawable.ic_app_shortcut_top_tracks ) - ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_TRACKS)).build() + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_TRACKS)) + .build() companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt index 3593369e2..4a55376fb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetBig.kt @@ -193,7 +193,8 @@ class AppWidgetBig : BaseAppWidget() { * Link up various button actions using [PendingIntent]. */ private fun linkButtons(context: Context, views: RemoteViews) { - val action = Intent(context, MainActivity::class.java).putExtra(MainActivity.EXPAND_PANEL, true) + val action = + Intent(context, MainActivity::class.java).putExtra(MainActivity.EXPAND_PANEL, true) var pendingIntent: PendingIntent val serviceName = ComponentName(context, MusicService::class.java) diff --git a/app/src/main/java/code/name/monkey/retromusic/data/RetroDataService.kt b/app/src/main/java/code/name/monkey/retromusic/data/RetroDataService.kt deleted file mode 100644 index cb7cee6de..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/data/RetroDataService.kt +++ /dev/null @@ -1,26 +0,0 @@ -package code.name.monkey.retromusic.data - -import code.name.monkey.retromusic.model.Contributor -import com.google.gson.GsonBuilder -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory -import retrofit2.http.GET - -private const val BASE_URL = "https://github.com/h4h13/RetroMusicPlayer/blob/dev/data/" - -interface RetroDataService { - - @GET("translators.json") - suspend fun getContributors(): List - - @GET("translators.json") - suspend fun getTranslators(): List - - companion object { - val retoService: RetroDataService = Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create())) - .build() - .create(RetroDataService::class.java) - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt index 2360e3b88..009cd5b38 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/AddToPlaylistDialog.kt @@ -17,15 +17,13 @@ package code.name.monkey.retromusic.dialogs import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment +import code.name.monkey.retromusic.EXTRA_SONG import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.loaders.PlaylistLoader import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PlaylistsUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.list.listItems +import com.google.android.material.dialog.MaterialAlertDialogBuilder class AddToPlaylistDialog : DialogFragment() { @@ -33,34 +31,33 @@ class AddToPlaylistDialog : DialogFragment() { savedInstanceState: Bundle? ): Dialog { val playlists = PlaylistLoader.getAllPlaylists(requireContext()) - val playlistNames: MutableList = mutableListOf() + val playlistNames = mutableListOf() playlistNames.add(requireContext().resources.getString(R.string.action_new_playlist)) for (p in playlists) { playlistNames.add(p.name) } - return MaterialDialog(requireContext()).show { - title(R.string.add_playlist_title) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - listItems(items = playlistNames) { dialog, index, _ -> - val songs = - requireArguments().getParcelableArrayList("songs") ?: return@listItems - if (index == 0) { - dialog.dismiss() - activity?.supportFragmentManager?.let { - CreatePlaylistDialog.create(songs).show(it, "ADD_TO_PLAYLIST") - } + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(R.string.add_playlist_title) + .setItems(playlistNames.toTypedArray()) { _, which -> + val songs = extraNotNull>(EXTRA_SONG).value + if (which == 0) { + CreatePlaylistDialog.create(songs) + .show(requireActivity().supportFragmentManager, "ADD_TO_PLAYLIST") } else { - dialog.dismiss() PlaylistsUtil.addToPlaylist( requireContext(), songs, - playlists[index - 1].id, + playlists[which - 1].id, true ) } + dismiss() } - } + .create() } companion object { @@ -74,7 +71,7 @@ class AddToPlaylistDialog : DialogFragment() { fun create(songs: List): AddToPlaylistDialog { val dialog = AddToPlaylistDialog() val args = Bundle() - args.putParcelableArrayList("songs", ArrayList(songs)) + args.putParcelableArrayList(EXTRA_SONG, ArrayList(songs)) dialog.arguments = args return dialog } 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 330f72c3e..25ace5fa5 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 @@ -23,10 +23,7 @@ import android.os.Environment import androidx.core.app.ActivityCompat import androidx.fragment.app.DialogFragment import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.list.listItems import java.io.File import java.util.* @@ -88,7 +85,7 @@ class BlacklistFolderChooserDialog : DialogFragment() { ) { return MaterialDialog(requireActivity()).show { title(R.string.md_error_label) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + message(R.string.md_storage_perm_error) positiveButton(android.R.string.ok) } @@ -105,7 +102,7 @@ class BlacklistFolderChooserDialog : DialogFragment() { return MaterialDialog(requireContext()).show { title(text = parentFolder!!.absolutePath) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + listItems(items = contentsArray(), waitForPositiveButton = false) { _, index, _ -> onSelection(index) } @@ -146,7 +143,7 @@ class BlacklistFolderChooserDialog : DialogFragment() { val dialog = dialog as MaterialDialog? dialog?.apply { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + setTitle(parentFolder!!.absolutePath) listItems(items = contentsArray()) { _, index, _ -> onSelection(index) diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/ClearSmartPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/ClearSmartPlaylistDialog.kt deleted file mode 100644 index 4a667a27f..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/ClearSmartPlaylistDialog.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * Licensed under the GNU General Public License v3 - * - * This is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by - * the Free Software Foundation either version 3 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - */ - -package code.name.monkey.retromusic.dialogs - -import android.app.Dialog -import android.os.Bundle -import androidx.core.text.HtmlCompat -import androidx.fragment.app.DialogFragment -import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet - - -class ClearSmartPlaylistDialog : DialogFragment() { - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - - val playlist = requireArguments().getParcelable("playlist") - val title = R.string.clear_playlist_title - - val content = HtmlCompat.fromHtml( - getString(R.string.clear_playlist_x, playlist!!.name), - HtmlCompat.FROM_HTML_MODE_LEGACY - ) - - return MaterialDialog(requireContext()).show { - title(title) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - message(text = content) - positiveButton(R.string.clear_action) { - if (activity == null) { - return@positiveButton - } - playlist.clear(requireActivity()) - } - negativeButton { (android.R.string.cancel) } - } - } - - companion object { - - fun create(playlist: AbsSmartPlaylist): ClearSmartPlaylistDialog { - val dialog = ClearSmartPlaylistDialog() - val args = Bundle() - args.putParcelable("playlist", playlist) - dialog.arguments = args - return dialog - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt index 3dd811530..4b232c4c4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt @@ -14,73 +14,57 @@ package code.name.monkey.retromusic.dialogs +import android.annotation.SuppressLint import android.app.Dialog import android.os.Bundle -import android.provider.MediaStore -import android.widget.TextView +import android.text.TextUtils +import android.view.LayoutInflater import androidx.fragment.app.DialogFragment import code.name.monkey.appthemehelper.util.MaterialUtil +import code.name.monkey.retromusic.EXTRA_SONG import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.R.layout -import code.name.monkey.retromusic.R.string -import code.name.monkey.retromusic.extensions.appHandleColor +import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PlaylistsUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.customview.getCustomView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout +import kotlinx.android.synthetic.main.dialog_playlist.view.* class CreatePlaylistDialog : DialogFragment() { - private lateinit var playlistView: TextInputEditText - private lateinit var actionNewPlaylistContainer: TextInputLayout - + @SuppressLint("InflateParams") override fun onCreateDialog( savedInstanceState: Bundle? ): Dialog { - val materialDialog = MaterialDialog(requireContext()) - .show { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - title(string.new_playlist_title) - customView(layout.dialog_playlist) - negativeButton(android.R.string.cancel) - positiveButton(string.create_action) { - if (activity == null) { - return@positiveButton - } - val songs = requireArguments().getParcelableArrayList("songs") - ?: return@positiveButton + val view = LayoutInflater.from(requireActivity()).inflate(R.layout.dialog_playlist, null) + val playlistView: TextInputEditText = view.actionNewPlaylist + val playlistContainer: TextInputLayout = view.actionNewPlaylistContainer + MaterialUtil.setTint(playlistContainer, false) - if (playlistView.text.toString().trim { it <= ' ' }.isNotEmpty()) { - val playlistId = PlaylistsUtil.createPlaylist( - requireContext(), - playlistView.text.toString() - ) - if (playlistId != -1) { - PlaylistsUtil.addToPlaylist(requireContext(), songs, playlistId, true) - } + return MaterialAlertDialogBuilder( + requireActivity(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(R.string.new_playlist_title) + .setView(view) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton( + R.string.create_action + ) { _, _ -> + val extra = extraNotNull>(EXTRA_SONG) + val playlistName = playlistView.text.toString() + if (!TextUtils.isEmpty(playlistName)) { + val playlistId = PlaylistsUtil.createPlaylist( + requireContext(), + playlistView.text.toString() + ) + if (playlistId != -1) { + PlaylistsUtil.addToPlaylist(requireContext(), extra.value, playlistId, true) } } } - - val dialogView = materialDialog.getCustomView() - playlistView = dialogView.findViewById(R.id.actionNewPlaylist) - actionNewPlaylistContainer = dialogView.findViewById(R.id.actionNewPlaylistContainer) - - MaterialUtil.setTint(actionNewPlaylistContainer, false) - - val playlistId = requireArguments().getLong(MediaStore.Audio.Playlists.Members.PLAYLIST_ID) - playlistView.appHandleColor() - .setText( - PlaylistsUtil.getNameForPlaylist(requireContext(), playlistId), - TextView.BufferType.EDITABLE - ) - return materialDialog + .create() } companion object { @@ -98,7 +82,7 @@ class CreatePlaylistDialog : DialogFragment() { fun create(songs: ArrayList): CreatePlaylistDialog { val dialog = CreatePlaylistDialog() val args = Bundle() - args.putParcelableArrayList("songs", songs) + args.putParcelableArrayList(EXTRA_SONG, songs) dialog.arguments = args return dialog } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt index 0f7a2d23e..a3026e810 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt @@ -18,48 +18,45 @@ import android.app.Dialog import android.os.Bundle import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment +import code.name.monkey.retromusic.EXTRA_PLAYLIST import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.R.string +import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.util.PlaylistsUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import java.util.* +import com.google.android.material.dialog.MaterialAlertDialogBuilder class DeletePlaylistDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val playlists = requireArguments().getParcelableArrayList("playlist") + val playlists = extraNotNull>(EXTRA_PLAYLIST).value val title: Int - val content: CharSequence + val message: CharSequence //noinspection ConstantConditions - if (playlists!!.size > 1) { - title = string.delete_playlists_title - content = HtmlCompat.fromHtml( - getString(string.delete_x_playlists, playlists.size), + if (playlists.size > 1) { + title = R.string.delete_playlists_title + message = HtmlCompat.fromHtml( + String.format(getString(R.string.delete_x_playlists), playlists.size), HtmlCompat.FROM_HTML_MODE_LEGACY ) } else { - title = string.delete_playlist_title - content = HtmlCompat.fromHtml( - getString(string.delete_playlist_x, playlists[0].name), + title = R.string.delete_playlist_title + message = HtmlCompat.fromHtml( + String.format(getString(R.string.delete_playlist_x), playlists[0].name), HtmlCompat.FROM_HTML_MODE_LEGACY ) } - return MaterialDialog(requireContext()) - .show { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - title(title) - message(text = content) - negativeButton(android.R.string.cancel) - positiveButton(R.string.action_delete) { - PlaylistsUtil.deletePlaylists(requireContext(), playlists) - } - negativeButton(android.R.string.cancel) + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(title) + .setMessage(message) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.action_delete) { _, _ -> + PlaylistsUtil.deletePlaylists(requireContext(), playlists) } + .create() } companion object { @@ -73,7 +70,7 @@ class DeletePlaylistDialog : DialogFragment() { fun create(playlist: ArrayList): DeletePlaylistDialog { val dialog = DeletePlaylistDialog() val args = Bundle() - args.putParcelableArrayList("playlist", playlist) + args.putParcelableArrayList(EXTRA_PLAYLIST, playlist) dialog.arguments = args return dialog } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsAsyncTask.java b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsAsyncTask.java index e55488c7a..5cc00d765 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsAsyncTask.java +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsAsyncTask.java @@ -55,7 +55,8 @@ public class DeleteSongsAsyncTask extends DialogAsyncTask? = null private var deleteSongsAsyncTask: DeleteSongsAsyncTask? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val songs: ArrayList? = requireArguments().getParcelableArrayList("songs") + val songs = extraNotNull>(EXTRA_SONG).value var title = 0 - var content: CharSequence = "" - if (songs != null) { - if (songs.size > 1) { - title = R.string.delete_songs_title - content = HtmlCompat.fromHtml( - getString(R.string.delete_x_songs, songs.size), - HtmlCompat.FROM_HTML_MODE_LEGACY - ) - } else { - title = R.string.delete_song_title - content = HtmlCompat.fromHtml( - getString(R.string.delete_song_x, songs[0].title), - HtmlCompat.FROM_HTML_MODE_LEGACY - ) - } + var message: CharSequence = "" + if (songs.size > 1) { + title = R.string.delete_songs_title + message = HtmlCompat.fromHtml( + String.format(getString(R.string.delete_x_songs), songs.size), + HtmlCompat.FROM_HTML_MODE_LEGACY + ) + } else { + title = R.string.delete_song_title + message = HtmlCompat.fromHtml( + String.format(getString(R.string.delete_song_x), songs[0].title), + HtmlCompat.FROM_HTML_MODE_LEGACY + ) } - return MaterialDialog(requireContext()).show { - title(title) - message(text = content) - negativeButton(android.R.string.cancel) { - dismiss() - } - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - noAutoDismiss() - positiveButton(R.string.action_delete) { - if (songs != null) { - if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) { - MusicPlayerRemote.playNextSong() - } + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(title) + .setMessage(message) + .setCancelable(false) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.action_delete) { _, _ -> + if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) { + MusicPlayerRemote.playNextSong() } - songsToRemove = songs deleteSongsAsyncTask = DeleteSongsAsyncTask(this@DeleteSongsDialog) deleteSongsAsyncTask?.execute(DeleteSongsAsyncTask.LoadingInfo(songs, null)) } - } + .create() } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -119,7 +114,7 @@ class DeleteSongsDialog : DialogFragment() { fun create(songs: List): DeleteSongsDialog { val dialog = DeleteSongsDialog() val args = Bundle() - args.putParcelableArrayList("songs", ArrayList(songs)) + args.putParcelableArrayList(EXTRA_SONG, ArrayList(songs)) dialog.arguments = args return dialog } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt index 601d7cf5a..206a89e7d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt @@ -18,34 +18,32 @@ import android.app.Dialog import android.os.Bundle import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment +import code.name.monkey.retromusic.EXTRA_SONG import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R.string import code.name.monkey.retromusic.model.PlaylistSong import code.name.monkey.retromusic.util.PlaylistsUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet +import com.google.android.material.dialog.MaterialAlertDialogBuilder class RemoveFromPlaylistDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val songs = requireArguments().getParcelableArrayList("songs") + val songs = requireArguments().getParcelableArrayList(EXTRA_SONG) var title = 0 - var content: CharSequence = "" + var message: CharSequence = "" if (songs != null) { if (songs.size > 1) { title = R.string.remove_songs_from_playlist_title - content = HtmlCompat.fromHtml( - getString(string.remove_x_songs_from_playlist, songs.size), + message = HtmlCompat.fromHtml( + String.format(getString(string.remove_x_songs_from_playlist), songs.size), HtmlCompat.FROM_HTML_MODE_LEGACY ) } else { title = R.string.remove_song_from_playlist_title - content = HtmlCompat.fromHtml( - getString( - code.name.monkey.retromusic.R.string.remove_song_x_from_playlist, + message = HtmlCompat.fromHtml( + String.format( + getString(string.remove_song_x_from_playlist), songs[0].title ), HtmlCompat.FROM_HTML_MODE_LEGACY @@ -53,22 +51,20 @@ class RemoveFromPlaylistDialog : DialogFragment() { } } - - return MaterialDialog(requireContext()) - .show { - title(title) - message(text = content) - negativeButton(android.R.string.cancel) - positiveButton(R.string.remove_action) { - if (activity == null) - return@positiveButton - PlaylistsUtil.removeFromPlaylist( - requireContext(), - songs as MutableList - ) - } - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(title) + .setMessage(message) + .setPositiveButton(R.string.remove_action) { _, _ -> + PlaylistsUtil.removeFromPlaylist( + requireContext(), + songs as MutableList + ) } + .setNegativeButton(android.R.string.cancel, null) + .create() } companion object { @@ -82,7 +78,7 @@ class RemoveFromPlaylistDialog : DialogFragment() { fun create(songs: ArrayList): RemoveFromPlaylistDialog { val dialog = RemoveFromPlaylistDialog() val args = Bundle() - args.putParcelableArrayList("songs", songs) + args.putParcelableArrayList(EXTRA_SONG, songs) dialog.arguments = args return dialog } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt index 52097722f..ba11e6ef5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt @@ -14,62 +14,52 @@ package code.name.monkey.retromusic.dialogs +import android.annotation.SuppressLint import android.app.Dialog import android.os.Bundle import android.provider.MediaStore.Audio.Playlists.Members.PLAYLIST_ID -import android.widget.TextView +import android.view.LayoutInflater import androidx.fragment.app.DialogFragment import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.R.layout -import code.name.monkey.retromusic.R.string -import code.name.monkey.retromusic.extensions.appHandleColor +import code.name.monkey.retromusic.extensions.extraNotNull import code.name.monkey.retromusic.util.PlaylistsUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.customview.getCustomView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout class RenamePlaylistDialog : DialogFragment() { - private lateinit var playlistView: TextInputEditText - private lateinit var actionNewPlaylistContainer: TextInputLayout - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val materialDialog = MaterialDialog(requireContext()) - .show { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - title(string.rename_playlist_title) - customView(layout.dialog_playlist) - negativeButton(android.R.string.cancel) - positiveButton(string.action_rename) { - if (playlistView.toString().trim { it <= ' ' } != "") { - val playlistId = requireArguments().getLong(PLAYLIST_ID) - PlaylistsUtil.renamePlaylist( - context, - playlistId, - playlistView.text!!.toString() - ) - } + + @SuppressLint("InflateParams") + override fun onCreateDialog( + savedInstanceState: Bundle? + ): Dialog { + val layout = LayoutInflater.from(requireContext()) + .inflate(R.layout.dialog_playlist, null) + val inputEditText: TextInputEditText = layout.findViewById(R.id.actionNewPlaylist) + val nameContainer: TextInputLayout = + layout.findViewById(R.id.actionNewPlaylistContainer) + MaterialUtil.setTint(nameContainer, false) + + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(R.string.rename_playlist_title) + .setView(layout) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.action_rename) { _, _ -> + val name = inputEditText.text.toString() + if (name.isNotEmpty()) { + PlaylistsUtil.renamePlaylist( + requireContext(), + extraNotNull(PLAYLIST_ID).value, + name + ) } } - - val dialogView = materialDialog.getCustomView() - playlistView = dialogView.findViewById(R.id.actionNewPlaylist) - actionNewPlaylistContainer = dialogView.findViewById(R.id.actionNewPlaylistContainer) - - MaterialUtil.setTint(actionNewPlaylistContainer, false) - - val playlistId = requireArguments().getLong(PLAYLIST_ID) - playlistView.appHandleColor() - .setText( - PlaylistsUtil.getNameForPlaylist(requireContext(), playlistId), - TextView.BufferType.EDITABLE - ) - return materialDialog + .create() } companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt index a2ed61b0a..4af19be45 100755 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt @@ -14,6 +14,7 @@ package code.name.monkey.retromusic.dialogs +import android.annotation.SuppressLint import android.app.AlarmManager import android.app.Dialog import android.app.PendingIntent @@ -22,29 +23,23 @@ import android.content.Intent import android.os.Bundle import android.os.CountDownTimer import android.os.SystemClock +import android.view.LayoutInflater import android.widget.CheckBox import android.widget.SeekBar import android.widget.TextView import android.widget.Toast import androidx.fragment.app.DialogFragment -import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.addAccentColor import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.ACTION_PENDING_QUIT import code.name.monkey.retromusic.service.MusicService.ACTION_QUIT -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.ViewUtil -import com.afollestad.materialdialogs.LayoutMode +import code.name.monkey.retromusic.util.PreferenceUtilKT import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.WhichButton import com.afollestad.materialdialogs.actions.getActionButton -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.callbacks.onShow -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.customview.getCustomView +import com.google.android.material.dialog.MaterialAlertDialogBuilder class SleepTimerDialog : DialogFragment() { @@ -55,91 +50,26 @@ class SleepTimerDialog : DialogFragment() { private lateinit var seekBar: SeekBar private lateinit var timerDisplay: TextView + @SuppressLint("InflateParams") override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { timerUpdater = TimerUpdater() + val layout = LayoutInflater.from(requireContext()) + .inflate(R.layout.dialog_sleep_timer, null) + shouldFinishLastSong = layout.findViewById(R.id.shouldFinishLastSong) + seekBar = layout.findViewById(R.id.seekBar) + timerDisplay = layout.findViewById(R.id.timerDisplay) - materialDialog = MaterialDialog(requireContext()) - .title(R.string.action_sleep_timer) - .cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - .positiveButton(R.string.action_set) { - PreferenceUtil.getInstance(requireContext()).sleepTimerFinishMusic = - shouldFinishLastSong.isChecked - - val minutes = seekArcProgress - - val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) - - val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000 - PreferenceUtil.getInstance(requireContext()) - .setNextSleepTimerElapsedRealtime(nextSleepTimerElapsedTime) - val am = requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager - am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi) - - Toast.makeText( - requireContext(), - requireContext().resources.getString(R.string.sleep_timer_set, minutes), - Toast.LENGTH_SHORT - ).show() - } - .negativeButton(android.R.string.cancel) { - if (activity == null) { - return@negativeButton - } - val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) - if (previous != null) { - val am = - requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager - am.cancel(previous) - previous.cancel() - Toast.makeText( - requireContext(), - requireContext().resources.getString(R.string.sleep_timer_canceled), - Toast.LENGTH_SHORT - ).show() - } - - val musicService = MusicPlayerRemote.musicService - if (musicService != null && musicService.pendingQuit) { - musicService.pendingQuit = false - Toast.makeText( - requireContext(), - requireContext().resources.getString(R.string.sleep_timer_canceled), - Toast.LENGTH_SHORT - ).show() - } - } - .customView(R.layout.dialog_sleep_timer, scrollable = false) - .show { - onShow { - if (makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) != null) { - timerUpdater.start() - } - } - } - - if (activity == null || materialDialog.getCustomView() == null) { - return materialDialog + val finishMusic = PreferenceUtilKT.isSleepTimerFinishMusic + shouldFinishLastSong.apply { + addAccentColor() + isChecked = finishMusic + } + seekBar.apply { + addAccentColor() + seekArcProgress = PreferenceUtilKT.lastSleepTimerValue + updateTimeDisplayTime() + seekBar.progress = seekArcProgress } - - shouldFinishLastSong = - materialDialog.getCustomView().findViewById(R.id.shouldFinishLastSong) - seekBar = materialDialog.getCustomView().findViewById(R.id.seekBar) - timerDisplay = materialDialog.getCustomView().findViewById(R.id.timerDisplay) - TintHelper.setTintAuto( - shouldFinishLastSong, - ThemeStore.accentColor(requireContext()), - false - ) - - val finishMusic = PreferenceUtil.getInstance(requireContext()).sleepTimerFinishMusic - shouldFinishLastSong.isChecked = finishMusic - - - seekArcProgress = PreferenceUtil.getInstance(requireContext()).lastSleepTimerValue - updateTimeDisplayTime() - seekBar.progress = seekArcProgress - - setProgressBarColor(ThemeStore.accentColor(requireContext())) seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) { @@ -155,11 +85,54 @@ class SleepTimerDialog : DialogFragment() { } override fun onStopTrackingTouch(seekBar: SeekBar) { - PreferenceUtil.getInstance(requireContext()).lastSleepTimerValue = seekArcProgress + PreferenceUtilKT.lastSleepTimerValue = seekArcProgress } }) + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ) + .setTitle(R.string.action_sleep_timer) + .setView(layout) + .setPositiveButton(R.string.action_set) { _, _ -> + PreferenceUtilKT.isSleepTimerFinishMusic = shouldFinishLastSong.isChecked + val minutes = seekArcProgress + val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) + val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000 + PreferenceUtilKT.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() + val am = requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager + am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi) - return materialDialog + Toast.makeText( + requireContext(), + requireContext().resources.getString(R.string.sleep_timer_set, minutes), + Toast.LENGTH_SHORT + ).show() + } + .setNegativeButton(android.R.string.cancel) { _, _ -> + val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) + if (previous != null) { + val am = + requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager + am.cancel(previous) + previous.cancel() + Toast.makeText( + requireContext(), + requireContext().resources.getString(R.string.sleep_timer_canceled), + Toast.LENGTH_SHORT + ).show() + val musicService = MusicPlayerRemote.musicService + if (musicService != null && musicService.pendingQuit) { + musicService.pendingQuit = false + Toast.makeText( + requireContext(), + requireContext().resources.getString(R.string.sleep_timer_canceled), + Toast.LENGTH_SHORT + ).show() + } + } + } + .create() } private fun updateTimeDisplayTime() { @@ -187,25 +160,19 @@ class SleepTimerDialog : DialogFragment() { } } - private inner class TimerUpdater internal constructor() : CountDownTimer( - PreferenceUtil.getInstance(requireContext()).nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(), - 1000 - ) { + private inner class TimerUpdater internal constructor() : + CountDownTimer( + PreferenceUtilKT.nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(), + 1000 + ) { override fun onTick(millisUntilFinished: Long) { - materialDialog.getActionButton(WhichButton.NEGATIVE).text = String.format( - "%s %s", - materialDialog.context.getString(R.string.cancel_current_timer), - " (" + MusicUtil.getReadableDurationString(millisUntilFinished) + ")" - ) + println("onTick: $millisUntilFinished") + seekBar.progress = millisUntilFinished.toInt() } override fun onFinish() { updateCancelButton() } } - - private fun setProgressBarColor(dark: Int) { - ViewUtil.setProgressDrawable(progressSlider = seekBar, newColor = dark) - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt index 6a6aec0be..5bc2aba36 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongDetailDialog.kt @@ -14,27 +14,24 @@ package code.name.monkey.retromusic.dialogs +import android.annotation.SuppressLint import android.app.Dialog import android.content.Context import android.os.Bundle import android.text.Spanned import android.util.Log +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.annotation.NonNull import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment +import code.name.monkey.retromusic.EXTRA_SONG import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.R.string import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.customview.getCustomView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.jaudiotagger.audio.AudioFileIO import org.jaudiotagger.audio.exceptions.CannotReadException import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException @@ -51,22 +48,12 @@ inline fun ViewGroup.forEach(action: (View) -> Unit) { class SongDetailDialog : DialogFragment() { + @SuppressLint("InflateParams") override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val context: Context = requireContext() - val song = requireArguments().getParcelable("song") - - val materialDialog = MaterialDialog(requireContext()) - .show { - customView( - R.layout.dialog_file_details, - scrollable = true - ) - positiveButton(android.R.string.ok) - title(string.action_details) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - } - val dialogView = materialDialog.getCustomView() + val dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_file_details, null) + val song = requireArguments().getParcelable(EXTRA_SONG) val fileName: TextView = dialogView.findViewById(R.id.fileName) val filePath: TextView = dialogView.findViewById(R.id.filePath) val fileSize: TextView = dialogView.findViewById(R.id.fileSize) @@ -75,23 +62,23 @@ class SongDetailDialog : DialogFragment() { val bitRate: TextView = dialogView.findViewById(R.id.bitrate) val samplingRate: TextView = dialogView.findViewById(R.id.samplingRate) - fileName.text = makeTextWithTitle(context, string.label_file_name, "-") - filePath.text = makeTextWithTitle(context, string.label_file_path, "-") - fileSize.text = makeTextWithTitle(context, string.label_file_size, "-") - fileFormat.text = makeTextWithTitle(context, string.label_file_format, "-") - trackLength.text = makeTextWithTitle(context, string.label_track_length, "-") - bitRate.text = makeTextWithTitle(context, string.label_bit_rate, "-") - samplingRate.text = makeTextWithTitle(context, string.label_sampling_rate, "-") + fileName.text = makeTextWithTitle(context, R.string.label_file_name, "-") + filePath.text = makeTextWithTitle(context, R.string.label_file_path, "-") + fileSize.text = makeTextWithTitle(context, R.string.label_file_size, "-") + fileFormat.text = makeTextWithTitle(context, R.string.label_file_format, "-") + trackLength.text = makeTextWithTitle(context, R.string.label_track_length, "-") + bitRate.text = makeTextWithTitle(context, R.string.label_bit_rate, "-") + samplingRate.text = makeTextWithTitle(context, R.string.label_sampling_rate, "-") if (song != null) { val songFile = File(song.data) if (songFile.exists()) { - fileName.text = makeTextWithTitle(context, string.label_file_name, songFile.name) + fileName.text = makeTextWithTitle(context, R.string.label_file_name, songFile.name) filePath.text = - makeTextWithTitle(context, string.label_file_path, songFile.absolutePath) + makeTextWithTitle(context, R.string.label_file_path, songFile.absolutePath) fileSize.text = makeTextWithTitle( context, - string.label_file_size, + R.string.label_file_size, getFileSizeString(songFile.length()) ) try { @@ -99,21 +86,21 @@ class SongDetailDialog : DialogFragment() { val audioHeader = audioFile.audioHeader fileFormat.text = - makeTextWithTitle(context, string.label_file_format, audioHeader.format) + makeTextWithTitle(context, R.string.label_file_format, audioHeader.format) trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString((audioHeader.trackLength * 1000).toLong()) ) bitRate.text = makeTextWithTitle( context, - string.label_bit_rate, + R.string.label_bit_rate, audioHeader.bitRate + " kb/s" ) samplingRate.text = makeTextWithTitle( context, - string.label_sampling_rate, + R.string.label_sampling_rate, audioHeader.sampleRate + " Hz" ) } catch (@NonNull e: CannotReadException) { @@ -121,50 +108,55 @@ class SongDetailDialog : DialogFragment() { // fallback trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString(song.duration) ) } catch (@NonNull e: IOException) { Log.e(TAG, "error while reading the song file", e) trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString(song.duration) ) } catch (@NonNull e: TagException) { Log.e(TAG, "error while reading the song file", e) trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString(song.duration) ) } catch (@NonNull e: ReadOnlyFileException) { Log.e(TAG, "error while reading the song file", e) trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString(song.duration) ) } catch (@NonNull e: InvalidAudioFrameException) { Log.e(TAG, "error while reading the song file", e) trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString(song.duration) ) } } else { // fallback - fileName.text = makeTextWithTitle(context, string.label_file_name, song.title) + fileName.text = makeTextWithTitle(context, R.string.label_file_name, song.title) trackLength.text = makeTextWithTitle( context, - string.label_track_length, + R.string.label_track_length, MusicUtil.getReadableDurationString(song.duration) ) } } - - return materialDialog + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ).setTitle(R.string.action_details) + .setPositiveButton(android.R.string.ok, null) + .setView(dialogView) + .create() } companion object { @@ -174,7 +166,7 @@ class SongDetailDialog : DialogFragment() { fun create(song: Song): SongDetailDialog { val dialog = SongDetailDialog() val args = Bundle() - args.putParcelable("song", song) + args.putParcelable(EXTRA_SONG, song) dialog.arguments = args return dialog } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt index 7d19db826..2f039e635 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt @@ -18,69 +18,77 @@ import android.app.Dialog import android.content.Intent import android.os.Bundle import androidx.fragment.app.DialogFragment +import code.name.monkey.retromusic.EXTRA_SONG import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.ShareInstagramStory import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.list.listItems +import com.google.android.material.dialog.MaterialAlertDialogBuilder class SongShareDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val song: Song? = requireArguments().getParcelable("song") - val currentlyListening: String = - getString(R.string.currently_listening_to_x_by_x, song?.title, song?.artistName) + val song: Song? = requireArguments().getParcelable(EXTRA_SONG) + val listening: String = + String.format( + getString(R.string.currently_listening_to_x_by_x), + song?.title, + song?.artistName + ) + return MaterialAlertDialogBuilder( + requireContext(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert + ).setTitle(R.string.what_do_you_want_to_share) + .setItems( + arrayOf( + getString(R.string.the_audio_file), + "\u201C" + listening + "\u201D", + getString(R.string.social_stories) + ) + ) { _, which -> + withAction(which, song, listening) + } + .create() + } - return MaterialDialog(requireContext()) - .title(R.string.what_do_you_want_to_share) - .show { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - listItems( - items = listOf( - getString(code.name.monkey.retromusic.R.string.the_audio_file), - "\u201C" + currentlyListening + "\u201D", - getString(R.string.social_stories) + private fun withAction( + which: Int, + song: Song?, + currentlyListening: String + ) { + when (which) { + 0 -> { + startActivity(Intent.createChooser(song?.let { + MusicUtil.createShareSongFileIntent( + it, + requireContext() + ) + }, null)) + } + 1 -> { + startActivity( + Intent.createChooser( + Intent() + .setAction(Intent.ACTION_SEND) + .putExtra(Intent.EXTRA_TEXT, currentlyListening) + .setType("text/plain"), + null + ) + ) + } + 2 -> { + if (song != null) { + startActivity( + Intent( + requireContext(), + ShareInstagramStory::class.java + ).putExtra( + ShareInstagramStory.EXTRA_SONG, + song + ) ) - ) { _, index, _ -> - when (index) { - 0 -> { - startActivity(Intent.createChooser(song?.let { - MusicUtil.createShareSongFileIntent( - it, - context - ) - }, null)) - } - 1 -> { - startActivity( - Intent.createChooser( - Intent() - .setAction(Intent.ACTION_SEND) - .putExtra(Intent.EXTRA_TEXT, currentlyListening) - .setType("text/plain"), - null - ) - ) - } - 2 -> { - if (song != null) { - startActivity( - Intent( - requireContext(), - ShareInstagramStory::class.java - ).putExtra( - ShareInstagramStory.EXTRA_SONG, - song - ) - ) - } - } - } } } + } } companion object { @@ -88,7 +96,7 @@ class SongShareDialog : DialogFragment() { fun create(song: Song): SongShareDialog { val dialog = SongShareDialog() val args = Bundle() - args.putParcelable("song", song) + args.putParcelable(EXTRA_SONG, song) dialog.arguments = args return dialog } diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityEx.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityEx.kt index e896bddb1..615a8acbb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityEx.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityEx.kt @@ -14,8 +14,14 @@ package code.name.monkey.retromusic.extensions +import android.app.Activity +import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentTransaction import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.retromusic.R import com.google.android.material.appbar.MaterialToolbar fun AppCompatActivity.applyToolbar(toolbar: MaterialToolbar) { @@ -24,3 +30,47 @@ fun AppCompatActivity.applyToolbar(toolbar: MaterialToolbar) { setSupportActionBar(toolbar) } +fun FragmentActivity?.addFragment( + @IdRes idRes: Int = R.id.container, + fragment: Fragment, + tag: String? = null, + addToBackStack: Boolean = false +) { + val compatActivity = this as? AppCompatActivity ?: return + compatActivity.supportFragmentManager.beginTransaction() + .apply { + add(fragment, tag) + setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) + if (addToBackStack) { + addToBackStack(null) + } + commitNow() + } +} + +fun AppCompatActivity.replaceFragment( + @IdRes id: Int = R.id.container, + fragment: Fragment, + tag: String? = null, + addToBackStack: Boolean = false +) { + val compatActivity = this ?: return + compatActivity.supportFragmentManager.beginTransaction() + .apply { + replace(id, fragment, tag) + if (addToBackStack) { + addToBackStack(null) + } + commit() + } +} + +inline fun Activity.extra(key: String, default: T? = null) = lazy { + val value = intent?.extras?.get(key) + if (value is T) value else default +} + +inline fun Activity.extraNotNull(key: String, default: T? = null) = lazy { + val value = intent?.extras?.get(key) + requireNotNull(if (value is T) value else default) { key } +} \ No newline at end of file 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 45c28f78d..b5d379209 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 @@ -18,6 +18,8 @@ import android.app.Dialog import android.content.Context import android.content.res.ColorStateList import android.graphics.Color +import android.widget.CheckBox +import android.widget.SeekBar import androidx.annotation.AttrRes import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment @@ -65,3 +67,14 @@ 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)) +} + +fun SeekBar.addAccentColor() { + val colorState = ColorStateList.valueOf(ThemeStore.accentColor(context)) + progressTintList = colorState + thumbTintList = colorState +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/DrawableExt.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/DrawableExt.kt index d25742aff..dc86fb949 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/DrawableExt.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/DrawableExt.kt @@ -26,9 +26,12 @@ import androidx.annotation.DimenRes import androidx.annotation.DrawableRes import androidx.core.content.ContextCompat import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.DensityUtil -fun Context.scaledDrawableResources(@DrawableRes id: Int, @DimenRes width: Int, @DimenRes height: Int): Drawable { +fun Context.scaledDrawableResources( + @DrawableRes id: Int, + @DimenRes width: Int, + @DimenRes height: Int +): Drawable { val w = resources.getDimension(width).toInt() val h = resources.getDimension(height).toInt() return scaledDrawable(id, w, h) diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt new file mode 100644 index 000000000..6e724dc18 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/FragmentExt.kt @@ -0,0 +1,39 @@ +package code.name.monkey.retromusic.extensions + +import android.content.Context +import android.content.res.Configuration +import android.os.PowerManager +import androidx.annotation.IntegerRes +import androidx.fragment.app.Fragment +import code.name.monkey.retromusic.util.PreferenceUtilKT + +fun Fragment.getIntRes(@IntegerRes int: Int): Int { + return resources.getInteger(int) +} + +fun Context.getIntRes(@IntegerRes int: Int): Int { + return resources.getInteger(int) +} + +val Context.generalThemeValue + get() = PreferenceUtilKT.getGeneralThemeValue(isSystemDarkModeEnabled()) + + +fun Context.isSystemDarkModeEnabled(): Boolean { + val isBatterySaverEnabled = + (getSystemService(Context.POWER_SERVICE) as PowerManager?)?.isPowerSaveMode ?: false + val isDarkModeEnabled = + (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES + return isBatterySaverEnabled or isDarkModeEnabled +} + + +inline fun Fragment.extra(key: String, default: T? = null) = lazy { + val value = arguments?.get(key) + if (value is T) value else default +} + +inline fun Fragment.extraNotNull(key: String, default: T? = null) = lazy { + val value = arguments?.get(key) + requireNotNull(if (value is T) value else default) { key } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/Preference.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/Preference.kt new file mode 100644 index 000000000..0fe53f4a1 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/Preference.kt @@ -0,0 +1,7 @@ +package code.name.monkey.retromusic.extensions + +import android.content.SharedPreferences + +fun SharedPreferences.getStringOrDefault(key: String, default: String): String { + return getString(key, default) ?: default +} 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 new file mode 100644 index 000000000..754182fab --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -0,0 +1,136 @@ +package code.name.monkey.retromusic.fragments + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import code.name.monkey.retromusic.Result.Error +import code.name.monkey.retromusic.Result.Success +import code.name.monkey.retromusic.fragments.ReloadType.* +import code.name.monkey.retromusic.interfaces.MusicServiceEventListener +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.providers.RepositoryImpl +import code.name.monkey.retromusic.providers.interfaces.Repository +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.async +import kotlinx.coroutines.launch + +class LibraryViewModel(application: Application) : + AndroidViewModel(application), MusicServiceEventListener { + + private val _repository: Repository = RepositoryImpl(application.applicationContext) + private val _albums = MutableLiveData>() + private val _songs = MutableLiveData>() + private val _artists = MutableLiveData>() + private val _playlist = MutableLiveData>() + private val _genre = MutableLiveData>() + private val _homeSections = MutableLiveData>() + + fun homeSections(): LiveData> = _homeSections + fun allAlbums(): LiveData> = _albums + fun allSongs(): LiveData> = _songs + fun allArtists(): LiveData> = _artists + fun allPlaylisits(): LiveData> = _playlist + fun allGenres(): LiveData> = _genre + + init { + viewModelScope.launch { + loadLibraryContent() + loadHomeSections() + } + } + + private fun loadLibraryContent() = viewModelScope.launch { + _songs.value = loadSongs.await() + _albums.value = loadAlbums.await() + _artists.value = loadArtists.await() + _playlist.value = loadPlaylists.await() + _genre.value = loadGenres.await() + } + + private fun loadHomeSections() = viewModelScope.launch { + val list = mutableListOf() + val result = listOf( + _repository.topArtists(), + _repository.topAlbums(), + _repository.recentArtists(), + _repository.recentAlbums(), + _repository.favoritePlaylist() + ) + for (r in result) { + if (r is Success) { + list.add(r.data) + } + } + _homeSections.value = list + } + + private val loadSongs: Deferred> + get() = viewModelScope.async(IO) { + when (val result = _repository.allSongs()) { + is Success -> result.data + is Error -> arrayListOf() + } + } + + private val loadAlbums: Deferred> + get() = viewModelScope.async(IO) { + when (val result = _repository.allAlbums()) { + is Success -> result.data + is Error -> arrayListOf() + } + } + private val loadArtists: Deferred> + get() = viewModelScope.async(IO) { + when (val result = _repository.allArtists()) { + is Success -> result.data + is Error -> arrayListOf() + } + } + + private val loadPlaylists: Deferred> + get() = viewModelScope.async(IO) { + when (val result = _repository.allPlaylists()) { + is Success -> result.data + is Error -> arrayListOf() + } + } + + private val loadGenres: Deferred> + get() = viewModelScope.async(IO) { + when (val result = _repository.allGenres()) { + is Success -> result.data + is Error -> arrayListOf() + } + } + + fun forceReload(reloadType: ReloadType) = viewModelScope.launch { + when (reloadType) { + Songs -> _songs.value = loadSongs.await() + Albums -> _albums.value = loadAlbums.await() + Artists -> _artists.value = loadArtists.await() + HomeSections -> _songs.value = loadSongs.await() + } + } + + override fun onMediaStoreChanged() { + loadLibraryContent() + } + + override fun onServiceConnected() {} + override fun onServiceDisconnected() {} + override fun onQueueChanged() {} + override fun onPlayingMetaChanged() {} + override fun onPlayStateChanged() {} + override fun onRepeatModeChanged() {} + override fun onShuffleModeChanged() {} +} + +enum class ReloadType { + Songs, + Albums, + Artists, + HomeSections +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt index 337e257db..17c3c9f01 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/MiniPlayerFragment.kt @@ -11,15 +11,18 @@ import android.view.* import android.view.animation.DecelerateInterpolator import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.textColorPrimary import code.name.monkey.retromusic.extensions.textColorSecondary import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment +import code.name.monkey.retromusic.glide.SongGlideRequest import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.ViewUtil +import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.fragment_mini_player.* import kotlin.math.abs @@ -54,15 +57,16 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpda setUpMiniPlayer() if (RetroUtil.isTablet()) { - actionNext.visibility = View.VISIBLE - actionPrevious.visibility = View.VISIBLE - actionNext?.visibility = View.VISIBLE - actionPrevious?.visibility = View.VISIBLE + actionNext.show() + actionPrevious.show() + actionNext?.show() + actionPrevious?.show() + } else { actionNext.visibility = - if (PreferenceUtil.getInstance(requireContext()).isExtraControls) View.VISIBLE else View.GONE + if (PreferenceUtilKT.isExtraControls) View.VISIBLE else View.GONE actionPrevious.visibility = - if (PreferenceUtil.getInstance(requireContext()).isExtraControls) View.VISIBLE else View.GONE + if (PreferenceUtilKT.isExtraControls) View.VISIBLE else View.GONE } actionNext.setOnClickListener(this) actionPrevious.setOnClickListener(this) @@ -93,6 +97,19 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpda miniPlayerTitle.isSelected = true miniPlayerTitle.text = builder + + if (RetroUtil.isTablet()) { + image?.let { + SongGlideRequest.Builder.from( + Glide.with(requireContext()), + MusicPlayerRemote.currentSong + ).checkIgnoreMediaStore(requireContext()) + .ignoreMediaStore(PreferenceUtilKT.isAllowedToDownloadMetadata()) + .asBitmap() + .build() + .into(it) + } + } } override fun onServiceConnected() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/VolumeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/VolumeFragment.kt index 2043617e7..59bf24dda 100755 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/VolumeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/VolumeFragment.kt @@ -14,7 +14,7 @@ import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.applyColor import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.volume.AudioVolumeObserver import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener import kotlinx.android.synthetic.main.fragment_volume.* @@ -113,11 +113,10 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum } private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) { - if (PreferenceUtil.getInstance(requireContext()) - .pauseOnZeroVolume() - ) if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume) { - MusicPlayerRemote.pauseSong() - } + if (PreferenceUtilKT.isPauseOnZeroVolume) + if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume) + MusicPlayerRemote.pauseSong() + } fun setTintableColor(color: Int) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumViewModel.kt deleted file mode 100644 index 7c3260e6e..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumViewModel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package code.name.monkey.retromusic.fragments.albums - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result -import code.name.monkey.retromusic.model.Album -import code.name.monkey.retromusic.providers.RepositoryImpl -import kotlinx.coroutines.launch - -class AlbumViewModel(application: Application) : AndroidViewModel(application) { - var albums = MutableLiveData>() - - init { - getAlbums() - } - - fun getAlbums() = viewModelScope.launch { - val result = RepositoryImpl(getApplication()).allAlbums() - if (result is Result.Success) { - albums.value = result.data - }else { - albums.value = listOf() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt index 0ba59b98f..86028dfd0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt @@ -3,29 +3,28 @@ package code.name.monkey.retromusic.fragments.albums import android.os.Bundle import android.view.View import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.album.AlbumAdapter +import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment(), MainActivityFragmentCallbacks { - private lateinit var albumViewModel: AlbumViewModel override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - albumViewModel = ViewModelProvider(this).get(AlbumViewModel::class.java) - albumViewModel.albums.observe(viewLifecycleOwner, Observer { albums -> - if (albums.isNotEmpty()) - adapter?.swapDataSet(albums) - else - adapter?.swapDataSet(listOf()) - }) + mainActivity.libraryViewModel.allAlbums() + .observe(viewLifecycleOwner, Observer { albums -> + if (albums.isNotEmpty()) + adapter?.swapDataSet(albums) + else + adapter?.swapDataSet(listOf()) + }) } override val emptyMessage: Int @@ -51,45 +50,39 @@ class AlbumsFragment : } override fun loadSortOrder(): String { - return PreferenceUtil.getInstance(requireContext()).albumSortOrder + return PreferenceUtilKT.albumSortOrder } override fun saveSortOrder(sortOrder: String) { - PreferenceUtil.getInstance(requireContext()).albumSortOrder = sortOrder + PreferenceUtilKT.albumSortOrder = sortOrder } override fun loadGridSize(): Int { - return PreferenceUtil.getInstance(requireContext()).getAlbumGridSize(requireContext()) + return PreferenceUtilKT.albumGridSize } override fun saveGridSize(gridColumns: Int) { - PreferenceUtil.getInstance(requireContext()).setAlbumGridSize(gridColumns) + PreferenceUtilKT.albumGridSize = gridColumns } override fun loadGridSizeLand(): Int { - return PreferenceUtil.getInstance(requireContext()).getAlbumGridSizeLand(requireContext()) + return PreferenceUtilKT.albumGridSizeLand } override fun saveGridSizeLand(gridColumns: Int) { - PreferenceUtil.getInstance(requireContext()).setAlbumGridSizeLand(gridColumns) - } - - override fun onMediaStoreChanged() { - albumViewModel.getAlbums() + PreferenceUtilKT.albumGridSizeLand = gridColumns } override fun setSortOrder(sortOrder: String) { - albumViewModel.getAlbums() + mainActivity.libraryViewModel.forceReload(ReloadType.Albums) } - override fun loadLayoutRes(): Int { - println("loadLayoutRes ${PreferenceUtil.getInstance(requireContext()).albumGridStyle}") - return PreferenceUtil.getInstance(requireContext()).albumGridStyle + return PreferenceUtilKT.albumGridStyle } override fun saveLayoutRes(layoutRes: Int) { - PreferenceUtil.getInstance(requireContext()).albumGridStyle = layoutRes + PreferenceUtilKT.albumGridStyle = layoutRes } override fun handleBackPress(): Boolean { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistViewModel.kt deleted file mode 100644 index 9a5d7e40c..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistViewModel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package code.name.monkey.retromusic.fragments.artists - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result -import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.providers.RepositoryImpl -import kotlinx.coroutines.launch - -class ArtistViewModel(application: Application) : AndroidViewModel(application) { - var artists = MutableLiveData>() - - init { - loadArtists() - } - - fun loadArtists() = viewModelScope.launch { - val result = RepositoryImpl(getApplication()).allArtists() - if (result is Result.Success) { - artists.value = result.data - } else { - artists.value = listOf() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt index 34385c5b5..4db951934 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt @@ -3,31 +3,27 @@ package code.name.monkey.retromusic.fragments.artists import android.os.Bundle import android.view.View import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.artist.ArtistAdapter +import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT class ArtistsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment(), MainActivityFragmentCallbacks { - - lateinit var artistViewModel: ArtistViewModel - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - artistViewModel = ViewModelProvider(this).get(ArtistViewModel::class.java) - artistViewModel.artists.observe(viewLifecycleOwner, Observer { artists -> - if (artists.isNotEmpty()) { - adapter?.swapDataSet(artists) - } else { - adapter?.swapDataSet(listOf()) - } - }) + mainActivity.libraryViewModel.allArtists().observe( + viewLifecycleOwner, Observer { artists -> + if (artists.isNotEmpty()) { + adapter?.swapDataSet(artists) + } else { + adapter?.swapDataSet(listOf()) + } + }) } override fun handleBackPress(): Boolean { @@ -37,12 +33,8 @@ class ArtistsFragment : override val emptyMessage: Int get() = R.string.no_artists - override fun onMediaStoreChanged() { - artistViewModel.loadArtists() - } - override fun setSortOrder(sortOrder: String) { - artistViewModel.loadArtists() + mainActivity.libraryViewModel.forceReload(ReloadType.Artists) } override fun createLayoutManager(): GridLayoutManager { @@ -60,19 +52,19 @@ class ArtistsFragment : } override fun loadGridSize(): Int { - return PreferenceUtil.getInstance(requireContext()).getArtistGridSize(requireActivity()) + return PreferenceUtilKT.artistGridSize } override fun saveGridSize(gridColumns: Int) { - PreferenceUtil.getInstance(requireContext()).setArtistGridSize(gridColumns) + PreferenceUtilKT.artistGridSize = gridColumns } override fun loadGridSizeLand(): Int { - return PreferenceUtil.getInstance(requireContext()).getArtistGridSizeLand(requireActivity()) + return PreferenceUtilKT.artistGridSizeLand } override fun saveGridSizeLand(gridColumns: Int) { - PreferenceUtil.getInstance(requireContext()).setArtistGridSizeLand(gridColumns) + PreferenceUtilKT.artistGridSizeLand = gridColumns } override fun setGridSize(gridSize: Int) { @@ -81,19 +73,19 @@ class ArtistsFragment : } override fun loadSortOrder(): String { - return PreferenceUtil.getInstance(requireContext()).artistSortOrder + return PreferenceUtilKT.artistSortOrder } override fun saveSortOrder(sortOrder: String) { - PreferenceUtil.getInstance(requireContext()).artistSortOrder = sortOrder + PreferenceUtilKT.artistSortOrder = sortOrder } override fun loadLayoutRes(): Int { - return PreferenceUtil.getInstance(requireContext()).artistGridStyle + return PreferenceUtilKT.artistGridStyle } override fun saveLayoutRes(layoutRes: Int) { - PreferenceUtil.getInstance(requireContext()).artistGridStyle = layoutRes + PreferenceUtilKT.artistGridStyle = layoutRes } companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt index 2ef27d5f5..2060cef58 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt @@ -6,8 +6,10 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.NonNull import androidx.annotation.StringRes +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.RecyclerView import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.DensityUtil import code.name.monkey.retromusic.util.ThemedFastScroller.create @@ -20,6 +22,7 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder abstract class AbsLibraryPagerRecyclerViewFragment, LM : RecyclerView.LayoutManager> : AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener { + protected var adapter: A? = null protected var layoutManager: LM? = null @@ -90,6 +93,8 @@ abstract class AbsLibraryPagerRecyclerViewFragment, } } + + private fun initLayoutManager() { layoutManager = createLayoutManager() } @@ -104,7 +109,7 @@ abstract class AbsLibraryPagerRecyclerViewFragment, container.paddingLeft, container.paddingTop, container.paddingRight, - mainActivity.totalAppBarScrollingRange + i + mainActivity.getTotalAppBarScrollingRange() + i ) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt index f9e8e5b62..48794563d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt @@ -7,7 +7,8 @@ import android.view.animation.DecelerateInterpolator import code.name.monkey.retromusic.R import code.name.monkey.retromusic.fragments.VolumeFragment import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor /** @@ -62,10 +63,12 @@ abstract class AbsPlayerControlsFragment : AbsMusicServiceFragment(), protected var volumeFragment: VolumeFragment? = null private fun hideVolumeIfAvailable() { - if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { - childFragmentManager.beginTransaction().replace(R.id.volumeFragmentContainer, VolumeFragment()).commit() + if (PreferenceUtilKT.isVolumeVisibilityMode) { + childFragmentManager.beginTransaction() + .replace(R.id.volumeFragmentContainer, VolumeFragment()).commit() childFragmentManager.executePendingTransactions() - volumeFragment = childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment? + volumeFragment = + childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment? } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt index 69350cff5..b6d6d45f7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt @@ -255,7 +255,7 @@ abstract class AbsPlayerFragment : AbsMusicServiceFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (PreferenceUtil.getInstance(requireContext()).fullScreenMode && + if (PreferenceUtilKT.isFullScreenMode && view.findViewById(R.id.status_bar) != null ) { view.findViewById(R.id.status_bar).visibility = View.GONE diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreViewModel.kt deleted file mode 100644 index e737a1a18..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreViewModel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package code.name.monkey.retromusic.fragments.genres - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result.Success -import code.name.monkey.retromusic.model.Genre -import code.name.monkey.retromusic.providers.RepositoryImpl -import kotlinx.coroutines.launch - -class GenreViewModel(application: Application) : AndroidViewModel(application) { - var genres = MutableLiveData>() - - init { - loadGenre() - } - - fun loadGenre() = viewModelScope.launch { - val result = RepositoryImpl(getApplication()).allGenres() - if (result is Success) { - genres.value = result.data - }else { - genres.value = listOf() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt index 2541365e5..6c10551c4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenresFragment.kt @@ -17,7 +17,6 @@ package code.name.monkey.retromusic.fragments.genres import android.os.Bundle import android.view.View import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R @@ -28,8 +27,6 @@ import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks class GenresFragment : AbsLibraryPagerRecyclerViewFragment(), MainActivityFragmentCallbacks { - lateinit var genreViewModel: GenreViewModel - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) App.musicComponent.inject(this) @@ -37,14 +34,14 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment - if (genres.isNotEmpty()) { - adapter?.swapDataSet(genres) - } else { - adapter?.swapDataSet(listOf()) - } - }) + mainActivity.libraryViewModel.allGenres().observe( + viewLifecycleOwner, Observer { genres -> + if (genres.isNotEmpty()) { + adapter?.swapDataSet(genres) + } else { + adapter?.swapDataSet(listOf()) + } + }) } override fun handleBackPress(): Boolean { @@ -63,10 +60,6 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment - homeAdapter.swapData(sections) - }) + + mainActivity.libraryViewModel.homeSections() + .observe(viewLifecycleOwner, Observer { sections -> + homeAdapter.swapData(sections) + }) + loadProfile() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeViewModel.kt deleted file mode 100644 index aa1929853..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeViewModel.kt +++ /dev/null @@ -1,36 +0,0 @@ -package code.name.monkey.retromusic.fragments.home - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result -import code.name.monkey.retromusic.model.Home -import code.name.monkey.retromusic.providers.RepositoryImpl -import kotlinx.coroutines.launch - -class HomeViewModel(application: Application) : AndroidViewModel(application) { - var sections = MutableLiveData>() - var repository: RepositoryImpl = RepositoryImpl(getApplication()) - - init { - loadHome() - } - - private fun loadHome() = viewModelScope.launch { - val list = mutableListOf() - val result = listOf( - repository.topArtists(), - repository.topAlbums(), - repository.recentArtists(), - repository.recentAlbums(), - repository.favoritePlaylist() - ) - for (r in result) { - if (r is Result.Success) { - list.add(r.data) - } - } - sections.value = list - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java index e87eb2aaa..679e5d91e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java @@ -68,7 +68,7 @@ import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader; import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.util.DensityUtil; import code.name.monkey.retromusic.util.FileUtil; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.ThemedFastScroller; import code.name.monkey.retromusic.views.BreadCrumbLayout; @@ -134,7 +134,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements } public static FoldersFragment newInstance(Context context) { - return newInstance(PreferenceUtil.getInstance(context).getStartDirectory()); + return newInstance(PreferenceUtilKT.INSTANCE.getStartDirectory()); } private static File tryGetCanonicalFile(File file) { @@ -238,7 +238,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements getFileComparator())); return true; case R.id.action_set_as_start_directory: - PreferenceUtil.getInstance(requireContext()).setStartDirectory(file); + PreferenceUtilKT.INSTANCE.setStartDirectory(file); Toast.makeText(getActivity(), String.format(getString(R.string.new_start_directory), file.getPath()), Toast.LENGTH_SHORT).show(); @@ -341,7 +341,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements switch (item.getItemId()) { case R.id.action_go_to_start_directory: setCrumb(new BreadCrumbLayout.Crumb( - tryGetCanonicalFile(PreferenceUtil.getInstance(requireContext()).getStartDirectory())), true); + tryGetCanonicalFile(PreferenceUtilKT.INSTANCE.getStartDirectory())), true); return true; case R.id.action_scan: BreadCrumbLayout.Crumb crumb = getActiveCrumb(); diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index 9de1f3da9..e71dd96ae 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -13,7 +13,8 @@ import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.transform.CarousalPagerTransformer import code.name.monkey.retromusic.transform.ParallaxPagerTransformer -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_player_album_cover.* @@ -45,14 +46,14 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewPager.addOnPageChangeListener(this) - val nps = PreferenceUtil.getInstance(requireContext()).nowPlayingScreen + val nps = PreferenceUtilKT.nowPlayingScreen val metrics = resources.displayMetrics val ratio = metrics.heightPixels.toFloat() / metrics.widthPixels.toFloat() if (nps == Full || nps == Classic || nps == Fit || nps == Gradient) { viewPager.offscreenPageLimit = 2 - } else if (PreferenceUtil.getInstance(requireContext()).carouselEffect()) { + } else if (PreferenceUtilKT.isCarouselEffect) { viewPager.clipToPadding = false val padding = if (ratio >= 1.777f) { @@ -67,7 +68,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan viewPager.offscreenPageLimit = 2 viewPager.setPageTransformer( true, - PreferenceUtil.getInstance(requireContext()).albumCoverTransform + PreferenceUtilKT.albumCoverTransform ) } } @@ -122,9 +123,6 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan callbacks = listener } - fun removeEffect() { - viewPager.setPageTransformer(false, null) - } interface Callbacks { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt index 3046f80b5..1ed863328 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt @@ -25,7 +25,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_adaptive_player_playback_controls.* @@ -66,7 +67,7 @@ class AdaptivePlaybackControlsFragment : AbsPlayerControlsFragment() { } private fun updateSong() { - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo?.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.show() } else { @@ -130,7 +131,7 @@ class AdaptivePlaybackControlsFragment : AbsPlayerControlsFragment() { updatePrevNextColor() updatePlayPauseColor() - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt index 977c2311a..facbe6744 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt @@ -25,21 +25,9 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.* -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.nextButton -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.playPauseButton -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.previousButton -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.progressSlider -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.repeatButton -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.shuffleButton -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.songCurrentProgress -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.songInfo -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.songTotalTime -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.text -import kotlinx.android.synthetic.main.fragment_blur_player_playback_controls.title -import kotlinx.android.synthetic.main.fragment_player_playback_controls.* class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() { @@ -81,7 +69,7 @@ class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() { title.text = song.title text.text = String.format("%s • %s", song.artistName, song.albumName) - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.show() songInfo?.text = getSongInfo(song) } else { 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 ecec1a3fb..5457004cf 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 @@ -9,6 +9,7 @@ import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.preference.PreferenceManager import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.retromusic.NEW_BLUR_AMOUNT import code.name.monkey.retromusic.R import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment @@ -17,7 +18,6 @@ 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 import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.fragment_blur.* @@ -98,7 +98,7 @@ class BlurPlayerFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPrefer private fun updateBlur() { val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getInt(PreferenceUtil.NEW_BLUR_AMOUNT, 25) + .getInt(NEW_BLUR_AMOUNT, 25) colorBackground.clearColorFilter() SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) .checkIgnoreMediaStore(requireContext()) @@ -141,7 +141,7 @@ class BlurPlayerFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPrefer } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == PreferenceUtil.NEW_BLUR_AMOUNT) { + if (key == NEW_BLUR_AMOUNT) { updateBlur() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt index a531b2ec7..ef58fe015 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt @@ -24,7 +24,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_card_player_playback_controls.* import kotlinx.android.synthetic.main.media_button.* @@ -68,7 +69,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() { title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.show() } else { @@ -111,7 +112,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() { } override fun setColor(color: MediaNotificationProcessor) { - if (ATHUtil.isWindowBackgroundDark(requireContext()) + if (!ATHUtil.isWindowBackgroundDark(requireContext()) ) { lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(activity, true) lastDisabledPlaybackControlsColor = @@ -128,7 +129,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() { updatePlayPauseColor() updateProgressTextColor() - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()).ripAlpha() 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 90b25e168..e1b1ab237 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 @@ -9,6 +9,7 @@ import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.preference.PreferenceManager import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.retromusic.NEW_BLUR_AMOUNT import code.name.monkey.retromusic.R import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment @@ -18,7 +19,7 @@ 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 + import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.fragment_card_blur_player.* @@ -88,12 +89,9 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen private fun setUpSubFragments() { playbackControlsFragment = childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as CardBlurPlaybackControlsFragment - val playerAlbumCoverFragment = - childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment? - if (playerAlbumCoverFragment != null) { - playerAlbumCoverFragment.setCallbacks(this) - playerAlbumCoverFragment.removeEffect() - } + (childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment?)?.setCallbacks( + this + ) } private fun setUpPlayerToolbar() { @@ -128,7 +126,7 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen private fun updateBlur() { val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getInt(PreferenceUtil.NEW_BLUR_AMOUNT, 25) + .getInt(NEW_BLUR_AMOUNT, 25) colorBackground!!.clearColorFilter() SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) .checkIgnoreMediaStore(requireContext()) @@ -160,7 +158,7 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == PreferenceUtil.NEW_BLUR_AMOUNT) { + if (key == NEW_BLUR_AMOUNT) { updateBlur() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt index 8e15b1274..991e98a6c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt @@ -23,7 +23,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_card_blur_player_playback_controls.* import kotlinx.android.synthetic.main.media_button.* @@ -113,7 +114,7 @@ class CardBlurPlaybackControlsFragment : AbsPlayerControlsFragment() { } private fun updateSong() { - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index dde68dfe4..4c982d799 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -44,7 +44,8 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.views.SeekArc @@ -195,7 +196,7 @@ class CirclePlayerFragment : AbsPlayerFragment(), Callback, OnAudioVolumeChanged title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt index f309bf134..0e7936bb8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt @@ -36,7 +36,8 @@ import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -154,7 +155,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(), View.OnLayoutChangeListener, } private fun hideVolumeIfAvailable() { - if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { + if (PreferenceUtilKT.isVolumeVisibilityMode) { childFragmentManager.beginTransaction() .replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance()) .commit() @@ -185,7 +186,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(), View.OnLayoutChangeListener, title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt index 1b0ed49c7..42bd2dd69 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt @@ -23,7 +23,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_color_player_playback_controls.* @@ -68,7 +69,7 @@ class ColorPlaybackControlsFragment : AbsPlayerControlsFragment() { title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt index 76b074201..9490461dd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitFragment.kt @@ -82,10 +82,9 @@ class FitFragment : AbsPlayerFragment() { private fun setUpSubFragments() { playbackControlsFragment = childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as FitPlaybackControlsFragment - val playerAlbumCoverFragment: PlayerAlbumCoverFragment = + val playerAlbumCoverFragment = childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment playerAlbumCoverFragment.setCallbacks(this) - playerAlbumCoverFragment.removeEffect() } private fun setUpPlayerToolbar() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt index 25889891a..496d20ee6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt @@ -26,7 +26,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_fit_playback_controls.* @@ -71,7 +72,7 @@ class FitPlaybackControlsFragment : AbsPlayerControlsFragment() { val song = MusicPlayerRemote.currentSong title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { @@ -126,7 +127,7 @@ class FitPlaybackControlsFragment : AbsPlayerControlsFragment() { MaterialValueHelper.getPrimaryDisabledTextColor(activity, false) } - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()).ripAlpha() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt index ac604dc4d..2b9f167e5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt @@ -27,7 +27,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_flat_player_playback_controls.* @@ -95,7 +96,7 @@ class FlatPlaybackControlsFragment : AbsPlayerControlsFragment(), Callback { MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) } - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()).ripAlpha() @@ -165,7 +166,7 @@ class FlatPlaybackControlsFragment : AbsPlayerControlsFragment(), Callback { val song = MusicPlayerRemote.currentSong title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt index 77e651071..af75154ea 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlayerFragment.kt @@ -17,7 +17,8 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.views.DrawableGradient @@ -98,7 +99,7 @@ class FlatPlayerFragment : AbsPlayerFragment() { override fun toolbarIconColor(): Int { val isLight = ColorUtil.isColorLight(paletteColor) - return if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) + return if (PreferenceUtilKT.isAdaptiveColor) MaterialValueHelper.getPrimaryTextColor(requireContext(), isLight) else ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal) @@ -109,12 +110,12 @@ class FlatPlayerFragment : AbsPlayerFragment() { controlsFragment.setColor(color) callbacks?.onPaletteColorChanged() val isLight = ColorUtil.isColorLight(color.backgroundColor) - val iconColor = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) + val iconColor = if (PreferenceUtilKT.isAdaptiveColor) MaterialValueHelper.getPrimaryTextColor(requireContext(), isLight) else ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal) ToolbarContentTintHelper.colorizeToolbar(playerToolbar, iconColor, requireActivity()) - if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + if (PreferenceUtilKT.isAdaptiveColor) { colorize(color.backgroundColor) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index 3dd842520..417023d7a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -29,7 +29,8 @@ import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_full_player_controls.* @@ -128,7 +129,7 @@ class FullPlaybackControlsFragment : AbsPlayerControlsFragment(), title.text = song.title text.text = song.artistName updateIsFavorite() - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index e32242c9f..161bbe871 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -38,7 +38,8 @@ import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -207,7 +208,7 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe container.setBackgroundColor(ColorUtil.darkenColor(color.backgroundColor)) lastPlaybackControlsColor = color.primaryTextColor - lastDisabledPlaybackControlsColor = color.secondaryTextColor + lastDisabledPlaybackControlsColor = ColorUtil.withAlpha(color.primaryTextColor, 0.3f) title.setTextColor(lastPlaybackControlsColor) text.setTextColor(lastDisabledPlaybackControlsColor) @@ -243,7 +244,7 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe } private fun hideVolumeIfAvailable() { - if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { + if (PreferenceUtilKT.isVolumeVisibilityMode) { childFragmentManager.beginTransaction() .replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance()) .commit() @@ -284,7 +285,7 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe title.text = song.title text.text = song.artistName updateLabel() - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { @@ -304,9 +305,9 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe private fun updatePlayPauseDrawableState() { if (MusicPlayerRemote.isPlaying) { - playPauseButton.setImageResource(R.drawable.ic_pause_sharp_white_64dp) + playPauseButton.setImageResource(R.drawable.ic_pause_white_64dp) } else { - playPauseButton.setImageResource(R.drawable.ic_play_arrow_sharp_white_64dp) + playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_64dp) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenPlayerControlsFragment.kt index 0243cd58f..97a1590ad 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenPlayerControlsFragment.kt @@ -38,7 +38,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_lock_screen_playback_controls.* @@ -125,7 +126,7 @@ class LockScreenPlayerControlsFragment : AbsPlayerControlsFragment() { MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) } - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { textColorSecondary() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt index f786f24ef..e112cd981 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt @@ -19,7 +19,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_material_playback_controls.* @@ -56,7 +57,7 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() { title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { @@ -113,7 +114,7 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() { updateRepeatState() updateShuffleState() - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { lastPlaybackControlsColor } else { textColorSecondary() 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 9dc0b2a85..6de1075a5 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 @@ -15,7 +15,8 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.views.DrawableGradient @@ -85,7 +86,7 @@ class PlayerFragment : AbsPlayerFragment() { requireActivity() ) - if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + if (PreferenceUtilKT.isAdaptiveColor) { colorize(color.backgroundColor) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt index 51ca41282..865d9082a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt @@ -26,7 +26,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_player_playback_controls.* @@ -77,7 +78,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment() { MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) } - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()) @@ -104,7 +105,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment() { title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerControlFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerControlFragment.kt index 8f71d9082..60507b555 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerControlFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerControlFragment.kt @@ -36,7 +36,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_peak_control_player.* @@ -89,7 +90,7 @@ class PeakPlayerControlFragment : AbsPlayerControlsFragment() { override fun setColor(color: MediaNotificationProcessor) { val controlsColor = - if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerFragment.kt index 96ee263f3..f1298949a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peak/PeakPlayerFragment.kt @@ -27,7 +27,8 @@ import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_peak_player.* @@ -113,7 +114,7 @@ class PeakPlayerFragment : AbsPlayerFragment() { title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt index bd9b7bec8..ef4194cd4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt @@ -26,7 +26,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_adaptive_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_plain_controls_fragment.nextButton @@ -73,7 +74,7 @@ class PlainPlaybackControlsFragment : AbsPlayerControlsFragment() { } private fun updateSong() { - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.show() } else { @@ -156,7 +157,7 @@ class PlainPlaybackControlsFragment : AbsPlayerControlsFragment() { MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) } - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt index df082ae99..03856f0fe 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt @@ -20,7 +20,8 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_simple_controls_fragment.* @@ -155,7 +156,7 @@ class SimplePlaybackControlsFragment : AbsPlayerControlsFragment() { title.text = song.title text.text = song.artistName - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { @@ -212,7 +213,7 @@ class SimplePlaybackControlsFragment : AbsPlayerControlsFragment() { MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) } - val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) { color.primaryTextColor } else { ThemeStore.accentColor(requireContext()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt index bdd7ddf68..1c992a319 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/tiny/TinyPlayerFragment.kt @@ -21,7 +21,8 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT + import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import kotlinx.android.synthetic.main.fragment_tiny_player.* @@ -102,7 +103,7 @@ class TinyPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Ca title.text = song.title text.text = String.format("%s \nby - %s", song.albumName, song.artistName) - if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + if (PreferenceUtilKT.isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistViewModel.kt deleted file mode 100644 index 71d8df24c..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistViewModel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package code.name.monkey.retromusic.fragments.playlists - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result -import code.name.monkey.retromusic.model.Playlist -import code.name.monkey.retromusic.providers.RepositoryImpl -import kotlinx.coroutines.launch - -class PlaylistViewModel(application: Application) : AndroidViewModel(application) { - var playlists = MutableLiveData>() - - init { - loadPlaylist() - } - - fun loadPlaylist() = viewModelScope.launch { - val result = RepositoryImpl(getApplication()).allPlaylists() - if (result is Result.Success) { - playlists.value = result.data - } else { - playlists.value = listOf() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt index 98443c71a..962e3200d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt @@ -5,7 +5,6 @@ import android.view.Menu import android.view.MenuInflater import android.view.View import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter @@ -16,18 +15,17 @@ class PlaylistsFragment : AbsLibraryPagerRecyclerViewFragment(), MainActivityFragmentCallbacks { - lateinit var playlistViewModel: PlaylistViewModel override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - playlistViewModel = ViewModelProvider(this).get(PlaylistViewModel::class.java) - playlistViewModel.playlists.observe(viewLifecycleOwner, Observer { playlists -> - if (playlists.isNotEmpty()) { - adapter?.swapDataSet(playlists) - } else { - adapter?.swapDataSet(listOf()) - } - }) + mainActivity.libraryViewModel.allPlaylisits() + .observe(viewLifecycleOwner, Observer { playlists -> + if (playlists.isNotEmpty()) { + adapter?.swapDataSet(playlists) + } else { + adapter?.swapDataSet(listOf()) + } + }) } override fun handleBackPress(): Boolean { @@ -50,11 +48,6 @@ class PlaylistsFragment : ) } - override fun onMediaStoreChanged() { - super.onMediaStoreChanged() - playlistViewModel.loadPlaylist() - } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) menu.apply { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt index 225f936f4..4c323310a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt @@ -19,11 +19,10 @@ import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.View import android.widget.Toast -import androidx.fragment.app.DialogFragment import androidx.preference.ListPreference import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager -import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.preferences.* @@ -33,7 +32,7 @@ import code.name.monkey.retromusic.util.NavigationUtil * @author Hemanth S (h4h13). */ -abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() { +abstract class AbsSettingsFragment : PreferenceFragmentCompat() { internal fun showProToastAndNavigate(message: String) { Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT) @@ -73,16 +72,25 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() { invalidateSettings() } - override fun onCreatePreferenceDialog(preference: Preference): DialogFragment? { - return when (preference) { - is LibraryPreference -> LibraryPreferenceDialog.newInstance(preference.key) - is NowPlayingScreenPreference -> NowPlayingScreenPreferenceDialog.newInstance(preference.key) - is AlbumCoverStylePreference -> AlbumCoverStylePreferenceDialog.newInstance(preference.key) - is MaterialListPreference -> { - MaterialListPreferenceDialog.newInstance(preference) + override fun onDisplayPreferenceDialog(preference: Preference?) { + when (preference) { + is LibraryPreference -> { + val fragment = LibraryPreferenceDialog.newInstance() + fragment.show(childFragmentManager, preference.key) } - is BlacklistPreference -> BlacklistPreferenceDialog.newInstance() - else -> super.onCreatePreferenceDialog(preference) + is NowPlayingScreenPreference -> { + val fragment = NowPlayingScreenPreferenceDialog.newInstance() + fragment.show(childFragmentManager, preference.key) + } + is AlbumCoverStylePreference -> { + val fragment = AlbumCoverStylePreferenceDialog.newInstance() + fragment.show(childFragmentManager, preference.key) + } + is BlacklistPreference -> { + val fragment = BlacklistPreferenceDialog.newInstance() + fragment.show(childFragmentManager, preference.key) + } + else -> super.onDisplayPreferenceDialog(preference) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt index 43a4245de..be06d30da 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt @@ -20,7 +20,7 @@ import android.os.Bundle import androidx.preference.Preference import code.name.monkey.retromusic.R import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil + /** * @author Hemanth S (h4h13). @@ -29,7 +29,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil class AudioSettings : AbsSettingsFragment() { override fun invalidateSettings() { val findPreference: Preference = findPreference("equalizer")!! - if (!hasEqualizer() && PreferenceUtil.getInstance(requireContext()).selectedEqualizer != "retro") { + if (!hasEqualizer()) { findPreference.isEnabled = false findPreference.summary = resources.getString(R.string.no_equalizer) } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt index 63458bbc5..e7f99cc33 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt @@ -20,8 +20,9 @@ import android.os.Build.VERSION_CODES import android.os.Bundle import androidx.preference.Preference import androidx.preference.TwoStatePreference +import code.name.monkey.retromusic.CLASSIC_NOTIFICATION import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT /** @@ -31,7 +32,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil class NotificationSettingsFragment : AbsSettingsFragment(), SharedPreferences.OnSharedPreferenceChangeListener { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == PreferenceUtil.CLASSIC_NOTIFICATION) { + if (key == CLASSIC_NOTIFICATION) { if (VERSION.SDK_INT >= VERSION_CODES.O) { findPreference("colored_notification")?.isEnabled = sharedPreferences?.getBoolean(key, false)!! @@ -46,11 +47,10 @@ class NotificationSettingsFragment : AbsSettingsFragment(), classicNotification?.isVisible = false } else { classicNotification?.apply { - isChecked = PreferenceUtil.getInstance(requireContext()).classicNotification() + isChecked = PreferenceUtilKT.isClassicNotification setOnPreferenceChangeListener { _, newValue -> // Save preference - PreferenceUtil.getInstance(requireContext()) - .setClassicNotification(newValue as Boolean) + PreferenceUtilKT.isClassicNotification = newValue as Boolean invalidateSettings() true } @@ -59,14 +59,12 @@ class NotificationSettingsFragment : AbsSettingsFragment(), val coloredNotification: TwoStatePreference? = findPreference("colored_notification") if (VERSION.SDK_INT >= VERSION_CODES.O) { - coloredNotification?.isEnabled = - PreferenceUtil.getInstance(requireContext()).classicNotification() + coloredNotification?.isEnabled = PreferenceUtilKT.isClassicNotification } else { coloredNotification?.apply { - isChecked = PreferenceUtil.getInstance(requireContext()).coloredNotification() + isChecked = PreferenceUtilKT.isColoredNotification setOnPreferenceChangeListener { _, newValue -> - PreferenceUtil.getInstance(requireContext()) - .setColoredNotification(newValue as Boolean) + PreferenceUtilKT.isColoredNotification = newValue as Boolean true } } @@ -75,13 +73,12 @@ class NotificationSettingsFragment : AbsSettingsFragment(), override fun onResume() { super.onResume() - PreferenceUtil.getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this) + PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this) } override fun onDestroyView() { super.onDestroyView() - PreferenceUtil.getInstance(requireContext()) - .unregisterOnSharedPreferenceChangedListener(this) + PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt index e1fedc947..cc032d19e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt @@ -19,9 +19,8 @@ import android.os.Bundle import android.view.View import androidx.preference.Preference import androidx.preference.TwoStatePreference -import code.name.monkey.retromusic.App -import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil.* +import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.util.PreferenceUtilKT /** * @author Hemanth S (h4h13). @@ -50,24 +49,24 @@ class NowPlayingSettingsFragment : AbsSettingsFragment(), private fun updateAlbumCoverStyleSummary() { val preference: Preference = findPreference(ALBUM_COVER_STYLE)!! - preference.setSummary(getInstance(requireContext()).albumCoverStyle.titleRes) + preference.setSummary(PreferenceUtilKT.albumCoverStyle.titleRes) } private fun updateNowPlayingScreenSummary() { val preference: Preference = findPreference(NOW_PLAYING_SCREEN_ID)!! - preference.setSummary(getInstance(requireContext()).nowPlayingScreen.titleRes) + preference.setSummary(PreferenceUtilKT.nowPlayingScreen.titleRes) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this) + PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this) val preference: Preference = findPreference("album_cover_transform")!! setSummary(preference) } override fun onDestroyView() { super.onDestroyView() - getInstance(requireContext()).unregisterOnSharedPreferenceChangedListener(this) + PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt index 6877c7140..bac4ba930 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt @@ -19,8 +19,10 @@ import android.os.Bundle import android.view.View import androidx.preference.Preference import androidx.preference.TwoStatePreference +import code.name.monkey.retromusic.CAROUSEL_EFFECT import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT class PersonalizeSettingsFragment : AbsSettingsFragment(), SharedPreferences.OnSharedPreferenceChangeListener { @@ -40,7 +42,7 @@ class PersonalizeSettingsFragment : AbsSettingsFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - PreferenceUtil.getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this) + PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this) var preference: Preference? = findPreference("home_artist_grid_style") setSummary(preference!!) @@ -50,13 +52,12 @@ class PersonalizeSettingsFragment : AbsSettingsFragment(), override fun onDestroyView() { super.onDestroyView() - PreferenceUtil.getInstance(requireContext()) - .unregisterOnSharedPreferenceChangedListener(this) + PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { when (key) { - PreferenceUtil.CAROUSEL_EFFECT -> invalidateSettings() + CAROUSEL_EFFECT -> invalidateSettings() } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt index 679287eae..7471850cc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt @@ -26,9 +26,10 @@ import code.name.monkey.appthemehelper.common.prefs.supportv7.ATESwitchPreferenc import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.App +import code.name.monkey.retromusic.DESATURATED_COLOR import code.name.monkey.retromusic.R import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.color.colorChooser @@ -48,7 +49,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() { ThemeStore.markChanged(requireContext()) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme)) + requireActivity().setTheme(PreferenceUtilKT.themeResFromPrefValue(theme)) DynamicShortcutManager(requireContext()).updateDynamicShortcuts() } requireActivity().recreate() @@ -62,7 +63,6 @@ class ThemeSettingsFragment : AbsSettingsFragment() { accentColorPref.setOnPreferenceClickListener { MaterialDialog(requireActivity()).show { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) title(R.string.accent_color) positiveButton(R.string.set) colorChooser( @@ -75,7 +75,6 @@ class ThemeSettingsFragment : AbsSettingsFragment() { DynamicShortcutManager(requireContext()).updateDynamicShortcuts() requireActivity().recreate() - } } return@setOnPreferenceClickListener true @@ -88,22 +87,21 @@ class ThemeSettingsFragment : AbsSettingsFragment() { } ThemeStore.markChanged(requireContext()) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue("black")) + requireActivity().setTheme(PreferenceUtilKT.themeResFromPrefValue("black")) DynamicShortcutManager(requireContext()).updateDynamicShortcuts() } requireActivity().recreate() true } - val desaturatedColor: ATESwitchPreference? = - findPreference(PreferenceUtil.DESATURATED_COLOR) + val desaturatedColor: ATESwitchPreference? = findPreference(DESATURATED_COLOR) desaturatedColor?.setOnPreferenceChangeListener { _, value -> val desaturated = value as Boolean ThemeStore.prefs(requireContext()) .edit() .putBoolean("desaturated_color", desaturated) .apply() - PreferenceUtil.getInstance(requireContext()).setDesaturatedColor(desaturated) + PreferenceUtilKT.isDesaturatedColor = desaturated requireActivity().recreate() true } @@ -113,12 +111,9 @@ class ThemeSettingsFragment : AbsSettingsFragment() { if (!VersionUtils.hasNougatMR()) { colorAppShortcuts.isVisible = false } else { - colorAppShortcuts.isChecked = - PreferenceUtil.getInstance(requireContext()).coloredAppShortcuts() + colorAppShortcuts.isChecked = PreferenceUtilKT.isColoredAppShortcuts colorAppShortcuts.setOnPreferenceChangeListener { _, newValue -> - // Save preference - PreferenceUtil.getInstance(requireContext()) - .setColoredAppShortcuts(newValue as Boolean) + PreferenceUtilKT.isColoredAppShortcuts = newValue as Boolean DynamicShortcutManager(requireContext()).updateDynamicShortcuts() true } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index 4b2c0777f..add25fc4c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -4,41 +4,36 @@ import android.os.Bundle import android.view.View import androidx.annotation.LayoutRes import androidx.recyclerview.widget.GridLayoutManager -import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter import code.name.monkey.retromusic.adapter.song.SongAdapter +import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.mvp.presenter.SongPresenter import code.name.monkey.retromusic.mvp.presenter.SongView -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import java.util.* -import javax.inject.Inject class SongsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment(), SongView, MainActivityFragmentCallbacks { - - @Inject - lateinit var songPresenter: SongPresenter + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mainActivity.libraryViewModel.allSongs() + .observe(viewLifecycleOwner, androidx.lifecycle.Observer { + if (it.isNotEmpty()) { + adapter?.swapDataSet(it) + } else { + adapter?.swapDataSet(listOf()) + } + }) + } override val emptyMessage: Int get() = R.string.no_songs - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - App.musicComponent.inject(this) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - songPresenter.attachView(this) - } - override fun createLayoutManager(): GridLayoutManager { - println("createLayoutManager: ${getGridSize()}") return GridLayoutManager(requireActivity(), getGridSize()).apply { spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { @@ -66,79 +61,61 @@ class SongsFragment : adapter?.swapDataSet(songs) } - override fun onMediaStoreChanged() { - songPresenter.loadSongs() - } - override fun loadGridSize(): Int { - return PreferenceUtil.getInstance(requireContext()).getSongGridSize(requireContext()) + return PreferenceUtilKT.songGridSize } override fun saveGridSize(gridColumns: Int) { - PreferenceUtil.getInstance(requireContext()).setSongGridSize(gridColumns) + PreferenceUtilKT.songGridSize = gridColumns } override fun loadGridSizeLand(): Int { - return PreferenceUtil.getInstance(requireContext()).getSongGridSizeLand(requireContext()) + return PreferenceUtilKT.songGridSizeLand } override fun saveGridSizeLand(gridColumns: Int) { - PreferenceUtil.getInstance(requireContext()).setSongGridSizeLand(gridColumns) + PreferenceUtilKT.songGridSizeLand = gridColumns } override fun setGridSize(gridSize: Int) { adapter?.notifyDataSetChanged() } - override fun onResume() { - super.onResume() - if (adapter?.dataSet.isNullOrEmpty()) - songPresenter.loadSongs() - } - - override fun onDestroyView() { - super.onDestroyView() - songPresenter.detachView() - } - override fun showEmptyView() { adapter?.swapDataSet(ArrayList()) } override fun loadSortOrder(): String { - return PreferenceUtil.getInstance(requireContext()).songSortOrder + return PreferenceUtilKT.songSortOrder } override fun saveSortOrder(sortOrder: String) { - PreferenceUtil.getInstance(requireContext()).songSortOrder = sortOrder + PreferenceUtilKT.songSortOrder = sortOrder + } + + @LayoutRes + override fun loadLayoutRes(): Int { + return PreferenceUtilKT.songGridStyle + } + + override fun saveLayoutRes(@LayoutRes layoutRes: Int) { + PreferenceUtilKT.songGridStyle = layoutRes } override fun setSortOrder(sortOrder: String) { - songPresenter.loadSongs() + mainActivity.libraryViewModel.forceReload(ReloadType.Songs) } companion object { - @JvmField var TAG: String = SongsFragment::class.java.simpleName @JvmStatic fun newInstance(): SongsFragment { - val args = Bundle() - val fragment = SongsFragment() - fragment.arguments = args - return fragment + return SongsFragment() } } - @LayoutRes - override fun loadLayoutRes(): Int { - return PreferenceUtil.getInstance(requireContext()).songGridStyle - } - - override fun saveLayoutRes(@LayoutRes layoutRes: Int) { - PreferenceUtil.getInstance(requireContext()).songGridStyle = layoutRes - } override fun handleBackPress(): Boolean { return false diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt deleted file mode 100644 index 3a15ff2ff..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt +++ /dev/null @@ -1,27 +0,0 @@ -package code.name.monkey.retromusic.fragments.songs - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result.Success -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.providers.RepositoryImpl -import kotlinx.coroutines.launch - -class SongsViewModel(application: Application) : AndroidViewModel(application) { - var songs = MutableLiveData>() - - init { - loadSongs() - } - - fun loadSongs() = viewModelScope.launch { - val result = RepositoryImpl(getApplication()).allSongs() - if (result is Success) { - songs.value = result.data - } else { - songs.value = listOf() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/AlbumGlideRequest.java b/app/src/main/java/code/name/monkey/retromusic/glide/AlbumGlideRequest.java index 7b16ab0d6..6b90fab24 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/AlbumGlideRequest.java +++ b/app/src/main/java/code/name/monkey/retromusic/glide/AlbumGlideRequest.java @@ -20,7 +20,7 @@ import code.name.monkey.retromusic.glide.palette.BitmapPaletteTranscoder; import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper; import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.util.MusicUtil; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; public class AlbumGlideRequest { private static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE; @@ -70,7 +70,7 @@ public class AlbumGlideRequest { @NonNull public Builder checkIgnoreMediaStore(@NonNull Context context) { - return ignoreMediaStore(PreferenceUtil.getInstance(context).ignoreMediaStoreArtwork()); + return ignoreMediaStore(PreferenceUtilKT.INSTANCE.isIgnoreMediaStoreArtwork()); } @NonNull 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 6a4d67e39..fb9ad3c98 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 @@ -34,7 +34,7 @@ abstract class RetroMusicColoredTarget(view: ImageView) : BitmapPaletteTarget(vi override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { super.onLoadFailed(e, errorDrawable) - val colors = MediaNotificationProcessor(App.getContext(),errorDrawable) + val colors = MediaNotificationProcessor(App.getContext(), errorDrawable) onColorReady(colors) /* MediaNotificationProcessor(App.getContext()).getPaletteAsync({ onColorReady(it) diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/SongGlideRequest.java b/app/src/main/java/code/name/monkey/retromusic/glide/SongGlideRequest.java index fc718ebd9..10078d057 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/SongGlideRequest.java +++ b/app/src/main/java/code/name/monkey/retromusic/glide/SongGlideRequest.java @@ -34,7 +34,7 @@ import code.name.monkey.retromusic.glide.palette.BitmapPaletteTranscoder; import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper; import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.util.MusicUtil; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; /** * Created by hemanths on 2019-09-15. @@ -88,7 +88,7 @@ public class SongGlideRequest { @NonNull public Builder checkIgnoreMediaStore(@NonNull Context context) { - return ignoreMediaStore(PreferenceUtil.getInstance(context).ignoreMediaStoreArtwork()); + return ignoreMediaStore(PreferenceUtilKT.INSTANCE.isIgnoreMediaStoreArtwork()); } @NonNull diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt b/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt index 7c8e4f7a0..04aa2e226 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt @@ -18,7 +18,7 @@ import android.content.Context import code.name.monkey.retromusic.deezer.Data import code.name.monkey.retromusic.deezer.DeezerApiService import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import com.bumptech.glide.Priority import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader import com.bumptech.glide.load.data.DataFetcher @@ -62,9 +62,8 @@ class ArtistImageFetcher( } override fun loadData(priority: Priority?): InputStream? { - if (!MusicUtil.isArtistNameUnknown(model.artistName) && PreferenceUtil.isAllowedToDownloadMetadata( - context - ) + if (!MusicUtil.isArtistNameUnknown(model.artistName) && + PreferenceUtilKT.isAllowedToDownloadMetadata() ) { val artists = model.artistName.split(",") val response = deezerApiService.getArtistImage(artists[0]).execute() diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/EqualizerHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/EqualizerHelper.kt index 02ed03c46..4bb74e9f6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/EqualizerHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/EqualizerHelper.kt @@ -99,6 +99,7 @@ class EqualizerHelper private constructor() : EqualizerInterface { companion object { private val TAG = "EqualizerHelper" + @Volatile private var ourInstance: EqualizerHelper? = null diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index 44df37768..a84eebecf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -29,7 +29,8 @@ import androidx.core.content.ContextCompat import code.name.monkey.retromusic.loaders.SongLoader import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService -import code.name.monkey.retromusic.util.PreferenceUtil + +import code.name.monkey.retromusic.util.PreferenceUtilKT import java.io.File import java.util.* @@ -212,7 +213,7 @@ object MusicPlayerRemote { ) && musicService != null ) { musicService?.openQueue(queue, startPosition, startPlaying) - if (PreferenceUtil.getInstance(musicService).isShuffleModeOn) + if (PreferenceUtilKT.isShuffleModeOn) setShuffleMode(MusicService.SHUFFLE_MODE_NONE) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/SearchQueryHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/SearchQueryHelper.kt index 4273931ec..1efe9c57d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/SearchQueryHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/SearchQueryHelper.kt @@ -28,6 +28,7 @@ object SearchQueryHelper { private const val ARTIST_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.ARTIST + ") = ?" private const val AND = " AND " var songs = ArrayList() + @JvmStatic fun getSongs(context: Context, extras: Bundle): ArrayList { val query = extras.getString(SearchManager.QUERY, null) diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/AlbumLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/AlbumLoader.kt index 7971994d7..4694db17c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/AlbumLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/AlbumLoader.kt @@ -16,11 +16,10 @@ package code.name.monkey.retromusic.loaders import android.content.Context import android.provider.MediaStore.Audio.AudioColumns -import code.name.monkey.retromusic.App import code.name.monkey.retromusic.helper.SortOrder import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import java.util.* import kotlin.collections.ArrayList @@ -40,7 +39,7 @@ object AlbumLoader { context, AudioColumns.ALBUM + " LIKE ?", arrayOf("%$query%"), - getSongLoaderSortOrder(context) + getSongLoaderSortOrder() ) ) return splitIntoAlbums(songs) @@ -56,7 +55,7 @@ object AlbumLoader { context, AudioColumns.ALBUM_ID + "=?", arrayOf(albumId.toString()), - getSongLoaderSortOrder(context) + getSongLoaderSortOrder() ) ) val album = Album(songs) @@ -72,7 +71,7 @@ object AlbumLoader { context, null, null, - getSongLoaderSortOrder(context) + getSongLoaderSortOrder() ) ) return splitIntoAlbums(songs) @@ -108,7 +107,7 @@ object AlbumLoader { } private fun sortSongsByTrackNumber(album: Album) { - when (PreferenceUtil.getInstance(App.getContext()).albumDetailSongSortOrder) { + when (PreferenceUtilKT.albumDetailSongSortOrder) { SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST -> album.songs?.sortWith(Comparator { o1, o2 -> o1.trackNumber.compareTo( o2.trackNumber @@ -132,8 +131,8 @@ object AlbumLoader { } } - private fun getSongLoaderSortOrder(context: Context): String { - return PreferenceUtil.getInstance(context).albumSortOrder + ", " + - PreferenceUtil.getInstance(context).albumSongSortOrder + private fun getSongLoaderSortOrder(): String { + return PreferenceUtilKT.albumSortOrder + ", " + + PreferenceUtilKT.albumSongSortOrder } } diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt index 582faf268..c5056ead8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt @@ -18,13 +18,13 @@ import android.content.Context import android.provider.MediaStore.Audio.AudioColumns import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT object ArtistLoader { - private fun getSongLoaderSortOrder(context: Context): String { - return PreferenceUtil.getInstance(context).artistSortOrder + ", " + - PreferenceUtil.getInstance(context).artistAlbumSortOrder + ", " + - PreferenceUtil.getInstance(context).artistSongSortOrder + private fun getSongLoaderSortOrder(): String { + return PreferenceUtilKT.artistSortOrder + ", " + + PreferenceUtilKT.artistAlbumSortOrder + ", " + + PreferenceUtilKT.artistSongSortOrder } fun getAllArtists(context: Context): ArrayList { @@ -32,7 +32,7 @@ object ArtistLoader { SongLoader.makeSongCursor( context, null, null, - getSongLoaderSortOrder(context) + getSongLoaderSortOrder() ) ) return splitIntoArtists(AlbumLoader.splitIntoAlbums(songs)) @@ -44,7 +44,7 @@ object ArtistLoader { context, AudioColumns.ARTIST + " LIKE ?", arrayOf("%$query%"), - getSongLoaderSortOrder(context) + getSongLoaderSortOrder() ) ) return splitIntoArtists(AlbumLoader.splitIntoAlbums(songs)) @@ -78,7 +78,7 @@ object ArtistLoader { context, AudioColumns.ARTIST_ID + "=?", arrayOf(artistId.toString()), - getSongLoaderSortOrder(context) + getSongLoaderSortOrder() ) ) return Artist(AlbumLoader.splitIntoAlbums(songs)) 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 c92cde62b..d6ca71b4a 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 @@ -23,7 +23,7 @@ import code.name.monkey.retromusic.Constants.BASE_SELECTION import code.name.monkey.retromusic.Constants.baseProjection import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT object GenreLoader { @@ -80,15 +80,14 @@ object GenreLoader { } private fun makeAllSongsWithGenreCursor(context: Context): Cursor? { - try { - return context.contentResolver.query( + return try { + context.contentResolver.query( Uri.parse("content://media/external/audio/genres/all/members"), arrayOf(Genres.Members.AUDIO_ID), null, null, null ) } catch (e: SecurityException) { - return null + null } - } private fun makeGenreSongCursor(context: Context, genreId: Int): Cursor? { @@ -98,7 +97,7 @@ object GenreLoader { baseProjection, BASE_SELECTION, null, - PreferenceUtil.getInstance(context).songSortOrder + PreferenceUtilKT.songSortOrder ) } catch (e: SecurityException) { return null @@ -154,7 +153,7 @@ object GenreLoader { projection, null, null, - PreferenceUtil.getInstance(context).genreSortOrder + PreferenceUtilKT.genreSortOrder ) } catch (e: SecurityException) { return null diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/LastAddedSongsLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/LastAddedSongsLoader.kt index 3a9e2d50d..327c735f2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/LastAddedSongsLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/LastAddedSongsLoader.kt @@ -20,7 +20,7 @@ import android.provider.MediaStore import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT /** * Created by hemanths on 16/08/17. @@ -33,8 +33,7 @@ object LastAddedSongsLoader { } private fun makeLastAddedCursor(context: Context): Cursor? { - val cutoff = PreferenceUtil.getInstance(context).lastAddedCutoff - + val cutoff = PreferenceUtilKT.lastAddedCutoff return SongLoader.makeSongCursor( context, MediaStore.Audio.Media.DATE_ADDED + ">?", 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 f95df2cfc..38bb5edf4 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 @@ -22,7 +22,8 @@ import code.name.monkey.retromusic.Constants.BASE_SELECTION 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 code.name.monkey.retromusic.util.PreferenceUtilKT import java.util.* /** @@ -106,7 +107,7 @@ object SongLoader { context: Context, selection: String?, selectionValues: Array?, - sortOrder: String = PreferenceUtil.getInstance(context).songSortOrder + sortOrder: String = PreferenceUtilKT.songSortOrder ): Cursor? { var selectionFinal = selection var selectionValuesFinal = selectionValues @@ -128,7 +129,7 @@ object SongLoader { MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, baseProjection, selectionFinal + " AND " + MediaStore.Audio.Media.DURATION + ">= " + - (PreferenceUtil.getInstance(context).filterLength * 1000), + (PreferenceUtilKT.filterLength * 1000), selectionValuesFinal, sortOrder ) diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.kt b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.kt index 7cb4babf4..9a1951396 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.kt +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.kt @@ -35,7 +35,6 @@ import android.view.animation.DecelerateInterpolator import android.widget.OverScroller import androidx.annotation.ColorInt import androidx.core.content.ContextCompat -import androidx.core.content.res.ResourcesCompat import androidx.core.view.ViewCompat import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.R @@ -216,9 +215,9 @@ class LrcView @JvmOverloads constructor( isAntiAlias = true textAlign = Paint.Align.LEFT textSize = mLrcTextSize - /* if (BuildConfig.FLAVOR != "nofont") { - typeface = ResourcesCompat.getFont(context, R.font.circular) - }*/ + /* if (BuildConfig.FLAVOR != "nofont") { + typeface = ResourcesCompat.getFont(context, R.font.circular) + }*/ } mDefaultContent = DEFAULT_CONTENT diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/AlbumCoverStylePreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/AlbumCoverStylePreferenceDialog.kt index 2e8285dc0..e5b1af565 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/AlbumCoverStylePreferenceDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/AlbumCoverStylePreferenceDialog.kt @@ -27,7 +27,7 @@ import android.widget.TextView import android.widget.Toast import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat.SRC_IN -import androidx.preference.PreferenceDialogFragmentCompat +import androidx.fragment.app.DialogFragment import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEDialogPreference @@ -37,11 +37,10 @@ import code.name.monkey.retromusic.extensions.colorControlNormal import code.name.monkey.retromusic.fragments.AlbumCoverStyle import code.name.monkey.retromusic.fragments.AlbumCoverStyle.* import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.ViewUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView import com.bumptech.glide.Glide +import com.google.android.material.dialog.MaterialAlertDialogBuilder class AlbumCoverStylePreference @JvmOverloads constructor( context: Context, @@ -65,10 +64,8 @@ class AlbumCoverStylePreference @JvmOverloads constructor( } } -class AlbumCoverStylePreferenceDialog : PreferenceDialogFragmentCompat(), +class AlbumCoverStylePreferenceDialog : DialogFragment(), ViewPager.OnPageChangeListener { - override fun onDialogClosed(positiveResult: Boolean) { - } private var viewPagerPosition: Int = 0 @@ -80,25 +77,26 @@ class AlbumCoverStylePreferenceDialog : PreferenceDialogFragmentCompat(), viewPager.adapter = AlbumCoverStyleAdapter(requireContext()) viewPager.addOnPageChangeListener(this) viewPager.pageMargin = ViewUtil.convertDpToPixel(32f, resources).toInt() - viewPager.currentItem = PreferenceUtil.getInstance(requireContext()).albumCoverStyle.ordinal + viewPager.currentItem = PreferenceUtilKT.albumCoverStyle.ordinal - return MaterialDialog(requireActivity()).show { - title(R.string.pref_title_album_cover_style) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - positiveButton(R.string.set) { + return MaterialAlertDialogBuilder(requireActivity(), + R.style.ThemeOverlay_MaterialComponents_Dialog_Alert) + .setTitle(R.string.pref_title_album_cover_style) + .setPositiveButton(R.string.set) { _, _ -> val coverStyle = values()[viewPagerPosition] if (isAlbumCoverStyle(coverStyle)) { val result = getString(coverStyle.titleRes) + " theme is Pro version feature." Toast.makeText(context, result, Toast.LENGTH_SHORT).show() NavigationUtil.goToProVersion(requireActivity()) } else { - PreferenceUtil.getInstance(requireContext()).albumCoverStyle = coverStyle + PreferenceUtilKT.albumCoverStyle = coverStyle } - } - negativeButton(android.R.string.cancel) - customView(view = view, scrollable = false, noVerticalPadding = false) - } + .setNegativeButton(android.R.string.cancel) { _, _ -> + dismiss() + } + .setView(view) + .create() } override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { @@ -162,12 +160,8 @@ class AlbumCoverStylePreferenceDialog : PreferenceDialogFragmentCompat(), companion object { val TAG: String = AlbumCoverStylePreferenceDialog::class.java.simpleName - fun newInstance(key: String): AlbumCoverStylePreferenceDialog { - val bundle = Bundle() - bundle.putString(ARG_KEY, key) - val fragment = AlbumCoverStylePreferenceDialog() - fragment.arguments = bundle - return fragment + fun newInstance(): AlbumCoverStylePreferenceDialog { + return AlbumCoverStylePreferenceDialog() } } } 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 80383bc8c..ec53c0807 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 @@ -27,7 +27,7 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.dialogs.BlacklistFolderChooserDialog import code.name.monkey.retromusic.extensions.colorControlNormal import code.name.monkey.retromusic.providers.BlacklistStore -import code.name.monkey.retromusic.util.PreferenceUtil + import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.list.listItems import java.io.File @@ -63,7 +63,6 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog refreshBlacklistData() return MaterialDialog(requireContext()).show { title(R.string.blacklist) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) positiveButton(android.R.string.ok) { dismiss() } @@ -71,7 +70,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog MaterialDialog(requireContext()).show { title(code.name.monkey.retromusic.R.string.clear_blacklist) message(code.name.monkey.retromusic.R.string.do_you_want_to_clear_the_blacklist) - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + positiveButton(code.name.monkey.retromusic.R.string.clear_action) { BlacklistStore.getInstance(requireContext()).clear() refreshBlacklistData() @@ -86,7 +85,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog } listItems(items = paths, waitForPositiveButton = false) { _, _, text -> MaterialDialog(requireContext()).show { - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + title(code.name.monkey.retromusic.R.string.remove_from_blacklist) message( text = HtmlCompat.fromHtml( diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt index 7360df5d6..e7c91f119 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt @@ -14,14 +14,17 @@ package code.name.monkey.retromusic.preferences +import android.annotation.SuppressLint import android.app.Dialog import android.content.Context import android.os.Bundle import android.util.AttributeSet +import android.view.LayoutInflater import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat.SRC_IN -import androidx.preference.PreferenceDialogFragmentCompat +import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEDialogPreference @@ -29,78 +32,52 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.CategoryInfoAdapter import code.name.monkey.retromusic.extensions.colorControlNormal import code.name.monkey.retromusic.model.CategoryInfo -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView -import java.util.* +import code.name.monkey.retromusic.util.PreferenceUtilKT +import com.google.android.material.dialog.MaterialAlertDialogBuilder + class LibraryPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1, - defStyleRes: Int = -1 -) : - ATEDialogPreference(context, attrs, defStyleAttr, defStyleRes) { - + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : ATEDialogPreference(context, attrs, defStyleAttr, defStyleRes) { init { - icon?.colorFilter = - BlendModeColorFilterCompat.createBlendModeColorFilterCompat( - context.colorControlNormal(), - SRC_IN - ) + icon?.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat( + context.colorControlNormal(), + SRC_IN + ) } } -class LibraryPreferenceDialog : PreferenceDialogFragmentCompat() { - - override fun onDialogClosed(positiveResult: Boolean) { - } - - lateinit var adapter: CategoryInfoAdapter +class LibraryPreferenceDialog : DialogFragment() { + @SuppressLint("InflateParams") override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val view = requireActivity().layoutInflater.inflate( - R.layout.preference_dialog_library_categories, - null - ) - - val categoryInfos: List = if (savedInstanceState != null) { - savedInstanceState.getParcelableArrayList(PreferenceUtil.LIBRARY_CATEGORIES)!! - } else { - PreferenceUtil.getInstance(requireContext()).libraryCategoryInfos - } - adapter = CategoryInfoAdapter(categoryInfos) + val view = LayoutInflater.from(requireContext()) + .inflate(R.layout.preference_dialog_library_categories, null) + val categoryAdapter = CategoryInfoAdapter() + categoryAdapter.categoryInfos = PreferenceUtilKT.libraryCategory val recyclerView = view.findViewById(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(activity) - recyclerView.adapter = adapter + recyclerView.adapter = categoryAdapter + categoryAdapter.attachToRecyclerView(recyclerView) - adapter.attachToRecyclerView(recyclerView) - return MaterialDialog(requireContext()) - .title(R.string.library_categories) - .cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) - .customView(view = view) - .positiveButton(android.R.string.ok) { - updateCategories(adapter.categoryInfos) - dismiss() + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.library_categories) + .setNeutralButton( + R.string.reset_action + ) { _, _ -> + categoryAdapter.categoryInfos = PreferenceUtilKT.defaultCategories } - .negativeButton(android.R.string.cancel) { - dismiss() - } - .neutralButton(R.string.reset_action) { - adapter.categoryInfos = - PreferenceUtil.getInstance(requireContext()).defaultLibraryCategoryInfos - } - .noAutoDismiss() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putParcelableArrayList( - PreferenceUtil.LIBRARY_CATEGORIES, - ArrayList(adapter.categoryInfos) - ) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton( + android.R.string.ok + ) { _, _ -> updateCategories(categoryAdapter.categoryInfos) } + .setView(view) + .create() } private fun updateCategories(categories: List) { @@ -109,7 +86,7 @@ class LibraryPreferenceDialog : PreferenceDialogFragmentCompat() { Toast.makeText(context, "Not more than 5 items", Toast.LENGTH_SHORT).show() return } - PreferenceUtil.getInstance(requireContext()).libraryCategoryInfos = categories + PreferenceUtilKT.libraryCategory = categories } private fun getSelected(categories: List): Int { @@ -122,13 +99,8 @@ class LibraryPreferenceDialog : PreferenceDialogFragmentCompat() { } companion object { - - fun newInstance(key: String): LibraryPreferenceDialog { - val bundle = Bundle() - bundle.putString(ARG_KEY, key) - val fragment = LibraryPreferenceDialog() - fragment.arguments = bundle - return fragment + fun newInstance(): LibraryPreferenceDialog { + return LibraryPreferenceDialog() } } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt index ddb3c473d..a2f2ca6b7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt @@ -26,7 +26,6 @@ import androidx.preference.PreferenceDialogFragmentCompat import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.colorControlNormal -import code.name.monkey.retromusic.util.PreferenceUtil import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.WhichButton import com.afollestad.materialdialogs.actions.getActionButton @@ -76,7 +75,6 @@ class MaterialListPreferenceDialog : PreferenceDialogFragmentCompat() { materialDialog = MaterialDialog(requireContext()) .title(text = materialListPreference.title.toString()) .positiveButton(R.string.set) - .cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) .listItemsSingleChoice( items = entries, initialSelection = position, 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 822668e8b..aaf000c2d 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 @@ -26,7 +26,7 @@ import android.widget.TextView import android.widget.Toast import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat.SRC_IN -import androidx.preference.PreferenceDialogFragmentCompat +import androidx.fragment.app.DialogFragment import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEDialogPreference @@ -36,11 +36,10 @@ import code.name.monkey.retromusic.extensions.colorControlNormal import code.name.monkey.retromusic.fragments.NowPlayingScreen import code.name.monkey.retromusic.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.ViewUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView import com.bumptech.glide.Glide +import com.google.android.material.dialog.MaterialAlertDialogBuilder class NowPlayingScreenPreference @JvmOverloads constructor( context: Context, @@ -63,8 +62,7 @@ class NowPlayingScreenPreference @JvmOverloads constructor( } } -class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), - ViewPager.OnPageChangeListener { +class NowPlayingScreenPreferenceDialog : DialogFragment(), ViewPager.OnPageChangeListener { private var viewPagerPosition: Int = 0 @@ -78,9 +76,6 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), this.viewPagerPosition = position } - override fun onDialogClosed(positiveResult: Boolean) { - } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val view = LayoutInflater.from(requireContext()) .inflate(R.layout.preference_dialog_now_playing_screen, null) @@ -89,11 +84,25 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), viewPager.adapter = NowPlayingScreenAdapter(requireContext()) viewPager.addOnPageChangeListener(this) viewPager.pageMargin = ViewUtil.convertDpToPixel(32f, resources).toInt() - viewPager.currentItem = - PreferenceUtil.getInstance(requireContext()).nowPlayingScreen.ordinal + viewPager.currentItem = PreferenceUtilKT.nowPlayingScreen.ordinal - - return MaterialDialog(requireContext()).show { + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.pref_title_now_playing_screen_appearance) + .setCancelable(false) + .setPositiveButton(R.string.set) { _, _ -> + val nowPlayingScreen = values()[viewPagerPosition] + if (isNowPlayingThemes(nowPlayingScreen)) { + val result = + getString(nowPlayingScreen.titleRes) + " theme is Pro version feature." + Toast.makeText(context, result, Toast.LENGTH_SHORT).show() + NavigationUtil.goToProVersion(requireContext()) + } else { + PreferenceUtilKT.nowPlayingScreen = nowPlayingScreen + } + } + .setView(view) + .create() + /*.show { title(R.string.pref_title_now_playing_screen_appearance) positiveButton(R.string.set) { val nowPlayingScreen = values()[viewPagerPosition] @@ -103,22 +112,18 @@ class NowPlayingScreenPreferenceDialog : PreferenceDialogFragmentCompat(), Toast.makeText(context, result, Toast.LENGTH_SHORT).show() NavigationUtil.goToProVersion(requireContext()) } else { - PreferenceUtil.getInstance(requireContext()).nowPlayingScreen = nowPlayingScreen + PreferenceUtilKT.nowPlayingScreen = nowPlayingScreen } } - cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) + negativeButton(android.R.string.cancel) customView(view = view, scrollable = false, noVerticalPadding = false) - } + }*/ } companion object { - fun newInstance(key: String): NowPlayingScreenPreferenceDialog { - val bundle = Bundle() - bundle.putString(ARG_KEY, key) - val fragment = NowPlayingScreenPreferenceDialog() - fragment.arguments = bundle - return fragment + fun newInstance(): NowPlayingScreenPreferenceDialog { + return NowPlayingScreenPreferenceDialog() } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java b/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java index 8efe52597..ea8928b02 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java +++ b/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java @@ -28,7 +28,7 @@ import java.io.File; import java.util.ArrayList; import code.name.monkey.retromusic.util.FileUtil; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; import static code.name.monkey.retromusic.service.MusicService.MEDIA_STORE_CHANGED; @@ -47,13 +47,13 @@ public class BlacklistStore extends SQLiteOpenHelper { public static synchronized BlacklistStore getInstance(@NonNull final Context context) { if (sInstance == null) { sInstance = new BlacklistStore(context.getApplicationContext()); - if (!PreferenceUtil.getInstance(context).initializedBlacklist()) { + if (!PreferenceUtilKT.INSTANCE.isInitializedBlacklist()) { // blacklisted by default sInstance.addPathImpl(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)); sInstance.addPathImpl(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)); sInstance.addPathImpl(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)); - PreferenceUtil.getInstance(context).setInitializedBlacklist(); + PreferenceUtilKT.INSTANCE.setInitializedBlacklist(true); } } return sInstance; diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java index f25da25fa..5673c6439 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java @@ -29,7 +29,7 @@ import androidx.annotation.Nullable; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.service.playback.Playback; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; /** * @author Andrew Neal, Karim Abou Zeid (kabouzeid) @@ -130,7 +130,7 @@ public class MultiPlayer implements Playback, MediaPlayer.OnErrorListener, Media if (path == null) { return; } - if (PreferenceUtil.getInstance(context).gaplessPlayback()) { + if (PreferenceUtilKT.INSTANCE.isGapLessPlayback()) { mNextMediaPlayer = new MediaPlayer(); mNextMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); mNextMediaPlayer.setAudioSessionId(getAudioSessionId()); diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java index a8dac80bc..7f2b26cd7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java @@ -81,9 +81,16 @@ import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl; import code.name.monkey.retromusic.service.notification.PlayingNotificationOreo; import code.name.monkey.retromusic.service.playback.Playback; import code.name.monkey.retromusic.util.MusicUtil; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; import code.name.monkey.retromusic.util.RetroUtil; +import static code.name.monkey.retromusic.ConstantsKt.ALBUM_ART_ON_LOCKSCREEN; +import static code.name.monkey.retromusic.ConstantsKt.BLURRED_ALBUM_ART; +import static code.name.monkey.retromusic.ConstantsKt.CLASSIC_NOTIFICATION; +import static code.name.monkey.retromusic.ConstantsKt.COLORED_NOTIFICATION; +import static code.name.monkey.retromusic.ConstantsKt.GAPLESS_PLAYBACK; +import static code.name.monkey.retromusic.ConstantsKt.TOGGLE_HEADSET; + /** * @author Karim Abou Zeid (kabouzeid), Andrew Neal */ @@ -250,7 +257,7 @@ public class MusicService extends Service implements String action = intent.getAction(); if (action != null) { if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action) && - PreferenceUtil.getInstance(context).bluetoothSpeaker()) { + PreferenceUtilKT.INSTANCE.isBluetoothSpeaker()) { if (VERSION.SDK_INT >= VERSION_CODES.M) { if (getAudioManager().getDevices(AudioManager.GET_DEVICES_OUTPUTS).length > 0) { play(); @@ -381,7 +388,7 @@ public class MusicService extends Service implements getContentResolver() .registerContentObserver(MediaStore.Audio.Playlists.INTERNAL_CONTENT_URI, true, mediaStoreObserver); - PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this); + PreferenceUtilKT.INSTANCE.registerOnSharedPreferenceChangedListener(this); restoreState(); @@ -411,7 +418,7 @@ public class MusicService extends Service implements quit(); releaseResources(); getContentResolver().unregisterContentObserver(mediaStoreObserver); - PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this); + PreferenceUtilKT.INSTANCE.unregisterOnSharedPreferenceChangedListener(this); wakeLock.release(); sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED")); @@ -656,8 +663,8 @@ public class MusicService extends Service implements } public void initNotification() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !PreferenceUtil.getInstance(this) - .classicNotification()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && + !PreferenceUtilKT.INSTANCE.isClassicNotification()) { playingNotification = new PlayingNotificationImpl(); } else { playingNotification = new PlayingNotificationOreo(); @@ -719,7 +726,7 @@ public class MusicService extends Service implements @Override public void onSharedPreferenceChanged(@NonNull SharedPreferences sharedPreferences, @NonNull String key) { switch (key) { - case PreferenceUtil.GAPLESS_PLAYBACK: + case GAPLESS_PLAYBACK: if (sharedPreferences.getBoolean(key, false)) { prepareNext(); } else { @@ -728,18 +735,18 @@ public class MusicService extends Service implements } } break; - case PreferenceUtil.ALBUM_ART_ON_LOCKSCREEN: - case PreferenceUtil.BLURRED_ALBUM_ART: + case ALBUM_ART_ON_LOCKSCREEN: + case BLURRED_ALBUM_ART: updateMediaSessionMetaData(); break; - case PreferenceUtil.COLORED_NOTIFICATION: + case COLORED_NOTIFICATION: updateNotification(); break; - case PreferenceUtil.CLASSIC_NOTIFICATION: + case CLASSIC_NOTIFICATION: initNotification(); updateNotification(); break; - case PreferenceUtil.TOGGLE_HEADSET: + case TOGGLE_HEADSET: registerHeadsetEvents(); break; } @@ -1103,13 +1110,13 @@ public class MusicService extends Service implements .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, null) .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, getPlayingQueue().size()); - if (PreferenceUtil.getInstance(this).albumArtOnLockscreen()) { + if (PreferenceUtilKT.INSTANCE.isAlbumArtOnLockScreen()) { final Point screenSize = RetroUtil.getScreenSize(MusicService.this); final BitmapRequestBuilder request = SongGlideRequest.Builder .from(Glide.with(MusicService.this), song) .checkIgnoreMediaStore(MusicService.this) .asBitmap().build(); - if (PreferenceUtil.getInstance(this).blurredAlbumArt()) { + if (PreferenceUtilKT.INSTANCE.isBlurredAlbumArt()) { request.transform(new BlurTransformation.Builder(MusicService.this).build()); } runOnUiThread(new Runnable() { @@ -1252,7 +1259,7 @@ public class MusicService extends Service implements } private void registerHeadsetEvents() { - if (!headsetReceiverRegistered && PreferenceUtil.getInstance(this).getHeadsetPlugged()) { + if (!headsetReceiverRegistered && PreferenceUtilKT.INSTANCE.isHeadsetPlugged()) { registerReceiver(headsetReceiver, headsetReceiverIntentFilter); headsetReceiverRegistered = true; } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java index 2fe34fbef..8b72c894e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java @@ -23,7 +23,7 @@ import androidx.annotation.NonNull; import java.lang.ref.WeakReference; -import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.PreferenceUtilKT; import static code.name.monkey.retromusic.service.MusicService.DUCK; import static code.name.monkey.retromusic.service.MusicService.META_CHANGED; @@ -52,7 +52,7 @@ class PlaybackHandler extends Handler { switch (msg.what) { case MusicService.DUCK: - if (PreferenceUtil.getInstance(service).audioDucking()) { + if (PreferenceUtilKT.INSTANCE.isAudioDucking()) { currentDuckVolume -= .05f; if (currentDuckVolume > .2f) { sendEmptyMessageDelayed(DUCK, 10); @@ -66,7 +66,7 @@ class PlaybackHandler extends Handler { break; case MusicService.UNDUCK: - if (PreferenceUtil.getInstance(service).audioDucking()) { + if (PreferenceUtilKT.INSTANCE.isAudioDucking()) { currentDuckVolume += .03f; if (currentDuckVolume < 1f) { sendEmptyMessageDelayed(MusicService.UNDUCK, 10); diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt index 5b767da7e..61108be99 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl.kt @@ -32,7 +32,7 @@ import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.* import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroColorUtil import com.bumptech.glide.Glide import com.bumptech.glide.request.animation.GlideAnimation @@ -149,9 +149,8 @@ class PlayingNotificationImpl : PlayingNotification() { .setShowActionsInCompactView(1, 2, 3) ) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O && PreferenceUtil.getInstance( - service - ).coloredNotification() + if (Build.VERSION.SDK_INT <= + Build.VERSION_CODES.O && PreferenceUtilKT.isColoredNotification ) { builder.color = color } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationOreo.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationOreo.kt index a6b543062..6457e42dd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationOreo.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationOreo.kt @@ -23,7 +23,7 @@ import android.graphics.Color import android.graphics.drawable.Drawable import android.widget.RemoteViews import androidx.core.app.NotificationCompat -import code.name.monkey.appthemehelper.util.ATHUtil +import code.name.monkey.appthemehelper.util.ATHUtil.resolveColor import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.retromusic.R @@ -33,7 +33,7 @@ import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.* -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.RetroUtil.createBitmap import code.name.monkey.retromusic.util.color.MediaNotificationProcessor @@ -123,7 +123,7 @@ class PlayingNotificationOreo : PlayingNotification() { super.onLoadFailed(e, errorDrawable) update( null, - ATHUtil.resolveColor(service, R.attr.colorSurface, Color.WHITE) + resolveColor(service, R.attr.colorSurface, Color.WHITE) ) } @@ -143,9 +143,8 @@ class PlayingNotificationOreo : PlayingNotification() { ) } - if (!PreferenceUtil.getInstance(service).coloredNotification()) { - bgColorFinal = - ATHUtil.resolveColor(service, R.attr.colorPrimary, Color.WHITE) + if (!PreferenceUtilKT.isColoredNotification) { + bgColorFinal = resolveColor(service, R.attr.colorPrimary, Color.WHITE) } setBackgroundColor(bgColorFinal) setNotificationContent(ColorUtil.isColorLight(bgColorFinal)) diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt index 1b2bdbe3e..4c31a4a4f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt @@ -20,11 +20,9 @@ import android.content.SharedPreferences import android.graphics.Color import android.net.Uri import code.name.monkey.retromusic.R -import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.WhichButton import com.afollestad.materialdialogs.actions.getActionButton -import com.afollestad.materialdialogs.bottomsheets.BottomSheet object AppRater { private const val DO_NOT_SHOW_AGAIN = "do_not_show_again"// Package Name @@ -34,6 +32,7 @@ object AppRater { private const val DAYS_UNTIL_PROMPT = 3//Min number of days private const val LAUNCHES_UNTIL_PROMPT = 5//Min number of launches + @JvmStatic fun appLaunched(context: Context) { val prefs = context.getSharedPreferences(APP_RATING, 0) @@ -67,8 +66,6 @@ object AppRater { private fun showRateDialog(context: Context, editor: SharedPreferences.Editor) { MaterialDialog(context) .show { - - cornerRadius(PreferenceUtil.getInstance(context).dialogCorner) title(text = "Rate this App") message(text = "If you enjoy using Retro Music, please take a moment to rate it. Thanks for your support!") positiveButton(R.string.app_name) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java index 5e24f1b7b..6f8d4f617 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java @@ -304,19 +304,24 @@ public class MusicUtil { @NonNull public static String getSectionName(@Nullable String musicMediaTitle) { - if (TextUtils.isEmpty(musicMediaTitle)) { + try { + if (TextUtils.isEmpty(musicMediaTitle)) { + return ""; + } + + musicMediaTitle = musicMediaTitle.trim().toLowerCase(); + if (musicMediaTitle.startsWith("the ")) { + musicMediaTitle = musicMediaTitle.substring(4); + } else if (musicMediaTitle.startsWith("a ")) { + musicMediaTitle = musicMediaTitle.substring(2); + } + if (musicMediaTitle.isEmpty()) { + return ""; + } + return musicMediaTitle.substring(0, 1).toUpperCase(); + } catch (Exception e) { return ""; } - musicMediaTitle = musicMediaTitle.trim().toLowerCase(); - if (musicMediaTitle.startsWith("the ")) { - musicMediaTitle = musicMediaTitle.substring(4); - } else if (musicMediaTitle.startsWith("a ")) { - musicMediaTitle = musicMediaTitle.substring(2); - } - if (musicMediaTitle.isEmpty()) { - return ""; - } - return musicMediaTitle.substring(0, 1).toUpperCase(); } @NonNull diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java deleted file mode 100644 index 1ce43fc44..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * Licensed under the GNU General Public License v3 - * - * This is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by - * the Free Software Foundation either version 3 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - */ - -package code.name.monkey.retromusic.util; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.Environment; -import android.provider.BaseColumns; -import android.provider.MediaStore; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.helper.M3UWriter; -import code.name.monkey.retromusic.model.Playlist; -import code.name.monkey.retromusic.model.PlaylistSong; -import code.name.monkey.retromusic.model.Song; - -import static android.provider.MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI; - -public class PlaylistsUtil { - - public static int createPlaylist(@NonNull final Context context, @Nullable final String name) { - int id = -1; - if (name != null && name.length() > 0) { - try { - Cursor cursor = context.getContentResolver().query(EXTERNAL_CONTENT_URI, - new String[]{MediaStore.Audio.Playlists._ID}, - MediaStore.Audio.PlaylistsColumns.NAME + "=?", new String[]{name}, - null); - if (cursor == null || cursor.getCount() < 1) { - final ContentValues values = new ContentValues(1); - values.put(MediaStore.Audio.PlaylistsColumns.NAME, name); - final Uri uri = context.getContentResolver().insert( - EXTERNAL_CONTENT_URI, - values); - if (uri != null) { - // Necessary because somehow the MediaStoreObserver is not notified when adding a playlist - context.getContentResolver().notifyChange(Uri.parse("content://media"), null); - Toast.makeText(context, context.getResources().getString( - R.string.created_playlist_x, name), Toast.LENGTH_SHORT).show(); - id = Integer.parseInt(uri.getLastPathSegment()); - } - } else { - // Playlist exists - if (cursor.moveToFirst()) { - id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists._ID)); - } - } - if (cursor != null) { - cursor.close(); - } - } catch (SecurityException e) { - e.printStackTrace(); - Toast.makeText(context, "Unable to add music to playlist due to Android 10 limitations", Toast.LENGTH_SHORT).show(); - } - } - if (id == -1) { - Toast.makeText(context, context.getResources().getString( - R.string.could_not_create_playlist), Toast.LENGTH_SHORT).show(); - } - return id; - } - - public static void deletePlaylists(@NonNull final Context context, @NonNull final ArrayList playlists) { - final StringBuilder selection = new StringBuilder(); - selection.append(MediaStore.Audio.Playlists._ID + " IN ("); - for (int i = 0; i < playlists.size(); i++) { - selection.append(playlists.get(i).id); - if (i < playlists.size() - 1) { - selection.append(","); - } - } - selection.append(")"); - try { - context.getContentResolver().delete(EXTERNAL_CONTENT_URI, selection.toString(), null); - context.getContentResolver().notifyChange(Uri.parse("content://media"), null); - } catch (SecurityException ignored) { - } - } - - public static void addToPlaylist(@NonNull final Context context, final Song song, final int playlistId, final boolean showToastOnFinish) { - List helperList = new ArrayList<>(); - helperList.add(song); - addToPlaylist(context, helperList, playlistId, showToastOnFinish); - } - - public static void addToPlaylist(@NonNull final Context context, @NonNull final List songs, final int playlistId, final boolean showToastOnFinish) { - final int size = songs.size(); - final ContentResolver resolver = context.getContentResolver(); - final String[] projection = new String[]{ - "max(" + MediaStore.Audio.Playlists.Members.PLAY_ORDER + ")", - }; - final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId); - Cursor cursor = null; - int base = 0; - - try { - try { - cursor = resolver.query(uri, projection, null, null, null); - - if (cursor != null && cursor.moveToFirst()) { - base = cursor.getInt(0) + 1; - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - - int numInserted = 0; - for (int offSet = 0; offSet < size; offSet += 1000) - numInserted += resolver.bulkInsert(uri, makeInsertItems(songs, offSet, 1000, base)); - - if (showToastOnFinish) { - Toast.makeText(context, context.getResources().getString( - R.string.inserted_x_songs_into_playlist_x, numInserted, getNameForPlaylist(context, playlistId)), Toast.LENGTH_SHORT).show(); - } - } catch (SecurityException ignored) { - ignored.printStackTrace(); - Toast.makeText(context, "Unable to add music to playlist due to Android 10 limitations", Toast.LENGTH_SHORT).show(); - } - } - - @NonNull - public static ContentValues[] makeInsertItems(@NonNull final List songs, final int offset, int len, final int base) { - if (offset + len > songs.size()) { - len = songs.size() - offset; - } - - ContentValues[] contentValues = new ContentValues[len]; - - for (int i = 0; i < len; i++) { - contentValues[i] = new ContentValues(); - contentValues[i].put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, base + offset + i); - contentValues[i].put(MediaStore.Audio.Playlists.Members.AUDIO_ID, songs.get(offset + i).getId()); - } - return contentValues; - } - - public static String getNameForPlaylist(@NonNull final Context context, final long id) { - try { - Cursor cursor = context.getContentResolver().query(EXTERNAL_CONTENT_URI, - new String[]{MediaStore.Audio.PlaylistsColumns.NAME}, - BaseColumns._ID + "=?", - new String[]{String.valueOf(id)}, - null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - return cursor.getString(0); - } - } finally { - cursor.close(); - } - } - } catch (SecurityException ignored) { - } - return ""; - } - - public static void removeFromPlaylist(@NonNull final Context context, @NonNull final Song song, int playlistId) { - Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( - "external", playlistId); - String selection = MediaStore.Audio.Playlists.Members.AUDIO_ID + " =?"; - String[] selectionArgs = new String[]{String.valueOf(song.getId())}; - - try { - context.getContentResolver().delete(uri, selection, selectionArgs); - } catch (SecurityException ignored) { - } - } - - public static void removeFromPlaylist(@NonNull final Context context, @NonNull final List songs) { - final int playlistId = songs.get(0).getPlaylistId(); - Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( - "external", playlistId); - String selectionArgs[] = new String[songs.size()]; - for (int i = 0; i < selectionArgs.length; i++) { - selectionArgs[i] = String.valueOf(songs.get(i).getIdInPlayList()); - } - String selection = MediaStore.Audio.Playlists.Members._ID + " in ("; - //noinspection unused - for (String selectionArg : selectionArgs) selection += "?, "; - selection = selection.substring(0, selection.length() - 2) + ")"; - - try { - context.getContentResolver().delete(uri, selection, selectionArgs); - } catch (SecurityException ignored) { - } - } - - public static boolean doPlaylistContains(@NonNull final Context context, final long playlistId, final int songId) { - if (playlistId != -1) { - try { - Cursor c = context.getContentResolver().query( - MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), - new String[]{MediaStore.Audio.Playlists.Members.AUDIO_ID}, MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?", new String[]{String.valueOf(songId)}, null); - int count = 0; - if (c != null) { - count = c.getCount(); - c.close(); - } - return count > 0; - } catch (SecurityException ignored) { - } - } - return false; - } - - public static boolean moveItem(@NonNull final Context context, int playlistId, int from, int to) { - return MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(), - playlistId, from, to); - } - - public static void renamePlaylist(@NonNull final Context context, final long id, final String newName) { - ContentValues contentValues = new ContentValues(); - contentValues.put(MediaStore.Audio.PlaylistsColumns.NAME, newName); - try { - context.getContentResolver().update(EXTERNAL_CONTENT_URI, - contentValues, - MediaStore.Audio.Playlists._ID + "=?", - new String[]{String.valueOf(id)}); - context.getContentResolver().notifyChange(Uri.parse("content://media"), null); - } catch (SecurityException ignored) { - } - } - - public static File savePlaylist(Context context, Playlist playlist) throws IOException { - return M3UWriter.write(context, new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist); - } - - public static boolean doesPlaylistExist(@NonNull final Context context, final int playlistId) { - return playlistId != -1 && doesPlaylistExist(context, - MediaStore.Audio.Playlists._ID + "=?", - new String[]{String.valueOf(playlistId)}); - } - - public static boolean doesPlaylistExist(@NonNull final Context context, final String name) { - return doesPlaylistExist(context, - MediaStore.Audio.PlaylistsColumns.NAME + "=?", - new String[]{name}); - } - - private static boolean doesPlaylistExist(@NonNull Context context, @NonNull final String selection, @NonNull final String[] values) { - Cursor cursor = context.getContentResolver().query(EXTERNAL_CONTENT_URI, - new String[]{}, selection, values, null); - - boolean exists = false; - if (cursor != null) { - exists = cursor.getCount() != 0; - cursor.close(); - } - return exists; - } - - /*public static void addToPlaylist(@NonNull Context context, - @NonNull List songs, - int playlistId, - boolean showToastOnFinish) { - - ArrayList noSongs = new ArrayList(); - for (Song song : songs) { - if (!doPlaylistContains(context, playlistId, song.getId())) { - noSongs.add(song); - } - } - - final int size = noSongs.size(); - final ContentResolver resolver = context.getContentResolver(); - final String[] projection = new String[]{"max(" + MediaStore.Audio.Playlists.Members.PLAY_ORDER + ")",}; - final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId); - - int base = 0; - try (Cursor cursor = resolver.query(uri, projection, null, null, null)) { - - if (cursor != null && cursor.moveToFirst()) { - base = cursor.getInt(0) + 1; - } - } catch (SecurityException ignored) { - } - - int numInserted = 0; - for (int offSet = 0; offSet < size; offSet += 1000) { - numInserted += resolver.bulkInsert(uri, makeInsertItems(noSongs, offSet, 1000, base)); - } - - if (showToastOnFinish) { - Toast.makeText(context, context.getResources().getString( - R.string.inserted_x_songs_into_playlist_x, numInserted, getNameForPlaylist(context, playlistId)), - Toast.LENGTH_SHORT).show(); - } - } - - public static int createPlaylist(@NonNull final Context context, @Nullable final String name) { - int id = -1; - if (name != null && name.length() > 0) { - try { - Cursor cursor = context.getContentResolver() - .query(EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Playlists._ID}, - MediaStore.Audio.PlaylistsColumns.NAME + "=?", new String[]{name}, null); - if (cursor == null || cursor.getCount() < 1) { - final ContentValues values = new ContentValues(1); - values.put(MediaStore.Audio.PlaylistsColumns.NAME, name); - final Uri uri = context.getContentResolver().insert(EXTERNAL_CONTENT_URI, values); - if (uri != null) { - Toast.makeText(context, context.getResources().getString(R.string.created_playlist_x, name), - Toast.LENGTH_SHORT).show(); - id = Integer.parseInt(uri.getLastPathSegment()); - } - } else { - // Playlist exists - if (cursor.moveToFirst()) { - id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists._ID)); - } - } - if (cursor != null) { - cursor.close(); - } - } catch (SecurityException ignored) { - } - } - if (id == -1) { - Toast.makeText(context, context.getResources().getString( - R.string.could_not_create_playlist), Toast.LENGTH_SHORT).show(); - } - return id; - } - - public static void deletePlaylists(@NonNull final Context context, @NonNull final ArrayList playlists) { - final StringBuilder selection = new StringBuilder(); - selection.append(MediaStore.Audio.Playlists._ID + " IN ("); - for (int i = 0; i < playlists.size(); i++) { - selection.append(playlists.get(i).id); - if (i < playlists.size() - 1) { - selection.append(","); - } - } - selection.append(")"); - try { - context.getContentResolver().delete(EXTERNAL_CONTENT_URI, selection.toString(), null); - context.getContentResolver().notifyChange(Uri.parse("content://media"), null); - } catch (SecurityException ignored) { - } - } - - static boolean doPlaylistContains(@NonNull final Context context, final long playlistId, - final int songId) { - if (playlistId != -1) { - try { - Cursor c = context.getContentResolver().query( - MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), - new String[]{MediaStore.Audio.Playlists.Members.AUDIO_ID}, - MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?", new String[]{String.valueOf(songId)}, - null); - int count = 0; - if (c != null) { - count = c.getCount(); - c.close(); - } - return count > 0; - } catch (SecurityException ignored) { - } - } - return false; - } - - public static boolean doesPlaylistExist(@NonNull final Context context, final int playlistId) { - return playlistId != -1 && doesPlaylistExist(context, - MediaStore.Audio.Playlists._ID + "=?", - new String[]{String.valueOf(playlistId)}); - } - - public static String getNameForPlaylist(@NonNull final Context context, final long id) { - try { - Cursor cursor = context.getContentResolver().query(EXTERNAL_CONTENT_URI, - new String[]{MediaStore.Audio.PlaylistsColumns.NAME}, - BaseColumns._ID + "=?", - new String[]{String.valueOf(id)}, - null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - return cursor.getString(0); - } - } finally { - cursor.close(); - } - } - } catch (SecurityException ignored) { - } - return ""; - } - - @NonNull - public static ContentValues[] makeInsertItems(@NonNull final List songs, final int offset, int len, - final int base) { - if (offset + len > songs.size()) { - len = songs.size() - offset; - } - - ContentValues[] contentValues = new ContentValues[len]; - - for (int i = 0; i < len; i++) { - contentValues[i] = new ContentValues(); - contentValues[i].put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, base + offset + i); - contentValues[i].put(MediaStore.Audio.Playlists.Members.AUDIO_ID, songs.get(offset + i).getId()); - } - return contentValues; - } - - public static boolean moveItem(@NonNull final Context context, int playlistId, int from, int to) { - return MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(), - playlistId, from, to); - } - - public static void removeFromPlaylist(@NonNull final Context context, @NonNull final Song song, int playlistId) { - Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( - "external", playlistId); - String selection = MediaStore.Audio.Playlists.Members.AUDIO_ID + " =?"; - String[] selectionArgs = new String[]{String.valueOf(song.getId())}; - - try { - context.getContentResolver().delete(uri, selection, selectionArgs); - } catch (SecurityException ignored) { - } - } - - public static void removeFromPlaylist(@NonNull final Context context, @NonNull final List songs) { - final int playlistId = songs.get(0).getPlaylistId(); - Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( - "external", playlistId); - String selectionArgs[] = new String[songs.size()]; - for (int i = 0; i < selectionArgs.length; i++) { - selectionArgs[i] = String.valueOf(songs.get(i).getIdInPlayList()); - } - String selection = MediaStore.Audio.Playlists.Members._ID + " in ("; - //noinspection unused - for (String selectionArg : selectionArgs) { - selection += "?, "; - } - selection = selection.substring(0, selection.length() - 2) + ")"; - - try { - context.getContentResolver().delete(uri, selection, selectionArgs); - } catch (SecurityException ignored) { - } - } - - public static void renamePlaylist(@NonNull final Context context, final long id, final String newName) { - ContentValues contentValues = new ContentValues(); - contentValues.put(MediaStore.Audio.PlaylistsColumns.NAME, newName); - try { - context.getContentResolver().update(EXTERNAL_CONTENT_URI, - contentValues, - MediaStore.Audio.Playlists._ID + "=?", - new String[]{String.valueOf(id)}); - } catch (SecurityException ignored) { - } - } - - @Nullable - public static File savePlaylist(@NonNull Context context, - @NonNull Playlist playlist) throws IOException { - return M3UWriter.write(context, new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist); - } - - static void addToPlaylist(@NonNull Context context, - @NonNull Song song, - int playlistId, - boolean showToastOnFinish) { - List helperList = new ArrayList<>(); - helperList.add(song); - addToPlaylist(context, helperList, playlistId, showToastOnFinish); - } - - private static boolean doesPlaylistExist(@NonNull Context context, @NonNull final String selection, - @NonNull final String[] values) { - Cursor cursor = context.getContentResolver().query(EXTERNAL_CONTENT_URI, - new String[]{}, selection, values, null); - - boolean exists = false; - if (cursor != null) { - exists = cursor.getCount() != 0; - cursor.close(); - } - return exists; - }*/ -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java deleted file mode 100644 index f38ccdaa7..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java +++ /dev/null @@ -1,790 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * Licensed under the GNU General Public License v3 - * - * This is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by - * the Free Software Foundation either version 3 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - */ - -package code.name.monkey.retromusic.util; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.content.res.TypedArray; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.Uri; -import android.preference.PreferenceManager; - -import androidx.annotation.LayoutRes; -import androidx.annotation.NonNull; -import androidx.annotation.StyleRes; -import androidx.viewpager.widget.ViewPager; - -import com.google.android.material.bottomnavigation.LabelVisibilityMode; -import com.google.gson.Gson; -import com.google.gson.JsonSyntaxException; -import com.google.gson.reflect.TypeToken; - -import java.io.File; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.fragments.AlbumCoverStyle; -import code.name.monkey.retromusic.fragments.NowPlayingScreen; -import code.name.monkey.retromusic.fragments.mainactivity.FoldersFragment; -import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder; -import code.name.monkey.retromusic.model.CategoryInfo; -import code.name.monkey.retromusic.model.CategoryInfo.Category; -import code.name.monkey.retromusic.transform.CascadingPageTransformer; -import code.name.monkey.retromusic.transform.DepthTransformation; -import code.name.monkey.retromusic.transform.HingeTransformation; -import code.name.monkey.retromusic.transform.HorizontalFlipTransformation; -import code.name.monkey.retromusic.transform.NormalPageTransformer; -import code.name.monkey.retromusic.transform.VerticalFlipTransformation; -import code.name.monkey.retromusic.transform.VerticalStackTransformer; -import code.name.monkey.retromusic.util.theme.ThemeMode; - -import static code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder; -import static code.name.monkey.retromusic.helper.SortOrder.ArtistAlbumSortOrder; -import static code.name.monkey.retromusic.helper.SortOrder.ArtistSongSortOrder; -import static code.name.monkey.retromusic.helper.SortOrder.ArtistSortOrder; -import static code.name.monkey.retromusic.helper.SortOrder.GenreSortOrder; -import static code.name.monkey.retromusic.helper.SortOrder.SongSortOrder; - -public final class PreferenceUtil { - - public static final String LIBRARY_CATEGORIES = "library_categories"; - public static final String EXTRA_SONG_INFO = "extra_song_info"; - public static final String DESATURATED_COLOR = "desaturated_color"; - public static final String BLACK_THEME = "black_theme"; - public static final String KEEP_SCREEN_ON = "keep_screen_on"; - public static final String TOGGLE_HOME_BANNER = "toggle_home_banner"; - public static final String NOW_PLAYING_SCREEN_ID = "now_playing_screen_id"; - public static final String CAROUSEL_EFFECT = "carousel_effect"; - public static final String COLORED_NOTIFICATION = "colored_notification"; - public static final String CLASSIC_NOTIFICATION = "classic_notification"; - public static final String GAPLESS_PLAYBACK = "gapless_playback"; - public static final String ALBUM_ART_ON_LOCKSCREEN = "album_art_on_lockscreen"; - public static final String BLURRED_ALBUM_ART = "blurred_album_art"; - public static final String NEW_BLUR_AMOUNT = "new_blur_amount"; - public static final String TOGGLE_HEADSET = "toggle_headset"; - public static final String GENERAL_THEME = "general_theme"; - public static final String CIRCULAR_ALBUM_ART = "circular_album_art"; - public static final String USER_NAME = "user_name"; - public static final String TOGGLE_FULL_SCREEN = "toggle_full_screen"; - public static final String TOGGLE_VOLUME = "toggle_volume"; - public static final String ROUND_CORNERS = "corner_window"; - public static final String TOGGLE_GENRE = "toggle_genre"; - public static final String PROFILE_IMAGE_PATH = "profile_image_path"; - public static final String BANNER_IMAGE_PATH = "banner_image_path"; - public static final String ADAPTIVE_COLOR_APP = "adaptive_color_app"; - public static final String TOGGLE_SEPARATE_LINE = "toggle_separate_line"; - public static final String HOME_ARTIST_GRID_STYLE = "home_artist_grid_style"; - public static final String TOGGLE_ADD_CONTROLS = "toggle_add_controls"; - public static final String ALBUM_COVER_STYLE = "album_cover_style_id"; - public static final String ALBUM_COVER_TRANSFORM = "album_cover_transform"; - public static final String TAB_TEXT_MODE = "tab_text_mode"; - public static final String LANGUAGE_NAME = "language_name"; - private static final String DIALOG_CORNER = "dialog_corner"; - private static final String SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_song"; - private static final String ALBUM_GRID_STYLE = "album_grid_style_home"; - private static final String ARTIST_GRID_STYLE = "artist_grid_style_home"; - private static final String SAF_SDCARD_URI = "saf_sdcard_uri"; - private static final String SONG_SORT_ORDER = "song_sort_order"; - private static final String SONG_GRID_SIZE = "song_grid_size"; - private static final String GENRE_SORT_ORDER = "genre_sort_order"; - private static final String LAST_PAGE = "last_start_page"; - private static final String BLUETOOTH_PLAYBACK = "bluetooth_playback"; - private static final String INITIALIZED_BLACKLIST = "initialized_blacklist"; - private static final String ARTIST_SORT_ORDER = "artist_sort_order"; - private static final String ARTIST_ALBUM_SORT_ORDER = "artist_album_sort_order"; - private static final String ALBUM_SORT_ORDER = "album_sort_order"; - private static final String ALBUM_SONG_SORT_ORDER = "album_song_sort_order"; - private static final String ARTIST_SONG_SORT_ORDER = "artist_song_sort_order"; - private static final String ALBUM_GRID_SIZE = "album_grid_size"; - private static final String ALBUM_GRID_SIZE_LAND = "album_grid_size_land"; - private static final String SONG_GRID_SIZE_LAND = "song_grid_size_land"; - private static final String ARTIST_GRID_SIZE = "artist_grid_size"; - private static final String ARTIST_GRID_SIZE_LAND = "artist_grid_size_land"; - private static final String COLORED_APP_SHORTCUTS = "colored_app_shortcuts"; - private static final String AUDIO_DUCKING = "audio_ducking"; - private static final String LAST_ADDED_CUTOFF = "last_added_interval"; - private static final String LAST_SLEEP_TIMER_VALUE = "last_sleep_timer_value"; - private static final String NEXT_SLEEP_TIMER_ELAPSED_REALTIME = "next_sleep_timer_elapsed_real_time"; - private static final String IGNORE_MEDIA_STORE_ARTWORK = "ignore_media_store_artwork"; - private static final String LAST_CHANGELOG_VERSION = "last_changelog_version"; - private static final String AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy"; - private static final String START_DIRECTORY = "start_directory"; - private static final String LOCK_SCREEN = "lock_screen"; - private static final String ALBUM_DETAIL_SONG_SORT_ORDER = "album_detail_song_sort_order"; - private static final String LYRICS_OPTIONS = "lyrics_tab_position"; - private static final String CHOOSE_EQUALIZER = "choose_equalizer"; - private static final String TOGGLE_SHUFFLE = "toggle_shuffle"; - private static final String SONG_GRID_STYLE = "song_grid_style"; - private static final String PAUSE_ON_ZERO_VOLUME = "pause_on_zero_volume"; - private static final String FILTER_SONG = "filter_song"; - private static final String EXPAND_NOW_PLAYING_PANEL = "expand_now_playing_panel"; - private static PreferenceUtil sInstance; - private final SharedPreferences mPreferences; - - private PreferenceUtil(@NonNull final Context context) { - mPreferences = PreferenceManager.getDefaultSharedPreferences(context); - } - - @NonNull - public static PreferenceUtil getInstance(Context context) { - if (sInstance == null) { - sInstance = new PreferenceUtil(context); - } - return sInstance; - } - - @StyleRes - public static int getThemeResFromPrefValue(@NonNull String themePrefValue) { - switch (themePrefValue) { - case "light": - return R.style.Theme_RetroMusic_Light; - case "dark": - default: - return R.style.Theme_RetroMusic; - } - } - - public static boolean isAllowedToDownloadMetadata(@NonNull Context context) { - switch (getInstance(context).autoDownloadImagesPolicy()) { - case "always": - return true; - case "only_wifi": - final ConnectivityManager connectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo netInfo = null; - if (connectivityManager != null) { - netInfo = connectivityManager.getActiveNetworkInfo(); - } - return netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI && netInfo - .isConnectedOrConnecting(); - case "never": - default: - return false; - } - } - - public final boolean albumArtOnLockscreen() { - return mPreferences.getBoolean(ALBUM_ART_ON_LOCKSCREEN, true); - } - - public final boolean audioDucking() { - return mPreferences.getBoolean(AUDIO_DUCKING, true); - } - - public final String autoDownloadImagesPolicy() { - return mPreferences.getString(AUTO_DOWNLOAD_IMAGES_POLICY, "only_wifi"); - } - - public boolean bluetoothSpeaker() { - return mPreferences.getBoolean(BLUETOOTH_PLAYBACK, false); - } - - public final boolean blurredAlbumArt() { - return mPreferences.getBoolean(BLURRED_ALBUM_ART, false); - } - - public boolean carouselEffect() { - return mPreferences.getBoolean(CAROUSEL_EFFECT, false); - } - - public final boolean classicNotification() { - return mPreferences.getBoolean(CLASSIC_NOTIFICATION, false); - } - - public final boolean coloredAppShortcuts() { - return mPreferences.getBoolean(COLORED_APP_SHORTCUTS, true); - } - - public final boolean coloredNotification() { - return mPreferences.getBoolean(COLORED_NOTIFICATION, true); - } - - public boolean desaturatedColor() { - return mPreferences.getBoolean(DESATURATED_COLOR, false); - } - - public final boolean gaplessPlayback() { - return mPreferences.getBoolean(GAPLESS_PLAYBACK, false); - } - - public boolean getAdaptiveColor() { - return mPreferences.getBoolean(ADAPTIVE_COLOR_APP, false); - } - - public final AlbumCoverStyle getAlbumCoverStyle() { - int id = mPreferences.getInt(ALBUM_COVER_STYLE, 0); - for (AlbumCoverStyle albumCoverStyle : AlbumCoverStyle.values()) { - if (albumCoverStyle.getId() == id) { - return albumCoverStyle; - } - } - return AlbumCoverStyle.CARD; - } - - public void setAlbumCoverStyle(AlbumCoverStyle albumCoverStyle) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(ALBUM_COVER_STYLE, albumCoverStyle.getId()); - editor.apply(); - } - - public ViewPager.PageTransformer getAlbumCoverTransform() { - int style = Integer.parseInt(Objects.requireNonNull(mPreferences.getString(ALBUM_COVER_TRANSFORM, "0"))); - switch (style) { - default: - case 0: - return new NormalPageTransformer(); - case 1: - return new CascadingPageTransformer(); - case 2: - return new DepthTransformation(); - case 3: - return new HorizontalFlipTransformation(); - case 4: - return new VerticalFlipTransformation(); - case 5: - return new HingeTransformation(); - case 6: - return new VerticalStackTransformer(); - } - } - - public String getAlbumDetailSongSortOrder() { - return mPreferences - .getString(ALBUM_DETAIL_SONG_SORT_ORDER, AlbumSongSortOrder.SONG_TRACK_LIST); - } - - public void setAlbumDetailSongSortOrder(String sortOrder) { - Editor edit = this.mPreferences.edit(); - edit.putString(ALBUM_DETAIL_SONG_SORT_ORDER, sortOrder); - edit.apply(); - } - - public final int getAlbumGridSize(@NonNull Context context) { - return mPreferences - .getInt(ALBUM_GRID_SIZE, context.getResources().getInteger(R.integer.default_grid_columns)); - } - - public final int getAlbumGridSizeLand(@NonNull Context context) { - return mPreferences - .getInt(ALBUM_GRID_SIZE_LAND, context.getResources().getInteger(R.integer.default_grid_columns_land)); - } - - - @LayoutRes - public int getAlbumGridStyle() { - return mPreferences.getInt(ALBUM_GRID_STYLE, R.layout.item_grid); - } - - public void setAlbumGridStyle(int layoutRes) { - mPreferences.edit() - .putInt(ALBUM_GRID_STYLE, layoutRes) - .apply(); - } - - public final String getAlbumSongSortOrder() { - return mPreferences - .getString(ALBUM_SONG_SORT_ORDER, AlbumSongSortOrder.SONG_TRACK_LIST); - } - - public final String getArtistSongSortOrder() { - return mPreferences - .getString(ARTIST_SONG_SORT_ORDER, ArtistSongSortOrder.SONG_A_Z); - } - - public final String getAlbumSortOrder() { - return mPreferences.getString(ALBUM_SORT_ORDER, AlbumSortOrder.ALBUM_A_Z); - } - - public void setAlbumSortOrder(final String sortOrder) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(ALBUM_SORT_ORDER, sortOrder); - editor.apply(); - } - - public final String getArtistAlbumSortOrder() { - return mPreferences.getString(ARTIST_ALBUM_SORT_ORDER, ArtistAlbumSortOrder.ALBUM_A_Z); - } - - public final int getArtistGridSize(Context context) { - return mPreferences.getInt(ARTIST_GRID_SIZE, - context.getResources().getInteger(R.integer.default_list_artist_columns)); - } - - public final int getArtistGridSizeLand(Context context) { - return mPreferences.getInt(ARTIST_GRID_SIZE_LAND, - context.getResources().getInteger(R.integer.default_list_artist_columns_land)); - } - - @LayoutRes - public int getArtistGridStyle() { - return mPreferences.getInt(ARTIST_GRID_STYLE, R.layout.item_grid_circle); - } - - public void setArtistGridStyle(@LayoutRes int artistGridStyle) { - mPreferences.edit().putInt(ARTIST_GRID_STYLE, artistGridStyle).apply(); - } - - public final String getArtistSortOrder() { - return mPreferences.getString(ARTIST_SORT_ORDER, ArtistSortOrder.ARTIST_A_Z); - } - - public void setArtistSortOrder(final String sortOrder) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(ARTIST_SORT_ORDER, sortOrder); - editor.apply(); - } - - public String getBannerImage() { - return mPreferences.getString(BANNER_IMAGE_PATH, ""); - } - - public String getBaseTheme() { - return mPreferences.getString(GENERAL_THEME, "auto"); - } - - @NonNull - public List getDefaultLibraryCategoryInfos() { - List defaultCategoryInfos = new ArrayList<>(8); - defaultCategoryInfos.add(new CategoryInfo(Category.HOME, true)); - defaultCategoryInfos.add(new CategoryInfo(Category.SONGS, true)); - defaultCategoryInfos.add(new CategoryInfo(Category.ALBUMS, true)); - defaultCategoryInfos.add(new CategoryInfo(Category.ARTISTS, true)); - defaultCategoryInfos.add(new CategoryInfo(Category.PLAYLISTS, true)); - defaultCategoryInfos.add(new CategoryInfo(Category.GENRES, false)); - defaultCategoryInfos.add(new CategoryInfo(Category.QUEUE, false)); - defaultCategoryInfos.add(new CategoryInfo(Category.FOLDER, false)); - return defaultCategoryInfos; - } - - public float getDialogCorner() { - return mPreferences.getInt(DIALOG_CORNER, 16); - } - - public int getFilterLength() { - return mPreferences.getInt(FILTER_SONG, 20); - } - - public boolean getFullScreenMode() { - return mPreferences.getBoolean(TOGGLE_FULL_SCREEN, false); - } - - @NonNull - public ThemeMode getGeneralThemeValue(boolean isSystemDark) { - String themeMode = mPreferences.getString(GENERAL_THEME, "auto"); - if (isBlackMode() && isSystemDark) { - return ThemeMode.BLACK; - } else if (themeMode != null) { - if (isBlackMode() && themeMode.equals("dark")) { - return ThemeMode.BLACK; - } else { - switch (themeMode) { - case "light": - return ThemeMode.LIGHT; - case "dark": - return ThemeMode.DARK; - case "auto": - default: - return ThemeMode.AUTO; - } - } - } - return ThemeMode.AUTO; - } - - public final String getGenreSortOrder() { - return mPreferences.getString(GENRE_SORT_ORDER, GenreSortOrder.GENRE_A_Z); - } - - public boolean getHeadsetPlugged() { - return mPreferences.getBoolean(TOGGLE_HEADSET, false); - } - - @LayoutRes - public int getHomeGridStyle(@NonNull Context context) { - String position = mPreferences.getString(HOME_ARTIST_GRID_STYLE, "0"); - int pos = 0; - if (position != null) { - pos = Integer.parseInt(position); - } - TypedArray typedArray = context.getResources().obtainTypedArray(R.array.pref_home_grid_style_layout); - int layoutRes = typedArray.getResourceId(pos, 0); - typedArray.recycle(); - if (layoutRes == 0) { - return R.layout.item_artist; - } - return layoutRes; - } - - public long getLastAddedCutoff() { - final CalendarUtil calendarUtil = new CalendarUtil(); - long interval = calendarUtil.getElapsedMonth(); - String cutOff = mPreferences.getString(LAST_ADDED_CUTOFF, "this_month"); - if (cutOff != null) { - switch (cutOff) { - case "today": - interval = calendarUtil.getElapsedToday(); - break; - case "this_week": - interval = calendarUtil.getElapsedWeek(); - break; - case "past_three_months": - interval = calendarUtil.getElapsedMonths(3); - break; - case "this_year": - interval = calendarUtil.getElapsedYear(); - break; - case "this_month": - default: - interval = calendarUtil.getElapsedMonth(); - break; - } - } - return (System.currentTimeMillis() - interval) / 1000; - } - - public final int getLastChangelogVersion() { - return mPreferences.getInt(LAST_CHANGELOG_VERSION, -1); - } - - public final int getLastPage() { - return mPreferences.getInt(LAST_PAGE, R.id.action_song); - } - - public void setLastPage(final int value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(LAST_PAGE, value); - editor.apply(); - } - - public int getLastSleepTimerValue() { - return mPreferences.getInt(LAST_SLEEP_TIMER_VALUE, 30); - } - - public void setLastSleepTimerValue(final int value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(LAST_SLEEP_TIMER_VALUE, value); - editor.apply(); - } - - @NonNull - public List getLibraryCategoryInfos() { - String data = mPreferences.getString(LIBRARY_CATEGORIES, null); - if (data != null) { - Gson gson = new Gson(); - Type collectionType = new TypeToken>() { - }.getType(); - - try { - return gson.fromJson(data, collectionType); - } catch (JsonSyntaxException e) { - e.printStackTrace(); - } - } - - return getDefaultLibraryCategoryInfos(); - } - - public void setLibraryCategoryInfos(List categories) { - Gson gson = new Gson(); - Type collectionType = new TypeToken>() { - }.getType(); - - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(LIBRARY_CATEGORIES, gson.toJson(categories, collectionType)); - editor.apply(); - } - - public boolean getLockScreen() { - return mPreferences.getBoolean(LOCK_SCREEN, false); - } - - public int getLyricsOptions() { - return mPreferences.getInt(LYRICS_OPTIONS, 1); - } - - public void setLyricsOptions(int i) { - mPreferences.edit().putInt(LYRICS_OPTIONS, i).apply(); - } - - public long getNextSleepTimerElapsedRealTime() { - return mPreferences.getLong(NEXT_SLEEP_TIMER_ELAPSED_REALTIME, -1); - } - - public final NowPlayingScreen getNowPlayingScreen() { - int id = mPreferences.getInt(NOW_PLAYING_SCREEN_ID, 0); - for (NowPlayingScreen nowPlayingScreen : NowPlayingScreen.values()) { - if (nowPlayingScreen.getId() == id) { - return nowPlayingScreen; - } - } - return NowPlayingScreen.Adaptive; - } - - @SuppressLint("CommitPrefEdits") - public void setNowPlayingScreen(NowPlayingScreen nowPlayingScreen) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(NOW_PLAYING_SCREEN_ID, nowPlayingScreen.getId()); - editor.apply(); - } - - - public final String getSAFSDCardUri() { - return mPreferences.getString(SAF_SDCARD_URI, ""); - } - - public final void setSAFSDCardUri(Uri uri) { - mPreferences.edit().putString(SAF_SDCARD_URI, uri.toString()).apply(); - } - - public String getSelectedEqualizer() { - return mPreferences.getString(CHOOSE_EQUALIZER, "system"); - } - - public boolean getSleepTimerFinishMusic() { - return mPreferences.getBoolean(SLEEP_TIMER_FINISH_SONG, false); - } - - public void setSleepTimerFinishMusic(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(SLEEP_TIMER_FINISH_SONG, value); - editor.apply(); - } - - public final int getSongGridSize(Context context) { - return mPreferences - .getInt(SONG_GRID_SIZE, context.getResources().getInteger(R.integer.default_list_columns)); - } - - public final int getSongGridSizeLand(Context context) { - return mPreferences.getInt(SONG_GRID_SIZE_LAND, - context.getResources().getInteger(R.integer.default_list_columns_land)); - } - - public int getSongGridStyle() { - return mPreferences.getInt(SONG_GRID_STYLE, R.layout.item_list); - } - - public void setSongGridStyle(int viewAs) { - mPreferences.edit().putInt(SONG_GRID_STYLE, viewAs).apply(); - } - - public final String getSongSortOrder() { - return mPreferences.getString(SONG_SORT_ORDER, SongSortOrder.SONG_A_Z); - } - - public void setSongSortOrder(final String sortOrder) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(SONG_SORT_ORDER, sortOrder); - editor.apply(); - } - - public final File getStartDirectory() { - String folderPath = FoldersFragment.getDefaultStartDirectory().getPath(); - String file = mPreferences.getString(START_DIRECTORY, folderPath); - if (file != null) { - return new File(file); - } - return new File(FoldersFragment.getDefaultStartDirectory().getPath()); - } - - public void setStartDirectory(File file) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(START_DIRECTORY, FileUtil.safeGetCanonicalPath(file)); - editor.apply(); - } - - @LabelVisibilityMode - public int getTabTitleMode() { - String textMode = mPreferences.getString(TAB_TEXT_MODE, "1"); - int mode = 0; - if (textMode != null) { - mode = Integer.parseInt(textMode); - } - switch (mode) { - default: - case 1: - return LabelVisibilityMode.LABEL_VISIBILITY_LABELED; - case 0: - return LabelVisibilityMode.LABEL_VISIBILITY_AUTO; - case 2: - return LabelVisibilityMode.LABEL_VISIBILITY_SELECTED; - case 3: - return LabelVisibilityMode.LABEL_VISIBILITY_UNLABELED; - } - } - - - public String getUserName() { - return mPreferences.getString(USER_NAME, "User"); - } - - public void setUserName(String name) { - mPreferences.edit().putString(USER_NAME, name).apply(); - } - - public boolean getVolumeToggle() { - return mPreferences.getBoolean(TOGGLE_VOLUME, false); - } - - public final boolean ignoreMediaStoreArtwork() { - return mPreferences.getBoolean(IGNORE_MEDIA_STORE_ARTWORK, false); - } - - public final boolean initializedBlacklist() { - return mPreferences.getBoolean(INITIALIZED_BLACKLIST, false); - } - - private boolean isBlackMode() { - return mPreferences.getBoolean(BLACK_THEME, false); - } - - - public boolean isExtraControls() { - return mPreferences.getBoolean(TOGGLE_ADD_CONTROLS, false); - } - - - public final boolean isHomeBanner() { - return mPreferences.getBoolean(TOGGLE_HOME_BANNER, false); - } - - public boolean isRoundCorners() { - return mPreferences.getBoolean(ROUND_CORNERS, false); - } - - public boolean isScreenOnEnabled() { - return mPreferences.getBoolean(KEEP_SCREEN_ON, false); - } - - public boolean isShuffleModeOn() { - return mPreferences.getBoolean(TOGGLE_SHUFFLE, false); - } - - - public boolean isSongInfo() { - return mPreferences.getBoolean(EXTRA_SONG_INFO, false); - } - - public boolean pauseOnZeroVolume() { - return mPreferences.getBoolean(PAUSE_ON_ZERO_VOLUME, false); - } - - public void registerOnSharedPreferenceChangedListener( - SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { - mPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - } - - - public void setAlbumGridSize(final int gridSize) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(ALBUM_GRID_SIZE, gridSize); - editor.apply(); - } - - public void setAlbumGridSizeLand(final int gridSize) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(ALBUM_GRID_SIZE_LAND, gridSize); - editor.apply(); - } - - - public void setArtistGridSize(final int gridSize) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(ARTIST_GRID_SIZE, gridSize); - editor.apply(); - } - - public void setArtistGridSizeLand(final int gridSize) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(ARTIST_GRID_SIZE_LAND, gridSize); - editor.apply(); - } - - public void setBannerImagePath(String bannerImagePath) { - mPreferences.edit().putString(BANNER_IMAGE_PATH, bannerImagePath) - .apply(); - } - - public void setClassicNotification(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(CLASSIC_NOTIFICATION, value); - editor.apply(); - } - - public void setColoredAppShortcuts(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(COLORED_APP_SHORTCUTS, value); - editor.apply(); - } - - public final void setColoredNotification(boolean b) { - mPreferences.edit().putBoolean(COLORED_NOTIFICATION, b).apply(); - } - - public void setDesaturatedColor(boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(DESATURATED_COLOR, value); - editor.apply(); - } - - public void setInitializedBlacklist() { - final Editor editor = mPreferences.edit(); - editor.putBoolean(INITIALIZED_BLACKLIST, true); - editor.apply(); - } - - public void setLastChangeLogVersion(int version) { - mPreferences.edit().putInt(LAST_CHANGELOG_VERSION, version).apply(); - } - - - public void setNextSleepTimerElapsedRealtime(final long value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putLong(NEXT_SLEEP_TIMER_ELAPSED_REALTIME, value); - editor.apply(); - } - - public void setSongGridSize(final int gridSize) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(SONG_GRID_SIZE, gridSize); - editor.apply(); - } - - public void setSongGridSizeLand(final int gridSize) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt(SONG_GRID_SIZE_LAND, gridSize); - editor.apply(); - } - - public void unregisterOnSharedPreferenceChangedListener( - @NonNull OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { - mPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - } - - public boolean isExpandPanel() { - return mPreferences.getBoolean(EXPAND_NOW_PLAYING_PANEL, false); - } - - public String getLanguageCode() { - return mPreferences.getString(LANGUAGE_NAME, "auto"); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt new file mode 100644 index 000000000..d01451cc7 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -0,0 +1,552 @@ +package code.name.monkey.retromusic.util + +import android.content.SharedPreferences.OnSharedPreferenceChangeListener +import android.net.ConnectivityManager +import android.net.NetworkInfo +import androidx.core.content.ContextCompat +import androidx.core.content.edit +import androidx.preference.PreferenceManager +import androidx.viewpager.widget.ViewPager +import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.extensions.getIntRes +import code.name.monkey.retromusic.extensions.getStringOrDefault +import code.name.monkey.retromusic.fragments.AlbumCoverStyle +import code.name.monkey.retromusic.fragments.NowPlayingScreen +import code.name.monkey.retromusic.fragments.mainactivity.FoldersFragment +import code.name.monkey.retromusic.helper.SortOrder.* +import code.name.monkey.retromusic.model.CategoryInfo +import code.name.monkey.retromusic.transform.* +import code.name.monkey.retromusic.util.theme.ThemeMode +import com.google.android.material.bottomnavigation.LabelVisibilityMode +import com.google.gson.Gson +import com.google.gson.JsonSyntaxException +import com.google.gson.reflect.TypeToken +import java.io.File + +object PreferenceUtilKT { + private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(App.getContext()) + + val defaultCategories = listOf( + CategoryInfo(CategoryInfo.Category.HOME, true), + CategoryInfo(CategoryInfo.Category.SONGS, true), + CategoryInfo(CategoryInfo.Category.ALBUMS, true), + CategoryInfo(CategoryInfo.Category.ARTISTS, true), + CategoryInfo(CategoryInfo.Category.PLAYLISTS, true), + CategoryInfo(CategoryInfo.Category.GENRES, false), + CategoryInfo(CategoryInfo.Category.QUEUE, false), + CategoryInfo(CategoryInfo.Category.FOLDER, false) + ) + + var libraryCategory: List + get() { + val gson = Gson() + val collectionType = object : TypeToken>() {}.type + + val data = sharedPreferences.getStringOrDefault( + LIBRARY_CATEGORIES, + gson.toJson(defaultCategories, collectionType) + ) + return try { + Gson().fromJson(data, collectionType) + } catch (e: JsonSyntaxException) { + e.printStackTrace() + return defaultCategories + } + } + set(value) { + val collectionType = object : TypeToken?>() {}.type + sharedPreferences.edit { + putString(LIBRARY_CATEGORIES, Gson().toJson(value, collectionType)) + } + } + + fun registerOnSharedPreferenceChangedListener( + changeListener: OnSharedPreferenceChangeListener + ) { + sharedPreferences.registerOnSharedPreferenceChangeListener(changeListener) + } + + fun unregisterOnSharedPreferenceChangedListener( + changeListener: OnSharedPreferenceChangeListener + ) { + sharedPreferences.unregisterOnSharedPreferenceChangeListener(changeListener) + } + + val baseTheme get() = sharedPreferences.getStringOrDefault(GENERAL_THEME, "auto") + + fun getGeneralThemeValue(isSystemDark: Boolean): ThemeMode { + val themeMode: String = + sharedPreferences.getStringOrDefault(GENERAL_THEME, "auto") + return if (isBlackMode && isSystemDark) { + ThemeMode.BLACK + } else { + if (isBlackMode && themeMode == "dark") { + ThemeMode.BLACK + } else { + when (themeMode) { + "light" -> ThemeMode.LIGHT + "dark" -> ThemeMode.DARK + "auto" -> ThemeMode.AUTO + else -> ThemeMode.AUTO + } + } + } + } + + val languageCode get() = sharedPreferences.getString(LANGUAGE_NAME, "auto") + + var userName + get() = sharedPreferences.getString(USER_NAME, "User Name") + set(value) = sharedPreferences.edit { + putString(USER_NAME, value) + } + + var safSdCardUri + get() = sharedPreferences.getStringOrDefault(SAF_SDCARD_URI, "") + set(value) = sharedPreferences.edit { + putString(SAF_SDCARD_URI, value) + } + + + val selectedEqualizer + get() = sharedPreferences.getStringOrDefault( + CHOOSE_EQUALIZER, + "system" + ) + + val autoDownloadImagesPolicy + get() = sharedPreferences.getStringOrDefault( + AUTO_DOWNLOAD_IMAGES_POLICY, + "only_wifi" + ) + + var albumDetailSongSortOrder + get() = sharedPreferences.getStringOrDefault( + ALBUM_DETAIL_SONG_SORT_ORDER, + AlbumSongSortOrder.SONG_TRACK_LIST + ) + set(value) = sharedPreferences.edit { putString(ALBUM_DETAIL_SONG_SORT_ORDER, value) } + + var songSortOrder + get() = sharedPreferences.getStringOrDefault( + SONG_SORT_ORDER, + SongSortOrder.SONG_A_Z + ) + set(value) = sharedPreferences.edit { + putString(SONG_SORT_ORDER, value) + } + + var albumSortOrder + get() = sharedPreferences.getStringOrDefault( + ALBUM_SORT_ORDER, + AlbumSortOrder.ALBUM_A_Z + ) + set(value) = sharedPreferences.edit { + putString(ALBUM_SORT_ORDER, value) + } + + var artistSortOrder + get() = sharedPreferences.getStringOrDefault( + ARTIST_SORT_ORDER, + AlbumSortOrder.ALBUM_A_Z + ) + set(value) = sharedPreferences.edit { + putString(ARTIST_SORT_ORDER, value) + } + + val albumSongSortOrder + get() = sharedPreferences.getStringOrDefault( + ALBUM_SONG_SORT_ORDER, + AlbumSongSortOrder.SONG_TRACK_LIST + ) + + val artistSongSortOrder + get() = sharedPreferences.getStringOrDefault( + ARTIST_SONG_SORT_ORDER, + AlbumSongSortOrder.SONG_TRACK_LIST + ) + + val artistAlbumSortOrder + get() = sharedPreferences.getStringOrDefault( + ARTIST_ALBUM_SORT_ORDER, + ArtistAlbumSortOrder.ALBUM_A_Z + ) + + val genreSortOrder + get() = sharedPreferences.getStringOrDefault( + GENRE_SORT_ORDER, + GenreSortOrder.GENRE_A_Z + ) + + val isIgnoreMediaStoreArtwork + get() = sharedPreferences.getBoolean( + IGNORE_MEDIA_STORE_ARTWORK, + false + ) + + val isVolumeVisibilityMode + get() = sharedPreferences.getBoolean( + TOGGLE_VOLUME, false + ) + + var isInitializedBlacklist + get() = sharedPreferences.getBoolean( + INITIALIZED_BLACKLIST, false + ) + set(value) = sharedPreferences.edit { + putBoolean(INITIALIZED_BLACKLIST, value) + } + + private val isBlackMode + get() = sharedPreferences.getBoolean( + BLACK_THEME, false + ) + + val isExtraControls + get() = sharedPreferences.getBoolean( + TOGGLE_ADD_CONTROLS, false + ) + + val isHomeBanner + get() = sharedPreferences.getBoolean( + TOGGLE_HOME_BANNER, false + ) + var isClassicNotification + get() = sharedPreferences.getBoolean(CLASSIC_NOTIFICATION, false) + set(value) = sharedPreferences.edit { putBoolean(CLASSIC_NOTIFICATION, value) } + + val isScreenOnEnabled get() = sharedPreferences.getBoolean(KEEP_SCREEN_ON, false) + + val isShuffleModeOn get() = sharedPreferences.getBoolean(TOGGLE_SHUFFLE, false) + + val isSongInfo get() = sharedPreferences.getBoolean(EXTRA_SONG_INFO, false) + + val isPauseOnZeroVolume get() = sharedPreferences.getBoolean(PAUSE_ON_ZERO_VOLUME, false) + + var isSleepTimerFinishMusic + get() = sharedPreferences.getBoolean( + SLEEP_TIMER_FINISH_SONG, false + ) + set(value) = sharedPreferences.edit { + putBoolean(SLEEP_TIMER_FINISH_SONG, value) + } + + val isExpandPanel get() = sharedPreferences.getBoolean(EXPAND_NOW_PLAYING_PANEL, false) + + val isHeadsetPlugged + get() = sharedPreferences.getBoolean( + TOGGLE_HEADSET, false + ) + + val isAlbumArtOnLockScreen + get() = sharedPreferences.getBoolean( + ALBUM_ART_ON_LOCKSCREEN, false + ) + + val isAudioDucking + get() = sharedPreferences.getBoolean( + AUDIO_DUCKING, true + ) + + val isBluetoothSpeaker + get() = sharedPreferences.getBoolean( + BLUETOOTH_PLAYBACK, false + ) + + val isBlurredAlbumArt + get() = sharedPreferences.getBoolean( + BLURRED_ALBUM_ART, false + ) + + val isCarouselEffect + get() = sharedPreferences.getBoolean( + CAROUSEL_EFFECT, false + ) + + var isColoredAppShortcuts + get() = sharedPreferences.getBoolean( + COLORED_APP_SHORTCUTS, true + ) + set(value) = sharedPreferences.edit { + putBoolean(COLORED_APP_SHORTCUTS, value) + } + + var isColoredNotification + get() = sharedPreferences.getBoolean( + COLORED_NOTIFICATION, true + ) + set(value) = sharedPreferences.edit { + putBoolean(COLORED_NOTIFICATION, value) + } + + var isDesaturatedColor + get() = sharedPreferences.getBoolean( + DESATURATED_COLOR, false + ) + set(value) = sharedPreferences.edit { + putBoolean(DESATURATED_COLOR, value) + } + + val isGapLessPlayback + get() = sharedPreferences.getBoolean( + GAPLESS_PLAYBACK, false + ) + + val isAdaptiveColor + get() = sharedPreferences.getBoolean( + ADAPTIVE_COLOR_APP, false + ) + + val isFullScreenMode + get() = sharedPreferences.getBoolean( + TOGGLE_FULL_SCREEN, false + ) + + val isLockScreen get() = sharedPreferences.getBoolean(LOCK_SCREEN, false) + + fun isAllowedToDownloadMetadata(): Boolean { + return when (autoDownloadImagesPolicy) { + "always" -> true + "only_wifi" -> { + val connectivityManager = ContextCompat.getSystemService( + App.getContext(), + ConnectivityManager::class.java + ) + var netInfo: NetworkInfo? = null + if (connectivityManager != null) { + netInfo = connectivityManager.activeNetworkInfo + } + netInfo != null && netInfo.type == ConnectivityManager.TYPE_WIFI && netInfo.isConnectedOrConnecting + } + "never" -> false + else -> false + } + } + + + var lyricsOption + get() = sharedPreferences.getInt(LYRICS_OPTIONS, 1) + set(value) = sharedPreferences.edit { + putInt(LYRICS_OPTIONS, value) + } + + var songGridStyle + get() = sharedPreferences.getInt(SONG_GRID_STYLE, R.layout.item_grid) + set(value) = sharedPreferences.edit { + putInt(SONG_GRID_STYLE, value) + } + + var albumGridStyle + get() = sharedPreferences.getInt(ALBUM_GRID_STYLE, R.layout.item_grid) + set(value) = sharedPreferences.edit { + putInt(ALBUM_GRID_STYLE, value) + } + + var artistGridStyle + get() = sharedPreferences.getInt(ARTIST_GRID_STYLE, R.layout.item_grid_circle) + set(value) = sharedPreferences.edit { + putInt(ARTIST_GRID_STYLE, value) + } + + val filterLength get() = sharedPreferences.getInt(FILTER_SONG, 20) + + var lastVersion + get() = sharedPreferences.getInt(LAST_CHANGELOG_VERSION, 0) + set(value) = sharedPreferences.edit { + putInt(LAST_CHANGELOG_VERSION, value) + } + + var lastSleepTimerValue + get() = sharedPreferences.getInt( + LAST_SLEEP_TIMER_VALUE, + 30 + ) + set(value) = sharedPreferences.edit { + putInt(LAST_SLEEP_TIMER_VALUE, value) + } + + var lastPage + get() = sharedPreferences.getInt(LAST_PAGE, R.id.action_song) + set(value) = sharedPreferences.edit { + putInt(LAST_PAGE, value) + } + + var nextSleepTimerElapsedRealTime + get() = sharedPreferences.getInt( + NEXT_SLEEP_TIMER_ELAPSED_REALTIME, + -1 + ) + set(value) = sharedPreferences.edit { + putInt(NEXT_SLEEP_TIMER_ELAPSED_REALTIME, value) + } + + fun themeResFromPrefValue(themePrefValue: String): Int { + return when (themePrefValue) { + "light" -> R.style.Theme_RetroMusic_Light + "dark" -> R.style.Theme_RetroMusic + else -> R.style.Theme_RetroMusic + } + } + + val homeGridStyle: Int + get() { + val position = + sharedPreferences.getStringOrDefault( + HOME_ARTIST_GRID_STYLE, "0" + ).toInt() + val typedArray = + App.getContext().resources.obtainTypedArray(R.array.pref_home_grid_style_layout) + val layoutRes = typedArray.getResourceId(position, 0) + typedArray.recycle() + return if (layoutRes == 0) { + R.layout.item_artist + } else layoutRes + } + + val tabTitleMode: Int + get() { + return when (sharedPreferences.getStringOrDefault( + TAB_TEXT_MODE, "1" + ).toInt()) { + 1 -> LabelVisibilityMode.LABEL_VISIBILITY_LABELED + 0 -> LabelVisibilityMode.LABEL_VISIBILITY_AUTO + 2 -> LabelVisibilityMode.LABEL_VISIBILITY_SELECTED + 3 -> LabelVisibilityMode.LABEL_VISIBILITY_UNLABELED + else -> LabelVisibilityMode.LABEL_VISIBILITY_LABELED + } + } + + + var songGridSize + get() = sharedPreferences.getInt( + SONG_GRID_SIZE, + App.getContext().getIntRes(R.integer.default_grid_columns) + ) + set(value) = sharedPreferences.edit { + putInt(SONG_GRID_SIZE, value) + } + + var songGridSizeLand + get() = sharedPreferences.getInt( + SONG_GRID_SIZE_LAND, + App.getContext().getIntRes(R.integer.default_grid_columns_land) + ) + set(value) = sharedPreferences.edit { + putInt(SONG_GRID_SIZE_LAND, value) + } + + + var albumGridSize: Int + get() = sharedPreferences.getInt( + ALBUM_GRID_SIZE, + App.getContext().getIntRes(R.integer.default_grid_columns) + ) + set(value) = sharedPreferences.edit { + putInt(ALBUM_GRID_SIZE, value) + } + + + var albumGridSizeLand + get() = sharedPreferences.getInt( + ALBUM_GRID_SIZE_LAND, + App.getContext().getIntRes(R.integer.default_grid_columns_land) + ) + set(value) = sharedPreferences.edit { + putInt(ALBUM_GRID_SIZE_LAND, value) + } + + + var artistGridSize + get() = sharedPreferences.getInt( + ARTIST_GRID_SIZE, + App.getContext().getIntRes(R.integer.default_grid_columns) + ) + set(value) = sharedPreferences.edit { + putInt(ARTIST_GRID_SIZE, value) + } + + + var artistGridSizeLand + get() = sharedPreferences.getInt( + ALBUM_GRID_SIZE_LAND, + App.getContext().getIntRes(R.integer.default_grid_columns_land) + ) + set(value) = sharedPreferences.edit { + putInt(ALBUM_GRID_SIZE_LAND, value) + } + + + var albumCoverStyle: AlbumCoverStyle + get() { + val id: Int = sharedPreferences.getInt(ALBUM_COVER_STYLE, 0) + for (albumCoverStyle in AlbumCoverStyle.values()) { + if (albumCoverStyle.id == id) { + return albumCoverStyle + } + } + return AlbumCoverStyle.CARD + } + set(value) = sharedPreferences.edit { putInt(ALBUM_COVER_STYLE, value.id) } + + + var nowPlayingScreen: NowPlayingScreen + get() { + val id: Int = sharedPreferences.getInt(NOW_PLAYING_SCREEN_ID, 0) + for (nowPlayingScreen in NowPlayingScreen.values()) { + if (nowPlayingScreen.id == id) { + return nowPlayingScreen + } + } + return NowPlayingScreen.Adaptive + } + set(value) = sharedPreferences.edit { + putInt(NOW_PLAYING_SCREEN_ID, value.id) + } + + val albumCoverTransform: ViewPager.PageTransformer + get() { + val style = sharedPreferences.getStringOrDefault( + ALBUM_COVER_TRANSFORM, + "0" + ).toInt() + return when (style) { + 0 -> NormalPageTransformer() + 1 -> CascadingPageTransformer() + 2 -> DepthTransformation() + 3 -> HorizontalFlipTransformation() + 4 -> VerticalFlipTransformation() + 5 -> HingeTransformation() + 6 -> VerticalStackTransformer() + else -> NormalPageTransformer() + } + } + + var startDirectory: File + get() { + val folderPath = FoldersFragment.getDefaultStartDirectory().path + val filePath: String = sharedPreferences.getStringOrDefault(START_DIRECTORY, folderPath) + return File(filePath) ?: File(FoldersFragment.getDefaultStartDirectory().path) + } + set(value) = sharedPreferences.edit { + putString( + START_DIRECTORY, + FileUtil.safeGetCanonicalPath(value) + ) + } + + val lastAddedCutoff: Long + get() { + val calendarUtil = CalendarUtil() + val interval = + when (sharedPreferences.getStringOrDefault(LAST_ADDED_CUTOFF, "this_month")) { + "today" -> calendarUtil.elapsedToday + "this_week" -> calendarUtil.elapsedWeek + "past_three_months" -> calendarUtil.getElapsedMonths(3) + "this_year" -> calendarUtil.elapsedYear + "this_month" -> calendarUtil.elapsedMonth + else -> calendarUtil.elapsedMonth + } + return (System.currentTimeMillis() - interval) / 1000 + } + +} diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt b/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt index 32adff228..e85870d79 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt @@ -10,6 +10,7 @@ object PremiumShow { private const val PREF_NAME = "premium_show" private const val LAUNCH_COUNT = "launch_count" private const val DATE_FIRST_LAUNCH = "date_first_launch" + @JvmStatic fun launch(context: Context) { val pref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java index d4f5d3680..6a62c1cf0 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java @@ -142,7 +142,7 @@ public class RetroUtil { } public static boolean isAllowedToDownloadMetadata(final @NonNull Context context) { - switch (PreferenceUtil.getInstance(context).autoDownloadImagesPolicy()) { + switch (PreferenceUtilKT.INSTANCE.getAutoDownloadImagesPolicy()) { case "always": return true; case "only_wifi": 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 75ce21381..6d99d0bb0 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 @@ -26,9 +26,7 @@ import android.widget.Toast import code.name.monkey.retromusic.R import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil.getSongFileUri -import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet class RingtoneManager(val context: Context) { fun setRingtone(song: Song) { @@ -76,7 +74,6 @@ class RingtoneManager(val context: Context) { fun getDialog(context: Context): MaterialDialog { return MaterialDialog(context).show { - cornerRadius(PreferenceUtil.getInstance(context).dialogCorner) title(R.string.dialog_title_set_ringtone) message(R.string.dialog_message_set_ringtone) positiveButton(android.R.string.ok) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java index d8d2af696..725747923 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java @@ -119,19 +119,19 @@ public class SAFUtil { public static void saveTreeUri(Context context, Intent data) { Uri uri = data.getData(); context.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); - PreferenceUtil.getInstance(context).setSAFSDCardUri(uri); + PreferenceUtilKT.INSTANCE.setSafSdCardUri(uri.toString()); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isTreeUriSaved(Context context) { - return !TextUtils.isEmpty(PreferenceUtil.getInstance(context).getSAFSDCardUri()); + return !TextUtils.isEmpty(PreferenceUtilKT.INSTANCE.getSafSdCardUri()); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isSDCardAccessGranted(Context context) { if (!isTreeUriSaved(context)) return false; - String sdcardUri = PreferenceUtil.getInstance(context).getSAFSDCardUri(); + String sdcardUri = PreferenceUtilKT.INSTANCE.getSafSdCardUri(); List perms = context.getContentResolver().getPersistedUriPermissions(); for (UriPermission perm : perms) { @@ -198,7 +198,7 @@ public class SAFUtil { if (isTreeUriSaved(context)) { List pathSegments = new ArrayList<>(Arrays.asList(audio.getFile().getAbsolutePath().split("/"))); - Uri sdcard = Uri.parse(PreferenceUtil.getInstance(context).getSAFSDCardUri()); + Uri sdcard = Uri.parse(PreferenceUtilKT.INSTANCE.getSafSdCardUri()); uri = findDocument(DocumentFile.fromTreeUri(context, sdcard), pathSegments); } @@ -271,7 +271,7 @@ public class SAFUtil { if (isTreeUriSaved(context)) { List pathSegments = new ArrayList<>(Arrays.asList(path.split("/"))); - Uri sdcard = Uri.parse(PreferenceUtil.getInstance(context).getSAFSDCardUri()); + Uri sdcard = Uri.parse(PreferenceUtilKT.INSTANCE.getSafSdCardUri()); uri = findDocument(DocumentFile.fromTreeUri(context, sdcard), pathSegments); } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt index b256915d9..d20338fbf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt @@ -41,7 +41,8 @@ object ViewUtil { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { val layerDrawable = progressSlider.progressDrawable as LayerDrawable val progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress) - progressDrawable.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(newColor, SRC_IN) + progressDrawable.colorFilter = + BlendModeColorFilterCompat.createBlendModeColorFilterCompat(newColor, SRC_IN) } else { progressSlider.progressTintList = ColorStateList.valueOf(newColor) } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt b/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt index 409cbc150..106ecb994 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt @@ -1,13 +1,10 @@ package code.name.monkey.retromusic.util.theme import android.content.Context -import android.content.res.Configuration -import android.os.PowerManager import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDelegate import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.theme.ThemeManager.isSystemDarkModeEnabled +import code.name.monkey.retromusic.extensions.generalThemeValue import code.name.monkey.retromusic.util.theme.ThemeMode.* object ThemeManager { @@ -30,19 +27,5 @@ object ThemeManager { BLACK -> AppCompatDelegate.MODE_NIGHT_YES AUTO -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM } - - fun isSystemDarkModeEnabled(context: Context): Boolean { - val isBatterySaverEnabled = - (context.getSystemService(Context.POWER_SERVICE) as PowerManager?)?.isPowerSaveMode - ?: false - val isDarkModeEnabled = - (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES - - return isBatterySaverEnabled or isDarkModeEnabled - } } -val Context.generalThemeValue: ThemeMode - get() { - return PreferenceUtil.getInstance(this).getGeneralThemeValue(isSystemDarkModeEnabled(this)) - } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt b/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt index c7e6f1552..32cdf55ee 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt @@ -25,7 +25,7 @@ import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.NavigationViewUtil import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RippleUtils import com.google.android.material.bottomnavigation.BottomNavigationView @@ -36,8 +36,8 @@ class BottomNavigationBarTinted @JvmOverloads constructor( ) : BottomNavigationView(context, attrs, defStyleAttr) { init { - labelVisibilityMode = PreferenceUtil.getInstance(context).tabTitleMode - selectedItemId = PreferenceUtil.getInstance(context).lastPage + labelVisibilityMode = PreferenceUtilKT.tabTitleMode + selectedItemId = PreferenceUtilKT.lastPage val iconColor = ATHUtil.resolveColor(context, android.R.attr.colorControlNormal) val accentColor = ThemeStore.accentColor(context) diff --git a/app/src/main/java/code/name/monkey/retromusic/views/ColorIconsImageView.kt b/app/src/main/java/code/name/monkey/retromusic/views/ColorIconsImageView.kt index 18f3bd30f..48e7dd856 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/ColorIconsImageView.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/ColorIconsImageView.kt @@ -23,7 +23,7 @@ import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtilKT import code.name.monkey.retromusic.util.RetroColorUtil @@ -46,7 +46,7 @@ class ColorIconsImageView @JvmOverloads constructor( fun setIconBackgroundColor(color: Int) { background = ContextCompat.getDrawable(context, R.drawable.color_circle_gradient) - if (ATHUtil.isWindowBackgroundDark(context) && PreferenceUtil.getInstance(context).desaturatedColor()) { + if (ATHUtil.isWindowBackgroundDark(context) && PreferenceUtilKT.isDesaturatedColor) { val desaturatedColor = RetroColorUtil.desaturateColor(color, 0.4f) backgroundTintList = ColorStateList.valueOf(desaturatedColor) imageTintList = diff --git a/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java b/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java index 36b6aac95..88b930c73 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java +++ b/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java @@ -118,7 +118,7 @@ public class PopupBackground extends Drawable { updatePath(); return true; } - + @Override protected void onBoundsChange(@NonNull Rect bounds) { diff --git a/app/src/main/res/anim/item_animation_fall_down.xml b/app/src/main/res/anim/item_animation_fall_down.xml deleted file mode 100644 index a13e21e6f..000000000 --- a/app/src/main/res/anim/item_animation_fall_down.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/layout_animation_fall_down.xml b/app/src/main/res/anim/layout_animation_fall_down.xml deleted file mode 100644 index 6736b9f7d..000000000 --- a/app/src/main/res/anim/layout_animation_fall_down.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi-v24/ic_notification.xml b/app/src/main/res/drawable-anydpi-v24/ic_notification.xml index 4dbbe7f3d..5f83d4813 100644 --- a/app/src/main/res/drawable-anydpi-v24/ic_notification.xml +++ b/app/src/main/res/drawable-anydpi-v24/ic_notification.xml @@ -4,10 +4,11 @@ android:viewportWidth="26.086956" android:viewportHeight="26.086956" android:tint="#FFFFFF"> - - - + + + diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index 33f5953d2..da4d42d65 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -4,55 +4,68 @@ android:height="108dp" android:viewportWidth="921.0526" android:viewportHeight="921.0526"> - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_check_circle_white_24dp.xml b/app/src/main/res/drawable/ic_check_circle_white_24dp.xml index 7cdc15de0..5ab22cc67 100644 --- a/app/src/main/res/drawable/ic_check_circle_white_24dp.xml +++ b/app/src/main/res/drawable/ic_check_circle_white_24dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_expand_less_white_24dp.xml b/app/src/main/res/drawable/ic_expand_less_white_24dp.xml index 5042d801a..076afd8b5 100644 --- a/app/src/main/res/drawable/ic_expand_less_white_24dp.xml +++ b/app/src/main/res/drawable/ic_expand_less_white_24dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_invert_colors_white_24dp.xml b/app/src/main/res/drawable/ic_invert_colors_white_24dp.xml index e40023612..ff8356e28 100644 --- a/app/src/main/res/drawable/ic_invert_colors_white_24dp.xml +++ b/app/src/main/res/drawable/ic_invert_colors_white_24dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_retro_music_icon.xml b/app/src/main/res/drawable/ic_retro_music_icon.xml index 059ba1c20..4c3025dfc 100644 --- a/app/src/main/res/drawable/ic_retro_music_icon.xml +++ b/app/src/main/res/drawable/ic_retro_music_icon.xml @@ -4,52 +4,64 @@ android:height="350dp" android:viewportWidth="276" android:viewportHeight="350"> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-land/fragment_banner_home.xml b/app/src/main/res/layout-land/fragment_banner_home.xml index 49a9efae1..52043a540 100644 --- a/app/src/main/res/layout-land/fragment_banner_home.xml +++ b/app/src/main/res/layout-land/fragment_banner_home.xml @@ -23,23 +23,26 @@ android:overScrollMode="never" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> - + app:cardUseCompatPadding="true" + app:layout_constraintDimensionRatio="21:7" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_circle_player.xml b/app/src/main/res/layout-land/fragment_circle_player.xml index 0795e18e9..e3d9a5338 100644 --- a/app/src/main/res/layout-land/fragment_circle_player.xml +++ b/app/src/main/res/layout-land/fragment_circle_player.xml @@ -58,11 +58,16 @@ @@ -193,6 +198,7 @@ android:textColor="?android:attr/textColorSecondary" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="@id/progressSlider" + app:layout_constraintEnd_toStartOf="@id/progressSlider" app:layout_constraintStart_toEndOf="@id/guideline" app:layout_constraintTop_toTopOf="@id/progressSlider" tools:ignore="RtlHardcoded,RtlSymmetry" @@ -207,8 +213,8 @@ android:ellipsize="end" android:gravity="center" android:maxLines="1" - android:paddingStart="16dp" - android:paddingEnd="16dp" + android:paddingHorizontal="16dp" + android:paddingBottom="12dp" android:textColor="?android:attr/textColorSecondary" android:textSize="12sp" app:layout_constrainedWidth="true" diff --git a/app/src/main/res/layout-xlarge-land/fragment_player.xml b/app/src/main/res/layout-xlarge-land/fragment_player.xml index c596fd193..1c7834145 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_player.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_player.xml @@ -1,96 +1,65 @@ - - - + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + - + - - + - + - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout-xlarge-land/fragment_player_playback_controls.xml b/app/src/main/res/layout-xlarge-land/fragment_player_playback_controls.xml index c705b3618..248a9d723 100755 --- a/app/src/main/res/layout-xlarge-land/fragment_player_playback_controls.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_player_playback_controls.xml @@ -20,12 +20,11 @@ android:freezesText="true" android:gravity="center" android:marqueeRepeatLimit="marquee_forever" - android:paddingStart="24dp" - android:paddingTop="8dp" - android:paddingEnd="24dp" + android:paddingHorizontal="24dp" + android:paddingTop="12dp" android:scrollHorizontally="true" android:singleLine="true" - android:textAppearance="@style/TextViewHeadline3" + android:textAppearance="@style/TextViewHeadline4" android:textColor="?android:attr/textColorPrimary" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" @@ -41,9 +40,9 @@ android:ellipsize="end" android:gravity="center" android:maxLines="2" - android:paddingStart="24dp" - android:paddingEnd="24dp" - android:textAppearance="@style/TextViewHeadline4" + android:paddingHorizontal="24dp" + android:paddingVertical="12dp" + android:textAppearance="@style/TextViewHeadline5" android:textColor="?android:attr/textColorSecondary" app:layout_constraintBottom_toTopOf="@+id/songInfo" app:layout_constraintEnd_toEndOf="parent" @@ -60,26 +59,44 @@ android:ellipsize="end" android:gravity="center" android:maxLines="2" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:textAppearance="@style/TextViewHeadline6" + android:paddingHorizontal="24dp" + android:paddingBottom="12dp" android:textColor="?android:attr/textColorSecondary" android:visibility="visible" app:layout_constraintBottom_toTopOf="@+id/playPauseButton" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text" tools:text="@tools:sample/lorem/random" tools:visibility="visible" /> + + - - - - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-xlarge/activity_user_info.xml b/app/src/main/res/layout-xlarge/activity_user_info.xml index 9e64e5c0f..a61488c08 100644 --- a/app/src/main/res/layout-xlarge/activity_user_info.xml +++ b/app/src/main/res/layout-xlarge/activity_user_info.xml @@ -23,7 +23,7 @@ - - + + + + + + + + + + + + + + + + + + android:layout_marginEnd="16dp" + app:hintEnabled="true" + app:layout_constraintBottom_toBottomOf="@id/next" + app:layout_constraintEnd_toStartOf="@id/next" + app:layout_constraintStart_toStartOf="@id/imageContainer" + app:layout_constraintTop_toTopOf="@id/next"> - + android:background="@null" + android:hint="@string/my_name" + android:inputType="textPersonName|textCapWords|text" + android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout-xlarge/fragment_mini_player.xml b/app/src/main/res/layout-xlarge/fragment_mini_player.xml index d7dc59220..e51b2dde3 100644 --- a/app/src/main/res/layout-xlarge/fragment_mini_player.xml +++ b/app/src/main/res/layout-xlarge/fragment_mini_player.xml @@ -1,90 +1,109 @@ - - + - - - - - - - + tools:src="@drawable/default_album_art" /> + + + + + - - + + + + + - \ No newline at end of file + android:progress="20" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_playing_queue.xml b/app/src/main/res/layout/activity_playing_queue.xml index b95d78542..38db7846d 100755 --- a/app/src/main/res/layout/activity_playing_queue.xml +++ b/app/src/main/res/layout/activity_playing_queue.xml @@ -42,7 +42,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:layoutAnimation="@anim/layout_animation_fall_down" android:overScrollMode="never" android:paddingBottom="96dp" android:scrollbars="none" diff --git a/app/src/main/res/layout/dialog_sleep_timer.xml b/app/src/main/res/layout/dialog_sleep_timer.xml index 8d4fe4da7..ecd1f9927 100644 --- a/app/src/main/res/layout/dialog_sleep_timer.xml +++ b/app/src/main/res/layout/dialog_sleep_timer.xml @@ -9,26 +9,26 @@ android:id="@+id/timerDisplay" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_marginStart="8dp" + android:paddingHorizontal="16dp" + android:paddingVertical="16dp" android:textAppearance="@style/TextViewHeadline6" /> - diff --git a/app/src/main/res/layout/fragment_folder.xml b/app/src/main/res/layout/fragment_folder.xml index ffe3abd50..0f7ff63a5 100644 --- a/app/src/main/res/layout/fragment_folder.xml +++ b/app/src/main/res/layout/fragment_folder.xml @@ -54,7 +54,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:layoutAnimation="@anim/layout_animation_fall_down" android:overScrollMode="never" android:scrollbars="none" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> diff --git a/app/src/main/res/layout/fragment_home_player.xml b/app/src/main/res/layout/fragment_home_player.xml index 397147ce0..d99613cc1 100644 --- a/app/src/main/res/layout/fragment_home_player.xml +++ b/app/src/main/res/layout/fragment_home_player.xml @@ -67,6 +67,7 @@ app:layout_constraintEnd_toEndOf="parent" tools:text="@tools:sample/full_names" tools:textColor="@color/md_black_1000" /> + diff --git a/app/src/main/res/layout/fragment_simple_controls_fragment.xml b/app/src/main/res/layout/fragment_simple_controls_fragment.xml index af0214169..6e8d1f4d4 100644 --- a/app/src/main/res/layout/fragment_simple_controls_fragment.xml +++ b/app/src/main/res/layout/fragment_simple_controls_fragment.xml @@ -10,6 +10,7 @@ android:id="@+id/titleContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:paddingHorizontal="16dp" app:layout_constraintBottom_toTopOf="@+id/text" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -26,8 +27,6 @@ android:freezesText="true" android:gravity="center" android:marqueeRepeatLimit="marquee_forever" - android:paddingStart="16dp" - android:paddingEnd="16dp" android:scrollHorizontally="true" android:singleLine="true" android:textAppearance="@style/TextViewHeadline6" @@ -38,18 +37,18 @@ - + + + + + tools:backgroundTint="@color/md_green_500" + tools:srcCompat="@drawable/ic_play_arrow_white_32dp" /> - + - - + - - - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" + app:retroCornerSize="56dp" + tools:src="@tools:sample/avatars" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_card.xml b/app/src/main/res/layout/item_card.xml index dca4e532c..8ce8c74e7 100644 --- a/app/src/main/res/layout/item_card.xml +++ b/app/src/main/res/layout/item_card.xml @@ -51,7 +51,7 @@ android:singleLine="true" android:textAppearance="@style/TextViewSubtitle1" android:textStyle="bold" - tools:text="@tools:sample/full_names"/> + tools:text="@tools:sample/full_names" /> + tools:text="@tools:sample/full_names" /> diff --git a/app/src/main/res/layout/item_grid_circle.xml b/app/src/main/res/layout/item_grid_circle.xml index c3574cc3e..5308f9a97 100644 --- a/app/src/main/res/layout/item_grid_circle.xml +++ b/app/src/main/res/layout/item_grid_circle.xml @@ -9,7 +9,6 @@ android:padding="4dp" tools:ignore="MissingPrefix"> - - diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index 3e5935da9..136ad6c98 100755 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -4,9 +4,9 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" - android:layout_marginBottom="2dp" + android:layout_marginStart="1dp" + android:layout_marginEnd="1dp" + android:layout_marginBottom="1dp" android:background="?rectSelector" android:clickable="true" android:focusable="true" diff --git a/app/src/main/res/layout/list_item_view.xml b/app/src/main/res/layout/list_item_view.xml index 79ea44fd0..8a2222511 100644 --- a/app/src/main/res/layout/list_item_view.xml +++ b/app/src/main/res/layout/list_item_view.xml @@ -31,8 +31,10 @@ android:id="@android:id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="4dp" + app:layout_constraintBottom_toBottomOf="@android:id/title" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintTop_toTopOf="@android:id/title" app:tint="?attr/colorControlNormal" tools:srcCompat="@drawable/ic_telegram_white" /> diff --git a/app/src/main/res/layout/list_setting_item_view.xml b/app/src/main/res/layout/list_setting_item_view.xml index 3336af667..bd10afee8 100644 --- a/app/src/main/res/layout/list_setting_item_view.xml +++ b/app/src/main/res/layout/list_setting_item_view.xml @@ -12,13 +12,13 @@ ~ See the GNU General Public License for more details. --> - @@ -27,36 +27,47 @@ android:id="@+id/icon" android:layout_width="@dimen/adaptive_icon_size" android:layout_height="@dimen/adaptive_icon_size" - android:padding="@dimen/adaptive_icon_padding" android:layout_gravity="center" android:layout_marginStart="8dp" + android:padding="@dimen/adaptive_icon_padding" app:iconBackgroundColor="@color/md_blue_A400" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@id/title" app:srcCompat="@drawable/ic_theme_palette_white_24dp" /> - + android:layout_marginStart="16dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + android:ellipsize="marquee" + android:fadingEdge="horizontal" + android:singleLine="true" + android:textAppearance="@style/TextViewSubtitle1" + android:textStyle="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/icon" + app:layout_constraintTop_toTopOf="parent" + tools:text="@tools:sample/lorem/random" /> - + - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index bbd3e0212..eca70cfe5 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index bbd3e0212..eca70cfe5 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 61f0d3a2f..eafddf295 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -7,7 +7,7 @@ none @font/google_san @font/google_san - @font/google_san + 16dp