Merge "Fix issue 7198767, 7198366, 7189824." into jb-mr1-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5a0285f..266d4a3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2706,6 +2706,8 @@
     <string name="service_process_name"><xliff:g id="process">%1$s</xliff:g></string>
     <!-- [CHAR LIMIT=NONE] Label of a running process that represents another user -->
     <string name="running_process_item_user_label">User: <xliff:g id="user_name">%1$s</xliff:g></string>
+    <!-- [CHAR LIMIT=NONE] Label of a running process that represents a removed -->
+    <string name="running_process_item_removed_user_label">Removed user</string>
     <!-- Descriptive text of a running process: singular process, singular service. -->
     <string name="running_processes_item_description_s_s"><xliff:g id="numprocess">%1$d</xliff:g>
         process and <xliff:g id="numservices">%2$d</xliff:g> service</string>
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index 2ce6779..e87d7cf 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -18,6 +18,7 @@
 import android.os.Message;
 import android.os.Process;
 import android.os.SystemClock;
+import android.os.UserHandle;
 import android.text.format.Formatter;
 import android.util.Log;
 
@@ -238,6 +239,7 @@
 
     final Context mContext;
     final PackageManager mPm;
+    final int mRetrieveFlags;
     PackageIntentReceiver mPackageIntentReceiver;
 
     boolean mResumed;
@@ -401,7 +403,15 @@
                 Process.THREAD_PRIORITY_BACKGROUND);
         mThread.start();
         mBackgroundHandler = new BackgroundHandler(mThread.getLooper());
-        
+
+        // Only the owner can see all apps.
+        if (UserHandle.myUserId() == 0) {
+            mRetrieveFlags = PackageManager.GET_UNINSTALLED_PACKAGES |
+                    PackageManager.GET_DISABLED_COMPONENTS;
+        } else {
+            mRetrieveFlags = PackageManager.GET_DISABLED_COMPONENTS;
+        }
+
         /**
          * This is a trick to prevent the foreground thread from being delayed.
          * The problem is that Dalvik monitors are initially spin locks, to keep
@@ -591,9 +601,7 @@
             mPackageIntentReceiver = new PackageIntentReceiver();
             mPackageIntentReceiver.registerReceiver();
         }
-        mApplications = mPm.getInstalledApplications(
-                PackageManager.GET_UNINSTALLED_PACKAGES |
-                PackageManager.GET_DISABLED_COMPONENTS);
+        mApplications = mPm.getInstalledApplications(mRetrieveFlags);
         if (mApplications == null) {
             mApplications = new ArrayList<ApplicationInfo>();
         }
@@ -723,9 +731,7 @@
                     if (DEBUG_LOCKING) Log.v(TAG, "addPackage release lock: already exists");
                     return;
                 }
-                ApplicationInfo info = mPm.getApplicationInfo(pkgName,
-                        PackageManager.GET_UNINSTALLED_PACKAGES |
-                        PackageManager.GET_DISABLED_COMPONENTS);
+                ApplicationInfo info = mPm.getApplicationInfo(pkgName, mRetrieveFlags);
                 mApplications.add(info);
                 if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) {
                     mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES);
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 97d7b75..7588c1a 100644
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -340,7 +340,8 @@
                 }
             } else if ((mPackageInfo.applicationInfo.flags
                     & ApplicationInfo.FLAG_INSTALLED) == 0) {
-                mUninstallButton.setText(R.string.install_text);
+                mUninstallButton.setText(R.string.uninstall_text);
+                enabled = false;
             } else {
                 mUninstallButton.setText(R.string.uninstall_text);
             }
@@ -392,6 +393,9 @@
 
         mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
 
+        // Need to make sure we have loaded applications at this point.
+        mSession.resume();
+
         retrieveAppEntry();
 
         setHasOptionsMenu(true);
@@ -1134,6 +1138,7 @@
                     Uri.fromParts("package", mAppEntry.info.packageName, null));
             intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
             intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
+            intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
             getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
                     Activity.RESULT_CANCELED, null, null);
         }
diff --git a/src/com/android/settings/applications/RunningState.java b/src/com/android/settings/applications/RunningState.java
index 838e4fe..e4d34f7 100644
--- a/src/com/android/settings/applications/RunningState.java
+++ b/src/com/android/settings/applications/RunningState.java
@@ -17,6 +17,7 @@
 package com.android.settings.applications;
 
 import com.android.settings.R;
+import com.android.settings.users.UserUtils;
 
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
@@ -377,7 +378,8 @@
             }
             
             try {
-                ApplicationInfo ai = pm.getApplicationInfo(mProcessName, 0);
+                ApplicationInfo ai = pm.getApplicationInfo(mProcessName,
+                        PackageManager.GET_UNINSTALLED_PACKAGES);
                 if (ai.uid == mUid) {
                     mDisplayLabel = ai.loadLabel(pm);
                     mLabel = mDisplayLabel.toString();
@@ -394,7 +396,8 @@
             // If there is one package with this uid, that is what we want.
             if (pkgs.length == 1) {
                 try {
-                    ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
+                    ApplicationInfo ai = pm.getApplicationInfo(pkgs[0],
+                            PackageManager.GET_UNINSTALLED_PACKAGES);
                     mDisplayLabel = ai.loadLabel(pm);
                     mLabel = mDisplayLabel.toString();
                     mPackageInfo = ai;
@@ -435,7 +438,8 @@
             
             // Finally... whatever, just pick the first package's name.
             try {
-                ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
+                ApplicationInfo ai = pm.getApplicationInfo(pkgs[0],
+                        PackageManager.GET_UNINSTALLED_PACKAGES);
                 mDisplayLabel = ai.loadLabel(pm);
                 mLabel = mDisplayLabel.toString();
                 mPackageInfo = ai;
@@ -455,7 +459,8 @@
                 si = new ServiceItem(mUserId);
                 si.mRunningService = service;
                 try {
-                    si.mServiceInfo = pm.getServiceInfo(service.service, 0);
+                    si.mServiceInfo = pm.getServiceInfo(service.service,
+                            PackageManager.GET_UNINSTALLED_PACKAGES);
                 } catch (PackageManager.NameNotFoundException e) {
                 }
                 si.mDisplayLabel = makeLabel(pm,
@@ -818,12 +823,9 @@
                 userItem.mUser = new UserState();
                 UserInfo info = mUm.getUserInfo(newItem.mUserId);
                 userItem.mUser.mInfo = info;
-                if (info != null && info.iconPath != null) {
-                    try {
-                        userItem.mUser.mIcon = Drawable.createFromPath(info.iconPath);
-                    } catch (Exception e) {
-                        Log.w(TAG, "Failure loading user picture " + info.iconPath, e);
-                    }
+                if (info != null) {
+                    userItem.mUser.mIcon = UserUtils.getUserIcon(mUm, info,
+                            context.getResources());
                 }
                 String name = info != null ? info.name : null;
                 if (name == null) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index bb96ca9..0cc58be 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -34,6 +34,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Process;
+import android.os.UserHandle;
 import android.preference.PreferenceActivity;
 import android.provider.Settings;
 import android.text.TextUtils;
@@ -455,6 +456,7 @@
                 Uri.fromParts("package", mPackages[0], null));
         intent.putExtra(Intent.EXTRA_PACKAGES, mPackages);
         intent.putExtra(Intent.EXTRA_UID, mUid);
+        intent.putExtra(Intent.EXTRA_USER_HANDLE, mUid);
         getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
                 Activity.RESULT_CANCELED, null, null);
     }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 5704163..4a79d9d 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -767,15 +767,23 @@
             final int userId = mUserSippers.keyAt(i);
             final List<BatterySipper> sippers = mUserSippers.valueAt(i);
             UserInfo info = mUm.getUserInfo(userId);
-            Drawable icon = UserUtils.getUserIcon(mUm, info, getResources());
-            String name = info != null ? info.name : null;
-            if (name == null) {
-                name = Integer.toString(info.id);
+            Drawable icon;
+            String name;
+            if (info != null) {
+                icon = UserUtils.getUserIcon(mUm, info, getResources());
+                name = info != null ? info.name : null;
+                if (name == null) {
+                    name = Integer.toString(info.id);
+                }
+                name = getActivity().getResources().getString(
+                        R.string.running_process_item_user_label, name);
+            } else {
+                icon = null;
+                name = getActivity().getResources().getString(
+                        R.string.running_process_item_removed_user_label);
             }
             double power = mUserPower.get(userId);
-            String label = getActivity().getResources().getString(
-                    R.string.running_process_item_user_label, name);
-            BatterySipper bs = addEntry(label, DrainType.USER, 0, 0, power);
+            BatterySipper bs = addEntry(name, DrainType.USER, 0, 0, power);
             bs.icon = icon;
             aggregateSippers(bs, sippers, "User");
         }