From c648dcb3783ed0c9d17dc42ed975055508f9bf69 Mon Sep 17 00:00:00 2001 From: h4h13 Date: Wed, 8 Aug 2018 13:33:38 +0530 Subject: [PATCH] 1.7.100 --- app/app.iml | 7 +- app/build.gradle | 6 +- .../main/assets/fonts/product_sans_bold.ttf | Bin 55548 -> 0 bytes .../assets/fonts/product_sans_regular.ttf | Bin 41116 -> 0 bytes app/src/main/assets/index.html | 2 +- app/src/main/assets/retro-changelog.html | 2 +- .../retromusic/dialogs/HomeOptionDialog.java | 3 +- .../monkey/retromusic/loaders/HomeLoader.java | 85 +- .../name/monkey/retromusic/model/Home.java | 33 +- .../retromusic/mvp/contract/HomeContract.java | 7 +- .../retromusic/providers/RepositoryImpl.java | 6 +- .../providers/interfaces/Repository.java | 42 +- .../ui/activities/AboutActivity.java | 16 +- .../ui/activities/AlbumDetailsActivity.java | 3 - .../ui/activities/ArtistDetailActivity.java | 650 ++++---- .../ui/activities/EqualizerActivity.java | 363 ++--- .../ui/activities/GenreDetailsActivity.java | 19 +- .../ui/activities/LicenseActivity.java | 68 +- .../ui/activities/MainActivity.java | 16 +- .../ui/activities/PlayingQueueActivity.java | 87 +- .../ui/activities/PlaylistDetailActivity.java | 33 +- .../ui/activities/SearchActivity.java | 23 +- .../ui/activities/SettingsActivity.java | 212 ++- .../SupportDevelopmentActivity.java | 50 +- .../ui/adapter/CollageSongAdapter.java | 130 +- .../ui/adapter/album/AlbumAdapter.java | 7 +- .../adapter/album/AlbumFullWithAdapter.java | 198 +-- .../ui/adapter/artist/ArtistAdapter.java | 295 ++-- .../ui/adapter/base/MediaEntryViewHolder.java | 137 +- .../ui/adapter/home/HomeAdapter.java | 225 ++- .../base/AbsMainActivityFragment.java | 7 +- .../mainactivity/AlbumsFragment.java | 285 ++-- .../mainactivity/LibraryFragment.java | 801 +++++----- .../mainactivity/folders/FoldersFragment.java | 1305 ++++++++--------- .../mainactivity/home/BannerHomeFragment.java | 536 +++---- .../mainactivity/home/HomeFragment.java | 413 +++++- .../LockScreenPlayerControlsFragment.java | 16 +- .../plain/PlainPlaybackControlsFragment.java | 537 ++++--- .../settings/AbsSettingsFragment.java | 5 +- .../settings/MainSettingsFragment.java | 17 +- .../retromusic/util/NavigationUtil.java | 173 +-- .../monkey/retromusic/util/RetroUtil.java | 2 +- .../views/MetalRecyclerViewPager.java | 2 +- .../views/RoundCornerFrameLayout.java | 70 - .../RoundedBottomSheetDialogFragment.java | 48 +- .../SansFontCollapsingToolbarLayout.java | 2 +- app/src/main/res/drawable/bg_card_line.xml | 1 + .../res/drawable/bg_circular_top_corners.xml | 11 +- .../res/layout-land/activity_settings.xml | 103 +- .../res/layout-land/fragment_banner_home.xml | 211 ++- .../main/res/layout-land/fragment_home.xml | 11 +- .../res/layout-land/fragment_plain_player.xml | 8 +- .../layout-sw600dp/fragment_banner_home.xml | 113 ++ .../res/layout-xlarge-land/fragment_home.xml | 11 +- .../res/layout-xlarge/activity_settings.xml | 43 +- .../main/res/layout-xlarge/fragment_home.xml | 11 +- .../res/layout-xlarge/fragment_library.xml | 145 +- app/src/main/res/layout/activity_about.xml | 78 +- app/src/main/res/layout/activity_album.xml | 303 ++-- .../res/layout/activity_artist_details.xml | 323 ++-- app/src/main/res/layout/activity_donation.xml | 53 +- .../main/res/layout/activity_equalizer.xml | 273 ++-- app/src/main/res/layout/activity_license.xml | 42 +- .../res/layout/activity_playing_queue.xml | 115 +- .../res/layout/activity_playlist_detail.xml | 58 +- app/src/main/res/layout/activity_search.xml | 230 +-- app/src/main/res/layout/activity_settings.xml | 38 +- app/src/main/res/layout/dialog_changelog.xml | 1 + .../main/res/layout/fragment_banner_home.xml | 195 ++- app/src/main/res/layout/fragment_folder.xml | 215 +-- app/src/main/res/layout/fragment_home.xml | 10 +- app/src/main/res/layout/fragment_library.xml | 133 +- .../res/layout/home_section_recycler_view.xml | 1 + app/src/main/res/layout/item_collage.xml | 350 ++--- .../main/res/layout/item_donation_option.xml | 9 +- app/src/main/res/layout/item_grid_circle.xml | 116 +- app/src/main/res/layout/item_image.xml | 64 +- app/src/main/res/layout/pager_item.xml | 5 +- app/src/main/res/menu/menu_main.xml | 133 +- app/src/main/res/values/arrays.xml | 5 + app/src/main/res/values/attrs.xml | 4 +- app/src/main/res/values/donottranslate.xml | 2 - app/src/main/res/values/strings.xml | 1045 ++++++------- .../PersonaliseSettingsFragmentTest.java | 10 - 84 files changed, 6018 insertions(+), 5405 deletions(-) delete mode 100755 app/src/main/assets/fonts/product_sans_bold.ttf delete mode 100755 app/src/main/assets/fonts/product_sans_regular.ttf delete mode 100644 app/src/main/java/code/name/monkey/retromusic/views/RoundCornerFrameLayout.java create mode 100644 app/src/main/res/drawable/bg_card_line.xml create mode 100644 app/src/main/res/layout-sw600dp/fragment_banner_home.xml create mode 100644 app/src/main/res/layout/dialog_changelog.xml create mode 100644 app/src/main/res/layout/home_section_recycler_view.xml delete mode 100644 app/src/test/java/code/name/monkey/retromusic/ui/fragments/settings/PersonaliseSettingsFragmentTest.java diff --git a/app/app.iml b/app/app.iml index be879509e..6fb4f8010 100644 --- a/app/app.iml +++ b/app/app.iml @@ -133,6 +133,7 @@ + @@ -141,18 +142,14 @@ + - - - - - diff --git a/app/build.gradle b/app/build.gradle index bc3183e40..1c6751b7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 207 - versionName '1.7.10' + versionCode 209 + versionName '1.7.100' multiDexEnabled true @@ -86,7 +86,7 @@ static def getProperty(Properties properties, String name) { } static def getDate() { - new Date().format('yyyyMMdd') + new Date().format('MMdd') } ext { diff --git a/app/src/main/assets/fonts/product_sans_bold.ttf b/app/src/main/assets/fonts/product_sans_bold.ttf deleted file mode 100755 index d847195c7600a96700df62b68a5009be200f234d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55548 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 diff --git a/app/src/main/assets/index.html b/app/src/main/assets/index.html index 115106cb5..93fb4aa62 100644 --- a/app/src/main/assets/index.html +++ b/app/src/main/assets/index.html @@ -26,7 +26,7 @@ - +

Phonograph by Karim Abou Zeid

RxAndroid by RxAndroid authors

RxJava by RxJava authors

diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index a60837141..d39786976 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -1 +1 @@ -

You can view the changelog dialog again at any time from the about section.

Version 1.7.50

  1. Fix: Playlist renaming
  2. Improvement: Version naming
  3. Added: Changelog dialog
  4. Added: Home banner toggle.
  5. Improvement: Grammatical mistakes
\ No newline at end of file +

You can view the changelog dialog again at any time from the about section.

Version 1.7.100

  1. Fix: same theme follows entire app
  2. Added: Volume toggle for lock screen to support small screen
  3. Added: Volume toggle for lock screen to support small screen

Version 1.7.50

  1. Fix: Playlist renaming
  2. Improvement: Version naming
  3. Added: Changelog dialog
  4. Added: Home banner toggle.
  5. Improvement: Grammatical mistakes
\ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/HomeOptionDialog.java b/app/src/main/java/code/name/monkey/retromusic/dialogs/HomeOptionDialog.java index 771e68a7a..da17354ee 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/HomeOptionDialog.java +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/HomeOptionDialog.java @@ -110,7 +110,8 @@ public class HomeOptionDialog extends RoundedBottomSheetDialogFragment { if (mainActivity == null) { return; } - mainActivity.setCurrentFragment(FoldersFragment.newInstance(getContext()), true); + mainActivity.setCurrentFragment(FoldersFragment.newInstance(getContext()), true, + FoldersFragment.TAG); break; case R.id.action_settings: NavigationUtil.goToSettings(getActivity()); diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/HomeLoader.java b/app/src/main/java/code/name/monkey/retromusic/loaders/HomeLoader.java index 783f39ad7..790f73360 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/HomeLoader.java +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/HomeLoader.java @@ -1,60 +1,63 @@ package code.name.monkey.retromusic.loaders; + import android.content.Context; import android.support.annotation.NonNull; + +import java.util.ArrayList; + import code.name.monkey.retromusic.model.Playlist; import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist; import code.name.monkey.retromusic.model.smartplaylist.HistoryPlaylist; import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist; import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist; import io.reactivex.Observable; -import java.util.ArrayList; public class HomeLoader { - public static Observable> getRecentAndTopThings( - @NonNull Context context) { - ArrayList objects = new ArrayList<>(); - return Observable.create(e -> { + public static Observable> getRecentAndTopThings( + @NonNull Context context) { + ArrayList objects = new ArrayList<>(); + return Observable.create(e -> { - new HistoryPlaylist(context).getSongs(context).subscribe(songs -> { - if (!songs.isEmpty()) { - objects.add(new HistoryPlaylist(context)); - } - }); - new LastAddedPlaylist(context).getSongs(context).subscribe(songs -> { - if (!songs.isEmpty()) { - objects.add(new LastAddedPlaylist(context)); - } - }); - new MyTopTracksPlaylist(context).getSongs(context).subscribe(songs -> { - if (!songs.isEmpty()) { - objects.add(new MyTopTracksPlaylist(context)); - } - }); + new HistoryPlaylist(context).getSongs(context).subscribe(songs -> { + if (!songs.isEmpty()) { + objects.add(new HistoryPlaylist(context)); + } + }); + new LastAddedPlaylist(context).getSongs(context).subscribe(songs -> { + if (!songs.isEmpty()) { + objects.add(new LastAddedPlaylist(context)); + } + }); + new MyTopTracksPlaylist(context).getSongs(context).subscribe(songs -> { + if (!songs.isEmpty()) { + objects.add(new MyTopTracksPlaylist(context)); + } + }); - e.onNext(objects); - e.onComplete(); - }); - } - - public static Observable> getHomeLoader(@NonNull Context context) { - ArrayList playlists = new ArrayList<>(); - PlaylistLoader.getAllPlaylists(context) - .subscribe(playlists1 -> { - if (playlists1.size() > 0) { - for (Playlist playlist : playlists1) { - PlaylistSongsLoader.getPlaylistSongList(context, playlist) - .subscribe(songs -> { - if (songs.size() > 0) { - playlists.add(playlist); - } - }); - } - } + e.onNext(objects); + e.onComplete(); }); - return Observable.just(playlists); - } + } + + public static Observable> getHomeLoader(@NonNull Context context) { + ArrayList playlists = new ArrayList<>(); + PlaylistLoader.getAllPlaylists(context) + .subscribe(playlists1 -> { + if (playlists1.size() > 0) { + for (Playlist playlist : playlists1) { + PlaylistSongsLoader.getPlaylistSongList(context, playlist) + .subscribe(songs -> { + if (songs.size() > 0) { + playlists.add(playlist); + } + }); + } + } + }); + return Observable.just(playlists); + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Home.java b/app/src/main/java/code/name/monkey/retromusic/model/Home.java index 0004c32d5..5f3ff6311 100755 --- a/app/src/main/java/code/name/monkey/retromusic/model/Home.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/Home.java @@ -1,6 +1,6 @@ package code.name.monkey.retromusic.model; -import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist; +import android.support.annotation.StringRes; import java.util.ArrayList; @@ -10,41 +10,20 @@ import java.util.ArrayList; */ public class Home { - public String sectionTitle; - public ArrayList list; - public AbsSmartPlaylist playlist; - public Home(String sectionTitle, AbsSmartPlaylist playlist) { - this.sectionTitle = sectionTitle; - this.playlist = playlist; - } + private int sectionTitle; + private ArrayList list; - public Home(String sectionTitle, ArrayList list) { + public Home(@StringRes int sectionTitle, ArrayList list) { this.sectionTitle = sectionTitle; this.list = list; } - public Home(AbsSmartPlaylist playlist) { - this.playlist = playlist; - } - - public AbsSmartPlaylist getPlaylist() { - return playlist; - } - - @Override - public String toString() { - return "Home{" + - "sectionTitle='" + sectionTitle + '\'' + - ", songs=" + list + - '}'; - } - - public String getSectionTitle() { + public int getSectionTitle() { return sectionTitle; } - public ArrayList getList() { + public ArrayList getList() { return list; } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.java b/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.java index 892b0d578..59686c6bb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.java +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.java @@ -1,15 +1,14 @@ package code.name.monkey.retromusic.mvp.contract; +import java.util.ArrayList; + import code.name.monkey.retromusic.model.Album; import code.name.monkey.retromusic.model.Artist; import code.name.monkey.retromusic.model.Genre; import code.name.monkey.retromusic.model.Playlist; -import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist; import code.name.monkey.retromusic.mvp.BasePresenter; import code.name.monkey.retromusic.mvp.BaseView; -import java.util.ArrayList; - public interface HomeContract { interface HomeView extends BaseView> { @@ -41,4 +40,4 @@ public interface HomeContract { void loadGenres(); } -} +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.java b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.java index 1baa7247c..8f6692dfb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.java +++ b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.java @@ -2,12 +2,11 @@ package code.name.monkey.retromusic.providers; import android.content.Context; -import code.name.monkey.retromusic.RetroApplication; -import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist; import java.io.File; import java.util.ArrayList; import code.name.monkey.retromusic.Injection; +import code.name.monkey.retromusic.RetroApplication; import code.name.monkey.retromusic.loaders.AlbumLoader; import code.name.monkey.retromusic.loaders.ArtistLoader; import code.name.monkey.retromusic.loaders.GenreLoader; @@ -23,6 +22,7 @@ import code.name.monkey.retromusic.model.Artist; import code.name.monkey.retromusic.model.Genre; import code.name.monkey.retromusic.model.Playlist; import code.name.monkey.retromusic.model.Song; +import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist; import code.name.monkey.retromusic.providers.interfaces.Repository; import code.name.monkey.retromusic.rest.model.KuGouRawLyric; import code.name.monkey.retromusic.rest.model.KuGouSearchLyricResult; @@ -39,7 +39,7 @@ public class RepositoryImpl implements Repository { this.context = context; } - public static synchronized RepositoryImpl getInstance( ) { + public static synchronized RepositoryImpl getInstance() { if (INSTANCE == null) { INSTANCE = new RepositoryImpl(RetroApplication.getInstance()); } diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.java b/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.java index 11d3d7d40..0c15edd0e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.java +++ b/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.java @@ -16,45 +16,45 @@ import java.util.ArrayList; public interface Repository { - Observable> getAllSongs(); + Observable> getAllSongs(); - Observable> getSuggestionSongs(); + Observable> getSuggestionSongs(); - Observable getSong(int id); + Observable getSong(int id); - Observable> getAllAlbums(); + Observable> getAllAlbums(); - Observable> getRecentAlbums(); + Observable> getRecentAlbums(); - Observable> getTopAlbums(); + Observable> getTopAlbums(); - Observable getAlbum(int albumId); + Observable getAlbum(int albumId); - Observable> getAllArtists(); + Observable> getAllArtists(); - Observable> getRecentArtists(); + Observable> getRecentArtists(); - Observable> getTopArtists(); + Observable> getTopArtists(); - Observable getArtistById(long artistId); + Observable getArtistById(long artistId); - Observable> getAllPlaylists(); + Observable> getAllPlaylists(); - Observable> getFavoriteSongs(); + Observable> getFavoriteSongs(); - Observable> search(String query); + Observable> search(String query); - Observable> getPlaylistSongs(Playlist playlist); + Observable> getPlaylistSongs(Playlist playlist); - Observable> getHomeList(); + Observable> getHomeList(); - Observable> getAllThings(); + Observable> getAllThings(); - Observable> getAllGenres(); + Observable> getAllGenres(); - Observable> getGenre(int genreId); + Observable> getGenre(int genreId); - Observable downloadLrcFile(final String title, final String artist, final long duration); + Observable downloadLrcFile(final String title, final String artist, final long duration); -} +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/AboutActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/AboutActivity.java index b276b2b99..06433dca6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/AboutActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/AboutActivity.java @@ -5,7 +5,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.v4.app.ShareCompat; import android.support.v7.widget.Toolbar; import android.view.MenuItem; @@ -40,11 +39,16 @@ public class AboutActivity extends AbsBaseActivity { @BindView(R.id.toolbar) Toolbar toolbar; + @BindView(R.id.app_bar) View background; + @BindView(R.id.app_version) TextView appVersion; + @BindView(R.id.title) + TextView title; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -62,7 +66,7 @@ public class AboutActivity extends AbsBaseActivity { } @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { + public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onBackPressed(); return true; @@ -71,13 +75,13 @@ public class AboutActivity extends AbsBaseActivity { } private void setUpToolbar() { - + title.setTextColor(ThemeStore.textColorPrimary(this)); int primaryColor = ThemeStore.primaryColor(this); toolbar.setBackgroundColor(primaryColor); + toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + toolbar.setNavigationOnClickListener(v -> onBackPressed()); setTitle(null); setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @@ -91,7 +95,7 @@ public class AboutActivity extends AbsBaseActivity { @OnClick({R.id.app_github, R.id.faq_link, R.id.app_google_plus, R.id.app_translation, R.id.app_rate, R.id.app_share, R.id.instagram_link, R.id.twitter_link, R.id.changelog, - R.id.open_source, R.id.discord_link, R.id.telegram_link}) + R.id.open_source, R.id.discord_link, R.id.telegram_link, R.id.donate_link}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.faq_link: diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.java index 58b57d373..63beec867 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.java @@ -86,9 +86,6 @@ public class AlbumDetailsActivity extends AbsSlidingMusicPanelActivity implement @BindView(R.id.app_bar) @Nullable AppBarLayout appBarLayout; - @BindView(R.id.image_container) - @Nullable - View imageContainer; @BindView(R.id.content) View contentContainer; @BindView(R.id.toolbar) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.java index fed141f63..f57d5fa1c 100755 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.java @@ -25,6 +25,12 @@ import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; + +import com.bumptech.glide.Glide; + +import java.util.ArrayList; +import java.util.Locale; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @@ -54,372 +60,370 @@ import code.name.monkey.retromusic.util.DensityUtil; import code.name.monkey.retromusic.util.MusicUtil; import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.RetroUtil; -import com.bumptech.glide.Glide; -import java.util.ArrayList; -import java.util.Locale; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements - ArtistDetailContract.ArtistsDetailsView { + ArtistDetailContract.ArtistsDetailsView { - public static final String EXTRA_ARTIST_ID = "extra_artist_id"; - private static final int REQUEST_CODE_SELECT_IMAGE = 9003; - @BindView(R.id.image) - ImageView image; - @BindView(R.id.biography) - TextView biographyTextView; - @BindView(R.id.recycler_view) - RecyclerView recyclerView; - @BindView(R.id.album_recycler_view) - RecyclerView albumRecyclerView; - @BindView(R.id.album_title) - AppCompatTextView albumTitle; - @BindView(R.id.song_title) - AppCompatTextView songTitle; - @BindView(R.id.biography_title) - AppCompatTextView biographyTitle; - @BindView(R.id.title) - TextView title; - @BindView(R.id.text) - TextView text; - @BindView(R.id.action_shuffle_all) - FloatingActionButton shuffleButton; - @BindView(R.id.collapsing_toolbar) - @Nullable - CollapsingToolbarLayout collapsingToolbarLayout; - @BindView(R.id.app_bar) - @Nullable - AppBarLayout appBarLayout; - @BindView(R.id.gradient_background) - @Nullable - View background; - @BindView(R.id.image_container) - @Nullable - View imageContainer; - @BindView(R.id.content) - View contentContainer; - @BindView(R.id.toolbar) - Toolbar toolbar; - @Nullable - private Spanned biography; - private Artist artist; - private LastFMRestClient lastFMRestClient; - private ArtistDetailsPresenter artistDetailsPresenter; - private SimpleSongAdapter songAdapter; - private AlbumAdapter albumAdapter; - private boolean forceDownload; + public static final String EXTRA_ARTIST_ID = "extra_artist_id"; + private static final int REQUEST_CODE_SELECT_IMAGE = 9003; + @BindView(R.id.app_bar) + @Nullable + AppBarLayout appBarLayout; + @BindView(R.id.collapsing_toolbar) + @Nullable + CollapsingToolbarLayout collapsingToolbarLayout; - @Override - protected View createContentView() { - return wrapSlidingMusicPanel(R.layout.activity_artist_details); - } + @BindView(R.id.image) + ImageView image; + @BindView(R.id.biography) + TextView biographyTextView; + @BindView(R.id.recycler_view) + RecyclerView recyclerView; + @BindView(R.id.album_recycler_view) + RecyclerView albumRecyclerView; + @BindView(R.id.album_title) + AppCompatTextView albumTitle; + @BindView(R.id.song_title) + AppCompatTextView songTitle; + @BindView(R.id.biography_title) + AppCompatTextView biographyTitle; + @BindView(R.id.title) + TextView title; + @BindView(R.id.text) + TextView text; + @BindView(R.id.action_shuffle_all) + FloatingActionButton shuffleButton; + @BindView(R.id.gradient_background) + @Nullable + View background; + @BindView(R.id.image_container) + @Nullable + View imageContainer; + @BindView(R.id.content) + View contentContainer; + @BindView(R.id.toolbar) + Toolbar toolbar; + @Nullable + private Spanned biography; + private Artist artist; + private LastFMRestClient lastFMRestClient; + private ArtistDetailsPresenter artistDetailsPresenter; + private SimpleSongAdapter songAdapter; + private AlbumAdapter albumAdapter; + private boolean forceDownload; - @Override - protected void onCreate(Bundle bundle) { - setDrawUnderStatusBar(true); - super.onCreate(bundle); - ButterKnife.bind(this); - - supportPostponeEnterTransition(); - setBottomBarVisibility(View.GONE); - setNavigationbarColorAuto(); - setLightNavigationBar(true); - - lastFMRestClient = new LastFMRestClient(this); - - setUpViews(); - - int artistID = getIntent().getIntExtra(EXTRA_ARTIST_ID, -1); - artistDetailsPresenter = new ArtistDetailsPresenter(this, artistID); - } - - private void setUpViews() { - setupRecyclerView(); - setupToolbar(); - setupContainerHeight(); - } - - private void setupContainerHeight() { - if (imageContainer != null) { - LayoutParams params = imageContainer.getLayoutParams(); - params.width = DensityUtil.getScreenHeight(this) / 2; - imageContainer.setLayoutParams(params); - } - } - - private void setupToolbar() { - toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); - setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setTitle(null); - - if (toolbar != null && !PreferenceUtil.getInstance(this).getFullScreenMode()) { - ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar - .getLayoutParams(); - params.topMargin = RetroUtil.getStatusBarHeight(this); - toolbar.setLayoutParams(params); + @Override + protected View createContentView() { + return wrapSlidingMusicPanel(R.layout.activity_artist_details); } - int primaryColor = ThemeStore.primaryColor(this); - TintHelper.setTintAuto(contentContainer, primaryColor, true); + @Override + protected void onCreate(Bundle bundle) { + setDrawUnderStatusBar(true); + super.onCreate(bundle); + ButterKnife.bind(this); - if (appBarLayout != null) { - appBarLayout.setBackgroundColor(primaryColor); - appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { - @Override - public void onStateChanged(AppBarLayout appBarLayout, - AppBarStateChangeListener.State state) { - int color; - switch (state) { - case COLLAPSED: - setLightStatusbar(!ATHUtil.isWindowBackgroundDark(ArtistDetailActivity.this)); - color = ATHUtil.resolveColor(ArtistDetailActivity.this, R.attr.iconColor); - break; + supportPostponeEnterTransition(); + setBottomBarVisibility(View.GONE); + setNavigationbarColorAuto(); + setLightNavigationBar(true); + + lastFMRestClient = new LastFMRestClient(this); + + setUpViews(); + + int artistID = getIntent().getIntExtra(EXTRA_ARTIST_ID, -1); + artistDetailsPresenter = new ArtistDetailsPresenter(this, artistID); + } + + private void setUpViews() { + setupRecyclerView(); + setupToolbar(); + setupContainerHeight(); + } + + private void setupContainerHeight() { + if (imageContainer != null) { + LayoutParams params = imageContainer.getLayoutParams(); + params.width = DensityUtil.getScreenHeight(this) / 2; + imageContainer.setLayoutParams(params); + } + } + + private void setupToolbar() { + toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + setSupportActionBar(toolbar); + //noinspection ConstantConditions + getSupportActionBar().setTitle(null); + + if (toolbar != null && !PreferenceUtil.getInstance(this).getFullScreenMode()) { + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar + .getLayoutParams(); + params.topMargin = RetroUtil.getStatusBarHeight(this); + toolbar.setLayoutParams(params); + } + + int primaryColor = ThemeStore.primaryColor(this); + TintHelper.setTintAuto(contentContainer, primaryColor, true); + + if (appBarLayout != null) { + appBarLayout.setBackgroundColor(primaryColor); + appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { + @Override + public void onStateChanged(AppBarLayout appBarLayout, + AppBarStateChangeListener.State state) { + int color; + switch (state) { + case COLLAPSED: + setLightStatusbar(!ATHUtil.isWindowBackgroundDark(ArtistDetailActivity.this)); + color = ATHUtil.resolveColor(ArtistDetailActivity.this, R.attr.iconColor); + break; + default: + case EXPANDED: + case IDLE: + setLightStatusbar(false); + color = ContextCompat.getColor(ArtistDetailActivity.this, R.color.md_white_1000); + break; + } + ToolbarContentTintHelper.colorizeToolbar(toolbar, color, ArtistDetailActivity.this); + } + }); + } + if (collapsingToolbarLayout != null) { + collapsingToolbarLayout.setContentScrimColor(primaryColor); + collapsingToolbarLayout.setStatusBarScrimColor(ColorUtil.darkenColor(primaryColor)); + } + } + + private void setupRecyclerView() { + albumAdapter = new HorizontalAlbumAdapter(this, new ArrayList<>(), false, null); + albumRecyclerView.setItemAnimator(new DefaultItemAnimator()); + albumRecyclerView + .setLayoutManager(new GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false)); + albumRecyclerView.setAdapter(albumAdapter); + + songAdapter = new SimpleSongAdapter(this, new ArrayList<>(), R.layout.item_song); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(songAdapter); + } + + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case REQUEST_CODE_SELECT_IMAGE: + if (resultCode == RESULT_OK) { + CustomArtistImageUtil.getInstance(this).setCustomArtistImage(artist, data.getData()); + } + break; default: - case EXPANDED: - case IDLE: - setLightStatusbar(false); - color = ContextCompat.getColor(ArtistDetailActivity.this, R.color.md_white_1000); - break; - } - ToolbarContentTintHelper.colorizeToolbar(toolbar, color, ArtistDetailActivity.this); + if (resultCode == RESULT_OK) { + reload(); + } + break; } - }); } - if (collapsingToolbarLayout != null) { - collapsingToolbarLayout.setContentScrimColor(primaryColor); - collapsingToolbarLayout.setStatusBarScrimColor(ColorUtil.darkenColor(primaryColor)); + + @Override + protected void onResume() { + super.onResume(); + artistDetailsPresenter.subscribe(); } - } - private void setupRecyclerView() { - albumAdapter = new HorizontalAlbumAdapter(this, new ArrayList<>(), false, null); - albumRecyclerView.setItemAnimator(new DefaultItemAnimator()); - albumRecyclerView - .setLayoutManager(new GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false)); - albumRecyclerView.setAdapter(albumAdapter); + @Override + protected void onPause() { + super.onPause(); + artistDetailsPresenter.unsubscribe(); + } - songAdapter = new SimpleSongAdapter(this, new ArrayList<>(), R.layout.item_song); - recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setLayoutManager(new LinearLayoutManager(this)); - recyclerView.setAdapter(songAdapter); - } + @Override + public void loading() { + } + @Override + public void showEmptyView() { - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case REQUEST_CODE_SELECT_IMAGE: - if (resultCode == RESULT_OK) { - CustomArtistImageUtil.getInstance(this).setCustomArtistImage(artist, data.getData()); + } + + @Override + public void completed() { + supportStartPostponedEnterTransition(); + } + + @Override + public void showData(Artist artist) { + setArtist(artist); + } + + private Artist getArtist() { + if (artist == null) { + artist = new Artist(); } - break; - default: - if (resultCode == RESULT_OK) { - reload(); + return artist; + } + + private void setArtist(Artist artist) { + if (artist.getSongCount() <= 0) { + finish(); } - break; + this.artist = artist; + loadArtistImage(); + + if (RetroUtil.isAllowedToDownloadMetadata(this)) { + loadBiography(); + } + title.setText(artist.getName()); + text.setText(String.format("%s • %s", MusicUtil.getArtistInfoString(this, artist), MusicUtil + .getReadableDurationString(MusicUtil.getTotalDuration(this, artist.getSongs())))); + + songAdapter.swapDataSet(artist.getSongs()); + albumAdapter.swapDataSet(artist.albums); } - } - @Override - protected void onResume() { - super.onResume(); - artistDetailsPresenter.subscribe(); - } - - @Override - protected void onPause() { - super.onPause(); - artistDetailsPresenter.unsubscribe(); - } - - @Override - public void loading() { - } - - @Override - public void showEmptyView() { - - } - - @Override - public void completed() { - supportStartPostponedEnterTransition(); - } - - @Override - public void showData(Artist artist) { - setArtist(artist); - } - - private Artist getArtist() { - if (artist == null) { - artist = new Artist(); + private void loadBiography() { + loadBiography(Locale.getDefault().getLanguage()); } - return artist; - } - private void setArtist(Artist artist) { - if (artist.getSongCount() <= 0) { - finish(); + private void loadBiography(@Nullable final String lang) { + biography = null; + + lastFMRestClient.getApiService() + .getArtistInfo(getArtist().getName(), lang, null) + .enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, + @NonNull Response response) { + final LastFmArtist lastFmArtist = response.body(); + if (lastFmArtist != null && lastFmArtist.getArtist() != null) { + final String bioContent = lastFmArtist.getArtist().getBio().getContent(); + if (bioContent != null && !bioContent.trim().isEmpty()) { + //TransitionManager.beginDelayedTransition(titleContainer); + biographyTextView.setVisibility(View.VISIBLE); + biographyTitle.setVisibility(View.VISIBLE); + biography = Html.fromHtml(bioContent); + biographyTextView.setText(biography); + } + } + + // If the "lang" parameter is set and no biography is given, retry with default language + if (biography == null && lang != null) { + loadBiography(null); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + t.printStackTrace(); + biography = null; + } + }); } - this.artist = artist; - loadArtistImage(); - if (RetroUtil.isAllowedToDownloadMetadata(this)) { - loadBiography(); + @OnClick(R.id.biography) + void toggleArtistBiography() { + if (biographyTextView.getMaxLines() == 4) { + biographyTextView.setMaxLines(Integer.MAX_VALUE); + } else { + biographyTextView.setMaxLines(4); + } } - title.setText(artist.getName()); - text.setText(String.format("%s • %s", MusicUtil.getArtistInfoString(this, artist), MusicUtil - .getReadableDurationString(MusicUtil.getTotalDuration(this, artist.getSongs())))); - songAdapter.swapDataSet(artist.getSongs()); - albumAdapter.swapDataSet(artist.albums); - } - - private void loadBiography() { - loadBiography(Locale.getDefault().getLanguage()); - } - - private void loadBiography(@Nullable final String lang) { - biography = null; - - lastFMRestClient.getApiService() - .getArtistInfo(getArtist().getName(), lang, null) - .enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, - @NonNull Response response) { - final LastFmArtist lastFmArtist = response.body(); - if (lastFmArtist != null && lastFmArtist.getArtist() != null) { - final String bioContent = lastFmArtist.getArtist().getBio().getContent(); - if (bioContent != null && !bioContent.trim().isEmpty()) { - //TransitionManager.beginDelayedTransition(titleContainer); - biographyTextView.setVisibility(View.VISIBLE); - biographyTitle.setVisibility(View.VISIBLE); - biography = Html.fromHtml(bioContent); - biographyTextView.setText(biography); - } - } - - // If the "lang" parameter is set and no biography is given, retry with default language - if (biography == null && lang != null) { - loadBiography(null); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - t.printStackTrace(); - biography = null; - } - }); - } - - @OnClick(R.id.biography) - void toggleArtistBiography() { - if (biographyTextView.getMaxLines() == 4) { - biographyTextView.setMaxLines(Integer.MAX_VALUE); - } else { - biographyTextView.setMaxLines(4); + private void loadArtistImage() { + ArtistGlideRequest.Builder.from(Glide.with(this), artist) + .forceDownload(forceDownload) + .generatePalette(this).build() + .dontAnimate() + .into(new RetroMusicColoredTarget(image) { + @Override + public void onColorReady(int color) { + setColors(color); + } + }); + forceDownload = false; } - } - private void loadArtistImage() { - ArtistGlideRequest.Builder.from(Glide.with(this), artist) - .forceDownload(forceDownload) - .generatePalette(this).build() - .dontAnimate() - .into(new RetroMusicColoredTarget(image) { - @Override - public void onColorReady(int color) { - setColors(color); - } - }); - forceDownload = false; - } + private void setColors(int color) { - private void setColors(int color) { + int textColor = + PreferenceUtil.getInstance(this).getAdaptiveColor() ? color : ThemeStore.accentColor(this); - int textColor = - PreferenceUtil.getInstance(this).getAdaptiveColor() ? color : ThemeStore.accentColor(this); + albumTitle.setTextColor(textColor); + songTitle.setTextColor(textColor); + biographyTitle.setTextColor(textColor); - albumTitle.setTextColor(textColor); - songTitle.setTextColor(textColor); - biographyTitle.setTextColor(textColor); + TintHelper.setTintAuto(shuffleButton, textColor, true); - TintHelper.setTintAuto(shuffleButton, textColor, true); - - if (background != null) { - background.setBackgroundTintList(ColorStateList.valueOf(color)); + if (background != null) { + background.setBackgroundTintList(ColorStateList.valueOf(color)); + } + findViewById(R.id.root).setBackgroundColor(ThemeStore.primaryColor(this)); } - findViewById(R.id.root).setBackgroundColor(ThemeStore.primaryColor(this)); - } - @OnClick({R.id.action_shuffle_all}) - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.action_shuffle_all: - MusicPlayerRemote.openAndShuffleQueue(getArtist().getSongs(), true); - break; + @OnClick({R.id.action_shuffle_all}) + public void onViewClicked(View view) { + switch (view.getId()) { + case R.id.action_shuffle_all: + MusicPlayerRemote.openAndShuffleQueue(getArtist().getSongs(), true); + break; + } } - } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - return handleSortOrderMenuItem(item); - } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return handleSortOrderMenuItem(item); + } - private boolean handleSortOrderMenuItem(@NonNull MenuItem item) { - final ArrayList songs = getArtist().getSongs(); - switch (item.getItemId()) { - case android.R.id.home: - super.onBackPressed(); - return true; - case R.id.action_play_next: - MusicPlayerRemote.playNext(songs); - return true; - case R.id.action_add_to_current_playing: - MusicPlayerRemote.enqueue(songs); - return true; - case R.id.action_add_to_playlist: - AddToPlaylistDialog.create(songs).show(getSupportFragmentManager(), "ADD_PLAYLIST"); - return true; - case R.id.action_set_artist_image: - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("image/*"); - startActivityForResult( - Intent.createChooser(intent, getString(R.string.pick_from_local_storage)), - REQUEST_CODE_SELECT_IMAGE); - return true; - case R.id.action_reset_artist_image: - Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), - Toast.LENGTH_SHORT).show(); - CustomArtistImageUtil.getInstance(ArtistDetailActivity.this).resetCustomArtistImage(artist); - forceDownload = true; + private boolean handleSortOrderMenuItem(@NonNull MenuItem item) { + final ArrayList songs = getArtist().getSongs(); + switch (item.getItemId()) { + case android.R.id.home: + super.onBackPressed(); + return true; + case R.id.action_play_next: + MusicPlayerRemote.playNext(songs); + return true; + case R.id.action_add_to_current_playing: + MusicPlayerRemote.enqueue(songs); + return true; + case R.id.action_add_to_playlist: + AddToPlaylistDialog.create(songs).show(getSupportFragmentManager(), "ADD_PLAYLIST"); + return true; + case R.id.action_set_artist_image: + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.setType("image/*"); + startActivityForResult( + Intent.createChooser(intent, getString(R.string.pick_from_local_storage)), + REQUEST_CODE_SELECT_IMAGE); + return true; + case R.id.action_reset_artist_image: + Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), + Toast.LENGTH_SHORT).show(); + CustomArtistImageUtil.getInstance(ArtistDetailActivity.this).resetCustomArtistImage(artist); + forceDownload = true; + return true; + } return true; } - return true; - } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.menu_artist_detail, menu); - return super.onCreateOptionsMenu(menu); - } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_artist_detail, menu); + return super.onCreateOptionsMenu(menu); + } - @Override - public void onMediaStoreChanged() { - super.onMediaStoreChanged(); - reload(); - } + @Override + public void onMediaStoreChanged() { + super.onMediaStoreChanged(); + reload(); + } - private void reload() { - artistDetailsPresenter.unsubscribe(); - artistDetailsPresenter.subscribe(); - } + private void reload() { + artistDetailsPresenter.unsubscribe(); + artistDetailsPresenter.subscribe(); + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/EqualizerActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/EqualizerActivity.java index 83e1d19dc..9a26b8df5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/EqualizerActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/EqualizerActivity.java @@ -15,6 +15,7 @@ import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; + import butterknife.BindView; import butterknife.ButterKnife; import code.name.monkey.appthemehelper.ThemeStore; @@ -27,197 +28,205 @@ import code.name.monkey.retromusic.ui.activities.base.AbsMusicServiceActivity; */ public class EqualizerActivity extends AbsMusicServiceActivity implements - AdapterView.OnItemSelectedListener { + AdapterView.OnItemSelectedListener { - @BindView(R.id.equalizer) - SwitchCompat mEnable; - @BindView(R.id.content) - LinearLayout mContent; - @BindView(R.id.bands) - LinearLayout mLinearLayout; + @BindView(R.id.equalizer) + SwitchCompat mEnable; - @BindView(R.id.bass_boost_strength) - SeekBar mBassBoostStrength; - @BindView(R.id.virtualizer_strength) - SeekBar mVirtualizerStrength; + @BindView(R.id.content) + LinearLayout mContent; - @BindView(R.id.bass_boost) - TextView mBassBoost; - @BindView(R.id.virtualizer) - TextView mVirtualizer; + @BindView(R.id.bands) + LinearLayout mLinearLayout; - @BindView(R.id.toolbar) - Toolbar mToolbar; - @BindView(R.id.app_bar) - AppBarLayout mAppBar; - @BindView(R.id.presets) - Spinner mPresets; + @BindView(R.id.bass_boost_strength) + SeekBar mBassBoostStrength; - private CompoundButton.OnCheckedChangeListener mListener = (buttonView, isChecked) -> { - switch (buttonView.getId()) { - case R.id.equalizer: - EqualizerHelper.getInstance().getEqualizer().setEnabled(isChecked); - TransitionManager.beginDelayedTransition(mContent); - mContent.setVisibility(isChecked ? View.VISIBLE : View.GONE); - break; - } - }; - private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (fromUser) { - if (seekBar == mBassBoostStrength) { - mBassBoost.setEnabled(progress > 0); - EqualizerHelper.getInstance().setBassBoostStrength(progress); - EqualizerHelper.getInstance().setBassBoostEnabled(progress > 0); - } else if (seekBar == mVirtualizerStrength) { - mVirtualizer.setEnabled(progress > 0); - EqualizerHelper.getInstance().setVirtualizerEnabled(progress > 0); - EqualizerHelper.getInstance().setVirtualizerStrength(progress); + @BindView(R.id.virtualizer_strength) + SeekBar mVirtualizerStrength; + + @BindView(R.id.bass_boost) + TextView mBassBoost; + + @BindView(R.id.virtualizer) + TextView mVirtualizer; + + @BindView(R.id.toolbar) + Toolbar mToolbar; + + @BindView(R.id.app_bar) + AppBarLayout mAppBar; + + @BindView(R.id.presets) + Spinner mPresets; + + @BindView(R.id.title) + TextView mTitle; + + private CompoundButton.OnCheckedChangeListener mListener = (buttonView, isChecked) -> { + switch (buttonView.getId()) { + case R.id.equalizer: + EqualizerHelper.getInstance().getEqualizer().setEnabled(isChecked); + TransitionManager.beginDelayedTransition(mContent); + mContent.setVisibility(isChecked ? View.VISIBLE : View.GONE); + break; } - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - - } - }; - private ArrayAdapter mPresetsNamesAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_equalizer); - ButterKnife.bind(this); - - setStatusbarColorAuto(); - setNavigationbarColorAuto(); - setTaskDescriptionColorAuto(); - setLightNavigationBar(true); - - int primaryColor = ThemeStore.primaryColor(this); - mToolbar.setBackgroundColor(primaryColor); - mAppBar.setBackgroundColor(primaryColor); - mToolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onBackPressed(); - } - }); - mToolbar.setTitle(R.string.equalizer); - setSupportActionBar(mToolbar); - //noinspection ConstantConditions - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - mEnable.setChecked(EqualizerHelper.getInstance().getEqualizer().getEnabled()); - mEnable.setOnCheckedChangeListener(mListener); - - mPresetsNamesAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1); - mPresets.setAdapter(mPresetsNamesAdapter); - mPresets.setOnItemSelectedListener(this); - - mBassBoostStrength.setProgress(EqualizerHelper.getInstance().getBassBoostStrength()); - mBassBoostStrength.setOnSeekBarChangeListener(mSeekBarChangeListener); - - mVirtualizerStrength.setProgress(EqualizerHelper.getInstance().getVirtualizerStrength()); - mVirtualizerStrength.setOnSeekBarChangeListener(mSeekBarChangeListener); - - setupUI(); - addPresets(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - } - return super.onOptionsItemSelected(item); - - } - - private void addPresets() { - mPresetsNamesAdapter.clear(); - mPresetsNamesAdapter.add("Custom"); - for (int j = 0; j < EqualizerHelper.getInstance().getEqualizer().getNumberOfPresets(); j++) { - mPresetsNamesAdapter - .add(EqualizerHelper.getInstance().getEqualizer().getPresetName((short) j)); - mPresetsNamesAdapter.notifyDataSetChanged(); - } - mPresets - .setSelection((int) EqualizerHelper.getInstance().getEqualizer().getCurrentPreset() + 1); - } - - private void setupUI() { - mLinearLayout.removeAllViews(); - short bands; - try { - // get number of supported bands - bands = (short) EqualizerHelper.getInstance().getNumberOfBands(); - - // for each of the supported bands, we will set up a slider from -10dB to 10dB boost/attenuation, - // as well as text labels to assist the user - for (short i = 0; i < bands; i++) { - final short band = i; - - View view = LayoutInflater.from(this).inflate(R.layout.retro_seekbar, mLinearLayout, false); - TextView freqTextView = view.findViewById(R.id.hurtz); - freqTextView.setText( - String.format("%d Hz", EqualizerHelper.getInstance().getCenterFreq((int) band) / 1000)); - - TextView minDbTextView = view.findViewById(R.id.minus_db); - minDbTextView - .setText(String.format("%d dB", EqualizerHelper.getInstance().getBandLevelLow() / 100)); - - TextView maxDbTextView = view.findViewById(R.id.plus_db); - maxDbTextView.setText( - String.format("%d dB", EqualizerHelper.getInstance().getBandLevelHigh() / 100)); - - SeekBar bar = view.findViewById(R.id.seekbar); - bar.setMax(EqualizerHelper.getInstance().getBandLevelHigh() - EqualizerHelper.getInstance() - .getBandLevelLow()); - bar.setProgress( - EqualizerHelper.getInstance().getBandLevel((int) band) - EqualizerHelper.getInstance() - .getBandLevelLow()); - bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - EqualizerHelper.getInstance().setBandLevel((int) band, - (int) (progress + EqualizerHelper.getInstance().getBandLevelLow())); + }; + private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { - mPresets.setSelection(0); + if (seekBar == mBassBoostStrength) { + mBassBoost.setEnabled(progress > 0); + EqualizerHelper.getInstance().setBassBoostStrength(progress); + EqualizerHelper.getInstance().setBassBoostEnabled(progress > 0); + } else if (seekBar == mVirtualizerStrength) { + mVirtualizer.setEnabled(progress > 0); + EqualizerHelper.getInstance().setVirtualizerEnabled(progress > 0); + EqualizerHelper.getInstance().setVirtualizerStrength(progress); + } } - } + } - public void onStartTrackingTouch(SeekBar seekBar) { - } + @Override + public void onStartTrackingTouch(SeekBar seekBar) { - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); + } - mLinearLayout.addView(view); - } - } catch (Exception e) { - e.printStackTrace(); + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }; + private ArrayAdapter mPresetsNamesAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_equalizer); + ButterKnife.bind(this); + + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + setLightNavigationBar(true); + + setupToolbar(); + + mEnable.setChecked(EqualizerHelper.getInstance().getEqualizer().getEnabled()); + mEnable.setOnCheckedChangeListener(mListener); + + mPresetsNamesAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1); + mPresets.setAdapter(mPresetsNamesAdapter); + mPresets.setOnItemSelectedListener(this); + + mBassBoostStrength.setProgress(EqualizerHelper.getInstance().getBassBoostStrength()); + mBassBoostStrength.setOnSeekBarChangeListener(mSeekBarChangeListener); + + mVirtualizerStrength.setProgress(EqualizerHelper.getInstance().getVirtualizerStrength()); + mVirtualizerStrength.setOnSeekBarChangeListener(mSeekBarChangeListener); + + setupUI(); + addPresets(); } - } - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (position == 0) { - return; + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); } - EqualizerHelper.getInstance().getEqualizer().usePreset((short) (position - 1)); - setupUI(); - } - @Override - public void onNothingSelected(AdapterView parent) { + private void setupToolbar() { + mTitle.setTextColor(ThemeStore.textColorPrimary(this)); + int primaryColor = ThemeStore.primaryColor(this); + mToolbar.setBackgroundColor(primaryColor); + mAppBar.setBackgroundColor(primaryColor); + mToolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + mToolbar.setNavigationOnClickListener(v -> onBackPressed()); + setSupportActionBar(mToolbar); + setTitle(null); + } - } + private void addPresets() { + mPresetsNamesAdapter.clear(); + mPresetsNamesAdapter.add("Custom"); + for (int j = 0; j < EqualizerHelper.getInstance().getEqualizer().getNumberOfPresets(); j++) { + mPresetsNamesAdapter + .add(EqualizerHelper.getInstance().getEqualizer().getPresetName((short) j)); + mPresetsNamesAdapter.notifyDataSetChanged(); + } + mPresets + .setSelection((int) EqualizerHelper.getInstance().getEqualizer().getCurrentPreset() + 1); + } + + private void setupUI() { + mLinearLayout.removeAllViews(); + short bands; + try { + // get number of supported bands + bands = (short) EqualizerHelper.getInstance().getNumberOfBands(); + + // for each of the supported bands, we will set up a slider from -10dB to 10dB boost/attenuation, + // as well as text labels to assist the user + for (short i = 0; i < bands; i++) { + final short band = i; + + View view = LayoutInflater.from(this).inflate(R.layout.retro_seekbar, mLinearLayout, false); + TextView freqTextView = view.findViewById(R.id.hurtz); + freqTextView.setText( + String.format("%d Hz", EqualizerHelper.getInstance().getCenterFreq((int) band) / 1000)); + + TextView minDbTextView = view.findViewById(R.id.minus_db); + minDbTextView + .setText(String.format("%d dB", EqualizerHelper.getInstance().getBandLevelLow() / 100)); + + TextView maxDbTextView = view.findViewById(R.id.plus_db); + maxDbTextView.setText( + String.format("%d dB", EqualizerHelper.getInstance().getBandLevelHigh() / 100)); + + SeekBar bar = view.findViewById(R.id.seekbar); + bar.setMax(EqualizerHelper.getInstance().getBandLevelHigh() - EqualizerHelper.getInstance() + .getBandLevelLow()); + bar.setProgress( + EqualizerHelper.getInstance().getBandLevel((int) band) - EqualizerHelper.getInstance() + .getBandLevelLow()); + bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + EqualizerHelper.getInstance().setBandLevel((int) band, + (int) (progress + EqualizerHelper.getInstance().getBandLevelLow())); + if (fromUser) { + mPresets.setSelection(0); + } + } + + public void onStartTrackingTouch(SeekBar seekBar) { + } + + public void onStopTrackingTouch(SeekBar seekBar) { + } + }); + + mLinearLayout.addView(view); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position == 0) { + return; + } + EqualizerHelper.getInstance().getEqualizer().usePreset((short) (position - 1)); + setupUI(); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/GenreDetailsActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/GenreDetailsActivity.java index b72bfc56f..e246bf65a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/GenreDetailsActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/GenreDetailsActivity.java @@ -3,7 +3,6 @@ package code.name.monkey.retromusic.ui.activities; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; @@ -18,7 +17,6 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.afollestad.materialcab.MaterialCab; -import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import java.util.ArrayList; @@ -39,6 +37,7 @@ import code.name.monkey.retromusic.model.Genre; import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.mvp.contract.GenreDetailsContract; import code.name.monkey.retromusic.mvp.presenter.GenreDetailsPresenter; +import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity; import code.name.monkey.retromusic.ui.adapter.song.SongAdapter; import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.RetroUtil; @@ -72,8 +71,8 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement @BindView(R.id.app_bar) AppBarLayout appBarLayout; - @BindView(R.id.collapsing_toolbar) - CollapsingToolbarLayout toolbarLayout; + @BindView(R.id.title) + TextView title; private Genre genre; private GenreDetailsPresenter presenter; @@ -99,8 +98,7 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement setBottomBarVisibility(View.GONE); - RetroUtil.statusBarHeight(statusBar); - + RetroUtil.statusBarHeight(statusBar); genre = getIntent().getParcelableExtra(EXTRA_GENRE_ID); presenter = new GenreDetailsPresenter(this, genre.id); @@ -119,14 +117,14 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement } private void setUpToolBar() { + title.setText(genre.name); + title.setTextColor(ThemeStore.textColorPrimary(this)); int primaryColor = ThemeStore.primaryColor(this); toolbar.setBackgroundColor(primaryColor); appBarLayout.setBackgroundColor(primaryColor); toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + setTitle(null); setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setTitle(genre.name); - setTitle(R.string.app_name); appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { @Override @@ -140,7 +138,6 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement color = ATHUtil.resolveColor(GenreDetailsActivity.this, android.R.attr.textColorPrimary); break; } - toolbarLayout.setExpandedTitleColor(color); ToolbarContentTintHelper.colorizeToolbar(toolbar, color, GenreDetailsActivity.this); } }); @@ -267,6 +264,4 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement super.onMediaStoreChanged(); presenter.subscribe(); } - - } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/LicenseActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/LicenseActivity.java index 0efcfac5e..dd6da1236 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/LicenseActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/LicenseActivity.java @@ -6,6 +6,8 @@ import android.support.design.widget.AppBarLayout; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.webkit.WebView; +import android.widget.TextView; + import butterknife.BindView; import butterknife.ButterKnife; import code.name.monkey.appthemehelper.ThemeStore; @@ -13,40 +15,46 @@ import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity; public class LicenseActivity extends AbsBaseActivity { - @BindView(R.id.license) - WebView mLicense; - @BindView(R.id.toolbar) - Toolbar mToolbar; - @BindView(R.id.appbar) - AppBarLayout mAppbar; + @BindView(R.id.license) + WebView mLicense; - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; + @BindView(R.id.toolbar) + Toolbar mToolbar; + + @BindView(R.id.app_bar) + AppBarLayout mAppbar; + + @BindView(R.id.title) + TextView title; + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); } - return super.onOptionsItemSelected(item); - } - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_license); - ButterKnife.bind(this); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_license); + ButterKnife.bind(this); - setStatusbarColorAuto(); - setNavigationbarColorAuto(); - setTaskDescriptionColorAuto(); - setLightNavigationBar(true); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + setLightNavigationBar(true); - mLicense.loadUrl("file:///android_asset/index.html"); + mLicense.loadUrl("file:///android_asset/index.html"); - mToolbar.setTitle(R.string.licenses); - mToolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); - mToolbar.setNavigationOnClickListener(view -> onBackPressed()); - mToolbar.setBackgroundColor(ThemeStore.primaryColor(this)); - mAppbar.setBackgroundColor(ThemeStore.primaryColor(this)); - setSupportActionBar(mToolbar); - } + title.setTextColor(ThemeStore.textColorPrimary(this)); + mToolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + mToolbar.setNavigationOnClickListener(view -> onBackPressed()); + mToolbar.setBackgroundColor(ThemeStore.primaryColor(this)); + mAppbar.setBackgroundColor(ThemeStore.primaryColor(this)); + setTitle(null); + setSupportActionBar(mToolbar); + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.java index 7c7499a6c..2b94f423e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.java @@ -155,14 +155,16 @@ public class MainActivity extends AbsSlidingMusicPanelActivity implements PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this); } - public void setCurrentFragment(@Nullable Fragment fragment, boolean isStackAdd) { + public void setCurrentFragment(@Nullable Fragment fragment, boolean isStackAdd, String tag) { + FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - fragmentTransaction.replace(R.id.fragment_container, fragment, TAG); + fragmentTransaction.replace(R.id.fragment_container, fragment, tag); if (isStackAdd) { - fragmentTransaction.addToBackStack(TAG); + fragmentTransaction.addToBackStack(tag); } fragmentTransaction.commit(); + currentFragment = (MainActivityFragmentCallbacks) fragment; } @@ -186,13 +188,13 @@ public class MainActivity extends AbsSlidingMusicPanelActivity implements case R.id.action_album: case R.id.action_artist: case R.id.action_playlist: - setCurrentFragment(LibraryFragment.newInstance(menuItem), false); + setCurrentFragment(LibraryFragment.newInstance(menuItem), false, LibraryFragment.TAG); break; default: case R.id.action_home: - setCurrentFragment(PreferenceUtil.getInstance(this).toggleHomeBanner() ? BannerHomeFragment - .newInstance() : HomeFragment.newInstance(), - false); + setCurrentFragment(PreferenceUtil.getInstance(this).toggleHomeBanner() ? + BannerHomeFragment.newInstance() : HomeFragment.newInstance(), false, + HomeFragment.TAG); break; } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.java index f29967a97..e6adf5dfe 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.support.design.widget.AppBarLayout; import android.support.v7.widget.Toolbar; import android.widget.TextView; + import butterknife.BindDrawable; import butterknife.BindString; import butterknife.BindView; @@ -19,50 +20,56 @@ import code.name.monkey.retromusic.util.MusicUtil; public class PlayingQueueActivity extends AbsMusicServiceActivity { - @BindView(R.id.toolbar) - Toolbar mToolbar; - @BindDrawable(R.drawable.ic_close_white_24dp) - Drawable mClose; - @BindView(R.id.player_queue_sub_header) - TextView mPlayerQueueSubHeader; - @BindString(R.string.queue) - String queue; - @BindView(R.id.app_bar) - AppBarLayout mAppBarLayout; + @BindView(R.id.toolbar) + Toolbar mToolbar; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_playing_queue); - ButterKnife.bind(this); + @BindDrawable(R.drawable.ic_keyboard_backspace_black_24dp) + Drawable mClose; - setStatusbarColorAuto(); - setNavigationbarColorAuto(); - setTaskDescriptionColorAuto(); - setLightNavigationBar(true); + @BindView(R.id.player_queue_sub_header) + TextView mPlayerQueueSubHeader; - setupToolbar(); - if (savedInstanceState == null) { - getSupportFragmentManager().beginTransaction() - .replace(R.id.fragment_container, new PlayingQueueFragment()) - .commit(); + @BindString(R.string.queue) + String queue; + + @BindView(R.id.app_bar) + AppBarLayout mAppBarLayout; + + @BindView(R.id.title) + TextView title; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_playing_queue); + ButterKnife.bind(this); + + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + setLightNavigationBar(true); + + setupToolbar(); + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment_container, new PlayingQueueFragment()) + .commit(); + } } - } - protected String getUpNextAndQueueTime() { - return getResources().getString(R.string.up_next) + " • " + MusicUtil - .getReadableDurationString( - MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())); - } + protected String getUpNextAndQueueTime() { + return getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())); + } - private void setupToolbar() { - mPlayerQueueSubHeader.setText(getUpNextAndQueueTime()); - mPlayerQueueSubHeader.setTextColor(ThemeStore.accentColor(this)); - mAppBarLayout.setBackgroundColor(ThemeStore.primaryColor(this)); - mToolbar.setBackgroundColor(ThemeStore.primaryColor(this)); - mToolbar.setNavigationIcon(mClose); - setSupportActionBar(mToolbar); - setTitle(queue); - mToolbar.setNavigationOnClickListener(v -> onBackPressed()); - } + private void setupToolbar() { + title.setTextColor(ThemeStore.textColorPrimary(this)); + mPlayerQueueSubHeader.setText(getUpNextAndQueueTime()); + mPlayerQueueSubHeader.setTextColor(ThemeStore.accentColor(this)); + mAppBarLayout.setBackgroundColor(ThemeStore.primaryColor(this)); + mToolbar.setBackgroundColor(ThemeStore.primaryColor(this)); + mToolbar.setNavigationIcon(mClose); + setSupportActionBar(mToolbar); + setTitle(null); + mToolbar.setNavigationOnClickListener(v -> onBackPressed()); + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlaylistDetailActivity.java index 60f34e44b..1805bcdda 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlaylistDetailActivity.java @@ -3,7 +3,6 @@ package code.name.monkey.retromusic.ui.activities; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -29,13 +28,11 @@ import butterknife.ButterKnife; import butterknife.OnClick; import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.TintHelper; -import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.helper.MusicPlayerRemote; import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper; import code.name.monkey.retromusic.interfaces.CabHolder; import code.name.monkey.retromusic.loaders.PlaylistLoader; -import code.name.monkey.retromusic.misc.AppBarStateChangeListener; import code.name.monkey.retromusic.model.AbsCustomPlaylist; import code.name.monkey.retromusic.model.Playlist; import code.name.monkey.retromusic.model.PlaylistSong; @@ -72,8 +69,8 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme @BindView(R.id.app_bar) AppBarLayout appBarLayout; - @BindView(R.id.collapsing_toolbar) - CollapsingToolbarLayout toolbarLayout; + @BindView(R.id.title) + TextView title; @BindView(R.id.status_bar) View statusBar; @@ -182,33 +179,17 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme } private void setUpToolBar() { + title.setTextColor(ThemeStore.textColorPrimary(this)); + TintHelper.setTintAuto(shuffleButton, ThemeStore.accentColor(this), true); + int primaryColor = ThemeStore.primaryColor(this); toolbar.setBackgroundColor(primaryColor); appBarLayout.setBackgroundColor(primaryColor); - toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + title.setText(playlist.name); + setTitle(null); setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setTitle(playlist.name); - - appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { - @Override - public void onStateChanged(AppBarLayout appBarLayout, AppBarStateChangeListener.State state) { - int color; - switch (state) { - default: - case COLLAPSED: - case EXPANDED: - case IDLE: - color = ThemeStore.textColorPrimary(PlaylistDetailActivity.this); - break; - } - toolbarLayout.setExpandedTitleColor(color); - ToolbarContentTintHelper.colorizeToolbar(toolbar, color, PlaylistDetailActivity.this); - } - }); - TintHelper.setTintAuto(shuffleButton, ThemeStore.accentColor(this), true); } @Override diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/SearchActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/SearchActivity.java index 7733e1907..be1d41ec8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/SearchActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/SearchActivity.java @@ -44,28 +44,38 @@ public class SearchActivity extends AbsMusicServiceActivity implements OnQueryTe public static final String TAG = SearchActivity.class.getSimpleName(); public static final String QUERY = "query"; private static final int REQ_CODE_SPEECH_INPUT = 9002; + @BindView(R.id.voice_search) View micIcon; + @BindView(R.id.recycler_view) RecyclerView recyclerView; + @BindView(R.id.toolbar) Toolbar toolbar; + @BindView(android.R.id.empty) TextView empty; + + @BindView(R.id.title) + TextView title; + @BindView(R.id.search_view) EditText searchView; + @BindView(R.id.root) CoordinatorLayout container; - @BindView(R.id.appbar) + + @BindView(R.id.app_bar) AppBarLayout appbar; + @BindView(R.id.status_bar) View statusBar; + private SearchPresenter searchPresenter; private SearchAdapter adapter; private String query; - private boolean isMicSearch = false; - @Override protected void onCreate(Bundle savedInstanceState) { setDrawUnderStatusBar(true); @@ -94,7 +104,7 @@ public class SearchActivity extends AbsMusicServiceActivity implements OnQueryTe if (getIntent().getBooleanExtra("mic_search", false)) { startMicSearch(); - isMicSearch = true; + boolean isMicSearch = true; } } @@ -145,12 +155,13 @@ public class SearchActivity extends AbsMusicServiceActivity implements OnQueryTe } private void setUpToolBar() { + title.setTextColor(ThemeStore.textColorPrimary(this)); int primaryColor = ThemeStore.primaryColor(this); toolbar.setBackgroundColor(primaryColor); + toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); appbar.setBackgroundColor(primaryColor); setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setDisplayHomeAsUpEnabled(true); + setTitle(null); } @Override diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/SettingsActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/SettingsActivity.java index fba85c6a2..7e7fa9d65 100755 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/SettingsActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/SettingsActivity.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StringRes; import android.support.design.widget.AppBarLayout; import android.support.transition.TransitionManager; import android.support.v4.app.Fragment; @@ -12,142 +13,131 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.Toolbar; import android.view.MenuItem; -import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; + +import com.afollestad.materialdialogs.color.ColorChooserDialog; + import butterknife.BindView; import butterknife.ButterKnife; import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.ColorUtil; -import code.name.monkey.appthemehelper.util.TintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager; import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity; import code.name.monkey.retromusic.ui.fragments.settings.MainSettingsFragment; import code.name.monkey.retromusic.util.PreferenceUtil; -import com.afollestad.materialdialogs.color.ColorChooserDialog; public class SettingsActivity extends AbsBaseActivity implements ColorChooserDialog.ColorCallback { - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.app_bar) - AppBarLayout appBarLayout; - @BindView(R.id.detail_content_frame) - @Nullable - FrameLayout detailsFrame; - private FragmentManager fragmentManager = getSupportFragmentManager(); + @BindView(R.id.toolbar) + Toolbar toolbar; + @BindView(R.id.app_bar) + AppBarLayout appBarLayout; + @BindView(R.id.title) + TextView title; + @BindView(R.id.detail_content_frame) + @Nullable + FrameLayout detailsFrame; + private FragmentManager fragmentManager = getSupportFragmentManager(); - @Override - public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) { - switch (dialog.getTitle()) { - case R.string.primary_color: - int theme = ColorUtil.isColorLight(selectedColor) ? - PreferenceUtil.getThemeResFromPrefValue("light") : - PreferenceUtil.getThemeResFromPrefValue("dark"); + @Override + public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) { + switch (dialog.getTitle()) { + case R.string.primary_color: + int theme = ColorUtil.isColorLight(selectedColor) ? + PreferenceUtil.getThemeResFromPrefValue("light") : + PreferenceUtil.getThemeResFromPrefValue("dark"); - ThemeStore.editTheme(this).activityTheme(theme).primaryColor(selectedColor).commit(); - break; - case R.string.accent_color: - ThemeStore.editTheme(this).accentColor(selectedColor).commit(); - break; + ThemeStore.editTheme(this).activityTheme(theme).primaryColor(selectedColor).commit(); + break; + case R.string.accent_color: + ThemeStore.editTheme(this).accentColor(selectedColor).commit(); + break; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + new DynamicShortcutManager(this).updateDynamicShortcuts(); + } + recreate(); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - new DynamicShortcutManager(this).updateDynamicShortcuts(); - } - recreate(); - } + @Override + public void onColorChooserDismissed(@NonNull ColorChooserDialog dialog) { - @Override - public void onColorChooserDismissed(@NonNull ColorChooserDialog dialog) { - - } - - @Override - protected void onCreate(@Nullable Bundle bundle) { - super.onCreate(bundle); - setContentView(R.layout.activity_settings); - ButterKnife.bind(this); - - setStatusbarColorAuto(); - setNavigationbarColorAuto(); - setTaskDescriptionColorAuto(); - setLightNavigationBar(true); - - setupToolbar(); - - if (bundle == null) { - fragmentManager.beginTransaction().replace(R.id.content_frame, new MainSettingsFragment()) - .commit(); - } else { - restoreFragment(); - } - } - - private void setupToolbar() { - int primaryColor = ThemeStore.primaryColor(this); - appBarLayout.setBackgroundColor(primaryColor); - toolbar.setBackgroundColor(primaryColor); - toolbar.setNavigationOnClickListener(v -> onBackPressed()); - setTitle(R.string.app_name); - setSupportActionBar(toolbar); - } - - private void restoreFragment() { - toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); - if (fragmentManager.getBackStackEntryCount() > 0) { - appBarLayout.setExpanded(false, true); - } else { - appBarLayout.setExpanded(true, true); - } - setupToolbar(); - } - - public void setupFragment(Fragment fragment) { - FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction() - .setCustomAnimations(R.animator.slide_up, 0, 0, R.animator.slide_down); - - if (detailsFrame == null) { - fragmentTransaction.replace(R.id.content_frame, fragment, fragment.getTag()); - fragmentTransaction.addToBackStack(null); - fragmentTransaction.commit(); - } else { - fragmentTransaction.replace(R.id.detail_content_frame, fragment, fragment.getTag()); - fragmentTransaction.commit(); } - fragmentManager.addOnBackStackChangedListener(() -> { - if (fragmentManager.getBackStackEntryCount() > 0) { - appBarLayout.setExpanded(false, true); - } else { - appBarLayout.setExpanded(true, true); - } - setupToolbar(); - }); - } + @Override + protected void onCreate(@Nullable Bundle bundle) { + super.onCreate(bundle); + setContentView(R.layout.activity_settings); + ButterKnife.bind(this); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + setLightNavigationBar(true); - @Override - public void onBackPressed() { - if (fragmentManager.getBackStackEntryCount() == 0) { - super.onBackPressed(); - } else { - fragmentManager.popBackStack(); + setupToolbar(); + + if (bundle == null) { + fragmentManager.beginTransaction().replace(R.id.content_frame, new MainSettingsFragment()) + .commit(); + } } - } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; + private void setupToolbar() { + title.setTextColor(ThemeStore.textColorPrimary(this)); + int primaryColor = ThemeStore.primaryColor(this); + appBarLayout.setBackgroundColor(primaryColor); + toolbar.setBackgroundColor(primaryColor); + toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + toolbar.setNavigationOnClickListener(v -> onBackPressed()); + setTitle(null); + setSupportActionBar(toolbar); } - return super.onOptionsItemSelected(item); - } - public void addAppbarLayoutElevation(float v) { - TransitionManager.beginDelayedTransition(appBarLayout); - appBarLayout.setElevation(v); - } + + public void setupFragment(Fragment fragment, @StringRes int titleName) { + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction() + .setCustomAnimations(R.animator.slide_up, 0, 0, R.animator.slide_down); + + title.setText(titleName); + + if (detailsFrame == null) { + fragmentTransaction.replace(R.id.content_frame, fragment, fragment.getTag()); + fragmentTransaction.addToBackStack(null); + fragmentTransaction.commit(); + } else { + fragmentTransaction.replace(R.id.detail_content_frame, fragment, fragment.getTag()); + fragmentTransaction.commit(); + } + + + } + + + @Override + public void onBackPressed() { + if (fragmentManager.getBackStackEntryCount() == 0) { + super.onBackPressed(); + } else { + title.setText(R.string.action_settings); + fragmentManager.popBackStack(); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + public void addAppbarLayoutElevation(float v) { + TransitionManager.beginDelayedTransition(appBarLayout); + appBarLayout.setElevation(v); + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/SupportDevelopmentActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/SupportDevelopmentActivity.java index 604a09983..fb6956a88 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/SupportDevelopmentActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/SupportDevelopmentActivity.java @@ -14,6 +14,7 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; @@ -53,18 +54,27 @@ import static code.name.monkey.retromusic.Constants.PAYPAL_ME_URL; public class SupportDevelopmentActivity extends AbsBaseActivity implements BillingProcessor.IBillingHandler { public static final String TAG = SupportDevelopmentActivity.class.getSimpleName(); private static final int DONATION_PRODUCT_IDS = R.array.donation_ids; + @BindView(R.id.progress) ProgressBar mProgressBar; + @BindView(R.id.progress_container) View mProgressContainer; + @BindView(R.id.list) RecyclerView mListView; + @BindView(R.id.toolbar) Toolbar mToolbar; + @BindView(R.id.app_bar) AppBarLayout mAppBarLayout; + @BindView(R.id.root) ViewGroup mViewGroup; + + @BindView(R.id.title) + TextView title; private BillingProcessor mBillingProcessor; private AsyncTask skuDetailsLoadAsyncTask; @@ -86,6 +96,15 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi return skuDetails; } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + private void donate(int i) { final String[] ids = getResources().getStringArray(DONATION_PRODUCT_IDS); mBillingProcessor.purchase(this, ids[i]); @@ -107,13 +126,8 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi setTaskDescriptionColorAuto(); setLightNavigationBar(true); - int primaryColor = ThemeStore.primaryColor(this); - mAppBarLayout.setBackgroundColor(primaryColor); - mToolbar.setBackgroundColor(primaryColor); - setSupportActionBar(mToolbar); - //noinspection ConstantConditions - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - mToolbar.setNavigationOnClickListener(view -> onBackPressed()); + + setupToolbar(); mBillingProcessor = new BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSE_KEY, this); @@ -122,6 +136,17 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi ((TextView) findViewById(R.id.donation)).setTextColor(ThemeStore.accentColor(this)); } + private void setupToolbar() { + title.setTextColor(ThemeStore.textColorPrimary(this)); + int primaryColor = ThemeStore.primaryColor(this); + mAppBarLayout.setBackgroundColor(primaryColor); + mToolbar.setBackgroundColor(primaryColor); + mToolbar.setNavigationOnClickListener(view -> onBackPressed()); + mToolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + setSupportActionBar(mToolbar); + setTitle(null); + } + @Override public void onBillingInitialized() { loadSkuDetails(); @@ -173,7 +198,7 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi private static class SkuDetailsLoadAsyncTask extends AsyncTask> { private final WeakReference donationDialogWeakReference; - public SkuDetailsLoadAsyncTask(SupportDevelopmentActivity donationsDialog) { + SkuDetailsLoadAsyncTask(SupportDevelopmentActivity donationsDialog) { this.donationDialogWeakReference = new WeakReference<>(donationsDialog); } @@ -205,8 +230,6 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi if (dialog == null) return; if (skuDetails == null || skuDetails.isEmpty()) { - //Toast.makeText(dialog, "Error loading items", Toast.LENGTH_SHORT).show(); - //dialog.finish(); dialog.mProgressContainer.setVisibility(View.GONE); return; } @@ -229,7 +252,7 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi SupportDevelopmentActivity donationsDialog; List skuDetailsList = new ArrayList<>(); - public SkuDetailsAdapter(@NonNull SupportDevelopmentActivity donationsDialog, @NonNull List objects) { + SkuDetailsAdapter(@NonNull SupportDevelopmentActivity donationsDialog, @NonNull List objects) { this.donationsDialog = donationsDialog; skuDetailsList = objects; } @@ -260,14 +283,15 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi } } + @NonNull @Override - public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { return new ViewHolder(LayoutInflater.from(donationsDialog) .inflate(LAYOUT_RES_ID, viewGroup, false)); } @Override - public void onBindViewHolder(ViewHolder viewHolder, int i) { + public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { SkuDetails skuDetails = skuDetailsList.get(i); if (skuDetails != null) { viewHolder.title.setText(skuDetails.title.replace("(Retro Music Player)", "").trim()); diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/CollageSongAdapter.java b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/CollageSongAdapter.java index aa574b108..fdee5b6ad 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/CollageSongAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/CollageSongAdapter.java @@ -1,96 +1,92 @@ package code.name.monkey.retromusic.ui.adapter; +import android.app.Activity; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; + +import com.bumptech.glide.Glide; + +import java.util.ArrayList; +import java.util.List; + import butterknife.BindViews; import butterknife.ButterKnife; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.glide.SongGlideRequest; -import code.name.monkey.retromusic.model.Album; +import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.ui.adapter.CollageSongAdapter.CollageSongViewHolder; import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder; -import code.name.monkey.retromusic.util.NavigationUtil; -import com.bumptech.glide.Glide; -import java.util.ArrayList; -import java.util.List; /** * @author Hemanth S (h4h13). */ public class CollageSongAdapter extends RecyclerView.Adapter { - private AppCompatActivity activity; - private ArrayList dataSet; - private int itemLayoutRes; + private Activity activity; + private ArrayList dataSet; - public CollageSongAdapter(AppCompatActivity activity, ArrayList dataSet, - int itemLayoutRes) { - this.activity = activity; - this.dataSet = dataSet; - this.itemLayoutRes = itemLayoutRes; - } - - @Override - public void onBindViewHolder(@NonNull CollageSongViewHolder holder, int position) { - ArrayList albums = dataSet; - - holder.bindSongs(albums); - - if (albums.size() > 9) { - for (int i = 0; i < albums.subList(0, 9).size(); i++) { - if (holder.imageViews != null) { - SongGlideRequest.Builder.from(Glide.with(activity), albums.get(i).safeGetFirstSong()) - .checkIgnoreMediaStore(activity).build().into(holder.imageViews.get(i)); - } - } - } - } - - @Override - public int getItemCount() { - return 1; - } - - @NonNull - @Override - public CollageSongViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return new CollageSongViewHolder( - LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)); - } - - class CollageSongViewHolder extends MediaEntryViewHolder { - - @BindViews({R.id.image_1, R.id.image_2, R.id.image_3, R.id.image_4, R.id.image_5, R.id.image_6, - R.id.image_7, R.id.image_8, R.id.image_9}) - @Nullable - List imageViews; - - CollageSongViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); + public CollageSongAdapter(Activity activity, ArrayList dataSet) { + this.activity = activity; + this.dataSet = dataSet; } @Override - public void onClick(View v) { - super.onClick(v); - NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition() + 1).getId()); + public void onBindViewHolder(@NonNull CollageSongViewHolder holder, int position) { + + + holder.bindSongs(); + + if (dataSet.size() > 9) { + for (int i = 0; i < dataSet.subList(0, 9).size(); i++) { + if (holder.imageViews != null) { + SongGlideRequest.Builder.from(Glide.with(activity), dataSet.get(i)) + .checkIgnoreMediaStore(activity) + .build() + .into(holder.imageViews.get(i)); + } + } + } } - void bindSongs(ArrayList albums) { - if (imageViews != null) { - for (int i = 0; i < imageViews.size(); i++) { - final int startPosition = i; - ImageView imageView = imageViews.get(i); - imageView.setOnClickListener( - v -> NavigationUtil.goToAlbum(activity, albums.get(startPosition).getId())); - } - } + @Override + public int getItemCount() { + return 1; + } + + @NonNull + @Override + public CollageSongViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new CollageSongViewHolder( + LayoutInflater.from(activity).inflate(R.layout.item_collage, parent, false)); + } + + class CollageSongViewHolder extends MediaEntryViewHolder { + + @BindViews({R.id.image_1, R.id.image_2, R.id.image_3, R.id.image_4, R.id.image_5, R.id.image_6, + R.id.image_7, R.id.image_8, R.id.image_9}) + @Nullable + List imageViews; + + CollageSongViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + } + + void bindSongs() { + if (imageViews != null) { + for (int i = 0; i < imageViews.size(); i++) { + final int startPosition = i; + ImageView imageView = imageViews.get(i); + imageView.setOnClickListener(view -> { + + }); + } + } + } } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumAdapter.java b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumAdapter.java index eb0eff062..e0c08a7d9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumAdapter.java @@ -60,8 +60,11 @@ public class AlbumAdapter extends AbsMultiSelectAdapter dataSet, + @LayoutRes int itemLayoutRes) { + this(activity, dataSet, itemLayoutRes, false, null); } public void useItemLayout(int itemLayoutRes) { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.java b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.java index 57d2b2a10..3748514a4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.java @@ -25,6 +25,12 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; + +import com.bumptech.glide.Glide; + +import java.util.ArrayList; +import java.util.List; + import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.glide.RetroMusicColoredTarget; import code.name.monkey.retromusic.glide.SongGlideRequest; @@ -32,116 +38,114 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote; import code.name.monkey.retromusic.model.Album; import code.name.monkey.retromusic.util.NavigationUtil; import code.name.monkey.retromusic.views.MetalRecyclerViewPager; -import com.bumptech.glide.Glide; -import java.util.ArrayList; -import java.util.List; public class AlbumFullWithAdapter extends - MetalRecyclerViewPager.MetalAdapter { + MetalRecyclerViewPager.MetalAdapter { - private Activity activity; - private List dataSet = new ArrayList<>(); + private Activity activity; + private List dataSet = new ArrayList<>(); - public AlbumFullWithAdapter(@NonNull Activity activity, - @NonNull DisplayMetrics metrics) { - super(metrics); - this.activity = activity; - } - - public void swapData(ArrayList list) { - dataSet = list; - notifyDataSetChanged(); - } - - @Override - public FullMetalViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View viewItem = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.pager_item, parent, false); - return new FullMetalViewHolder(viewItem); - } - - private Bitmap combineImageIntoOne(ArrayList bitmap) { - int w = 0, h = 0; - for (int i = 0; i < bitmap.size(); i++) { - if (i < bitmap.size() - 1) { - h = bitmap.get(i).getWidth() > bitmap.get(i + 1).getWidth() ? bitmap.get(i).getWidth() - : bitmap.get(i + 1).getWidth(); - } - w += bitmap.get(i).getHeight(); + public AlbumFullWithAdapter(@NonNull Activity activity, + @NonNull DisplayMetrics metrics) { + super(metrics); + this.activity = activity; } - Bitmap temp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(temp); - int top = 0, left = 0; - for (int i = 0; i < bitmap.size(); i++) { - Log.d("HTML", "Combine: " + i + "/" + bitmap.size() + 1); - - top = (i == 0 ? 0 : top + bitmap.get(i).getHeight()); - left = (i == 0 ? 0 : top + bitmap.get(i).getWidth()); - canvas.drawBitmap(bitmap.get(i), left, 0f, null); - } - return temp; - } - - @Override - public void onBindViewHolder(FullMetalViewHolder holder, int position) { - // don't forget about calling supper.onBindViewHolder! - super.onBindViewHolder(holder, position); - - final Album album = dataSet.get(position); - - if (holder.title != null) { - holder.title.setText(getAlbumTitle(album)); - } - if (holder.text != null) { - holder.text.setText(getAlbumText(album)); - } - if (holder.playSongs != null) { - holder.playSongs.setOnClickListener(v -> MusicPlayerRemote.openQueue(album.songs, 0, true)); - } - loadAlbumCover(album, holder); - } - - private String getAlbumTitle(Album album) { - return album.getTitle(); - } - - private String getAlbumText(Album album) { - return album.getArtistName(); - } - - private void loadAlbumCover(Album album, FullMetalViewHolder holder) { - if (holder.image == null) { - return; + public void swapData(ArrayList list) { + dataSet = list; + notifyDataSetChanged(); } - SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) - .checkIgnoreMediaStore(activity) - .generatePalette(activity).build() - .into(new RetroMusicColoredTarget(holder.image) { - @Override - public void onColorReady(int color) { + @NonNull + @Override + public FullMetalViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View viewItem = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.pager_item, parent, false); + return new FullMetalViewHolder(viewItem); + } - } - }); - } + private Bitmap combineImageIntoOne(ArrayList bitmap) { + int w = 0, h = 0; + for (int i = 0; i < bitmap.size(); i++) { + if (i < bitmap.size() - 1) { + h = bitmap.get(i).getWidth() > bitmap.get(i + 1).getWidth() ? bitmap.get(i).getWidth() + : bitmap.get(i + 1).getWidth(); + } + w += bitmap.get(i).getHeight(); + } - @Override - public int getItemCount() { - return dataSet.size(); - } + Bitmap temp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(temp); + int top = 0, left = 0; + for (int i = 0; i < bitmap.size(); i++) { + Log.d("HTML", "Combine: " + i + "/" + bitmap.size() + 1); - class FullMetalViewHolder extends MetalRecyclerViewPager.MetalViewHolder { - - FullMetalViewHolder(View itemView) { - super(itemView); + top = (i == 0 ? 0 : top + bitmap.get(i).getHeight()); + left = (i == 0 ? 0 : top + bitmap.get(i).getWidth()); + canvas.drawBitmap(bitmap.get(i), left, 0f, null); + } + return temp; } @Override - public void onClick(View v) { - Pair[] albumPairs = new Pair[]{ - Pair.create(image, activity.getResources().getString(R.string.transition_album_art))}; - NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).getId(), albumPairs); + public void onBindViewHolder(@NonNull FullMetalViewHolder holder, int position) { + // don't forget about calling supper.onBindViewHolder! + super.onBindViewHolder(holder, position); + + final Album album = dataSet.get(position); + + if (holder.title != null) { + holder.title.setText(getAlbumTitle(album)); + } + if (holder.text != null) { + holder.text.setText(getAlbumText(album)); + } + if (holder.playSongs != null) { + holder.playSongs.setOnClickListener(v -> MusicPlayerRemote.openQueue(album.songs, 0, true)); + } + loadAlbumCover(album, holder); + } + + private String getAlbumTitle(Album album) { + return album.getTitle(); + } + + private String getAlbumText(Album album) { + return album.getArtistName(); + } + + private void loadAlbumCover(Album album, FullMetalViewHolder holder) { + if (holder.image == null) { + return; + } + + SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) + .checkIgnoreMediaStore(activity) + .generatePalette(activity).build() + .into(new RetroMusicColoredTarget(holder.image) { + @Override + public void onColorReady(int color) { + + } + }); + } + + @Override + public int getItemCount() { + return dataSet.size(); + } + + class FullMetalViewHolder extends MetalRecyclerViewPager.MetalViewHolder { + + FullMetalViewHolder(View itemView) { + super(itemView); + } + + @Override + public void onClick(View v) { + Pair[] albumPairs = new Pair[]{ + Pair.create(image, activity.getResources().getString(R.string.transition_album_art))}; + NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).getId(), albumPairs); + } } - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/artist/ArtistAdapter.java b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/artist/ArtistAdapter.java index 58f921e7e..5fb24a1af 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/artist/ArtistAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/artist/ArtistAdapter.java @@ -9,6 +9,13 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; + +import com.bumptech.glide.Glide; +import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; + +import java.util.ArrayList; +import java.util.List; + import code.name.monkey.appthemehelper.util.ColorUtil; import code.name.monkey.appthemehelper.util.MaterialValueHelper; import code.name.monkey.retromusic.R; @@ -22,167 +29,171 @@ import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter; import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder; import code.name.monkey.retromusic.util.MusicUtil; import code.name.monkey.retromusic.util.NavigationUtil; -import com.bumptech.glide.Glide; -import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; -import java.util.ArrayList; -import java.util.List; public class ArtistAdapter extends - AbsMultiSelectAdapter implements - FastScrollRecyclerView.SectionedAdapter { + AbsMultiSelectAdapter implements + FastScrollRecyclerView.SectionedAdapter { - protected final AppCompatActivity activity; - protected ArrayList dataSet; + protected final AppCompatActivity activity; + protected ArrayList dataSet; - protected int itemLayoutRes; + protected int itemLayoutRes; - protected boolean usePalette = false; + protected boolean usePalette = false; - public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, - @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { - super(activity, cabHolder, R.menu.menu_media_selection); - this.activity = activity; - this.dataSet = dataSet; - this.itemLayoutRes = itemLayoutRes; - this.usePalette = usePalette; - //setHasStableIds(true); - } - - public void swapDataSet(ArrayList dataSet) { - this.dataSet = dataSet; - notifyDataSetChanged(); - } - - public ArrayList getDataSet() { - return dataSet; - } - - public void usePalette(boolean usePalette) { - this.usePalette = usePalette; - notifyDataSetChanged(); - } - - @Override - public long getItemId(int position) { - return dataSet.get(position).getId(); - } - - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false); - return createViewHolder(view); - } - - protected ViewHolder createViewHolder(View view) { - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { - final Artist artist = dataSet.get(position); - - boolean isChecked = isChecked(artist); - holder.itemView.setActivated(isChecked); - - if (holder.title != null) { - holder.title.setText(artist.getName()); + public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, + @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { + super(activity, cabHolder, R.menu.menu_media_selection); + this.activity = activity; + this.dataSet = dataSet; + this.itemLayoutRes = itemLayoutRes; + this.usePalette = usePalette; + //setHasStableIds(true); } - if (holder.text != null) { - holder.text.setVisibility(View.GONE); + + public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, + @LayoutRes int itemLayoutRes ) { + super(activity, null, R.menu.menu_media_selection); + this.activity = activity; + this.dataSet = dataSet; + this.itemLayoutRes = itemLayoutRes; } - if (holder.shortSeparator != null) { - holder.shortSeparator.setVisibility(View.VISIBLE); + + public void swapDataSet(ArrayList dataSet) { + this.dataSet = dataSet; + notifyDataSetChanged(); } - loadArtistImage(artist, holder); - } - protected void setColors(int color, ViewHolder holder) { - if (holder.paletteColorContainer != null) { - holder.paletteColorContainer.setBackgroundColor(color); - if (holder.title != null) { - holder.title.setTextColor( - MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))); - } + public ArrayList getDataSet() { + return dataSet; } - } - private void loadArtistImage(Artist artist, final ViewHolder holder) { - if (holder.image == null) { - return; - } - ArtistGlideRequest.Builder.from(Glide.with(activity), artist) - .generatePalette(activity).build() - .into(new RetroMusicColoredTarget(holder.image) { - @Override - public void onColorReady(int color) { - setColors(color, holder); - } - }); - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - @Override - protected Artist getIdentifier(int position) { - return dataSet.get(position); - } - - @Override - protected String getName(Artist artist) { - return artist.getName(); - } - - @Override - protected void onMultipleItemAction(@NonNull MenuItem menuItem, - @NonNull ArrayList selection) { - SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId()); - } - - @NonNull - private ArrayList getSongList(@NonNull List artists) { - final ArrayList songs = new ArrayList<>(); - for (Artist artist : artists) { - songs.addAll(artist.getSongs()); // maybe async in future? - } - return songs; - } - - @NonNull - @Override - public String getSectionName(int position) { - return MusicUtil.getSectionName(dataSet.get(position).getName()); - } - - public class ViewHolder extends MediaEntryViewHolder { - - public ViewHolder(@NonNull View itemView) { - super(itemView); - setImageTransitionName(activity.getString(R.string.transition_artist_image)); - if (menu != null) { - menu.setVisibility(View.GONE); - } + public void usePalette(boolean usePalette) { + this.usePalette = usePalette; + notifyDataSetChanged(); } @Override - public void onClick(View v) { - if (isInQuickSelectMode()) { - toggleChecked(getAdapterPosition()); - } else { - Pair[] artistPairs = new Pair[]{Pair.create(image, - activity.getResources().getString(R.string.transition_artist_image))}; - NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).getId(), artistPairs); - } + public long getItemId(int position) { + return dataSet.get(position).getId(); } @Override - public boolean onLongClick(View view) { - toggleChecked(getAdapterPosition()); - return true; + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false); + return createViewHolder(view); + } + + protected ViewHolder createViewHolder(View view) { + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { + final Artist artist = dataSet.get(position); + + boolean isChecked = isChecked(artist); + holder.itemView.setActivated(isChecked); + + if (holder.title != null) { + holder.title.setText(artist.getName()); + } + if (holder.text != null) { + holder.text.setVisibility(View.GONE); + } + if (holder.shortSeparator != null) { + holder.shortSeparator.setVisibility(View.VISIBLE); + } + loadArtistImage(artist, holder); + } + + protected void setColors(int color, ViewHolder holder) { + if (holder.paletteColorContainer != null) { + holder.paletteColorContainer.setBackgroundColor(color); + if (holder.title != null) { + holder.title.setTextColor( + MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))); + } + } + } + + private void loadArtistImage(Artist artist, final ViewHolder holder) { + if (holder.image == null) { + return; + } + ArtistGlideRequest.Builder.from(Glide.with(activity), artist) + .generatePalette(activity).build() + .into(new RetroMusicColoredTarget(holder.image) { + @Override + public void onColorReady(int color) { + setColors(color, holder); + } + }); + } + + @Override + public int getItemCount() { + return dataSet.size(); + } + + @Override + protected Artist getIdentifier(int position) { + return dataSet.get(position); + } + + @Override + protected String getName(Artist artist) { + return artist.getName(); + } + + @Override + protected void onMultipleItemAction(@NonNull MenuItem menuItem, + @NonNull ArrayList selection) { + SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId()); + } + + @NonNull + private ArrayList getSongList(@NonNull List artists) { + final ArrayList songs = new ArrayList<>(); + for (Artist artist : artists) { + songs.addAll(artist.getSongs()); // maybe async in future? + } + return songs; + } + + @NonNull + @Override + public String getSectionName(int position) { + return MusicUtil.getSectionName(dataSet.get(position).getName()); + } + + public class ViewHolder extends MediaEntryViewHolder { + + public ViewHolder(@NonNull View itemView) { + super(itemView); + setImageTransitionName(activity.getString(R.string.transition_artist_image)); + if (menu != null) { + menu.setVisibility(View.GONE); + } + } + + @Override + public void onClick(View v) { + if (isInQuickSelectMode()) { + toggleChecked(getAdapterPosition()); + } else { + Pair[] artistPairs = new Pair[]{Pair.create(image, + activity.getResources().getString(R.string.transition_artist_image))}; + NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).getId(), artistPairs); + } + } + + @Override + public boolean onLongClick(View view) { + toggleChecked(getAdapterPosition()); + return true; + } } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/base/MediaEntryViewHolder.java b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/base/MediaEntryViewHolder.java index 5659aac78..de3967948 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/base/MediaEntryViewHolder.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/base/MediaEntryViewHolder.java @@ -10,6 +10,7 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; + import butterknife.BindView; import butterknife.ButterKnife; import code.name.monkey.appthemehelper.ThemeStore; @@ -17,82 +18,82 @@ import code.name.monkey.retromusic.R; public class MediaEntryViewHolder extends RecyclerView.ViewHolder - implements View.OnClickListener, View.OnLongClickListener { + implements View.OnClickListener, View.OnLongClickListener { - @Nullable - @BindView(R.id.image) - public ImageView image; - @Nullable - @BindView(R.id.image_text) - public TextView imageText; - @Nullable - @BindView(R.id.title) - public TextView title; - @Nullable - @BindView(R.id.text) - public TextView text; - @Nullable - @BindView(R.id.image_container) - public ViewGroup imageContainer; - @Nullable - @BindView(R.id.image_container_card) - public CardView imageContainerCard; - @Nullable - @BindView(R.id.menu) - public View menu; - @Nullable - @BindView(R.id.separator) - public View separator; - @Nullable - @BindView(R.id.short_separator) - public View shortSeparator; - @Nullable - @BindView(R.id.drag_view) - public View dragView; - @Nullable - @BindView(R.id.palette_color_container) - public View paletteColorContainer; - @BindView(R.id.time) - @Nullable - public TextView time; - @BindView(R.id.recycler_view) - @Nullable - public RecyclerView recyclerView; - @BindView(R.id.play_songs) - @Nullable - public ImageButton playSongs; - @BindView(R.id.image_text_container) - @Nullable - public CardView imageTextContainer; + @Nullable + @BindView(R.id.image) + public ImageView image; + @Nullable + @BindView(R.id.image_text) + public TextView imageText; + @Nullable + @BindView(R.id.title) + public TextView title; + @Nullable + @BindView(R.id.text) + public TextView text; + @Nullable + @BindView(R.id.image_container) + public ViewGroup imageContainer; + @Nullable + @BindView(R.id.image_container_card) + public CardView imageContainerCard; + @Nullable + @BindView(R.id.menu) + public View menu; + @Nullable + @BindView(R.id.separator) + public View separator; + @Nullable + @BindView(R.id.short_separator) + public View shortSeparator; + @Nullable + @BindView(R.id.drag_view) + public View dragView; + @Nullable + @BindView(R.id.palette_color_container) + public View paletteColorContainer; + @BindView(R.id.time) + @Nullable + public TextView time; + @BindView(R.id.recycler_view) + @Nullable + public RecyclerView recyclerView; + @BindView(R.id.play_songs) + @Nullable + public ImageButton playSongs; + @BindView(R.id.image_text_container) + @Nullable + public CardView imageTextContainer; - public MediaEntryViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); + public MediaEntryViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); - itemView.setOnClickListener(this); - itemView.setOnLongClickListener(this); + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); - if (imageTextContainer != null) { - imageTextContainer.setCardBackgroundColor(ThemeStore.primaryColor(itemView.getContext())); + if (imageTextContainer != null) { + imageTextContainer.setCardBackgroundColor(ThemeStore.primaryColor(itemView.getContext())); + } + if (imageContainerCard != null) { + imageContainerCard.setCardBackgroundColor(ThemeStore.primaryColor(itemView.getContext())); + } } - if (imageContainerCard != null) { - imageContainerCard.setCardBackgroundColor(ThemeStore.primaryColor(itemView.getContext())); + + protected void setImageTransitionName(@NonNull String transitionName) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && image != null) { + image.setTransitionName(transitionName); + } } - } - protected void setImageTransitionName(@NonNull String transitionName) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && image != null) { - image.setTransitionName(transitionName); + @Override + public boolean onLongClick(View v) { + return false; } - } - @Override - public boolean onLongClick(View v) { - return false; - } - - @Override - public void onClick(View v) { - } + @Override + public void onClick(View v) { + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/home/HomeAdapter.java b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/home/HomeAdapter.java index d8ac7f7eb..393e909c9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/home/HomeAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/home/HomeAdapter.java @@ -1,169 +1,128 @@ package code.name.monkey.retromusic.ui.adapter.home; +import android.app.Activity; +import android.content.Context; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import butterknife.BindView; + +import java.util.ArrayList; + import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.helper.MusicPlayerRemote; -import code.name.monkey.retromusic.loaders.SongLoader; import code.name.monkey.retromusic.model.Album; import code.name.monkey.retromusic.model.Artist; +import code.name.monkey.retromusic.model.Genre; +import code.name.monkey.retromusic.model.Home; import code.name.monkey.retromusic.model.Song; -import code.name.monkey.retromusic.model.smartplaylist.HistoryPlaylist; -import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist; -import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist; +import code.name.monkey.retromusic.ui.adapter.CollageSongAdapter; +import code.name.monkey.retromusic.ui.adapter.GenreAdapter; import code.name.monkey.retromusic.ui.adapter.album.AlbumAdapter; import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter; import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder; -import code.name.monkey.retromusic.ui.adapter.song.SongAdapter; -import code.name.monkey.retromusic.util.NavigationUtil; -import java.util.ArrayList; -public class HomeAdapter extends RecyclerView.Adapter { +public class HomeAdapter extends RecyclerView.Adapter { - private static final int SUB_HEADER = 0; - private static final int ABS_PLAYLITS = 1; - private static final int DATA = 2; - private ArrayList dataSet = new ArrayList<>(); - private AppCompatActivity activity; + private static final int ALBUMS = 0; + private static final int ARTISTS = 1; + private static final int GENERS = 2; + private static final int SUGGESTIONS = 3; + private Activity activity; + private ArrayList sections = new ArrayList<>(); - public HomeAdapter(@NonNull AppCompatActivity activity) { - this.activity = activity; - } - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { - switch (i) { - - case ABS_PLAYLITS: - return new ViewHolder(LayoutInflater.from(activity) - .inflate(R.layout.abs_playlists, viewGroup, false)); - default: - case DATA: - return new ViewHolder(LayoutInflater.from(activity) - .inflate(R.layout.recycler_view_sec, viewGroup, false)); - case SUB_HEADER: - return new ViewHolder(LayoutInflater.from(activity) - .inflate(R.layout.sub_header, viewGroup, false)); + public HomeAdapter(Activity activity) { + this.activity = activity; } - } - @Override - public int getItemViewType(int position) { - if (dataSet.get(position) instanceof String) { - return SUB_HEADER; - } else if (dataSet.get(position) instanceof Integer) { - return ABS_PLAYLITS; - } else if (dataSet.get(position) instanceof ArrayList) { - return DATA; + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + Context context = parent.getContext(); + return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.home_section_recycler_view, + parent, false)); } - return super.getItemViewType(position); - } - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) { - ViewHolder viewholder = (ViewHolder) holder; - switch (getItemViewType(i)) { - case ABS_PLAYLITS: - bindAbsActions(viewholder); - break; - case SUB_HEADER: - String title = (String) dataSet.get(i); - if (viewholder.title != null) { - viewholder.title.setText(title); + @Override + public int getItemViewType(int position) { + Home home = sections.get(position); + ArrayList arrayList = home.getList(); + if (arrayList.get(0) instanceof Album) { + return ALBUMS; + } else if (arrayList.get(0) instanceof Artist) { + return ARTISTS; + } else if (arrayList.get(0) instanceof Genre) { + return GENERS; + } else { + return SUGGESTIONS; } - break; - case DATA: - parseAllSections(i, viewholder); - break; } - } - private void bindAbsActions(ViewHolder viewholder) { - - - if (viewholder.shuffle != null) { - viewholder.shuffle.setOnClickListener(view -> MusicPlayerRemote - .openAndShuffleQueue(SongLoader.getAllSongs(activity).blockingFirst(), true)); + private DisplayMetrics getDisplayMetrics() { + Display display = activity.getWindowManager().getDefaultDisplay(); + DisplayMetrics metrics = new DisplayMetrics(); + display.getMetrics(metrics); + return metrics; } - /*if (viewholder.search != null) { - viewholder.search.setBackgroundTintList(ColorStateList.valueOf(ColorUtil.withAlpha(ThemeStore.textColorPrimary(activity), 0.2f))); - viewholder.search.setOnClickListener(view -> { - activity.startActivity(new Intent(activity, SearchActivity.class)); - }); - }*/ - } - @SuppressWarnings("unchecked") - private void parseAllSections(int i, ViewHolder viewholder) { - if (viewholder.recyclerView != null) { - ArrayList arrayList = (ArrayList) dataSet.get(i); - if (arrayList.isEmpty()) { - return; - } - Object something = arrayList.get(0); - if (something instanceof Artist) { - layoutManager(viewholder); - viewholder.recyclerView.setAdapter( - new ArtistAdapter(activity, (ArrayList) arrayList, R.layout.item_artist, false, - null)); - } else if (something instanceof Album) { - layoutManager(viewholder); - viewholder.recyclerView.setItemAnimator(new DefaultItemAnimator()); - viewholder.recyclerView.setAdapter( - new AlbumAdapter(activity, (ArrayList) arrayList, R.layout.item_image, false, - null)); - } else if (something instanceof Song) { - GridLayoutManager layoutManager = new GridLayoutManager(activity, 1, - LinearLayoutManager.HORIZONTAL, false); - viewholder.recyclerView.setLayoutManager(layoutManager); - viewholder.recyclerView.setAdapter( - new SongAdapter(activity, (ArrayList) arrayList, R.layout.item_image, false, - null)); - } + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Home home = sections.get(position); + + if (holder.title != null) { + holder.title.setText(home.getSectionTitle()); + } + ArrayList arrayList = home.getList(); + if (arrayList.get(0) instanceof Album) { + AlbumAdapter albumAdapter = new AlbumAdapter((AppCompatActivity) activity, + (ArrayList) arrayList, R.layout.item_image); + if (holder.recyclerView != null) { + holder.recyclerView.setLayoutManager(new GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)); + holder.recyclerView.setAdapter(albumAdapter); + } + } else if (arrayList.get(0) instanceof Artist) { + ArtistAdapter artistAdapter = new ArtistAdapter((AppCompatActivity) activity, (ArrayList) arrayList, R.layout.item_artist); + GridLayoutManager layoutManager = new GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false); + if (holder.recyclerView != null) { + holder.recyclerView.setLayoutManager(layoutManager); + holder.recyclerView.setAdapter(artistAdapter); + } + } else if (arrayList.get(0) instanceof Genre) { + GenreAdapter genreAdapter = new GenreAdapter(activity, (ArrayList) arrayList, R.layout.item_list); + if (holder.recyclerView != null) { + holder.recyclerView.setLayoutManager(new LinearLayoutManager(activity)); + holder.recyclerView.setAdapter(genreAdapter); + } + } else if (arrayList.get(0) instanceof Song) { + CollageSongAdapter collageSongAdapter = new CollageSongAdapter(activity, (ArrayList) arrayList); + if (holder.recyclerView != null) { + holder.recyclerView.setLayoutManager(new LinearLayoutManager(activity)); + holder.recyclerView.setAdapter(collageSongAdapter); + } + } } - } - private void layoutManager(ViewHolder viewholder) { - if (viewholder.recyclerView != null) { - viewholder.recyclerView.setLayoutManager( - new GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)); - viewholder.recyclerView.setItemAnimator(new DefaultItemAnimator()); + @Override + public int getItemCount() { + return sections.size(); } - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - public void swapDataSet(@NonNull ArrayList data) { - dataSet = data; - notifyDataSetChanged(); - } - - public ArrayList getDataset() { - return dataSet; - } - - public class ViewHolder extends MediaEntryViewHolder { - - - @BindView(R.id.action_shuffle) - @Nullable - View shuffle; - - public ViewHolder(View itemView) { - super(itemView); + public void swapData(ArrayList sections) { + this.sections = sections; + notifyDataSetChanged(); + } + + public class ViewHolder extends MediaEntryViewHolder { + + + public ViewHolder(View itemView) { + super(itemView); + } } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/base/AbsMainActivityFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/base/AbsMainActivityFragment.java index 8d82a7153..3b49c0864 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/base/AbsMainActivityFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/base/AbsMainActivityFragment.java @@ -35,11 +35,11 @@ public abstract class AbsMainActivityFragment extends AbsMusicServiceFragment { final View statusBar = view.findViewById(R.id.status_bar); if (statusBar != null) { RetroUtil.statusBarHeight(statusBar); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - statusBar.setBackgroundColor(ColorUtil.darkenColor(color)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + statusBar.setBackgroundColor(color); getMainActivity().setLightStatusbarAuto(color); } else { - statusBar.setBackgroundColor(color); + statusBar.setBackgroundColor(ColorUtil.darkenColor(color)); } } } @@ -47,6 +47,7 @@ public abstract class AbsMainActivityFragment extends AbsMusicServiceFragment { public void setStatusbarColorAuto(View view) { // we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat + //noinspection ConstantConditions setStatusbarColor(view, ThemeStore.primaryColor(getContext())); } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/AlbumsFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/AlbumsFragment.java index 46f6fbc8e..fdc4e7dd3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/AlbumsFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/AlbumsFragment.java @@ -4,6 +4,9 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.GridLayoutManager; + +import java.util.ArrayList; + import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.model.Album; import code.name.monkey.retromusic.mvp.contract.AlbumContract; @@ -11,156 +14,166 @@ import code.name.monkey.retromusic.mvp.presenter.AlbumPresenter; import code.name.monkey.retromusic.ui.adapter.album.AlbumAdapter; import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment; import code.name.monkey.retromusic.util.PreferenceUtil; -import java.util.ArrayList; public class AlbumsFragment extends - AbsLibraryPagerRecyclerViewCustomGridSizeFragment implements - AlbumContract.AlbumView { + AbsLibraryPagerRecyclerViewCustomGridSizeFragment implements + AlbumContract.AlbumView { - public static final String TAG = AlbumsFragment.class.getSimpleName(); + public static final String TAG = AlbumsFragment.class.getSimpleName(); - private AlbumPresenter presenter; + private AlbumPresenter presenter; - public static AlbumsFragment newInstance() { - Bundle args = new Bundle(); - AlbumsFragment fragment = new AlbumsFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - protected GridLayoutManager createLayoutManager() { - return new GridLayoutManager(getActivity(), getGridSize()); - } - - @NonNull - @Override - protected AlbumAdapter createAdapter() { - int itemLayoutRes = getItemLayoutRes(); - notifyLayoutResChanged(itemLayoutRes); - if (itemLayoutRes != R.layout.item_list) { - itemLayoutRes = PreferenceUtil.getInstance(getContext()).getAlbumGridStyle(getContext()); + public static AlbumsFragment newInstance() { + Bundle args = new Bundle(); + AlbumsFragment fragment = new AlbumsFragment(); + fragment.setArguments(args); + return fragment; } - ArrayList dataSet = - getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); - return new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, - loadUsePalette(), getLibraryFragment()); - } - @Override - protected int getEmptyMessage() { - return R.string.no_albums; - } - - @Override - public boolean loadUsePalette() { - return PreferenceUtil.getInstance(getActivity()).albumColoredFooters(); - } - - @Override - protected void setUsePalette(boolean usePalette) { - getAdapter().usePalette(usePalette); - } - - @Override - protected void setGridSize(int gridSize) { - getLayoutManager().setSpanCount(gridSize); - getAdapter().notifyDataSetChanged(); - } - - @Override - protected void setSortOrder(String sortOrder) { - presenter.loadAlbums(); - } - - @Override - protected String loadSortOrder() { - return PreferenceUtil.getInstance(getActivity()).getAlbumSortOrder(); - } - - @Override - protected void saveSortOrder(String sortOrder) { - PreferenceUtil.getInstance(getActivity()).setAlbumSortOrder(sortOrder); - } - - @Override - protected int loadGridSize() { - return PreferenceUtil.getInstance(getActivity()).getAlbumGridSize(getActivity()); - } - - @Override - protected void saveGridSize(int gridSize) { - PreferenceUtil.getInstance(getActivity()).setAlbumGridSize(gridSize); - } - - @Override - protected int loadGridSizeLand() { - return PreferenceUtil.getInstance(getActivity()).getAlbumGridSizeLand(getActivity()); - } - - @Override - protected void saveGridSizeLand(int gridSize) { - PreferenceUtil.getInstance(getActivity()).setAlbumGridSizeLand(gridSize); - } - - @Override - protected void saveUsePalette(boolean usePalette) { - PreferenceUtil.getInstance(getActivity()).setAlbumColoredFooters(usePalette); - } - - @Override - public void onMediaStoreChanged() { - presenter.loadAlbums(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - presenter = new AlbumPresenter(this); - } - - @Override - public void setMenuVisibility(boolean menuVisible) { - super.setMenuVisibility(menuVisible); - if (menuVisible) { - getLibraryFragment().setTitle( - PreferenceUtil.getInstance(getContext()).tabTitles() ? R.string.library - : R.string.albums); + @Override + protected GridLayoutManager createLayoutManager() { + return new GridLayoutManager(getActivity(), getGridSize()); } - } - @Override - public void onResume() { - super.onResume(); - getLibraryFragment().setTitle( - PreferenceUtil.getInstance(getContext()).tabTitles() ? R.string.library : R.string.albums); - if (getAdapter().getDataSet().isEmpty()) { - presenter.subscribe(); + @NonNull + @Override + protected AlbumAdapter createAdapter() { + int itemLayoutRes = getItemLayoutRes(); + notifyLayoutResChanged(itemLayoutRes); + if (itemLayoutRes != R.layout.item_list) { + //noinspection ConstantConditions + itemLayoutRes = PreferenceUtil.getInstance(getContext()).getAlbumGridStyle(getContext()); + } + ArrayList dataSet = + getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); + return new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, + loadUsePalette(), getLibraryFragment()); } - } - @Override - public void onDestroy() { - super.onDestroy(); - presenter.unsubscribe(); - } + @Override + protected int getEmptyMessage() { + return R.string.no_albums; + } - @Override - public void loading() { - } + @Override + public boolean loadUsePalette() { + //noinspection ConstantConditions + return PreferenceUtil.getInstance(getActivity()).albumColoredFooters(); + } - @Override - public void showEmptyView() { - getAdapter().swapDataSet(new ArrayList<>()); - } + @Override + protected void setUsePalette(boolean usePalette) { + getAdapter().usePalette(usePalette); + } - @Override - public void completed() { - } + @Override + protected void setGridSize(int gridSize) { + getLayoutManager().setSpanCount(gridSize); + getAdapter().notifyDataSetChanged(); + } - @Override - public void showData(ArrayList albums) { - getAdapter().swapDataSet(albums); - } + @Override + protected void setSortOrder(String sortOrder) { + presenter.loadAlbums(); + } + + @Override + protected String loadSortOrder() { + //noinspection ConstantConditions + return PreferenceUtil.getInstance(getActivity()).getAlbumSortOrder(); + } + + @Override + protected void saveSortOrder(String sortOrder) { + //noinspection ConstantConditions + PreferenceUtil.getInstance(getActivity()).setAlbumSortOrder(sortOrder); + } + + @Override + protected int loadGridSize() { + //noinspection ConstantConditions + return PreferenceUtil.getInstance(getActivity()).getAlbumGridSize(getActivity()); + } + + @Override + protected void saveGridSize(int gridSize) { + //noinspection ConstantConditions + PreferenceUtil.getInstance(getActivity()).setAlbumGridSize(gridSize); + } + + @Override + protected int loadGridSizeLand() { + //noinspection ConstantConditions + return PreferenceUtil.getInstance(getActivity()).getAlbumGridSizeLand(getActivity()); + } + + @Override + protected void saveGridSizeLand(int gridSize) { + //noinspection ConstantConditions + PreferenceUtil.getInstance(getActivity()).setAlbumGridSizeLand(gridSize); + } + + @Override + protected void saveUsePalette(boolean usePalette) { + //noinspection ConstantConditions + PreferenceUtil.getInstance(getActivity()).setAlbumColoredFooters(usePalette); + } + + @Override + public void onMediaStoreChanged() { + presenter.loadAlbums(); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + presenter = new AlbumPresenter(this); + } + + @Override + public void setMenuVisibility(boolean menuVisible) { + super.setMenuVisibility(menuVisible); + if (menuVisible) { + //noinspection ConstantConditions + getLibraryFragment().setTitle( + PreferenceUtil.getInstance(getContext()).tabTitles() ? R.string.library + : R.string.albums); + } + } + + @Override + public void onResume() { + super.onResume(); + //noinspection ConstantConditions + getLibraryFragment().setTitle( + PreferenceUtil.getInstance(getContext()).tabTitles() ? R.string.library : R.string.albums); + if (getAdapter().getDataSet().isEmpty()) { + presenter.subscribe(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + presenter.unsubscribe(); + } + + @Override + public void loading() { + } + + @Override + public void showEmptyView() { + getAdapter().swapDataSet(new ArrayList<>()); + } + + @Override + public void completed() { + } + + @Override + public void showData(ArrayList albums) { + getAdapter().swapDataSet(albums); + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/LibraryFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/LibraryFragment.java index 92553498f..28209a635 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/LibraryFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/LibraryFragment.java @@ -7,7 +7,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; @@ -19,12 +18,18 @@ import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; + +import com.afollestad.materialcab.MaterialCab; + import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; import butterknife.Unbinder; import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.common.ATHToolbarActivity; import code.name.monkey.appthemehelper.util.ATHUtil; +import code.name.monkey.appthemehelper.util.TintHelper; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog; @@ -40,416 +45,424 @@ import code.name.monkey.retromusic.ui.fragments.base.AbsMainActivityFragment; import code.name.monkey.retromusic.util.NavigationUtil; import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.RetroUtil; -import com.afollestad.materialcab.MaterialCab; +import code.name.monkey.retromusic.views.IconImageView; public class LibraryFragment extends AbsMainActivityFragment implements CabHolder, - MainActivityFragmentCallbacks { + MainActivityFragmentCallbacks { - private static final String TAG = "LibraryFragment"; - private static final String CURRENT_TAB_ID = "current_tab_id"; - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.app_bar) - AppBarLayout appbar; - @BindView(R.id.collapsing_toolbar) - CollapsingToolbarLayout collapsingToolbarLayout; + public static final String TAG = "LibraryFragment"; + private static final String CURRENT_TAB_ID = "current_tab_id"; + @BindView(R.id.toolbar) + Toolbar toolbar; + @BindView(R.id.app_bar) + AppBarLayout appbar; + @BindView(R.id.title) + TextView title; + @BindView(R.id.search) + IconImageView search; - private Unbinder unBinder; - private MaterialCab cab; - private FragmentManager fragmentManager; + private Unbinder unBinder; + private MaterialCab cab; + private FragmentManager fragmentManager; - public static Fragment newInstance(int tab) { - Bundle args = new Bundle(); - args.putInt(CURRENT_TAB_ID, tab); - LibraryFragment fragment = new LibraryFragment(); - fragment.setArguments(args); - return fragment; - } - - public void setTitle(@StringRes int name) { - collapsingToolbarLayout.setTitle(getString(name)); - } - - public void addOnAppBarOffsetChangedListener( - AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { - appbar.addOnOffsetChangedListener(onOffsetChangedListener); - } - - public void removeOnAppBarOffsetChangedListener( - AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { - appbar.removeOnOffsetChangedListener(onOffsetChangedListener); - } - - public int getTotalAppBarScrollingRange() { - return appbar.getTotalScrollRange(); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_library, container, false); - unBinder = ButterKnife.bind(this, view); - return view; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - setStatusbarColorAuto(view); - getMainActivity().setBottomBarVisibility(View.VISIBLE); - setupToolbar(); - - inflateFragment(); - } - - private void inflateFragment() { - if (getArguments() == null) { - selectedFragment(SongsFragment.newInstance()); - return; - } - switch (getArguments().getInt(CURRENT_TAB_ID)) { - default: - case R.id.action_song: - selectedFragment(SongsFragment.newInstance()); - break; - case R.id.action_album: - selectedFragment(AlbumsFragment.newInstance()); - break; - case R.id.action_artist: - selectedFragment(ArtistsFragment.newInstance()); - break; - case R.id.action_playlist: - selectedFragment(PlaylistsFragment.newInstance()); - break; - } - } - - @SuppressWarnings("ConstantConditions") - private void setupToolbar() { - int primaryColor = ThemeStore.primaryColor(getContext()); - appbar.setBackgroundColor(primaryColor); - toolbar.setBackgroundColor(primaryColor); - appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> - getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext()))); - getMainActivity().setTitle(R.string.app_name); - getMainActivity().setSupportActionBar(toolbar); - } - - public Fragment getCurrentFragment() { - if (fragmentManager == null) { - return SongsFragment.newInstance(); - } - return fragmentManager.findFragmentByTag(LibraryFragment.TAG); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - unBinder.unbind(); - } - - @Override - public boolean handleBackPress() { - if (cab != null && cab.isActive()) { - cab.finish(); - return true; - } - return false; - } - - public void selectedFragment(Fragment fragment) { - fragmentManager = getChildFragmentManager(); - FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - - fragmentTransaction - .replace(R.id.fragment_container, fragment, TAG) - .commit(); - } - - @NonNull - @Override - public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) { - if (cab != null && cab.isActive()) { - cab.finish(); - } - //noinspection ConstantConditions - cab = new MaterialCab(getMainActivity(), R.id.cab_stub) - .setMenu(menuRes) - .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor( - RetroColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(getActivity()))) - .start(callback); - return cab; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.menu_main, menu); - - Fragment currentFragment = getCurrentFragment(); - if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment - && currentFragment.isAdded()) { - AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment; - - MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size); - if (RetroUtil.isLandscape(getResources())) { - gridSizeItem.setTitle(R.string.action_grid_size_land); - } - setUpGridSizeMenu(fragment, gridSizeItem.getSubMenu()); - - setUpSortOrderMenu(fragment, menu.findItem(R.id.action_sort_order).getSubMenu()); - - } else { - menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title); - menu.removeItem(R.id.action_grid_size); - } - Activity activity = getActivity(); - if (activity == null) { - return; - } - ToolbarContentTintHelper.handleOnCreateOptionsMenu(getActivity(), toolbar, menu, - ATHToolbarActivity.getToolbarBackgroundColor(toolbar)); - } - - 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(SortOrder.AlbumSortOrder.ALBUM_A_Z)); - sortOrderMenu.add(0, R.id.action_album_sort_order_desc, 1, R.string.sort_order_z_a) - .setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_Z_A)); - sortOrderMenu.add(0, R.id.action_album_sort_order_artist, 2, R.string.sort_order_artist) - .setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_ARTIST)); - sortOrderMenu.add(0, R.id.action_album_sort_order_year, 3, R.string.sort_order_year) - .setChecked(currentSortOrder.equals(SortOrder.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(SortOrder.ArtistSortOrder.ARTIST_A_Z)); - sortOrderMenu.add(0, R.id.action_artist_sort_order_desc, 1, R.string.sort_order_z_a) - .setChecked(currentSortOrder.equals(SortOrder.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(SortOrder.SongSortOrder.SONG_A_Z)); - sortOrderMenu.add(0, R.id.action_song_sort_order_desc, 1, R.string.sort_order_z_a) - .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_Z_A)); - sortOrderMenu.add(0, R.id.action_song_sort_order_artist, 2, R.string.sort_order_artist) - .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_ARTIST)); - sortOrderMenu.add(0, R.id.action_song_sort_order_album, 3, R.string.sort_order_album) - .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_ALBUM)); - sortOrderMenu.add(0, R.id.action_song_sort_order_year, 4, R.string.sort_order_year) - .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_YEAR)); - sortOrderMenu.add(0, R.id.action_song_sort_order_date, 4, R.string.sort_order_date) - .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_DATE)); + public static Fragment newInstance(int tab) { + Bundle args = new Bundle(); + args.putInt(CURRENT_TAB_ID, tab); + LibraryFragment fragment = new LibraryFragment(); + fragment.setArguments(args); + return fragment; } - sortOrderMenu.setGroupCheckable(0, true, true); - } - - 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 = SortOrder.AlbumSortOrder.ALBUM_A_Z; - break; - case R.id.action_album_sort_order_desc: - sortOrder = SortOrder.AlbumSortOrder.ALBUM_Z_A; - break; - case R.id.action_album_sort_order_artist: - sortOrder = SortOrder.AlbumSortOrder.ALBUM_ARTIST; - break; - case R.id.action_album_sort_order_year: - sortOrder = SortOrder.AlbumSortOrder.ALBUM_YEAR; - break; - } - } else if (fragment instanceof ArtistsFragment) { - switch (item.getItemId()) { - case R.id.action_artist_sort_order_asc: - sortOrder = SortOrder.ArtistSortOrder.ARTIST_A_Z; - break; - case R.id.action_artist_sort_order_desc: - sortOrder = SortOrder.ArtistSortOrder.ARTIST_Z_A; - break; - } - } else if (fragment instanceof SongsFragment) { - switch (item.getItemId()) { - case R.id.action_song_sort_order_asc: - sortOrder = SortOrder.SongSortOrder.SONG_A_Z; - break; - case R.id.action_song_sort_order_desc: - sortOrder = SortOrder.SongSortOrder.SONG_Z_A; - break; - case R.id.action_song_sort_order_artist: - sortOrder = SortOrder.SongSortOrder.SONG_ARTIST; - break; - case R.id.action_song_sort_order_album: - sortOrder = SortOrder.SongSortOrder.SONG_ALBUM; - break; - case R.id.action_song_sort_order_year: - sortOrder = SortOrder.SongSortOrder.SONG_YEAR; - break; - case R.id.action_song_sort_order_date: - sortOrder = SortOrder.SongSortOrder.SONG_DATE; - break; - } + public void setTitle(@StringRes int name) { + title.setText(getString(name)); } - if (sortOrder != null) { - item.setChecked(true); - fragment.setAndSaveSortOrder(sortOrder); - return true; + public void addOnAppBarOffsetChangedListener( + AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { + appbar.addOnOffsetChangedListener(onOffsetChangedListener); } - return false; - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - Activity activity = getActivity(); - if (activity == null) { - return; + public void removeOnAppBarOffsetChangedListener( + AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { + appbar.removeOnOffsetChangedListener(onOffsetChangedListener); } - ToolbarContentTintHelper.handleOnPrepareOptionsMenu(activity, toolbar); - } - @SuppressWarnings("ConstantConditions") - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - //if (pager == null) return false; - Fragment currentFragment = getCurrentFragment(); - if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment) { - AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment; - if (handleGridSizeMenuItem(fragment, item)) { - return true; - } - if (handleSortOrderMenuItem(fragment, item)) { - return true; - } + public int getTotalAppBarScrollingRange() { + return appbar.getTotalScrollRange(); } - int id = item.getItemId(); - switch (id) { - case R.id.action_new_playlist: - CreatePlaylistDialog.create().show(getChildFragmentManager(), "CREATE_PLAYLIST"); - return true; - case R.id.action_shuffle_all: - MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(getContext()) - .blockingFirst(), true); - return true; - case R.id.action_search: - NavigationUtil.goToSearch(getMainActivity()); - break; - case R.id.action_equalizer: - NavigationUtil.openEqualizer(getActivity()); - return true; - case R.id.action_sleep_timer: - if (getFragmentManager() != null) { - new SleepTimerDialog().show(getFragmentManager(), TAG); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_library, container, false); + unBinder = ButterKnife.bind(this, view); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setStatusbarColorAuto(view); + getMainActivity().setBottomBarVisibility(View.VISIBLE); + setupToolbar(); + inflateFragment(); + } + + private void inflateFragment() { + if (getArguments() == null) { + selectedFragment(SongsFragment.newInstance()); + return; + } + switch (getArguments().getInt(CURRENT_TAB_ID)) { + default: + case R.id.action_song: + selectedFragment(SongsFragment.newInstance()); + break; + case R.id.action_album: + selectedFragment(AlbumsFragment.newInstance()); + break; + case R.id.action_artist: + selectedFragment(ArtistsFragment.newInstance()); + break; + case R.id.action_playlist: + selectedFragment(PlaylistsFragment.newInstance()); + break; } - return true; - case R.id.action_settings: - startActivity(new Intent(getContext(), SettingsActivity.class)); - break; - } - return super.onOptionsItemSelected(item); - } - - - 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 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; + @SuppressWarnings("ConstantConditions") + private void setupToolbar() { + title.setTextColor(ThemeStore.textColorPrimary(getContext())); + TintHelper.setTintAuto(search, ThemeStore.textColorSecondary(getContext()), false); + + int primaryColor = ThemeStore.primaryColor(getContext()); + appbar.setBackgroundColor(primaryColor); + toolbar.setBackgroundColor(primaryColor); + appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> + getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext()))); + getMainActivity().setTitle(null); + getMainActivity().setSupportActionBar(toolbar); + } + + public Fragment getCurrentFragment() { + if (fragmentManager == null) { + return SongsFragment.newInstance(); + } + return fragmentManager.findFragmentByTag(LibraryFragment.TAG); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unBinder.unbind(); + } + + @Override + public boolean handleBackPress() { + if (cab != null && cab.isActive()) { + cab.finish(); + return true; + } + return false; + } + + public void selectedFragment(Fragment fragment) { + fragmentManager = getChildFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + + fragmentTransaction + .replace(R.id.fragment_container, fragment, TAG) + .commit(); + } + + @NonNull + @Override + public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) { + if (cab != null && cab.isActive()) { + cab.finish(); + } + //noinspection ConstantConditions + cab = new MaterialCab(getMainActivity(), R.id.cab_stub) + .setMenu(menuRes) + .setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(getActivity()))) + .start(callback); + return cab; + } + + @OnClick(R.id.search) + void search() { + NavigationUtil.goToSearch(getActivity()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.menu_main, menu); + + Fragment currentFragment = getCurrentFragment(); + if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment + && currentFragment.isAdded()) { + AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment; + + MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size); + if (RetroUtil.isLandscape(getResources())) { + gridSizeItem.setTitle(R.string.action_grid_size_land); + } + setUpGridSizeMenu(fragment, gridSizeItem.getSubMenu()); + + setUpSortOrderMenu(fragment, menu.findItem(R.id.action_sort_order).getSubMenu()); + + } else { + menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title); + menu.removeItem(R.id.action_grid_size); + } + Activity activity = getActivity(); + if (activity == null) { + return; + } + ToolbarContentTintHelper.handleOnCreateOptionsMenu(getActivity(), toolbar, menu, + ATHToolbarActivity.getToolbarBackgroundColor(toolbar)); + } + + 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(SortOrder.AlbumSortOrder.ALBUM_A_Z)); + sortOrderMenu.add(0, R.id.action_album_sort_order_desc, 1, R.string.sort_order_z_a) + .setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_Z_A)); + sortOrderMenu.add(0, R.id.action_album_sort_order_artist, 2, R.string.sort_order_artist) + .setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_ARTIST)); + sortOrderMenu.add(0, R.id.action_album_sort_order_year, 3, R.string.sort_order_year) + .setChecked(currentSortOrder.equals(SortOrder.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(SortOrder.ArtistSortOrder.ARTIST_A_Z)); + sortOrderMenu.add(0, R.id.action_artist_sort_order_desc, 1, R.string.sort_order_z_a) + .setChecked(currentSortOrder.equals(SortOrder.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(SortOrder.SongSortOrder.SONG_A_Z)); + sortOrderMenu.add(0, R.id.action_song_sort_order_desc, 1, R.string.sort_order_z_a) + .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_Z_A)); + sortOrderMenu.add(0, R.id.action_song_sort_order_artist, 2, R.string.sort_order_artist) + .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_ARTIST)); + sortOrderMenu.add(0, R.id.action_song_sort_order_album, 3, R.string.sort_order_album) + .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_ALBUM)); + sortOrderMenu.add(0, R.id.action_song_sort_order_year, 4, R.string.sort_order_year) + .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_YEAR)); + sortOrderMenu.add(0, R.id.action_song_sort_order_date, 4, R.string.sort_order_date) + .setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_DATE)); + } + + sortOrderMenu.setGroupCheckable(0, true, true); + } + + 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 = SortOrder.AlbumSortOrder.ALBUM_A_Z; + break; + case R.id.action_album_sort_order_desc: + sortOrder = SortOrder.AlbumSortOrder.ALBUM_Z_A; + break; + case R.id.action_album_sort_order_artist: + sortOrder = SortOrder.AlbumSortOrder.ALBUM_ARTIST; + break; + case R.id.action_album_sort_order_year: + sortOrder = SortOrder.AlbumSortOrder.ALBUM_YEAR; + break; + } + } else if (fragment instanceof ArtistsFragment) { + switch (item.getItemId()) { + case R.id.action_artist_sort_order_asc: + sortOrder = SortOrder.ArtistSortOrder.ARTIST_A_Z; + break; + case R.id.action_artist_sort_order_desc: + sortOrder = SortOrder.ArtistSortOrder.ARTIST_Z_A; + break; + } + } else if (fragment instanceof SongsFragment) { + switch (item.getItemId()) { + case R.id.action_song_sort_order_asc: + sortOrder = SortOrder.SongSortOrder.SONG_A_Z; + break; + case R.id.action_song_sort_order_desc: + sortOrder = SortOrder.SongSortOrder.SONG_Z_A; + break; + case R.id.action_song_sort_order_artist: + sortOrder = SortOrder.SongSortOrder.SONG_ARTIST; + break; + case R.id.action_song_sort_order_album: + sortOrder = SortOrder.SongSortOrder.SONG_ALBUM; + break; + case R.id.action_song_sort_order_year: + sortOrder = SortOrder.SongSortOrder.SONG_YEAR; + break; + case R.id.action_song_sort_order_date: + sortOrder = SortOrder.SongSortOrder.SONG_DATE; + break; + } + } + + if (sortOrder != null) { + item.setChecked(true); + fragment.setAndSaveSortOrder(sortOrder); + return true; + } + + return false; + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + Activity activity = getActivity(); + if (activity == null) { + return; + } + ToolbarContentTintHelper.handleOnPrepareOptionsMenu(activity, toolbar); + } + + @SuppressWarnings("ConstantConditions") + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + //if (pager == null) return false; + Fragment currentFragment = getCurrentFragment(); + if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment) { + AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment; + if (handleGridSizeMenuItem(fragment, item)) { + return true; + } + if (handleSortOrderMenuItem(fragment, item)) { + return true; + } + } + int id = item.getItemId(); + switch (id) { + case R.id.action_new_playlist: + CreatePlaylistDialog.create().show(getChildFragmentManager(), "CREATE_PLAYLIST"); + return true; + case R.id.action_shuffle_all: + MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(getContext()) + .blockingFirst(), true); + return true; + case R.id.action_search: + NavigationUtil.goToSearch(getMainActivity()); + break; + case R.id.action_equalizer: + NavigationUtil.openEqualizer(getActivity()); + return true; + case R.id.action_sleep_timer: + if (getFragmentManager() != null) { + new SleepTimerDialog().show(getFragmentManager(), TAG); + } + return true; + case R.id.action_settings: + startActivity(new Intent(getContext(), SettingsActivity.class)); + break; + } + return super.onOptionsItemSelected(item); + } + + + 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 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; } - return false; - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java index 19a04fb4d..5db70b856 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java @@ -26,6 +26,21 @@ import android.webkit.MimeTypeMap; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; + +import com.afollestad.materialcab.MaterialCab; +import com.afollestad.materialdialogs.MaterialDialog; +import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; @@ -53,710 +68,692 @@ import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.ViewUtil; import code.name.monkey.retromusic.views.BreadCrumbLayout; -import com.afollestad.materialcab.MaterialCab; -import com.afollestad.materialdialogs.MaterialDialog; -import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; public class FoldersFragment extends AbsMainActivityFragment implements - MainActivityFragmentCallbacks, - CabHolder, BreadCrumbLayout.SelectionCallback, SongFileAdapter.Callbacks, - AppBarLayout.OnOffsetChangedListener, LoaderManager.LoaderCallbacks> { + MainActivityFragmentCallbacks, + CabHolder, BreadCrumbLayout.SelectionCallback, SongFileAdapter.Callbacks, + AppBarLayout.OnOffsetChangedListener, LoaderManager.LoaderCallbacks> { - public static final String TAG = FoldersFragment.class.getSimpleName(); - public static final FileFilter AUDIO_FILE_FILTER = file -> !file.isHidden() && (file.isDirectory() - || - FileUtil.fileIsMimeType(file, "audio/*", MimeTypeMap.getSingleton()) || - FileUtil.fileIsMimeType(file, "application/opus", MimeTypeMap.getSingleton()) || - FileUtil.fileIsMimeType(file, "application/ogg", MimeTypeMap.getSingleton())); + public static final String TAG = FoldersFragment.class.getSimpleName(); + public static final FileFilter AUDIO_FILE_FILTER = file -> !file.isHidden() && (file.isDirectory() + || + FileUtil.fileIsMimeType(file, "audio/*", MimeTypeMap.getSingleton()) || + FileUtil.fileIsMimeType(file, "application/opus", MimeTypeMap.getSingleton()) || + FileUtil.fileIsMimeType(file, "application/ogg", MimeTypeMap.getSingleton())); - protected static final String PATH = "path"; - protected static final String CRUMBS = "crumbs"; - private static final int LOADER_ID = LoaderIds.FOLDERS_FRAGMENT; - @BindView(R.id.coordinator_layout) - CoordinatorLayout coordinatorLayout; - @BindView(R.id.container) - View container; - @BindView(R.id.title) - TextView title; - @BindView(android.R.id.empty) - View empty; - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.bread_crumbs) - BreadCrumbLayout breadCrumbs; - @BindView(R.id.appbar) - AppBarLayout appbar; + protected static final String PATH = "path"; + protected static final String CRUMBS = "crumbs"; + private static final int LOADER_ID = LoaderIds.FOLDERS_FRAGMENT; + @BindView(R.id.coordinator_layout) + CoordinatorLayout coordinatorLayout; + @BindView(R.id.container) + View container; + @BindView(R.id.title) + TextView title; + @BindView(android.R.id.empty) + View empty; + @BindView(R.id.toolbar) + Toolbar toolbar; + @BindView(R.id.bread_crumbs) + BreadCrumbLayout breadCrumbs; + @BindView(R.id.appbar) + AppBarLayout appbar; + @BindView(R.id.recycler_view) + FastScrollRecyclerView recyclerView; - @BindView(R.id.recycler_view) - FastScrollRecyclerView recyclerView; + Comparator fileComparator = (lhs, rhs) -> { + if (lhs.isDirectory() && !rhs.isDirectory()) { + return -1; + } else if (!lhs.isDirectory() && rhs.isDirectory()) { + return 1; + } else { + return lhs.getName().compareToIgnoreCase + (rhs.getName()); + } + }; - Comparator fileComparator = (lhs, rhs) -> { - if (lhs.isDirectory() && !rhs.isDirectory()) { - return -1; - } else if (!lhs.isDirectory() && rhs.isDirectory()) { - return 1; - } else { - return lhs.getName().compareToIgnoreCase - (rhs.getName()); + private Unbinder unbinder; + private SongFileAdapter adapter; + private MaterialCab cab; + + public FoldersFragment() { } - }; - private Unbinder unbinder; - private SongFileAdapter adapter; - private MaterialCab cab; - - public FoldersFragment() { - } - - public static FoldersFragment newInstance(Context context) { - return newInstance(PreferenceUtil.getInstance(context).getStartDirectory()); - } - - public static FoldersFragment newInstance(File directory) { - FoldersFragment frag = new FoldersFragment(); - Bundle b = new Bundle(); - b.putSerializable(PATH, directory); - frag.setArguments(b); - return frag; - } - - - public static File getDefaultStartDirectory() { - File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); - File startFolder; - if (musicDir.exists() && musicDir.isDirectory()) { - startFolder = musicDir; - } else { - File externalStorage = Environment.getExternalStorageDirectory(); - if (externalStorage.exists() && externalStorage.isDirectory()) { - startFolder = externalStorage; - } else { - startFolder = new File("/"); // root - } + public static FoldersFragment newInstance(Context context) { + return newInstance(PreferenceUtil.getInstance(context).getStartDirectory()); } - return startFolder; - } - private static File tryGetCanonicalFile(File file) { - try { - return file.getCanonicalFile(); - } catch (IOException e) { - e.printStackTrace(); - return file; + public static FoldersFragment newInstance(File directory) { + FoldersFragment frag = new FoldersFragment(); + Bundle b = new Bundle(); + b.putSerializable(PATH, directory); + frag.setArguments(b); + return frag; } - } - public void setCrumb(BreadCrumbLayout.Crumb crumb, boolean addToHistory) { - if (crumb == null) { - return; + + public static File getDefaultStartDirectory() { + File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); + File startFolder; + if (musicDir.exists() && musicDir.isDirectory()) { + startFolder = musicDir; + } else { + File externalStorage = Environment.getExternalStorageDirectory(); + if (externalStorage.exists() && externalStorage.isDirectory()) { + startFolder = externalStorage; + } else { + startFolder = new File("/"); // root + } + } + return startFolder; } - saveScrollPosition(); - breadCrumbs.setActiveOrAdd(crumb, false); - if (addToHistory) { - breadCrumbs.addHistory(crumb); + + private static File tryGetCanonicalFile(File file) { + try { + return file.getCanonicalFile(); + } catch (IOException e) { + e.printStackTrace(); + return file; + } } - getLoaderManager().restartLoader(LOADER_ID, null, this); - } - private void saveScrollPosition() { - BreadCrumbLayout.Crumb crumb = getActiveCrumb(); - if (crumb != null) { - crumb.setScrollPosition( - ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition()); + public void setCrumb(BreadCrumbLayout.Crumb crumb, boolean addToHistory) { + if (crumb == null) { + return; + } + saveScrollPosition(); + breadCrumbs.setActiveOrAdd(crumb, false); + if (addToHistory) { + breadCrumbs.addHistory(crumb); + } + getLoaderManager().restartLoader(LOADER_ID, null, this); } - } - @Nullable - private BreadCrumbLayout.Crumb getActiveCrumb() { - return breadCrumbs != null && breadCrumbs.size() > 0 ? breadCrumbs - .getCrumb(breadCrumbs.getActiveIndex()) : null; - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(CRUMBS, breadCrumbs.getStateWrapper()); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (savedInstanceState == null) { - //noinspection ConstantConditions - setCrumb(new BreadCrumbLayout.Crumb( - FileUtil.safeGetCanonicalFile((File) getArguments().getSerializable(PATH))), true); - } else { - breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS)); - getLoaderManager().initLoader(LOADER_ID, null, this); - } - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_folder, container, false); - unbinder = ButterKnife.bind(this, view); - return view; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - setStatusbarColorAuto(view); - getMainActivity().getSlidingUpPanelLayout().setShadowHeight(0); - getMainActivity().setBottomBarVisibility(View.GONE); - - setUpAppbarColor(); - setUpToolbar(); - setUpBreadCrumbs(); - setUpRecyclerView(); - setUpAdapter(); - - } - - private void setUpAppbarColor() { - //noinspection ConstantConditions - int primaryColor = ThemeStore.primaryColor(getActivity()); - TintHelper.setTintAuto(container, primaryColor, true); - appbar.setBackgroundColor(ColorUtil.darkenColor(primaryColor)); - toolbar.setBackgroundColor(ColorUtil.darkenColor(primaryColor)); - //breadCrumbs.setBackgroundColor(primaryColor); - breadCrumbs.setActivatedContentColor( - ToolbarContentTintHelper - .toolbarTitleColor(getActivity(), ColorUtil.darkenColor(primaryColor))); - breadCrumbs.setDeactivatedContentColor( - ToolbarContentTintHelper - .toolbarSubtitleColor(getActivity(), ColorUtil.darkenColor(primaryColor))); - appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> getMainActivity() - .setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext()))); - } - - private void setUpToolbar() { - //noinspection ConstantConditions - title.setTextColor(ThemeStore.textColorPrimary(getContext())); - toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); - //noinspection ConstantConditions - getActivity().setTitle(R.string.folders); - getMainActivity().setSupportActionBar(toolbar); - } - - private void setUpBreadCrumbs() { - breadCrumbs.setCallback(this); - } - - private void setUpRecyclerView() { - //noinspection ConstantConditions - ViewUtil.setUpFastScrollRecyclerViewColor(getActivity(), recyclerView, - ThemeStore.accentColor(getActivity())); - recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - appbar.addOnOffsetChangedListener(this); - } - - private void setUpAdapter() { - adapter = new SongFileAdapter(getMainActivity(), new LinkedList(), R.layout.item_list, - this, this); - adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - super.onChanged(); - checkIsEmpty(); - } - }); - recyclerView.setAdapter(adapter); - checkIsEmpty(); - } - - @Override - public void onPause() { - super.onPause(); - saveScrollPosition(); - } - - @Override - public void onDestroyView() { - appbar.removeOnOffsetChangedListener(this); - unbinder.unbind(); - super.onDestroyView(); - } - - @Override - public boolean handleBackPress() { - if (cab != null && cab.isActive()) { - cab.finish(); - return true; - } - if (breadCrumbs != null && breadCrumbs.popHistory()) { - setCrumb(breadCrumbs.lastHistory(), false); - return true; - } - return false; - } - - @NonNull - @Override - public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) { - if (cab != null && cab.isActive()) { - cab.finish(); - } - cab = new MaterialCab(getMainActivity(), R.id.cab_stub) - .setMenu(menuRes) - .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(RetroColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor - (getActivity()))) - .start(callback); - return cab; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.menu_folders, menu); - ToolbarContentTintHelper.handleOnCreateOptionsMenu(getActivity(), toolbar, menu, - ATHToolbarActivity.getToolbarBackgroundColor(toolbar)); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - ToolbarContentTintHelper.handleOnPrepareOptionsMenu(getActivity(), toolbar); - } - - @Override - public void onCrumbSelection(BreadCrumbLayout.Crumb crumb, int index) { - setCrumb(crumb, true); - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - //noinspection ConstantConditions - getActivity().onBackPressed(); - break; - case R.id.action_go_to_start_directory: - setCrumb(new BreadCrumbLayout.Crumb( - tryGetCanonicalFile(PreferenceUtil.getInstance(getActivity()).getStartDirectory())), - true); - return true; - case R.id.action_scan: + private void saveScrollPosition() { BreadCrumbLayout.Crumb crumb = getActiveCrumb(); if (crumb != null) { - //noinspection Convert2MethodRef - new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) - .execute(new ListPathsAsyncTask.LoadingInfo(crumb.getFile(), AUDIO_FILE_FILTER)); + crumb.setScrollPosition( + ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition()); } - return true; } - return super.onOptionsItemSelected(item); - } - @Override - public void onFileSelected(File file) { - file = tryGetCanonicalFile(file); // important as we compare the path value later - if (file.isDirectory()) { - setCrumb(new BreadCrumbLayout.Crumb(file), true); - } else { - FileFilter fileFilter = pathname -> !pathname.isDirectory() && AUDIO_FILE_FILTER - .accept(pathname); - new ListSongsAsyncTask(getActivity(), file, (songs, extra) -> { - File file1 = (File) extra; - int startIndex = -1; - for (int i = 0; i < songs.size(); i++) { - if (file1.getPath().equals(songs.get(i).data)) { // path is already canonical here - startIndex = i; - break; - } - } - if (startIndex > -1) { - MusicPlayerRemote.openQueue(songs, startIndex, true); + @Nullable + private BreadCrumbLayout.Crumb getActiveCrumb() { + return breadCrumbs != null && breadCrumbs.size() > 0 ? breadCrumbs + .getCrumb(breadCrumbs.getActiveIndex()) : null; + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(CRUMBS, breadCrumbs.getStateWrapper()); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (savedInstanceState == null) { + //noinspection ConstantConditions + setCrumb(new BreadCrumbLayout.Crumb( + FileUtil.safeGetCanonicalFile((File) getArguments().getSerializable(PATH))), true); } else { - final File finalFile = file1; - Snackbar.make(coordinatorLayout, Html.fromHtml( - String.format(getString(R.string.not_listed_in_media_store), file1.getName())), - Snackbar.LENGTH_LONG) - .setAction(R.string.action_scan, - v -> new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) - .execute(new ListPathsAsyncTask.LoadingInfo(finalFile, AUDIO_FILE_FILTER))) - .setActionTextColor(ThemeStore.accentColor(getActivity())) - .show(); + breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS)); + getLoaderManager().initLoader(LOADER_ID, null, this); } - }).execute(new ListSongsAsyncTask.LoadingInfo(toList(file.getParentFile()), fileFilter, - getFileComparator())); - } - } - - @Override - public void onMultipleItemAction(MenuItem item, ArrayList files) { - final int itemId = item.getItemId(); - new ListSongsAsyncTask(getActivity(), null, - (songs, extra) -> SongsMenuHelper.handleMenuClick(getActivity(), songs, itemId)) - .execute(new ListSongsAsyncTask.LoadingInfo(files, AUDIO_FILE_FILTER, getFileComparator())); - } - - private ArrayList toList(File file) { - ArrayList files = new ArrayList<>(1); - files.add(file); - return files; - } - - private Comparator getFileComparator() { - return fileComparator; - } - - @Override - public void onFileMenuClicked(final File file, View view) { - PopupMenu popupMenu = new PopupMenu(getActivity(), view); - if (file.isDirectory()) { - popupMenu.inflate(R.menu.menu_item_directory); - popupMenu.setOnMenuItemClickListener(item -> { - final int itemId = item.getItemId(); - switch (itemId) { - case R.id.action_play_next: - case R.id.action_add_to_current_playing: - case R.id.action_add_to_playlist: - case R.id.action_delete_from_device: - new ListSongsAsyncTask(getActivity(), null, (songs, extra) -> { - if (!songs.isEmpty()) { - SongsMenuHelper.handleMenuClick(getActivity(), songs, itemId); - } - }).execute(new ListSongsAsyncTask.LoadingInfo(toList(file), AUDIO_FILE_FILTER, - getFileComparator())); - return true; - case R.id.action_set_as_start_directory: - PreferenceUtil.getInstance(getActivity()).setStartDirectory(file); - Toast.makeText(getActivity(), - String.format(getString(R.string.new_start_directory), file.getPath()), - Toast.LENGTH_SHORT).show(); - return true; - case R.id.action_scan: - new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) - .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); - return true; - } - return false; - }); - } else { - popupMenu.inflate(R.menu.menu_item_file); - popupMenu.setOnMenuItemClickListener(item -> { - final int itemId = item.getItemId(); - switch (itemId) { - case R.id.action_play_next: - case R.id.action_add_to_current_playing: - case R.id.action_add_to_playlist: - case R.id.action_go_to_album: - case R.id.action_go_to_artist: - case R.id.action_share: - case R.id.action_tag_editor: - case R.id.action_details: - case R.id.action_set_as_ringtone: - case R.id.action_delete_from_device: - new ListSongsAsyncTask(getActivity(), null, (songs, extra) -> SongMenuHelper - .handleMenuClick(getActivity(), songs.get(0), itemId)).execute( - new ListSongsAsyncTask.LoadingInfo(toList(file), AUDIO_FILE_FILTER, - getFileComparator())); - return true; - case R.id.action_scan: - new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) - .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); - return true; - } - return false; - }); - } - popupMenu.show(); - } - - @Override - public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { - container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), - container.getPaddingRight(), appbar.getTotalScrollRange() + verticalOffset); - } - - private void checkIsEmpty() { - if (empty != null) { - empty - .setVisibility(adapter == null || adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); - } - } - - private void scanPaths(@Nullable String[] toBeScanned) { - if (getActivity() == null) { - return; - } - if (toBeScanned == null || toBeScanned.length < 1) { - Toast.makeText(getActivity(), R.string.nothing_to_scan, Toast.LENGTH_SHORT).show(); - } else { - MediaScannerConnection.scanFile(getActivity().getApplicationContext(), toBeScanned, null, - new UpdateToastMediaScannerCompletionListener(getActivity(), toBeScanned)); - } - } - - private void updateAdapter(@NonNull List files) { - adapter.swapDataSet(files); - BreadCrumbLayout.Crumb crumb = getActiveCrumb(); - if (crumb != null && recyclerView != null) { - ((LinearLayoutManager) recyclerView.getLayoutManager()) - .scrollToPositionWithOffset(crumb.getScrollPosition(), 0); - } - } - - @NonNull - @Override - public Loader> onCreateLoader(int id, Bundle args) { - return new AsyncFileLoader(this); - } - - @Override - public void onLoadFinished(@NonNull Loader> loader, List data) { - updateAdapter(data); - } - - @Override - public void onLoaderReset(@NonNull Loader> loader) { - updateAdapter(new LinkedList()); - } - - private static class AsyncFileLoader extends WrappedAsyncTaskLoader> { - - private WeakReference fragmentWeakReference; - - public AsyncFileLoader(FoldersFragment foldersFragment) { - super(foldersFragment.getActivity()); - fragmentWeakReference = new WeakReference<>(foldersFragment); } @Override - public List loadInBackground() { - FoldersFragment foldersFragment = fragmentWeakReference.get(); - File directory = null; - if (foldersFragment != null) { - BreadCrumbLayout.Crumb crumb = foldersFragment.getActiveCrumb(); - if (crumb != null) { - directory = crumb.getFile(); - } - } - if (directory != null) { - List files = FileUtil.listFiles(directory, AUDIO_FILE_FILTER); - Collections.sort(files, foldersFragment.getFileComparator()); - return files; - } else { - return new LinkedList<>(); - } - } - } - - private static class ListSongsAsyncTask extends - ListingFilesDialogAsyncTask> { - - private final Object extra; - private WeakReference contextWeakReference; - private WeakReference callbackWeakReference; - - ListSongsAsyncTask(Context context, Object extra, OnSongsListedCallback callback) { - super(context); - this.extra = extra; - contextWeakReference = new WeakReference<>(context); - callbackWeakReference = new WeakReference<>(callback); + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_folder, container, false); + unbinder = ButterKnife.bind(this, view); + return view; } @Override - protected void onPreExecute() { - super.onPreExecute(); - checkCallbackReference(); - checkContextReference(); + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + setStatusbarColorAuto(view); + getMainActivity().getSlidingUpPanelLayout().setShadowHeight(0); + getMainActivity().setBottomBarVisibility(View.GONE); + + setUpAppbarColor(); + setUpToolbar(); + setUpBreadCrumbs(); + setUpRecyclerView(); + setUpAdapter(); + } - @Override - protected ArrayList doInBackground(LoadingInfo... params) { - try { - LoadingInfo info = params[0]; - List files = FileUtil.listFilesDeep(info.files, info.fileFilter); - - if (isCancelled() || checkContextReference() == null - || checkCallbackReference() == null) { - return null; - } - - Collections.sort(files, info.fileComparator); - - Context context = checkContextReference(); - if (isCancelled() || context == null || checkCallbackReference() == null) { - return null; - } - - return FileUtil.matchFilesWithMediaStore(context, files).blockingFirst(); - } catch (Exception e) { - e.printStackTrace(); - cancel(false); - return null; - } + private void setUpAppbarColor() { + //noinspection ConstantConditions + int primaryColor = ThemeStore.primaryColor(getActivity()); + TintHelper.setTintAuto(container, primaryColor, true); + appbar.setBackgroundColor(primaryColor); + toolbar.setBackgroundColor(primaryColor); + //breadCrumbs.setBackgroundColor(primaryColor); + breadCrumbs.setActivatedContentColor(ToolbarContentTintHelper.toolbarTitleColor(getActivity(), ColorUtil.darkenColor(primaryColor))); + breadCrumbs.setDeactivatedContentColor(ToolbarContentTintHelper.toolbarSubtitleColor(getActivity(), ColorUtil.darkenColor(primaryColor))); + appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext()))); } - @Override - protected void onPostExecute(ArrayList songs) { - super.onPostExecute(songs); - OnSongsListedCallback callback = checkCallbackReference(); - if (songs != null && callback != null) { - callback.onSongsListed(songs, extra); - } + private void setUpToolbar() { + //noinspection ConstantConditions + title.setTextColor(ThemeStore.textColorPrimary(getContext())); + toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp); + //noinspection ConstantConditions + getActivity().setTitle(R.string.folders); + getMainActivity().setSupportActionBar(toolbar); } - private Context checkContextReference() { - Context context = contextWeakReference.get(); - if (context == null) { - cancel(false); - } - return context; + private void setUpBreadCrumbs() { + breadCrumbs.setCallback(this); } - private OnSongsListedCallback checkCallbackReference() { - OnSongsListedCallback callback = callbackWeakReference.get(); - if (callback == null) { - cancel(false); - } - return callback; + private void setUpRecyclerView() { + //noinspection ConstantConditions + ViewUtil.setUpFastScrollRecyclerViewColor(getActivity(), recyclerView, + ThemeStore.accentColor(getActivity())); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + appbar.addOnOffsetChangedListener(this); } - public interface OnSongsListedCallback { - - void onSongsListed(@NonNull ArrayList songs, Object extra); - } - - static class LoadingInfo { - - final Comparator fileComparator; - final FileFilter fileFilter; - final List files; - - LoadingInfo(@NonNull List files, @NonNull FileFilter fileFilter, - @NonNull Comparator fileComparator) { - this.fileComparator = fileComparator; - this.fileFilter = fileFilter; - this.files = files; - } - } - } - - public static class ListPathsAsyncTask extends - ListingFilesDialogAsyncTask { - - private WeakReference onPathsListedCallbackWeakReference; - - public ListPathsAsyncTask(Context context, OnPathsListedCallback callback) { - super(context); - onPathsListedCallbackWeakReference = new WeakReference<>(callback); - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - checkCallbackReference(); - } - - @Override - protected String[] doInBackground(LoadingInfo... params) { - try { - if (isCancelled() || checkCallbackReference() == null) { - return null; - } - - LoadingInfo info = params[0]; - - final String[] paths; - - if (info.file.isDirectory()) { - List files = FileUtil.listFilesDeep(info.file, info.fileFilter); - - if (isCancelled() || checkCallbackReference() == null) { - return null; - } - - paths = new String[files.size()]; - for (int i = 0; i < files.size(); i++) { - File f = files.get(i); - paths[i] = FileUtil.safeGetCanonicalPath(f); - - if (isCancelled() || checkCallbackReference() == null) { - return null; + private void setUpAdapter() { + adapter = new SongFileAdapter(getMainActivity(), new LinkedList(), R.layout.item_list, + this, this); + adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + checkIsEmpty(); } - } + }); + recyclerView.setAdapter(adapter); + checkIsEmpty(); + } + + @Override + public void onPause() { + super.onPause(); + saveScrollPosition(); + } + + @Override + public void onDestroyView() { + appbar.removeOnOffsetChangedListener(this); + unbinder.unbind(); + super.onDestroyView(); + } + + @Override + public boolean handleBackPress() { + if (cab != null && cab.isActive()) { + cab.finish(); + return true; + } + if (breadCrumbs != null && breadCrumbs.popHistory()) { + setCrumb(breadCrumbs.lastHistory(), false); + return true; + } + return false; + } + + @NonNull + @Override + public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) { + if (cab != null && cab.isActive()) { + cab.finish(); + } + cab = new MaterialCab(getMainActivity(), R.id.cab_stub) + .setMenu(menuRes) + .setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor(RetroColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor + (getActivity()))) + .start(callback); + return cab; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.menu_folders, menu); + ToolbarContentTintHelper.handleOnCreateOptionsMenu(getActivity(), toolbar, menu, + ATHToolbarActivity.getToolbarBackgroundColor(toolbar)); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + ToolbarContentTintHelper.handleOnPrepareOptionsMenu(getActivity(), toolbar); + } + + @Override + public void onCrumbSelection(BreadCrumbLayout.Crumb crumb, int index) { + setCrumb(crumb, true); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + //noinspection ConstantConditions + getActivity().onBackPressed(); + break; + case R.id.action_go_to_start_directory: + setCrumb(new BreadCrumbLayout.Crumb( + tryGetCanonicalFile(PreferenceUtil.getInstance(getActivity()).getStartDirectory())), + true); + return true; + case R.id.action_scan: + BreadCrumbLayout.Crumb crumb = getActiveCrumb(); + if (crumb != null) { + //noinspection Convert2MethodRef + new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) + .execute(new ListPathsAsyncTask.LoadingInfo(crumb.getFile(), AUDIO_FILE_FILTER)); + } + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onFileSelected(File file) { + file = tryGetCanonicalFile(file); // important as we compare the path value later + if (file.isDirectory()) { + setCrumb(new BreadCrumbLayout.Crumb(file), true); } else { - paths = new String[1]; - paths[0] = info.file.getPath(); + FileFilter fileFilter = pathname -> !pathname.isDirectory() && AUDIO_FILE_FILTER + .accept(pathname); + new ListSongsAsyncTask(getActivity(), file, (songs, extra) -> { + File file1 = (File) extra; + int startIndex = -1; + for (int i = 0; i < songs.size(); i++) { + if (file1.getPath().equals(songs.get(i).data)) { // path is already canonical here + startIndex = i; + break; + } + } + if (startIndex > -1) { + MusicPlayerRemote.openQueue(songs, startIndex, true); + } else { + final File finalFile = file1; + Snackbar.make(coordinatorLayout, Html.fromHtml( + String.format(getString(R.string.not_listed_in_media_store), file1.getName())), + Snackbar.LENGTH_LONG) + .setAction(R.string.action_scan, + v -> new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) + .execute(new ListPathsAsyncTask.LoadingInfo(finalFile, AUDIO_FILE_FILTER))) + .setActionTextColor(ThemeStore.accentColor(getActivity())) + .show(); + } + }).execute(new ListSongsAsyncTask.LoadingInfo(toList(file.getParentFile()), fileFilter, + getFileComparator())); + } + } + + @Override + public void onMultipleItemAction(MenuItem item, ArrayList files) { + final int itemId = item.getItemId(); + new ListSongsAsyncTask(getActivity(), null, + (songs, extra) -> SongsMenuHelper.handleMenuClick(getActivity(), songs, itemId)) + .execute(new ListSongsAsyncTask.LoadingInfo(files, AUDIO_FILE_FILTER, getFileComparator())); + } + + private ArrayList toList(File file) { + ArrayList files = new ArrayList<>(1); + files.add(file); + return files; + } + + private Comparator getFileComparator() { + return fileComparator; + } + + @Override + public void onFileMenuClicked(final File file, View view) { + PopupMenu popupMenu = new PopupMenu(getActivity(), view); + if (file.isDirectory()) { + popupMenu.inflate(R.menu.menu_item_directory); + popupMenu.setOnMenuItemClickListener(item -> { + final int itemId = item.getItemId(); + switch (itemId) { + case R.id.action_play_next: + case R.id.action_add_to_current_playing: + case R.id.action_add_to_playlist: + case R.id.action_delete_from_device: + new ListSongsAsyncTask(getActivity(), null, (songs, extra) -> { + if (!songs.isEmpty()) { + SongsMenuHelper.handleMenuClick(getActivity(), songs, itemId); + } + }).execute(new ListSongsAsyncTask.LoadingInfo(toList(file), AUDIO_FILE_FILTER, + getFileComparator())); + return true; + case R.id.action_set_as_start_directory: + PreferenceUtil.getInstance(getActivity()).setStartDirectory(file); + Toast.makeText(getActivity(), + String.format(getString(R.string.new_start_directory), file.getPath()), + Toast.LENGTH_SHORT).show(); + return true; + case R.id.action_scan: + new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) + .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); + return true; + } + return false; + }); + } else { + popupMenu.inflate(R.menu.menu_item_file); + popupMenu.setOnMenuItemClickListener(item -> { + final int itemId = item.getItemId(); + switch (itemId) { + case R.id.action_play_next: + case R.id.action_add_to_current_playing: + case R.id.action_add_to_playlist: + case R.id.action_go_to_album: + case R.id.action_go_to_artist: + case R.id.action_share: + case R.id.action_tag_editor: + case R.id.action_details: + case R.id.action_set_as_ringtone: + case R.id.action_delete_from_device: + new ListSongsAsyncTask(getActivity(), null, (songs, extra) -> SongMenuHelper + .handleMenuClick(getActivity(), songs.get(0), itemId)).execute( + new ListSongsAsyncTask.LoadingInfo(toList(file), AUDIO_FILE_FILTER, + getFileComparator())); + return true; + case R.id.action_scan: + new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) + .execute(new ListPathsAsyncTask.LoadingInfo(file, AUDIO_FILE_FILTER)); + return true; + } + return false; + }); + } + popupMenu.show(); + } + + @Override + public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { + container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), + container.getPaddingRight(), appbar.getTotalScrollRange() + verticalOffset); + } + + private void checkIsEmpty() { + if (empty != null) { + empty + .setVisibility(adapter == null || adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); + } + } + + private void scanPaths(@Nullable String[] toBeScanned) { + if (getActivity() == null) { + return; + } + if (toBeScanned == null || toBeScanned.length < 1) { + Toast.makeText(getActivity(), R.string.nothing_to_scan, Toast.LENGTH_SHORT).show(); + } else { + MediaScannerConnection.scanFile(getActivity().getApplicationContext(), toBeScanned, null, + new UpdateToastMediaScannerCompletionListener(getActivity(), toBeScanned)); + } + } + + private void updateAdapter(@NonNull List files) { + adapter.swapDataSet(files); + BreadCrumbLayout.Crumb crumb = getActiveCrumb(); + if (crumb != null && recyclerView != null) { + ((LinearLayoutManager) recyclerView.getLayoutManager()) + .scrollToPositionWithOffset(crumb.getScrollPosition(), 0); + } + } + + @NonNull + @Override + public Loader> onCreateLoader(int id, Bundle args) { + return new AsyncFileLoader(this); + } + + @Override + public void onLoadFinished(@NonNull Loader> loader, List data) { + updateAdapter(data); + } + + @Override + public void onLoaderReset(@NonNull Loader> loader) { + updateAdapter(new LinkedList()); + } + + private static class AsyncFileLoader extends WrappedAsyncTaskLoader> { + + private WeakReference fragmentWeakReference; + + public AsyncFileLoader(FoldersFragment foldersFragment) { + super(foldersFragment.getActivity()); + fragmentWeakReference = new WeakReference<>(foldersFragment); } - return paths; - } catch (Exception e) { - e.printStackTrace(); - cancel(false); - return null; - } + @Override + public List loadInBackground() { + FoldersFragment foldersFragment = fragmentWeakReference.get(); + File directory = null; + if (foldersFragment != null) { + BreadCrumbLayout.Crumb crumb = foldersFragment.getActiveCrumb(); + if (crumb != null) { + directory = crumb.getFile(); + } + } + if (directory != null) { + List files = FileUtil.listFiles(directory, AUDIO_FILE_FILTER); + Collections.sort(files, foldersFragment.getFileComparator()); + return files; + } else { + return new LinkedList<>(); + } + } } - @Override - protected void onPostExecute(String[] paths) { - super.onPostExecute(paths); - OnPathsListedCallback callback = checkCallbackReference(); - if (callback != null && paths != null) { - callback.onPathsListed(paths); - } + private static class ListSongsAsyncTask extends + ListingFilesDialogAsyncTask> { + + private final Object extra; + private WeakReference contextWeakReference; + private WeakReference callbackWeakReference; + + ListSongsAsyncTask(Context context, Object extra, OnSongsListedCallback callback) { + super(context); + this.extra = extra; + contextWeakReference = new WeakReference<>(context); + callbackWeakReference = new WeakReference<>(callback); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + checkCallbackReference(); + checkContextReference(); + } + + @Override + protected ArrayList doInBackground(LoadingInfo... params) { + try { + LoadingInfo info = params[0]; + List files = FileUtil.listFilesDeep(info.files, info.fileFilter); + + if (isCancelled() || checkContextReference() == null + || checkCallbackReference() == null) { + return null; + } + + Collections.sort(files, info.fileComparator); + + Context context = checkContextReference(); + if (isCancelled() || context == null || checkCallbackReference() == null) { + return null; + } + + return FileUtil.matchFilesWithMediaStore(context, files).blockingFirst(); + } catch (Exception e) { + e.printStackTrace(); + cancel(false); + return null; + } + } + + @Override + protected void onPostExecute(ArrayList songs) { + super.onPostExecute(songs); + OnSongsListedCallback callback = checkCallbackReference(); + if (songs != null && callback != null) { + callback.onSongsListed(songs, extra); + } + } + + private Context checkContextReference() { + Context context = contextWeakReference.get(); + if (context == null) { + cancel(false); + } + return context; + } + + private OnSongsListedCallback checkCallbackReference() { + OnSongsListedCallback callback = callbackWeakReference.get(); + if (callback == null) { + cancel(false); + } + return callback; + } + + public interface OnSongsListedCallback { + + void onSongsListed(@NonNull ArrayList songs, Object extra); + } + + static class LoadingInfo { + + final Comparator fileComparator; + final FileFilter fileFilter; + final List files; + + LoadingInfo(@NonNull List files, @NonNull FileFilter fileFilter, + @NonNull Comparator fileComparator) { + this.fileComparator = fileComparator; + this.fileFilter = fileFilter; + this.files = files; + } + } } - private OnPathsListedCallback checkCallbackReference() { - OnPathsListedCallback callback = onPathsListedCallbackWeakReference.get(); - if (callback == null) { - cancel(false); - } - return callback; + public static class ListPathsAsyncTask extends + ListingFilesDialogAsyncTask { + + private WeakReference onPathsListedCallbackWeakReference; + + public ListPathsAsyncTask(Context context, OnPathsListedCallback callback) { + super(context); + onPathsListedCallbackWeakReference = new WeakReference<>(callback); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + checkCallbackReference(); + } + + @Override + protected String[] doInBackground(LoadingInfo... params) { + try { + if (isCancelled() || checkCallbackReference() == null) { + return null; + } + + LoadingInfo info = params[0]; + + final String[] paths; + + if (info.file.isDirectory()) { + List files = FileUtil.listFilesDeep(info.file, info.fileFilter); + + if (isCancelled() || checkCallbackReference() == null) { + return null; + } + + paths = new String[files.size()]; + for (int i = 0; i < files.size(); i++) { + File f = files.get(i); + paths[i] = FileUtil.safeGetCanonicalPath(f); + + if (isCancelled() || checkCallbackReference() == null) { + return null; + } + } + } else { + paths = new String[1]; + paths[0] = info.file.getPath(); + } + + return paths; + } catch (Exception e) { + e.printStackTrace(); + cancel(false); + return null; + } + } + + @Override + protected void onPostExecute(String[] paths) { + super.onPostExecute(paths); + OnPathsListedCallback callback = checkCallbackReference(); + if (callback != null && paths != null) { + callback.onPathsListed(paths); + } + } + + private OnPathsListedCallback checkCallbackReference() { + OnPathsListedCallback callback = onPathsListedCallbackWeakReference.get(); + if (callback == null) { + cancel(false); + } + return callback; + } + + public interface OnPathsListedCallback { + + void onPathsListed(@NonNull String[] paths); + } + + public static class LoadingInfo { + + public final File file; + final FileFilter fileFilter; + + public LoadingInfo(File file, FileFilter fileFilter) { + this.file = file; + this.fileFilter = fileFilter; + } + } } - public interface OnPathsListedCallback { + private static abstract class ListingFilesDialogAsyncTask extends + DialogAsyncTask { - void onPathsListed(@NonNull String[] paths); + ListingFilesDialogAsyncTask(Context context) { + super(context); + } + + public ListingFilesDialogAsyncTask(Context context, int showDelay) { + super(context, showDelay); + } + + @Override + protected Dialog createDialog(@NonNull Context context) { + return new MaterialDialog.Builder(context) + .title(R.string.listing_files) + .progress(true, 0) + .progressIndeterminateStyle(true) + .cancelListener(dialog -> cancel(false)) + .dismissListener(dialog -> cancel(false)) + .negativeText(android.R.string.cancel) + .onNegative((dialog, which) -> cancel(false)) + .show(); + } } - - public static class LoadingInfo { - - public final File file; - final FileFilter fileFilter; - - public LoadingInfo(File file, FileFilter fileFilter) { - this.file = file; - this.fileFilter = fileFilter; - } - } - } - - private static abstract class ListingFilesDialogAsyncTask extends - DialogAsyncTask { - - ListingFilesDialogAsyncTask(Context context) { - super(context); - } - - public ListingFilesDialogAsyncTask(Context context, int showDelay) { - super(context, showDelay); - } - - @Override - protected Dialog createDialog(@NonNull Context context) { - return new MaterialDialog.Builder(context) - .title(R.string.listing_files) - .progress(true, 0) - .progressIndeterminateStyle(true) - .cancelListener(dialog -> cancel(false)) - .dismissListener(dialog -> cancel(false)) - .negativeText(android.R.string.cancel) - .onNegative((dialog, which) -> cancel(false)) - .show(); - } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.java index 644b0d7f5..2c02a35bf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.java @@ -1,14 +1,11 @@ package code.name.monkey.retromusic.ui.fragments.mainactivity.home; -import static code.name.monkey.retromusic.Constants.USER_PROFILE; - import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; -import android.support.design.widget.CollapsingToolbarLayout; import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; @@ -22,13 +19,16 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; + +import java.io.File; +import java.util.ArrayList; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.ATHUtil; -import code.name.monkey.appthemehelper.util.ColorUtil; import code.name.monkey.appthemehelper.util.TintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.dialogs.HomeOptionDialog; @@ -56,276 +56,276 @@ import code.name.monkey.retromusic.views.MetalRecyclerViewPager; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; -import java.io.File; -import java.util.ArrayList; + +import static code.name.monkey.retromusic.Constants.USER_PROFILE; public class BannerHomeFragment extends AbsMainActivityFragment implements - MainActivityFragmentCallbacks, - HomeContract.HomeView { + MainActivityFragmentCallbacks, + HomeContract.HomeView { - private static final String TAG = "HomeFragment"; - Unbinder unbinder; - @BindView(R.id.home_toolbar) - Toolbar toolbar; - @BindView(R.id.appbar) - AppBarLayout appbar; - @BindView(R.id.user_image) - CircularImageView userImage; - @BindView(R.id.recycler_view) - RecyclerView recentArtistRV; - @BindView(R.id.recent_album) - RecyclerView recentAlbumRV; - @BindView(R.id.top_artist) - RecyclerView topArtistRV; - @BindView(R.id.top_album) - MetalRecyclerViewPager topAlbumRV; - @BindView(R.id.recent_artist_container) - View recentArtistContainer; - @BindView(R.id.recent_albums_container) - View recentAlbumsContainer; - @BindView(R.id.top_artist_container) - View topArtistContainer; - @BindView(R.id.top_albums_container) - View topAlbumContainer; - @BindView(R.id.genres) - RecyclerView genresRecyclerView; - @BindView(R.id.genre_container) - LinearLayout genreContainer; - @BindView(R.id.container) - View container; - @BindView(R.id.title) - TextView title; - @BindView(R.id.search) - ImageView search; + private static final String TAG = "HomeFragment"; + Unbinder unbinder; + @BindView(R.id.home_toolbar) + Toolbar toolbar; + @BindView(R.id.appbar) + AppBarLayout appbar; + @BindView(R.id.user_image) + CircularImageView userImage; + @BindView(R.id.recycler_view) + RecyclerView recentArtistRV; + @BindView(R.id.recent_album) + RecyclerView recentAlbumRV; + @BindView(R.id.top_artist) + RecyclerView topArtistRV; + @BindView(R.id.top_album) + MetalRecyclerViewPager topAlbumRV; + @BindView(R.id.recent_artist_container) + View recentArtistContainer; + @BindView(R.id.recent_albums_container) + View recentAlbumsContainer; + @BindView(R.id.top_artist_container) + View topArtistContainer; + @BindView(R.id.top_albums_container) + View topAlbumContainer; + @BindView(R.id.genres) + RecyclerView genresRecyclerView; + @BindView(R.id.genre_container) + LinearLayout genreContainer; + @BindView(R.id.container) + View container; + @BindView(R.id.title) + TextView title; + @BindView(R.id.search) + ImageView search; - private HomePresenter homePresenter; - private CompositeDisposable disposable; + private HomePresenter homePresenter; + private CompositeDisposable disposable; - public static BannerHomeFragment newInstance() { - Bundle args = new Bundle(); - BannerHomeFragment fragment = new BannerHomeFragment(); - fragment.setArguments(args); - return fragment; - } - - - private void loadImageFromStorage(ImageView imageView) { - //noinspection ConstantConditions - disposable.add(new Compressor(getContext()) - .setMaxHeight(300) - .setMaxWidth(300) - .setQuality(75) - .setCompressFormat(Bitmap.CompressFormat.WEBP) - .compressToBitmapAsFlowable( - new File(PreferenceUtil.getInstance(getContext()).getProfileImage(), USER_PROFILE)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(imageView::setImageBitmap, - throwable -> imageView.setImageDrawable(ContextCompat - .getDrawable(getContext(), R.drawable.ic_person_flat)))); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - disposable = new CompositeDisposable(); - //noinspection ConstantConditions - homePresenter = new HomePresenter(this); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_banner_home, container, false); - unbinder = ButterKnife.bind(this, view); - return view; - } - - @Override - public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - setStatusbarColorAuto(view); - getMainActivity().getSlidingUpPanelLayout().setShadowHeight(8); - getMainActivity().setBottomBarVisibility(View.VISIBLE); - - setupToolbar(); - loadImageFromStorage(userImage); - - homePresenter.subscribe(); - checkPadding(); - } - - @SuppressWarnings("ConstantConditions") - private void setupToolbar() { - //noinspection ConstantConditions - int primaryColor = ThemeStore.primaryColor(getContext()); - appbar.setBackgroundColor(ColorUtil.darkenColor(primaryColor)); - toolbar.setBackgroundColor(ColorUtil.darkenColor(primaryColor)); - appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> - getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext()))); - - getActivity().setTitle(R.string.app_name); - getMainActivity().setSupportActionBar(toolbar); - - title.setTextColor(ThemeStore.textColorPrimary(getContext())); - TintHelper.setTintAuto(search, ThemeStore.textColorPrimary(getContext()), false); - TintHelper.setTintAuto(container, primaryColor, true); - } - - @Override - public boolean handleBackPress() { - return false; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - unbinder.unbind(); - disposable.clear(); - homePresenter.unsubscribe(); - } - - @Override - public void loading() { - - } - - @Override - public void showEmptyView() { - - } - - @Override - public void completed() { - - } - - @Override - public void showData(ArrayList homes) { - //homeAdapter.swapDataSet(homes); - } - - @Override - public void onMediaStoreChanged() { - super.onMediaStoreChanged(); - homePresenter.subscribe(); - } - - @Override - public void onServiceConnected() { - super.onServiceConnected(); - checkPadding(); - } - - @Override - public void onQueueChanged() { - super.onQueueChanged(); - checkPadding(); - } - - private void checkPadding() { - int height = getResources().getDimensionPixelSize(R.dimen.mini_player_height); - container.setPadding(0, 0, 0, MusicPlayerRemote.getPlayingQueue().isEmpty() ? height * 2 : 0); - } - - @Override - public void recentArtist(ArrayList artists) { - recentArtistContainer.setVisibility(View.VISIBLE); - recentArtistRV.setLayoutManager(new GridLayoutManager(getMainActivity(), - 1, GridLayoutManager.HORIZONTAL, false)); - ArtistAdapter artistAdapter = new ArtistAdapter(getMainActivity(), artists, - R.layout.item_artist, false, null); - recentArtistRV.setAdapter(artistAdapter); - } - - @Override - public void recentAlbum(ArrayList albums) { - recentAlbumsContainer.setVisibility(View.VISIBLE); - AlbumFullWithAdapter artistAdapter = new AlbumFullWithAdapter(getMainActivity(), - getDisplayMetrics()); - artistAdapter.swapData(albums); - recentAlbumRV.setAdapter(artistAdapter); - } - - @Override - public void topArtists(ArrayList artists) { - topArtistContainer.setVisibility(View.VISIBLE); - topArtistRV.setLayoutManager(new GridLayoutManager(getMainActivity(), - 1, GridLayoutManager.HORIZONTAL, false)); - ArtistAdapter artistAdapter = new ArtistAdapter(getMainActivity(), artists, - R.layout.item_artist, false, null); - topArtistRV.setAdapter(artistAdapter); - - } - - @Override - public void topAlbums(ArrayList albums) { - topAlbumContainer.setVisibility(View.VISIBLE); - AlbumFullWithAdapter artistAdapter = new AlbumFullWithAdapter(getMainActivity(), - getDisplayMetrics()); - artistAdapter.swapData(albums); - topAlbumRV.setAdapter(artistAdapter); - } - - private DisplayMetrics getDisplayMetrics() { - Display display = getMainActivity().getWindowManager().getDefaultDisplay(); - DisplayMetrics metrics = new DisplayMetrics(); - display.getMetrics(metrics); - - return metrics; - } - - @Override - public void suggestions(ArrayList playlists) { - - } - - - @Override - public void geners(ArrayList genres) { - genreContainer.setVisibility(View.VISIBLE); - genresRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - //noinspection ConstantConditions - GenreAdapter genreAdapter = new GenreAdapter(getActivity(), genres, R.layout.item_list); - genresRecyclerView.setAdapter(genreAdapter); - } - - - @OnClick({R.id.last_added, R.id.top_played, R.id.action_shuffle, R.id.history, - R.id.user_image, R.id.search}) - void startUserInfo(View view) { - Activity activity = getActivity(); - if (activity != null) { - switch (view.getId()) { - case R.id.action_shuffle: - MusicPlayerRemote - .openAndShuffleQueue(SongLoader.getAllSongs(activity).blockingFirst(), true); - break; - case R.id.last_added: - NavigationUtil.goToPlaylistNew(activity, new LastAddedPlaylist(activity)); - break; - case R.id.top_played: - NavigationUtil.goToPlaylistNew(activity, new MyTopTracksPlaylist(activity)); - break; - case R.id.history: - NavigationUtil.goToPlaylistNew(activity, new HistoryPlaylist(activity)); - break; - case R.id.search: - NavigationUtil.goToSearch(activity); - break; - case R.id.user_image: - new HomeOptionDialog().show(getFragmentManager(), TAG); - break; - } + public static BannerHomeFragment newInstance() { + Bundle args = new Bundle(); + BannerHomeFragment fragment = new BannerHomeFragment(); + fragment.setArguments(args); + return fragment; } - } - @Override - public void onPlayingMetaChanged() { - super.onPlayingMetaChanged(); - homePresenter.loadRecentArtists(); - homePresenter.loadRecentAlbums(); - } + + private void loadImageFromStorage(ImageView imageView) { + //noinspection ConstantConditions + disposable.add(new Compressor(getContext()) + .setMaxHeight(300) + .setMaxWidth(300) + .setQuality(75) + .setCompressFormat(Bitmap.CompressFormat.WEBP) + .compressToBitmapAsFlowable( + new File(PreferenceUtil.getInstance(getContext()).getProfileImage(), USER_PROFILE)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(imageView::setImageBitmap, + throwable -> imageView.setImageDrawable(ContextCompat + .getDrawable(getContext(), R.drawable.ic_person_flat)))); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + disposable = new CompositeDisposable(); + //noinspection ConstantConditions + homePresenter = new HomePresenter(this); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_banner_home, container, false); + unbinder = ButterKnife.bind(this, view); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setStatusbarColorAuto(view); + getMainActivity().getSlidingUpPanelLayout().setShadowHeight(8); + getMainActivity().setBottomBarVisibility(View.VISIBLE); + + setupToolbar(); + loadImageFromStorage(userImage); + + homePresenter.subscribe(); + checkPadding(); + } + + @SuppressWarnings("ConstantConditions") + private void setupToolbar() { + //noinspection ConstantConditions + int primaryColor = ThemeStore.primaryColor(getContext()); + appbar.setBackgroundColor(primaryColor); + toolbar.setBackgroundColor(primaryColor); + appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> + getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext()))); + + getActivity().setTitle(R.string.app_name); + getMainActivity().setSupportActionBar(toolbar); + + title.setTextColor(ThemeStore.textColorPrimary(getContext())); + TintHelper.setTintAuto(search, ThemeStore.textColorPrimary(getContext()), false); + TintHelper.setTintAuto(container, primaryColor, true); + } + + @Override + public boolean handleBackPress() { + return false; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind(); + disposable.clear(); + homePresenter.unsubscribe(); + } + + @Override + public void loading() { + + } + + @Override + public void showEmptyView() { + + } + + @Override + public void completed() { + + } + + @Override + public void showData(ArrayList homes) { + //homeAdapter.swapDataSet(homes); + } + + @Override + public void onMediaStoreChanged() { + super.onMediaStoreChanged(); + homePresenter.subscribe(); + } + + @Override + public void onServiceConnected() { + super.onServiceConnected(); + checkPadding(); + } + + @Override + public void onQueueChanged() { + super.onQueueChanged(); + checkPadding(); + } + + private void checkPadding() { + int height = getResources().getDimensionPixelSize(R.dimen.mini_player_height); + container.setPadding(0, 0, 0, MusicPlayerRemote.getPlayingQueue().isEmpty() ? height * 2 : 0); + } + + @Override + public void recentArtist(ArrayList artists) { + recentArtistContainer.setVisibility(View.VISIBLE); + recentArtistRV.setLayoutManager(new GridLayoutManager(getMainActivity(), + 1, GridLayoutManager.HORIZONTAL, false)); + ArtistAdapter artistAdapter = new ArtistAdapter(getMainActivity(), artists, + R.layout.item_artist, false, null); + recentArtistRV.setAdapter(artistAdapter); + } + + @Override + public void recentAlbum(ArrayList albums) { + recentAlbumsContainer.setVisibility(View.VISIBLE); + AlbumFullWithAdapter artistAdapter = new AlbumFullWithAdapter(getMainActivity(), + getDisplayMetrics()); + artistAdapter.swapData(albums); + recentAlbumRV.setAdapter(artistAdapter); + } + + @Override + public void topArtists(ArrayList artists) { + topArtistContainer.setVisibility(View.VISIBLE); + topArtistRV.setLayoutManager(new GridLayoutManager(getMainActivity(), + 1, GridLayoutManager.HORIZONTAL, false)); + ArtistAdapter artistAdapter = new ArtistAdapter(getMainActivity(), artists, + R.layout.item_artist, false, null); + topArtistRV.setAdapter(artistAdapter); + + } + + @Override + public void topAlbums(ArrayList albums) { + topAlbumContainer.setVisibility(View.VISIBLE); + AlbumFullWithAdapter artistAdapter = new AlbumFullWithAdapter(getMainActivity(), + getDisplayMetrics()); + artistAdapter.swapData(albums); + topAlbumRV.setAdapter(artistAdapter); + } + + private DisplayMetrics getDisplayMetrics() { + Display display = getMainActivity().getWindowManager().getDefaultDisplay(); + DisplayMetrics metrics = new DisplayMetrics(); + display.getMetrics(metrics); + + return metrics; + } + + @Override + public void suggestions(ArrayList playlists) { + + } + + + @Override + public void geners(ArrayList genres) { + genreContainer.setVisibility(View.VISIBLE); + genresRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + //noinspection ConstantConditions + GenreAdapter genreAdapter = new GenreAdapter(getActivity(), genres, R.layout.item_list); + genresRecyclerView.setAdapter(genreAdapter); + } + + + @OnClick({R.id.last_added, R.id.top_played, R.id.action_shuffle, R.id.history, + R.id.user_image, R.id.search}) + void startUserInfo(View view) { + Activity activity = getActivity(); + if (activity != null) { + switch (view.getId()) { + case R.id.action_shuffle: + MusicPlayerRemote + .openAndShuffleQueue(SongLoader.getAllSongs(activity).blockingFirst(), true); + break; + case R.id.last_added: + NavigationUtil.goToPlaylistNew(activity, new LastAddedPlaylist(activity)); + break; + case R.id.top_played: + NavigationUtil.goToPlaylistNew(activity, new MyTopTracksPlaylist(activity)); + break; + case R.id.history: + NavigationUtil.goToPlaylistNew(activity, new HistoryPlaylist(activity)); + break; + case R.id.search: + NavigationUtil.goToSearch(activity); + break; + case R.id.user_image: + new HomeOptionDialog().show(getFragmentManager(), TAG); + break; + } + } + } + + @Override + public void onPlayingMetaChanged() { + super.onPlayingMetaChanged(); + homePresenter.loadRecentArtists(); + homePresenter.loadRecentAlbums(); + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/HomeFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/HomeFragment.java index 8abe1dd6a..721a625e5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/HomeFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/HomeFragment.java @@ -71,7 +71,7 @@ import static code.name.monkey.retromusic.Constants.USER_PROFILE; public class HomeFragment extends AbsMainActivityFragment implements MainActivityFragmentCallbacks, HomeContract.HomeView { - private static final String TAG = "HomeFragment"; + public static final String TAG = "HomeFragment"; Unbinder unbinder; @BindView(R.id.home_toolbar) Toolbar toolbar; @@ -411,4 +411,413 @@ public class HomeFragment extends AbsMainActivityFragment implements MainActivit homePresenter.loadRecentArtists(); homePresenter.loadRecentAlbums(); } -} \ No newline at end of file +} +/* +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CollapsingToolbarLayout; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; + +import java.io.File; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Random; + +import butterknife.BindView; +import butterknife.BindViews; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.Unbinder; +import code.name.monkey.appthemehelper.ThemeStore; +import code.name.monkey.appthemehelper.util.ATHUtil; +import code.name.monkey.appthemehelper.util.TintHelper; +import code.name.monkey.retromusic.R; +import code.name.monkey.retromusic.dialogs.HomeOptionDialog; +import code.name.monkey.retromusic.helper.MusicPlayerRemote; +import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks; +import code.name.monkey.retromusic.loaders.SongLoader; +import code.name.monkey.retromusic.misc.AppBarStateChangeListener; +import code.name.monkey.retromusic.model.Album; +import code.name.monkey.retromusic.model.Artist; +import code.name.monkey.retromusic.model.Genre; +import code.name.monkey.retromusic.model.Home; +import code.name.monkey.retromusic.model.Song; +import code.name.monkey.retromusic.model.smartplaylist.HistoryPlaylist; +import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist; +import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist; +import code.name.monkey.retromusic.mvp.contract.HomeContract; +import code.name.monkey.retromusic.mvp.presenter.HomePresenter; +import code.name.monkey.retromusic.ui.adapter.CollageSongAdapter; +import code.name.monkey.retromusic.ui.adapter.GenreAdapter; +import code.name.monkey.retromusic.ui.adapter.album.AlbumFullWithAdapter; +import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter; +import code.name.monkey.retromusic.ui.adapter.home.HomeAdapter; +import code.name.monkey.retromusic.ui.fragments.base.AbsMainActivityFragment; +import code.name.monkey.retromusic.util.Compressor; +import code.name.monkey.retromusic.util.NavigationUtil; +import code.name.monkey.retromusic.util.PreferenceUtil; +import code.name.monkey.retromusic.util.RetroUtil; +import code.name.monkey.retromusic.views.CircularImageView; +import code.name.monkey.retromusic.views.MetalRecyclerViewPager; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; + +import static code.name.monkey.retromusic.Constants.USER_BANNER; +import static code.name.monkey.retromusic.Constants.USER_PROFILE; + +public class HomeFragment extends AbsMainActivityFragment implements MainActivityFragmentCallbacks, + HomeContract.HomeView { + + public static final String TAG = "HomeFragment"; + Unbinder unbinder; + + @BindView(R.id.home_toolbar) + Toolbar toolbar; + + @BindView(R.id.appbar) + AppBarLayout appbar; + + @BindView(R.id.image) + ImageView imageView; + + @BindView(R.id.user_image) + CircularImageView userImage; + + @BindView(R.id.collapsing_toolbar) + CollapsingToolbarLayout toolbarLayout; + + @BindView(R.id.container) + View container; + + @BindView(R.id.title) + TextView title; + + @BindView(R.id.search) + ImageView search; + + @BindViews({R.id.recent_artist_container, R.id.recent_albums_container, + R.id.top_artist_container, R.id.top_albums_container, + R.id.genre_container}) + List sectionContainers; + + @BindViews({R.id.recent_artist_recycler_view, R.id.top_artist_recycler_view, + R.id.genres_recycler_view}) + List sectionRecyclerViews; + + @BindViews({R.id.recent_albums_recycler_view, R.id.top_album_recycler_view}) + List metalRecyclerViewPagers; + + private HomePresenter homePresenter; + private CompositeDisposable disposable; + + public static HomeFragment newInstance() { + Bundle args = new Bundle(); + HomeFragment fragment = new HomeFragment(); + fragment.setArguments(args); + return fragment; + } + + private void getTimeOfTheDay() { + Calendar c = Calendar.getInstance(); + int timeOfDay = c.get(Calendar.HOUR_OF_DAY); + + String[] images = new String[]{}; + if (timeOfDay >= 0 && timeOfDay < 6) { + images = getResources().getStringArray(R.array.night); + } else if (timeOfDay >= 6 && timeOfDay < 12) { + images = getResources().getStringArray(R.array.morning); + } else if (timeOfDay >= 12 && timeOfDay < 16) { + images = getResources().getStringArray(R.array.after_noon); + } else if (timeOfDay >= 16 && timeOfDay < 20) { + images = getResources().getStringArray(R.array.evening); + } else if (timeOfDay >= 20 && timeOfDay < 24) { + images = getResources().getStringArray(R.array.night); + } + String day = images[new Random().nextInt(images.length)]; + loadTimeImage(day); + } + + private void loadTimeImage(String day) { + //noinspection ConstantConditions + if (PreferenceUtil.getInstance(getActivity()).getBannerImage().isEmpty()) { + if (imageView != null) { + Glide.with(getActivity()).load(day) + .asBitmap() + .placeholder(R.drawable.material_design_default) + .diskCacheStrategy(DiskCacheStrategy.SOURCE) + .into(imageView); + } + } else { + loadBannerFromStorage(); + } + } + + private void loadBannerFromStorage() { + //noinspection ConstantConditions + disposable.add(new Compressor(getContext()) + .setQuality(100) + .setCompressFormat(Bitmap.CompressFormat.WEBP) + .compressToBitmapAsFlowable( + new File(PreferenceUtil.getInstance(getContext()).getBannerImage(), USER_BANNER)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(imageView::setImageBitmap)); + } + + private void loadImageFromStorage(ImageView imageView) { + //noinspection ConstantConditions + disposable.add(new Compressor(getContext()) + .setMaxHeight(300) + .setMaxWidth(300) + .setQuality(75) + .setCompressFormat(Bitmap.CompressFormat.WEBP) + .compressToBitmapAsFlowable( + new File(PreferenceUtil.getInstance(getContext()).getProfileImage(), USER_PROFILE)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(imageView::setImageBitmap, + throwable -> imageView.setImageDrawable(ContextCompat + .getDrawable(getContext(), R.drawable.ic_person_flat)))); + } + + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + disposable = new CompositeDisposable(); + homePresenter = new HomePresenter(this); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_home, container, false); + unbinder = ButterKnife.bind(this, view); + setRetainInstance(true); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + getMainActivity().getSlidingUpPanelLayout().setShadowHeight(8); + getMainActivity().setBottomBarVisibility(View.VISIBLE); + + setupToolbar(); + loadImageFromStorage(userImage); + + homePresenter.subscribe(); + checkPadding(); + getTimeOfTheDay(); + } + + @SuppressWarnings("ConstantConditions") + private void setupToolbar() { + if (!PreferenceUtil.getInstance(getContext()).getFullScreenMode()) { + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar + .getLayoutParams(); + params.topMargin = RetroUtil.getStatusBarHeight(getContext()); + toolbar.setLayoutParams(params); + } + + appbar.addOnOffsetChangedListener(new AppBarStateChangeListener() { + @Override + public void onStateChanged(AppBarLayout appBarLayout, State state) { + int color; + switch (state) { + case COLLAPSED: + getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext())); + color = ThemeStore.textColorPrimary(getContext()); + break; + default: + case EXPANDED: + case IDLE: + getMainActivity().setLightStatusbar(false); + color = Color.WHITE; + break; + } + TintHelper.setTintAuto(search, color, false); + title.setTextColor(color); + } + }); + + int primaryColor = ThemeStore.primaryColor(getContext()); + + TintHelper.setTintAuto(container, primaryColor, true); + toolbarLayout.setStatusBarScrimColor(primaryColor); + toolbarLayout.setContentScrimColor(primaryColor); + + toolbar.setTitle(R.string.home); + getMainActivity().setSupportActionBar(toolbar); + + } + + @Override + public boolean handleBackPress() { + return false; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind(); + disposable.clear(); + homePresenter.unsubscribe(); + } + + @Override + public void loading() { + + } + + @Override + public void showEmptyView() { + + } + + @Override + public void completed() { + + } + + @Override + public void showData(ArrayList homes) { + HomeAdapter homeAdapter = new HomeAdapter(getMainActivity()); + homeAdapter.swapData(homes); + } + + @Override + public void onServiceConnected() { + super.onServiceConnected(); + checkPadding(); + } + + @Override + public void onQueueChanged() { + super.onQueueChanged(); + checkPadding(); + } + + private void checkPadding() { + int height = getResources().getDimensionPixelSize(R.dimen.mini_player_height); + container.setPadding(0, 0, 0, MusicPlayerRemote.getPlayingQueue().isEmpty() ? height * 2 : 0); + } + + private DisplayMetrics getDisplayMetrics() { + Display display = getMainActivity().getWindowManager().getDefaultDisplay(); + DisplayMetrics metrics = new DisplayMetrics(); + display.getMetrics(metrics); + return metrics; + } + + @OnClick({R.id.last_added, R.id.top_played, R.id.action_shuffle, + R.id.history, R.id.user_image, R.id.search}) + void startUserInfo(View view) { + Activity activity = getActivity(); + if (activity != null) { + switch (view.getId()) { + case R.id.action_shuffle: + MusicPlayerRemote + .openAndShuffleQueue(SongLoader.getAllSongs(activity).blockingFirst(), true); + break; + case R.id.last_added: + NavigationUtil.goToPlaylistNew(activity, new LastAddedPlaylist(activity)); + break; + case R.id.top_played: + NavigationUtil.goToPlaylistNew(activity, new MyTopTracksPlaylist(activity)); + break; + case R.id.history: + NavigationUtil.goToPlaylistNew(activity, new HistoryPlaylist(activity)); + break; + case R.id.search: + NavigationUtil.goToSearch(activity); + break; + case R.id.user_image: + //noinspection ConstantConditions + new HomeOptionDialog().show(getFragmentManager(), TAG); + break; + } + } + } + + @Override + public void showRecentAlbums(ArrayList albums) { + sectionContainers.get(1).setVisibility(View.VISIBLE); + AlbumFullWithAdapter albumFullWithAdapter = new AlbumFullWithAdapter(getMainActivity(), + getDisplayMetrics()); + albumFullWithAdapter.swapData(albums); + + MetalRecyclerViewPager recyclerView = metalRecyclerViewPagers.get(0); + recyclerView.setAdapter(albumFullWithAdapter); + } + + @Override + public void showTopAlbums(ArrayList albums) { + sectionContainers.get(3).setVisibility(View.VISIBLE); + AlbumFullWithAdapter albumFullWithAdapter = new AlbumFullWithAdapter(getMainActivity(), + getDisplayMetrics()); + albumFullWithAdapter.swapData(albums); + + MetalRecyclerViewPager recyclerView = metalRecyclerViewPagers.get(1); + recyclerView.setAdapter(albumFullWithAdapter); + } + + @Override + public void showRecentArtist(ArrayList artists) { + sectionContainers.get(0).setVisibility(View.VISIBLE); + GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 1, + GridLayoutManager.HORIZONTAL, false); + ArtistAdapter artistAdapter = new ArtistAdapter(getMainActivity(), artists, R.layout.item_artist); + + RecyclerView recyclerView = sectionRecyclerViews.get(0); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setAdapter(artistAdapter); + } + + @Override + public void showTopArtist(ArrayList artists) { + sectionContainers.get(2).setVisibility(View.VISIBLE); + GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 1, + GridLayoutManager.HORIZONTAL, false); + ArtistAdapter artistAdapter = new ArtistAdapter(getMainActivity(), artists, R.layout.item_artist); + + RecyclerView recyclerView = sectionRecyclerViews.get(1); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setAdapter(artistAdapter); + } + + @Override + public void showGenres(ArrayList genres) { + sectionContainers.get(4).setVisibility(View.VISIBLE); + RecyclerView recyclerView = sectionRecyclerViews.get(2); + recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setAdapter(new GenreAdapter(getMainActivity(), genres, R.layout.item_list)); + } +}*/ diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/lockscreen/LockScreenPlayerControlsFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/lockscreen/LockScreenPlayerControlsFragment.java index 8acfdd470..0bb5b57a8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/lockscreen/LockScreenPlayerControlsFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/lockscreen/LockScreenPlayerControlsFragment.java @@ -31,9 +31,9 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote; import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper; import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener; import code.name.monkey.retromusic.model.Song; -import code.name.monkey.retromusic.ui.fragments.VolumeFragment; import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment; import code.name.monkey.retromusic.util.MusicUtil; +import code.name.monkey.retromusic.util.PreferenceUtil; /** * @author Hemanth S (h4h13). @@ -41,21 +41,31 @@ import code.name.monkey.retromusic.util.MusicUtil; public class LockScreenPlayerControlsFragment extends AbsPlayerControlsFragment { @BindView(R.id.player_play_pause_button) AppCompatImageButton playPauseFab; + @BindView(R.id.player_prev_button) ImageButton prevButton; + @BindView(R.id.player_next_button) ImageButton nextButton; + @BindView(R.id.player_progress_slider) AppCompatSeekBar progressSlider; + @BindView(R.id.player_song_total_time) TextView songTotalTime; + @BindView(R.id.player_song_current_progress) TextView songCurrentProgress; + @BindView(R.id.title) AppCompatTextView title; + @BindView(R.id.text) AppCompatTextView text; + @BindView(R.id.volume_fragment_container) + View volumeContainer; + private Unbinder unbinder; private MusicProgressViewUpdateHelper progressViewUpdateHelper; private int lastPlaybackControlsColor; @@ -82,7 +92,9 @@ public class LockScreenPlayerControlsFragment extends AbsPlayerControlsFragment super.onViewCreated(view, savedInstanceState); setUpMusicControllers(); - VolumeFragment volumeFragment = (VolumeFragment) getChildFragmentManager().findFragmentById(R.id.volume_fragment); + //noinspection ConstantConditions + volumeContainer.setVisibility(PreferenceUtil.getInstance(getContext()).getVolumeToggle() + ? View.VISIBLE : View.GONE); } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.java index e7a3841ff..19ccb6a7c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.java @@ -2,8 +2,6 @@ package code.name.monkey.retromusic.ui.fragments.player.plain; import android.animation.ObjectAnimator; import android.graphics.PorterDuff; -import android.graphics.drawable.ClipDrawable; -import android.graphics.drawable.LayerDrawable; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -16,6 +14,7 @@ import android.view.animation.LinearInterpolator; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @@ -41,296 +40,288 @@ import code.name.monkey.retromusic.views.PlayPauseDrawable; public class PlainPlaybackControlsFragment extends AbsPlayerControlsFragment { - @BindView(R.id.player_play_pause_button) - ImageButton playPauseFab; - @BindView(R.id.player_prev_button) - ImageButton prevButton; - @BindView(R.id.player_next_button) - ImageButton nextButton; - @BindView(R.id.player_repeat_button) - ImageButton repeatButton; - @BindView(R.id.player_shuffle_button) - ImageButton shuffleButton; - @BindView(R.id.player_progress_slider) - SeekBar progressSlider; - @BindView(R.id.player_song_total_time) - TextView songTotalTime; - @BindView(R.id.player_song_current_progress) - TextView songCurrentProgress; - @BindView(R.id.volume_fragment_container) - View volumeContainer; - private Unbinder unbinder; - private PlayPauseDrawable playerFabPlayPauseDrawable; - private int lastPlaybackControlsColor; - private int lastDisabledPlaybackControlsColor; - private MusicProgressViewUpdateHelper progressViewUpdateHelper; + @BindView(R.id.player_play_pause_button) + ImageButton playPauseFab; + @BindView(R.id.player_prev_button) + ImageButton prevButton; + @BindView(R.id.player_next_button) + ImageButton nextButton; + @BindView(R.id.player_repeat_button) + ImageButton repeatButton; + @BindView(R.id.player_shuffle_button) + ImageButton shuffleButton; + @BindView(R.id.player_progress_slider) + SeekBar progressSlider; + @BindView(R.id.player_song_total_time) + TextView songTotalTime; + @BindView(R.id.player_song_current_progress) + TextView songCurrentProgress; + @BindView(R.id.volume_fragment_container) + View volumeContainer; - @Override - public void onPlayStateChanged() { - updatePlayPauseDrawableState(true); - } + private Unbinder unbinder; + private PlayPauseDrawable playerFabPlayPauseDrawable; + private int lastPlaybackControlsColor; + private int lastDisabledPlaybackControlsColor; + private MusicProgressViewUpdateHelper progressViewUpdateHelper; - @Override - public void onRepeatModeChanged() { - updateRepeatState(); - } - - @Override - public void onShuffleModeChanged() { - updateShuffleState(); - } - - @Override - public void onServiceConnected() { - updatePlayPauseDrawableState(false); - updateRepeatState(); - updateShuffleState(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - progressViewUpdateHelper = new MusicProgressViewUpdateHelper(this); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - unbinder.unbind(); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, - @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_plain_controls_fragment, container, false); - unbinder = ButterKnife.bind(this, view); - return view; - } - - - @Override - public void onResume() { - super.onResume(); - progressViewUpdateHelper.start(); - } - - @Override - public void onPause() { - super.onPause(); - progressViewUpdateHelper.stop(); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - setUpMusicControllers(); - if (PreferenceUtil.getInstance(getContext()).getVolumeToggle()) { - volumeContainer.setVisibility(View.VISIBLE); - } else { - volumeContainer.setVisibility(View.GONE); + @Override + public void onPlayStateChanged() { + updatePlayPauseDrawableState(true); } - } - private void setUpMusicControllers() { - setUpPlayPauseFab(); - setUpPrevNext(); - setUpRepeatButton(); - setUpShuffleButton(); - setUpProgressSlider(); - } - - private void setUpPrevNext() { - updatePrevNextColor(); - nextButton.setOnClickListener(v -> MusicPlayerRemote.playNextSong()); - prevButton.setOnClickListener(v -> MusicPlayerRemote.back()); - } - - private void updatePrevNextColor() { - nextButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - prevButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - } - - private void setUpShuffleButton() { - shuffleButton.setOnClickListener(v -> MusicPlayerRemote.toggleShuffleMode()); - } - - @Override - protected void updateShuffleState() { - switch (MusicPlayerRemote.getShuffleMode()) { - case MusicService.SHUFFLE_MODE_SHUFFLE: - shuffleButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - break; - default: - shuffleButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - break; + @Override + public void onRepeatModeChanged() { + updateRepeatState(); } - } - private void setUpRepeatButton() { - repeatButton.setOnClickListener(v -> MusicPlayerRemote.cycleRepeatMode()); - } - - @Override - protected void updateRepeatState() { - switch (MusicPlayerRemote.getRepeatMode()) { - case MusicService.REPEAT_MODE_NONE: - repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp); - repeatButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - break; - case MusicService.REPEAT_MODE_ALL: - repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp); - repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - break; - case MusicService.REPEAT_MODE_THIS: - repeatButton.setImageResource(R.drawable.ic_repeat_one_white_24dp); - repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); - break; + @Override + public void onShuffleModeChanged() { + updateShuffleState(); } - } - - @Override - protected void show() { - playPauseFab.animate() - .scaleX(1f) - .scaleY(1f) - .rotation(360f) - .setInterpolator(new DecelerateInterpolator()) - .start(); - } - - @Override - protected void hide() { - if (playPauseFab != null) { - playPauseFab.setScaleX(0f); - playPauseFab.setScaleY(0f); - playPauseFab.setRotation(0f); + @Override + public void onServiceConnected() { + updatePlayPauseDrawableState(false); + updateRepeatState(); + updateShuffleState(); } - } - @Override - protected void setUpProgressSlider() { - progressSlider.setOnSeekBarChangeListener(new SimpleOnSeekbarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (fromUser) { - MusicPlayerRemote.seekTo(progress); - onUpdateProgressViews(MusicPlayerRemote.getSongProgressMillis(), - MusicPlayerRemote.getSongDurationMillis()); + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + progressViewUpdateHelper = new MusicProgressViewUpdateHelper(this); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind(); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_plain_controls_fragment, container, false); + unbinder = ButterKnife.bind(this, view); + return view; + } + + + @Override + public void onResume() { + super.onResume(); + progressViewUpdateHelper.start(); + } + + @Override + public void onPause() { + super.onPause(); + progressViewUpdateHelper.stop(); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setUpMusicControllers(); + if (PreferenceUtil.getInstance(getContext()).getVolumeToggle()) { + volumeContainer.setVisibility(View.VISIBLE); + } else { + volumeContainer.setVisibility(View.GONE); } - } - }); - } - - public void showBouceAnimation() { - playPauseFab.clearAnimation(); - - playPauseFab.setScaleX(0.9f); - playPauseFab.setScaleY(0.9f); - playPauseFab.setVisibility(View.VISIBLE); - playPauseFab.setPivotX(playPauseFab.getWidth() / 2); - playPauseFab.setPivotY(playPauseFab.getHeight() / 2); - - playPauseFab.animate() - .setDuration(200) - .setInterpolator(new DecelerateInterpolator()) - .scaleX(1.1f) - .scaleY(1.1f) - .withEndAction(() -> playPauseFab.animate() - .setDuration(200) - .setInterpolator(new AccelerateInterpolator()) - .scaleX(1f) - .scaleY(1f) - .alpha(1f) - .start()) - .start(); - } - - @OnClick(R.id.player_play_pause_button) - void showAnimation() { - if (MusicPlayerRemote.isPlaying()) { - MusicPlayerRemote.pauseSong(); - } else { - MusicPlayerRemote.resumePlaying(); - } - showBouceAnimation(); - } - - @Override - public void onUpdateProgressViews(int progress, int total) { - progressSlider.setMax(total); - - ObjectAnimator animator = ObjectAnimator.ofInt(progressSlider, "progress", progress); - animator.setDuration(1500); - animator.setInterpolator(new LinearInterpolator()); - animator.start(); - - songTotalTime.setText(MusicUtil.getReadableDurationString(total)); - songCurrentProgress.setText(MusicUtil.getReadableDurationString(progress)); - } - - @Override - public void setDark(int dark) { - int color = ATHUtil.resolveColor(getActivity(), android.R.attr.colorBackground); - if (ColorUtil.isColorLight(color)) { - lastPlaybackControlsColor = - MaterialValueHelper.getSecondaryTextColor(getActivity(), true); - lastDisabledPlaybackControlsColor = - MaterialValueHelper.getSecondaryDisabledTextColor(getActivity(), true); - } else { - lastPlaybackControlsColor = - MaterialValueHelper.getPrimaryTextColor(getActivity(), false); - lastDisabledPlaybackControlsColor = - MaterialValueHelper.getPrimaryDisabledTextColor(getActivity(), false); } - if (PreferenceUtil.getInstance(getContext()).getAdaptiveColor()) { - TintHelper.setTintAuto(playPauseFab, - MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(dark)), - false); - TintHelper.setTintAuto(playPauseFab, dark, true); - setProgressBarColor(dark); - } else { - int accentColor = ThemeStore.accentColor(getContext()); - setProgressBarColor(accentColor); - TintHelper.setTintAuto(playPauseFab, - MaterialValueHelper - .getPrimaryTextColor(getContext(), ColorUtil.isColorLight(accentColor)), - false); - TintHelper.setTintAuto(playPauseFab, accentColor, true); + private void setUpMusicControllers() { + setUpPlayPauseFab(); + setUpPrevNext(); + setUpRepeatButton(); + setUpShuffleButton(); + setUpProgressSlider(); } - updateRepeatState(); - updateShuffleState(); - updatePrevNextColor(); - } - public void setProgressBarColor(int newColor) { - LayerDrawable ld = (LayerDrawable) progressSlider.getProgressDrawable(); - ClipDrawable clipDrawable = (ClipDrawable) ld.findDrawableByLayerId(android.R.id.progress); - clipDrawable.setColorFilter(newColor, PorterDuff.Mode.SRC_IN); - } + private void setUpPrevNext() { + updatePrevNextColor(); + nextButton.setOnClickListener(v -> MusicPlayerRemote.playNextSong()); + prevButton.setOnClickListener(v -> MusicPlayerRemote.back()); + } - private void setUpPlayPauseFab() { - playerFabPlayPauseDrawable = new PlayPauseDrawable(getActivity()); + private void updatePrevNextColor() { + nextButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + prevButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + } - playPauseFab.setImageDrawable( - playerFabPlayPauseDrawable); // Note: set the drawable AFTER TintHelper.setTintAuto() was called - //playPauseFab.setColorFilter(MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(fabColor)), PorterDuff.Mode.SRC_IN); - //playPauseFab.setOnClickListener(new PlayPauseButtonOnClickHandler()); - playPauseFab.post(() -> { - if (playPauseFab != null) { + private void setUpShuffleButton() { + shuffleButton.setOnClickListener(v -> MusicPlayerRemote.toggleShuffleMode()); + } + + @Override + protected void updateShuffleState() { + switch (MusicPlayerRemote.getShuffleMode()) { + case MusicService.SHUFFLE_MODE_SHUFFLE: + shuffleButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + break; + default: + shuffleButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + break; + } + } + + private void setUpRepeatButton() { + repeatButton.setOnClickListener(v -> MusicPlayerRemote.cycleRepeatMode()); + } + + @Override + protected void updateRepeatState() { + switch (MusicPlayerRemote.getRepeatMode()) { + case MusicService.REPEAT_MODE_NONE: + repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp); + repeatButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + break; + case MusicService.REPEAT_MODE_ALL: + repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp); + repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + break; + case MusicService.REPEAT_MODE_THIS: + repeatButton.setImageResource(R.drawable.ic_repeat_one_white_24dp); + repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); + break; + } + } + + + @Override + protected void show() { + playPauseFab.animate() + .scaleX(1f) + .scaleY(1f) + .rotation(360f) + .setInterpolator(new DecelerateInterpolator()) + .start(); + } + + @Override + protected void hide() { + if (playPauseFab != null) { + playPauseFab.setScaleX(0f); + playPauseFab.setScaleY(0f); + playPauseFab.setRotation(0f); + } + } + + @Override + protected void setUpProgressSlider() { + progressSlider.setOnSeekBarChangeListener(new SimpleOnSeekbarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + MusicPlayerRemote.seekTo(progress); + onUpdateProgressViews(MusicPlayerRemote.getSongProgressMillis(), + MusicPlayerRemote.getSongDurationMillis()); + } + } + }); + } + + public void showBouceAnimation() { + playPauseFab.clearAnimation(); + + playPauseFab.setScaleX(0.9f); + playPauseFab.setScaleY(0.9f); + playPauseFab.setVisibility(View.VISIBLE); playPauseFab.setPivotX(playPauseFab.getWidth() / 2); playPauseFab.setPivotY(playPauseFab.getHeight() / 2); - } - }); - } - protected void updatePlayPauseDrawableState(boolean animate) { - if (MusicPlayerRemote.isPlaying()) { - playerFabPlayPauseDrawable.setPause(animate); - } else { - playerFabPlayPauseDrawable.setPlay(animate); + playPauseFab.animate() + .setDuration(200) + .setInterpolator(new DecelerateInterpolator()) + .scaleX(1.1f) + .scaleY(1.1f) + .withEndAction(() -> playPauseFab.animate() + .setDuration(200) + .setInterpolator(new AccelerateInterpolator()) + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .start()) + .start(); + } + + @OnClick(R.id.player_play_pause_button) + void showAnimation() { + if (MusicPlayerRemote.isPlaying()) { + MusicPlayerRemote.pauseSong(); + } else { + MusicPlayerRemote.resumePlaying(); + } + showBouceAnimation(); + } + + @Override + public void onUpdateProgressViews(int progress, int total) { + progressSlider.setMax(total); + + ObjectAnimator animator = ObjectAnimator.ofInt(progressSlider, "progress", progress); + animator.setDuration(1500); + animator.setInterpolator(new LinearInterpolator()); + animator.start(); + + songTotalTime.setText(MusicUtil.getReadableDurationString(total)); + songCurrentProgress.setText(MusicUtil.getReadableDurationString(progress)); + } + + @Override + public void setDark(int dark) { + int color = ATHUtil.resolveColor(getActivity(), android.R.attr.colorBackground); + if (ColorUtil.isColorLight(color)) { + lastPlaybackControlsColor = + MaterialValueHelper.getSecondaryTextColor(getActivity(), true); + lastDisabledPlaybackControlsColor = + MaterialValueHelper.getSecondaryDisabledTextColor(getActivity(), true); + } else { + lastPlaybackControlsColor = + MaterialValueHelper.getPrimaryTextColor(getActivity(), false); + lastDisabledPlaybackControlsColor = + MaterialValueHelper.getPrimaryDisabledTextColor(getActivity(), false); + } + + int finalColor = PreferenceUtil.getInstance(getContext()).getAdaptiveColor() + ? dark : ThemeStore.accentColor(getContext()); + + + setProgressBarColor(dark); + TintHelper.setTintAuto(playPauseFab, MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(finalColor)), false); + TintHelper.setTintAuto(playPauseFab, finalColor, true); + + updateRepeatState(); + updateShuffleState(); + updatePrevNextColor(); + } + + public void setProgressBarColor(int newColor) { + TintHelper.setTintAuto(progressSlider, newColor, false); + } + + private void setUpPlayPauseFab() { + playerFabPlayPauseDrawable = new PlayPauseDrawable(getActivity()); + + playPauseFab.setImageDrawable( + playerFabPlayPauseDrawable); // Note: set the drawable AFTER TintHelper.setTintAuto() was called + //playPauseFab.setColorFilter(MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(fabColor)), PorterDuff.Mode.SRC_IN); + //playPauseFab.setOnClickListener(new PlayPauseButtonOnClickHandler()); + playPauseFab.post(() -> { + if (playPauseFab != null) { + playPauseFab.setPivotX(playPauseFab.getWidth() / 2); + playPauseFab.setPivotY(playPauseFab.getHeight() / 2); + } + }); + } + + protected void updatePlayPauseDrawableState(boolean animate) { + if (MusicPlayerRemote.isPlaying()) { + playerFabPlayPauseDrawable.setPause(animate); + } else { + playerFabPlayPauseDrawable.setPlay(animate); + } } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/AbsSettingsFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/AbsSettingsFragment.java index a42528a11..d004c321a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/AbsSettingsFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/AbsSettingsFragment.java @@ -59,18 +59,17 @@ public abstract class AbsSettingsFragment extends ATEPreferenceFragmentCompat { setDividerHeight(0); setDivider(new ColorDrawable(Color.TRANSPARENT)); + //noinspection ConstantConditions getListView().setPadding(DensityUtil.dip2px(getContext(), 0), 0, 0, 0); getListView().addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (getActivity() != null) { - ((SettingsActivity) getActivity()) - .addAppbarLayoutElevation(recyclerView.canScrollVertically(RecyclerView.NO_POSITION) ? 8f : 0f); + ((SettingsActivity) getActivity()).addAppbarLayoutElevation(recyclerView.canScrollVertically(RecyclerView.NO_POSITION) ? 8f : 0f); } } }); - //noinspection ConstantConditions getListView().setBackgroundColor(ThemeStore.primaryColor(getContext())); getListView().setOverScrollMode(View.OVER_SCROLL_NEVER); invalidateSettings(); diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/MainSettingsFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/MainSettingsFragment.java index 9c5051664..0101f0924 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/MainSettingsFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/settings/MainSettingsFragment.java @@ -4,6 +4,7 @@ import android.graphics.PorterDuff; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StringRes; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; @@ -57,29 +58,29 @@ public class MainSettingsFragment extends Fragment { public void onViewClicked(View view) { switch (view.getId()) { case R.id.general_settings: - inflateFragment(new ThemeSettingsFragment()); + inflateFragment(new ThemeSettingsFragment(), R.string.general_settings_title); break; case R.id.audio_settings: - inflateFragment(new AudioSettings()); + inflateFragment(new AudioSettings(), R.string.pref_header_audio); break; case R.id.now_playing_settings: - inflateFragment(new NowPlayingSettingsFragment()); + inflateFragment(new NowPlayingSettingsFragment(), R.string.personalize); break; case R.id.image_settings: - inflateFragment(new ImageSettingFragment()); + inflateFragment(new ImageSettingFragment(), R.string.pref_header_images); break; case R.id.notification_settings: - inflateFragment(new NotificationSettingsFragment()); + inflateFragment(new NotificationSettingsFragment(), R.string.notification); break; case R.id.other_settings: - inflateFragment(new OtherSettingsFragment()); + inflateFragment(new OtherSettingsFragment(), R.string.others); break; } } - private void inflateFragment(Fragment fragment) { + private void inflateFragment(Fragment fragment, @StringRes int title) { if (getActivity() != null) { - ((SettingsActivity) getActivity()).setupFragment(fragment); + ((SettingsActivity) getActivity()).setupFragment(fragment, title); } } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java index d3d554fbf..4fb9d0234 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java @@ -1,7 +1,5 @@ package code.name.monkey.retromusic.util; -import static code.name.monkey.retromusic.ui.activities.GenreDetailsActivity.EXTRA_GENRE_ID; - import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; @@ -12,6 +10,7 @@ import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.util.Pair; import android.widget.Toast; + import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.helper.MusicPlayerRemote; import code.name.monkey.retromusic.model.Genre; @@ -31,100 +30,108 @@ import code.name.monkey.retromusic.ui.activities.SettingsActivity; import code.name.monkey.retromusic.ui.activities.SupportDevelopmentActivity; import code.name.monkey.retromusic.ui.activities.UserInfoActivity; +import static code.name.monkey.retromusic.Constants.RATE_ON_GOOGLE_PLAY; +import static code.name.monkey.retromusic.ui.activities.GenreDetailsActivity.EXTRA_GENRE_ID; +import static code.name.monkey.retromusic.util.RetroUtil.openUrl; + + public class NavigationUtil { - public static void goToAlbum(@NonNull Activity activity, int i, - @Nullable Pair... sharedElements) { - Intent intent = new Intent(activity, AlbumDetailsActivity.class); - intent.putExtra(AlbumDetailsActivity.EXTRA_ALBUM_ID, i); - //noinspection unchecked - ActivityCompat.startActivity(activity, intent, - ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); - } - - public static void goToArtist(@NonNull Activity activity, int i, - @Nullable Pair... sharedElements) { - Intent intent = new Intent(activity, ArtistDetailActivity.class); - intent.putExtra(ArtistDetailActivity.EXTRA_ARTIST_ID, i); - //noinspection unchecked - ActivityCompat.startActivity(activity, intent, - ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); - } - - public static void goToPlaylistNew(@NonNull Activity activity, Playlist playlist) { - Intent intent = new Intent(activity, PlaylistDetailActivity.class); - intent.putExtra(PlaylistDetailActivity.EXTRA_PLAYLIST, playlist); - ActivityCompat.startActivity(activity, intent, null); - } - - public static void openEqualizer(@NonNull final Activity activity) { - if (PreferenceUtil.getInstance(activity).getSelectedEqualizer().equals("system")) { - stockEqalizer(activity); - } else { - ActivityCompat.startActivity(activity, new Intent(activity, EqualizerActivity.class), null); + public static void goToAlbum(@NonNull Activity activity, int i, + @Nullable Pair... sharedElements) { + Intent intent = new Intent(activity, AlbumDetailsActivity.class); + intent.putExtra(AlbumDetailsActivity.EXTRA_ALBUM_ID, i); + //noinspection unchecked + ActivityCompat.startActivity(activity, intent, + ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); } - } - private static void stockEqalizer(@NonNull Activity activity) { - final int sessionId = MusicPlayerRemote.getAudioSessionId(); - if (sessionId == AudioEffect.ERROR_BAD_VALUE) { - Toast.makeText(activity, activity.getResources().getString(R.string.no_audio_ID), - Toast.LENGTH_LONG).show(); - } else { - try { - final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); - effects.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionId); - effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); - activity.startActivityForResult(effects, 0); - } catch (@NonNull final ActivityNotFoundException notFound) { - Toast.makeText(activity, activity.getResources().getString(R.string.no_equalizer), - Toast.LENGTH_SHORT).show(); - } + public static void goToArtist(@NonNull Activity activity, int i, + @Nullable Pair... sharedElements) { + Intent intent = new Intent(activity, ArtistDetailActivity.class); + intent.putExtra(ArtistDetailActivity.EXTRA_ARTIST_ID, i); + //noinspection unchecked + ActivityCompat.startActivity(activity, intent, + ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); } - } - public static void goToPlayingQueue(@NonNull Activity activity) { - Intent intent = new Intent(activity, PlayingQueueActivity.class); - ActivityCompat.startActivity(activity, intent, null); - } + public static void goToPlaylistNew(@NonNull Activity activity, Playlist playlist) { + Intent intent = new Intent(activity, PlaylistDetailActivity.class); + intent.putExtra(PlaylistDetailActivity.EXTRA_PLAYLIST, playlist); + ActivityCompat.startActivity(activity, intent, null); + } - public static void goToLyrics(@NonNull Activity activity) { - Intent intent = new Intent(activity, LyricsActivity.class); - ActivityCompat.startActivity(activity, intent, null); - } + public static void openEqualizer(@NonNull final Activity activity) { + if (PreferenceUtil.getInstance(activity).getSelectedEqualizer().equals("system")) { + stockEqalizer(activity); + } else { + ActivityCompat.startActivity(activity, new Intent(activity, EqualizerActivity.class), null); + } + } - public static void goToGenre(@NonNull Activity activity, @NonNull Genre genre) { - Intent intent = new Intent(activity, GenreDetailsActivity.class); - intent.putExtra(EXTRA_GENRE_ID, genre); - ActivityCompat.startActivity(activity, intent, null); - } + private static void stockEqalizer(@NonNull Activity activity) { + final int sessionId = MusicPlayerRemote.getAudioSessionId(); + if (sessionId == AudioEffect.ERROR_BAD_VALUE) { + Toast.makeText(activity, activity.getResources().getString(R.string.no_audio_ID), + Toast.LENGTH_LONG).show(); + } else { + try { + final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); + effects.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionId); + effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); + activity.startActivityForResult(effects, 0); + } catch (@NonNull final ActivityNotFoundException notFound) { + Toast.makeText(activity, activity.getResources().getString(R.string.no_equalizer), + Toast.LENGTH_SHORT).show(); + } + } + } - public static void goToProVersion(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, ProVersionActivity.class), null); - } + public static void goToPlayingQueue(@NonNull Activity activity) { + Intent intent = new Intent(activity, PlayingQueueActivity.class); + ActivityCompat.startActivity(activity, intent, null); + } - public static void goToSettings(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, SettingsActivity.class), null); - } + public static void goToLyrics(@NonNull Activity activity) { + Intent intent = new Intent(activity, LyricsActivity.class); + ActivityCompat.startActivity(activity, intent, null); + } - public static void goToAbout(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, AboutActivity.class), null); - } + public static void goToGenre(@NonNull Activity activity, @NonNull Genre genre) { + Intent intent = new Intent(activity, GenreDetailsActivity.class); + intent.putExtra(EXTRA_GENRE_ID, genre); + ActivityCompat.startActivity(activity, intent, null); + } - public static void goToUserInfo(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, UserInfoActivity.class), null); - } + public static void goToProVersion(@NonNull Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, ProVersionActivity.class), null); + } - public static void goToOpenSource(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, LicenseActivity.class), null); - } + public static void goToSettings(@NonNull Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, SettingsActivity.class), null); + } - public static void goToSearch(Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, SearchActivity.class), null); - } + public static void goToAbout(@NonNull Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, AboutActivity.class), null); + } - public static void goToSupportDevelopment(Activity activity) { - ActivityCompat - .startActivity(activity, new Intent(activity, SupportDevelopmentActivity.class), null); - } + public static void goToUserInfo(@NonNull Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, UserInfoActivity.class), null); + } + + public static void goToOpenSource(@NonNull Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, LicenseActivity.class), null); + } + + public static void goToSearch(Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, SearchActivity.class), null); + } + + public static void goToSupportDevelopment(Activity activity) { + ActivityCompat.startActivity(activity, new Intent(activity, SupportDevelopmentActivity.class), null); + } + + public static void goToPlayStore(Activity activity) { + openUrl(activity, RATE_ON_GOOGLE_PLAY); + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java index e66e5627f..614b2ab3d 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java @@ -137,7 +137,7 @@ public class RetroUtil { } - public static void openUrl(AppCompatActivity context, String str) { + public static void openUrl(Activity context, String str) { Intent intent = new Intent("android.intent.action.VIEW"); intent.setData(Uri.parse(str)); intent.setFlags(268435456); diff --git a/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.java b/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.java index c6319bc3f..91caed134 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.java +++ b/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.java @@ -92,7 +92,7 @@ public class MetalRecyclerViewPager extends RecyclerView { } @Override - public void onBindViewHolder(VH holder, int position) { + public void onBindViewHolder(@NonNull VH holder, int position) { int currentItemWidth = itemWidth; if (position == 0) { diff --git a/app/src/main/java/code/name/monkey/retromusic/views/RoundCornerFrameLayout.java b/app/src/main/java/code/name/monkey/retromusic/views/RoundCornerFrameLayout.java deleted file mode 100644 index a4654663e..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/views/RoundCornerFrameLayout.java +++ /dev/null @@ -1,70 +0,0 @@ -package code.name.monkey.retromusic.views; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Path; -import android.graphics.RectF; -import android.graphics.Region; -import android.util.AttributeSet; -import android.widget.FrameLayout; -import code.name.monkey.retromusic.R; - -/** - * Frame layout that has rounded corners (it clips content too). - * - * @author Anton Chekulaev - */ -public class RoundCornerFrameLayout extends FrameLayout { - - private final Path stencilPath = new Path(); - private float cornerRadius = 0; - - public RoundCornerFrameLayout(Context context) { - this(context, null); - } - - public RoundCornerFrameLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public RoundCornerFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - TypedArray attrArray = context - .obtainStyledAttributes(attrs, R.styleable.RoundCornerFrameLayout, 0, 0); - try { - cornerRadius = attrArray.getDimension(R.styleable.RoundCornerFrameLayout_corner_radius, 0f); - } finally { - attrArray.recycle(); - } - } - - /*@Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - // compute the path - stencilPath.reset(); - stencilPath.addRoundRect(0, 0, w, h, cornerRadius, cornerRadius, Path.Direction.CW); - stencilPath.close(); - - } -*/ - @Override - protected void dispatchDraw(Canvas canvas) { - final int count = canvas.save(); - final Path path = new Path(); - final RectF rect = new RectF(0, 0, canvas.getWidth(), canvas.getHeight()); - final float[] arrayRadius = {cornerRadius, cornerRadius, cornerRadius, cornerRadius, - cornerRadius, cornerRadius, cornerRadius, cornerRadius}; - - path.addRoundRect(rect, arrayRadius, Path.Direction.CW); - canvas.clipPath(path, Region.Op.REPLACE); - canvas.clipPath(path); - - super.dispatchDraw(canvas); - - canvas.restoreToCount(count); - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/views/RoundedBottomSheetDialogFragment.java b/app/src/main/java/code/name/monkey/retromusic/views/RoundedBottomSheetDialogFragment.java index bdebc530e..7f47b5016 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/RoundedBottomSheetDialogFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/views/RoundedBottomSheetDialogFragment.java @@ -6,6 +6,9 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomSheetDialog; import android.support.design.widget.BottomSheetDialogFragment; + +import code.name.monkey.appthemehelper.ThemeStore; +import code.name.monkey.appthemehelper.util.ColorUtil; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.ui.activities.base.AbsThemeActivity; import code.name.monkey.retromusic.util.PreferenceUtil; @@ -16,24 +19,31 @@ import code.name.monkey.retromusic.util.PreferenceUtil; @SuppressLint("RestrictedApi") public class RoundedBottomSheetDialogFragment extends BottomSheetDialogFragment { - @Override - public int getTheme() { - //noinspection ConstantConditions - return - PreferenceUtil.getInstance(getContext()).getGeneralTheme() == R.style.Theme_RetroMusic_Light - ? R.style.BottomSheetDialogTheme : R.style.BottomSheetDialogThemeDark; - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AbsThemeActivity absThemeActivity = (AbsThemeActivity) getActivity(); - if (absThemeActivity != null) { - absThemeActivity.setLightNavigationBar(true); - Dialog dialog = new BottomSheetDialog(getContext(), getTheme()); - + @Override + public int getTheme() { + //noinspection ConstantConditions + if (PreferenceUtil.getInstance(getContext()).getGeneralTheme() == R.style.Theme_RetroMusic_Light) { + return R.style.BottomSheetDialogTheme; + } else if (PreferenceUtil.getInstance(getContext()).getGeneralTheme() == R.style.Theme_RetroMusic_Color) { + int color = ThemeStore.primaryColor(getContext()); + if (ColorUtil.isColorLight(color)) { + return R.style.BottomSheetDialogTheme; + } else { + return R.style.BottomSheetDialogThemeDark; + } + } else { + return R.style.BottomSheetDialogTheme; + } + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AbsThemeActivity absThemeActivity = (AbsThemeActivity) getActivity(); + if (absThemeActivity != null) { + absThemeActivity.setLightNavigationBar(true); + } + //noinspection ConstantConditions + return new BottomSheetDialog(getContext(), getTheme()); } - //noinspection ConstantConditions - return new BottomSheetDialog(getContext(), getTheme()); - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/views/SansFontCollapsingToolbarLayout.java b/app/src/main/java/code/name/monkey/retromusic/views/SansFontCollapsingToolbarLayout.java index 8c64add37..031022293 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/SansFontCollapsingToolbarLayout.java +++ b/app/src/main/java/code/name/monkey/retromusic/views/SansFontCollapsingToolbarLayout.java @@ -29,7 +29,7 @@ public class SansFontCollapsingToolbarLayout extends CollapsingToolbarLayout { } private void init(Context context) { - Typeface typefaceBold = TypefaceHelper.get(context, getResources().getString(R.string.sans_bold)); + Typeface typefaceBold = TypefaceHelper.get(context, getResources().getString(R.string.circular_std_black)); setExpandedTitleTypeface(typefaceBold); setCollapsedTitleTypeface(typefaceBold); diff --git a/app/src/main/res/drawable/bg_card_line.xml b/app/src/main/res/drawable/bg_card_line.xml new file mode 100644 index 000000000..8bf1506b9 --- /dev/null +++ b/app/src/main/res/drawable/bg_card_line.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_circular_top_corners.xml b/app/src/main/res/drawable/bg_circular_top_corners.xml index 299df8282..38b8f58b0 100644 --- a/app/src/main/res/drawable/bg_circular_top_corners.xml +++ b/app/src/main/res/drawable/bg_circular_top_corners.xml @@ -1,8 +1,9 @@ - - + android:shape="rectangle"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_settings.xml b/app/src/main/res/layout-land/activity_settings.xml index 5c671f60e..9559b7fbd 100644 --- a/app/src/main/res/layout-land/activity_settings.xml +++ b/app/src/main/res/layout-land/activity_settings.xml @@ -1,56 +1,63 @@ - - - - - - - - - - - - - + xmlns:tools="http://schemas.android.com/tools"> - + - - + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-land/fragment_banner_home.xml b/app/src/main/res/layout-land/fragment_banner_home.xml index afb53ac3c..272f6df47 100644 --- a/app/src/main/res/layout-land/fragment_banner_home.xml +++ b/app/src/main/res/layout-land/fragment_banner_home.xml @@ -1,116 +1,113 @@ - - + android:layout_height="match_parent" + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + tools:ignore="UnusedAttribute"> - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml index 576f2864b..3790019aa 100644 --- a/app/src/main/res/layout-land/fragment_home.xml +++ b/app/src/main/res/layout-land/fragment_home.xml @@ -82,21 +82,20 @@ diff --git a/app/src/main/res/layout-land/fragment_plain_player.xml b/app/src/main/res/layout-land/fragment_plain_player.xml index ec8627cb9..41ad33c90 100644 --- a/app/src/main/res/layout-land/fragment_plain_player.xml +++ b/app/src/main/res/layout-land/fragment_plain_player.xml @@ -49,10 +49,10 @@ android:layout_height="wrap_content" android:layout_weight="0" android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingEnd="16dp" android:paddingStart="16dp" - android:paddingTop="8dp"> + android:paddingTop="8dp" + android:paddingEnd="16dp" + android:paddingBottom="16dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-xlarge-land/fragment_home.xml b/app/src/main/res/layout-xlarge-land/fragment_home.xml index 3cd54c39d..d54e05e0c 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_home.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_home.xml @@ -79,20 +79,19 @@ + android:layout_height="wrap_content" + android:elevation="0dp" + app:elevation="0dp"> - - - + android:layout_height="wrap_content" + app:layout_scrollFlags="scroll|enterAlwaysCollapsed" + app:titleEnabled="false"> - + app:title="" + tools:ignore="UnusedAttribute"> + + + + + + diff --git a/app/src/main/res/layout-xlarge/fragment_library.xml b/app/src/main/res/layout-xlarge/fragment_library.xml index 4b1c039d3..6c153a9d8 100644 --- a/app/src/main/res/layout-xlarge/fragment_library.xml +++ b/app/src/main/res/layout-xlarge/fragment_library.xml @@ -1,69 +1,92 @@ - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:elevation="0dp" + tools:ignore="UnusedAttribute"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index e62ea1cab..3ffce59aa 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -1,45 +1,53 @@ - - + android:layout_height="match_parent"> - - - + android:layout_height="wrap_content" + android:elevation="0dp" + app:elevation="0dp"> - + - - - + - - + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_album.xml b/app/src/main/res/layout/activity_album.xml index aaca94245..c8b8c7e1b 100755 --- a/app/src/main/res/layout/activity_album.xml +++ b/app/src/main/res/layout/activity_album.xml @@ -1,170 +1,167 @@ - - + android:layout_height="match_parent"> - + - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + android:background="@drawable/bg_circular_top_corners" + app:behavior_overlapTop="24dp" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - + android:orientation="vertical"> - + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - + android:layout_gravity="bottom|end" + android:layout_margin="16dp" + app:layout_behavior="code.name.monkey.retromusic.misc.ScrollAwareFABBehavior" + app:srcCompat="@drawable/ic_shuffle_white_24dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_artist_details.xml b/app/src/main/res/layout/activity_artist_details.xml index 80f043d76..7fb84d541 100755 --- a/app/src/main/res/layout/activity_artist_details.xml +++ b/app/src/main/res/layout/activity_artist_details.xml @@ -1,178 +1,177 @@ - - + android:layout_height="match_parent"> - + - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + android:background="@drawable/bg_circular_top_corners" + android:overScrollMode="never" + app:behavior_overlapTop="24dp" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - + android:orientation="vertical"> - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/layout/activity_donation.xml b/app/src/main/res/layout/activity_donation.xml index f2fa427c9..4c3170b6d 100644 --- a/app/src/main/res/layout/activity_donation.xml +++ b/app/src/main/res/layout/activity_donation.xml @@ -9,31 +9,41 @@ + android:layout_height="wrap_content" + android:elevation="0dp" + app:elevation="0dp"> - - - + android:layout_height="wrap_content" + app:titleEnabled="false"> + app:title="" + tools:ignore="UnusedAttribute"> - + + + + + + + android:paddingBottom="@dimen/md_content_padding_top"> diff --git a/app/src/main/res/layout/activity_equalizer.xml b/app/src/main/res/layout/activity_equalizer.xml index 9f374f86e..25bfda514 100644 --- a/app/src/main/res/layout/activity_equalizer.xml +++ b/app/src/main/res/layout/activity_equalizer.xml @@ -1,151 +1,160 @@ - - + android:layout_height="match_parent"> - - - - - - - - - - - - - - - - - + android:elevation="0dp" + app:elevation="0dp"> - + - - + - + + + + + + + + + + app:layout_behavior="@string/appbar_scrolling_view_behavior"> - + - - + - + - + + - - + - + - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_license.xml b/app/src/main/res/layout/activity_license.xml index 5c8d1bb9f..95760a6a5 100644 --- a/app/src/main/res/layout/activity_license.xml +++ b/app/src/main/res/layout/activity_license.xml @@ -7,31 +7,43 @@ android:layout_height="match_parent"> + android:elevation="0dp" + app:elevation="0dp"> - + android:layout_height="wrap_content" + app:layout_scrollFlags="scroll|enterAlways" + app:titleEnabled="false"> + - + app:layout_collapseMode="pin" + app:title="" + tools:ignore="UnusedAttribute"> + + + + + - - - - + android:layout_height="match_parent" + android:orientation="vertical"> - - - + android:layout_height="wrap_content" + android:elevation="0dp" + app:elevation="0dp"> - - + - - + - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index ff532b9ac..287b03e20 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -23,31 +23,51 @@ android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:focusable="true" - tools:ignore="UnusedAttribute"> + android:elevation="0dp" + app:elevation="0dp"> - + android:layout_height="wrap_content" + app:layout_scrollFlags="scroll|enterAlways" + app:titleEnabled="false"> - - + - + + + + + + + + + + - + android:layout_height="1dp" + android:background="?dividerColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:orientation="vertical"> - - + android:layout_height="wrap_content"> - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index fcb7bd500..08662ec0f 100755 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,37 +1,43 @@ - - - + android:layout_height="wrap_content" + app:titleEnabled="false"> + app:title="" + tools:ignore="UnusedAttribute"> - + + + + diff --git a/app/src/main/res/layout/dialog_changelog.xml b/app/src/main/res/layout/dialog_changelog.xml new file mode 100644 index 000000000..65162132d --- /dev/null +++ b/app/src/main/res/layout/dialog_changelog.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_banner_home.xml b/app/src/main/res/layout/fragment_banner_home.xml index 2945006ec..be09ec235 100644 --- a/app/src/main/res/layout/fragment_banner_home.xml +++ b/app/src/main/res/layout/fragment_banner_home.xml @@ -1,107 +1,106 @@ - - + android:layout_height="match_parent" + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + tools:ignore="UnusedAttribute"> - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_folder.xml b/app/src/main/res/layout/fragment_folder.xml index d4bc2db22..7be297fdc 100644 --- a/app/src/main/res/layout/fragment_folder.xml +++ b/app/src/main/res/layout/fragment_folder.xml @@ -1,120 +1,121 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:orientation="vertical"> - - - - + android:elevation="0dp" + tools:ignore="UnusedAttribute"> + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c8f505994..404c63b4b 100755 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -15,13 +15,8 @@ @@ -50,7 +45,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" - android:padding="16dp" + android:background="?roundSelector" + android:padding="12dp" android:src="@drawable/ic_search_white_24dp" /> - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:ignore="UnusedAttribute"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/home_section_recycler_view.xml b/app/src/main/res/layout/home_section_recycler_view.xml new file mode 100644 index 000000000..7a6100f9e --- /dev/null +++ b/app/src/main/res/layout/home_section_recycler_view.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/item_collage.xml b/app/src/main/res/layout/item_collage.xml index 2fdb9aab1..b9d0f2a03 100644 --- a/app/src/main/res/layout/item_collage.xml +++ b/app/src/main/res/layout/item_collage.xml @@ -1,209 +1,211 @@ - - - - - - - - - - - - - - + android:orientation="vertical"> - - - + android:layout_height="wrap_content" + android:orientation="horizontal"> - + + + + + + + + + + + - - + android:layout_weight="2.68" + android:gravity="center" + android:orientation="vertical"> - + - + - + + + + + + + + + + + + + - - + android:layout_height="wrap_content" + android:layout_weight="2" + android:minHeight="100dp"> + + + + + + + + + - - - - + android:layout_height="wrap_content" + android:orientation="horizontal"> - - - - - + android:layout_height="wrap_content" + android:layout_weight="1"> - + - + + + - + - - - + - + + + - + - - - - + - + + + - - - + - + - + - + + + - - - + - + - - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_donation_option.xml b/app/src/main/res/layout/item_donation_option.xml index b2f53fa86..4630f4cda 100644 --- a/app/src/main/res/layout/item_donation_option.xml +++ b/app/src/main/res/layout/item_donation_option.xml @@ -8,8 +8,9 @@ + app:cardCornerRadius="8dp" + app:cardUseCompatPadding="true" + app:contentPadding="12dp"> + android:layout_width="36dp" + android:layout_height="36dp"> - - - - - - - - + android:layout_height="wrap_content" + android:background="?rectSelector" + tools:ignore="MissingPrefix"> - - + android:orientation="vertical" + tools:ignore="UnusedAttribute,UselessParent"> - + + + + + + + + + + + + - diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml index 9bf53ceef..8a7145115 100644 --- a/app/src/main/res/layout/item_image.xml +++ b/app/src/main/res/layout/item_image.xml @@ -1,40 +1,38 @@ - - - + - + + + + + + + - - - - - + android:layout_height="wrap_content" + android:ellipsize="end" + android:maxLines="1" + android:padding="12dp" + android:textColor="?android:attr/textColorPrimary" /> \ No newline at end of file diff --git a/app/src/main/res/layout/pager_item.xml b/app/src/main/res/layout/pager_item.xml index 79c834b71..e6a0c370f 100644 --- a/app/src/main/res/layout/pager_item.xml +++ b/app/src/main/res/layout/pager_item.xml @@ -11,8 +11,7 @@ android:id="@+id/image_container" android:layout_width="match_parent" android:layout_height="182dp" - app:cardCornerRadius="8dp" - app:cardElevation="6dp" + app:cardCornerRadius="12dp" app:cardUseCompatPadding="true"> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 723db8562..cb9fa8a4d 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,78 +1,71 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context=".DrawerActivity"> - + - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + - - - - + - + - - - + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 81c845f37..dc0dc1cac 100755 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -5,6 +5,7 @@ @string/only_on_wifi @string/never + @string/light_theme_name @string/dark_theme_name @@ -16,19 +17,23 @@ @string/normal_style @string/card_style @string/card_color_style + @string/card_circular_style 0 1 2 + 3 @layout/item_grid @layout/item_card @layout/item_card_color + @layout/item_grid_circle + light dark diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 0d4ca1cc3..c3383dae0 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -12,9 +12,6 @@ - - - @@ -26,6 +23,7 @@ + diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 3e4afcefb..e7299f6b3 100755 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -36,8 +36,6 @@ Hosur, India fonts/circular_std_black.otf fonts/circular_std_book.otf - fonts/product_sans_regular.ttf - fonts/product_sans_bold.ttf Marko Ivanović Contributor Gaming Inc diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a716169b0..c296d156a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,681 +1,682 @@ - Accent color - The accent theme color, defaults to teal + Accent color + The accent theme color, defaults to teal - About - Add to favorites - Add to playing queue - Add to playlist… - Clear playing queue - Clear playlist - Cycle repeat mode - Delete - Delete from device - Details - Go to album - Go to artist - Go to genre - Go to start directory - Grant - Grid size - Grid size (land) - New playlist… - Next - Play - Play next - Play/Pause - Previous - Update artist image - Remove from favorites - Remove from playing queue - Remove from playlist - Rename - Save playing queue - Scan - Scan directory - Search - Set - Set as ringtone - Set as start directory - "Settings" - Share - Show lyrics - Shuffle album - Shuffle all - Shuffle artist - Shuffle playlist - Sleep timer - Sort order - Tag editor - Toggle favorite - Toggle shuffle mode + About + Add to favorites + Add to playing queue + Add to playlist… + Clear playing queue + Clear playlist + Cycle repeat mode + Delete + Delete from device + Details + Go to album + Go to artist + Go to genre + Go to start directory + Grant + Grid size + Grid size (land) + New playlist… + Next + Play + Play next + Play/Pause + Previous + Update artist image + Remove from favorites + Remove from playing queue + Remove from playlist + Rename + Save playing queue + Scan + Scan directory + Search + Set + Set as ringtone + Set as start directory + "Settings" + Share + Show lyrics + Shuffle album + Shuffle all + Shuffle artist + Shuffle playlist + Sleep timer + Sort order + Tag editor + Toggle favorite + Toggle shuffle mode - Adaptive + Adaptive - Add - Add \nphoto - "Add to playlist" + Add + Add \nphoto + "Add to playlist" - "Added 1 title to the playing queue." - Added %1$d titles to the playing queue. + "Added 1 title to the playing queue." + Added %1$d titles to the playing queue. - Album - Album artist - Album desc. - The title or artist is empty. + Album + Album artist + Album desc. + The title or artist is empty. - Albums - - Albums + Albums + + Albums - Always + Always - Hey check out this cool music player at: https://play.google.com/store/apps/details?id=%s - - @string/last_added - @string/last_added - @string/action_shuffle_all - Shuffle - @string/my_top_tracks - Top Tracks - A Hybrid application between Material design and iOS in mind. - Retro music - Big - Retro music - Big2 - Retro music - Card - Retro music - Classic - Retro music - Small + Hey check out this cool music player at: https://play.google.com/store/apps/details?id=%s + + @string/last_added + @string/last_added + @string/action_shuffle_all + Shuffle + @string/my_top_tracks + Top Tracks + A Hybrid application between Material design and iOS in mind. + Retro music - Big + Retro music - Big2 + Retro music - Card + Retro music - Classic + Retro music - Small - Artist - Artist desc. + Artist + Artist desc. - Artists + Artists - At least one category must be enabled. + At least one category must be enabled. - Audio focus denied. - Change the sound settings and adjust the equalizer controls + Audio focus denied. + Change the sound settings and adjust the equalizer controls - Bass Boost - Bass Boost Strength + Bass Boost + Bass Boost Strength - Biography - Couldn\u2019t find the artists biography. + Biography + Couldn\u2019t find the artists biography. - Just Black + Just Black - Blacklist + Blacklist - Blur - Blur Card - Keep the screen on - Keep in mind that enabling this feature may affect battery life - Blur amount - Amount of blur applied for blur themes, lower is faster + Blur + Blur Card + Keep the screen on + Keep in mind that enabling this feature may affect battery life + Blur amount + Amount of blur applied for blur themes, lower is faster - Buy RetroMusic Pro + Buy RetroMusic Pro - Cancel current timer + Cancel current timer - Card - Colored Card - Card + Card + Colored Card + Circular + Card - Cast + Cast - Changelog - Changelog maintained on the Telegram channel + Changelog + Changelog maintained on the Telegram channel - Clear - Clear blacklist - Clear playlist - %1$s? This can\u2019t be undone!]]> + Clear + Clear blacklist + Clear playlist + %1$s? This can\u2019t be undone!]]> - Close + Close - Color - Color - Color style + Color + Color + Color style - Colored footers + Colored footers - Colors + Colors - Couldn\u2019t create playlist. - "Couldn\u2019t download a matching album cover." - Could not restore purchase. - Could not scan %d files. + Couldn\u2019t create playlist. + "Couldn\u2019t download a matching album cover." + Could not restore purchase. + Could not scan %d files. - Create + Create - Created playlist %1$s. + Created playlist %1$s. - Members and contributors + Members and contributors - Currently listening to %1$s by %2$s. + Currently listening to %1$s by %2$s. - Custom + Custom - Kinda Dark + Kinda Dark - Date + Date - No Lyrics + No Lyrics - Delete - Delete playlist - %1$s?]]> - Delete playlists - Delete song - %1$s?]]> - Delete songs - %1$d playlists?]]> - %1$d songs?]]> + Delete + Delete playlist + %1$s?]]> + Delete playlists + Delete song + %1$s?]]> + Delete songs + %1$d playlists?]]> + %1$d songs?]]> - Deleted %1$d songs. + Deleted %1$d songs. - Deleting songs + Deleting songs - Discord - Join the Discord server to keep up with the latest news + Discord + Join the Discord server to keep up with the latest news - Do you want to clear the blacklist? - %1$s from the blacklist?]]> + Do you want to clear the blacklist? + %1$s from the blacklist?]]> - Donate - If my development deserve to get paid, you can leave some + Donate + If my development deserve to get paid, you can leave some dollars here - Buy me a + Buy me a - Download from Last.fm + Download from Last.fm - Duration + Duration - Edit - Edit categories - Edit cover - Edit tags + Edit + Edit categories + Edit cover + Edit tags - Empty + Empty - Equalizer + Equalizer - Error loading from network + Error loading from network - Experimental + Experimental - Facebook Page - Help us to grove faster by sharing facebook page + Facebook Page + Help us to grove faster by sharing facebook page - Failed to save playlist (%s). + Failed to save playlist (%s). - FAQ + FAQ - Favorites + Favorites - Flat + Flat - Folders + Folders - For you + For you - Full + Full - Change the theme and colors of the app - Look and feel + Change the theme and colors of the app + Look and feel - Genre + Genre - Genres + Genres - Fork the project on GitHub + Fork the project on GitHub - Join the Google Plus community where you can ask for help or follow Retro Music updates + Join the Google Plus community where you can ask for help or follow Retro Music updates - Gradient + Gradient - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 - History - History + History + History - Holiday + Holiday - Home + Home - Change artist image download settings + Change artist image download settings - Inserted %1$d songs into the playlist %2$s. + Inserted %1$d songs into the playlist %2$s. - Inspired designs by + Inspired designs by - Instagram - Share your Retro Music setup to showcase on Instagram + Instagram + Share your Retro Music setup to showcase on Instagram - Join the Google Plus community - If you need help or have questions, the Retro Music community on Google Plus is a good place to go. + Join the Google Plus community + If you need help or have questions, the Retro Music community on Google Plus is a good place to go. - Bitrate - Details - Format - File name - File path - Size - Sampling rate - Length + Bitrate + Details + Format + File name + File path + Size + Sampling rate + Length - Language translators + Language translators - Last added + Last added - Let\'s play some music + Let\'s play some music - Library - Library categories + Library + Library categories - Licenses + Licenses - Clearly White + Clearly White - List style + List style - Listing files + Listing files - Loading... - Loading products… + Loading... + Loading products… - Lyrics + Lyrics - Material + Material - Cast device + Cast device - More + More - My Name - My playlist - Top played + My Name + My playlist + Top played - Never + Never - New banner photo - New Music Mix - New playlist - New profile photo - %s is the new start directory. + New banner photo + New Music Mix + New playlist + New profile photo + %s is the new start directory. - No albums - No artists - "Play a song first, then try again." - No equalizer found - No files - No genres - No lyrics found - No playlists - No purchase found. - No results - No songs + No albums + No artists + "Play a song first, then try again." + No equalizer found + No files + No genres + No lyrics found + No playlists + No purchase found. + No results + No songs - Normal - Normal lyrics - Normal + Normal + Normal lyrics + Normal - %s is not listed in the media store.]]> + %s is not listed in the media store.]]> - Nothing to scan. + Nothing to scan. - Notification - Customize the notification style + Notification + Customize the notification style - Now playing - Now playing queue + Now playing + Now playing queue - Only on Wi-Fi + Only on Wi-Fi - Other + Other - Past 3 months + Past 3 months - Patreon page - Support us from patreon + Patreon page + Support us from patreon - PayPal.me - PayPal.me is an easy way to donate us money. In case you only linked a debit or credit card the fee in the U.S. is 2.9% of the donation plus $0.30 USD, otherwise there is no fee.more + PayPal.me + PayPal.me is an easy way to donate us money. In case you only linked a debit or credit card the fee in the U.S. is 2.9% of the donation plus $0.30 USD, otherwise there is no fee.more - Permission to access external storage denied. - - Permissions denied. - - Personalize - Customize your now playing and UI controls - - Pick from local storage - - Plain - - Play - Play all - - The playing notification provides actions for play/pause etc. - Playing notification - - Empty playlist - Playlist is empty - Playlist name - - Playlists - Playlists - - Audio - Theme - Images - Lockscreen - Now playing - Playlists - "Only available on Lollipop." - "Only available on Nougat 7.1." - People who helped on the project - Use the currently playing song album cover as the lockscreen wallpaper - Lower the volume when a system sound is played or a notification is received - Blur the album cover on the lockscreen. Can cause problems with third party apps and widgets - Carousel effect for the album art in the now playing screen. Note that Card and Blur Card themes won\'t work - Show a circular album cover in the now playing screen. Note that only a few themes work with this feature - Use the classic notification design - The background and control button colors change according to the album art from the now playing screen - Colors the app shortcuts in the accent color. Every time you change the color please toggle this to take effect - Colors the navigation bar in the primary color - "Colors the notification in the album cover\u2019s vibrant color" - Shows song details on dream when music is playing - Most dominant color will be picked from the album or artist cover - Exclude songs that are less than 30 secs. - "Can cause playback issues on some devices." - Can increase the album cover quality, but causes slower image loading times. Only enable this if you have problems with low resolution artworks - Change app language forcefully to english(this is testing for multiple language option) - Configure visibility and order of library categories. - Use Retro Music\'s custom lockscreen controls - Show full controls from the lock screen - License details for open source software - Round the app\'s edges - Toggle titles for the bottom navigation bar tabs - Animations makes some device run slow, load images slow - Disable titles from bottom navigation bar - Immersive mode - Show genres on the home screen - Start playing immediately after headphones are connected - Hide only navigation bar - Toggle view of separate line in list of items - Shuffle mode will turn off when playing a new list of songs - Hide only status bar - If enough space is available, show volume controls in the now playing screen - Show album cover - Album grid - Colored app shortcuts - Artist grid - Reduce volume on focus loss - Auto-download artist images - Blur album cover - Choose equalizer - Classic notification design - Adaptive color - Colored notification - Day dream - Exclude songs - Give access to external storage - Gapless playback - App theme - Choose color - Ignore Media Store covers - Last added playlist interval - Fullscreen controls - Retro lock screen - Lyrics options - Colored navigation bar - Now playing theme - Open source licences - Corner edges - Animations - Disable titles - Carousel effect - Circular album - Dominant color - Fullscreen app - Show genre - English language - Navigation bar - Separate line - Status bar - Tab titles - Auto-play - Shuffle mode - Volume controls - User info - - Primary color - The primary theme color, defaults to blue grey, for now works with dark colors - - Purchase - *Think before buying, don\'t ask for refund. - - Queue - Queue - - Rate the app - Love this app? Let us know in the Google Play Store how we can make it even better - - Recent activity - Recent albums - Recent artists - - Remove - Remove banner photo - Remove cover - Remove from blacklist - Remove profile photo - Remove song from playlist - %1$s from the playlist?]]> - Remove songs from playlist - %1$d songs from the playlist?]]> - - Rename - Rename playlist - - Reset - Reset artist image - - Restore - - Restored previous purchase. Please restart the app to make use of all features. - Restored previous purchases. - - Restoring purchase… - - Retro - Retro Music Equalizer - - File delete failed: %s - - Can\'t get SAF URI - Open navigation drawer - Enable \'Show SD card\' in overflow menu - - %s needs SD card access - You need to select your SD card root directory - Select your SD card in navigation drawer - Do not open any subfolders - Tap \'select\' button at the bottom of the screen - File access required. Pick %s - SD card access required. Please pick root directory of SD card - File write failed: %s - - Save as file - Save as files - - Saved playlist to %s. - - Saving changes - Saving tags - Saving to file… - - Scan media - - Scanned %1$d of %2$d files. + Permission to access external storage denied. + + Permissions denied. + + Personalize + Customize your now playing and UI controls + + Pick from local storage + + Plain + + Play + Play all + + The playing notification provides actions for play/pause etc. + Playing notification + + Empty playlist + Playlist is empty + Playlist name + + Playlists + Playlists + + Audio + Theme + Images + Lockscreen + Now playing + Playlists + "Only available on Lollipop." + "Only available on Nougat 7.1." + People who helped on the project + Use the currently playing song album cover as the lockscreen wallpaper + Lower the volume when a system sound is played or a notification is received + Blur the album cover on the lockscreen. Can cause problems with third party apps and widgets + Carousel effect for the album art in the now playing screen. Note that Card and Blur Card themes won\'t work + Show a circular album cover in the now playing screen. Note that only a few themes work with this feature + Use the classic notification design + The background and control button colors change according to the album art from the now playing screen + Colors the app shortcuts in the accent color. Every time you change the color please toggle this to take effect + Colors the navigation bar in the primary color + "Colors the notification in the album cover\u2019s vibrant color" + Shows song details on dream when music is playing + Most dominant color will be picked from the album or artist cover + Exclude songs that are less than 30 secs. + "Can cause playback issues on some devices." + Can increase the album cover quality, but causes slower image loading times. Only enable this if you have problems with low resolution artworks + Change app language forcefully to english(this is testing for multiple language option) + Configure visibility and order of library categories. + Use Retro Music\'s custom lockscreen controls + Show full controls from the lock screen + License details for open source software + Round the app\'s edges + Toggle titles for the bottom navigation bar tabs + Animations makes some device run slow, load images slow + Disable titles from bottom navigation bar + Immersive mode + Show genres on the home screen + Start playing immediately after headphones are connected + Hide only navigation bar + Toggle view of separate line in list of items + Shuffle mode will turn off when playing a new list of songs + Hide only status bar + If enough space is available, show volume controls in the now playing screen + Show album cover + Album grid + Colored app shortcuts + Artist grid + Reduce volume on focus loss + Auto-download artist images + Blur album cover + Choose equalizer + Classic notification design + Adaptive color + Colored notification + Day dream + Exclude songs + Give access to external storage + Gapless playback + App theme + Choose color + Ignore Media Store covers + Last added playlist interval + Fullscreen controls + Retro lock screen + Lyrics options + Colored navigation bar + Now playing theme + Open source licences + Corner edges + Animations + Disable titles + Carousel effect + Circular album + Dominant color + Fullscreen app + Show genre + English language + Navigation bar + Separate line + Status bar + Tab titles + Auto-play + Shuffle mode + Volume controls + User info + + Primary color + The primary theme color, defaults to blue grey, for now works with dark colors + + Purchase + *Think before buying, don\'t ask for refund. + + Queue + Queue + + Rate the app + Love this app? Let us know in the Google Play Store how we can make it even better + + Recent activity + Recent albums + Recent artists + + Remove + Remove banner photo + Remove cover + Remove from blacklist + Remove profile photo + Remove song from playlist + %1$s from the playlist?]]> + Remove songs from playlist + %1$d songs from the playlist?]]> + + Rename + Rename playlist + + Reset + Reset artist image + + Restore + + Restored previous purchase. Please restart the app to make use of all features. + Restored previous purchases. + + Restoring purchase… + + Retro + Retro Music Equalizer + + File delete failed: %s + + Can\'t get SAF URI + Open navigation drawer + Enable \'Show SD card\' in overflow menu + + %s needs SD card access + You need to select your SD card root directory + Select your SD card in navigation drawer + Do not open any subfolders + Tap \'select\' button at the bottom of the screen + File access required. Pick %s + SD card access required. Please pick root directory of SD card + File write failed: %s + + Save as file + Save as files + + Saved playlist to %s. + + Saving changes + Saving tags + Saving to file… + + Scan media + + Scanned %1$d of %2$d files. - Search your library… + Search your library… - See all + See all - Select all - Select banner photo - Select Preset - Set a profile photo + Select all + Select banner photo + Select Preset + Set a profile photo - Set artist image + Set artist image - Shuffle + Shuffle - Simple + Simple - Sleep timer canceled. - Sleep timer set for %d minutes from now. + Sleep timer canceled. + Sleep timer set for %d minutes from now. - Swipe to unlock + Swipe to unlock - Smart playlists + Smart playlists - Social + Social - Solid + Solid - Some files are not listed in the media store. + Some files are not listed in the media store. - Song - Song duration + Song + Song duration - Songs + Songs - Sort order - Ascending - Album - Artist - Date - Year - Descending + Sort order + Ascending + Album + Artist + Date + Year + Descending - Sorry! Your device doesn\'t support speech input - Search your library + Sorry! Your device doesn\'t support speech input + Search your library - Suggestions + Suggestions - Material design city wallpapers from www.techjuice.pk website - For all icons we used from this websites www.flaticon.com or www.materialdesignicons.com - Just show your name on home screen + Material design city wallpapers from www.techjuice.pk website + For all icons we used from this websites www.flaticon.com or www.materialdesignicons.com + Just show your name on home screen - Support development - If you enjoy using Retro Music Player consider donation as support to my work. + Support development + If you enjoy using Retro Music Player consider donation as support to my work. - Synced lyrics + Synced lyrics - System Equalizer + System Equalizer - - An error occurred editing tags. - Checking for permissions - Select the external storage directory - It seems that we don\'t have permission to edit the files. Double check the directory in the file picker. - An error occurred editing tags. Is the file stored on an SD Card? If so, Google have made tag editing impossible for this file. - An error occurred editing tags. If the file is stored on an SD Card, Retro Music might not have permission to access it. - An error occurred retrieving tags. + + An error occurred editing tags. + Checking for permissions + Select the external storage directory + It seems that we don\'t have permission to edit the files. Double check the directory in the file picker. + An error occurred editing tags. Is the file stored on an SD Card? If so, Google have made tag editing impossible for this file. + An error occurred editing tags. If the file is stored on an SD Card, Retro Music might not have permission to access it. + An error occurred retrieving tags. - Telegram - Join the Telegram group to discuss bugs, make suggestions, show off and more + Telegram + Join the Telegram group to discuss bugs, make suggestions, show off and more - Text + Text - Thank you! + Thank you! - The audio file + The audio file - This month - This week - This year + This month + This week + This year - Tiny + Tiny - Title - Dashboard - Title desc. - Good afternoon - Good day - Good evening - Good morning - Good night - Home - City wallpaper - Icons - Notifications - What\'s Your Name + Title + Dashboard + Title desc. + Good afternoon + Good day + Good evening + Good morning + Good night + Home + City wallpaper + Icons + Notifications + What\'s Your Name - Today + Today - Toggle lyrics size + Toggle lyrics size - See all songs + See all songs - Top albums - Top artists - Top tracks - Top Tracks + Top albums + Top artists + Top tracks + Top Tracks - "Track (2 for track 2 or 3004 for CD3 track 4)" - Track number + "Track (2 for track 2 or 3004 for CD3 track 4)" + Track number - Translate - Help us translate the app to your language + Translate + Help us translate the app to your language - Twitter - Share your design with Retro Music + Twitter + Share your design with Retro Music - Couldn\u2019t play this song. + Couldn\u2019t play this song. - Up next + Up next - Update - Update image + Update + Update image - Artist image updated. + Artist image updated. - Updating… + Updating… - Change profile and banner image + Change profile and banner image - Version + Version - Virtualizer - Virtualizer Strength + Virtualizer + Virtualizer Strength - Volume control + Volume control - Web search + Web search - What do you want to share? + What do you want to share? - Window + Window - Set %1$s as your ringtone. - %1$d selected + Set %1$s as your ringtone. + %1$d selected - Year + Year - You have to select at least one category - Made with ❤️ in India + You have to select at least one category + Made with ❤️ in India diff --git a/app/src/test/java/code/name/monkey/retromusic/ui/fragments/settings/PersonaliseSettingsFragmentTest.java b/app/src/test/java/code/name/monkey/retromusic/ui/fragments/settings/PersonaliseSettingsFragmentTest.java deleted file mode 100644 index c914b8ecb..000000000 --- a/app/src/test/java/code/name/monkey/retromusic/ui/fragments/settings/PersonaliseSettingsFragmentTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package code.name.monkey.retromusic.ui.fragments.settings; - -import junit.framework.TestCase; - -/** - * @author Hemanth S (h4h13). - */ -public class PersonaliseSettingsFragmentTest extends TestCase { - -} \ No newline at end of file