From ea3f95d401e979477554be6d9e2a224eb0763d2c Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sun, 17 Apr 2016 00:30:18 +0200 Subject: [PATCH] Added logic to switch between now playing screens. --- app/build.gradle | 8 +- .../NowPlayingScreenPreference.java | 27 ++++ .../NowPlayingScreenPreferenceDialog.java | 135 ++++++++++++++++++ .../ui/activities/SettingsActivity.java | 37 ++++- .../base/AbsSlidingMusicPanelActivity.java | 31 +++- .../ui/fragments/player/NowPlayingScreen.java | 23 +++ .../gramophone/util/PreferenceUtil.java | 17 +++ app/src/main/res/drawable-xxxhdpi/np_card.png | Bin 0 -> 50694 bytes app/src/main/res/drawable-xxxhdpi/np_flat.png | Bin 0 -> 41919 bytes .../preference_dialog_now_playing_screen.xml | 27 ++++ .../preference_now_playing_screen_item.xml | 26 ++++ .../res/layout/sliding_music_panel_layout.xml | 5 +- app/src/main/res/values/donottranslate.xml | 3 + app/src/main/res/values/strings.xml | 2 +- .../main/res/xml/pref_now_playing_screen.xml | 10 +- 15 files changed, 333 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreference.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/preferences/NowPlayingScreenPreferenceDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/NowPlayingScreen.java create mode 100644 app/src/main/res/drawable-xxxhdpi/np_card.png create mode 100644 app/src/main/res/drawable-xxxhdpi/np_flat.png create mode 100644 app/src/main/res/layout/preference_dialog_now_playing_screen.xml create mode 100644 app/src/main/res/layout/preference_now_playing_screen_item.xml 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 0000000000000000000000000000000000000000..291bd388d48306fc39c720d45bbb80d28ad78da5 GIT binary patch literal 50694 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 b@KCzIvqE+;s0vU2cT&W_@`^CKe6>1&0O(C__P~ zp#A>4m#Bgb42{YO4+2=w)#@iaIN|<+0ZsV8frZRy`W@m99GKXDfe}r(q0yNg#r6h< z#yt&<%JK`D(S#Y9+xd{4336{GBeT1m6Fa&v8=owae?SUZJ~6TN)wJ-T3-icWAv_LN z$nk`gN9HGoEV{6SMF~V6Vc7|835!pHR_MY81utMh36q*2Zcy+DHJs)j%IlZ%FxEIHSdq1h9?V$fCl%E=EZa7Z5Ku>9o-KcSjd4^UXK>z zqs2IK@x(D&FTyH$NWL0vXpFYp5KTk{htZ}mY72L?DLmS@Kq)atJ8LM-uF>A_=x_o` zi8(r)fI4h4IzBTx;Duabj*cLrcF{*i5J!h(QA*6w5kyGO95$aYI)X^S2qNR?EDUn* zzF~AcbaXs)bUYMRw2t=Wkz1ytGufj{15nBafziG^O3QR~t;Oi#6_nQ0XkUJ`FAuLl zN0(QPu2)0pxsP@|Q3}h^uIFgi6Qy}Mx)cXxVtI7U@8}|G*uVt1Sv9&82W4VeVRR|Z z=u#Y%5_5F;4&M0yF-Di-j4s7NDKSTf??#93z%2<-sX020JUWex+`Js!%!kq$6&M}9 z8y&tI9lnF+iP5enN<(V2>q)O2=E(&=m0@QAjP5o^Nra;n)My1YT0xCgP#mMnazOoA zc*mAybXm^mvK*9|=Fw$2NSQ-G!C`cZ&FB^zl#$TUEjB0(DW=h}(b2Kd5jQqk_wAjo z`zht_Lm6T!+n!wfzN3nzhvnp>plABlFDK02{&!RPrU`falAXFX``Of<$`YO-E@1I2 zJOlmgJckD#*pS1{p@E^XlCd$lu9XcmDG6<_gIjDYeEDD+N%^RuqhUIlq)?k{qd97{ zKtU-wN6XXE>SVMwMQyUPj5a1l+fpd=Bcn~p(Wc~RQ*yK^iPUr&lr8BU@xpud?K{Vx zgx-^Wa9yOLvU2C$`;U$(7ufv!mt8eu7Rs<4hd_kT4>_}S@z<}Lz1yCD|KGna->mnY zEHwP#idGl!aQwMzp0|Dab?t(heyQu`=Ige7Ja2CC=ftT4La`H34gIr->3aW?J%4xo ztE=5p=kkku zwV|qMU}%(Q%C~R(^mu;W_VwofXWnQ&?2b}gD>x(sJ3P2?XLdCDInM132MQB@c%XSH zhl@jIc6D(!njsGa1T6S?CU}5(C*)?=S6cq|&BSVMwMd|X4 zHYP^fQYhmNqfN=trsQZ-61C|x+LS~MkI|;&XxDsnWMXt+2DRxl+LS~M4_xu0X{eIkUpZEQEe%;?+Uv;x$>H{8Btb01U z4W%2-Vbgs;xnNKI|9`qgF$*8h-&VLkc7J7P|Lf~tBOg>u+d8`$P5JZ#$^|ijkFzB0 zosNIyzrNjkoqfUI(poW#dD%agDWZ(|Fr8QWz#-GGpB)qX_}A;-=9cfa->>`qRyQx^ z|EG_Owf@;#%uD_H46QOdul(Uh)3K`taud1K&1Wz$C?|TlIEFmVlK#HBC}zK0;p2~Q zc^e;BPRkcUnwR1bQ23z3)PJDxZ^xRD~_GahcFf;tdjyhYW<6nLIS=>5Ky#_r#T}qXyUhHc;4J z-pAVay8hh#J^xxy6l!8D?J(i`vpYGae9!+ki|l_l+y5@E>qm_t0fh?+AJ#n-dWUK_ z3x|LQ3rnBN`AF1ob6DWy@L)wmvo~zw5azYch658{SbC$SwGa*t8PV(lPBcRl1O+UF zY}3)_nYkDn7bo%RIieY&!o=jh=(!GB_yi~_6ojlfs0wocG~yav93FUlnWKv49W54? zzAn=pENF&I;NXzyoVOXO7bfY@+HfFnBinSew8kRD*rNh&-2Tcm2?d;L0}g pp~Ap88g#JPWAMTU8m5hezY#}zEaZZoF)%PNc)I$ztaD0e0su-fie3N! literal 0 HcmV?d00001 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 @@ - +