blob: af95cf9354bb8ba2add7f0b034b04944777fccae [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.android.systemui.tuner;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.SeekBar;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NightModeController;
public class ColorAndAppearanceFragment extends PreferenceFragment {
private static final String KEY_CALIBRATE = "calibrate";
private static final long RESET_DELAY = 10000;
private static final CharSequence KEY_NIGHT_MODE = "night_mode";
private NightModeController mNightModeController;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNightModeController = new NightModeController(getContext());
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.color_and_appearance);
}
@Override
public void onResume() {
super.onResume();
MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_COLOR_AND_APPEARANCE, true);
// TODO: Figure out better title model for Tuner, to avoid any more of this.
getActivity().setTitle(R.string.color_and_appearance);
Preference nightMode = findPreference(KEY_NIGHT_MODE);
nightMode.setSummary(mNightModeController.isEnabled()
? R.string.night_mode_on : R.string.night_mode_off);
}
@Override
public void onPause() {
super.onPause();
MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_COLOR_AND_APPEARANCE, false);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof CalibratePreference) {
CalibrateDialog.show(this);
} else {
super.onDisplayPreferenceDialog(preference);
}
}
private void startRevertTimer() {
getView().postDelayed(mResetColorMatrix, RESET_DELAY);
}
private void onApply() {
MetricsLogger.action(getContext(), MetricsEvent.ACTION_TUNER_CALIBRATE_DISPLAY_CHANGED);
mNightModeController.setCustomValues(Settings.Secure.getString(
getContext().getContentResolver(), Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX));
getView().removeCallbacks(mResetColorMatrix);
}
private void onRevert() {
getView().removeCallbacks(mResetColorMatrix);
mResetColorMatrix.run();
}
private final Runnable mResetColorMatrix = new Runnable() {
@Override
public void run() {
((DialogFragment) getFragmentManager().findFragmentByTag("RevertWarning")).dismiss();
Settings.Secure.putString(getContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX, null);
}
};
public static class CalibrateDialog extends DialogFragment implements
DialogInterface.OnClickListener {
private float[] mValues;
private NightModeController mNightModeController;
public static void show(ColorAndAppearanceFragment fragment) {
CalibrateDialog dialog = new CalibrateDialog();
dialog.setTargetFragment(fragment, 0);
dialog.show(fragment.getFragmentManager(), "Calibrate");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNightModeController = new NightModeController(getContext());
String customValues = mNightModeController.getCustomValues();
if (customValues == null) {
// Generate this as a string because its the easiest way to generate a copy of the
// identity.
customValues = NightModeController.toString(NightModeController.IDENTITY_MATRIX);
}
mValues = NightModeController.toValues(customValues);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = LayoutInflater.from(getContext()).inflate(R.layout.calibrate_sliders, null);
bindView(v.findViewById(R.id.r_group), 0);
bindView(v.findViewById(R.id.g_group), 5);
bindView(v.findViewById(R.id.b_group), 10);
MetricsLogger.visible(getContext(), MetricsEvent.TUNER_CALIBRATE_DISPLAY);
return new AlertDialog.Builder(getContext())
.setTitle(R.string.calibrate_display)
.setView(v)
.setPositiveButton(R.string.color_apply, this)
.setNegativeButton(android.R.string.cancel, null)
.create();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
MetricsLogger.hidden(getContext(), MetricsEvent.TUNER_CALIBRATE_DISPLAY);
}
private void bindView(View view, final int index) {
SeekBar seekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
seekBar.setMax(1000);
seekBar.setProgress((int) (1000 * mValues[index]));
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mValues[index] = progress / 1000f;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (mValues[0] == 1 && mValues[5] == 1 && mValues[10] == 1) {
// Allow removal of matrix by all values set to highest.
mNightModeController.setCustomValues(null);
return;
}
((ColorAndAppearanceFragment) getTargetFragment()).startRevertTimer();
Settings.Secure.putString(getContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX,
NightModeController.toString(mValues));
RevertWarning.show((ColorAndAppearanceFragment) getTargetFragment());
}
}
public static class RevertWarning extends DialogFragment
implements DialogInterface.OnClickListener {
public static void show(ColorAndAppearanceFragment fragment) {
RevertWarning warning = new RevertWarning();
warning.setTargetFragment(fragment, 0);
warning.show(fragment.getFragmentManager(), "RevertWarning");
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(R.string.color_revert_title)
.setMessage(R.string.color_revert_message)
.setPositiveButton(R.string.ok, this)
.create();
alertDialog.setCanceledOnTouchOutside(true);
return alertDialog;
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
((ColorAndAppearanceFragment) getTargetFragment()).onRevert();
}
@Override
public void onClick(DialogInterface dialog, int which) {
((ColorAndAppearanceFragment) getTargetFragment()).onApply();
}
}
}