Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into google-san

This commit is contained in:
Hemanth S 2020-05-24 04:00:36 +05:30
commit ed6e4e9cbc
170 changed files with 3268 additions and 4213 deletions

View file

@ -75,10 +75,12 @@ android {
abortOnError false abortOnError false
} }
compileOptions { compileOptions {
sourceCompatibility '1.8' sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility '1.8' targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
} }
configurations.all { configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
@ -89,7 +91,6 @@ android {
kapt { kapt {
generateStubs = true generateStubs = true
} }
} }
def getProperties(String fileName) { def getProperties(String fileName) {
@ -118,15 +119,16 @@ dependencies {
implementation "androidx.gridlayout:gridlayout:1.0.0" implementation "androidx.gridlayout:gridlayout:1.0.0"
implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.palette:palette: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.viewpager2:viewpager2:1.1.0-alpha01"
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.core:core-ktx:1.2.0' 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 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.android.material:material:1.2.0-alpha06' implementation 'com.google.android.material:material:1.2.0-alpha06'

View file

@ -25,6 +25,7 @@
} }
</style> </style>
</head> </head>

View file

@ -53,27 +53,29 @@
font-size: 1rem; font-size: 1rem;
} }
{style-placeholder} {style-placeholder}
</style> </style>
</head> </head>
<body> <body>
<h5>April 30, 2020</h5> <h5>April 30, 2020</h5>
<h2>v3.5.110</h2> <h2>v3.5.110</h2>
<span class="tag"><i>Beta version</i></span> <span class="tag"><i>Beta version</i></span>
<h3><span class="colorHeader">What's New</span></h3> <h3><span class="colorHeader">What's New</span></h3>
<ul> <ul>
<li>Changed profile form image to icon</li> <li>Changed profile form image to icon</li>
<li>New what's new screen</li> <li>New what's new screen</li>
<li>Added In-App language changer, where you can select language </li> <li>Added In-App language changer, where you can select language</li>
</ul> </ul>
<h3><span class="colorHeader">Improved</span></h3> <h3><span class="colorHeader">Improved</span></h3>
<ul> <ul>
<li>Improved loading of Songs, Albums, Artists, Genres, Playlists </li> <li>Improved loading of Songs, Albums, Artists, Genres, Playlists</li>
</ul> </ul>
<!--<h3><span class="colorHeader">Bug fixes</span></h3> <!--<h3><span class="colorHeader">Bug fixes</span></h3>
<ul> <ul>
<li></li> <li></li>
</ul>--> </ul>-->
<p>*If you face any UI related issues you clear app data and cache, if itsnot working try to uninstall and install <p>*If you face any UI related issues you clear app data and cache, if itsnot working try to
again. </p> uninstall and install
again. </p>
</body> </body>

View file

@ -50,4 +50,81 @@ object Constants {
MediaStore.Audio.AudioColumns.COMPOSER MediaStore.Audio.AudioColumns.COMPOSER
)// 11 )// 11
const val NUMBER_OF_TOP_TRACKS = 99 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"

View file

@ -25,9 +25,6 @@ import code.name.monkey.retromusic.adapter.ContributorAdapter
import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.extensions.applyToolbar
import code.name.monkey.retromusic.model.Contributor import code.name.monkey.retromusic.model.Contributor
import code.name.monkey.retromusic.util.NavigationUtil 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.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import kotlinx.android.synthetic.main.activity_about.* import kotlinx.android.synthetic.main.activity_about.*
@ -57,7 +54,6 @@ class AboutActivity : AbsBaseActivity(), View.OnClickListener {
return json return json
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
setDrawUnderStatusBar() setDrawUnderStatusBar()
super.onCreate(savedInstanceState) 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 { private fun getAppVersion(): String {
return try { return try {
val isPro = if (App.isProVersion()) "Pro" else "Free" val isPro = if (App.isProVersion()) "Pro" else "Free"

View file

@ -74,7 +74,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C
private lateinit var artistImage: ImageView private lateinit var artistImage: ImageView
private var cab: MaterialCab? = null private var cab: MaterialCab? = null
private val savedSortOrder: String private val savedSortOrder: String
get() = PreferenceUtil.getInstance(this).albumDetailSongSortOrder get() = PreferenceUtilKT.albumDetailSongSortOrder
override fun createContentView(): View { override fun createContentView(): View {
return wrapSlidingMusicPanel(R.layout.activity_album) return wrapSlidingMusicPanel(R.layout.activity_album)
@ -256,7 +256,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C
private fun loadAlbumCover() { private fun loadAlbumCover() {
AlbumGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong()) AlbumGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong())
.checkIgnoreMediaStore(this) .checkIgnoreMediaStore(this)
.ignoreMediaStore(PreferenceUtil.getInstance(this).ignoreMediaStoreArtwork()) .ignoreMediaStore(PreferenceUtilKT.isIgnoreMediaStoreArtwork)
.generatePalette(this) .generatePalette(this)
.build() .build()
.dontAnimate() .dontAnimate()
@ -269,7 +269,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C
} }
private fun setColors(color: MediaNotificationProcessor) { private fun setColors(color: MediaNotificationProcessor) {
val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) val buttonColor = if (PreferenceUtilKT.isAdaptiveColor)
color.backgroundColor.ripAlpha() color.backgroundColor.ripAlpha()
else else
ATHUtil.resolveColor(this, R.attr.colorSurface) ATHUtil.resolveColor(this, R.attr.colorSurface)
@ -362,8 +362,8 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C
} }
} }
private fun setSaveSortOrder(sortOrder: String?) { private fun setSaveSortOrder(sortOrder: String) {
PreferenceUtil.getInstance(this).albumDetailSongSortOrder = sortOrder PreferenceUtilKT.albumDetailSongSortOrder = sortOrder
when (sortOrder) { when (sortOrder) {
AlbumSongSortOrder.SONG_TRACK_LIST -> album.songs?.sortWith(Comparator { o1, o2 -> AlbumSongSortOrder.SONG_TRACK_LIST -> album.songs?.sortWith(Comparator { o1, o2 ->
o1.trackNumber.compareTo( o1.trackNumber.compareTo(

View file

@ -255,7 +255,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView,
} }
private fun setColors(color: MediaNotificationProcessor) { private fun setColors(color: MediaNotificationProcessor) {
val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) val buttonColor = if (PreferenceUtilKT.isAdaptiveColor)
color.backgroundColor.ripAlpha() color.backgroundColor.ripAlpha()
else else
ATHUtil.resolveColor(this, R.attr.colorSurface) ATHUtil.resolveColor(this, R.attr.colorSurface)

View file

@ -33,7 +33,7 @@ import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.model.lyrics.Lyrics import code.name.monkey.retromusic.model.lyrics.Lyrics
import code.name.monkey.retromusic.util.LyricUtil import code.name.monkey.retromusic.util.LyricUtil
import code.name.monkey.retromusic.util.MusicUtil 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 code.name.monkey.retromusic.util.RetroUtil
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.getInputLayout import com.afollestad.materialdialogs.input.getInputLayout
@ -61,7 +61,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener,
} }
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
PreferenceUtil.getInstance(this).lyricsOptions = position PreferenceUtilKT.lyricsOption = position
if (position == 0) fab.text = getString(R.string.synced_lyrics) if (position == 0) fab.text = getString(R.string.synced_lyrics)
else if (position == 1) fab.text = getString(R.string.lyrics) else if (position == 1) fab.text = getString(R.string.lyrics)
} }
@ -107,7 +107,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener,
viewPager.apply { viewPager.apply {
adapter = PagerAdapter(supportFragmentManager) adapter = PagerAdapter(supportFragmentManager)
currentItem = PreferenceUtil.getInstance(this@LyricsActivity).lyricsOptions currentItem = PreferenceUtilKT.lyricsOption
addOnPageChangeListener(this@LyricsActivity) addOnPageChangeListener(this@LyricsActivity)
} }
@ -172,7 +172,6 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener,
val materialDialog = MaterialDialog(this) val materialDialog = MaterialDialog(this)
.show { .show {
cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner)
title(R.string.add_time_framed_lryics) title(R.string.add_time_framed_lryics)
negativeButton(R.string.action_search) { negativeButton(R.string.action_search) {
RetroUtil.openUrl(this@LyricsActivity, googleSearchLrcUrl) RetroUtil.openUrl(this@LyricsActivity, googleSearchLrcUrl)
@ -210,7 +209,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener,
val materialDialog = MaterialDialog( val materialDialog = MaterialDialog(
this this
).show { ).show {
cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner)
title(R.string.add_lyrics) title(R.string.add_lyrics)
negativeButton(R.string.action_search) { negativeButton(R.string.action_search) {
RetroUtil.openUrl(this@LyricsActivity, getGoogleSearchUrl()) RetroUtil.openUrl(this@LyricsActivity, getGoogleSearchUrl())

View file

@ -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<AppUpdateInfo> 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<Song> 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<Song> 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);
}
}

View file

@ -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<AppUpdateInfo>? = 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<Song> =
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<Song> =
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
}
}

View file

@ -33,8 +33,6 @@ import kotlinx.android.synthetic.main.activity_search.*
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
import kotlin.collections.MutableList
import kotlin.collections.emptyList
class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatcher, SearchView { class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatcher, SearchView {
@Inject @Inject

View file

@ -4,8 +4,6 @@ import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.fragment.app.Fragment 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.R
import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.base.AbsBaseActivity
import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.extensions.applyToolbar
@ -23,7 +21,6 @@ class SettingsActivity : AbsBaseActivity() {
setStatusbarColorAuto() setStatusbarColorAuto()
setNavigationbarColorAuto() setNavigationbarColorAuto()
setLightNavigationBar(true) setLightNavigationBar(true)
setupToolbar() setupToolbar()
if (savedInstanceState == null) { if (savedInstanceState == null) {
@ -49,7 +46,6 @@ class SettingsActivity : AbsBaseActivity() {
fragmentTransaction.replace(R.id.contentFrame, fragment, fragment.tag) fragmentTransaction.replace(R.id.contentFrame, fragment, fragment.tag)
fragmentTransaction.addToBackStack(null) fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit() fragmentTransaction.commit()
setTitle(titleName) setTitle(titleName)
} }

View file

@ -21,7 +21,7 @@ import code.name.monkey.retromusic.extensions.applyToolbar
import code.name.monkey.retromusic.glide.ProfileBannerGlideRequest import code.name.monkey.retromusic.glide.ProfileBannerGlideRequest
import code.name.monkey.retromusic.glide.UserProfileGlideRequest import code.name.monkey.retromusic.glide.UserProfileGlideRequest
import code.name.monkey.retromusic.util.ImageUtil 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.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestListener
@ -50,7 +50,7 @@ class UserInfoActivity : AbsBaseActivity() {
applyToolbar(toolbar) applyToolbar(toolbar)
MaterialUtil.setTint(nameContainer, false) MaterialUtil.setTint(nameContainer, false)
name.setText(PreferenceUtil.getInstance(this).userName) name.setText(PreferenceUtilKT.userName)
userImage.setOnClickListener { userImage.setOnClickListener {
pickNewPhoto() pickNewPhoto()
@ -66,7 +66,7 @@ class UserInfoActivity : AbsBaseActivity() {
Toast.makeText(this, "Umm name is empty", Toast.LENGTH_SHORT).show() Toast.makeText(this, "Umm name is empty", Toast.LENGTH_SHORT).show()
return@setOnClickListener return@setOnClickListener
} }
PreferenceUtil.getInstance(this).userName = nameString PreferenceUtilKT.userName = nameString
setResult(Activity.RESULT_OK) setResult(Activity.RESULT_OK)
finish() finish()
} }

View file

@ -25,7 +25,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.activities.base.AbsBaseActivity; 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 { public class WhatsNewActivity extends AbsBaseActivity {
@ -38,7 +38,7 @@ public class WhatsNewActivity extends AbsBaseActivity {
try { try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int currentVersion = pInfo.versionCode; int currentVersion = pInfo.versionCode;
PreferenceUtil.getInstance(context).setLastChangeLogVersion(currentVersion); PreferenceUtilKT.INSTANCE.setLastVersion(currentVersion);
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} }

View file

@ -137,7 +137,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
} }
} }
hadPermissions = true hadPermissions = true
onHasPermissionsChanged(true) onHasPermissionsChanged(true)
} }
} }

View file

@ -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.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.DensityUtil 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 code.name.monkey.retromusic.views.BottomNavigationBarTinted
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.MaterialShapeDrawable
@ -117,7 +117,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (cps != PreferenceUtil.getInstance(this).nowPlayingScreen) { if (cps != PreferenceUtilKT.nowPlayingScreen) {
postRecreate() postRecreate()
} }
behavior.addBottomSheetCallback(bottomSheetCallbackList) behavior.addBottomSheetCallback(bottomSheetCallbackList)
@ -239,8 +239,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
} }
private fun chooseFragmentForTheme() { private fun chooseFragmentForTheme() {
cps = PreferenceUtil.getInstance(this).nowPlayingScreen cps = PreferenceUtilKT.nowPlayingScreen
val fragment: Fragment = when (cps) { val fragment: Fragment = when (cps) {
Blur -> BlurPlayerFragment() Blur -> BlurPlayerFragment()
Adaptive -> AdaptiveFragment() Adaptive -> AdaptiveFragment()
@ -311,7 +310,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
val isColorLight = ColorUtil.isColorLight(paletteColor) 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.setLightNavigationBar(true)
super.setLightStatusbar(isColorLight) super.setLightStatusbar(isColorLight)
} else if (cps == Card || cps == Blur || cps == BlurCard) { } else if (cps == Card || cps == Blur || cps == BlurCard) {
@ -375,8 +374,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
fun updateTabs() { fun updateTabs() {
bottomNavigationView.menu.clear() bottomNavigationView.menu.clear()
val currentTabs: List<CategoryInfo> = val currentTabs: List<CategoryInfo> = PreferenceUtilKT.libraryCategory
PreferenceUtil.getInstance(this).libraryCategoryInfos
for (tab in currentTabs) { for (tab in currentTabs) {
if (tab.visible) { if (tab.visible) {
val menu = tab.category val menu = tab.category

View file

@ -2,7 +2,6 @@ package code.name.monkey.retromusic.activities.base
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.view.KeyEvent import android.view.KeyEvent
@ -10,17 +9,15 @@ import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.ATH import code.name.monkey.appthemehelper.ATH
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.common.ATHToolbarActivity import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil 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.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.LanguageContextWrapper import code.name.monkey.retromusic.LanguageContextWrapper
import code.name.monkey.retromusic.R 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.RetroUtil
import code.name.monkey.retromusic.util.theme.ThemeManager import code.name.monkey.retromusic.util.theme.ThemeManager
import java.util.* import java.util.*
@ -45,7 +42,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
} }
private fun toggleScreenOn() { private fun toggleScreenOn() {
if (PreferenceUtil.getInstance(this).isScreenOnEnabled) { if (PreferenceUtilKT.isScreenOnEnabled) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} else { } else {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
@ -64,7 +61,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
} }
fun hideStatusBar() { fun hideStatusBar() {
hideStatusBar(PreferenceUtil.getInstance(this).fullScreenMode) hideStatusBar(PreferenceUtilKT.isFullScreenMode)
} }
private fun hideStatusBar(fullscreen: Boolean) { 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() { fun setDrawUnderStatusBar() {
RetroUtil.setAllowDrawUnderStatusBar(window) RetroUtil.setAllowDrawUnderStatusBar(window)
} }
@ -179,7 +164,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
val flags = 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) (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 window.decorView.systemUiVisibility = flags
} }
} }
@ -212,7 +197,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
} }
override fun attachBaseContext(newBase: Context?) { override fun attachBaseContext(newBase: Context?) {
val code = PreferenceUtil.getInstance(newBase).languageCode val code = PreferenceUtilKT.languageCode
if (code != "auto") { if (code != "auto") {
super.attachBaseContext(LanguageContextWrapper.wrap(newBase, Locale(code))) super.attachBaseContext(LanguageContextWrapper.wrap(newBase, Locale(code)))
} else super.attachBaseContext(newBase) } else super.attachBaseContext(newBase)

View file

@ -11,7 +11,7 @@ import androidx.annotation.IntRange;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.PreferenceUtilKT;
public class DeviceInfo { public class DeviceInfo {
@ -75,10 +75,10 @@ public class DeviceInfo {
versionCode = -1; versionCode = -1;
versionName = null; versionName = null;
} }
baseTheme = PreferenceUtil.getInstance(context).getBaseTheme(); baseTheme = PreferenceUtilKT.INSTANCE.getBaseTheme();
nowPlayingTheme = context.getString(PreferenceUtil.getInstance(context).getNowPlayingScreen().getTitleRes()); nowPlayingTheme = context.getString(PreferenceUtilKT.INSTANCE.getNowPlayingScreen().getTitleRes());
isAdaptive = PreferenceUtil.getInstance(context).getAdaptiveColor(); isAdaptive = PreferenceUtilKT.INSTANCE.isAdaptiveColor();
selectedLang = PreferenceUtil.getInstance(context).getLanguageCode(); selectedLang = PreferenceUtilKT.INSTANCE.getLanguageCode();
} }
public String toMarkdown() { public String toMarkdown() {

View file

@ -22,12 +22,9 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.R.drawable import code.name.monkey.retromusic.R.drawable
import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.base.AbsBaseActivity
import code.name.monkey.retromusic.activities.saf.SAFGuideActivity 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.RetroUtil
import code.name.monkey.retromusic.util.SAFUtil import code.name.monkey.retromusic.util.SAFUtil
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.list.listItems import com.afollestad.materialdialogs.list.listItems
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import kotlinx.android.synthetic.main.activity_album_tag_editor.* import kotlinx.android.synthetic.main.activity_album_tag_editor.*
@ -53,7 +50,6 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
protected val show: MaterialDialog protected val show: MaterialDialog
get() = MaterialDialog(this).show { get() = MaterialDialog(this).show {
cornerRadius(PreferenceUtil.getInstance(this@AbsTagEditorActivity).dialogCorner)
title(R.string.update_image) title(R.string.update_image)
listItems(items = items) { _, position, _ -> listItems(items = items) { _, position, _ ->
when (position) { when (position) {

View file

@ -42,8 +42,7 @@ public class CategoryInfoAdapter extends RecyclerView.Adapter<CategoryInfoAdapte
private List<CategoryInfo> categoryInfos; private List<CategoryInfo> categoryInfos;
private ItemTouchHelper touchHelper; private ItemTouchHelper touchHelper;
public CategoryInfoAdapter(@NonNull List<CategoryInfo> categoryInfos) { public CategoryInfoAdapter() {
this.categoryInfos = categoryInfos;
SwipeAndDragHelper swipeAndDragHelper = new SwipeAndDragHelper(this); SwipeAndDragHelper swipeAndDragHelper = new SwipeAndDragHelper(this);
touchHelper = new ItemTouchHelper(swipeAndDragHelper); touchHelper = new ItemTouchHelper(swipeAndDragHelper);
} }

View file

@ -20,7 +20,8 @@ import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.model.Home
import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
class HomeAdapter( class HomeAdapter(
private val activity: AppCompatActivity, private val activity: AppCompatActivity,
@ -117,7 +118,7 @@ class HomeAdapter(
val artistAdapter = ArtistAdapter( val artistAdapter = ArtistAdapter(
activity, activity,
list, list,
PreferenceUtil.getInstance(activity).getHomeGridStyle(activity), PreferenceUtilKT.homeGridStyle,
null null
) )
recyclerView.apply { recyclerView.apply {

View file

@ -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 package code.name.monkey.retromusic.adapter
import android.graphics.PorterDuff import android.graphics.PorterDuff

View file

@ -22,7 +22,7 @@ import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
@ -153,7 +153,7 @@ open class AlbumAdapter(
private fun getSectionName(position: Int): String { private fun getSectionName(position: Int): String {
var sectionName: String? = null var sectionName: String? = null
when (PreferenceUtil.getInstance(activity).albumSortOrder) { when (PreferenceUtilKT.albumSortOrder) {
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName = SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName =
dataSet[position].title dataSet[position].title
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName

View file

@ -15,7 +15,8 @@ import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.NavigationUtil 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
@ -90,7 +91,7 @@ class AlbumCoverPagerAdapter(
} }
private fun getLayoutWithPlayerTheme(): Int { private fun getLayoutWithPlayerTheme(): Int {
return when (PreferenceUtil.getInstance(requireContext()).nowPlayingScreen) { return when (PreferenceUtilKT.nowPlayingScreen) {
Card, Card,
Fit, Fit,
Tiny, Tiny,
@ -99,11 +100,10 @@ class AlbumCoverPagerAdapter(
Gradient, Gradient,
Full -> R.layout.fragment_album_full_cover Full -> R.layout.fragment_album_full_cover
else -> { else -> {
if (PreferenceUtil.getInstance(requireContext()).carouselEffect() if (PreferenceUtilKT.isCarouselEffect) {
) {
R.layout.fragment_album_carousel_cover R.layout.fragment_album_carousel_cover
} else { } else {
when (PreferenceUtil.getInstance(requireContext()).albumCoverStyle) { when (PreferenceUtilKT.albumCoverStyle) {
AlbumCoverStyle.NORMAL -> R.layout.fragment_album_cover AlbumCoverStyle.NORMAL -> R.layout.fragment_album_cover
AlbumCoverStyle.FLAT -> R.layout.fragment_album_flat_cover AlbumCoverStyle.FLAT -> R.layout.fragment_album_flat_cover
AlbumCoverStyle.CIRCLE -> R.layout.fragment_album_circle_cover AlbumCoverStyle.CIRCLE -> R.layout.fragment_album_circle_cover
@ -111,7 +111,6 @@ class AlbumCoverPagerAdapter(
AlbumCoverStyle.MATERIAL -> R.layout.fragment_album_material_cover AlbumCoverStyle.MATERIAL -> R.layout.fragment_album_material_cover
AlbumCoverStyle.FULL -> R.layout.fragment_album_full_cover AlbumCoverStyle.FULL -> R.layout.fragment_album_full_cover
AlbumCoverStyle.FULL_CARD -> R.layout.fragment_album_full_card_cover AlbumCoverStyle.FULL_CARD -> R.layout.fragment_album_full_card_cover
else -> R.layout.fragment_album_cover
} }
} }
} }

View file

@ -17,8 +17,6 @@ import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder 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.hide
import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper 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.Playlist
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist 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.AutoGeneratedPlaylistBitmap
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.NavigationUtil
@ -125,24 +122,6 @@ class PlaylistAdapter(
override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<Playlist>) { override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<Playlist>) {
when (menuItem.itemId) { 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( else -> SongsMenuHelper.handleMenuClick(
activity, activity,
getSongList(selection), getSongList(selection),
@ -183,25 +162,9 @@ class PlaylistAdapter(
} }
menu?.setOnClickListener { view -> menu?.setOnClickListener { view ->
val playlist = dataSet[layoutPosition]
val popupMenu = PopupMenu(activity, view) val popupMenu = PopupMenu(activity, view)
popupMenu.inflate( popupMenu.inflate(R.menu.menu_item_playlist)
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.setOnMenuItemClickListener { item -> 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( PlaylistMenuHelper.handleMenuClick(
activity, dataSet[layoutPosition], item activity, dataSet[layoutPosition], item
) )

View file

@ -24,7 +24,8 @@ import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.afollestad.materialcab.MaterialCab import com.afollestad.materialcab.MaterialCab
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
@ -144,7 +145,7 @@ open class SongAdapter(
} }
override fun getPopupText(position: Int): String { 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_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title
SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName
SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName

View file

@ -25,13 +25,13 @@ import android.util.TypedValue
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R 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.RetroUtil
@RequiresApi(Build.VERSION_CODES.N_MR1) @RequiresApi(Build.VERSION_CODES.N_MR1)
object AppShortcutIconGenerator { object AppShortcutIconGenerator {
fun generateThemedIcon(context: Context, iconId: Int): Icon { fun generateThemedIcon(context: Context, iconId: Int): Icon {
return if (PreferenceUtil.getInstance(context).coloredAppShortcuts()) { return if (PreferenceUtilKT.isColoredAppShortcuts) {
generateUserThemedIcon(context, iconId) generateUserThemedIcon(context, iconId)
} else { } else {
generateDefaultThemedIcon(context, iconId) generateDefaultThemedIcon(context, iconId)

View file

@ -36,7 +36,8 @@ class LastAddedShortcutType(context: Context) : BaseShortcutType(context) {
context, context,
R.drawable.ic_app_shortcut_last_added 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 { companion object {

View file

@ -34,7 +34,8 @@ class SearchShortCutType(context: Context) : BaseShortcutType(context) {
get() = ShortcutInfo.Builder( get() = ShortcutInfo.Builder(
context, context,
id 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( AppShortcutIconGenerator.generateThemedIcon(
context, context,
R.drawable.ic_app_shortcut_search R.drawable.ic_app_shortcut_search

View file

@ -34,7 +34,8 @@ class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) {
AppShortcutIconGenerator.generateThemedIcon( AppShortcutIconGenerator.generateThemedIcon(
context, R.drawable.ic_app_shortcut_shuffle_all 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 { companion object {

View file

@ -34,7 +34,8 @@ class TopTracksShortcutType(context: Context) : BaseShortcutType(context) {
AppShortcutIconGenerator.generateThemedIcon( AppShortcutIconGenerator.generateThemedIcon(
context, R.drawable.ic_app_shortcut_top_tracks 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 { companion object {

View file

@ -193,7 +193,8 @@ class AppWidgetBig : BaseAppWidget() {
* Link up various button actions using [PendingIntent]. * Link up various button actions using [PendingIntent].
*/ */
private fun linkButtons(context: Context, views: RemoteViews) { 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 var pendingIntent: PendingIntent
val serviceName = ComponentName(context, MusicService::class.java) val serviceName = ComponentName(context, MusicService::class.java)

View file

@ -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<Contributor>
@GET("translators.json")
suspend fun getTranslators(): List<Contributor>
companion object {
val retoService: RetroDataService = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
.build()
.create(RetroDataService::class.java)
}
}

View file

@ -17,15 +17,13 @@ package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_SONG
import code.name.monkey.retromusic.R 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.loaders.PlaylistLoader
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.util.PlaylistsUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.list.listItems
class AddToPlaylistDialog : DialogFragment() { class AddToPlaylistDialog : DialogFragment() {
@ -33,34 +31,33 @@ class AddToPlaylistDialog : DialogFragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): Dialog { ): Dialog {
val playlists = PlaylistLoader.getAllPlaylists(requireContext()) val playlists = PlaylistLoader.getAllPlaylists(requireContext())
val playlistNames: MutableList<String> = mutableListOf() val playlistNames = mutableListOf<CharSequence>()
playlistNames.add(requireContext().resources.getString(R.string.action_new_playlist)) playlistNames.add(requireContext().resources.getString(R.string.action_new_playlist))
for (p in playlists) { for (p in playlists) {
playlistNames.add(p.name) playlistNames.add(p.name)
} }
return MaterialDialog(requireContext()).show { return MaterialAlertDialogBuilder(
title(R.string.add_playlist_title) requireContext(),
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
listItems(items = playlistNames) { dialog, index, _ -> )
val songs = .setTitle(R.string.add_playlist_title)
requireArguments().getParcelableArrayList<Song>("songs") ?: return@listItems .setItems(playlistNames.toTypedArray()) { _, which ->
if (index == 0) { val songs = extraNotNull<ArrayList<Song>>(EXTRA_SONG).value
dialog.dismiss() if (which == 0) {
activity?.supportFragmentManager?.let { CreatePlaylistDialog.create(songs)
CreatePlaylistDialog.create(songs).show(it, "ADD_TO_PLAYLIST") .show(requireActivity().supportFragmentManager, "ADD_TO_PLAYLIST")
}
} else { } else {
dialog.dismiss()
PlaylistsUtil.addToPlaylist( PlaylistsUtil.addToPlaylist(
requireContext(), requireContext(),
songs, songs,
playlists[index - 1].id, playlists[which - 1].id,
true true
) )
} }
dismiss()
} }
} .create()
} }
companion object { companion object {
@ -74,7 +71,7 @@ class AddToPlaylistDialog : DialogFragment() {
fun create(songs: List<Song>): AddToPlaylistDialog { fun create(songs: List<Song>): AddToPlaylistDialog {
val dialog = AddToPlaylistDialog() val dialog = AddToPlaylistDialog()
val args = Bundle() val args = Bundle()
args.putParcelableArrayList("songs", ArrayList(songs)) args.putParcelableArrayList(EXTRA_SONG, ArrayList(songs))
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -23,10 +23,7 @@ import android.os.Environment
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.R 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.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.list.listItems import com.afollestad.materialdialogs.list.listItems
import java.io.File import java.io.File
import java.util.* import java.util.*
@ -88,7 +85,7 @@ class BlacklistFolderChooserDialog : DialogFragment() {
) { ) {
return MaterialDialog(requireActivity()).show { return MaterialDialog(requireActivity()).show {
title(R.string.md_error_label) title(R.string.md_error_label)
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner)
message(R.string.md_storage_perm_error) message(R.string.md_storage_perm_error)
positiveButton(android.R.string.ok) positiveButton(android.R.string.ok)
} }
@ -105,7 +102,7 @@ class BlacklistFolderChooserDialog : DialogFragment() {
return MaterialDialog(requireContext()).show { return MaterialDialog(requireContext()).show {
title(text = parentFolder!!.absolutePath) title(text = parentFolder!!.absolutePath)
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner)
listItems(items = contentsArray(), waitForPositiveButton = false) { _, index, _ -> listItems(items = contentsArray(), waitForPositiveButton = false) { _, index, _ ->
onSelection(index) onSelection(index)
} }
@ -146,7 +143,7 @@ class BlacklistFolderChooserDialog : DialogFragment() {
val dialog = dialog as MaterialDialog? val dialog = dialog as MaterialDialog?
dialog?.apply { dialog?.apply {
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner)
setTitle(parentFolder!!.absolutePath) setTitle(parentFolder!!.absolutePath)
listItems(items = contentsArray()) { _, index, _ -> listItems(items = contentsArray()) { _, index, _ ->
onSelection(index) onSelection(index)

View file

@ -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<AbsSmartPlaylist>("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
}
}
}

View file

@ -14,73 +14,57 @@
package code.name.monkey.retromusic.dialogs package code.name.monkey.retromusic.dialogs
import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.provider.MediaStore import android.text.TextUtils
import android.widget.TextView import android.view.LayoutInflater
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.appthemehelper.util.MaterialUtil 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
import code.name.monkey.retromusic.R.layout import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.R.string
import code.name.monkey.retromusic.extensions.appHandleColor
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.util.PlaylistsUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
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.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import kotlinx.android.synthetic.main.dialog_playlist.view.*
class CreatePlaylistDialog : DialogFragment() { class CreatePlaylistDialog : DialogFragment() {
private lateinit var playlistView: TextInputEditText @SuppressLint("InflateParams")
private lateinit var actionNewPlaylistContainer: TextInputLayout
override fun onCreateDialog( override fun onCreateDialog(
savedInstanceState: Bundle? savedInstanceState: Bundle?
): Dialog { ): Dialog {
val materialDialog = MaterialDialog(requireContext()) val view = LayoutInflater.from(requireActivity()).inflate(R.layout.dialog_playlist, null)
.show { val playlistView: TextInputEditText = view.actionNewPlaylist
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) val playlistContainer: TextInputLayout = view.actionNewPlaylistContainer
title(string.new_playlist_title) MaterialUtil.setTint(playlistContainer, false)
customView(layout.dialog_playlist)
negativeButton(android.R.string.cancel)
positiveButton(string.create_action) {
if (activity == null) {
return@positiveButton
}
val songs = requireArguments().getParcelableArrayList<Song>("songs")
?: return@positiveButton
if (playlistView.text.toString().trim { it <= ' ' }.isNotEmpty()) { return MaterialAlertDialogBuilder(
val playlistId = PlaylistsUtil.createPlaylist( requireActivity(),
requireContext(), R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
playlistView.text.toString() )
) .setTitle(R.string.new_playlist_title)
if (playlistId != -1) { .setView(view)
PlaylistsUtil.addToPlaylist(requireContext(), songs, playlistId, true) .setNegativeButton(android.R.string.cancel, null)
} .setPositiveButton(
R.string.create_action
) { _, _ ->
val extra = extraNotNull<ArrayList<Song>>(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)
} }
} }
} }
.create()
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
} }
companion object { companion object {
@ -98,7 +82,7 @@ class CreatePlaylistDialog : DialogFragment() {
fun create(songs: ArrayList<Song>): CreatePlaylistDialog { fun create(songs: ArrayList<Song>): CreatePlaylistDialog {
val dialog = CreatePlaylistDialog() val dialog = CreatePlaylistDialog()
val args = Bundle() val args = Bundle()
args.putParcelableArrayList("songs", songs) args.putParcelableArrayList(EXTRA_SONG, songs)
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -18,48 +18,45 @@ import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_PLAYLIST
import code.name.monkey.retromusic.R 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.model.Playlist
import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.util.PlaylistsUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import java.util.*
class DeletePlaylistDialog : DialogFragment() { class DeletePlaylistDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val playlists = requireArguments().getParcelableArrayList<Playlist>("playlist") val playlists = extraNotNull<List<Playlist>>(EXTRA_PLAYLIST).value
val title: Int val title: Int
val content: CharSequence val message: CharSequence
//noinspection ConstantConditions //noinspection ConstantConditions
if (playlists!!.size > 1) { if (playlists.size > 1) {
title = string.delete_playlists_title title = R.string.delete_playlists_title
content = HtmlCompat.fromHtml( message = HtmlCompat.fromHtml(
getString(string.delete_x_playlists, playlists.size), String.format(getString(R.string.delete_x_playlists), playlists.size),
HtmlCompat.FROM_HTML_MODE_LEGACY HtmlCompat.FROM_HTML_MODE_LEGACY
) )
} else { } else {
title = string.delete_playlist_title title = R.string.delete_playlist_title
content = HtmlCompat.fromHtml( message = HtmlCompat.fromHtml(
getString(string.delete_playlist_x, playlists[0].name), String.format(getString(R.string.delete_playlist_x), playlists[0].name),
HtmlCompat.FROM_HTML_MODE_LEGACY HtmlCompat.FROM_HTML_MODE_LEGACY
) )
} }
return MaterialDialog(requireContext()) return MaterialAlertDialogBuilder(
.show { requireContext(),
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
title(title) )
message(text = content) .setTitle(title)
negativeButton(android.R.string.cancel) .setMessage(message)
positiveButton(R.string.action_delete) { .setNegativeButton(android.R.string.cancel, null)
PlaylistsUtil.deletePlaylists(requireContext(), playlists) .setPositiveButton(R.string.action_delete) { _, _ ->
} PlaylistsUtil.deletePlaylists(requireContext(), playlists)
negativeButton(android.R.string.cancel)
} }
.create()
} }
companion object { companion object {
@ -73,7 +70,7 @@ class DeletePlaylistDialog : DialogFragment() {
fun create(playlist: ArrayList<Playlist>): DeletePlaylistDialog { fun create(playlist: ArrayList<Playlist>): DeletePlaylistDialog {
val dialog = DeletePlaylistDialog() val dialog = DeletePlaylistDialog()
val args = Bundle() val args = Bundle()
args.putParcelableArrayList("playlist", playlist) args.putParcelableArrayList(EXTRA_PLAYLIST, playlist)
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -55,7 +55,8 @@ public class DeleteSongsAsyncTask extends DialogAsyncTask<DeleteSongsAsyncTask.L
@NonNull @NonNull
@Override @Override
protected Dialog createDialog(@NonNull Context context) { protected Dialog createDialog(@NonNull Context context) {
return new MaterialAlertDialogBuilder(context) return new MaterialAlertDialogBuilder(context,
R.style.ThemeOverlay_MaterialComponents_Dialog_Alert)
.setTitle(R.string.deleting_songs) .setTitle(R.string.deleting_songs)
.setView(R.layout.loading) .setView(R.layout.loading)
.setCancelable(false) .setCancelable(false)

View file

@ -20,65 +20,60 @@ import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_SONG
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.saf.SAFGuideActivity import code.name.monkey.retromusic.activities.saf.SAFGuideActivity
import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.SAFUtil import code.name.monkey.retromusic.util.SAFUtil
import com.afollestad.materialdialogs.LayoutMode import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
class DeleteSongsDialog : DialogFragment() { class DeleteSongsDialog : DialogFragment() {
@JvmField @JvmField
var currentSong: Song? = null var currentSong: Song? = null
@JvmField @JvmField
var songsToRemove: List<Song>? = null var songsToRemove: List<Song>? = null
private var deleteSongsAsyncTask: DeleteSongsAsyncTask? = null private var deleteSongsAsyncTask: DeleteSongsAsyncTask? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val songs: ArrayList<Song>? = requireArguments().getParcelableArrayList("songs") val songs = extraNotNull<List<Song>>(EXTRA_SONG).value
var title = 0 var title = 0
var content: CharSequence = "" var message: CharSequence = ""
if (songs != null) { if (songs.size > 1) {
if (songs.size > 1) { title = R.string.delete_songs_title
title = R.string.delete_songs_title message = HtmlCompat.fromHtml(
content = HtmlCompat.fromHtml( String.format(getString(R.string.delete_x_songs), songs.size),
getString(R.string.delete_x_songs, songs.size), HtmlCompat.FROM_HTML_MODE_LEGACY
HtmlCompat.FROM_HTML_MODE_LEGACY )
) } else {
} else { title = R.string.delete_song_title
title = R.string.delete_song_title message = HtmlCompat.fromHtml(
content = HtmlCompat.fromHtml( String.format(getString(R.string.delete_song_x), songs[0].title),
getString(R.string.delete_song_x, songs[0].title), HtmlCompat.FROM_HTML_MODE_LEGACY
HtmlCompat.FROM_HTML_MODE_LEGACY )
)
}
} }
return MaterialDialog(requireContext()).show { return MaterialAlertDialogBuilder(
title(title) requireContext(),
message(text = content) R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
negativeButton(android.R.string.cancel) { )
dismiss() .setTitle(title)
} .setMessage(message)
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) .setCancelable(false)
noAutoDismiss() .setNegativeButton(android.R.string.cancel, null)
positiveButton(R.string.action_delete) { .setPositiveButton(R.string.action_delete) { _, _ ->
if (songs != null) { if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) {
if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) { MusicPlayerRemote.playNextSong()
MusicPlayerRemote.playNextSong()
}
} }
songsToRemove = songs songsToRemove = songs
deleteSongsAsyncTask = DeleteSongsAsyncTask(this@DeleteSongsDialog) deleteSongsAsyncTask = DeleteSongsAsyncTask(this@DeleteSongsDialog)
deleteSongsAsyncTask?.execute(DeleteSongsAsyncTask.LoadingInfo(songs, null)) deleteSongsAsyncTask?.execute(DeleteSongsAsyncTask.LoadingInfo(songs, null))
} }
} .create()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
@ -119,7 +114,7 @@ class DeleteSongsDialog : DialogFragment() {
fun create(songs: List<Song>): DeleteSongsDialog { fun create(songs: List<Song>): DeleteSongsDialog {
val dialog = DeleteSongsDialog() val dialog = DeleteSongsDialog()
val args = Bundle() val args = Bundle()
args.putParcelableArrayList("songs", ArrayList(songs)) args.putParcelableArrayList(EXTRA_SONG, ArrayList(songs))
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -18,34 +18,32 @@ import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_SONG
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.R.string import code.name.monkey.retromusic.R.string
import code.name.monkey.retromusic.model.PlaylistSong import code.name.monkey.retromusic.model.PlaylistSong
import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.util.PlaylistsUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
class RemoveFromPlaylistDialog : DialogFragment() { class RemoveFromPlaylistDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val songs = requireArguments().getParcelableArrayList<PlaylistSong>("songs") val songs = requireArguments().getParcelableArrayList<PlaylistSong>(EXTRA_SONG)
var title = 0 var title = 0
var content: CharSequence = "" var message: CharSequence = ""
if (songs != null) { if (songs != null) {
if (songs.size > 1) { if (songs.size > 1) {
title = R.string.remove_songs_from_playlist_title title = R.string.remove_songs_from_playlist_title
content = HtmlCompat.fromHtml( message = HtmlCompat.fromHtml(
getString(string.remove_x_songs_from_playlist, songs.size), String.format(getString(string.remove_x_songs_from_playlist), songs.size),
HtmlCompat.FROM_HTML_MODE_LEGACY HtmlCompat.FROM_HTML_MODE_LEGACY
) )
} else { } else {
title = R.string.remove_song_from_playlist_title title = R.string.remove_song_from_playlist_title
content = HtmlCompat.fromHtml( message = HtmlCompat.fromHtml(
getString( String.format(
code.name.monkey.retromusic.R.string.remove_song_x_from_playlist, getString(string.remove_song_x_from_playlist),
songs[0].title songs[0].title
), ),
HtmlCompat.FROM_HTML_MODE_LEGACY HtmlCompat.FROM_HTML_MODE_LEGACY
@ -53,22 +51,20 @@ class RemoveFromPlaylistDialog : DialogFragment() {
} }
} }
return MaterialAlertDialogBuilder(
return MaterialDialog(requireContext()) requireContext(),
.show { R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
title(title) )
message(text = content) .setTitle(title)
negativeButton(android.R.string.cancel) .setMessage(message)
positiveButton(R.string.remove_action) { .setPositiveButton(R.string.remove_action) { _, _ ->
if (activity == null) PlaylistsUtil.removeFromPlaylist(
return@positiveButton requireContext(),
PlaylistsUtil.removeFromPlaylist( songs as MutableList<PlaylistSong>
requireContext(), )
songs as MutableList<PlaylistSong>
)
}
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner)
} }
.setNegativeButton(android.R.string.cancel, null)
.create()
} }
companion object { companion object {
@ -82,7 +78,7 @@ class RemoveFromPlaylistDialog : DialogFragment() {
fun create(songs: ArrayList<PlaylistSong>): RemoveFromPlaylistDialog { fun create(songs: ArrayList<PlaylistSong>): RemoveFromPlaylistDialog {
val dialog = RemoveFromPlaylistDialog() val dialog = RemoveFromPlaylistDialog()
val args = Bundle() val args = Bundle()
args.putParcelableArrayList("songs", songs) args.putParcelableArrayList(EXTRA_SONG, songs)
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -14,62 +14,52 @@
package code.name.monkey.retromusic.dialogs package code.name.monkey.retromusic.dialogs
import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.provider.MediaStore.Audio.Playlists.Members.PLAYLIST_ID import android.provider.MediaStore.Audio.Playlists.Members.PLAYLIST_ID
import android.widget.TextView import android.view.LayoutInflater
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.appthemehelper.util.MaterialUtil
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.R.layout import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.R.string
import code.name.monkey.retromusic.extensions.appHandleColor
import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.util.PlaylistsUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
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.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
class RenamePlaylistDialog : DialogFragment() { class RenamePlaylistDialog : DialogFragment() {
private lateinit var playlistView: TextInputEditText
private lateinit var actionNewPlaylistContainer: TextInputLayout
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val materialDialog = MaterialDialog(requireContext()) @SuppressLint("InflateParams")
.show { override fun onCreateDialog(
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) savedInstanceState: Bundle?
title(string.rename_playlist_title) ): Dialog {
customView(layout.dialog_playlist) val layout = LayoutInflater.from(requireContext())
negativeButton(android.R.string.cancel) .inflate(R.layout.dialog_playlist, null)
positiveButton(string.action_rename) { val inputEditText: TextInputEditText = layout.findViewById(R.id.actionNewPlaylist)
if (playlistView.toString().trim { it <= ' ' } != "") { val nameContainer: TextInputLayout =
val playlistId = requireArguments().getLong(PLAYLIST_ID) layout.findViewById(R.id.actionNewPlaylistContainer)
PlaylistsUtil.renamePlaylist( MaterialUtil.setTint(nameContainer, false)
context,
playlistId, return MaterialAlertDialogBuilder(
playlistView.text!!.toString() 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<Long>(PLAYLIST_ID).value,
name
)
} }
} }
.create()
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
} }
companion object { companion object {

View file

@ -14,6 +14,7 @@
package code.name.monkey.retromusic.dialogs package code.name.monkey.retromusic.dialogs
import android.annotation.SuppressLint
import android.app.AlarmManager import android.app.AlarmManager
import android.app.Dialog import android.app.Dialog
import android.app.PendingIntent import android.app.PendingIntent
@ -22,29 +23,23 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.CountDownTimer import android.os.CountDownTimer
import android.os.SystemClock import android.os.SystemClock
import android.view.LayoutInflater
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.DialogFragment 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.R
import code.name.monkey.retromusic.extensions.addAccentColor
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.service.MusicService 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_PENDING_QUIT
import code.name.monkey.retromusic.service.MusicService.ACTION_QUIT import code.name.monkey.retromusic.service.MusicService.ACTION_QUIT
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ViewUtil
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.WhichButton import com.afollestad.materialdialogs.WhichButton
import com.afollestad.materialdialogs.actions.getActionButton import com.afollestad.materialdialogs.actions.getActionButton
import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.afollestad.materialdialogs.callbacks.onShow
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
class SleepTimerDialog : DialogFragment() { class SleepTimerDialog : DialogFragment() {
@ -55,91 +50,26 @@ class SleepTimerDialog : DialogFragment() {
private lateinit var seekBar: SeekBar private lateinit var seekBar: SeekBar
private lateinit var timerDisplay: TextView private lateinit var timerDisplay: TextView
@SuppressLint("InflateParams")
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
timerUpdater = TimerUpdater() 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()) val finishMusic = PreferenceUtilKT.isSleepTimerFinishMusic
.title(R.string.action_sleep_timer) shouldFinishLastSong.apply {
.cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) addAccentColor()
.positiveButton(R.string.action_set) { isChecked = finishMusic
PreferenceUtil.getInstance(requireContext()).sleepTimerFinishMusic = }
shouldFinishLastSong.isChecked seekBar.apply {
addAccentColor()
val minutes = seekArcProgress seekArcProgress = PreferenceUtilKT.lastSleepTimerValue
updateTimeDisplayTime()
val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) seekBar.progress = seekArcProgress
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
} }
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 { seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) { override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
@ -155,11 +85,54 @@ class SleepTimerDialog : DialogFragment() {
} }
override fun onStopTrackingTouch(seekBar: SeekBar) { 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() { private fun updateTimeDisplayTime() {
@ -187,25 +160,19 @@ class SleepTimerDialog : DialogFragment() {
} }
} }
private inner class TimerUpdater internal constructor() : CountDownTimer( private inner class TimerUpdater internal constructor() :
PreferenceUtil.getInstance(requireContext()).nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(), CountDownTimer(
1000 PreferenceUtilKT.nextSleepTimerElapsedRealTime - SystemClock.elapsedRealtime(),
) { 1000
) {
override fun onTick(millisUntilFinished: Long) { override fun onTick(millisUntilFinished: Long) {
materialDialog.getActionButton(WhichButton.NEGATIVE).text = String.format( println("onTick: $millisUntilFinished")
"%s %s", seekBar.progress = millisUntilFinished.toInt()
materialDialog.context.getString(R.string.cancel_current_timer),
" (" + MusicUtil.getReadableDurationString(millisUntilFinished) + ")"
)
} }
override fun onFinish() { override fun onFinish() {
updateCancelButton() updateCancelButton()
} }
} }
private fun setProgressBarColor(dark: Int) {
ViewUtil.setProgressDrawable(progressSlider = seekBar, newColor = dark)
}
} }

View file

@ -14,27 +14,24 @@
package code.name.monkey.retromusic.dialogs package code.name.monkey.retromusic.dialogs
import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.text.Spanned import android.text.Spanned
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.annotation.NonNull import androidx.annotation.NonNull
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_SONG
import code.name.monkey.retromusic.R 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.model.Song
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
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 org.jaudiotagger.audio.AudioFileIO import org.jaudiotagger.audio.AudioFileIO
import org.jaudiotagger.audio.exceptions.CannotReadException import org.jaudiotagger.audio.exceptions.CannotReadException
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException
@ -51,22 +48,12 @@ inline fun ViewGroup.forEach(action: (View) -> Unit) {
class SongDetailDialog : DialogFragment() { class SongDetailDialog : DialogFragment() {
@SuppressLint("InflateParams")
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val context: Context = requireContext() val context: Context = requireContext()
val song = requireArguments().getParcelable<Song>("song") val dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_file_details, null)
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 song = requireArguments().getParcelable<Song>(EXTRA_SONG)
val fileName: TextView = dialogView.findViewById(R.id.fileName) val fileName: TextView = dialogView.findViewById(R.id.fileName)
val filePath: TextView = dialogView.findViewById(R.id.filePath) val filePath: TextView = dialogView.findViewById(R.id.filePath)
val fileSize: TextView = dialogView.findViewById(R.id.fileSize) val fileSize: TextView = dialogView.findViewById(R.id.fileSize)
@ -75,23 +62,23 @@ class SongDetailDialog : DialogFragment() {
val bitRate: TextView = dialogView.findViewById(R.id.bitrate) val bitRate: TextView = dialogView.findViewById(R.id.bitrate)
val samplingRate: TextView = dialogView.findViewById(R.id.samplingRate) val samplingRate: TextView = dialogView.findViewById(R.id.samplingRate)
fileName.text = makeTextWithTitle(context, string.label_file_name, "-") fileName.text = makeTextWithTitle(context, R.string.label_file_name, "-")
filePath.text = makeTextWithTitle(context, string.label_file_path, "-") filePath.text = makeTextWithTitle(context, R.string.label_file_path, "-")
fileSize.text = makeTextWithTitle(context, string.label_file_size, "-") fileSize.text = makeTextWithTitle(context, R.string.label_file_size, "-")
fileFormat.text = makeTextWithTitle(context, string.label_file_format, "-") fileFormat.text = makeTextWithTitle(context, R.string.label_file_format, "-")
trackLength.text = makeTextWithTitle(context, string.label_track_length, "-") trackLength.text = makeTextWithTitle(context, R.string.label_track_length, "-")
bitRate.text = makeTextWithTitle(context, string.label_bit_rate, "-") bitRate.text = makeTextWithTitle(context, R.string.label_bit_rate, "-")
samplingRate.text = makeTextWithTitle(context, string.label_sampling_rate, "-") samplingRate.text = makeTextWithTitle(context, R.string.label_sampling_rate, "-")
if (song != null) { if (song != null) {
val songFile = File(song.data) val songFile = File(song.data)
if (songFile.exists()) { 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 = filePath.text =
makeTextWithTitle(context, string.label_file_path, songFile.absolutePath) makeTextWithTitle(context, R.string.label_file_path, songFile.absolutePath)
fileSize.text = fileSize.text =
makeTextWithTitle( makeTextWithTitle(
context, context,
string.label_file_size, R.string.label_file_size,
getFileSizeString(songFile.length()) getFileSizeString(songFile.length())
) )
try { try {
@ -99,21 +86,21 @@ class SongDetailDialog : DialogFragment() {
val audioHeader = audioFile.audioHeader val audioHeader = audioFile.audioHeader
fileFormat.text = fileFormat.text =
makeTextWithTitle(context, string.label_file_format, audioHeader.format) makeTextWithTitle(context, R.string.label_file_format, audioHeader.format)
trackLength.text = makeTextWithTitle( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString((audioHeader.trackLength * 1000).toLong()) MusicUtil.getReadableDurationString((audioHeader.trackLength * 1000).toLong())
) )
bitRate.text = makeTextWithTitle( bitRate.text = makeTextWithTitle(
context, context,
string.label_bit_rate, R.string.label_bit_rate,
audioHeader.bitRate + " kb/s" audioHeader.bitRate + " kb/s"
) )
samplingRate.text = samplingRate.text =
makeTextWithTitle( makeTextWithTitle(
context, context,
string.label_sampling_rate, R.string.label_sampling_rate,
audioHeader.sampleRate + " Hz" audioHeader.sampleRate + " Hz"
) )
} catch (@NonNull e: CannotReadException) { } catch (@NonNull e: CannotReadException) {
@ -121,50 +108,55 @@ class SongDetailDialog : DialogFragment() {
// fallback // fallback
trackLength.text = makeTextWithTitle( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString(song.duration) MusicUtil.getReadableDurationString(song.duration)
) )
} catch (@NonNull e: IOException) { } catch (@NonNull e: IOException) {
Log.e(TAG, "error while reading the song file", e) Log.e(TAG, "error while reading the song file", e)
trackLength.text = makeTextWithTitle( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString(song.duration) MusicUtil.getReadableDurationString(song.duration)
) )
} catch (@NonNull e: TagException) { } catch (@NonNull e: TagException) {
Log.e(TAG, "error while reading the song file", e) Log.e(TAG, "error while reading the song file", e)
trackLength.text = makeTextWithTitle( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString(song.duration) MusicUtil.getReadableDurationString(song.duration)
) )
} catch (@NonNull e: ReadOnlyFileException) { } catch (@NonNull e: ReadOnlyFileException) {
Log.e(TAG, "error while reading the song file", e) Log.e(TAG, "error while reading the song file", e)
trackLength.text = makeTextWithTitle( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString(song.duration) MusicUtil.getReadableDurationString(song.duration)
) )
} catch (@NonNull e: InvalidAudioFrameException) { } catch (@NonNull e: InvalidAudioFrameException) {
Log.e(TAG, "error while reading the song file", e) Log.e(TAG, "error while reading the song file", e)
trackLength.text = makeTextWithTitle( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString(song.duration) MusicUtil.getReadableDurationString(song.duration)
) )
} }
} else { } else {
// fallback // 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( trackLength.text = makeTextWithTitle(
context, context,
string.label_track_length, R.string.label_track_length,
MusicUtil.getReadableDurationString(song.duration) MusicUtil.getReadableDurationString(song.duration)
) )
} }
} }
return MaterialAlertDialogBuilder(
return materialDialog requireContext(),
R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
).setTitle(R.string.action_details)
.setPositiveButton(android.R.string.ok, null)
.setView(dialogView)
.create()
} }
companion object { companion object {
@ -174,7 +166,7 @@ class SongDetailDialog : DialogFragment() {
fun create(song: Song): SongDetailDialog { fun create(song: Song): SongDetailDialog {
val dialog = SongDetailDialog() val dialog = SongDetailDialog()
val args = Bundle() val args = Bundle()
args.putParcelable("song", song) args.putParcelable(EXTRA_SONG, song)
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -18,69 +18,77 @@ import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.retromusic.EXTRA_SONG
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.ShareInstagramStory import code.name.monkey.retromusic.activities.ShareInstagramStory
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.list.listItems
class SongShareDialog : DialogFragment() { class SongShareDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val song: Song? = requireArguments().getParcelable("song") val song: Song? = requireArguments().getParcelable(EXTRA_SONG)
val currentlyListening: String = val listening: String =
getString(R.string.currently_listening_to_x_by_x, song?.title, song?.artistName) 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()) private fun withAction(
.title(R.string.what_do_you_want_to_share) which: Int,
.show { song: Song?,
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner) currentlyListening: String
listItems( ) {
items = listOf( when (which) {
getString(code.name.monkey.retromusic.R.string.the_audio_file), 0 -> {
"\u201C" + currentlyListening + "\u201D", startActivity(Intent.createChooser(song?.let {
getString(R.string.social_stories) 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 { companion object {
@ -88,7 +96,7 @@ class SongShareDialog : DialogFragment() {
fun create(song: Song): SongShareDialog { fun create(song: Song): SongShareDialog {
val dialog = SongShareDialog() val dialog = SongShareDialog()
val args = Bundle() val args = Bundle()
args.putParcelable("song", song) args.putParcelable(EXTRA_SONG, song)
dialog.arguments = args dialog.arguments = args
return dialog return dialog
} }

View file

@ -14,8 +14,14 @@
package code.name.monkey.retromusic.extensions package code.name.monkey.retromusic.extensions
import android.app.Activity
import androidx.annotation.IdRes
import androidx.appcompat.app.AppCompatActivity 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.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
fun AppCompatActivity.applyToolbar(toolbar: MaterialToolbar) { fun AppCompatActivity.applyToolbar(toolbar: MaterialToolbar) {
@ -24,3 +30,47 @@ fun AppCompatActivity.applyToolbar(toolbar: MaterialToolbar) {
setSupportActionBar(toolbar) 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 <reified T : Any> Activity.extra(key: String, default: T? = null) = lazy {
val value = intent?.extras?.get(key)
if (value is T) value else default
}
inline fun <reified T : Any> Activity.extraNotNull(key: String, default: T? = null) = lazy {
val value = intent?.extras?.get(key)
requireNotNull(if (value is T) value else default) { key }
}

View file

@ -18,6 +18,8 @@ import android.app.Dialog
import android.content.Context import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
import android.widget.CheckBox
import android.widget.SeekBar
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment 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) = fun Dialog.resolveColor(@AttrRes attr: Int, fallBackColor: Int = 0) =
ATHUtil.resolveColor(context, attr, fallBackColor) 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
}

View file

@ -26,9 +26,12 @@ import androidx.annotation.DimenRes
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import code.name.monkey.retromusic.R 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 w = resources.getDimension(width).toInt()
val h = resources.getDimension(height).toInt() val h = resources.getDimension(height).toInt()
return scaledDrawable(id, w, h) return scaledDrawable(id, w, h)

View file

@ -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 <reified T : Any> Fragment.extra(key: String, default: T? = null) = lazy {
val value = arguments?.get(key)
if (value is T) value else default
}
inline fun <reified T : Any> Fragment.extraNotNull(key: String, default: T? = null) = lazy {
val value = arguments?.get(key)
requireNotNull(if (value is T) value else default) { key }
}

View file

@ -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
}

View file

@ -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<List<Album>>()
private val _songs = MutableLiveData<List<Song>>()
private val _artists = MutableLiveData<List<Artist>>()
private val _playlist = MutableLiveData<List<Playlist>>()
private val _genre = MutableLiveData<List<Genre>>()
private val _homeSections = MutableLiveData<List<Home>>()
fun homeSections(): LiveData<List<Home>> = _homeSections
fun allAlbums(): LiveData<List<Album>> = _albums
fun allSongs(): LiveData<List<Song>> = _songs
fun allArtists(): LiveData<List<Artist>> = _artists
fun allPlaylisits(): LiveData<List<Playlist>> = _playlist
fun allGenres(): LiveData<List<Genre>> = _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<Home>()
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<List<Song>>
get() = viewModelScope.async(IO) {
when (val result = _repository.allSongs()) {
is Success -> result.data
is Error -> arrayListOf()
}
}
private val loadAlbums: Deferred<List<Album>>
get() = viewModelScope.async(IO) {
when (val result = _repository.allAlbums()) {
is Success -> result.data
is Error -> arrayListOf()
}
}
private val loadArtists: Deferred<List<Artist>>
get() = viewModelScope.async(IO) {
when (val result = _repository.allArtists()) {
is Success -> result.data
is Error -> arrayListOf()
}
}
private val loadPlaylists: Deferred<List<Playlist>>
get() = viewModelScope.async(IO) {
when (val result = _repository.allPlaylists()) {
is Success -> result.data
is Error -> arrayListOf()
}
}
private val loadGenres: Deferred<List<Genre>>
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
}

View file

@ -11,15 +11,18 @@ import android.view.*
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R 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.textColorPrimary
import code.name.monkey.retromusic.extensions.textColorSecondary import code.name.monkey.retromusic.extensions.textColorSecondary
import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment 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.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler 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.RetroUtil
import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.ViewUtil
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_mini_player.* import kotlinx.android.synthetic.main.fragment_mini_player.*
import kotlin.math.abs import kotlin.math.abs
@ -54,15 +57,16 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpda
setUpMiniPlayer() setUpMiniPlayer()
if (RetroUtil.isTablet()) { if (RetroUtil.isTablet()) {
actionNext.visibility = View.VISIBLE actionNext.show()
actionPrevious.visibility = View.VISIBLE actionPrevious.show()
actionNext?.visibility = View.VISIBLE actionNext?.show()
actionPrevious?.visibility = View.VISIBLE actionPrevious?.show()
} else { } else {
actionNext.visibility = actionNext.visibility =
if (PreferenceUtil.getInstance(requireContext()).isExtraControls) View.VISIBLE else View.GONE if (PreferenceUtilKT.isExtraControls) View.VISIBLE else View.GONE
actionPrevious.visibility = actionPrevious.visibility =
if (PreferenceUtil.getInstance(requireContext()).isExtraControls) View.VISIBLE else View.GONE if (PreferenceUtilKT.isExtraControls) View.VISIBLE else View.GONE
} }
actionNext.setOnClickListener(this) actionNext.setOnClickListener(this)
actionPrevious.setOnClickListener(this) actionPrevious.setOnClickListener(this)
@ -93,6 +97,19 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpda
miniPlayerTitle.isSelected = true miniPlayerTitle.isSelected = true
miniPlayerTitle.text = builder 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() { override fun onServiceConnected() {

View file

@ -14,7 +14,7 @@ import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.applyColor import code.name.monkey.retromusic.extensions.applyColor
import code.name.monkey.retromusic.helper.MusicPlayerRemote 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.AudioVolumeObserver
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
import kotlinx.android.synthetic.main.fragment_volume.* import kotlinx.android.synthetic.main.fragment_volume.*
@ -113,11 +113,10 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
} }
private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) { private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) {
if (PreferenceUtil.getInstance(requireContext()) if (PreferenceUtilKT.isPauseOnZeroVolume)
.pauseOnZeroVolume() if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume)
) if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume) { MusicPlayerRemote.pauseSong()
MusicPlayerRemote.pauseSong()
}
} }
fun setTintableColor(color: Int) { fun setTintableColor(color: Int) {

View file

@ -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<List<Album>>()
init {
getAlbums()
}
fun getAlbums() = viewModelScope.launch {
val result = RepositoryImpl(getApplication()).allAlbums()
if (result is Result.Success) {
albums.value = result.data
}else {
albums.value = listOf()
}
}
}

View file

@ -3,29 +3,28 @@ package code.name.monkey.retromusic.fragments.albums
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.album.AlbumAdapter 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.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
class AlbumsFragment : class AlbumsFragment :
AbsLibraryPagerRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(), AbsLibraryPagerRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(),
MainActivityFragmentCallbacks { MainActivityFragmentCallbacks {
private lateinit var albumViewModel: AlbumViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
albumViewModel = ViewModelProvider(this).get(AlbumViewModel::class.java) mainActivity.libraryViewModel.allAlbums()
albumViewModel.albums.observe(viewLifecycleOwner, Observer { albums -> .observe(viewLifecycleOwner, Observer { albums ->
if (albums.isNotEmpty()) if (albums.isNotEmpty())
adapter?.swapDataSet(albums) adapter?.swapDataSet(albums)
else else
adapter?.swapDataSet(listOf()) adapter?.swapDataSet(listOf())
}) })
} }
override val emptyMessage: Int override val emptyMessage: Int
@ -51,45 +50,39 @@ class AlbumsFragment :
} }
override fun loadSortOrder(): String { override fun loadSortOrder(): String {
return PreferenceUtil.getInstance(requireContext()).albumSortOrder return PreferenceUtilKT.albumSortOrder
} }
override fun saveSortOrder(sortOrder: String) { override fun saveSortOrder(sortOrder: String) {
PreferenceUtil.getInstance(requireContext()).albumSortOrder = sortOrder PreferenceUtilKT.albumSortOrder = sortOrder
} }
override fun loadGridSize(): Int { override fun loadGridSize(): Int {
return PreferenceUtil.getInstance(requireContext()).getAlbumGridSize(requireContext()) return PreferenceUtilKT.albumGridSize
} }
override fun saveGridSize(gridColumns: Int) { override fun saveGridSize(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setAlbumGridSize(gridColumns) PreferenceUtilKT.albumGridSize = gridColumns
} }
override fun loadGridSizeLand(): Int { override fun loadGridSizeLand(): Int {
return PreferenceUtil.getInstance(requireContext()).getAlbumGridSizeLand(requireContext()) return PreferenceUtilKT.albumGridSizeLand
} }
override fun saveGridSizeLand(gridColumns: Int) { override fun saveGridSizeLand(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setAlbumGridSizeLand(gridColumns) PreferenceUtilKT.albumGridSizeLand = gridColumns
}
override fun onMediaStoreChanged() {
albumViewModel.getAlbums()
} }
override fun setSortOrder(sortOrder: String) { override fun setSortOrder(sortOrder: String) {
albumViewModel.getAlbums() mainActivity.libraryViewModel.forceReload(ReloadType.Albums)
} }
override fun loadLayoutRes(): Int { override fun loadLayoutRes(): Int {
println("loadLayoutRes ${PreferenceUtil.getInstance(requireContext()).albumGridStyle}") return PreferenceUtilKT.albumGridStyle
return PreferenceUtil.getInstance(requireContext()).albumGridStyle
} }
override fun saveLayoutRes(layoutRes: Int) { override fun saveLayoutRes(layoutRes: Int) {
PreferenceUtil.getInstance(requireContext()).albumGridStyle = layoutRes PreferenceUtilKT.albumGridStyle = layoutRes
} }
override fun handleBackPress(): Boolean { override fun handleBackPress(): Boolean {

View file

@ -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<List<Artist>>()
init {
loadArtists()
}
fun loadArtists() = viewModelScope.launch {
val result = RepositoryImpl(getApplication()).allArtists()
if (result is Result.Success) {
artists.value = result.data
} else {
artists.value = listOf()
}
}
}

View file

@ -3,31 +3,27 @@ package code.name.monkey.retromusic.fragments.artists
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter 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.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
class ArtistsFragment : class ArtistsFragment :
AbsLibraryPagerRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(), AbsLibraryPagerRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(),
MainActivityFragmentCallbacks { MainActivityFragmentCallbacks {
lateinit var artistViewModel: ArtistViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
artistViewModel = ViewModelProvider(this).get(ArtistViewModel::class.java) mainActivity.libraryViewModel.allArtists().observe(
artistViewModel.artists.observe(viewLifecycleOwner, Observer { artists -> viewLifecycleOwner, Observer { artists ->
if (artists.isNotEmpty()) { if (artists.isNotEmpty()) {
adapter?.swapDataSet(artists) adapter?.swapDataSet(artists)
} else { } else {
adapter?.swapDataSet(listOf()) adapter?.swapDataSet(listOf())
} }
}) })
} }
override fun handleBackPress(): Boolean { override fun handleBackPress(): Boolean {
@ -37,12 +33,8 @@ class ArtistsFragment :
override val emptyMessage: Int override val emptyMessage: Int
get() = R.string.no_artists get() = R.string.no_artists
override fun onMediaStoreChanged() {
artistViewModel.loadArtists()
}
override fun setSortOrder(sortOrder: String) { override fun setSortOrder(sortOrder: String) {
artistViewModel.loadArtists() mainActivity.libraryViewModel.forceReload(ReloadType.Artists)
} }
override fun createLayoutManager(): GridLayoutManager { override fun createLayoutManager(): GridLayoutManager {
@ -60,19 +52,19 @@ class ArtistsFragment :
} }
override fun loadGridSize(): Int { override fun loadGridSize(): Int {
return PreferenceUtil.getInstance(requireContext()).getArtistGridSize(requireActivity()) return PreferenceUtilKT.artistGridSize
} }
override fun saveGridSize(gridColumns: Int) { override fun saveGridSize(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setArtistGridSize(gridColumns) PreferenceUtilKT.artistGridSize = gridColumns
} }
override fun loadGridSizeLand(): Int { override fun loadGridSizeLand(): Int {
return PreferenceUtil.getInstance(requireContext()).getArtistGridSizeLand(requireActivity()) return PreferenceUtilKT.artistGridSizeLand
} }
override fun saveGridSizeLand(gridColumns: Int) { override fun saveGridSizeLand(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setArtistGridSizeLand(gridColumns) PreferenceUtilKT.artistGridSizeLand = gridColumns
} }
override fun setGridSize(gridSize: Int) { override fun setGridSize(gridSize: Int) {
@ -81,19 +73,19 @@ class ArtistsFragment :
} }
override fun loadSortOrder(): String { override fun loadSortOrder(): String {
return PreferenceUtil.getInstance(requireContext()).artistSortOrder return PreferenceUtilKT.artistSortOrder
} }
override fun saveSortOrder(sortOrder: String) { override fun saveSortOrder(sortOrder: String) {
PreferenceUtil.getInstance(requireContext()).artistSortOrder = sortOrder PreferenceUtilKT.artistSortOrder = sortOrder
} }
override fun loadLayoutRes(): Int { override fun loadLayoutRes(): Int {
return PreferenceUtil.getInstance(requireContext()).artistGridStyle return PreferenceUtilKT.artistGridStyle
} }
override fun saveLayoutRes(layoutRes: Int) { override fun saveLayoutRes(layoutRes: Int) {
PreferenceUtil.getInstance(requireContext()).artistGridStyle = layoutRes PreferenceUtilKT.artistGridStyle = layoutRes
} }
companion object { companion object {

View file

@ -6,8 +6,10 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.NonNull import androidx.annotation.NonNull
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R 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.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.DensityUtil import code.name.monkey.retromusic.util.DensityUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create import code.name.monkey.retromusic.util.ThemedFastScroller.create
@ -20,6 +22,7 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder
abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> : abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> :
AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener { AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener {
protected var adapter: A? = null protected var adapter: A? = null
protected var layoutManager: LM? = null protected var layoutManager: LM? = null
@ -90,6 +93,8 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
} }
} }
private fun initLayoutManager() { private fun initLayoutManager() {
layoutManager = createLayoutManager() layoutManager = createLayoutManager()
} }
@ -104,7 +109,7 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
container.paddingLeft, container.paddingLeft,
container.paddingTop, container.paddingTop,
container.paddingRight, container.paddingRight,
mainActivity.totalAppBarScrollingRange + i mainActivity.getTotalAppBarScrollingRange() + i
) )
} }

View file

@ -7,7 +7,8 @@ import android.view.animation.DecelerateInterpolator
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.fragments.VolumeFragment import code.name.monkey.retromusic.fragments.VolumeFragment
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper 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 import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
/** /**
@ -62,10 +63,12 @@ abstract class AbsPlayerControlsFragment : AbsMusicServiceFragment(),
protected var volumeFragment: VolumeFragment? = null protected var volumeFragment: VolumeFragment? = null
private fun hideVolumeIfAvailable() { private fun hideVolumeIfAvailable() {
if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { if (PreferenceUtilKT.isVolumeVisibilityMode) {
childFragmentManager.beginTransaction().replace(R.id.volumeFragmentContainer, VolumeFragment()).commit() childFragmentManager.beginTransaction()
.replace(R.id.volumeFragmentContainer, VolumeFragment()).commit()
childFragmentManager.executePendingTransactions() childFragmentManager.executePendingTransactions()
volumeFragment = childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment? volumeFragment =
childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment?
} }
} }

View file

@ -255,7 +255,7 @@ abstract class AbsPlayerFragment : AbsMusicServiceFragment(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if (PreferenceUtil.getInstance(requireContext()).fullScreenMode && if (PreferenceUtilKT.isFullScreenMode &&
view.findViewById<View>(R.id.status_bar) != null view.findViewById<View>(R.id.status_bar) != null
) { ) {
view.findViewById<View>(R.id.status_bar).visibility = View.GONE view.findViewById<View>(R.id.status_bar).visibility = View.GONE

View file

@ -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<List<Genre>>()
init {
loadGenre()
}
fun loadGenre() = viewModelScope.launch {
val result = RepositoryImpl(getApplication()).allGenres()
if (result is Success) {
genres.value = result.data
}else {
genres.value = listOf()
}
}
}

View file

@ -17,7 +17,6 @@ package code.name.monkey.retromusic.fragments.genres
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
@ -28,8 +27,6 @@ import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(), class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(),
MainActivityFragmentCallbacks { MainActivityFragmentCallbacks {
lateinit var genreViewModel: GenreViewModel
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
App.musicComponent.inject(this) App.musicComponent.inject(this)
@ -37,14 +34,14 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearL
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
genreViewModel = ViewModelProvider(this).get(GenreViewModel::class.java) mainActivity.libraryViewModel.allGenres().observe(
genreViewModel.genres.observe(viewLifecycleOwner, Observer { genres -> viewLifecycleOwner, Observer { genres ->
if (genres.isNotEmpty()) { if (genres.isNotEmpty()) {
adapter?.swapDataSet(genres) adapter?.swapDataSet(genres)
} else { } else {
adapter?.swapDataSet(listOf()) adapter?.swapDataSet(listOf())
} }
}) })
} }
override fun handleBackPress(): Boolean { override fun handleBackPress(): Boolean {
@ -63,10 +60,6 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearL
override val emptyMessage: Int override val emptyMessage: Int
get() = R.string.no_genres get() = R.string.no_genres
override fun onMediaStoreChanged() {
genreViewModel.loadGenre()
}
companion object { companion object {
@JvmField @JvmField
val TAG: String = GenresFragment::class.java.simpleName val TAG: String = GenresFragment::class.java.simpleName

View file

@ -20,7 +20,7 @@ import android.util.DisplayMetrics
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.HomeAdapter import code.name.monkey.retromusic.adapter.HomeAdapter
@ -34,16 +34,14 @@ import code.name.monkey.retromusic.model.smartplaylist.HistoryPlaylist
import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist
import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist
import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.abs_playlists.* import kotlinx.android.synthetic.main.abs_playlists.*
import kotlinx.android.synthetic.main.fragment_banner_home.* import kotlinx.android.synthetic.main.fragment_banner_home.*
import kotlinx.android.synthetic.main.home_content.* import kotlinx.android.synthetic.main.home_content.*
class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallbacks { class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallbacks {
private lateinit var homeAdapter: HomeAdapter private lateinit var homeAdapter: HomeAdapter
private lateinit var homeModel: HomeViewModel
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -51,7 +49,7 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate( return inflater.inflate(
if (PreferenceUtil.getInstance(requireContext()).isHomeBanner) R.layout.fragment_banner_home else R.layout.fragment_home, if (PreferenceUtilKT.isHomeBanner) R.layout.fragment_banner_home else R.layout.fragment_home,
viewGroup, viewGroup,
false false
) )
@ -114,17 +112,19 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
NavigationUtil.goToUserInfo(requireActivity(), options) NavigationUtil.goToUserInfo(requireActivity(), options)
} }
titleWelcome?.text = titleWelcome?.text =
String.format("%s", PreferenceUtil.getInstance(requireContext()).userName) String.format("%s", PreferenceUtilKT.userName)
homeAdapter = HomeAdapter(mainActivity, displayMetrics) homeAdapter = HomeAdapter(mainActivity, displayMetrics)
recyclerView.apply { recyclerView.apply {
layoutManager = LinearLayoutManager(mainActivity) layoutManager = LinearLayoutManager(mainActivity)
adapter = homeAdapter adapter = homeAdapter
} }
homeModel = ViewModelProvider(this).get(HomeViewModel::class.java)
homeModel.sections.observe(viewLifecycleOwner, androidx.lifecycle.Observer { sections -> mainActivity.libraryViewModel.homeSections()
homeAdapter.swapData(sections) .observe(viewLifecycleOwner, Observer { sections ->
}) homeAdapter.swapData(sections)
})
loadProfile() loadProfile()
} }

View file

@ -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<List<Home>>()
var repository: RepositoryImpl = RepositoryImpl(getApplication())
init {
loadHome()
}
private fun loadHome() = viewModelScope.launch {
val list = mutableListOf<Home>()
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
}
}

View file

@ -68,7 +68,7 @@ import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader;
import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.util.DensityUtil; import code.name.monkey.retromusic.util.DensityUtil;
import code.name.monkey.retromusic.util.FileUtil; 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.RetroColorUtil;
import code.name.monkey.retromusic.util.ThemedFastScroller; import code.name.monkey.retromusic.util.ThemedFastScroller;
import code.name.monkey.retromusic.views.BreadCrumbLayout; import code.name.monkey.retromusic.views.BreadCrumbLayout;
@ -134,7 +134,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
} }
public static FoldersFragment newInstance(Context context) { public static FoldersFragment newInstance(Context context) {
return newInstance(PreferenceUtil.getInstance(context).getStartDirectory()); return newInstance(PreferenceUtilKT.INSTANCE.getStartDirectory());
} }
private static File tryGetCanonicalFile(File file) { private static File tryGetCanonicalFile(File file) {
@ -238,7 +238,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
getFileComparator())); getFileComparator()));
return true; return true;
case R.id.action_set_as_start_directory: case R.id.action_set_as_start_directory:
PreferenceUtil.getInstance(requireContext()).setStartDirectory(file); PreferenceUtilKT.INSTANCE.setStartDirectory(file);
Toast.makeText(getActivity(), Toast.makeText(getActivity(),
String.format(getString(R.string.new_start_directory), file.getPath()), String.format(getString(R.string.new_start_directory), file.getPath()),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -341,7 +341,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_go_to_start_directory: case R.id.action_go_to_start_directory:
setCrumb(new BreadCrumbLayout.Crumb( setCrumb(new BreadCrumbLayout.Crumb(
tryGetCanonicalFile(PreferenceUtil.getInstance(requireContext()).getStartDirectory())), true); tryGetCanonicalFile(PreferenceUtilKT.INSTANCE.getStartDirectory())), true);
return true; return true;
case R.id.action_scan: case R.id.action_scan:
BreadCrumbLayout.Crumb crumb = getActiveCrumb(); BreadCrumbLayout.Crumb crumb = getActiveCrumb();

View file

@ -13,7 +13,8 @@ import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.transform.CarousalPagerTransformer import code.name.monkey.retromusic.transform.CarousalPagerTransformer
import code.name.monkey.retromusic.transform.ParallaxPagerTransformer 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_player_album_cover.* 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
viewPager.addOnPageChangeListener(this) viewPager.addOnPageChangeListener(this)
val nps = PreferenceUtil.getInstance(requireContext()).nowPlayingScreen val nps = PreferenceUtilKT.nowPlayingScreen
val metrics = resources.displayMetrics val metrics = resources.displayMetrics
val ratio = metrics.heightPixels.toFloat() / metrics.widthPixels.toFloat() val ratio = metrics.heightPixels.toFloat() / metrics.widthPixels.toFloat()
if (nps == Full || nps == Classic || nps == Fit || nps == Gradient) { if (nps == Full || nps == Classic || nps == Fit || nps == Gradient) {
viewPager.offscreenPageLimit = 2 viewPager.offscreenPageLimit = 2
} else if (PreferenceUtil.getInstance(requireContext()).carouselEffect()) { } else if (PreferenceUtilKT.isCarouselEffect) {
viewPager.clipToPadding = false viewPager.clipToPadding = false
val padding = val padding =
if (ratio >= 1.777f) { if (ratio >= 1.777f) {
@ -67,7 +68,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan
viewPager.offscreenPageLimit = 2 viewPager.offscreenPageLimit = 2
viewPager.setPageTransformer( viewPager.setPageTransformer(
true, true,
PreferenceUtil.getInstance(requireContext()).albumCoverTransform PreferenceUtilKT.albumCoverTransform
) )
} }
} }
@ -122,9 +123,6 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan
callbacks = listener callbacks = listener
} }
fun removeEffect() {
viewPager.setPageTransformer(false, null)
}
interface Callbacks { interface Callbacks {

View file

@ -25,7 +25,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_adaptive_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_adaptive_player_playback_controls.*
@ -66,7 +67,7 @@ class AdaptivePlaybackControlsFragment : AbsPlayerControlsFragment() {
} }
private fun updateSong() { private fun updateSong() {
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo?.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo?.text = getSongInfo(MusicPlayerRemote.currentSong)
songInfo.show() songInfo.show()
} else { } else {
@ -130,7 +131,7 @@ class AdaptivePlaybackControlsFragment : AbsPlayerControlsFragment() {
updatePrevNextColor() updatePrevNextColor()
updatePlayPauseColor() updatePlayPauseColor()
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()) ThemeStore.accentColor(requireContext())

View file

@ -25,21 +25,9 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor 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.*
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() { class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() {
@ -81,7 +69,7 @@ class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() {
title.text = song.title title.text = song.title
text.text = String.format("%s • %s", song.artistName, song.albumName) text.text = String.format("%s • %s", song.artistName, song.albumName)
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.show() songInfo.show()
songInfo?.text = getSongInfo(song) songInfo?.text = getSongInfo(song)
} else { } else {

View file

@ -9,6 +9,7 @@ import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper 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.R
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment 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.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_blur.* import kotlinx.android.synthetic.main.fragment_blur.*
@ -98,7 +98,7 @@ class BlurPlayerFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPrefer
private fun updateBlur() { private fun updateBlur() {
val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext()) val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext())
.getInt(PreferenceUtil.NEW_BLUR_AMOUNT, 25) .getInt(NEW_BLUR_AMOUNT, 25)
colorBackground.clearColorFilter() colorBackground.clearColorFilter()
SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong)
.checkIgnoreMediaStore(requireContext()) .checkIgnoreMediaStore(requireContext())
@ -141,7 +141,7 @@ class BlurPlayerFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPrefer
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == PreferenceUtil.NEW_BLUR_AMOUNT) { if (key == NEW_BLUR_AMOUNT) {
updateBlur() updateBlur()
} }
} }

View file

@ -24,7 +24,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_card_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_card_player_playback_controls.*
import kotlinx.android.synthetic.main.media_button.* import kotlinx.android.synthetic.main.media_button.*
@ -68,7 +69,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() {
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.text = getSongInfo(MusicPlayerRemote.currentSong)
songInfo.show() songInfo.show()
} else { } else {
@ -111,7 +112,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() {
} }
override fun setColor(color: MediaNotificationProcessor) { override fun setColor(color: MediaNotificationProcessor) {
if (ATHUtil.isWindowBackgroundDark(requireContext()) if (!ATHUtil.isWindowBackgroundDark(requireContext())
) { ) {
lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(activity, true) lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(activity, true)
lastDisabledPlaybackControlsColor = lastDisabledPlaybackControlsColor =
@ -128,7 +129,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() {
updatePlayPauseColor() updatePlayPauseColor()
updateProgressTextColor() updateProgressTextColor()
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()).ripAlpha() ThemeStore.accentColor(requireContext()).ripAlpha()

View file

@ -9,6 +9,7 @@ import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper 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.R
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment 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.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_card_blur_player.* import kotlinx.android.synthetic.main.fragment_card_blur_player.*
@ -88,12 +89,9 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen
private fun setUpSubFragments() { private fun setUpSubFragments() {
playbackControlsFragment = playbackControlsFragment =
childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as CardBlurPlaybackControlsFragment childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as CardBlurPlaybackControlsFragment
val playerAlbumCoverFragment = (childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment?)?.setCallbacks(
childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment? this
if (playerAlbumCoverFragment != null) { )
playerAlbumCoverFragment.setCallbacks(this)
playerAlbumCoverFragment.removeEffect()
}
} }
private fun setUpPlayerToolbar() { private fun setUpPlayerToolbar() {
@ -128,7 +126,7 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen
private fun updateBlur() { private fun updateBlur() {
val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext()) val blurAmount = PreferenceManager.getDefaultSharedPreferences(requireContext())
.getInt(PreferenceUtil.NEW_BLUR_AMOUNT, 25) .getInt(NEW_BLUR_AMOUNT, 25)
colorBackground!!.clearColorFilter() colorBackground!!.clearColorFilter()
SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong)
.checkIgnoreMediaStore(requireContext()) .checkIgnoreMediaStore(requireContext())
@ -160,7 +158,7 @@ class CardBlurFragment : AbsPlayerFragment(), SharedPreferences.OnSharedPreferen
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == PreferenceUtil.NEW_BLUR_AMOUNT) { if (key == NEW_BLUR_AMOUNT) {
updateBlur() updateBlur()
} }
} }

View file

@ -23,7 +23,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_card_blur_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_card_blur_player_playback_controls.*
import kotlinx.android.synthetic.main.media_button.* import kotlinx.android.synthetic.main.media_button.*
@ -113,7 +114,7 @@ class CardBlurPlaybackControlsFragment : AbsPlayerControlsFragment() {
} }
private fun updateSong() { private fun updateSong() {
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.text = getSongInfo(MusicPlayerRemote.currentSong)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -44,7 +44,8 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.util.MusicUtil 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import code.name.monkey.retromusic.views.SeekArc import code.name.monkey.retromusic.views.SeekArc
@ -195,7 +196,7 @@ class CirclePlayerFragment : AbsPlayerFragment(), Callback, OnAudioVolumeChanged
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -36,7 +36,8 @@ import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.model.Song 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.MusicUtil 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
@ -154,7 +155,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(), View.OnLayoutChangeListener,
} }
private fun hideVolumeIfAvailable() { private fun hideVolumeIfAvailable() {
if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { if (PreferenceUtilKT.isVolumeVisibilityMode) {
childFragmentManager.beginTransaction() childFragmentManager.beginTransaction()
.replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance()) .replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance())
.commit() .commit()
@ -185,7 +186,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(), View.OnLayoutChangeListener,
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -23,7 +23,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_color_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_color_player_playback_controls.*
@ -68,7 +69,7 @@ class ColorPlaybackControlsFragment : AbsPlayerControlsFragment() {
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -82,10 +82,9 @@ class FitFragment : AbsPlayerFragment() {
private fun setUpSubFragments() { private fun setUpSubFragments() {
playbackControlsFragment = playbackControlsFragment =
childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as FitPlaybackControlsFragment childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as FitPlaybackControlsFragment
val playerAlbumCoverFragment: PlayerAlbumCoverFragment = val playerAlbumCoverFragment =
childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment
playerAlbumCoverFragment.setCallbacks(this) playerAlbumCoverFragment.setCallbacks(this)
playerAlbumCoverFragment.removeEffect()
} }
private fun setUpPlayerToolbar() { private fun setUpPlayerToolbar() {

View file

@ -26,7 +26,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_fit_playback_controls.* import kotlinx.android.synthetic.main.fragment_fit_playback_controls.*
@ -71,7 +72,7 @@ class FitPlaybackControlsFragment : AbsPlayerControlsFragment() {
val song = MusicPlayerRemote.currentSong val song = MusicPlayerRemote.currentSong
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {
@ -126,7 +127,7 @@ class FitPlaybackControlsFragment : AbsPlayerControlsFragment() {
MaterialValueHelper.getPrimaryDisabledTextColor(activity, false) MaterialValueHelper.getPrimaryDisabledTextColor(activity, false)
} }
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()).ripAlpha() ThemeStore.accentColor(requireContext()).ripAlpha()

View file

@ -27,7 +27,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_flat_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_flat_player_playback_controls.*
@ -95,7 +96,7 @@ class FlatPlaybackControlsFragment : AbsPlayerControlsFragment(), Callback {
MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
} }
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()).ripAlpha() ThemeStore.accentColor(requireContext()).ripAlpha()
@ -165,7 +166,7 @@ class FlatPlaybackControlsFragment : AbsPlayerControlsFragment(), Callback {
val song = MusicPlayerRemote.currentSong val song = MusicPlayerRemote.currentSong
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -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.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import code.name.monkey.retromusic.views.DrawableGradient import code.name.monkey.retromusic.views.DrawableGradient
@ -98,7 +99,7 @@ class FlatPlayerFragment : AbsPlayerFragment() {
override fun toolbarIconColor(): Int { override fun toolbarIconColor(): Int {
val isLight = ColorUtil.isColorLight(paletteColor) val isLight = ColorUtil.isColorLight(paletteColor)
return if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) return if (PreferenceUtilKT.isAdaptiveColor)
MaterialValueHelper.getPrimaryTextColor(requireContext(), isLight) MaterialValueHelper.getPrimaryTextColor(requireContext(), isLight)
else else
ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal) ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal)
@ -109,12 +110,12 @@ class FlatPlayerFragment : AbsPlayerFragment() {
controlsFragment.setColor(color) controlsFragment.setColor(color)
callbacks?.onPaletteColorChanged() callbacks?.onPaletteColorChanged()
val isLight = ColorUtil.isColorLight(color.backgroundColor) val isLight = ColorUtil.isColorLight(color.backgroundColor)
val iconColor = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) val iconColor = if (PreferenceUtilKT.isAdaptiveColor)
MaterialValueHelper.getPrimaryTextColor(requireContext(), isLight) MaterialValueHelper.getPrimaryTextColor(requireContext(), isLight)
else else
ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal) ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal)
ToolbarContentTintHelper.colorizeToolbar(playerToolbar, iconColor, requireActivity()) ToolbarContentTintHelper.colorizeToolbar(playerToolbar, iconColor, requireActivity())
if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { if (PreferenceUtilKT.isAdaptiveColor) {
colorize(color.backgroundColor) colorize(color.backgroundColor)
} }
} }

View file

@ -29,7 +29,8 @@ import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.model.Song 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.MusicUtil 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_full_player_controls.* import kotlinx.android.synthetic.main.fragment_full_player_controls.*
@ -128,7 +129,7 @@ class FullPlaybackControlsFragment : AbsPlayerControlsFragment(),
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
updateIsFavorite() updateIsFavorite()
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -38,7 +38,8 @@ import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.model.Song 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.MusicUtil 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
@ -207,7 +208,7 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe
container.setBackgroundColor(ColorUtil.darkenColor(color.backgroundColor)) container.setBackgroundColor(ColorUtil.darkenColor(color.backgroundColor))
lastPlaybackControlsColor = color.primaryTextColor lastPlaybackControlsColor = color.primaryTextColor
lastDisabledPlaybackControlsColor = color.secondaryTextColor lastDisabledPlaybackControlsColor = ColorUtil.withAlpha(color.primaryTextColor, 0.3f)
title.setTextColor(lastPlaybackControlsColor) title.setTextColor(lastPlaybackControlsColor)
text.setTextColor(lastDisabledPlaybackControlsColor) text.setTextColor(lastDisabledPlaybackControlsColor)
@ -243,7 +244,7 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe
} }
private fun hideVolumeIfAvailable() { private fun hideVolumeIfAvailable() {
if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { if (PreferenceUtilKT.isVolumeVisibilityMode) {
childFragmentManager.beginTransaction() childFragmentManager.beginTransaction()
.replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance()) .replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance())
.commit() .commit()
@ -284,7 +285,7 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
updateLabel() updateLabel()
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {
@ -304,9 +305,9 @@ class GradientPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelpe
private fun updatePlayPauseDrawableState() { private fun updatePlayPauseDrawableState() {
if (MusicPlayerRemote.isPlaying) { if (MusicPlayerRemote.isPlaying) {
playPauseButton.setImageResource(R.drawable.ic_pause_sharp_white_64dp) playPauseButton.setImageResource(R.drawable.ic_pause_white_64dp)
} else { } else {
playPauseButton.setImageResource(R.drawable.ic_play_arrow_sharp_white_64dp) playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_64dp)
} }
} }

View file

@ -38,7 +38,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_lock_screen_playback_controls.* import kotlinx.android.synthetic.main.fragment_lock_screen_playback_controls.*
@ -125,7 +126,7 @@ class LockScreenPlayerControlsFragment : AbsPlayerControlsFragment() {
MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
} }
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
textColorSecondary() textColorSecondary()

View file

@ -19,7 +19,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_material_playback_controls.* import kotlinx.android.synthetic.main.fragment_material_playback_controls.*
@ -56,7 +57,7 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() {
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {
@ -113,7 +114,7 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() {
updateRepeatState() updateRepeatState()
updateShuffleState() updateShuffleState()
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
lastPlaybackControlsColor lastPlaybackControlsColor
} else { } else {
textColorSecondary() textColorSecondary()

View file

@ -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.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import code.name.monkey.retromusic.views.DrawableGradient import code.name.monkey.retromusic.views.DrawableGradient
@ -85,7 +86,7 @@ class PlayerFragment : AbsPlayerFragment() {
requireActivity() requireActivity()
) )
if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { if (PreferenceUtilKT.isAdaptiveColor) {
colorize(color.backgroundColor) colorize(color.backgroundColor)
} }
} }

View file

@ -26,7 +26,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_player_playback_controls.*
@ -77,7 +78,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment() {
MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
} }
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()) ThemeStore.accentColor(requireContext())
@ -104,7 +105,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment() {
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -36,7 +36,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_peak_control_player.* import kotlinx.android.synthetic.main.fragment_peak_control_player.*
@ -89,7 +90,7 @@ class PeakPlayerControlFragment : AbsPlayerControlsFragment() {
override fun setColor(color: MediaNotificationProcessor) { override fun setColor(color: MediaNotificationProcessor) {
val controlsColor = val controlsColor =
if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()) ThemeStore.accentColor(requireContext())

View file

@ -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.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_peak_player.* import kotlinx.android.synthetic.main.fragment_peak_player.*
@ -113,7 +114,7 @@ class PeakPlayerFragment : AbsPlayerFragment() {
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -26,7 +26,8 @@ import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_adaptive_player_playback_controls.* import kotlinx.android.synthetic.main.fragment_adaptive_player_playback_controls.*
import kotlinx.android.synthetic.main.fragment_plain_controls_fragment.nextButton import kotlinx.android.synthetic.main.fragment_plain_controls_fragment.nextButton
@ -73,7 +74,7 @@ class PlainPlaybackControlsFragment : AbsPlayerControlsFragment() {
} }
private fun updateSong() { private fun updateSong() {
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(MusicPlayerRemote.currentSong) songInfo.text = getSongInfo(MusicPlayerRemote.currentSong)
songInfo.show() songInfo.show()
} else { } else {
@ -156,7 +157,7 @@ class PlainPlaybackControlsFragment : AbsPlayerControlsFragment() {
MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
} }
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()) ThemeStore.accentColor(requireContext())

View file

@ -20,7 +20,8 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
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.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_simple_controls_fragment.* import kotlinx.android.synthetic.main.fragment_simple_controls_fragment.*
@ -155,7 +156,7 @@ class SimplePlaybackControlsFragment : AbsPlayerControlsFragment() {
title.text = song.title title.text = song.title
text.text = song.artistName text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {
@ -212,7 +213,7 @@ class SimplePlaybackControlsFragment : AbsPlayerControlsFragment() {
MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
} }
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { val colorFinal = if (PreferenceUtilKT.isAdaptiveColor) {
color.primaryTextColor color.primaryTextColor
} else { } else {
ThemeStore.accentColor(requireContext()) ThemeStore.accentColor(requireContext())

View file

@ -21,7 +21,8 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_tiny_player.* import kotlinx.android.synthetic.main.fragment_tiny_player.*
@ -102,7 +103,7 @@ class TinyPlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Ca
title.text = song.title title.text = song.title
text.text = String.format("%s \nby - %s", song.albumName, song.artistName) text.text = String.format("%s \nby - %s", song.albumName, song.artistName)
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { if (PreferenceUtilKT.isSongInfo) {
songInfo.text = getSongInfo(song) songInfo.text = getSongInfo(song)
songInfo.show() songInfo.show()
} else { } else {

View file

@ -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<List<Playlist>>()
init {
loadPlaylist()
}
fun loadPlaylist() = viewModelScope.launch {
val result = RepositoryImpl(getApplication()).allPlaylists()
if (result is Result.Success) {
playlists.value = result.data
} else {
playlists.value = listOf()
}
}
}

View file

@ -5,7 +5,6 @@ import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.View import android.view.View
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter
@ -16,18 +15,17 @@ class PlaylistsFragment :
AbsLibraryPagerRecyclerViewFragment<PlaylistAdapter, GridLayoutManager>(), AbsLibraryPagerRecyclerViewFragment<PlaylistAdapter, GridLayoutManager>(),
MainActivityFragmentCallbacks { MainActivityFragmentCallbacks {
lateinit var playlistViewModel: PlaylistViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
playlistViewModel = ViewModelProvider(this).get(PlaylistViewModel::class.java) mainActivity.libraryViewModel.allPlaylisits()
playlistViewModel.playlists.observe(viewLifecycleOwner, Observer { playlists -> .observe(viewLifecycleOwner, Observer { playlists ->
if (playlists.isNotEmpty()) { if (playlists.isNotEmpty()) {
adapter?.swapDataSet(playlists) adapter?.swapDataSet(playlists)
} else { } else {
adapter?.swapDataSet(listOf()) adapter?.swapDataSet(listOf())
} }
}) })
} }
override fun handleBackPress(): Boolean { override fun handleBackPress(): Boolean {
@ -50,11 +48,6 @@ class PlaylistsFragment :
) )
} }
override fun onMediaStoreChanged() {
super.onMediaStoreChanged()
playlistViewModel.loadPlaylist()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
menu.apply { menu.apply {

View file

@ -19,11 +19,10 @@ import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.DialogFragment
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat
import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.preferences.* import code.name.monkey.retromusic.preferences.*
@ -33,7 +32,7 @@ import code.name.monkey.retromusic.util.NavigationUtil
* @author Hemanth S (h4h13). * @author Hemanth S (h4h13).
*/ */
abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() { abstract class AbsSettingsFragment : PreferenceFragmentCompat() {
internal fun showProToastAndNavigate(message: String) { internal fun showProToastAndNavigate(message: String) {
Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT) Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT)
@ -73,16 +72,25 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
invalidateSettings() invalidateSettings()
} }
override fun onCreatePreferenceDialog(preference: Preference): DialogFragment? { override fun onDisplayPreferenceDialog(preference: Preference?) {
return when (preference) { when (preference) {
is LibraryPreference -> LibraryPreferenceDialog.newInstance(preference.key) is LibraryPreference -> {
is NowPlayingScreenPreference -> NowPlayingScreenPreferenceDialog.newInstance(preference.key) val fragment = LibraryPreferenceDialog.newInstance()
is AlbumCoverStylePreference -> AlbumCoverStylePreferenceDialog.newInstance(preference.key) fragment.show(childFragmentManager, preference.key)
is MaterialListPreference -> {
MaterialListPreferenceDialog.newInstance(preference)
} }
is BlacklistPreference -> BlacklistPreferenceDialog.newInstance() is NowPlayingScreenPreference -> {
else -> super.onCreatePreferenceDialog(preference) 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)
} }
} }
} }

View file

@ -20,7 +20,7 @@ import android.os.Bundle
import androidx.preference.Preference import androidx.preference.Preference
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
/** /**
* @author Hemanth S (h4h13). * @author Hemanth S (h4h13).
@ -29,7 +29,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil
class AudioSettings : AbsSettingsFragment() { class AudioSettings : AbsSettingsFragment() {
override fun invalidateSettings() { override fun invalidateSettings() {
val findPreference: Preference = findPreference("equalizer")!! val findPreference: Preference = findPreference("equalizer")!!
if (!hasEqualizer() && PreferenceUtil.getInstance(requireContext()).selectedEqualizer != "retro") { if (!hasEqualizer()) {
findPreference.isEnabled = false findPreference.isEnabled = false
findPreference.summary = resources.getString(R.string.no_equalizer) findPreference.summary = resources.getString(R.string.no_equalizer)
} else { } else {

View file

@ -20,8 +20,9 @@ import android.os.Build.VERSION_CODES
import android.os.Bundle import android.os.Bundle
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference import androidx.preference.TwoStatePreference
import code.name.monkey.retromusic.CLASSIC_NOTIFICATION
import code.name.monkey.retromusic.R 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(), class NotificationSettingsFragment : AbsSettingsFragment(),
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == PreferenceUtil.CLASSIC_NOTIFICATION) { if (key == CLASSIC_NOTIFICATION) {
if (VERSION.SDK_INT >= VERSION_CODES.O) { if (VERSION.SDK_INT >= VERSION_CODES.O) {
findPreference<Preference>("colored_notification")?.isEnabled = findPreference<Preference>("colored_notification")?.isEnabled =
sharedPreferences?.getBoolean(key, false)!! sharedPreferences?.getBoolean(key, false)!!
@ -46,11 +47,10 @@ class NotificationSettingsFragment : AbsSettingsFragment(),
classicNotification?.isVisible = false classicNotification?.isVisible = false
} else { } else {
classicNotification?.apply { classicNotification?.apply {
isChecked = PreferenceUtil.getInstance(requireContext()).classicNotification() isChecked = PreferenceUtilKT.isClassicNotification
setOnPreferenceChangeListener { _, newValue -> setOnPreferenceChangeListener { _, newValue ->
// Save preference // Save preference
PreferenceUtil.getInstance(requireContext()) PreferenceUtilKT.isClassicNotification = newValue as Boolean
.setClassicNotification(newValue as Boolean)
invalidateSettings() invalidateSettings()
true true
} }
@ -59,14 +59,12 @@ class NotificationSettingsFragment : AbsSettingsFragment(),
val coloredNotification: TwoStatePreference? = findPreference("colored_notification") val coloredNotification: TwoStatePreference? = findPreference("colored_notification")
if (VERSION.SDK_INT >= VERSION_CODES.O) { if (VERSION.SDK_INT >= VERSION_CODES.O) {
coloredNotification?.isEnabled = coloredNotification?.isEnabled = PreferenceUtilKT.isClassicNotification
PreferenceUtil.getInstance(requireContext()).classicNotification()
} else { } else {
coloredNotification?.apply { coloredNotification?.apply {
isChecked = PreferenceUtil.getInstance(requireContext()).coloredNotification() isChecked = PreferenceUtilKT.isColoredNotification
setOnPreferenceChangeListener { _, newValue -> setOnPreferenceChangeListener { _, newValue ->
PreferenceUtil.getInstance(requireContext()) PreferenceUtilKT.isColoredNotification = newValue as Boolean
.setColoredNotification(newValue as Boolean)
true true
} }
} }
@ -75,13 +73,12 @@ class NotificationSettingsFragment : AbsSettingsFragment(),
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
PreferenceUtil.getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this) PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this)
} }
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
PreferenceUtil.getInstance(requireContext()) PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this)
.unregisterOnSharedPreferenceChangedListener(this)
} }
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

View file

@ -19,9 +19,8 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference import androidx.preference.TwoStatePreference
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.util.PreferenceUtilKT
import code.name.monkey.retromusic.util.PreferenceUtil.*
/** /**
* @author Hemanth S (h4h13). * @author Hemanth S (h4h13).
@ -50,24 +49,24 @@ class NowPlayingSettingsFragment : AbsSettingsFragment(),
private fun updateAlbumCoverStyleSummary() { private fun updateAlbumCoverStyleSummary() {
val preference: Preference = findPreference(ALBUM_COVER_STYLE)!! val preference: Preference = findPreference(ALBUM_COVER_STYLE)!!
preference.setSummary(getInstance(requireContext()).albumCoverStyle.titleRes) preference.setSummary(PreferenceUtilKT.albumCoverStyle.titleRes)
} }
private fun updateNowPlayingScreenSummary() { private fun updateNowPlayingScreenSummary() {
val preference: Preference = findPreference(NOW_PLAYING_SCREEN_ID)!! 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this) PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this)
val preference: Preference = findPreference("album_cover_transform")!! val preference: Preference = findPreference("album_cover_transform")!!
setSummary(preference) setSummary(preference)
} }
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
getInstance(requireContext()).unregisterOnSharedPreferenceChangedListener(this) PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this)
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {

View file

@ -19,8 +19,10 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference import androidx.preference.TwoStatePreference
import code.name.monkey.retromusic.CAROUSEL_EFFECT
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtilKT
class PersonalizeSettingsFragment : AbsSettingsFragment(), class PersonalizeSettingsFragment : AbsSettingsFragment(),
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
@ -40,7 +42,7 @@ class PersonalizeSettingsFragment : AbsSettingsFragment(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
PreferenceUtil.getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this) PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this)
var preference: Preference? = findPreference("home_artist_grid_style") var preference: Preference? = findPreference("home_artist_grid_style")
setSummary(preference!!) setSummary(preference!!)
@ -50,13 +52,12 @@ class PersonalizeSettingsFragment : AbsSettingsFragment(),
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
PreferenceUtil.getInstance(requireContext()) PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this)
.unregisterOnSharedPreferenceChangedListener(this)
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
when (key) { when (key) {
PreferenceUtil.CAROUSEL_EFFECT -> invalidateSettings() CAROUSEL_EFFECT -> invalidateSettings()
} }
} }
} }

View file

@ -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.ColorUtil
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.DESATURATED_COLOR
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager 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.MaterialDialog
import com.afollestad.materialdialogs.color.colorChooser import com.afollestad.materialdialogs.color.colorChooser
@ -48,7 +49,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
ThemeStore.markChanged(requireContext()) ThemeStore.markChanged(requireContext())
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme)) requireActivity().setTheme(PreferenceUtilKT.themeResFromPrefValue(theme))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
} }
requireActivity().recreate() requireActivity().recreate()
@ -62,7 +63,6 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
accentColorPref.setOnPreferenceClickListener { accentColorPref.setOnPreferenceClickListener {
MaterialDialog(requireActivity()).show { MaterialDialog(requireActivity()).show {
cornerRadius(PreferenceUtil.getInstance(requireContext()).dialogCorner)
title(R.string.accent_color) title(R.string.accent_color)
positiveButton(R.string.set) positiveButton(R.string.set)
colorChooser( colorChooser(
@ -75,7 +75,6 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
requireActivity().recreate() requireActivity().recreate()
} }
} }
return@setOnPreferenceClickListener true return@setOnPreferenceClickListener true
@ -88,22 +87,21 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
} }
ThemeStore.markChanged(requireContext()) ThemeStore.markChanged(requireContext())
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue("black")) requireActivity().setTheme(PreferenceUtilKT.themeResFromPrefValue("black"))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
} }
requireActivity().recreate() requireActivity().recreate()
true true
} }
val desaturatedColor: ATESwitchPreference? = val desaturatedColor: ATESwitchPreference? = findPreference(DESATURATED_COLOR)
findPreference(PreferenceUtil.DESATURATED_COLOR)
desaturatedColor?.setOnPreferenceChangeListener { _, value -> desaturatedColor?.setOnPreferenceChangeListener { _, value ->
val desaturated = value as Boolean val desaturated = value as Boolean
ThemeStore.prefs(requireContext()) ThemeStore.prefs(requireContext())
.edit() .edit()
.putBoolean("desaturated_color", desaturated) .putBoolean("desaturated_color", desaturated)
.apply() .apply()
PreferenceUtil.getInstance(requireContext()).setDesaturatedColor(desaturated) PreferenceUtilKT.isDesaturatedColor = desaturated
requireActivity().recreate() requireActivity().recreate()
true true
} }
@ -113,12 +111,9 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
if (!VersionUtils.hasNougatMR()) { if (!VersionUtils.hasNougatMR()) {
colorAppShortcuts.isVisible = false colorAppShortcuts.isVisible = false
} else { } else {
colorAppShortcuts.isChecked = colorAppShortcuts.isChecked = PreferenceUtilKT.isColoredAppShortcuts
PreferenceUtil.getInstance(requireContext()).coloredAppShortcuts()
colorAppShortcuts.setOnPreferenceChangeListener { _, newValue -> colorAppShortcuts.setOnPreferenceChangeListener { _, newValue ->
// Save preference PreferenceUtilKT.isColoredAppShortcuts = newValue as Boolean
PreferenceUtil.getInstance(requireContext())
.setColoredAppShortcuts(newValue as Boolean)
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
true true
} }

View file

@ -4,41 +4,36 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter 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.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.model.Song 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.mvp.presenter.SongView
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtilKT
import java.util.* import java.util.*
import javax.inject.Inject
class SongsFragment : class SongsFragment :
AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager>(), AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager>(),
SongView, MainActivityFragmentCallbacks { SongView, MainActivityFragmentCallbacks {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@Inject super.onViewCreated(view, savedInstanceState)
lateinit var songPresenter: SongPresenter mainActivity.libraryViewModel.allSongs()
.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
if (it.isNotEmpty()) {
adapter?.swapDataSet(it)
} else {
adapter?.swapDataSet(listOf())
}
})
}
override val emptyMessage: Int override val emptyMessage: Int
get() = R.string.no_songs 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 { override fun createLayoutManager(): GridLayoutManager {
println("createLayoutManager: ${getGridSize()}")
return GridLayoutManager(requireActivity(), getGridSize()).apply { return GridLayoutManager(requireActivity(), getGridSize()).apply {
spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int { override fun getSpanSize(position: Int): Int {
@ -66,79 +61,61 @@ class SongsFragment :
adapter?.swapDataSet(songs) adapter?.swapDataSet(songs)
} }
override fun onMediaStoreChanged() {
songPresenter.loadSongs()
}
override fun loadGridSize(): Int { override fun loadGridSize(): Int {
return PreferenceUtil.getInstance(requireContext()).getSongGridSize(requireContext()) return PreferenceUtilKT.songGridSize
} }
override fun saveGridSize(gridColumns: Int) { override fun saveGridSize(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setSongGridSize(gridColumns) PreferenceUtilKT.songGridSize = gridColumns
} }
override fun loadGridSizeLand(): Int { override fun loadGridSizeLand(): Int {
return PreferenceUtil.getInstance(requireContext()).getSongGridSizeLand(requireContext()) return PreferenceUtilKT.songGridSizeLand
} }
override fun saveGridSizeLand(gridColumns: Int) { override fun saveGridSizeLand(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setSongGridSizeLand(gridColumns) PreferenceUtilKT.songGridSizeLand = gridColumns
} }
override fun setGridSize(gridSize: Int) { override fun setGridSize(gridSize: Int) {
adapter?.notifyDataSetChanged() adapter?.notifyDataSetChanged()
} }
override fun onResume() {
super.onResume()
if (adapter?.dataSet.isNullOrEmpty())
songPresenter.loadSongs()
}
override fun onDestroyView() {
super.onDestroyView()
songPresenter.detachView()
}
override fun showEmptyView() { override fun showEmptyView() {
adapter?.swapDataSet(ArrayList()) adapter?.swapDataSet(ArrayList())
} }
override fun loadSortOrder(): String { override fun loadSortOrder(): String {
return PreferenceUtil.getInstance(requireContext()).songSortOrder return PreferenceUtilKT.songSortOrder
} }
override fun saveSortOrder(sortOrder: String) { 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) { override fun setSortOrder(sortOrder: String) {
songPresenter.loadSongs() mainActivity.libraryViewModel.forceReload(ReloadType.Songs)
} }
companion object { companion object {
@JvmField @JvmField
var TAG: String = SongsFragment::class.java.simpleName var TAG: String = SongsFragment::class.java.simpleName
@JvmStatic @JvmStatic
fun newInstance(): SongsFragment { fun newInstance(): SongsFragment {
val args = Bundle() return SongsFragment()
val fragment = SongsFragment()
fragment.arguments = args
return fragment
} }
} }
@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 { override fun handleBackPress(): Boolean {
return false return false

View file

@ -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<List<Song>>()
init {
loadSongs()
}
fun loadSongs() = viewModelScope.launch {
val result = RepositoryImpl(getApplication()).allSongs()
if (result is Success) {
songs.value = result.data
} else {
songs.value = listOf()
}
}
}

Some files were not shown because too many files have changed in this diff Show more