Implemented app-theme-helper. Needs to be cleaned up.

This commit is contained in:
Karim Abou Zeid 2016-01-25 22:20:59 +01:00
commit 8b98a9be85
39 changed files with 275 additions and 1370 deletions

View file

@ -138,4 +138,5 @@ dependencies {
compile 'com.github.kabouzeid:AppIntro:3.3.0k'
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.github.kabouzeid:RecyclerView-FastScroll:v1.2-kmod'
compile 'com.github.kabouzeid:app-theme-helper:0.7.8kmod'
}

View file

@ -9,7 +9,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
@ -71,9 +71,10 @@ public class ShuffleButtonSongAdapter extends SongAdapter {
@Override
public void onBindViewHolder(@NonNull final SongAdapter.ViewHolder holder, int position) {
if (holder.getItemViewType() == SHUFFLE_BUTTON) {
int accentColor = ThemeStore.accentColor(activity);
if (holder.title != null) {
holder.title.setText(activity.getResources().getString(R.string.action_shuffle_all).toUpperCase());
holder.title.setTextColor(ThemeSingleton.get().positiveColor);
holder.title.setTextColor(accentColor);
holder.title.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
}
if (holder.text != null) {
@ -85,7 +86,7 @@ public class ShuffleButtonSongAdapter extends SongAdapter {
if (holder.image != null) {
final int padding = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin) / 2;
holder.image.setPadding(padding, padding, padding, padding);
holder.image.setColorFilter(ThemeSingleton.get().positiveColor.getDefaultColor());
holder.image.setColorFilter(accentColor);
holder.image.setImageResource(R.drawable.ic_shuffle_white_24dp);
}
if (holder.separator != null) {

View file

@ -1,55 +0,0 @@
package com.kabouzeid.gramophone.prefs;
import android.content.Context;
import android.preference.Preference;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.views.ColorView;
public class ColorChooserPreference extends Preference {
@ColorInt
private int color;
private ColorView colorView;
public ColorChooserPreference(@NonNull Context context) {
this(context, null);
}
public ColorChooserPreference(@NonNull Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ColorChooserPreference(@NonNull Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setLayoutResource(R.layout.preference_custom);
setWidgetLayoutResource(R.layout.preference_color_widget);
}
@Override
protected void onBindView(@NonNull View view) {
super.onBindView(view);
colorView = (ColorView) view.findViewById(R.id.circle);
invalidateColor();
}
public void setColor(int color) {
this.color = color;
invalidateColor();
}
private void invalidateColor() {
if (colorView != null) {
if (this.color != 0) {
colorView.setVisibility(View.VISIBLE);
colorView.setColor(color);
} else {
colorView.setVisibility(View.GONE);
}
}
}
}

View file

@ -1,39 +0,0 @@
package com.kabouzeid.gramophone.prefs;
import android.content.Context;
import android.preference.PreferenceCategory;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.gramophone.R;
/**
* Uses the theme's primary color as the text color of the category.
*
* @author Aidan Follestad (afollestad)
*/
public class DynamicPreferenceCategory extends PreferenceCategory {
public DynamicPreferenceCategory(@NonNull Context context, @NonNull AttributeSet attrs) {
this(context, attrs, 0);
}
public DynamicPreferenceCategory(@NonNull Context context) {
this(context, null, 0);
}
public DynamicPreferenceCategory(@NonNull Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setLayoutResource(R.layout.preference_category_custom);
setSelectable(false);
}
@Override
protected void onBindView(@NonNull View view) {
super.onBindView(view);
((TextView) view.findViewById(android.R.id.title)).setTextColor(ThemeSingleton.get().positiveColor);
}
}

View file

@ -8,7 +8,6 @@ import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
@ -16,12 +15,12 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.DonationDialog;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -127,14 +126,14 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about);
setStatusBarTransparent();
setDrawUnderStatusbar(true);
ButterKnife.bind(this);
setUpViews();
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
if (shouldColorNavigationBar())
setNavigationBarThemeColor();
setStatusBarThemeColor();
setUpViews();
}
private void setUpViews() {
@ -145,7 +144,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
}
private void setUpToolbar() {
toolbar.setBackgroundColor(getThemeColorPrimary());
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@ -273,12 +272,4 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
.build()
.showAppCompat();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary());
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
return super.onCreateOptionsMenu(menu);
}
}

View file

@ -76,14 +76,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarTransparent();
setDrawUnderStatusbar(true);
ButterKnife.bind(this);
supportPostponeEnterTransition();
if (shouldColorNavigationBar())
setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color));
getAlbumFromIntentExtras();
setUpObservableListViewParams();
setUpToolBar();
@ -110,7 +107,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
// Change alpha of overlay
toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor));
setStatusBarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor));
setStatusbarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor));
// Translate name text
int maxTitleTranslationY = albumArtViewHeight;
@ -179,15 +176,8 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
albumTitleView.setBackgroundColor(color);
albumTitleView.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, color));
if (shouldColorNavigationBar())
setNavigationBarColor(color);
notifyTaskColorChange(color);
}
@Override
protected boolean overridesTaskColor() {
return true;
setNavigationbarColor(color);
setTaskDescriptionColor(color);
}
@Override
@ -309,7 +299,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
.start(new MaterialCab.Callback() {
@Override
public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
setStatusBarColor(ColorUtil.getOpaqueColor(toolbarColor));
setStatusbarColor(ColorUtil.getOpaqueColor(toolbarColor));
return callback.onCabCreated(materialCab, menu);
}
@ -320,7 +310,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
@Override
public boolean onCabFinished(MaterialCab materialCab) {
setStatusBarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor));
setStatusbarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor));
return callback.onCabFinished(materialCab);
}
});
@ -341,4 +331,10 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
super.onMediaStoreChanged();
refresh();
}
@Override
public void setStatusbarColor(int color) {
super.setStatusbarColor(color);
setLightStatusbar(false);
}
}

View file

@ -100,12 +100,9 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarTransparent();
setDrawUnderStatusbar(true);
ButterKnife.bind(this);
if (shouldColorNavigationBar())
setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color));
lastFMRestClient = new LastFMRestClient(this);
getArtistFromIntentExtras();
@ -135,7 +132,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
// Change alpha of overlay
toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor));
setStatusBarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor));
setStatusbarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor));
// Translate name text
int maxTitleTranslationY = artistImageViewHeight;
@ -287,11 +284,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
});
}
@Override
protected boolean overridesTaskColor() {
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@ -309,11 +301,8 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
toolbarColor = vibrantColor;
artistName.setBackgroundColor(vibrantColor);
artistName.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, vibrantColor));
if (shouldColorNavigationBar())
setNavigationBarColor(vibrantColor);
notifyTaskColorChange(vibrantColor);
setNavigationbarColor(vibrantColor);
setTaskDescriptionColor(vibrantColor);
}
private void getArtistFromIntentExtras() {
@ -395,7 +384,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
.start(new MaterialCab.Callback() {
@Override
public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
setStatusBarColor(ColorUtil.getOpaqueColor(toolbarColor));
setStatusbarColor(ColorUtil.getOpaqueColor(toolbarColor));
return callback.onCabCreated(materialCab, menu);
}
@ -406,7 +395,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
@Override
public boolean onCabFinished(MaterialCab materialCab) {
setStatusBarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor));
setStatusbarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor));
return callback.onCabFinished(materialCab);
}
});
@ -427,4 +416,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
super.onMediaStoreChanged();
reloadDataSets();
}
@Override
public void setStatusbarColor(int color) {
super.setStatusbarColor(color);
setLightStatusbar(false);
}
}

View file

@ -5,8 +5,6 @@ import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@ -20,7 +18,6 @@ import android.support.design.widget.AppBarLayout.OnOffsetChangedListener;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
@ -34,8 +31,11 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.bumptech.glide.Glide;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
import com.kabouzeid.appthemehelper.util.TabLayoutUtil;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PagerAdapter;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
@ -60,7 +60,6 @@ import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import java.io.File;
@ -107,14 +106,14 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
findViewById(R.id.drawer_content_container).setFitsSystemWindows(false);
}
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
setUpDrawerLayout();
setUpToolbar();
setUpViewPager();
if (shouldColorNavigationBar())
setNavigationBarThemeColor();
setStatusBarThemeColor();
checkChangelog();
if (!PreferenceUtil.getInstance(this).introShown()) {
@ -160,8 +159,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
pager.setOffscreenPageLimit(pagerAdapter.getCount() - 1); // => all
tabs.setupWithViewPager(pager);
tabs.setTabTextColors(ColorUtil.getSecondaryTextColorForBackground(this, getThemeColorPrimary()), ColorUtil.getPrimaryTextColorForBackground(this, getThemeColorPrimary()));
tabs.setSelectedTabIndicatorColor(getThemeColorAccent() == Color.WHITE && !ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()) ? Color.WHITE : ThemeSingleton.get().positiveColor.getDefaultColor());
TabLayoutUtil.setTabLayoutColors(tabs, ToolbarContentTintHelper.toolbarTitleColor(this, ThemeStore.primaryColor(this)), ThemeStore.accentColor(this));
int startPosition = PreferenceUtil.getInstance(this).getDefaultStartPage();
startPosition = startPosition == -1 ? PreferenceUtil.getInstance(this).getLastStartPage() : startPosition;
@ -169,43 +168,21 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
}
private void setUpToolbar() {
int primaryColor = ThemeStore.primaryColor(this);
appbar.setBackgroundColor(primaryColor);
toolbar.setBackgroundColor(primaryColor);
toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp);
setTitle(getResources().getString(R.string.app_name));
setAppBarColor();
setSupportActionBar(toolbar);
}
private void setAppBarColor() {
appbar.setBackgroundColor(getThemeColorPrimary());
}
private void setUpNavigationView() {
navigationView.setCheckedItem(R.id.nav_library);
final int colorAccent = ThemeSingleton.get().positiveColor.getDefaultColor();
navigationView.setItemTextColor(new ColorStateList(
new int[][]{
//{-android.R.attr.state_enabled}, // disabled
{android.R.attr.state_checked}, // checked
{} // default
},
new int[]{
// 0,
colorAccent,
ThemeSingleton.get().darkTheme ? ContextCompat.getColor(this, R.color.primary_text_default_material_dark) : ContextCompat.getColor(this, R.color.primary_text_default_material_light)
}
));
navigationView.setItemIconTintList(new ColorStateList(
new int[][]{
//{-android.R.attr.state_enabled}, // disabled
{android.R.attr.state_checked}, // checked
{} // default
},
new int[]{
// 0,
colorAccent,
ThemeSingleton.get().darkTheme ? ContextCompat.getColor(this, R.color.secondary_text_default_material_dark) : ContextCompat.getColor(this, R.color.secondary_text_default_material_light)
}
));
int accentColor = ThemeStore.accentColor(this);
NavigationViewUtil.setItemIconColors(navigationView, ThemeStore.textColorSecondary(this), accentColor);
NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
@ -334,16 +311,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
menu.removeItem(R.id.action_grid_size);
menu.removeItem(R.id.action_colored_footers);
}
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary());
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
ViewUtil.invalidateToolbarPopupMenuTint(toolbar);
return super.onPrepareOptionsMenu(menu);
return super.onCreateOptionsMenu(menu);
}
@Override
@ -357,8 +325,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
return true;
}
ViewUtil.invalidateToolbarPopupMenuTint(toolbar);
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsMainActivityRecyclerViewCustomGridSizeFragment) {
AbsMainActivityRecyclerViewCustomGridSizeFragment absMainActivityRecyclerViewCustomGridSizeFragment = (AbsMainActivityRecyclerViewCustomGridSizeFragment) currentFragment;
@ -571,7 +537,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menu)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getThemeColorPrimary()))
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this)))
.start(callback);
return cab;
}
@ -619,12 +585,12 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
@Override
public void onDrawerOpened(View drawerView) {
setUseDarkStatusBarIcons(false);
setLightStatusbar(false);
}
@Override
public void onDrawerClosed(View drawerView) {
setUseDarkStatusBarIcons(ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()));
setLightStatusbarAuto(ThemeStore.primaryColor(this));
}
@Override

View file

@ -15,6 +15,7 @@ import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager;
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.song.PlaylistSongAdapter;
import com.kabouzeid.gramophone.adapter.song.SmartPlaylistSongAdapter;
@ -31,7 +32,6 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import java.util.ArrayList;
import java.util.List;
@ -63,9 +63,13 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarTransparent();
setDrawUnderStatusbar(true);
ButterKnife.bind(this);
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
getIntentExtras();
setUpRecyclerView();
@ -73,10 +77,6 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
checkIsEmpty();
setUpToolBar();
if (shouldColorNavigationBar())
setNavigationBarThemeColor();
setStatusBarThemeColor();
}
@Override
@ -137,7 +137,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
}
private void setUpToolBar() {
toolbar.setBackgroundColor(getThemeColorPrimary());
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setTitle(playlist.name);
@ -159,10 +159,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_playlist_detail, menu);
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary());
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
return true;
return super.onCreateOptionsMenu(menu);
}
@Override
@ -191,7 +188,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menu)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getThemeColorPrimary()))
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this)))
.start(callback);
return cab;
}

View file

@ -10,7 +10,6 @@ import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
@ -19,12 +18,12 @@ import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.SearchAdapter;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -51,9 +50,13 @@ public class SearchActivity extends AbsMusicServiceActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setStatusBarTransparent();
setDrawUnderStatusbar(true);
ButterKnife.bind(this);
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
searchAdapter = new SearchAdapter(this);
recyclerView.setAdapter(searchAdapter);
@ -68,29 +71,17 @@ public class SearchActivity extends AbsMusicServiceActivity {
setUpToolBar();
setUpSearchBar();
if (shouldColorNavigationBar())
setNavigationBarThemeColor();
setStatusBarThemeColor();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary());
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
return super.onCreateOptionsMenu(menu);
}
private void setUpToolBar() {
toolbar.setBackgroundColor(getThemeColorPrimary());
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
private void setUpSearchBar() {
searchCloseBtn.setColorFilter(ViewUtil.getToolbarIconColor(this, ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary())), PorterDuff.Mode.SRC_IN);
searchCloseBtn.setColorFilter(ToolbarContentTintHelper.toolbarContentColor(this, ThemeStore.primaryColor(this)), PorterDuff.Mode.SRC_IN);
searchCloseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -98,8 +89,8 @@ public class SearchActivity extends AbsMusicServiceActivity {
}
});
searchSrcText.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, getThemeColorPrimary()));
searchSrcText.setHintTextColor(ColorUtil.getSecondaryTextColorForBackground(this, getThemeColorPrimary()));
searchSrcText.setTextColor(ToolbarContentTintHelper.toolbarTitleColor(this, ThemeStore.primaryColor(this)));
searchSrcText.setHintTextColor(ToolbarContentTintHelper.toolbarSubtitleColor(this, ThemeStore.primaryColor(this)));
searchSrcText.setHint(R.string.search_hint);
searchSrcText.addTextChangedListener(new TextWatcher() {

View file

@ -13,19 +13,19 @@ import android.preference.PreferenceManager;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StyleRes;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import com.afollestad.materialdialogs.color.ColorChooserDialog;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.common.prefs.ATEColorPreference;
import com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.prefs.ColorChooserPreference;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -40,33 +40,37 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preferences);
setStatusBarTransparent();
setDrawUnderStatusbar(true);
ButterKnife.bind(this);
toolbar.setBackgroundColor(getThemeColorPrimary());
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null)
getFragmentManager().beginTransaction().replace(R.id.content_frame, new SettingsFragment()).commit();
if (shouldColorNavigationBar())
setNavigationBarThemeColor();
setStatusBarThemeColor();
}
@Override
public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) {
switch (dialog.getTitle()) {
case R.string.primary_color:
PreferenceUtil.getInstance(this).setThemeColorPrimary(selectedColor);
ThemeStore.editTheme(this)
.primaryColor(selectedColor)
.commit();
break;
case R.string.accent_color:
PreferenceUtil.getInstance(this).setThemeColorAccent(selectedColor);
ThemeStore.editTheme(this)
.accentColor(selectedColor)
.commit();
break;
}
recreateIfThemeChanged();
recreate();
}
@Override
@ -78,14 +82,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary());
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
return super.onCreateOptionsMenu(menu);
}
public static class SettingsFragment extends PreferenceFragment {
private static void setSummary(@NonNull Preference preference) {
@ -142,8 +138,10 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
@Override
public boolean onPreferenceChange(Preference preference, @NonNull Object o) {
setSummary(generalTheme, o);
PreferenceUtil.getInstance(getActivity()).setGeneralTheme(getActivity(), (String) o);
((SettingsActivity) getActivity()).recreateIfThemeChanged();
ThemeStore.editTheme(getActivity())
.activityTheme(getThemeResFromPrefValue((String) o))
.commit();
getActivity().recreate();
return true;
}
});
@ -158,46 +156,51 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
}
});
ColorChooserPreference primaryColor = (ColorChooserPreference) findPreference("primary_color");
primaryColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity()));
primaryColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
ATEColorPreference primaryColorPref = (ATEColorPreference) findPreference("primary_color");
final int primaryColor = ThemeStore.primaryColor(getActivity());
primaryColorPref.setColor(primaryColor, ColorUtil.darkenColor(primaryColor));
primaryColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog.Builder(((SettingsActivity) getActivity()), R.string.primary_color)
.accentMode(false)
.allowUserColorInput(true)
.allowUserColorInputAlpha(false)
.preselect(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity()))
.preselect(primaryColor)
.show();
return true;
}
});
ColorChooserPreference accentColor = (ColorChooserPreference) findPreference("accent_color");
accentColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity()));
accentColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
ATEColorPreference accentColorPref = (ATEColorPreference) findPreference("accent_color");
final int accentColor = ThemeStore.accentColor(getActivity());
accentColorPref.setColor(accentColor, ColorUtil.darkenColor(accentColor));
accentColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog.Builder(((SettingsActivity) getActivity()), R.string.accent_color)
.accentMode(true)
.allowUserColorInput(true)
.allowUserColorInputAlpha(false)
.preselect(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity()))
.preselect(accentColor)
.show();
return true;
}
});
Preference colorNavBar = findPreference("should_color_navigation_bar");
ATESwitchPreference colorNavBar = (ATESwitchPreference) findPreference("should_color_navigation_bar");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
colorNavBar.setEnabled(false);
colorNavBar.setSummary(R.string.pref_only_lollipop);
} else {
colorNavBar.setChecked(ThemeStore.coloredNavigationBar(getActivity()));
colorNavBar.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
PreferenceUtil.getInstance(getActivity()).setColoredNavigationBar((boolean) newValue);
((SettingsActivity) getActivity()).recreateIfThemeChanged();
ThemeStore.editTheme(getActivity())
.coloredNavigationBar((Boolean) newValue)
.commit();
getActivity().recreate();
return true;
}
});
@ -223,5 +226,18 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
ResolveInfo ri = pm.resolveActivity(effects, 0);
return ri != null;
}
@StyleRes
public int getThemeResFromPrefValue(String themePrefValue) {
switch (themePrefValue) {
case "dark":
return R.style.Theme_Phonograph;
case "black":
return R.style.Theme_Phonograph_Black;
case "light":
default:
return R.style.Theme_Phonograph_Light;
}
}
}
}

View file

@ -7,7 +7,6 @@ import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@ -16,7 +15,7 @@ import android.support.v4.app.ActivityCompat;
import android.view.KeyEvent;
import android.view.View;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
@ -66,18 +65,9 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
}
protected void onPermissionsChanged() {
postRecreate();
}
protected void postRecreate() {
if (!recreating) {
recreating = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recreate();
}
}, 200);
postRecreate();
}
}
@ -165,7 +155,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
requestPermissions();
}
})
.setActionTextColor(ThemeSingleton.get().positiveColor)
.setActionTextColor(ThemeStore.accentColor(this))
.show();
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
@ -181,7 +171,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
startActivity(intent);
}
})
.setActionTextColor(ThemeSingleton.get().positiveColor)
.setActionTextColor(ThemeStore.accentColor(this))
.show();
}
return;

View file

@ -33,9 +33,9 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
@Bind(R.id.sliding_layout)
SlidingUpPanelLayout slidingUpPanelLayout;
private int navigationBarColor;
private int navigationbarColor;
private int taskColor;
private boolean useDarkStatusBarIcons;
private boolean lightStatusbar;
private AbsPlayerFragment playerFragment;
private MiniPlayerFragment miniPlayerFragment;
@ -100,11 +100,11 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
@Override
public void onPanelCollapsed(View view) {
super.setUseDarkStatusBarIcons(useDarkStatusBarIcons);
super.notifyTaskColorChange(taskColor);
if (shouldColorNavigationBar()) {
super.setNavigationBarColor(navigationBarColor);
}
// restore values
super.setLightStatusbar(lightStatusbar);
super.setTaskDescriptionColor(taskColor);
super.setNavigationbarColor(navigationbarColor);
playerFragment.setMenuVisibility(false);
playerFragment.setUserVisibleHint(false);
playerFragment.onHide();
@ -112,12 +112,12 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
@Override
public void onPanelExpanded(View view) {
super.setUseDarkStatusBarIcons(false);
// setting fragments values
int playerFragmentColor = playerFragment.getPaletteColor();
super.notifyTaskColorChange(playerFragmentColor);
if (shouldColorNavigationBar()) {
super.setNavigationBarColor(playerFragmentColor);
}
super.setLightStatusbar(false);
super.setTaskDescriptionColor(playerFragmentColor);
super.setNavigationbarColor(playerFragmentColor);
playerFragment.setMenuVisibility(true);
playerFragment.setUserVisibleHint(true);
playerFragment.onShow();
@ -182,38 +182,36 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
super.onBackPressed();
}
@Override
protected void setUseDarkStatusBarIcons(boolean useDarkIcons) {
useDarkStatusBarIcons = useDarkIcons;
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
super.setUseDarkStatusBarIcons(useDarkIcons);
}
}
@Override
protected void setNavigationBarColor(@ColorInt int color) {
this.navigationBarColor = color;
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
super.setNavigationBarColor(color);
}
}
@Override
protected void notifyTaskColorChange(@ColorInt int color) {
this.taskColor = color;
if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
super.notifyTaskColorChange(color);
}
}
@Override
public void onPaletteColorChanged() {
if (getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
int playerFragmentColor = playerFragment.getPaletteColor();
super.notifyTaskColorChange(playerFragmentColor);
if (shouldColorNavigationBar()) {
super.setNavigationBarColor(playerFragmentColor);
}
super.setTaskDescriptionColor(playerFragmentColor);
super.setNavigationbarColor(playerFragmentColor);
}
}
@Override
public void setLightStatusbar(boolean enabled) {
lightStatusbar = enabled;
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
super.setLightStatusbar(enabled);
}
}
@Override
public void setNavigationbarColor(int color) {
this.navigationbarColor = color;
if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
super.setNavigationbarColor(color);
}
}
@Override
public void setTaskDescriptionColor(@ColorInt int color) {
this.taskColor = color;
if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
super.setTaskDescriptionColor(color);
}
}
}

View file

@ -1,192 +1,94 @@
package com.kabouzeid.gramophone.ui.activities.base;
import android.app.ActivityManager;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.ColorInt;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ATH;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.common.ATHToolbarActivity;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialDialogsUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
/**
* @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid)
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsThemeActivity extends AppCompatActivity implements KabViewsDisableAble {
private int colorPrimary;
private int colorPrimaryDarker;
private int colorAccent;
private int theme;
private boolean coloredNavigationBar;
@Nullable
private ActivityManager.TaskDescription taskDescription;
public abstract class AbsThemeActivity extends ATHToolbarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
theme = PreferenceUtil.getInstance(this).getGeneralTheme();
setTheme(theme);
// default theme
if (!ThemeStore.isConfigured(this, 1)) {
ThemeStore.editTheme(this)
.activityTheme(R.style.Theme_Phonograph_Light)
.primaryColorRes(R.color.indigo_500)
.accentColorRes(R.color.pink_A400)
.commit();
}
super.onCreate(savedInstanceState);
setupTheme();
MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this);
}
@Override
protected void onResume() {
super.onResume();
// the handler is necessary to avoid "java.lang.RuntimeException: Performing pause of activity that is not resumed"
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recreateIfThemeChanged();
}
}, 200);
}
private void setupTheme() {
boolean dark = theme != R.style.Theme_Phonograph_Light;
colorPrimary = PreferenceUtil.getInstance(this).getThemeColorPrimary(this);
colorPrimaryDarker = ColorUtil.shiftColorDown(colorPrimary);
colorAccent = PreferenceUtil.getInstance(this).getThemeColorAccent(this);
coloredNavigationBar = PreferenceUtil.getInstance(this).shouldUseColoredNavigationBar();
final ColorStateList accentColorStateList;
if (colorAccent == Color.WHITE && !dark) {
accentColorStateList = ColorStateList.valueOf(Color.BLACK);
} else if (colorAccent == Color.BLACK && dark) {
accentColorStateList = ColorStateList.valueOf(Color.WHITE);
} else {
accentColorStateList = ColorStateList.valueOf(colorAccent);
}
ThemeSingleton.get().positiveColor = accentColorStateList;
ThemeSingleton.get().negativeColor = accentColorStateList;
ThemeSingleton.get().neutralColor = accentColorStateList;
ThemeSingleton.get().widgetColor = accentColorStateList.getDefaultColor();
ThemeSingleton.get().darkTheme = dark;
if (!overridesTaskColor()) {
notifyTaskColorChange(getThemeColorPrimary());
}
}
protected void recreateIfThemeChanged() {
if (didThemeChanged()) {
recreate();
}
}
private boolean didThemeChanged() {
return coloredNavigationBar != PreferenceUtil.getInstance(this).shouldUseColoredNavigationBar() ||
colorPrimary != PreferenceUtil.getInstance(this).getThemeColorPrimary(this) ||
colorAccent != PreferenceUtil.getInstance(this).getThemeColorAccent(this) ||
theme != PreferenceUtil.getInstance(this).getGeneralTheme();
}
protected void notifyTaskColorChange(@ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Sets color of entry in the system recents page
if (taskDescription == null || taskDescription.getPrimaryColor() != color) {
taskDescription = new ActivityManager.TaskDescription(
null,
null,
ColorUtil.getOpaqueColor(color));
setTaskDescription(taskDescription);
}
}
}
public int getThemeColorPrimary() {
return colorPrimary;
}
public int getThemeColorPrimaryDarker() {
return colorPrimaryDarker;
}
public int getThemeColorAccent() {
return colorAccent;
}
public boolean shouldColorNavigationBar() {
return coloredNavigationBar;
}
protected void setStatusBarTransparent() {
// TODO see "materialize" library for setting window flags
protected void setDrawUnderStatusbar(boolean drawUnderStatusbar) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
Util.setAllowDrawUnderStatusBar(getWindow());
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
Util.setStatusBarTranslucent(getWindow());
}
protected void setNavigationBarColor(@ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
getWindow().setNavigationBarColor(color);
}
/**
* This will set the color of the view with the id "status_bar" on KitKat and Lollipop.
* On Lollipop if no such view is found it will set the statusbar color using the native method.
*
* @param color the new statusbar color (will be shifted down on Lollipop and above)
*/
protected final void setStatusBarColor(@ColorInt int color) {
public void setStatusbarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final View statusBar = getWindow().getDecorView().getRootView().findViewById(R.id.status_bar);
if (statusBar != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
statusBar.setBackgroundColor(ColorUtil.shiftColorDown(color));
statusBar.setBackgroundColor(ColorUtil.darkenColor(color));
ATH.setLightStatusbarAuto(this, color);
} else {
statusBar.setBackgroundColor(color);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(ColorUtil.shiftColorDown(color));
}
}
}
protected void setUseDarkStatusBarIcons(boolean useDarkIcons) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int systemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();
if (useDarkIcons) {
getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ATH.setStatusbarColor(this, ColorUtil.darkenColor(color));
}
}
}
protected final void setNavigationBarThemeColor() {
setNavigationBarColor(colorPrimary);
public void setStatusbarColorAuto() {
// we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat
setStatusbarColor(ThemeStore.primaryColor(this));
}
protected final void setStatusBarThemeColor() {
setStatusBarColor(colorPrimary);
public void setTaskDescriptionColor(@ColorInt int color) {
ATH.setTaskDescriptionColor(this, color);
}
protected final void resetNavigationBarColor() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
setNavigationBarColor(ColorUtil.resolveColor(this, android.R.attr.navigationBarColor));
public void setTaskDescriptionColorAuto() {
setTaskDescriptionColor(ThemeStore.primaryColor(this));
}
protected final void resetStatusBarColor() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
setStatusBarColor(ColorUtil.resolveColor(this, android.R.attr.statusBarColor));
public void setNavigationbarColor(int color) {
ATH.setNavigationbarColor(this, color);
}
protected boolean overridesTaskColor() {
return false;
public void setNavigationbarColorAuto() {
setNavigationbarColor(ThemeStore.navigationBarColor(this));
}
public void setLightStatusbar(boolean enabled) {
ATH.setLightStatusbar(this, enabled);
}
public void setLightStatusbarAuto(int bgColor) {
setLightStatusbar(ColorUtil.isColorLight(bgColor));
}
}

View file

@ -16,7 +16,6 @@ import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.OvershootInterpolator;
@ -25,13 +24,13 @@ import android.widget.LinearLayout;
import com.afollestad.materialdialogs.MaterialDialog;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
@ -189,9 +188,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
}
});
int fabColor = getThemeColorAccent();
int fabDrawableColor = ColorUtil.getPrimaryTextColorForBackground(this, fabColor);
fab.setBackgroundTintList(ColorStateList.valueOf(fabColor));
int accentColor = ThemeStore.accentColor(this);
int fabDrawableColor = ColorUtil.getPrimaryTextColorForBackground(this, accentColor);
fab.setBackgroundTintList(ColorStateList.valueOf(accentColor));
fab.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN);
}
@ -233,14 +232,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary);
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
return super.onCreateOptionsMenu(menu);
}
protected void setNoImageMode() {
isInNoImageMode = true;
image.setVisibility(View.GONE);
@ -248,14 +239,13 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
observableScrollView.setPadding(0, Util.getActionBarSize(this), 0, 0);
observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false);
paletteColorPrimary = getIntent().getIntExtra(EXTRA_PALETTE,
getThemeColorPrimary());
paletteColorPrimary = getIntent().getIntExtra(EXTRA_PALETTE, ThemeStore.primaryColor(this));
toolbar.setBackgroundColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary);
if (shouldColorNavigationBar())
setNavigationBarColor(paletteColorPrimary);
setStatusBarColor(paletteColorPrimary);
setStatusbarColor(paletteColorPrimary);
setNavigationbarColor(paletteColorPrimary);
setTaskDescriptionColor(paletteColorPrimary);
}
protected void dataChanged() {
@ -284,19 +274,10 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
private void setColors(int color) {
paletteColorPrimary = color;
observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false);
if (shouldColorNavigationBar())
setNavigationBarColor(paletteColorPrimary);
setStatusBarColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary);
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary);
ViewUtil.setToolbarContentDark(AbsTagEditorActivity.this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
notifyTaskColorChange(paletteColorPrimary);
}
@Override
protected boolean overridesTaskColor() {
return true;
setStatusbarColor(paletteColorPrimary);
setNavigationbarColor(paletteColorPrimary);
setTaskDescriptionColor(paletteColorPrimary);
}
protected void writeValuesToFiles(@NonNull final Map<FieldKey, String> fieldKeyValueMap) {

View file

@ -13,7 +13,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.util.ColorUtil;
@ -61,7 +61,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
private void setUpRecyclerView() {
if (recyclerView instanceof FastScrollRecyclerView) {
int accentColor = ThemeSingleton.get().positiveColor.getDefaultColor();
int accentColor = ThemeStore.accentColor(getActivity());
((FastScrollRecyclerView) recyclerView).setPopupBgColor(accentColor);
((FastScrollRecyclerView) recyclerView).setPopupTextColor(ColorUtil.getPrimaryTextColorForBackground(getActivity(), accentColor));
((FastScrollRecyclerView) recyclerView).setThumbColor(accentColor);

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.ui.fragments.player;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.annotation.Nullable;
@ -13,7 +14,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
@ -99,7 +100,7 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary)));
setUpPlayPauseButton();
progressBar.setProgressTintList(ThemeSingleton.get().positiveColor);
progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(activity)));
}
public void setMiniPlayerColor(int color) {

View file

@ -2,10 +2,12 @@ package com.kabouzeid.gramophone.ui.fragments.player;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
@ -19,11 +21,13 @@ import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager;
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.TintHelper;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.adapter.song.PlayingQueueAdapter;
@ -225,7 +229,9 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
private void updateIsFavorite() {
boolean isFavorite = MusicUtil.isFavorite(getActivity(), MusicPlayerRemote.getCurrentSong());
Drawable favoriteIcon = Util.getTintedDrawable(getActivity(), isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp, ViewUtil.getToolbarIconColor(getActivity(), false));
int res = isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp;
Drawable favoriteIcon = TintHelper.tintDrawable(ContextCompat.getDrawable(getActivity(), res), ToolbarContentTintHelper.toolbarContentColor(getActivity(), Color.TRANSPARENT));
toolbar.getMenu().findItem(R.id.action_toggle_favorite)
.setIcon(favoriteIcon)
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
@ -347,7 +353,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
animatorSet.play(backgroundAnimator);
Animator subHeaderAnimator = ThemeSingleton.get().darkTheme ? null : ViewUtil.createTextColorTransition(fragment.playerQueueSubHeader, fragment.lastColor, newColor);
Animator subHeaderAnimator = ATHUtil.isWindowBackgroundDark(fragment.getActivity()) ? null : ViewUtil.createTextColorTransition(fragment.playerQueueSubHeader, fragment.lastColor, newColor);
if (subHeaderAnimator != null) {
animatorSet.play(subHeaderAnimator);
}
@ -358,7 +364,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
@Override
public void animateColorChange(PlayerFragment fragment, int newColor) {
if (ThemeSingleton.get().darkTheme) {
if (ATHUtil.isWindowBackgroundDark(fragment.getActivity())) {
fragment.playerQueueSubHeader.setTextColor(ColorUtil.getSecondaryTextColor(fragment.getActivity(), false));
}
}

View file

@ -3,42 +3,19 @@ package com.kabouzeid.gramophone.util;
import android.animation.Animator;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.support.v7.view.menu.ListMenuItemView;
import android.support.v7.view.menu.MenuPopupHelper;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.animation.PathInterpolator;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.MDTintHelper;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.gramophone.R;
import java.lang.reflect.Field;
import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ViewUtil {
public final static int PHONOGRAPH_ANIM_TIME = 1000;
public static Animator createBackgroundColorTransition(final View v, final int startColor, final int endColor) {
return createColorAnimator(v, "backgroundColor", startColor, endColor);
}
@ -47,8 +24,6 @@ public class ViewUtil {
return createColorAnimator(v, "textColor", startColor, endColor);
}
public final static int PHONOGRAPH_ANIM_TIME = 1000;
private static Animator createColorAnimator(Object target, String propertyName, int startColor, int endColor) {
ObjectAnimator animator;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@ -65,149 +40,6 @@ public class ViewUtil {
return animator;
}
/**
* Should be called in {@link android.app.Activity#onPrepareOptionsMenu(Menu)} and {@link android.app.Activity#onOptionsItemSelected(MenuItem)}
*
* @param toolbar the toolbar to apply the tint on
*/
public static void invalidateToolbarPopupMenuTint(@Nullable final Toolbar toolbar) {
if (toolbar == null) return;
toolbar.post(new Runnable() {
@Override
public void run() {
try {
Field f1 = Toolbar.class.getDeclaredField("mMenuView");
f1.setAccessible(true);
ActionMenuView actionMenuView = (ActionMenuView) f1.get(toolbar);
Field f2 = ActionMenuView.class.getDeclaredField("mPresenter");
f2.setAccessible(true);
Object presenter = f2.get(actionMenuView); // ActionMenuPresenter is not a public class, so we use Object here
Field f3 = presenter.getClass().getDeclaredField("mOverflowPopup");
f3.setAccessible(true);
MenuPopupHelper overflowMenuPopupHelper = (MenuPopupHelper) f3.get(presenter);
ViewUtil.setTintForMenuPopupHelper(overflowMenuPopupHelper);
Field f4 = presenter.getClass().getDeclaredField("mActionButtonPopup");
f4.setAccessible(true);
MenuPopupHelper subMenuPopupHelper = (MenuPopupHelper) f4.get(presenter);
ViewUtil.setTintForMenuPopupHelper(subMenuPopupHelper);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void setTintForMenuPopupHelper(@Nullable MenuPopupHelper menuPopupHelper) {
if (menuPopupHelper == null) return;
final ListView listView = menuPopupHelper.getPopup().getListView();
listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
try {
Field checkboxField = ListMenuItemView.class.getDeclaredField("mCheckBox");
checkboxField.setAccessible(true);
Field radioButtonField = ListMenuItemView.class.getDeclaredField("mRadioButton");
radioButtonField.setAccessible(true);
for (int i = 0; i < listView.getChildCount(); i++) {
View v = listView.getChildAt(i);
if (!(v instanceof ListMenuItemView)) continue;
ListMenuItemView iv = (ListMenuItemView) v;
CheckBox check = (CheckBox) checkboxField.get(iv);
if (check != null) {
MDTintHelper.setTint(check, ThemeSingleton.get().positiveColor.getDefaultColor());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
check.setBackground(null);
}
}
RadioButton radioButton = (RadioButton) radioButtonField.get(iv);
if (radioButton != null) {
MDTintHelper.setTint(radioButton, ThemeSingleton.get().positiveColor.getDefaultColor());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
radioButton.setBackground(null);
}
}
}
} catch (Throwable e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
//noinspection deprecation
listView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
/**
* Call this in {@link android.app.Activity#onCreateOptionsMenu(Menu)} and everywhere where the toolbar color is changed.
*/
public static void setToolbarContentColorForBackground(@NonNull Context context, @Nullable Toolbar toolbar, @ColorInt final int backgroundColor) {
ViewUtil.setToolbarContentDark(context, toolbar, ColorUtil.useDarkTextColorOnBackground(backgroundColor));
}
public static void setToolbarContentDark(@NonNull Context context, @Nullable Toolbar toolbar, boolean dark) {
if (toolbar == null) return;
toolbar.setTitleTextColor(ColorUtil.getPrimaryTextColor(context, dark));
toolbar.setSubtitleTextColor(ColorUtil.getSecondaryTextColor(context, dark));
setToolbarIconColor(context, toolbar, getToolbarIconColor(context, dark));
}
@ColorInt
public static int getToolbarIconColor(Context context, boolean dark) {
if (dark) {
return ColorUtil.getSecondaryTextColor(context, true);
} else {
return ColorUtil.getPrimaryTextColor(context, false);
}
}
private static void setToolbarIconColor(@NonNull final Context context, @Nullable final Toolbar toolbar, @ColorInt final int color) {
if (toolbar == null) return;
toolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
toolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this);
final ArrayList<View> outViews = new ArrayList<>();
final String overflowDescription = context.getString(R.string.abc_action_menu_overflow_description);
toolbar.findViewsWithText(outViews, overflowDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
if (!outViews.isEmpty()) {
try {
ImageView overflowButton = (ImageView) outViews.get(0);
overflowButton.setColorFilter(color, PorterDuff.Mode.SRC_IN);
} catch (ClassCastException e) {
Log.e("setToolbarIconColor", "overflow button is not an ImageView", e);
}
}
Menu menu = toolbar.getMenu();
for (int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
if (item.getIcon() != null) {
item.getIcon().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
}
Drawable navigationIcon = toolbar.getNavigationIcon();
if (navigationIcon != null) {
navigationIcon = navigationIcon.mutate();
navigationIcon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
toolbar.setNavigationIcon(navigationIcon);
}
}
});
}
public static boolean hitTest(View v, int x, int y) {
final int tx = (int) (ViewCompat.getTranslationX(v) + 0.5f);
final int ty = (int) (ViewCompat.getTranslationY(v) + 0.5f);

View file

@ -1,76 +0,0 @@
package com.kabouzeid.gramophone.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.ColorUtil;
public class ColorView extends FrameLayout {
private final Paint paint;
private final Paint paintBorder;
private final int borderWidth;
public ColorView(@NonNull Context context) {
this(context, null, 0);
}
public ColorView(@NonNull Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ColorView(@NonNull Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
borderWidth = getResources().getDimensionPixelSize(R.dimen.color_view_border);
paint = new Paint();
paint.setAntiAlias(true);
paintBorder = new Paint();
paintBorder.setAntiAlias(true);
setWillNotDraw(false);
}
public void setColor(int color) {
paint.setColor(color);
paintBorder.setColor(ColorUtil.shiftColorDown(color));
requestLayout();
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) {
int width = MeasureSpec.getSize(widthMeasureSpec);
//noinspection SuspiciousNameCombination
int height = width;
if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec));
}
setMeasuredDimension(width, height);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
int canvasSize = canvas.getWidth();
if (canvas.getHeight() < canvasSize)
canvasSize = canvas.getHeight();
int circleCenter = (canvasSize - (borderWidth * 2)) / 2;
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 4.0f, paintBorder);
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 4.0f, paint);
}
}

View file

@ -1,34 +0,0 @@
package com.kabouzeid.gramophone.views;
import android.content.Context;
import android.support.v7.widget.AppCompatCheckBox;
import android.util.AttributeSet;
import com.afollestad.materialdialogs.internal.MDTintHelper;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
/**
* @author Aidan Follestad (afollestad)
*/
public class DynamicCheckBox extends AppCompatCheckBox {
public DynamicCheckBox(Context context) {
super(context);
init();
}
public DynamicCheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DynamicCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
final int color = ThemeSingleton.get().positiveColor.getDefaultColor();
MDTintHelper.setTint(this, color);
}
}

View file

@ -1,34 +0,0 @@
package com.kabouzeid.gramophone.views;
import android.content.Context;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import com.afollestad.materialdialogs.internal.MDTintHelper;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
/**
* @author Aidan Follestad (afollestad)
*/
public class DynamicEditText extends AppCompatEditText {
public DynamicEditText(Context context) {
super(context);
init();
}
public DynamicEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DynamicEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
final int color = ThemeSingleton.get().positiveColor.getDefaultColor();
MDTintHelper.setTint(this, color);
}
}

View file

@ -1,212 +0,0 @@
package com.kabouzeid.gramophone.views;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.StateListDrawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.widget.FrameLayout;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.Util;
import static android.support.v7.widget.RecyclerView.OnScrollListener;
public class FastScroller extends FrameLayout {
private static final int HANDLE_HIDE_DELAY = 1500;
private static final int HANDLE_ANIMATION_DURATION = 300;
private View handle;
private View bar;
private RecyclerView recyclerView;
private final HandleHider handleHider = new HandleHider();
private final ScrollListener scrollListener = new ScrollListener();
private boolean isHidden;
private int hideTranslationX;
@Nullable
private ViewPropertyAnimator currentAnimator = null;
public FastScroller(@NonNull Context context, AttributeSet attrs) {
super(context, attrs);
initialise(context);
}
public FastScroller(@NonNull Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialise(context);
}
private void initialise(@NonNull Context context) {
hideTranslationX = getContext().getResources().getDimensionPixelSize(R.dimen.scrollbar_width) * (Util.isRTL(context) ? -1 : 1);
setClipChildren(false);
inflate(context, R.layout.vertical_recycler_fast_scroller_layout, this);
handle = findViewById(R.id.scroll_handle);
bar = findViewById(R.id.scroll_bar);
handle.setEnabled(true);
setPressedHandleColor(ColorUtil.resolveColor(getContext(), R.attr.colorControlActivated));
setUpBarBackground();
postDelayed(handleHider, HANDLE_HIDE_DELAY);
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
handle.setPressed(true);
setRecyclerViewPosition(event.getY());
showIfHidden();
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
handle.setPressed(false);
scheduleHide();
return true;
}
return super.onTouchEvent(event);
}
public void setRecyclerView(@NonNull RecyclerView recyclerView) {
this.recyclerView = recyclerView;
recyclerView.addOnScrollListener(scrollListener);
}
private void setRecyclerViewPosition(float y) {
if (recyclerView != null) {
int itemCount = recyclerView.getAdapter().getItemCount();
float proportion = y / (float) getHeightMinusPadding();
int targetPos = getValueInRange(0, itemCount - 1, Math.round(proportion * (float) itemCount));
recyclerView.scrollToPosition(targetPos);
}
}
private int getValueInRange(int min, int max, int value) {
int minimum = Math.max(min, value);
return Math.min(minimum, max);
}
private void setHandlePosition(float y) {
float position = y / getHeightMinusPadding();
int handleHeight = handle.getHeight();
handle.setY(getValueInRange(0, getHeightMinusPadding() - handleHeight, Math.round((getHeightMinusPadding() - handleHeight) * position)));
}
private void showImpl() {
isHidden = false;
if (currentAnimator != null) {
currentAnimator.cancel();
}
currentAnimator = animate().translationX(0).setDuration(HANDLE_ANIMATION_DURATION);
currentAnimator.start();
}
private void hideImpl() {
isHidden = true;
if (currentAnimator != null) {
currentAnimator.cancel();
}
currentAnimator = animate().translationX(hideTranslationX).setDuration(HANDLE_ANIMATION_DURATION);
currentAnimator.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
currentAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
currentAnimator = null;
}
});
currentAnimator.start();
}
private class HandleHider implements Runnable {
@Override
public void run() {
hideImpl();
}
}
private void showIfHidden() {
if (isHidden) {
getHandler().removeCallbacks(handleHider);
showImpl();
}
}
private void scheduleHide() {
getHandler().removeCallbacks(handleHider);
getHandler().postDelayed(handleHider, HANDLE_HIDE_DELAY);
}
private int getHeightMinusPadding() {
return getHeight() - getPaddingBottom() - getPaddingTop();
}
private float computeHandlePosition() {
View firstVisibleView = recyclerView.getChildAt(0);
int firstVisiblePosition = recyclerView.getChildAdapterPosition(firstVisibleView);
int itemCount = recyclerView.getAdapter().getItemCount();
float proportion = (float) firstVisiblePosition / (float) itemCount;
return getHeightMinusPadding() * proportion + recyclerView.getChildCount() * proportion;
}
public void updateHandlePosition() {
setHandlePosition(computeHandlePosition());
}
public void setPressedHandleColor(int accent) {
StateListDrawable drawable = new StateListDrawable();
int colorControlNormal = ColorUtil.resolveColor(getContext(), R.attr.colorControlNormal);
if (!Util.isRTL(getContext())) {
drawable.addState(View.PRESSED_ENABLED_STATE_SET,
new InsetDrawable(new ColorDrawable(accent), getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0, 0, 0));
drawable.addState(View.EMPTY_STATE_SET,
new InsetDrawable(new ColorDrawable(colorControlNormal), getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0, 0, 0));
} else {
drawable.addState(View.PRESSED_ENABLED_STATE_SET,
new InsetDrawable(new ColorDrawable(accent), 0, 0, getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0));
drawable.addState(View.EMPTY_STATE_SET,
new InsetDrawable(new ColorDrawable(colorControlNormal), 0, 0, getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0));
}
handle.setBackground(drawable);
}
private void setUpBarBackground() {
Drawable drawable;
int colorControlNormal = ColorUtil.resolveColor(getContext(), R.attr.colorControlNormal);
if (!Util.isRTL(getContext())) {
drawable = new InsetDrawable(new ColorDrawable(colorControlNormal), getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0, 0, 0);
} else {
drawable = new InsetDrawable(new ColorDrawable(colorControlNormal), 0, 0, getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0);
}
bar.setBackground(drawable);
}
private class ScrollListener extends OnScrollListener {
@Override
public void onScrolled(RecyclerView rv, int dx, int dy) {
updateHandlePosition();
showIfHidden();
scheduleHide();
}
}
}

View file

@ -1,157 +0,0 @@
package com.kabouzeid.gramophone.views;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.StateListDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.FrameLayout;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.gramophone.util.ColorUtil;
public class SelectableColorView extends FrameLayout {
private boolean selected;
private final int borderWidthExtraSmall;
private final int borderWidthSmall;
private final int borderWidthLarge;
private Paint outerPaint;
private Paint gapPaint;
private Paint innerPaint;
public SelectableColorView(Context context) {
this(context, null, 0);
}
public SelectableColorView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SelectableColorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
final Resources r = getResources();
borderWidthExtraSmall = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, r.getDisplayMetrics());
borderWidthSmall = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, r.getDisplayMetrics());
borderWidthLarge = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());
gapPaint = new Paint();
gapPaint.setAntiAlias(true);
gapPaint.setColor(ThemeSingleton.get().darkTheme ? Color.parseColor("#444444") : Color.WHITE);
innerPaint = new Paint();
innerPaint.setAntiAlias(true);
outerPaint = new Paint();
outerPaint.setAntiAlias(true);
setWillNotDraw(false);
}
private void updateColor(@ColorInt int color) {
innerPaint.setColor(color);
outerPaint.setColor(ColorUtil.shiftColorDown(color));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int[][] states = new int[][]{
new int[]{android.R.attr.state_pressed}
};
int[] colors = new int[]{createSelectedColor(color)};
ColorStateList rippleColors = new ColorStateList(states, colors);
Drawable mask = new ShapeDrawable(new OvalShape());
RippleDrawable rippleDrawable = new RippleDrawable(rippleColors, null, mask);
setForeground(rippleDrawable);
} else {
ShapeDrawable pressedDrawable = new ShapeDrawable(new OvalShape());
pressedDrawable.getPaint().setColor(createSelectedColor(color));
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedDrawable);
setForeground(stateListDrawable);
}
}
@ColorInt
private static int createSelectedColor(int color) {
if (ColorUtil.useDarkTextColorOnBackground(color)) {
return ColorUtil.shiftColor(color, 0.8f);
} else {
return ColorUtil.shiftColor(color, 1.2f);
}
}
public void setColor(@ColorInt int color) {
updateColor(color);
requestLayout();
invalidate();
}
@Override
public void setSelected(boolean selected) {
this.selected = selected;
requestLayout();
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) {
int width = MeasureSpec.getSize(widthMeasureSpec);
//noinspection SuspiciousNameCombination
int height = width;
if (heightMode == MeasureSpec.AT_MOST)
height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec));
setMeasuredDimension(width, height);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final int outerRadius = getMeasuredWidth() / 2;
if (selected) {
final int whiteRadius = outerRadius - borderWidthLarge;
final int innerRadius = whiteRadius - borderWidthSmall;
canvas.drawCircle(getMeasuredWidth() / 2,
getMeasuredHeight() / 2,
outerRadius,
outerPaint);
canvas.drawCircle(getMeasuredWidth() / 2,
getMeasuredHeight() / 2,
whiteRadius,
gapPaint);
canvas.drawCircle(getMeasuredWidth() / 2,
getMeasuredHeight() / 2,
innerRadius,
innerPaint);
} else {
final int innerRadius = outerRadius - borderWidthExtraSmall;
canvas.drawCircle(getMeasuredWidth() / 2,
getMeasuredHeight() / 2,
outerRadius,
outerPaint);
canvas.drawCircle(getMeasuredWidth() / 2,
getMeasuredHeight() / 2,
innerRadius,
innerPaint);
}
}
}

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/black" />
</shape>

View file

@ -50,10 +50,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/tab_height"
app:tabContentStart="72dp"
app:tabIndicatorColor="@color/primary_text_default_material_dark"
app:tabMode="scrollable"
app:tabSelectedTextColor="@color/primary_text_default_material_dark"
app:tabTextColor="@color/secondary_text_default_material_dark" />
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>

View file

@ -1,24 +0,0 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dip"
android:paddingRight="16dip"
android:paddingTop="16dp"
android:gravity="start|center_vertical"
android:layout_gravity="start|center_vertical"
tools:ignore="UnusedAttribute">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textColor="?colorAccent"
android:fontFamily="@string/font_fontFamily_medium"
android:textStyle="@integer/font_textStyle_medium"
android:textSize="14sp"
android:gravity="start|center_vertical"
android:layout_gravity="start|center_vertical"
android:textAlignment="viewStart" />
</FrameLayout>

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.kabouzeid.gramophone.views.ColorView
android:id="@+id/circle"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center_vertical|end"
xmlns:android="http://schemas.android.com/apk/res/android" />

View file

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingEnd="?android:attr/scrollbarSize"
android:paddingRight="?android:attr/scrollbarSize"
tools:ignore="RtlSymmetry,UnusedAttribute"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="12dip"
android:layout_marginEnd="6dip"
android:layout_marginLeft="16dip"
android:layout_marginRight="6dip"
android:layout_marginStart="16dip"
android:layout_marginTop="12dip"
android:layout_weight="1">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:fontFamily="sans-serif"
android:gravity="start"
android:singleLine="true"
android:textAlignment="viewStart"
android:textColor="?android:textColorPrimary"
android:textSize="16sp"
tools:text="Title" />
<TextView
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@android:id/title"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignStart="@android:id/title"
android:layout_below="@android:id/title"
android:layout_marginTop="2dp"
android:fontFamily="sans-serif"
android:gravity="start"
android:maxLines="6"
android:textAlignment="viewStart"
android:textColor="?android:textColorSecondary"
android:textSize="14sp"
tools:text="Summary" />
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:gravity="center_vertical"
android:orientation="vertical" />
</LinearLayout>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.kabouzeid.gramophone.views.DynamicCheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false" />

View file

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/scrollbar_width_plus_inset"
android:layout_height="match_parent"
tools:layout_gravity="end">
<View
android:id="@+id/scroll_bar"
android:layout_width="@dimen/scrollbar_width_plus_inset"
android:layout_height="match_parent"
android:layout_gravity="end"
android:alpha="0.3" />
<View
android:id="@+id/scroll_handle"
android:layout_width="@dimen/scrollbar_width_plus_inset"
android:layout_height="48dp"
android:layout_gravity="end" />
</FrameLayout>

View file

@ -22,9 +22,9 @@
</string-array>
<string-array name="pref_general_theme_list_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>light</item>
<item>dark</item>
<item>black</item>
</string-array>
<string-array name="pref_auto_download_images_titles">

View file

@ -58,7 +58,7 @@
</style>
<style name="Theme.Phonograph.Base.Black" parent="@style/Theme.Phonograph.Base">
<item name="android:windowBackground">@drawable/black</item>
<item name="android:windowBackground">@android:color/black</item>
<item name="divider_color">#18FFFFFF</item>
<item name="default_bar_color">@color/grey_800</item>
<item name="cardBackgroundColor">@color/grey_900</item>

View file

@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_audio">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_audio">
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:key="gapless_playback"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_gapless_playback"
android:title="@string/pref_title_gapless_playback"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_gapless_playback" />
<Preference
<com.kabouzeid.appthemehelper.common.prefs.ATEPreference
android:key="equalizer"
android:layout="@layout/preference_custom"
android:title="@string/equalizer" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,43 +1,32 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_colors">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_colors">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
android:defaultValue="0"
android:entries="@array/pref_general_theme_list_titles"
android:entryValues="@array/pref_general_theme_list_values"
android:key="general_theme"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_general_theme" />
<com.kabouzeid.gramophone.prefs.ColorChooserPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEColorPreference
android:key="primary_color"
android:persistent="false"
android:summary="@string/primary_color_desc"
android:title="@string/primary_color" />
<com.kabouzeid.gramophone.prefs.ColorChooserPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEColorPreference
android:key="accent_color"
android:persistent="false"
android:summary="@string/accent_color_desc"
android:title="@string/accent_color" />
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="true"
android:key="colored_notification"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_colored_notification"
android:title="@string/pref_title_colored_notification"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_colored_notification" />
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:key="should_color_navigation_bar"
android:layout="@layout/preference_custom"
android:persistent="false"
android:summary="@string/pref_summary_colored_navigation_bar"
android:title="@string/pref_title_navigation_bar"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_navigation_bar" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,17 +1,25 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_general">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_general">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:defaultValue="-1"
android:entries="@array/pref_start_page_list_titles"
android:entryValues="@array/pref_start_page_list_values"
android:key="default_start_page"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_set_default_start_page" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:defaultValue="light"
android:entries="@array/pref_general_theme_list_titles"
android:entryValues="@array/pref_general_theme_list_values"
android:key="general_theme"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_general_theme" />
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,26 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_images">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_images">
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:key="ignore_media_store_artwork"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_ignore_media_store_artwork"
android:title="@string/pref_title_ignore_media_store_artwork"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_ignore_media_store_artwork" />
<com.afollestad.materialdialogs.prefs.MaterialListPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:defaultValue="only_wifi"
android:entries="@array/pref_auto_download_images_titles"
android:entryValues="@array/pref_auto_download_images_values"
android:key="auto_download_images_policy"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_auto_download_artist_images" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,24 +1,20 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_lockscreen">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_lockscreen">
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="true"
android:key="album_art_on_lockscreen"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_album_art_on_lockscreen"
android:title="@string/pref_title_album_art_on_lockscreen"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_album_art_on_lockscreen" />
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:dependency="album_art_on_lockscreen"
android:key="blurred_album_art"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_blurred_album_art"
android:title="@string/pref_title_blurred_album_art"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_blurred_album_art" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_now_playing_screen">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_now_playing_screen">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:enabled="false"
android:key="now_playing_layout"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:summary="Coming soon"
android:title="@string/pref_title_now_playing_layout" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>