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" /> - - - - - - - - - - -