Merge "Fix battery history details" into nyc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 210ed5e..5f8ad59 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7385,4 +7385,7 @@
     <!-- Title of screen controlling which apps have access to send premium SMS messages [CHAR LIMIT=60] -->
     <string name="premium_sms_access">Premium SMS access</string>
 
+    <!-- [CHAR LIMIT=25] Bluetooth is disabled. -->
+    <string name="bluetooth_disabled">Disabled</string>
+
 </resources>
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 7e8d2be..7415464 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -323,12 +323,6 @@
             android:entries="@array/track_frame_time_entries"
             android:entryValues="@array/track_frame_time_values" />
 
-        <ListPreference
-            android:key="enable_opengl_traces"
-            android:title="@string/enable_opengl_traces_title"
-            android:entries="@array/enable_opengl_traces_entries"
-            android:entryValues="@array/enable_opengl_traces_values" />
-
     </PreferenceCategory>
 
     <PreferenceCategory android:key="debug_applications_category"
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index 03bf7b3..6cdf0b9 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -344,13 +344,12 @@
 
             // Clear all the users credentials could have been installed in for this user.
             final UserManager um = (UserManager) getSystemService(USER_SERVICE);
-            for (UserInfo pi : um.getProfiles(UserHandle.getUserId(Process.myUid()))) {
+            for (int userId : um.getProfileIdsWithDisabled(UserHandle.myUserId())) {
                 for (int uid : SYSTEM_CREDENTIAL_UIDS) {
-                    mKeyStore.clearUid(UserHandle.getUid(pi.id, uid));
+                    mKeyStore.clearUid(UserHandle.getUid(userId, uid));
                 }
             }
 
-
             try {
                 KeyChainConnection keyChainConnection = KeyChain.bind(CredentialStorage.this);
                 try {
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index c9d07f6..1551bcf 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -186,8 +186,6 @@
 
     private static final String INACTIVE_APPS_KEY = "inactive_apps";
 
-    private static final String OPENGL_TRACES_KEY = "enable_opengl_traces";
-
     private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY
             = "immediately_destroy_activities";
     private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit";
@@ -278,7 +276,6 @@
     private ListPreference mTransitionAnimationScale;
     private ListPreference mAnimatorDurationScale;
     private ListPreference mOverlayDisplayDevices;
-    private ListPreference mOpenGLTraces;
 
     private SwitchPreference mWebViewMultiprocess;
     private ListPreference mWebViewProvider;
@@ -432,7 +429,6 @@
         mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY);
         mAnimatorDurationScale = addListPreference(ANIMATOR_DURATION_SCALE_KEY);
         mOverlayDisplayDevices = addListPreference(OVERLAY_DISPLAY_DEVICES_KEY);
-        mOpenGLTraces = addListPreference(OPENGL_TRACES_KEY);
         mSimulateColorSpace = addListPreference(SIMULATE_COLOR_SPACE);
         mUSBAudio = findAndInitSwitchPref(USB_AUDIO_KEY);
         mForceResizable = findAndInitSwitchPref(FORCE_RESIZABLE_KEY);
@@ -680,7 +676,6 @@
         updateDebugLayoutOptions();
         updateAnimationScaleOptions();
         updateOverlayDisplayDevicesOptions();
-        updateOpenGLTracesOptions();
         updateImmediatelyDestroyActivitiesOptions();
         updateAppProcessLimitOptions();
         updateShowAllANRsOptions();
@@ -1640,30 +1635,6 @@
         updateOverlayDisplayDevicesOptions();
     }
 
-    private void updateOpenGLTracesOptions() {
-        String value = SystemProperties.get(OPENGL_TRACES_PROPERTY);
-        if (value == null) {
-            value = "";
-        }
-
-        CharSequence[] values = mOpenGLTraces.getEntryValues();
-        for (int i = 0; i < values.length; i++) {
-            if (value.contentEquals(values[i])) {
-                mOpenGLTraces.setValueIndex(i);
-                mOpenGLTraces.setSummary(mOpenGLTraces.getEntries()[i]);
-                return;
-            }
-        }
-        mOpenGLTraces.setValueIndex(0);
-        mOpenGLTraces.setSummary(mOpenGLTraces.getEntries()[0]);
-    }
-
-    private void writeOpenGLTracesOptions(Object newValue) {
-        SystemProperties.set(OPENGL_TRACES_PROPERTY, newValue == null ? "" : newValue.toString());
-        pokeSystemProperties();
-        updateOpenGLTracesOptions();
-    }
-
     private void updateAppProcessLimitOptions() {
         try {
             int limit = ActivityManagerNative.getDefault().getProcessLimit();
@@ -1995,9 +1966,6 @@
         } else if (preference == mOverlayDisplayDevices) {
             writeOverlayDisplayDevicesOptions(newValue);
             return true;
-        } else if (preference == mOpenGLTraces) {
-            writeOpenGLTracesOptions(newValue);
-            return true;
         } else if (preference == mTrackFrameTime) {
             writeTrackFrameTimeOptions(newValue);
             return true;
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 84bb2dd..527194f 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -615,12 +615,10 @@
      * @return the managed profile id or UserHandle.USER_NULL if there is none.
      */
     public static int getManagedProfileId(UserManager um, int parentUserId) {
-        List<UserInfo> profiles = um.getProfiles(parentUserId);
-        int numProfiles = profiles.size();
-        for (int i = 0; i < numProfiles; ++i) {
-            UserInfo profile = profiles.get(i);
-            if (profile.id != parentUserId) {
-                return profile.id;
+        int[] profileIds = um.getProfileIdsWithDisabled(parentUserId);
+        for (int profileId : profileIds) {
+            if (profileId != parentUserId) {
+                return profileId;
             }
         }
         return UserHandle.USER_NULL;
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index e565a61..cc46fba 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -518,7 +518,7 @@
         }
 
         private CharSequence getSummary() {
-            return mContext.getString(!mEnabled ? R.string.disabled
+            return mContext.getString(!mEnabled ? R.string.bluetooth_disabled
                     : mConnected ? R.string.bluetooth_connected
                     : R.string.bluetooth_disconnected);
         }
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index 277f59f..9774db9 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -478,6 +478,9 @@
                     continue;
                 }
                 final File path = info.getPath();
+                if (path == null) {
+                    continue;
+                }
                 privateUsedBytes += path.getTotalSpace() - path.getFreeSpace();
                 privateTotalBytes += path.getTotalSpace();
             }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 60b6dc5..79ce204 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -279,7 +279,6 @@
 
     protected void refreshStats() {
         super.refreshStats();
-        PowerWhitelistBackend powerWhiteist = PowerWhitelistBackend.getInstance();
         updatePreference(mHistPref);
         cacheRemoveAllPrefs(mAppListGroup);
         mAppListGroup.setOrderingAsAdded(false);
@@ -360,12 +359,6 @@
                 pref.setTitle(entry.getLabel());
                 pref.setOrder(i + 1);
                 pref.setPercent(percentOfMax, percentOfTotal);
-                if (sipper.drainType == DrainType.APP) {
-                    pref.setSummary(powerWhiteist.isWhitelisted(entry.defaultPackageName)
-                            || powerWhiteist.isSysWhitelisted(entry.defaultPackageName)
-                            ? getString(R.string.not_battery_optimizing)
-                            : null);
-                }
                 if (sipper.uidObj != null) {
                     pref.setKey(Integer.toString(sipper.uidObj.getUid()));
                 }
diff --git a/src/com/android/settings/widget/LabeledSeekBar.java b/src/com/android/settings/widget/LabeledSeekBar.java
index 00df09c..bf6983e 100644
--- a/src/com/android/settings/widget/LabeledSeekBar.java
+++ b/src/com/android/settings/widget/LabeledSeekBar.java
@@ -24,12 +24,10 @@
 import android.support.v4.widget.ExploreByTouchHelper;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
-import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
 import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
 
 import java.util.List;
 
@@ -40,9 +38,90 @@
  */
 public class LabeledSeekBar extends SeekBar {
 
+    private final ExploreByTouchHelper mAccessHelper;
+
+    /** Seek bar change listener set via public method. */
+    private OnSeekBarChangeListener mOnSeekBarChangeListener;
+
+    /** Labels for discrete progress values. */
+    private String[] mLabels;
+
+    public LabeledSeekBar(Context context, AttributeSet attrs) {
+        this(context, attrs, com.android.internal.R.attr.seekBarStyle);
+    }
+
+    public LabeledSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public LabeledSeekBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        mAccessHelper = new LabeledSeekBarExploreByTouchHelper(this);
+        ViewCompat.setAccessibilityDelegate(this, mAccessHelper);
+
+        super.setOnSeekBarChangeListener(mProxySeekBarListener);
+    }
+
+    @Override
+    public synchronized void setProgress(int progress) {
+        // This method gets called from the constructor, so mAccessHelper may
+        // not have been assigned yet.
+        if (mAccessHelper != null) {
+            mAccessHelper.invalidateRoot();
+        }
+
+        super.setProgress(progress);
+    }
+
+    public void setLabels(String[] labels) {
+        mLabels = labels;
+    }
+
+    @Override
+    public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
+        // The callback set in the constructor will proxy calls to this
+        // listener.
+        mOnSeekBarChangeListener = l;
+    }
+
+    @Override
+    protected boolean dispatchHoverEvent(MotionEvent event) {
+        return mAccessHelper.dispatchHoverEvent(event) || super.dispatchHoverEvent(event);
+    }
+
+    private void sendClickEventForAccessibility(int progress) {
+        mAccessHelper.invalidateRoot();
+        mAccessHelper.sendEventForVirtualView(progress, AccessibilityEvent.TYPE_VIEW_CLICKED);
+    }
+
+    private final OnSeekBarChangeListener mProxySeekBarListener = new OnSeekBarChangeListener() {
+        @Override
+        public void onStopTrackingTouch(SeekBar seekBar) {
+            if (mOnSeekBarChangeListener != null) {
+                mOnSeekBarChangeListener.onStopTrackingTouch(seekBar);
+            }
+        }
+
+        @Override
+        public void onStartTrackingTouch(SeekBar seekBar) {
+            if (mOnSeekBarChangeListener != null) {
+                mOnSeekBarChangeListener.onStartTrackingTouch(seekBar);
+            }
+        }
+
+        @Override
+        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+            if (mOnSeekBarChangeListener != null) {
+                mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);
+                sendClickEventForAccessibility(progress);
+            }
+        }
+    };
+
     private class LabeledSeekBarExploreByTouchHelper extends ExploreByTouchHelper {
 
-        public LabeledSeekBarExploreByTouchHelper(View forView) {
+        public LabeledSeekBarExploreByTouchHelper(LabeledSeekBar forView) {
             super(forView);
         }
 
@@ -134,125 +213,4 @@
             return r;
         }
     }
-
-    private String[] mLabels;
-
-    private ExploreByTouchHelper mAccessHelper;
-
-    private boolean mOnMeasureCalled;
-    private boolean mOnAttachedWindowCalled;
-
-    public LabeledSeekBar(Context context, AttributeSet attrs) {
-        this(context, attrs, com.android.internal.R.attr.seekBarStyle);
-    }
-
-    public LabeledSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public LabeledSeekBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        super.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
-            @Override
-            public void onStopTrackingTouch(SeekBar seekBar) {
-                // Do nothing
-            }
-
-            @Override
-            public void onStartTrackingTouch(SeekBar seekBar) {
-                // Do nothing
-            }
-
-            @Override
-            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                sendClickEventForAccessibility(progress);
-            }
-        });
-    }
-
-    @Override
-    public synchronized void setProgress(int progress) {
-        if (mAccessHelper != null) {
-            mAccessHelper.invalidateRoot();
-        }
-
-        super.setProgress(progress);
-    }
-
-    public void setLabels(String[] labels) {
-        mLabels = labels;
-    }
-
-    @Override
-    public void setOnSeekBarChangeListener(final OnSeekBarChangeListener l) {
-        // Tweak the listener to send accessibility event on progress changed.
-        OnSeekBarChangeListener l2 = new OnSeekBarChangeListener() {
-            @Override
-            public void onStopTrackingTouch(SeekBar seekBar) {
-                l.onStopTrackingTouch(seekBar);
-            }
-
-            @Override
-            public void onStartTrackingTouch(SeekBar seekBar) {
-                l.onStartTrackingTouch(seekBar);
-            }
-
-            @Override
-            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                l.onProgressChanged(seekBar, progress, fromUser);
-                sendClickEventForAccessibility(progress);
-            }
-        };
-
-        super.setOnSeekBarChangeListener(l2);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        mOnMeasureCalled = true;
-        tryInitAccessHelper();
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        mOnAttachedWindowCalled = true;
-        tryInitAccessHelper();
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        ViewCompat.setAccessibilityDelegate(this, null);
-        mAccessHelper = null;
-        super.onDetachedFromWindow();
-    }
-
-    @Override
-    protected boolean dispatchHoverEvent(MotionEvent event) {
-        if (mAccessHelper != null && mAccessHelper.dispatchHoverEvent(event)) {
-            return true;
-        }
-
-        return super.dispatchHoverEvent(event);
-    }
-
-    /**
-     * Initialize accessibility delegation only when both onAttachedWindow and onMeasure
-     * has been called.
-     */
-    private void tryInitAccessHelper() {
-        if (mOnAttachedWindowCalled && mOnMeasureCalled) {
-            mAccessHelper = new LabeledSeekBarExploreByTouchHelper(this);
-            ViewCompat.setAccessibilityDelegate(this, mAccessHelper);
-            mOnAttachedWindowCalled = mOnMeasureCalled = false;
-        }
-    }
-
-    private void sendClickEventForAccessibility(int progress) {
-        if (mAccessHelper != null) {
-            mAccessHelper.invalidateRoot();
-            mAccessHelper.sendEventForVirtualView(progress, AccessibilityEvent.TYPE_VIEW_CLICKED);
-        }
-    }
 }
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 17cc3b6..08e27ec 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -984,7 +984,7 @@
 
         private CharSequence getSummary() {
             if (!mWifiTracker.enabled) {
-                return mContext.getString(R.string.disabled);
+                return mContext.getString(R.string.wifi_disabled_generic);
             }
             if (!mWifiTracker.connected) {
                 return mContext.getString(R.string.disconnected);