diff options
-rw-r--r-- | res/layout/ignore_optimizations_content.xml | 2 | ||||
-rw-r--r-- | res/layout/radio_list_container.xml | 22 | ||||
-rw-r--r-- | res/layout/radio_with_summary.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 18 | ||||
-rw-r--r-- | res/xml/display_settings.xml | 6 | ||||
-rw-r--r-- | src/com/android/settings/ColorModePreference.java | 177 | ||||
-rw-r--r-- | src/com/android/settings/DisplaySettings.java | 30 |
7 files changed, 255 insertions, 2 deletions
diff --git a/res/layout/ignore_optimizations_content.xml b/res/layout/ignore_optimizations_content.xml index 17327d9..3a6db9d 100644 --- a/res/layout/ignore_optimizations_content.xml +++ b/res/layout/ignore_optimizations_content.xml @@ -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 diff --git a/res/layout/radio_list_container.xml b/res/layout/radio_list_container.xml new file mode 100644 index 0000000..bf40abe --- /dev/null +++ b/res/layout/radio_list_container.xml @@ -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" /> diff --git a/res/layout/radio_with_summary.xml b/res/layout/radio_with_summary.xml index 8df1210..87b1d14 100644 --- a/res/layout/radio_with_summary.xml +++ b/res/layout/radio_with_summary.xml @@ -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" diff --git a/res/values/strings.xml b/res/values/strings.xml index 88dce90..09706e7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -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> diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index 7150150..6eaaeab 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -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" diff --git a/src/com/android/settings/ColorModePreference.java b/src/com/android/settings/ColorModePreference.java new file mode 100644 index 0000000..e1f00fd --- /dev/null +++ b/src/com/android/settings/ColorModePreference.java @@ -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; + } +} diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index de15d4c..536a30e 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -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; } }; |