content: /*
   * Copyright (C) 2015 AChep@xda <artemchep@gmail.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   * MA  02110-1301, USA.
   */
  package com.achep.acdisplay.ui.preferences;
  
  import android.content.Context;
  import android.graphics.Color;
  import androidx.annotation.NonNull;
  import android.util.AttributeSet;
  import android.view.ViewGroup;
  import android.widget.RadioButton;
  import android.widget.RadioGroup;
  
  import com.achep.acdisplay.Config;
  import com.achep.acdisplay.R;
  import com.achep.base.content.ConfigBase;
  import com.achep.base.ui.preferences.MaterialDialogPreference;
  import com.achep.base.utils.ViewUtils;
  import com.afollestad.materialdialogs.MaterialDialog;
  import com.larswerkman.holocolorpicker.ColorPicker;
  import com.larswerkman.holocolorpicker.SaturationBar;
  import com.larswerkman.holocolorpicker.ValueBar;
  
  /**
   * Preference to configure the size of collapsed views.
   *
   * @author Artem Chepurnoy
   */
  public class ColorPickerPreference extends MaterialDialogPreference {
  
      /**
       * @return the original color if {@link #isRandomEnabled(int)} is {@code false},
       * random one otherwise.
       */
      public static int getColor(int color) {
          if (isRandomEnabled(color)) {
              int i = (int) (Math.random() * RANDOM_COLORS.length);
              return RANDOM_COLORS[i];
          }
          return color;
      }
  
      /**
       * @return {@code true} if you should generate random colors instead
       * of this one, {@code false} otherwise.
       * @see #getColor(int)
       */
      public static boolean isRandomEnabled(int color) {
          return Color.alpha(color) == RANDOM_COLOR_ALPHA_MASK;
      }
  
      /**
       * A constant of alpha color that defines the 'random color' option.
       */
      private static final int RANDOM_COLOR_ALPHA_MASK = 0xFE;
  
      /**
       * Main color from the material palette, to be in the
       * random colors list.
       */
      private static final int[] RANDOM_COLORS = {
              0xFFF44336, // Red
              0xFFE91E63, // Pink
              0xFF9C27B0, // Purple
              0xFF673AB7, // Deep purple
              0xFF3F51B5, // Indigo
              0xFF2196F3, // Blue
              0xFF03A9F4, // Light blue
              0xFF00BCD4, // Cyan
              0xFF009688, // Teal
              0xFF4CAF50, // Green
              0xFF8BC34A, // Light green
              0xFFCDDC39, // Lime
              0xFFFFEB3B, // Yellow
              0xFFFFC107, // Amber
              0xFFFF9800, // Orange
              0xFFFF5722, // Deep orange
              0xFF607D8B, // Blue grey
      };
  
      private static final String TAG = "ColorPickerPreference";
  
      private final ConfigBase.Option mOption;
      private final Config mConfig;
  
      private ViewGroup mColorPanel;
      private ColorPicker mColorPicker;
  
      private RadioButton mRadioCustomColor;
      private RadioButton mRadioRandomColor;
  
      public ColorPickerPreference(Context context, AttributeSet attrs) {
          super(context, attrs);
          mConfig = Config.getInstance();
          mOption = mConfig.getOption(getKey());
      }
  
      @NonNull
      @Override
      public MaterialDialog onBuildDialog(@NonNull MaterialDialog.Builder builder) {
          MaterialDialog md = builder
                  .customView(R.layout.dialog_preference_colorpicker, true)
                  .build();
  
          int color = (int) mOption.read(mConfig);
          boolean randomColor = Color.alpha(color) == RANDOM_COLOR_ALPHA_MASK;
          if (randomColor) color |= Color.argb(255, 0, 0, 0);
  
          RadioGroup rg = (RadioGroup) md.getCustomView().findViewById(R.id.radios);
          mColorPanel = (ViewGroup) rg.findViewById(R.id.custom_color_panel);
          mColorPicker = (ColorPicker) mColorPanel.findViewById(R.id.picker);
          mColorPicker.addSaturationBar((SaturationBar) mColorPanel.findViewById(R.id.saturationbar));
          mColorPicker.addValueBar((ValueBar) mColorPanel.findViewById(R.id.valuebar));
          mColorPicker.setColor(color);
          mColorPicker.setOldCenterColor(color);
  
          // Setup radio things
          mRadioCustomColor = (RadioButton) rg.findViewById(R.id.custom_color);
          mRadioRandomColor = (RadioButton) rg.findViewById(R.id.random_color);
          rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
              @Override
              public void onCheckedChanged(RadioGroup group, int checkedId) {
                  ViewUtils.setVisible(mColorPanel, mRadioCustomColor.isChecked());
              }
          });
          rg.check(randomColor
                  ? mRadioRandomColor.getId()
                  : mRadioCustomColor.getId());
          return md;
      }
  
      @Override
      protected void onDialogClosed(boolean positiveResult) {
          super.onDialogClosed(positiveResult);
  
          if (!positiveResult) {
              return;
          }
  
          // Save changes to config.
          boolean randomColor = mRadioRandomColor.isChecked();
          int color = mColorPicker.getColor();
          if (randomColor) color &= Color.argb(RANDOM_COLOR_ALPHA_MASK, 255, 255, 255);
          mOption.write(mConfig, getContext(), color, null);
      }
  
  }