diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java index a0b138a4..8d9a39ec 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java @@ -32,10 +32,11 @@ import de.psdev.licensesdialog.LicensesDialog; @SuppressWarnings("FieldCanBeLocal") public class AboutActivity extends AbsBaseActivity implements View.OnClickListener { + private static String GITHUB = "https://github.com/kabouzeid/Phonograph"; + private static String GOOGLE_PLUS = "https://google.com/+KarimAbouZeid23697"; private static String TWITTER = "https://twitter.com/karim23697"; - private static String GITHUB = "https://github.com/kabouzeid"; - private static String WEBSITE = "http://kabouzeid.com/"; + private static String WEBSITE = "https://kabouzeid.com/"; private static String GOOGLE_PLUS_COMMUNITY = "https://plus.google.com/u/0/communities/106227738496107108513"; private static String TRANSLATE = "https://phonograph.oneskyapp.com/collaboration/project?id=26521"; @@ -61,6 +62,8 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen LinearLayout intro; @BindView(R.id.licenses) LinearLayout licenses; + @BindView(R.id.write_an_email) + LinearLayout writeAnEmail; @BindView(R.id.add_to_google_plus_circles) LinearLayout addToGooglePlusCircles; @BindView(R.id.follow_on_twitter) @@ -132,6 +135,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen forkOnGitHub.setOnClickListener(this); visitWebsite.setOnClickListener(this); reportBugs.setOnClickListener(this); + writeAnEmail.setOnClickListener(this); joinGooglePlusCommunity.setOnClickListener(this); translate.setOnClickListener(this); rateOnGooglePlay.setOnClickListener(this); @@ -180,6 +184,12 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen openUrl(WEBSITE); } else if (v == reportBugs) { startActivity(new Intent(this, BugReportActivity.class)); + } else if (v == writeAnEmail) { + Intent intent = new Intent(Intent.ACTION_SENDTO); + intent.setData(Uri.parse("mailto:contact@kabouzeid.com")); + intent.putExtra(Intent.EXTRA_EMAIL, "contact@kabouzeid.com"); + intent.putExtra(Intent.EXTRA_SUBJECT, "Phonograph"); + startActivity(Intent.createChooser(intent, "E-Mail")); } else if (v == joinGooglePlusCommunity) { openUrl(GOOGLE_PLUS_COMMUNITY); } else if (v == translate) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 2c4f4261..08a43d85 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -53,6 +53,7 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.ArtistSignatureUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PhonographColorUtil; +import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; import butterknife.BindView; @@ -91,6 +92,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private int artistImageViewHeight; private int toolbarColor; private float toolbarAlpha; + private boolean usePalette; private Artist artist; @Nullable @@ -109,6 +111,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement supportPostponeEnterTransition(); lastFMRestClient = new LastFMRestClient(this); + usePalette = PreferenceUtil.getInstance(this).albumArtistColoredFooters(); initViews(); setUpObservableListViewParams(); @@ -194,7 +197,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private void setUpAlbumRecyclerView() { albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); - albumAdapter = new HorizontalAlbumAdapter(this, getArtist().albums, true, this); + albumAdapter = new HorizontalAlbumAdapter(this, getArtist().albums, usePalette, this); albumRecyclerView.setAdapter(albumAdapter); albumAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override @@ -205,6 +208,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement }); } + protected void setUsePalette(boolean usePalette) { + albumAdapter.usePalette(usePalette); + PreferenceUtil.getInstance(this).setAlbumArtistColoredFooters(usePalette); + this.usePalette = usePalette; + } + private void reload() { getSupportLoaderManager().restartLoader(LOADER_ID, getIntent().getExtras(), this); } @@ -309,6 +318,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_artist_detail, menu); + menu.findItem(R.id.action_colored_footers).setChecked(usePalette); return true; } @@ -339,6 +349,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), Toast.LENGTH_SHORT).show(); loadArtistImage(true); return true; + case R.id.action_colored_footers: + item.setChecked(!item.isChecked()); + setUsePalette(item.isChecked()); + return true; } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 858c28c8..659766ea 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -25,8 +25,11 @@ import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEColorPreference; import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; +import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference; import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog; +import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; @@ -78,6 +81,10 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia .commit(); break; } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + new DynamicShortcutManager(this).updateDynamicShortcuts(); + } recreate(); } @@ -122,10 +129,12 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia public void onCreatePreferences(Bundle bundle, String s) { addPreferencesFromResource(R.xml.pref_general); addPreferencesFromResource(R.xml.pref_colors); + addPreferencesFromResource(R.xml.pref_notification); addPreferencesFromResource(R.xml.pref_now_playing_screen); addPreferencesFromResource(R.xml.pref_images); addPreferencesFromResource(R.xml.pref_lockscreen); addPreferencesFromResource(R.xml.pref_audio); + addPreferencesFromResource(R.xml.pref_playlists); } @Nullable @@ -171,6 +180,13 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia ThemeStore.editTheme(getActivity()) .activityTheme(PreferenceUtil.getThemeResFromPrefValue((String) o)) .commit(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + //Set the new theme so that updateAppShortcuts can pull it + getActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue((String) o)); + new DynamicShortcutManager(getActivity()).updateDynamicShortcuts(); + } + getActivity().recreate(); return true; } @@ -186,7 +202,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } }); - ATEColorPreference primaryColorPref = (ATEColorPreference) findPreference("primary_color"); + final ATEColorPreference primaryColorPref = (ATEColorPreference) findPreference("primary_color"); final int primaryColor = ThemeStore.primaryColor(getActivity()); primaryColorPref.setColor(primaryColor, ColorUtil.darkenColor(primaryColor)); primaryColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @@ -202,7 +218,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } }); - ATEColorPreference accentColorPref = (ATEColorPreference) findPreference("accent_color"); + final ATEColorPreference accentColorPref = (ATEColorPreference) findPreference("accent_color"); final int accentColor = ThemeStore.accentColor(getActivity()); accentColorPref.setColor(accentColor, ColorUtil.darkenColor(accentColor)); accentColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @@ -236,7 +252,50 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia }); } - Preference equalizer = findPreference("equalizer"); + final TwoStatePreference classicNotification = (TwoStatePreference) findPreference("classic_notification"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) { + classicNotification.setEnabled(false); + classicNotification.setSummary(R.string.pref_only_nougat); + } else { + classicNotification.setChecked(PreferenceUtil.getInstance(getActivity()).classicNotification()); + classicNotification.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + //Save preference + PreferenceUtil.getInstance(getActivity()).setClassicNotification((Boolean)newValue); + + final MusicService service = MusicPlayerRemote.musicService; + if (service != null) { + service.initNotification(); + service.updateNotification(); + } + + return true; + } + }); + } + + final TwoStatePreference colorAppShortcuts = (TwoStatePreference) findPreference("should_color_app_shortcuts"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) { + colorAppShortcuts.setEnabled(false); + colorAppShortcuts.setSummary(R.string.pref_only_nougat_mr1); + } else { + colorAppShortcuts.setChecked(PreferenceUtil.getInstance(getActivity()).coloredAppShortcuts()); + colorAppShortcuts.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + //Save preference + PreferenceUtil.getInstance(getActivity()).setColoredAppShortcuts((Boolean)newValue); + + //Update app shortcuts + new DynamicShortcutManager(getActivity()).updateDynamicShortcuts(); + + return true; + } + }); + } + + final Preference equalizer = findPreference("equalizer"); if (!hasEqualizer()) { equalizer.setEnabled(false); equalizer.setSummary(getResources().getString(R.string.no_equalizer)); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/AbsPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/AbsPlayerFragment.java index f0ad25e1..633c8144 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/AbsPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/AbsPlayerFragment.java @@ -88,6 +88,10 @@ public abstract class AbsPlayerFragment extends AbsMusicServiceFragment implemen MusicUtil.toggleFavorite(getActivity(), song); } + protected String getUpNextAndQueueTime() { + return getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())); + } + public abstract void onShow(); public abstract void onHide(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java index 55b3c09f..3d002a18 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java @@ -198,6 +198,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum private void updateQueue() { playingQueueAdapter.swapDataSet(MusicPlayerRemote.getPlayingQueue(), MusicPlayerRemote.getPosition()); + playerQueueSubHeader.setText(getUpNextAndQueueTime()); if (slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { resetToCurrentPosition(); } @@ -205,6 +206,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum private void updateQueuePosition() { playingQueueAdapter.setCurrent(MusicPlayerRemote.getPosition()); + playerQueueSubHeader.setText(getUpNextAndQueueTime()); if (slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { resetToCurrentPosition(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java index d80dbd57..434849ba 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java @@ -194,6 +194,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum private void updateQueue() { playingQueueAdapter.swapDataSet(MusicPlayerRemote.getPlayingQueue(), MusicPlayerRemote.getPosition()); + playerQueueSubHeader.setText(getUpNextAndQueueTime()); if (slidingUpPanelLayout == null || slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { resetToCurrentPosition(); } @@ -201,6 +202,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum private void updateQueuePosition() { playingQueueAdapter.setCurrent(MusicPlayerRemote.getPosition()); + playerQueueSubHeader.setText(getUpNextAndQueueTime()); if (slidingUpPanelLayout == null || slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { resetToCurrentPosition(); }