Merge "Limit wifi password to ascii chars" into klp-dev
diff --git a/src/com/android/settings/applications/ProcStatsEntry.java b/src/com/android/settings/applications/ProcStatsEntry.java
index cbbfbb7..d6311dc 100644
--- a/src/com/android/settings/applications/ProcStatsEntry.java
+++ b/src/com/android/settings/applications/ProcStatsEntry.java
@@ -78,7 +78,6 @@
         mBestTargetPackage = null;
         if (mUnique) {
             mBestTargetPackage = mPackage;
-            addServices(stats.getPackageStateLocked(mPackage, mUid));
         } else {
             // See if there is one significant package that was running here.
             ArrayList<ProcStatsEntry> subProcs = new ArrayList<ProcStatsEntry>();
@@ -90,18 +89,13 @@
                         continue;
                     }
                     ProcessStats.PackageState pkgState = uids.valueAt(iu);
-                    boolean match = false;
                     for (int iproc=0, NPROC=pkgState.mProcesses.size(); iproc<NPROC; iproc++) {
                         ProcessStats.ProcessState subProc =
                                 pkgState.mProcesses.valueAt(iproc);
                         if (subProc.mName.equals(mName)) {
-                            match = true;
                             subProcs.add(new ProcStatsEntry(subProc, totals));
                         }
                     }
-                    if (match) {
-                        addServices(stats.getPackageStateLocked(mPackage, mUid));
-                    }
                 }
             }
             if (subProcs.size() > 1) {
@@ -173,12 +167,8 @@
         }
     }
 
-    public void addServices(ProcessStats.PackageState pkgState) {
-        for (int isvc=0, NSVC=pkgState.mServices.size(); isvc<NSVC; isvc++) {
-            ProcessStats.ServiceState svc = pkgState.mServices.valueAt(isvc);
-            // XXX can't tell what process it is in!
-            mServices.add(new Service(svc));
-        }
+    public void addService(ProcessStats.ServiceState svc) {
+        mServices.add(new Service(svc));
     }
 
     @Override
@@ -213,32 +203,22 @@
     public static final class Service implements Parcelable {
         final String mPackage;
         final String mName;
+        final String mProcess;
         final long mDuration;
 
         public Service(ProcessStats.ServiceState service) {
             mPackage = service.mPackage;
             mName = service.mName;
-            long startDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
-                    ProcessStats.ServiceState.SERVICE_STARTED,
+            mProcess = service.mProcessName;
+            mDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
+                    ProcessStats.ServiceState.SERVICE_RUN,
                     ProcessStats.STATE_NOTHING, 0, 0);
-            long bindDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
-                    ProcessStats.ServiceState.SERVICE_BOUND,
-                    ProcessStats.STATE_NOTHING, 0, 0);
-            long execDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
-                    ProcessStats.ServiceState.SERVICE_EXEC,
-                    ProcessStats.STATE_NOTHING, 0, 0);
-            if (bindDuration > startDuration) {
-                startDuration = bindDuration;
-            }
-            if (execDuration > startDuration) {
-                startDuration = execDuration;
-            }
-            mDuration = startDuration;
         }
 
         public Service(Parcel in) {
             mPackage = in.readString();
             mName = in.readString();
+            mProcess = in.readString();
             mDuration = in.readLong();
         }
 
@@ -251,6 +231,7 @@
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeString(mPackage);
             dest.writeString(mName);
+            dest.writeString(mProcess);
             dest.writeLong(mDuration);
         }
 
diff --git a/src/com/android/settings/applications/ProcessStatsUi.java b/src/com/android/settings/applications/ProcessStatsUi.java
index 49682ed..5c5355d 100644
--- a/src/com/android/settings/applications/ProcessStatsUi.java
+++ b/src/com/android/settings/applications/ProcessStatsUi.java
@@ -30,6 +30,7 @@
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.util.SparseArray;
 import android.util.TimeUtils;
@@ -245,10 +246,14 @@
         }
         */
 
+        ArrayMap<String, ProcStatsEntry> processes = new ArrayMap<String, ProcStatsEntry>(
+                mStats.mProcesses.getMap().size());
         for (int ip=0, N=mStats.mProcesses.getMap().size(); ip<N; ip++) {
             SparseArray<ProcessStats.ProcessState> uids = mStats.mProcesses.getMap().valueAt(ip);
             for (int iu=0; iu<uids.size(); iu++) {
-                procs.add(new ProcStatsEntry(uids.valueAt(iu), totals));
+                ProcStatsEntry ent = new ProcStatsEntry(uids.valueAt(iu), totals);
+                procs.add(ent);
+                processes.put(ent.mName, ent);
             }
         }
 
@@ -283,6 +288,21 @@
             mAppListGroup.addPreference(pref);
             if (mAppListGroup.getPreferenceCount() > (MAX_ITEMS_TO_LIST+1)) break;
         }
+
+        // Add in service info.
+        for (int ip=0, N=mStats.mPackages.getMap().size(); ip<N; ip++) {
+            SparseArray<ProcessStats.PackageState> uids = mStats.mPackages.getMap().valueAt(ip);
+            for (int iu=0; iu<uids.size(); iu++) {
+                ProcessStats.PackageState ps = uids.valueAt(iu);
+                for (int is=0, NS=ps.mServices.size(); is<NS; is++) {
+                    ProcessStats.ServiceState ss = ps.mServices.valueAt(is);
+                    if (ss.mProcessName != null) {
+                        ProcStatsEntry ent = processes.get(ss.mProcessName);
+                        ent.addService(ss);
+                    }
+                }
+            }
+        }
     }
 
     private void load() {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 740fdb5..dc86b8d 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -249,7 +249,10 @@
                     }
                     break;
                 case BatteryStatsHelper.MSG_REPORT_FULLY_DRAWN:
-                    getActivity().reportFullyDrawn();
+                    Activity activity = getActivity();
+                    if (activity != null) {
+                        activity.reportFullyDrawn();
+                    }
                     break;
             }
             super.handleMessage(msg);
diff --git a/src/com/android/settings/location/DimmableIconPreference.java b/src/com/android/settings/location/DimmableIconPreference.java
deleted file mode 100644
index bc75fc4..0000000
--- a/src/com/android/settings/location/DimmableIconPreference.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2013 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.location;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.preference.Preference;
-import android.util.AttributeSet;
-
-/**
- * A preference item that can dim the icon when it's disabled.
- */
-public class DimmableIconPreference extends Preference {
-    private static final int ICON_ALPHA_ENABLED = 255;
-    private static final int ICON_ALPHA_DISABLED = 102;
-
-    public DimmableIconPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public DimmableIconPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public DimmableIconPreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    public void onParentChanged(Preference parent, boolean disableChild) {
-        Drawable icon = getIcon();
-        if (icon != null) {
-            icon.setAlpha(disableChild ? ICON_ALPHA_DISABLED : ICON_ALPHA_ENABLED);
-            setIcon(icon);
-        }
-        super.onParentChanged(parent, disableChild);
-    }
-}
diff --git a/src/com/android/settings/location/RecentLocationApps.java b/src/com/android/settings/location/RecentLocationApps.java
index 84178e8..1fa8aac 100644
--- a/src/com/android/settings/location/RecentLocationApps.java
+++ b/src/com/android/settings/location/RecentLocationApps.java
@@ -96,7 +96,7 @@
             CharSequence label,
             boolean isHighBattery,
             Preference.OnPreferenceClickListener listener) {
-        Preference pref = new DimmableIconPreference(mActivity);
+        Preference pref = new Preference(mActivity);
         pref.setIcon(icon);
         pref.setTitle(label);
         if (isHighBattery) {
diff --git a/src/com/android/settings/location/SettingsInjector.java b/src/com/android/settings/location/SettingsInjector.java
index 12bf38f..b919080 100644
--- a/src/com/android/settings/location/SettingsInjector.java
+++ b/src/com/android/settings/location/SettingsInjector.java
@@ -312,7 +312,8 @@
                     mSettingsBeingLoaded.remove(timedOutSetting);
                     mTimedOutSettings.add(timedOutSetting);
                     if (Log.isLoggable(TAG, Log.WARN)) {
-                        Log.w(TAG, "Timed out trying to get status for: " + timedOutSetting);
+                        Log.w(TAG, "Timed out after " + timedOutSetting.getElapsedTime()
+                                + " millis trying to get status for: " + timedOutSetting);
                     }
                     break;
                 default:
@@ -447,13 +448,21 @@
             } else {
                 startMillis = 0;
             }
-            mContext.startService(intent);
+
+            // Start the service, making sure that this is attributed to the current user rather
+            // than the system user.
+            mContext.startServiceAsUser(intent, android.os.Process.myUserHandle());
+        }
+
+        public long getElapsedTime() {
+            long end = SystemClock.elapsedRealtime();
+            return end - startMillis;
         }
 
         public void maybeLogElapsedTime() {
             if (Log.isLoggable(TAG, Log.DEBUG) && startMillis != 0) {
-                long end = SystemClock.elapsedRealtime();
-                Log.d(TAG, this + " update took " + (end - startMillis) + " millis");
+                long elapsed = getElapsedTime();
+                Log.d(TAG, this + " update took " + elapsed + " millis");
             }
         }
     }