Add color transform setting

Bug: 24038268
Change-Id: I2bf45fef85038c29423a86c7bb018a8e750110a6
This commit is contained in:
Jason Monk
2015-09-18 16:16:52 -04:00
parent 43be4b9b78
commit 0217281d33
7 changed files with 255 additions and 2 deletions

View File

@@ -19,7 +19,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingBottom="4dp"
android:orientation="vertical">
<include

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="4dp"
android:orientation="vertical" />

View File

@@ -39,7 +39,7 @@
<TextView android:id="@android:id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="4dp"
android:paddingBottom="8dp"
android:paddingStart="52dp"
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorSecondary"

View File

@@ -5953,6 +5953,7 @@
<string name="keywords_app_permissions">apps permissions security</string>
<string name="keywords_default_apps">apps default</string>
<string name="keywords_ignore_optimizations">ignore optimizations doze app standby</string>
<string name="keywords_color_mode">vibrant rgb srgb color natural standard</string>
<!-- Search keywords for different screen unlock modes : slide to unlock, password, pattern and PIN [CHAR LIMIT=none] -->
<string name="keywords_lockscreen">slide password pattern pin</string>
@@ -7006,4 +7007,21 @@
<!-- Description of setting that controls gesture to open camera by double tapping the power button [CHAR LIMIT=NONE] -->
<string name="camera_double_tap_power_gesture_desc">Quickly open camera without unlocking your screen</string>
<!-- Name of each color mode for the display. [CHAR LIMIT=40] -->
<string-array name="color_mode_names">
<item>Vibrant (default)</item>
<item>Natural</item>
<item>Standard</item>
</string-array>
<!-- Description of each color mode for the display. [CHAR LIMIT=NONE] -->
<string-array name="color_mode_descriptions">
<item>Enhanced colors</item>
<item>Natural colors as seen by the eye</item>
<item>Colors optimized for digital content</item>
</string-array>
<!-- Name of feature to change color setting for the display [CHAR LIMIT=60] -->
<string name="picture_color_mode">Picture color mode</string>
</resources>

View File

@@ -104,6 +104,12 @@
android:key="auto_rotate"
android:title="@string/display_auto_rotate_title" />
<com.android.settings.ColorModePreference
android:key="color_mode"
android:title="@string/picture_color_mode"
android:persistent="false"
settings:keywords="@string/keywords_color_mode" />
<PreferenceScreen
android:key="wifi_display"
android:title="@string/wifi_display_settings_title"

View File

@@ -0,0 +1,177 @@
/*
* Copyright (C) 2015 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.settings;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.res.Resources;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.os.Handler;
import android.os.Looper;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.Display;
import android.view.Display.ColorTransform;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Checkable;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class ColorModePreference extends DialogPreference implements
OnClickListener, DisplayListener {
private DisplayManager mDisplayManager;
private Display mDisplay;
private int mCurrentIndex;
private ArrayList<ColorTransformDescription> mDescriptions;
public ColorModePreference(Context context, AttributeSet attrs) {
super(context, attrs);
mDisplayManager = getContext().getSystemService(DisplayManager.class);
}
public int getTransformsCount() {
return mDescriptions.size();
}
public void startListening() {
mDisplayManager.registerDisplayListener(this, new Handler(Looper.getMainLooper()));
}
public void stopListening() {
mDisplayManager.unregisterDisplayListener(this);
}
@Override
public void onDisplayAdded(int displayId) {
if (displayId == Display.DEFAULT_DISPLAY) {
updateCurrentAndSupported();
}
}
@Override
public void onDisplayChanged(int displayId) {
if (displayId == Display.DEFAULT_DISPLAY) {
updateCurrentAndSupported();
}
}
@Override
public void onDisplayRemoved(int displayId) {
}
public void updateCurrentAndSupported() {
mDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
mDescriptions = new ArrayList<>();
Resources resources = getContext().getResources();
int[] transforms = resources.getIntArray(
com.android.internal.R.array.config_colorTransforms);
String[] titles = resources.getStringArray(R.array.color_mode_names);
String[] descriptions = resources.getStringArray(R.array.color_mode_descriptions);
// Map the resource information describing color transforms.
for (int i = 0; i < transforms.length; i++) {
if (transforms[i] != -1) {
ColorTransformDescription desc = new ColorTransformDescription();
desc.colorTransform = transforms[i];
desc.title = titles[i];
desc.summary = descriptions[i];
mDescriptions.add(desc);
}
}
// Match up a ColorTransform to every description.
ColorTransform[] supportedColorTransforms = mDisplay.getSupportedColorTransforms();
for (int i = 0; i < supportedColorTransforms.length; i++) {
for (int j = 0; j < mDescriptions.size(); j++) {
if (mDescriptions.get(j).colorTransform
== supportedColorTransforms[i].getColorTransform()
&& mDescriptions.get(j).transform == null) {
mDescriptions.get(j).transform = supportedColorTransforms[i];
break;
}
}
}
// Remove any extras that don't have a transform for some reason.
for (int i = 0; i < mDescriptions.size(); i++) {
if (mDescriptions.get(i).transform == null) {
mDescriptions.remove(i--);
}
}
ColorTransform currentTransform = mDisplay.getColorTransform();
mCurrentIndex = -1;
for (int i = 0; i < mDescriptions.size(); i++) {
if (mDescriptions.get(i).colorTransform == currentTransform.getColorTransform()) {
mCurrentIndex = i;
break;
}
}
if (mCurrentIndex != -1) {
setSummary(mDescriptions.get(mCurrentIndex).title);
} else {
setSummary(null);
}
}
@Override
protected View onCreateDialogView() {
LayoutInflater inflater = LayoutInflater.from(getContext());
LinearLayout v = (LinearLayout) inflater.inflate(R.layout.radio_list_container, null);
for (int i = 0; i < mDescriptions.size(); i++) {
View child = inflater.inflate(R.layout.radio_with_summary, v, false);
ColorTransformDescription desc = mDescriptions.get(i);
child.setTag(desc);
((TextView) child.findViewById(android.R.id.title)).setText(desc.title);
((TextView) child.findViewById(android.R.id.summary)).setText(desc.summary);
((Checkable) child).setChecked(i == mCurrentIndex);
child.setClickable(true);
child.setOnClickListener(this);
v.addView(child);
}
return v;
}
@Override
protected void onPrepareDialogBuilder(Builder builder) {
super.onPrepareDialogBuilder(builder);
builder.setPositiveButton(null, null);
}
@Override
public void onClick(View v) {
ColorTransformDescription desc = (ColorTransformDescription) v.getTag();
mDisplay.requestColorTransform(desc.transform);
mCurrentIndex = mDescriptions.indexOf(desc);
setSummary(desc.title);
getDialog().dismiss();
}
private static class ColorTransformDescription {
private int colorTransform;
private String title;
private String summary;
private ColorTransform transform;
}
}

View File

@@ -79,6 +79,7 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
private static final String KEY_CAMERA_GESTURE = "camera_gesture";
private static final String KEY_CAMERA_DOUBLE_TAP_POWER_GESTURE
= "camera_double_tap_power_gesture";
private static final String KEY_COLOR_MODE = "color_mode";
private static final int DLG_GLOBAL_CHANGE_WARNING = 1;
@@ -96,6 +97,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
private SwitchPreference mCameraGesturePreference;
private SwitchPreference mCameraDoubleTapPowerGesturePreference;
private ColorModePreference mColorModePreference;
@Override
protected int getMetricsCategory() {
return MetricsLogger.DISPLAY;
@@ -171,6 +174,13 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
removePreference(KEY_CAMERA_DOUBLE_TAP_POWER_GESTURE);
}
mColorModePreference = (ColorModePreference) findPreference(KEY_COLOR_MODE);
mColorModePreference.updateCurrentAndSupported();
if (mColorModePreference.getTransformsCount() < 2) {
removePreference(KEY_COLOR_MODE);
mColorModePreference = null;
}
if (RotationPolicy.isRotationLockToggleVisible(activity)) {
DropDownPreference rotatePreference =
(DropDownPreference) findPreference(KEY_AUTO_ROTATE);
@@ -360,6 +370,17 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
public void onResume() {
super.onResume();
updateState();
if (mColorModePreference != null) {
mColorModePreference.startListening();
}
}
@Override
public void onPause() {
super.onPause();
if (mColorModePreference != null) {
mColorModePreference.stopListening();
}
}
@Override
@@ -417,6 +438,10 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0);
mCameraDoubleTapPowerGesturePreference.setChecked(value == 0);
}
if (mColorModePreference != null) {
mColorModePreference.updateCurrentAndSupported();
}
}
private void updateScreenSaverSummary() {
@@ -556,6 +581,11 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
if (!isCameraDoubleTapPowerGestureAvailable(context.getResources())) {
result.add(KEY_CAMERA_DOUBLE_TAP_POWER_GESTURE);
}
ColorModePreference pref = new ColorModePreference(context, null);
pref.updateCurrentAndSupported();
if (pref.getTransformsCount() < 2) {
result.add(KEY_COLOR_MODE);
}
return result;
}
};