Merge "Move DensityUtils into SettingsLib" into nyc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bc89640..9f57d15 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6972,20 +6972,6 @@
     <!-- Description for the button that makes interface elements larger. [CHAR_LIMIT=NONE] -->
     <string name="screen_zoom_make_larger_desc">Make larger</string>
 
-    <!-- Description for the screen zoom level that makes interface elements small. [CHAR LIMIT=24] -->
-    <string name="screen_zoom_summary_small">Small</string>
-    <!-- Description for the device's default screen zoom level. [CHAR LIMIT=24] -->
-    <string name="screen_zoom_summary_default">Default</string>
-    <!-- Description for the screen zoom level that makes interface elements large. [CHAR LIMIT=24] -->
-    <string name="screen_zoom_summary_large">Large</string>
-    <!-- Description for the screen zoom level that makes interface elements larger. [CHAR LIMIT=24] -->
-    <string name="screen_zoom_summary_very_large">Larger</string>
-    <!-- Description for the screen zoom level that makes interface elements largest. [CHAR LIMIT=24] -->
-    <string name="screen_zoom_summary_extremely_large">Largest</string>
-    <!-- Description for a custom screen zoom level. This shows the requested display
-         density in raw pixels per inch rather than using a relative description. [CHAR LIMIT=24] -->
-    <string name="screen_zoom_summary_custom">Custom (<xliff:g id="densityDpi" example="160">%d</xliff:g>)</string>
-
     <!-- Name Initial shown in the conversation message icon. [CHAR LIMIT=1] -->
     <string name="screen_zoom_conversation_icon_alex">A</string>
     <!-- Name Initial shown in the conversation message icon. [CHAR LIMIT=1] -->
diff --git a/src/com/android/settings/display/DisplayDensityUtils.java b/src/com/android/settings/display/DisplayDensityUtils.java
deleted file mode 100644
index f6960d3..0000000
--- a/src/com/android/settings/display/DisplayDensityUtils.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.display;
-
-import com.android.settings.R;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.AsyncTask;
-import android.os.RemoteException;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.MathUtils;
-import android.view.Display;
-import android.view.IWindowManager;
-import android.view.WindowManagerGlobal;
-
-import java.util.Arrays;
-
-/**
- * Utility methods for working with display density.
- */
-class DisplayDensityUtils {
-    private static final String LOG_TAG = "DisplayDensityUtils";
-
-    /** Minimum increment between density scales. */
-    private static final float MIN_SCALE_INTERVAL = 0.09f;
-
-    /** Minimum density scale. This is available on all devices. */
-    private static final float MIN_SCALE = 0.85f;
-
-    /** Maximum density scale. The actual scale used depends on the device. */
-    private static final float MAX_SCALE = 1.50f;
-
-    /** Summary used for "default" scale. */
-    private static final int SUMMARY_DEFAULT = R.string.screen_zoom_summary_default;
-
-    /** Summary used for "custom" scale. */
-    private static final int SUMMARY_CUSTOM = R.string.screen_zoom_summary_custom;
-
-    /**
-     * Summaries for scales smaller than "default" in order of smallest to
-     * largest.
-     */
-    private static final int[] SUMMARIES_SMALLER = new int[] {
-            R.string.screen_zoom_summary_small
-    };
-
-    /**
-     * Summaries for scales larger than "default" in order of smallest to
-     * largest.
-     */
-    private static final int[] SUMMARIES_LARGER = new int[] {
-            R.string.screen_zoom_summary_large,
-            R.string.screen_zoom_summary_very_large,
-            R.string.screen_zoom_summary_extremely_large,
-    };
-
-    /**
-     * Minimum allowed screen dimension, corresponds to resource qualifiers
-     * "small" or "sw320dp". This value must be at least the minimum screen
-     * size required by the CDD so that we meet developer expectations.
-     */
-    private static final int MIN_DIMENSION_DP = 320;
-
-    private final String[] mEntries;
-    private final int[] mValues;
-
-    private final int mDefaultDensity;
-    private final int mCurrentIndex;
-
-    public DisplayDensityUtils(Context context) {
-        final int defaultDensity = DisplayDensityUtils.getDefaultDisplayDensity(
-                Display.DEFAULT_DISPLAY);
-        if (defaultDensity <= 0) {
-            mEntries = null;
-            mValues = null;
-            mDefaultDensity = 0;
-            mCurrentIndex = -1;
-            return;
-        }
-
-        final Resources res = context.getResources();
-        final DisplayMetrics metrics = res.getDisplayMetrics();
-        final int currentDensity = metrics.densityDpi;
-        int currentDensityIndex = -1;
-
-        // Compute number of "larger" and "smaller" scales for this display.
-        final int minDimensionPx = Math.min(metrics.widthPixels, metrics.heightPixels);
-        final int maxDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / MIN_DIMENSION_DP;
-        final float maxScale = Math.min(MAX_SCALE, maxDensity / (float) defaultDensity);
-        final float minScale = MIN_SCALE;
-        final int numLarger = (int) MathUtils.constrain((maxScale - 1) / MIN_SCALE_INTERVAL,
-                0, SUMMARIES_LARGER.length);
-        final int numSmaller = (int) MathUtils.constrain((1 - minScale) / MIN_SCALE_INTERVAL,
-                0, SUMMARIES_SMALLER.length);
-
-        String[] entries = new String[1 + numSmaller + numLarger];
-        int[] values = new int[entries.length];
-        int curIndex = 0;
-
-        if (numSmaller > 0) {
-            final float interval = (1 - minScale) / numSmaller;
-            for (int i = numSmaller - 1; i >= 0; i--) {
-                // Round down to a multiple of 2 by truncating the low bit.
-                final int density = ((int) (defaultDensity * (1 - (i + 1) * interval))) & ~1;
-                if (currentDensity == density) {
-                    currentDensityIndex = curIndex;
-                }
-                entries[curIndex] = res.getString(SUMMARIES_SMALLER[i]);
-                values[curIndex] = density;
-                curIndex++;
-            }
-        }
-
-        if (currentDensity == defaultDensity) {
-            currentDensityIndex = curIndex;
-        }
-        values[curIndex] = defaultDensity;
-        entries[curIndex] = res.getString(SUMMARY_DEFAULT);
-        curIndex++;
-
-        if (numLarger > 0) {
-            final float interval = (maxScale - 1) / numLarger;
-            for (int i = 0; i < numLarger; i++) {
-                // Round down to a multiple of 2 by truncating the low bit.
-                final int density = ((int) (defaultDensity * (1 + (i + 1) * interval))) & ~1;
-                if (currentDensity == density) {
-                    currentDensityIndex = curIndex;
-                }
-                values[curIndex] = density;
-                entries[curIndex] = res.getString(SUMMARIES_LARGER[i]);
-                curIndex++;
-            }
-        }
-
-        final int displayIndex;
-        if (currentDensityIndex >= 0) {
-            displayIndex = currentDensityIndex;
-        } else {
-            // We don't understand the current density. Must have been set by
-            // someone else. Make room for another entry...
-            int newLength = values.length + 1;
-            values = Arrays.copyOf(values, newLength);
-            values[curIndex] = currentDensity;
-
-            entries = Arrays.copyOf(entries, newLength);
-            entries[curIndex] = res.getString(SUMMARY_CUSTOM, currentDensity);
-
-            displayIndex = curIndex;
-        }
-
-        mDefaultDensity = defaultDensity;
-        mCurrentIndex = displayIndex;
-        mEntries = entries;
-        mValues = values;
-    }
-
-    public String[] getEntries() {
-        return mEntries;
-    }
-
-    public int[] getValues() {
-        return mValues;
-    }
-
-    public int getCurrentIndex() {
-        return mCurrentIndex;
-    }
-
-    public int getDefaultDensity() {
-        return mDefaultDensity;
-    }
-
-    /**
-     * Returns the default density for the specified display.
-     *
-     * @param displayId the identifier of the display
-     * @return the default density of the specified display, or {@code -1} if
-     *         the display does not exist or the density could not be obtained
-     */
-    private static int getDefaultDisplayDensity(int displayId) {
-       try {
-           final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
-           return wm.getInitialDisplayDensity(displayId);
-       } catch (RemoteException exc) {
-           return -1;
-       }
-    }
-
-    /**
-     * Asynchronously applies display density changes to the specified display.
-     *
-     * @param displayId the identifier of the display to modify
-     */
-    public static void clearForcedDisplayDensity(final int displayId) {
-        AsyncTask.execute(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
-                    wm.clearForcedDisplayDensity(displayId);
-                } catch (RemoteException exc) {
-                    Log.w(LOG_TAG, "Unable to clear forced display density setting");
-                }
-            }
-        });
-    }
-
-    /**
-     * Asynchronously applies display density changes to the specified display.
-     *
-     * @param displayId the identifier of the display to modify
-     * @param density the density to force for the specified display
-     */
-    public static void setForcedDisplayDensity(final int displayId, final int density) {
-        AsyncTask.execute(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
-                    wm.setForcedDisplayDensity(displayId, density);
-                } catch (RemoteException exc) {
-                    Log.w(LOG_TAG, "Unable to save forced display density setting");
-                }
-            }
-        });
-    }
-}
diff --git a/src/com/android/settings/display/ScreenZoomPreference.java b/src/com/android/settings/display/ScreenZoomPreference.java
index 78cc49c..c43622c 100644
--- a/src/com/android/settings/display/ScreenZoomPreference.java
+++ b/src/com/android/settings/display/ScreenZoomPreference.java
@@ -16,8 +16,9 @@
 
 package com.android.settings.display;
 
+import com.android.settingslib.display.DisplayDensityUtils;
+
 import android.content.Context;
-import android.content.Intent;
 import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v7.preference.PreferenceGroup;
 import android.util.AttributeSet;
diff --git a/src/com/android/settings/display/ScreenZoomSettings.java b/src/com/android/settings/display/ScreenZoomSettings.java
index d72efdc..541357a 100644
--- a/src/com/android/settings/display/ScreenZoomSettings.java
+++ b/src/com/android/settings/display/ScreenZoomSettings.java
@@ -28,6 +28,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
+import com.android.settingslib.display.DisplayDensityUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -60,7 +61,7 @@
             // density and don't let the user change anything.
             final int densityDpi = getResources().getDisplayMetrics().densityDpi;
             mValues = new int[] { densityDpi };
-            mEntries = new String[] { getString(R.string.screen_zoom_summary_default) };
+            mEntries = new String[] { getString(DisplayDensityUtils.SUMMARY_DEFAULT) };
             mInitialIndex = 0;
             mDefaultDensity = densityDpi;
         } else {