diff options
author | Alex Ning <chineseperson5@gmail.com> | 2020-03-20 09:03:49 +0000 |
---|---|---|
committer | Alex Ning <chineseperson5@gmail.com> | 2020-03-20 09:03:49 +0000 |
commit | 587dfccd32fadcf402f128da08bd9859b1dac06e (patch) | |
tree | cec59b4aa2b5b288e5249176d6ef1da82da3e9e9 | |
parent | 9e4dec362dc575e44be99e650cb4c4b1e031644c (diff) | |
download | infinity-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.
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> |