From 8b98a9be8538f90dcc3f5a9b3fe8e49da2e2a55b Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 25 Jan 2016 22:20:59 +0100 Subject: [PATCH] Implemented app-theme-helper. Needs to be cleaned up. --- app/build.gradle | 1 + .../song/ShuffleButtonSongAdapter.java | 7 +- .../prefs/ColorChooserPreference.java | 55 ----- .../prefs/DynamicPreferenceCategory.java | 39 ---- .../ui/activities/AboutActivity.java | 23 +- .../ui/activities/AlbumDetailActivity.java | 28 +-- .../ui/activities/ArtistDetailActivity.java | 29 +-- .../ui/activities/MainActivity.java | 78 ++----- .../ui/activities/PlaylistDetailActivity.java | 21 +- .../ui/activities/SearchActivity.java | 31 +-- .../ui/activities/SettingsActivity.java | 86 ++++--- .../ui/activities/base/AbsBaseActivity.java | 18 +- .../base/AbsSlidingMusicPanelActivity.java | 78 ++++--- .../ui/activities/base/AbsThemeActivity.java | 180 ++++----------- .../tageditor/AbsTagEditorActivity.java | 41 +--- .../AbsMainActivityRecyclerViewFragment.java | 4 +- .../fragments/player/MiniPlayerFragment.java | 5 +- .../ui/fragments/player/PlayerFragment.java | 14 +- .../kabouzeid/gramophone/util/ViewUtil.java | 172 +------------- .../kabouzeid/gramophone/views/ColorView.java | 76 ------- .../gramophone/views/DynamicCheckBox.java | 34 --- .../gramophone/views/DynamicEditText.java | 34 --- .../gramophone/views/FastScroller.java | 212 ------------------ .../gramophone/views/SelectableColorView.java | 157 ------------- app/src/main/res/drawable-nodpi/black.xml | 5 - .../main/res/layout/activity_main_content.xml | 5 +- .../res/layout/preference_category_custom.xml | 24 -- .../res/layout/preference_color_widget.xml | 7 - app/src/main/res/layout/preference_custom.xml | 70 ------ .../layout/preference_dynamic_checkbox.xml | 8 - ...vertical_recycler_fast_scroller_layout.xml | 21 -- .../res/values/strings_activity_settings.xml | 6 +- app/src/main/res/values/styles_parents.xml | 2 +- app/src/main/res/xml/pref_audio.xml | 13 +- app/src/main/res/xml/pref_colors.xml | 33 +-- app/src/main/res/xml/pref_general.xml | 16 +- app/src/main/res/xml/pref_images.xml | 13 +- app/src/main/res/xml/pref_lockscreen.xml | 16 +- .../main/res/xml/pref_now_playing_screen.xml | 7 +- 39 files changed, 287 insertions(+), 1382 deletions(-) delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java delete mode 100644 app/src/main/res/drawable-nodpi/black.xml delete mode 100644 app/src/main/res/layout/preference_category_custom.xml delete mode 100644 app/src/main/res/layout/preference_color_widget.xml delete mode 100644 app/src/main/res/layout/preference_custom.xml delete mode 100644 app/src/main/res/layout/preference_dynamic_checkbox.xml delete mode 100644 app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml diff --git a/app/build.gradle b/app/build.gradle index c7fb337c..23987b62 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/ShuffleButtonSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/ShuffleButtonSongAdapter.java index f9c829ba..bbdb1301 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/ShuffleButtonSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/ShuffleButtonSongAdapter.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java deleted file mode 100644 index ecdf00ae..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java +++ /dev/null @@ -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); - } - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java deleted file mode 100644 index 0a08e7bb..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java +++ /dev/null @@ -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); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java index e8adb1b3..472b5a41 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java @@ -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); - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index f83f5fa4..a8de2478 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -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); + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index cdb6ab90..9bd3b785 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -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); + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 8711ea26..2e15b9aa 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index ec830738..e595f36f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -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; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java index 19e4844d..df10a4a9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java @@ -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() { 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 8030e1de..7090027a 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 @@ -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; + } + } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java index 2536a802..b98ddbe2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java @@ -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; 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 00080515..32f4ceb4 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 @@ -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); } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java index e0a7d54d..ea9beb85 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java @@ -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)); } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index a63da241..ac96ae91 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -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 fieldKeyValueMap) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java index 8bc3ccb4..f967fd1e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java @@ -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= 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 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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java b/app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java deleted file mode 100644 index 2d93379f..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java +++ /dev/null @@ -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); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java b/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java deleted file mode 100644 index 7a5ff47b..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java +++ /dev/null @@ -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); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java b/app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java deleted file mode 100644 index 70d927cd..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java +++ /dev/null @@ -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); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java b/app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java deleted file mode 100644 index 993223dc..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java +++ /dev/null @@ -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(); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java b/app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java deleted file mode 100644 index adefd514..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java +++ /dev/null @@ -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); - } - } -} diff --git a/app/src/main/res/drawable-nodpi/black.xml b/app/src/main/res/drawable-nodpi/black.xml deleted file mode 100644 index d078e48b..00000000 --- a/app/src/main/res/drawable-nodpi/black.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index 4a80c27d..d69455fb 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -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" /> diff --git a/app/src/main/res/layout/preference_category_custom.xml b/app/src/main/res/layout/preference_category_custom.xml deleted file mode 100644 index 5b6a2aaa..00000000 --- a/app/src/main/res/layout/preference_category_custom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_color_widget.xml b/app/src/main/res/layout/preference_color_widget.xml deleted file mode 100644 index 9a9ca8b7..00000000 --- a/app/src/main/res/layout/preference_color_widget.xml +++ /dev/null @@ -1,7 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_custom.xml b/app/src/main/res/layout/preference_custom.xml deleted file mode 100644 index 80fbffce..00000000 --- a/app/src/main/res/layout/preference_custom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_dynamic_checkbox.xml b/app/src/main/res/layout/preference_dynamic_checkbox.xml deleted file mode 100644 index e6360855..00000000 --- a/app/src/main/res/layout/preference_dynamic_checkbox.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml b/app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml deleted file mode 100644 index 765bbfaa..00000000 --- a/app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings_activity_settings.xml b/app/src/main/res/values/strings_activity_settings.xml index 80c9fbe6..33eba14a 100644 --- a/app/src/main/res/values/strings_activity_settings.xml +++ b/app/src/main/res/values/strings_activity_settings.xml @@ -22,9 +22,9 @@ - 0 - 1 - 2 + light + dark + black diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index eec8a3b1..b7f75c80 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -58,7 +58,7 @@