aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Ning <chineseperson5@gmail.com>2020-03-20 09:03:49 +0000
committerAlex Ning <chineseperson5@gmail.com>2020-03-20 09:03:49 +0000
commit587dfccd32fadcf402f128da08bd9859b1dac06e (patch)
treecec59b4aa2b5b288e5249176d6ef1da82da3e9e9
parent9e4dec362dc575e44be99e650cb4c4b1e031644c (diff)
downloadinfinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.tar
infinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.tar.gz
infinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.tar.bz2
infinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.tar.lz
infinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.tar.xz
infinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.tar.zst
infinity-for-reddit-587dfccd32fadcf402f128da08bd9859b1dac06e.zip
Add a color picker.
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CustomizeThemeActivity.java15
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CustomizeThemeRecyclerViewAdapter.java11
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/ColorPickerDialog.java151
-rw-r--r--app/src/main/res/layout/color_picker.xml156
-rw-r--r--app/src/main/res/values/strings.xml3
5 files changed, 333 insertions, 3 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CustomizeThemeActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CustomizeThemeActivity.java
index b6e45b8a..e345cc8f 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CustomizeThemeActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CustomizeThemeActivity.java
@@ -3,7 +3,9 @@ package ml.docilealligator.infinityforreddit.Activity;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
+import android.view.MenuItem;
+import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModelProvider;
@@ -69,7 +71,7 @@ public class CustomizeThemeActivity extends BaseActivity {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- adapter = new CustomizeThemeRecyclerViewAdapter();
+ adapter = new CustomizeThemeRecyclerViewAdapter(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
@@ -135,6 +137,17 @@ public class CustomizeThemeActivity extends BaseActivity {
}
@Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
protected SharedPreferences getSharedPreferences() {
return sharedPreferences;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CustomizeThemeRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CustomizeThemeRecyclerViewAdapter.java
index 398042de..69fa7ee5 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CustomizeThemeRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CustomizeThemeRecyclerViewAdapter.java
@@ -8,6 +8,7 @@ import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
@@ -15,14 +16,17 @@ import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeSettingsItem;
+import ml.docilealligator.infinityforreddit.CustomView.ColorPickerDialog;
import ml.docilealligator.infinityforreddit.R;
public class CustomizeThemeRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIEW_TYPE_COLOR = 1;
private static final int VIEW_TYPE_SWITCH = 2;
+ private AppCompatActivity activity;
private ArrayList<CustomThemeSettingsItem> customThemeSettingsItems;
- public CustomizeThemeRecyclerViewAdapter() {
+ public CustomizeThemeRecyclerViewAdapter(AppCompatActivity activity) {
+ this.activity = activity;
customThemeSettingsItems = new ArrayList<>();
}
@@ -53,7 +57,10 @@ public class CustomizeThemeRecyclerViewAdapter extends RecyclerView.Adapter<Recy
((ThemeColorItemViewHolder) holder).themeItemInfoTextView.setText(customThemeSettingsItem.itemDetails);
((ThemeColorItemViewHolder) holder).colorImageView.setBackgroundTintList(ColorStateList.valueOf(customThemeSettingsItem.colorValue));
holder.itemView.setOnClickListener(view -> {
-
+ new ColorPickerDialog(activity, customThemeSettingsItem.colorValue, color -> {
+ customThemeSettingsItem.colorValue = color;
+ ((ThemeColorItemViewHolder) holder).colorImageView.setBackgroundTintList(ColorStateList.valueOf(color));
+ }).show();
});
} else if (holder instanceof ThemeSwitchItemViewHolder) {
CustomThemeSettingsItem customThemeSettingsItem = customThemeSettingsItems.get(position);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/ColorPickerDialog.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/ColorPickerDialog.java
new file mode 100644
index 00000000..a60a38da
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/ColorPickerDialog.java
@@ -0,0 +1,151 @@
+package ml.docilealligator.infinityforreddit.CustomView;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.SeekBar;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AlertDialog;
+
+import ml.docilealligator.infinityforreddit.R;
+
+public class ColorPickerDialog extends AlertDialog {
+ private View colorView;
+ private EditText colorValueEditText;
+ private SeekBar seekBarA;
+ private SeekBar seekBarR;
+ private SeekBar seekBarG;
+ private SeekBar seekBarB;
+ private Button cancelButton;
+ private Button okButton;
+ private int colorValue;
+ private boolean changeColorValueEditText = true;
+ private ColorPickerListener colorPickerListener;
+
+ public interface ColorPickerListener {
+ void onColorPicked(int color);
+ }
+
+ public ColorPickerDialog(Context context, int color, ColorPickerListener colorPickerListener) {
+ super(context);
+
+ View rootView = getLayoutInflater().inflate(R.layout.color_picker, null);
+ colorView = rootView.findViewById(R.id.color_view_color_picker);
+ colorValueEditText = rootView.findViewById(R.id.color_edit_text_color_picker);
+ seekBarA = rootView.findViewById(R.id.a_seek_bar_color_picker);
+ seekBarR = rootView.findViewById(R.id.r_seek_bar_color_picker);
+ seekBarG = rootView.findViewById(R.id.g_seek_bar_color_picker);
+ seekBarB = rootView.findViewById(R.id.b_seek_bar_color_picker);
+ cancelButton = rootView.findViewById(R.id.cancel_button_color_picker);
+ okButton = rootView.findViewById(R.id.ok_button_color_picker);
+
+ colorView.setBackgroundColor(color);
+ colorValueEditText.setText(Integer.toHexString(color).toUpperCase());
+ colorValueEditText.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable editable) {
+ String s = editable.toString();
+ if (s.length() == 6) {
+ try {
+ changeColorValueEditText = false;
+ colorValue = Color.parseColor("#" + s);
+ seekBarA.setProgress(255);
+ seekBarR.setProgress(Integer.parseInt(s.substring(0, 2), 16));
+ seekBarG.setProgress(Integer.parseInt(s.substring(2, 4), 16));
+ seekBarB.setProgress(Integer.parseInt(s.substring(4, 6), 16));
+ changeColorValueEditText = true;
+ } catch (IllegalArgumentException ignored) {
+
+ }
+ } else if (s.length() == 8) {
+ try {
+ changeColorValueEditText = false;
+ colorValue = Color.parseColor("#" + s);
+ seekBarA.setProgress(Integer.parseInt(s.substring(0, 2), 16));
+ seekBarR.setProgress(Integer.parseInt(s.substring(2, 4), 16));
+ seekBarG.setProgress(Integer.parseInt(s.substring(4, 6), 16));
+ seekBarB.setProgress(Integer.parseInt(s.substring(6, 8), 16));
+ changeColorValueEditText = true;
+ } catch (IllegalArgumentException ignored) {
+
+ }
+ }
+ }
+ });
+
+ String colorHex = Integer.toHexString(color);
+ if (colorHex.length() == 8) {
+ colorValue = Color.parseColor("#" + colorHex);
+ seekBarA.setProgress(Integer.parseInt(colorHex.substring(0, 2), 16));
+ seekBarR.setProgress(Integer.parseInt(colorHex.substring(2, 4), 16));
+ seekBarG.setProgress(Integer.parseInt(colorHex.substring(4, 6), 16));
+ seekBarB.setProgress(Integer.parseInt(colorHex.substring(6, 8), 16));
+ } else if (colorHex.length() == 6) {
+ colorValue = Color.parseColor("#" + colorHex);
+ seekBarA.setProgress(255);
+ seekBarR.setProgress(Integer.parseInt(colorHex.substring(0, 2), 16));
+ seekBarG.setProgress(Integer.parseInt(colorHex.substring(2, 4), 16));
+ seekBarB.setProgress(Integer.parseInt(colorHex.substring(4, 6), 16));
+ }
+ setOnSeekBarChangeListener(seekBarA);
+ setOnSeekBarChangeListener(seekBarR);
+ setOnSeekBarChangeListener(seekBarG);
+ setOnSeekBarChangeListener(seekBarB);
+
+ cancelButton.setOnClickListener(view -> dismiss());
+ okButton.setOnClickListener(view -> {
+ try {
+ colorValue = Color.parseColor("#" + colorValueEditText.getText().toString());
+ colorPickerListener.onColorPicked(colorValue);
+ dismiss();
+ } catch (IllegalArgumentException e) {
+ Toast.makeText(context, R.string.invalid_color, Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ setView(rootView);
+ }
+
+ private void setOnSeekBarChangeListener(SeekBar seekBar) {
+ seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
+ if (changeColorValueEditText) {
+ int aValue = seekBarA.getProgress();
+ int rValue = seekBarR.getProgress();
+ int gValue = seekBarG.getProgress();
+ int bValue = seekBarB.getProgress();
+ String colorHex = String.format("%02x%02x%02x%02x", aValue, rValue, gValue, bValue).toUpperCase();
+ colorValue = Color.parseColor("#" + colorHex);
+ colorView.setBackgroundColor(colorValue);
+ colorValueEditText.setText(colorHex);
+ }
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+
+ }
+ });
+ }
+}
diff --git a/app/src/main/res/layout/color_picker.xml b/app/src/main/res/layout/color_picker.xml
new file mode 100644
index 00000000..3e8b25cd
--- /dev/null
+++ b/app/src/main/res/layout/color_picker.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="12dp"
+ android:paddingBottom="12dp"
+ android:paddingStart="24dp"
+ android:paddingEnd="24dp"
+ android:text="@string/color_picker"
+ style="@style/MaterialAlertDialogTitleTextStyle" />
+
+ <View
+ android:id="@+id/color_view_color_picker"
+ android:layout_width="match_parent"
+ android:layout_height="200dp" />
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="#"
+ android:textColor="?attr/primaryTextColor"/>
+
+ <EditText
+ android:id="@+id/color_edit_text_color_picker"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:maxLength="8"
+ android:inputType="textCapCharacters|textNoSuggestions"
+ android:textColor="?attr/primaryTextColor" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="16dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="32dp"
+ android:paddingEnd="32dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="A"
+ android:textColor="?attr/primaryTextColor" />
+
+ <SeekBar
+ android:id="@+id/a_seek_bar_color_picker"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:max="255" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="32dp"
+ android:paddingEnd="32dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="R"
+ android:textColor="?attr/primaryTextColor" />
+
+ <SeekBar
+ android:id="@+id/r_seek_bar_color_picker"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:max="255" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="32dp"
+ android:paddingEnd="32dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="G"
+ android:textColor="?attr/primaryTextColor" />
+
+ <SeekBar
+ android:id="@+id/g_seek_bar_color_picker"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:max="255" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingBottom="32dp"
+ android:paddingStart="32dp"
+ android:paddingEnd="32dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="B"
+ android:textColor="?attr/primaryTextColor" />
+
+ <SeekBar
+ android:id="@+id/b_seek_bar_color_picker"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:max="255" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_gravity="end"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="4dp"
+ android:paddingStart="12dp"
+ android:paddingEnd="12dp">
+
+ <Button
+ android:id="@+id/cancel_button_color_picker"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/cancel"
+ style="@style/MaterialAlertDialogNegativeButtonStyle" />
+
+ <Button
+ android:id="@+id/ok_button_color_picker"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ok"
+ style="@style/MaterialAlertDialogPositiveButtonStyle" />
+
+ </LinearLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c32eac17..fc88749c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -602,4 +602,7 @@
<string name="theme_name_indigo_dark">Indigo Dark</string>
<string name="theme_name_indigo_amoled">Indigo Amoled</string>
+ <string name="color_picker">Color Picker</string>
+ <string name="invalid_color">Invalid Color</string>
+
</resources>