diff --git a/app/build.gradle b/app/build.gradle index b09fc16e..972f9ffe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,18 +106,18 @@ dependencies { transitive = true } - compile('com.github.afollestad.material-dialogs:core:0.8.5.6@aar') { + compile('com.github.afollestad.material-dialogs:core:0.8.5.8@aar') { transitive = true } - compile('com.github.afollestad.material-dialogs:commons:0.8.5.6@aar') { + compile('com.github.afollestad.material-dialogs:commons:0.8.5.8@aar') { transitive = true } - compile('com.afollestad:material-cab:0.1.9@aar') { + compile('com.afollestad:material-cab:0.1.11@aar') { transitive = true } - compile('com.github.kabouzeid:app-theme-helper:1.0.1@aar') { + compile('com.github.kabouzeid:app-theme-helper:454b062475@aar') { transitive = true } diff --git a/app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreference.java b/app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreference.java new file mode 100644 index 00000000..83fb3805 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreference.java @@ -0,0 +1,27 @@ +package com.kabouzeid.gramophone.preferences; + +import android.content.Context; +import android.util.AttributeSet; + +import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEDialogPreference; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class NowPlayingScreenPreference extends ATEDialogPreference { + public NowPlayingScreenPreference(Context context) { + super(context); + } + + public NowPlayingScreenPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NowPlayingScreenPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public NowPlayingScreenPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreferenceDialog.java b/app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreferenceDialog.java new file mode 100644 index 00000000..0a62204e --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreferenceDialog.java @@ -0,0 +1,135 @@ +package com.kabouzeid.gramophone.preferences; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.heinrichreimersoftware.materialintro.view.InkPageIndicator; +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.ui.fragments.player.NowPlayingScreen; +import com.kabouzeid.gramophone.util.PreferenceUtil; +import com.kabouzeid.gramophone.util.ViewUtil; + +import butterknife.ButterKnife; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class NowPlayingScreenPreferenceDialog extends DialogFragment implements MaterialDialog.SingleButtonCallback, ViewPager.OnPageChangeListener { + public static final String TAG = NowPlayingScreenPreferenceDialog.class.getSimpleName(); + + private DialogAction whichButtonClicked; + private int viewPagerPosition; + + public static NowPlayingScreenPreferenceDialog newInstance() { + return new NowPlayingScreenPreferenceDialog(); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + @SuppressLint("InflateParams") View view = LayoutInflater.from(getContext()).inflate(R.layout.preference_dialog_now_playing_screen, null); + ViewPager viewPager = ButterKnife.findById(view, R.id.now_playing_screen_view_pager); + viewPager.setAdapter(new NowPlayingScreenAdapter(getContext())); + viewPager.addOnPageChangeListener(this); + viewPager.setPageMargin((int) ViewUtil.convertDpToPixel(32, getResources())); + viewPager.setCurrentItem(PreferenceUtil.getInstance(getContext()).getNowPlayingScreen().ordinal()); + + InkPageIndicator pageIndicator = ButterKnife.findById(view, R.id.page_indicator); + pageIndicator.setViewPager(viewPager); + + return new MaterialDialog.Builder(getContext()) + .title(R.string.pref_title_now_playing_screen_appearance) + .positiveText(android.R.string.ok) + .negativeText(android.R.string.cancel) + .onAny(this) + .customView(view, false) + .build(); + } + + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + whichButtonClicked = which; + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + if (whichButtonClicked == DialogAction.POSITIVE) { + PreferenceUtil.getInstance(getContext()).setNowPlayingScreen(NowPlayingScreen.values()[viewPagerPosition]); + } + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + this.viewPagerPosition = position; + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + + private static class NowPlayingScreenAdapter extends PagerAdapter { + + private Context context; + + public NowPlayingScreenAdapter(Context context) { + this.context = context; + } + + @Override + public Object instantiateItem(ViewGroup collection, int position) { + NowPlayingScreen nowPlayingScreen = NowPlayingScreen.values()[position]; + + LayoutInflater inflater = LayoutInflater.from(context); + ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.preference_now_playing_screen_item, collection, false); + collection.addView(layout); + + ImageView image = ButterKnife.findById(layout, R.id.image); + TextView title = ButterKnife.findById(layout, R.id.title); + image.setImageResource(nowPlayingScreen.drawableResId); + title.setText(nowPlayingScreen.titleRes); + + return layout; + } + + @Override + public void destroyItem(ViewGroup collection, int position, Object view) { + collection.removeView((View) view); + } + + @Override + public int getCount() { + return NowPlayingScreen.values().length; + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + + @Override + public CharSequence getPageTitle(int position) { + return context.getString(NowPlayingScreen.values()[position].titleRes); + } + } +} \ No newline at end of file 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 968be106..0237f0a7 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 @@ -1,6 +1,7 @@ package com.kabouzeid.gramophone.ui.activities; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.media.audiofx.AudioEffect; @@ -9,6 +10,7 @@ import android.os.Bundle; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceManager; @@ -23,6 +25,8 @@ 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.preferences.NowPlayingScreenPreference; +import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; @@ -86,7 +90,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia return super.onOptionsItemSelected(item); } - public static class SettingsFragment extends ATEPreferenceFragmentCompat { + public static class SettingsFragment extends ATEPreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { private static void setSummary(@NonNull Preference preference) { setSummary(preference, PreferenceManager @@ -119,11 +123,27 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia addPreferencesFromResource(R.xml.pref_audio); } + @Nullable + @Override + public DialogFragment onCreatePreferenceDialog(Preference preference) { + if (preference instanceof NowPlayingScreenPreference) { + return NowPlayingScreenPreferenceDialog.newInstance(); + } + return super.onCreatePreferenceDialog(preference); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getListView().setPadding(0, 0, 0, 0); invalidateSettings(); + PreferenceUtil.getInstance(getActivity()).registerOnSharedPreferenceChangedListener(this); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + PreferenceUtil.getInstance(getActivity()).unregisterOnSharedPreferenceChangedListener(this); } private void invalidateSettings() { @@ -223,6 +243,8 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia return true; } }); + + updateNowPlayingScreenSummary(); } private boolean hasEqualizer() { @@ -231,5 +253,18 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia ResolveInfo ri = pm.resolveActivity(effects, 0); return ri != null; } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + switch (key) { + case PreferenceUtil.NOW_PLAYING_SCREEN_ID: + updateNowPlayingScreenSummary(); + break; + } + } + + private void updateNowPlayingScreenSummary() { + findPreference("now_playing_screen_id").setSummary(PreferenceUtil.getInstance(getActivity()).getNowPlayingScreen().titleRes); + } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java index 8771c824..e317fb72 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java @@ -9,6 +9,7 @@ import android.os.Bundle; import android.support.annotation.ColorInt; import android.support.annotation.FloatRange; import android.support.annotation.LayoutRes; +import android.support.v4.app.Fragment; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -18,7 +19,10 @@ import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.ui.fragments.player.AbsPlayerFragment; import com.kabouzeid.gramophone.ui.fragments.player.MiniPlayerFragment; +import com.kabouzeid.gramophone.ui.fragments.player.NowPlayingScreen; import com.kabouzeid.gramophone.ui.fragments.player.card.CardPlayerFragment; +import com.kabouzeid.gramophone.ui.fragments.player.flat.FlatPlayerFragment; +import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.ViewUtil; import com.sothree.slidinguppanel.SlidingUpPanelLayout; @@ -41,6 +45,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi private int taskColor; private boolean lightStatusbar; + private NowPlayingScreen currentNowPlayingScreen; private AbsPlayerFragment playerFragment; private MiniPlayerFragment miniPlayerFragment; @@ -53,7 +58,21 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi setContentView(createContentView()); ButterKnife.bind(this); - playerFragment = (AbsPlayerFragment) getSupportFragmentManager().findFragmentById(R.id.player_fragment); + currentNowPlayingScreen = PreferenceUtil.getInstance(this).getNowPlayingScreen(); + Fragment fragment; // must implement AbsPlayerFragment + switch (currentNowPlayingScreen) { + case FLAT: + fragment = new FlatPlayerFragment(); + break; + case CARD: + default: + fragment = new CardPlayerFragment(); + break; + } + getSupportFragmentManager().beginTransaction().replace(R.id.player_fragment_container, fragment).commit(); + getSupportFragmentManager().executePendingTransactions(); + + playerFragment = (AbsPlayerFragment) getSupportFragmentManager().findFragmentById(R.id.player_fragment_container); miniPlayerFragment = (MiniPlayerFragment) getSupportFragmentManager().findFragmentById(R.id.mini_player_fragment); //noinspection ConstantConditions @@ -74,12 +93,20 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi onPanelExpanded(slidingUpPanelLayout); } else if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { onPanelCollapsed(slidingUpPanelLayout); + } else { + playerFragment.onHide(); } } }); slidingUpPanelLayout.addPanelSlideListener(this); + } - playerFragment.onHide(); + @Override + protected void onResume() { + super.onResume(); + if (currentNowPlayingScreen != PreferenceUtil.getInstance(this).getNowPlayingScreen()) { + postRecreate(); + } } public void setAntiDragView(View antiDragView) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/NowPlayingScreen.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/NowPlayingScreen.java new file mode 100644 index 00000000..32f00247 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/NowPlayingScreen.java @@ -0,0 +1,23 @@ +package com.kabouzeid.gramophone.ui.fragments.player; + +import android.support.annotation.DrawableRes; +import android.support.annotation.StringRes; + +import com.kabouzeid.gramophone.R; + +public enum NowPlayingScreen { + CARD(R.string.card, R.drawable.np_card, 0), + FLAT(R.string.flat, R.drawable.np_flat, 1); + + @StringRes + public final int titleRes; + @DrawableRes + public final int drawableResId; + public final int id; + + NowPlayingScreen(@StringRes int titleRes, @DrawableRes int drawableResId, int id) { + this.titleRes = titleRes; + this.drawableResId = drawableResId; + this.id = id; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index 51ef9a91..8ce9ec7e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -10,6 +10,7 @@ import android.support.annotation.StyleRes; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.SortOrder; import com.kabouzeid.gramophone.ui.fragments.mainactivity.folders.FoldersFragment; +import com.kabouzeid.gramophone.ui.fragments.player.NowPlayingScreen; import java.io.File; @@ -18,6 +19,7 @@ public final class PreferenceUtil { public static final String DEFAULT_START_PAGE = "default_start_page"; public static final String LAST_PAGE = "last_start_page"; public static final String LAST_MUSIC_CHOOSER = "last_music_chooser"; + public static final String NOW_PLAYING_SCREEN_ID = "now_playing_screen_id"; public static final String ARTIST_SORT_ORDER = "artist_sort_order"; public static final String ARTIST_SONG_SORT_ORDER = "artist_song_sort_order"; @@ -127,6 +129,21 @@ public final class PreferenceUtil { return mPreferences.getInt(LAST_MUSIC_CHOOSER, 0); } + public final NowPlayingScreen getNowPlayingScreen() { + int id = mPreferences.getInt(NOW_PLAYING_SCREEN_ID, 0); + for (NowPlayingScreen nowPlayingScreen : NowPlayingScreen.values()) { + if (nowPlayingScreen.id == id) return nowPlayingScreen; + } + return NowPlayingScreen.CARD; + } + + @SuppressLint("CommitPrefEdits") + public void setNowPlayingScreen(NowPlayingScreen nowPlayingScreen) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putInt(NOW_PLAYING_SCREEN_ID, nowPlayingScreen.id); + editor.commit(); + } + public final boolean coloredNotification() { return mPreferences.getBoolean(COLORED_NOTIFICATION, true); } diff --git a/app/src/main/res/drawable-xxxhdpi/np_card.png b/app/src/main/res/drawable-xxxhdpi/np_card.png new file mode 100644 index 00000000..291bd388 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/np_card.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/np_flat.png b/app/src/main/res/drawable-xxxhdpi/np_flat.png new file mode 100644 index 00000000..f83ad9cf Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/np_flat.png differ diff --git a/app/src/main/res/layout/preference_dialog_now_playing_screen.xml b/app/src/main/res/layout/preference_dialog_now_playing_screen.xml new file mode 100644 index 00000000..fe602a11 --- /dev/null +++ b/app/src/main/res/layout/preference_dialog_now_playing_screen.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/preference_now_playing_screen_item.xml b/app/src/main/res/layout/preference_now_playing_screen_item.xml new file mode 100644 index 00000000..4d1a08f8 --- /dev/null +++ b/app/src/main/res/layout/preference_now_playing_screen_item.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sliding_music_panel_layout.xml b/app/src/main/res/layout/sliding_music_panel_layout.xml index 0f310e04..bf2980e0 100644 --- a/app/src/main/res/layout/sliding_music_panel_layout.xml +++ b/app/src/main/res/layout/sliding_music_panel_layout.xml @@ -19,9 +19,8 @@ android:layout_height="match_parent" android:background="?android:colorBackground"> - diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 827b0f55..417cd4f1 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -14,6 +14,9 @@ Twitter GitHub + Card + Flat + donation_1 donation_2 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11cf9640..b98dd9a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -229,7 +229,7 @@ Website Loading products… Up next - Now playing layout + Appearance Introduction Press back again to skip the intro. "Welcome to Phonograph, a beautiful and lightweight music player for Android. " diff --git a/app/src/main/res/xml/pref_now_playing_screen.xml b/app/src/main/res/xml/pref_now_playing_screen.xml index 904268ed..33a1f66c 100644 --- a/app/src/main/res/xml/pref_now_playing_screen.xml +++ b/app/src/main/res/xml/pref_now_playing_screen.xml @@ -3,13 +3,9 @@ - +