diff --git a/app/build.gradle b/app/build.gradle
index 04e93393..f5a3b540 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -80,6 +80,7 @@ dependencies {
implementation 'com.afollestad:material-cab:0.1.12'
implementation 'me.zhanghai.android.materialprogressbar:library:1.6.1'
+ implementation 'com.github.QuadFlask:colorpicker:ef73ced217'
implementation 'com.github.codekidX:storage-chooser:2.0.4.4'
implementation 'com.pacioianu.david:ink-page-indicator:1.3.0'
implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0'
diff --git a/app/src/main/java/com/dkanada/gramophone/activities/SettingsActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/SettingsActivity.java
index c52c39e4..152ddad2 100644
--- a/app/src/main/java/com/dkanada/gramophone/activities/SettingsActivity.java
+++ b/app/src/main/java/com/dkanada/gramophone/activities/SettingsActivity.java
@@ -5,7 +5,6 @@ import android.os.Build;
import android.os.Bundle;
import android.view.View;
-import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
@@ -13,11 +12,8 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.TwoStatePreference;
-import com.afollestad.materialdialogs.color.ColorChooserDialog;
import com.dkanada.gramophone.databinding.ActivitySettingsBinding;
import com.kabouzeid.appthemehelper.ThemeStore;
-import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEColorPreference;
-import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.dkanada.gramophone.R;
import com.dkanada.gramophone.views.shortcuts.DynamicShortcutManager;
import com.dkanada.gramophone.dialogs.preferences.CategoryPreferenceDialog;
@@ -25,7 +21,7 @@ import com.dkanada.gramophone.dialogs.preferences.NowPlayingPreferenceDialog;
import com.dkanada.gramophone.activities.base.AbsBaseActivity;
import com.dkanada.gramophone.util.PreferenceUtil;
-public class SettingsActivity extends AbsBaseActivity implements ColorChooserDialog.ColorCallback {
+public class SettingsActivity extends AbsBaseActivity {
private ActivitySettingsBinding binding;
@Override
@@ -53,30 +49,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
}
}
- @Override
- public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) {
- switch (dialog.getTitle()) {
- case R.string.pref_title_primary_color:
- ThemeStore.editTheme(this).primaryColor(selectedColor).commit();
- PreferenceUtil.getInstance(this).setPrimaryColor(selectedColor);
- break;
- case R.string.pref_title_accent_color:
- ThemeStore.editTheme(this).accentColor(selectedColor).commit();
- PreferenceUtil.getInstance(this).setAccentColor(selectedColor);
- break;
- }
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- new DynamicShortcutManager(this).updateDynamicShortcuts();
- }
-
- recreate();
- }
-
- @Override
- public void onColorChooserDismissed(@NonNull ColorChooserDialog dialog) {
- }
-
public static class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
@@ -106,38 +78,12 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
@SuppressWarnings("ConstantConditions")
private void invalidateSettings() {
- final ATEColorPreference primaryColorPref = findPreference(PreferenceUtil.PRIMARY_COLOR);
- final ATEColorPreference accentColorPref = findPreference(PreferenceUtil.ACCENT_COLOR);
final TwoStatePreference classicNotification = findPreference(PreferenceUtil.CLASSIC_NOTIFICATION);
final TwoStatePreference coloredNotification = findPreference(PreferenceUtil.COLORED_NOTIFICATION);
final TwoStatePreference colorAppShortcuts = findPreference(PreferenceUtil.COLORED_SHORTCUTS);
final Preference categoryPreference = findPreference(PreferenceUtil.CATEGORIES);
final Preference nowPlayingPreference = findPreference(PreferenceUtil.NOW_PLAYING_SCREEN);
- final int primaryColor = ThemeStore.primaryColor(requireActivity());
- primaryColorPref.setColor(primaryColor, ColorUtil.darkenColor(primaryColor));
- primaryColorPref.setOnPreferenceClickListener(preference -> {
- new ColorChooserDialog.Builder(requireActivity(), R.string.pref_title_primary_color)
- .accentMode(false)
- .allowUserColorInput(true)
- .allowUserColorInputAlpha(false)
- .preselect(primaryColor)
- .show(requireActivity());
- return true;
- });
-
- final int accentColor = ThemeStore.accentColor(requireActivity());
- accentColorPref.setColor(accentColor, ColorUtil.darkenColor(accentColor));
- accentColorPref.setOnPreferenceClickListener(preference -> {
- new ColorChooserDialog.Builder(requireActivity(), R.string.pref_title_accent_color)
- .accentMode(true)
- .allowUserColorInput(true)
- .allowUserColorInputAlpha(false)
- .preselect(accentColor)
- .show(requireActivity());
- return true;
- });
-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
classicNotification.setEnabled(false);
}
diff --git a/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java
index 05982f98..43018eb4 100644
--- a/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java
+++ b/app/src/main/java/com/dkanada/gramophone/util/PreferenceUtil.java
@@ -178,12 +178,12 @@ public final class PreferenceUtil {
return Theme.valueOf(mPreferences.getString(GENERAL_THEME, Theme.DARK.toString()));
}
- public void setPrimaryColor(int color) {
- mPreferences.edit().putInt(PRIMARY_COLOR, color).apply();
+ public int getPrimaryColor() {
+ return mPreferences.getInt(PRIMARY_COLOR, mContext.getResources().getColor(R.color.color_primary));
}
- public void setAccentColor(int color) {
- mPreferences.edit().putInt(ACCENT_COLOR, color).apply();
+ public int getAccentColor() {
+ return mPreferences.getInt(ACCENT_COLOR, mContext.getResources().getColor(R.color.color_accent));
}
public final int getPageSize() {
diff --git a/app/src/main/java/com/dkanada/gramophone/views/ColorCircleDrawable.java b/app/src/main/java/com/dkanada/gramophone/views/ColorCircleDrawable.java
new file mode 100644
index 00000000..00705c21
--- /dev/null
+++ b/app/src/main/java/com/dkanada/gramophone/views/ColorCircleDrawable.java
@@ -0,0 +1,45 @@
+package com.dkanada.gramophone.views;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+public class ColorCircleDrawable extends View {
+ Paint circle = new Paint();
+ Paint border = new Paint();
+
+ public ColorCircleDrawable(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+
+ TypedArray attributes = getContext().obtainStyledAttributes(new int[]{android.R.attr.divider});
+ int colorCircle = getContext().getResources().getColor(android.R.color.black);
+ int colorBorder = getContext().getResources().getColor(android.R.color.darker_gray);
+
+ circle.setAntiAlias(true);
+ circle.setColor(colorCircle);
+
+ border.setAntiAlias(true);
+ border.setColor(attributes.getColor(0, colorBorder));
+
+ attributes.recycle();
+ }
+
+ public void setColor(int color) {
+ circle.setColor(color);
+ }
+
+ @Override
+ @SuppressLint("CanvasSize")
+ protected void onDraw(Canvas canvas) {
+ int size = canvas.getHeight() / 2;
+
+ canvas.drawCircle(size, size, size, border);
+ canvas.drawCircle(size, size, size - 4f, circle);
+ }
+}
diff --git a/app/src/main/java/com/dkanada/gramophone/views/settings/ColorPreference.java b/app/src/main/java/com/dkanada/gramophone/views/settings/ColorPreference.java
new file mode 100644
index 00000000..8567a221
--- /dev/null
+++ b/app/src/main/java/com/dkanada/gramophone/views/settings/ColorPreference.java
@@ -0,0 +1,78 @@
+package com.dkanada.gramophone.views.settings;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.dkanada.gramophone.R;
+import com.dkanada.gramophone.util.PreferenceUtil;
+import com.dkanada.gramophone.views.ColorCircleDrawable;
+import com.flask.colorpicker.ColorPickerView;
+import com.flask.colorpicker.builder.ColorPickerClickListener;
+import com.flask.colorpicker.builder.ColorPickerDialogBuilder;
+import com.kabouzeid.appthemehelper.ThemeStore;
+
+public class ColorPreference extends Preference implements View.OnClickListener, ColorPickerClickListener {
+ private SharedPreferences preferences;
+ private ColorCircleDrawable colorView;
+
+ private int defaultValue;
+
+ public ColorPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ setWidgetLayoutResource(R.layout.preference_color);
+ }
+
+ @Override
+ protected Object onGetDefaultValue(TypedArray a, int index) {
+ defaultValue = a.getInt(index, getContext().getResources().getColor(android.R.color.white));
+
+ return super.onGetDefaultValue(a, index);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+
+ preferences = PreferenceUtil.getInstance(getContext()).getPreferences();
+ colorView = holder.itemView.findViewById(R.id.color);
+
+ holder.itemView.setOnClickListener(this);
+ colorView.setColor(preferences.getInt(getKey(), defaultValue));
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int color, Integer[] allColors) {
+ preferences.edit().putInt(getKey(), color).apply();
+ colorView.setColor(color);
+
+ // TODO remove this when the theme helper library is removed
+ if (getKey().equals(PreferenceUtil.PRIMARY_COLOR)) {
+ ThemeStore.editTheme(getContext()).primaryColor(color).commit();
+ } else if (getKey().equals(PreferenceUtil.ACCENT_COLOR)) {
+ ThemeStore.editTheme(getContext()).accentColor(color).commit();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ ColorPickerDialogBuilder
+ .with(getContext())
+ .setTitle(getTitle().toString())
+ .initialColor(preferences.getInt(getKey(), defaultValue))
+ .wheelType(ColorPickerView.WHEEL_TYPE.FLOWER)
+ .showColorEdit(true)
+ .showAlphaSlider(false)
+ .density(8)
+ .setPositiveButton(android.R.string.ok, this)
+ .build()
+ .show();
+ }
+}
diff --git a/app/src/main/res/layout/preference_color.xml b/app/src/main/res/layout/preference_color.xml
new file mode 100644
index 00000000..c186f648
--- /dev/null
+++ b/app/src/main/res/layout/preference_color.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/app/src/main/res/xml/pref_interface.xml b/app/src/main/res/xml/pref_interface.xml
index 76ae0dd2..8ffceaaf 100644
--- a/app/src/main/res/xml/pref_interface.xml
+++ b/app/src/main/res/xml/pref_interface.xml
@@ -13,21 +13,21 @@
android:positiveButtonText="@null"
android:title="@string/pref_title_theme" />
-
-
-
-
-
-
-
-
-
-
-