Merge "Import translations. DO NOT MERGE" into mnc-dr-dev
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..ce01000 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -707,6 +707,8 @@
         <item quantity="one"><xliff:g id="count">%1$d</xliff:g> fingerprint set up</item>
         <item quantity="other"><xliff:g id="count">%1$d</xliff:g> fingerprints set up</item>
     </plurals>
+    <!-- message shown in summary field when no fingerprints are registered -->
+    <string name="security_settings_fingerprint_preference_summary_none"></string>
     <!-- Introduction title shown in fingerprint enrollment dialog [CHAR LIMIT=29] -->
     <string name="security_settings_fingerprint_enroll_onboard_title">Fingerprint setup</string>
     <!-- Introduction message shown in fingerprint enrollment dialog when the user needs to choose an
@@ -5953,6 +5955,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 +7009,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/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 6f217c4..45b4ff1 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -1023,6 +1023,7 @@
         PackageManager pm = context.getPackageManager();
         ComponentName name = new ComponentName(context, CryptKeeper.class);
         Log.d(TAG, "Disabling component " + name);
-        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
+        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
     }
 }
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 @@
     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 @@
     private SwitchPreference mCameraGesturePreference;
     private SwitchPreference mCameraDoubleTapPowerGesturePreference;
 
+    private ColorModePreference mColorModePreference;
+
     @Override
     protected int getMetricsCategory() {
         return MetricsLogger.DISPLAY;
@@ -171,6 +174,13 @@
             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 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 @@
                     getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0);
             mCameraDoubleTapPowerGesturePreference.setChecked(value == 0);
         }
+
+        if (mColorModePreference != null) {
+            mColorModePreference.updateCurrentAndSupported();
+        }
     }
 
     private void updateScreenSaverSummary() {
@@ -556,6 +581,11 @@
                     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;
                 }
             };
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 6e679b6..840a393 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -361,6 +361,8 @@
                     fingerprintCount, fingerprintCount));
             clazz = FingerprintSettings.class.getName();
         } else {
+            fingerprintPreference.setSummary(
+                    R.string.security_settings_fingerprint_preference_summary_none);
             clazz = FingerprintEnrollIntroduction.class.getName();
         }
         intent.setClassName("com.android.settings", clazz);
diff --git a/src/com/android/settings/fuelgauge/FakeUid.java b/src/com/android/settings/fuelgauge/FakeUid.java
index aaa30a2..7fd66c5 100644
--- a/src/com/android/settings/fuelgauge/FakeUid.java
+++ b/src/com/android/settings/fuelgauge/FakeUid.java
@@ -246,7 +246,7 @@
     }
 
     @Override
-    public long getTimeAtCpuSpeed(int step, int which) {
+    public long getTimeAtCpuSpeed(int cluster, int step, int which) {
         return 0;
     }