package com.adafruit.bluefruit.le.connect.app; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import com.adafruit.bluefruit.le.connect.R; import com.adafruit.bluefruit.le.connect.app.neopixel.NeopixelColorPickerFragment; import com.larswerkman.holocolorpicker.ColorPicker; import com.larswerkman.holocolorpicker.SaturationBar; import com.larswerkman.holocolorpicker.ValueBar; public class ControllerColorPickerFragment extends Fragment implements ColorPicker.OnColorChangedListener { // Log @SuppressWarnings("unused") private final static String TAG = ControllerColorPickerFragment.class.getSimpleName(); // Constants private final static boolean kPersistValues = true; private final static String kPreferences = "ColorPickerActivity_prefs"; private final static String kPreferences_color = "color"; private final static int kFirstTimeColor = 0x0000ff; // UI private ColorPicker mColorPicker; private View mRgbColorView; private TextView mRgbTextView; // Data private int mSelectedColor; private ControllerColorPickerFragmentListener mListener; // region Lifecycle @SuppressWarnings("UnnecessaryLocalVariable") public static ControllerColorPickerFragment newInstance() { ControllerColorPickerFragment fragment = new ControllerColorPickerFragment(); return fragment; } public ControllerColorPickerFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppCompatActivity activity = (AppCompatActivity) getActivity(); if (activity != null) { ActionBar actionBar = activity.getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(R.string.colorpicker_title); actionBar.setDisplayHomeAsUpEnabled(true); } } } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_controller_colorpicker, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // UI mRgbColorView = view.findViewById(R.id.rgbColorView); mRgbTextView = view.findViewById(R.id.rgbTextView); Button sendButton = view.findViewById(R.id.sendButton); sendButton.setOnClickListener(view1 -> { // Set the old color mColorPicker.setOldCenterColor(mSelectedColor); mListener.onSendColorComponents(mSelectedColor); }); SaturationBar mSaturationBar = view.findViewById(R.id.brightnessbar); ValueBar mValueBar = view.findViewById(R.id.valuebar); mColorPicker = view.findViewById(R.id.colorPicker); if (mColorPicker != null) { mColorPicker.addSaturationBar(mSaturationBar); mColorPicker.addValueBar(mValueBar); mColorPicker.setOnColorChangedListener(this); } final Context context = getContext(); if (context != null && kPersistValues) { SharedPreferences preferences = context.getSharedPreferences(kPreferences, Context.MODE_PRIVATE); mSelectedColor = preferences.getInt(kPreferences_color, kFirstTimeColor); } else { mSelectedColor = kFirstTimeColor; } mColorPicker.setOldCenterColor(mSelectedColor); mColorPicker.setColor(mSelectedColor); onColorChanged(mSelectedColor); } @Override public void onStop() { final Context context = getContext(); // Preserve values if (context != null && kPersistValues) { SharedPreferences settings = context.getSharedPreferences(kPreferences, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putInt(kPreferences_color, mSelectedColor); editor.apply(); } super.onStop(); } @Override public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof NeopixelColorPickerFragment.NeopixelColorPickerFragmentListener) { mListener = (ControllerColorPickerFragmentListener) context; } else if (getTargetFragment() instanceof ControllerColorPickerFragmentListener) { mListener = (ControllerColorPickerFragmentListener) getTargetFragment(); } else { throw new RuntimeException(context.toString() + " must implement NeopixelColorPickerFragmentListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_help, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { FragmentActivity activity = getActivity(); switch (item.getItemId()) { case R.id.action_help: if (activity != null) { FragmentManager fragmentManager = activity.getSupportFragmentManager(); CommonHelpFragment helpFragment = CommonHelpFragment.newInstance(getString(R.string.colorpicker_help_title), getString(R.string.colorpicker_help_text)); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction() .replace(R.id.contentLayout, helpFragment, "Help"); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } return true; default: return super.onOptionsItemSelected(item); } } // endregion // region OnColorChangedListener @SuppressWarnings("PointlessBitwiseExpression") @Override public void onColorChanged(int color) { // Save selected color mSelectedColor = color; // Update UI mRgbColorView.setBackgroundColor(color); final int r = (color >> 16) & 0xFF; final int g = (color >> 8) & 0xFF; final int b = (color >> 0) & 0xFF; final String text = String.format(getString(R.string.colorpicker_rgb_format), r, g, b); mRgbTextView.setText(text); } // endregion // region interface ControllerColorPickerFragmentListener { void onSendColorComponents(int color); } // endregion }