summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt4
-rw-r--r--api/system-current.txt6
-rw-r--r--core/java/android/app/ActivityManager.java4
-rw-r--r--core/java/android/app/ActivityManagerNative.java10
-rw-r--r--core/java/android/app/IActivityManager.java2
-rw-r--r--core/java/android/view/KeyEvent.java22
-rw-r--r--core/java/android/view/ViewGroup.java54
-rw-r--r--core/res/AndroidManifest.xml2
-rw-r--r--core/res/res/values/attrs.xml4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java40
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java7
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java57
14 files changed, 134 insertions, 84 deletions
diff --git a/api/current.txt b/api/current.txt
index ac34c59..e295a63 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -35140,6 +35140,10 @@ package android.view {
field public static final int KEYCODE_MEDIA_PREVIOUS = 88; // 0x58
field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
field public static final int KEYCODE_MEDIA_REWIND = 89; // 0x59
+ field public static final int KEYCODE_MEDIA_SKIP_BACKWARD = 273; // 0x111
+ field public static final int KEYCODE_MEDIA_SKIP_FORWARD = 272; // 0x110
+ field public static final int KEYCODE_MEDIA_STEP_BACKWARD = 275; // 0x113
+ field public static final int KEYCODE_MEDIA_STEP_FORWARD = 274; // 0x112
field public static final int KEYCODE_MEDIA_STOP = 86; // 0x56
field public static final int KEYCODE_MEDIA_TOP_MENU = 226; // 0xe2
field public static final int KEYCODE_MENU = 82; // 0x52
diff --git a/api/system-current.txt b/api/system-current.txt
index 7987803..8b9af5e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -115,7 +115,6 @@ package android {
field public static final java.lang.String INTERNET = "android.permission.INTERNET";
field public static final java.lang.String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP";
field public static final java.lang.String KILL_BACKGROUND_PROCESSES = "android.permission.KILL_BACKGROUND_PROCESSES";
- field public static final java.lang.String KILL_UID = "android.permission.KILL_UID";
field public static final java.lang.String LOCAL_MAC_ADDRESS = "android.permission.LOCAL_MAC_ADDRESS";
field public static final java.lang.String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE";
field public static final java.lang.String LOOP_RADIO = "android.permission.LOOP_RADIO";
@@ -3654,7 +3653,6 @@ package android.app {
method public static boolean isRunningInTestHarness();
method public static boolean isUserAMonkey();
method public void killBackgroundProcesses(java.lang.String);
- method public void killUid(int, java.lang.String);
method public void moveTaskToFront(int, int);
method public void moveTaskToFront(int, int, android.os.Bundle);
method public deprecated void restartPackage(java.lang.String);
@@ -37434,6 +37432,10 @@ package android.view {
field public static final int KEYCODE_MEDIA_PREVIOUS = 88; // 0x58
field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
field public static final int KEYCODE_MEDIA_REWIND = 89; // 0x59
+ field public static final int KEYCODE_MEDIA_SKIP_BACKWARD = 273; // 0x111
+ field public static final int KEYCODE_MEDIA_SKIP_FORWARD = 272; // 0x110
+ field public static final int KEYCODE_MEDIA_STEP_BACKWARD = 275; // 0x113
+ field public static final int KEYCODE_MEDIA_STEP_FORWARD = 274; // 0x112
field public static final int KEYCODE_MEDIA_STOP = 86; // 0x56
field public static final int KEYCODE_MEDIA_TOP_MENU = 226; // 0xe2
field public static final int KEYCODE_MENU = 82; // 0x52
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 55b2fd9..87c9efc2 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -2430,11 +2430,11 @@ public class ActivityManager {
*
* @hide
*/
- @SystemApi
@RequiresPermission(Manifest.permission.KILL_UID)
public void killUid(int uid, String reason) {
try {
- ActivityManagerNative.getDefault().killUid(uid, reason);
+ ActivityManagerNative.getDefault().killUid(UserHandle.getAppId(uid),
+ UserHandle.getUserId(uid), reason);
} catch (RemoteException e) {
Log.e(TAG, "Couldn't kill uid:" + uid, e);
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index e144c29..f6e0735 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2245,9 +2245,10 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
case KILL_UID_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
- int uid = data.readInt();
+ int appId = data.readInt();
+ int userId = data.readInt();
String reason = data.readString();
- killUid(uid, reason);
+ killUid(appId, userId, reason);
reply.writeNoException();
return true;
}
@@ -5479,11 +5480,12 @@ class ActivityManagerProxy implements IActivityManager
return res;
}
- public void killUid(int uid, String reason) throws RemoteException {
+ public void killUid(int appId, int userId, String reason) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
- data.writeInt(uid);
+ data.writeInt(appId);
+ data.writeInt(userId);
data.writeString(reason);
mRemote.transact(KILL_UID_TRANSACTION, data, reply, 0);
reply.readException();
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 90216af..ef121ce 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -447,7 +447,7 @@ public interface IActivityManager extends IInterface {
public boolean showAssistFromActivity(IBinder token, Bundle args) throws RemoteException;
- public void killUid(int uid, String reason) throws RemoteException;
+ public void killUid(int appId, int userId, String reason) throws RemoteException;
public void hang(IBinder who, boolean allowRestart) throws RemoteException;
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index f6ce353..a9bf92b 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -747,22 +747,32 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static final int KEYCODE_TV_TIMER_PROGRAMMING = 258;
/** Key code constant: Help key. */
public static final int KEYCODE_HELP = 259;
- /** Key code constant: Navigate to previous key.
+ /** Key code constant: Navigate to previous key.
* Goes backward by one item in an ordered collection of items. */
public static final int KEYCODE_NAVIGATE_PREVIOUS = 260;
- /** Key code constant: Navigate to next key.
+ /** Key code constant: Navigate to next key.
* Advances to the next item in an ordered collection of items. */
public static final int KEYCODE_NAVIGATE_NEXT = 261;
/** Key code constant: Navigate in key.
- * Activates the item that currently has focus or expands to the next level of a navigation
+ * Activates the item that currently has focus or expands to the next level of a navigation
* hierarchy. */
public static final int KEYCODE_NAVIGATE_IN = 262;
/** Key code constant: Navigate out key.
- * Backs out one level of a navigation hierarchy or collapses the item that currently has
+ * Backs out one level of a navigation hierarchy or collapses the item that currently has
* focus. */
public static final int KEYCODE_NAVIGATE_OUT = 263;
-
- private static final int LAST_KEYCODE = KEYCODE_NAVIGATE_OUT;
+ /** Key code constant: Skip forward media key. */
+ public static final int KEYCODE_MEDIA_SKIP_FORWARD = 272;
+ /** Key code constant: Skip backward media key. */
+ public static final int KEYCODE_MEDIA_SKIP_BACKWARD = 273;
+ /** Key code constant: Step forward media key.
+ * Steps media forward, one frame at a time. */
+ public static final int KEYCODE_MEDIA_STEP_FORWARD = 274;
+ /** Key code constant: Step backward media key.
+ * Steps media backward, one frame at a time. */
+ public static final int KEYCODE_MEDIA_STEP_BACKWARD = 275;
+
+ private static final int LAST_KEYCODE = KEYCODE_MEDIA_STEP_BACKWARD;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index fab81a4..52d6cbe 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -43,6 +43,7 @@ import android.util.AttributeSet;
import android.util.Log;
import android.util.Pools.SynchronizedPool;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Animation;
@@ -2902,13 +2903,58 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
final int childrenCount = getChildCount();
if (childrenCount > 0) {
structure.setChildCount(childrenCount);
- final ArrayList<View> preorderedList = buildOrderedChildList();
- final boolean customOrder = preorderedList == null
+ ArrayList<View> preorderedList = buildOrderedChildList();
+ boolean customOrder = preorderedList == null
&& isChildrenDrawingOrderEnabled();
final View[] children = mChildren;
for (int i=0; i<childrenCount; i++) {
- final int childIndex = customOrder
- ? getChildDrawingOrder(childrenCount, i) : i;
+ int childIndex;
+ try {
+ childIndex = customOrder ? getChildDrawingOrder(childrenCount, i) : i;
+ } catch (IndexOutOfBoundsException e) {
+ childIndex = i;
+ if (mContext.getApplicationInfo().targetSdkVersion
+ < Build.VERSION_CODES.M) {
+ Log.w(TAG, "Bad getChildDrawingOrder while collecting assist @ "
+ + i + " of " + childrenCount, e);
+ // At least one app is failing when we call getChildDrawingOrder
+ // at this point, so deal semi-gracefully with it by falling back
+ // on the basic order.
+ customOrder = false;
+ if (i > 0) {
+ // If we failed at the first index, there really isn't
+ // anything to do -- we will just proceed with the simple
+ // sequence order.
+ // Otherwise, we failed in the middle, so need to come up
+ // with an order for the remaining indices and use that.
+ // Failed at the first one, easy peasy.
+ int[] permutation = new int[childrenCount];
+ SparseBooleanArray usedIndices = new SparseBooleanArray();
+ // Go back and collected the indices we have done so far.
+ for (int j=0; j<i; j++) {
+ permutation[j] = getChildDrawingOrder(childrenCount, j);
+ usedIndices.put(permutation[j], true);
+ }
+ // Fill in the remaining indices with indices that have not
+ // yet been used.
+ int nextIndex = 0;
+ for (int j=i; j<childrenCount; j++) {
+ while (usedIndices.get(nextIndex, false)) {
+ nextIndex++;
+ }
+ permutation[j] = nextIndex;
+ nextIndex++;
+ }
+ // Build the final view list.
+ preorderedList = new ArrayList<>(childrenCount);
+ for (int j=0; j<childrenCount; j++) {
+ preorderedList.add(children[permutation[j]]);
+ }
+ }
+ } else {
+ throw e;
+ }
+ }
final View child = (preorderedList == null)
? children[childIndex] : preorderedList.get(childIndex);
ViewStructure cstructure = structure.newChild(i);
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1f47ce3..699e113 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2575,7 +2575,7 @@
<permission android:name="android.permission.QUERY_DO_NOT_ASK_CREDENTIALS_ON_BOOT"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows applications to kill UIDs.
+ <!-- Allows applications to kill UIDs.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.KILL_UID"
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index b1925ba..67abe8d 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1806,6 +1806,10 @@ i
<enum name="KEYCODE_NAVIGATE_NEXT" value="261" />
<enum name="KEYCODE_NAVIGATE_IN" value="262" />
<enum name="KEYCODE_NAVIGATE_OUT" value="263" />
+ <enum name="KEYCODE_MEDIA_SKIP_FORWARD" value="272" />
+ <enum name="KEYCODE_MEDIA_SKIP_BACKWARD" value="273" />
+ <enum name="KEYCODE_MEDIA_STEP_FORWARD" value="274" />
+ <enum name="KEYCODE_MEDIA_STEP_BACKWARD" value="275" />
</attr>
<!-- ***************************************************************** -->
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 6c0deb0..efd72a7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -603,7 +603,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext, mCastController, mHotspotController,
- mUserInfoController);
+ mUserInfoController, mBluetoothController);
mIconPolicy.setCurrentUserSetup(mUserSetup);
mSettingsObserver.onChange(false); // set up
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 53dae5c..540b9d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -21,7 +21,6 @@ import android.app.AlarmManager;
import android.app.AlarmManager.AlarmClockInfo;
import android.app.IUserSwitchObserver;
import android.app.StatusBarManager;
-import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -41,6 +40,8 @@ import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.systemui.R;
import com.android.systemui.qs.tiles.DndTile;
+import com.android.systemui.statusbar.policy.BluetoothController;
+import com.android.systemui.statusbar.policy.BluetoothController.Callback;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -51,7 +52,7 @@ import com.android.systemui.statusbar.policy.UserInfoController;
* bar at boot time. It goes through the normal API for icons, even though it probably
* strictly doesn't need to.
*/
-public class PhoneStatusBarPolicy {
+public class PhoneStatusBarPolicy implements Callback {
private static final String TAG = "PhoneStatusBarPolicy";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -82,12 +83,11 @@ public class PhoneStatusBarPolicy {
private int mZen;
- private boolean mBluetoothEnabled = false;
-
private boolean mManagedProfileFocused = false;
private boolean mManagedProfileIconVisible = true;
private boolean mKeyguardVisible = true;
+ private BluetoothController mBluetooth;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
@@ -96,10 +96,6 @@ public class PhoneStatusBarPolicy {
if (action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
updateAlarm();
}
- else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
- action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
- updateBluetooth();
- }
else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
action.equals(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)) {
updateVolumeZen();
@@ -114,10 +110,12 @@ public class PhoneStatusBarPolicy {
};
public PhoneStatusBarPolicy(Context context, CastController cast, HotspotController hotspot,
- UserInfoController userInfoController) {
+ UserInfoController userInfoController, BluetoothController bluetooth) {
mContext = context;
mCast = cast;
mHotspot = hotspot;
+ mBluetooth = bluetooth;
+ mBluetooth.addStateChangedCallback(this);
mService = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mUserInfoController = userInfoController;
@@ -127,8 +125,6 @@ public class PhoneStatusBarPolicy {
filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
- filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
- filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
@@ -275,23 +271,31 @@ public class PhoneStatusBarPolicy {
updateAlarm();
}
+ @Override
+ public void onBluetoothDevicesChanged() {
+ updateBluetooth();
+ }
+
+ @Override
+ public void onBluetoothStateChange(boolean enabled) {
+ updateBluetooth();
+ }
+
private final void updateBluetooth() {
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
int iconId = R.drawable.stat_sys_data_bluetooth;
String contentDescription =
mContext.getString(R.string.accessibility_quick_settings_bluetooth_on);
- if (adapter != null) {
- mBluetoothEnabled = (adapter.getState() == BluetoothAdapter.STATE_ON);
- if (adapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {
+ boolean bluetoothEnabled = false;
+ if (mBluetooth != null) {
+ bluetoothEnabled = mBluetooth.isBluetoothEnabled();
+ if (mBluetooth.isBluetoothConnected()) {
iconId = R.drawable.stat_sys_data_bluetooth_connected;
contentDescription = mContext.getString(R.string.accessibility_bluetooth_connected);
}
- } else {
- mBluetoothEnabled = false;
}
mService.setIcon(SLOT_BLUETOOTH, iconId, 0, contentDescription);
- mService.setIconVisibility(SLOT_BLUETOOTH, mBluetoothEnabled);
+ mService.setIconVisibility(SLOT_BLUETOOTH, bluetoothEnabled);
}
private final void updateTTY(Intent intent) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 39e3b46..3d523d9 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -5521,7 +5521,7 @@ public final class ActivityManagerService extends ActivityManagerNative
// If no package is specified, we call all processes under the
// give user id.
if (packageName == null) {
- if (app.userId != userId) {
+ if (userId != UserHandle.USER_ALL && app.userId != userId) {
continue;
}
if (appId >= 0 && UserHandle.getAppId(app.uid) != appId) {
@@ -11226,13 +11226,12 @@ public final class ActivityManagerService extends ActivityManagerNative
}
@Override
- public void killUid(int uid, String reason) {
+ public void killUid(int appId, int userId, String reason) {
enforceCallingPermission(Manifest.permission.KILL_UID, "killUid");
synchronized (this) {
final long identity = Binder.clearCallingIdentity();
try {
- killPackageProcessesLocked(null, UserHandle.getAppId(uid),
- UserHandle.getUserId(uid),
+ killPackageProcessesLocked(null, appId, userId,
ProcessList.PERSISTENT_PROC_ADJ, false, true, true, true,
reason != null ? reason : "kill uid");
} finally {
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index a0ededf..7565e9d 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -5150,7 +5150,9 @@ public class AudioService extends IAudioService.Stub {
continue;
}
try {
- ActivityManagerNative.getDefault().killUid(pkg.applicationInfo.uid,
+ final int uid = pkg.applicationInfo.uid;
+ ActivityManagerNative.getDefault().killUid(UserHandle.getAppId(uid),
+ UserHandle.getUserId(uid),
"killBackgroundUserProcessesWithAudioRecordPermission");
} catch (RemoteException e) {
Log.w(TAG, "Error calling killUid", e);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 473be56..ce40c28 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3469,10 +3469,11 @@ public class PackageManagerService extends IPackageManager.Stub {
}
case PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: {
+ final int appId = UserHandle.getAppId(pkg.applicationInfo.uid);
mHandler.post(new Runnable() {
@Override
public void run() {
- killSettingPackagesForUser(sb, userId, KILL_APP_REASON_GIDS_CHANGED);
+ killUid(appId, userId, KILL_APP_REASON_GIDS_CHANGED);
}
});
} break;
@@ -3516,7 +3517,7 @@ public class PackageManagerService extends IPackageManager.Stub {
enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false,
"revokeRuntimePermission");
- final SettingBase sb;
+ final int appId;
synchronized (mPackages) {
final PackageParser.Package pkg = mPackages.get(packageName);
@@ -3531,7 +3532,7 @@ public class PackageManagerService extends IPackageManager.Stub {
enforceDeclaredAsUsedAndRuntimePermission(pkg, bp);
- sb = (SettingBase) pkg.mExtras;
+ SettingBase sb = (SettingBase) pkg.mExtras;
if (sb == null) {
throw new IllegalArgumentException("Unknown package: " + packageName);
}
@@ -3553,9 +3554,11 @@ public class PackageManagerService extends IPackageManager.Stub {
// Critical, after this call app should never have the permission.
mSettings.writeRuntimePermissionsForUserLPr(userId, true);
+
+ appId = UserHandle.getAppId(pkg.applicationInfo.uid);
}
- killSettingPackagesForUser(sb, userId, KILL_APP_REASON_PERMISSIONS_REVOKED);
+ killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED);
}
@Override
@@ -3859,28 +3862,15 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
- private void killSettingPackagesForUser(SettingBase sb, int userId, String reason) {
+ private void killUid(int appId, int userId, String reason) {
final long identity = Binder.clearCallingIdentity();
try {
- if (sb instanceof SharedUserSetting) {
- SharedUserSetting sus = (SharedUserSetting) sb;
- final int packageCount = sus.packages.size();
- for (int i = 0; i < packageCount; i++) {
- PackageSetting susPs = sus.packages.valueAt(i);
- if (userId == UserHandle.USER_ALL) {
- killApplication(susPs.pkg.packageName, susPs.appId, reason);
- } else {
- final int uid = UserHandle.getUid(userId, susPs.appId);
- killUid(uid, reason);
- }
- }
- } else if (sb instanceof PackageSetting) {
- PackageSetting ps = (PackageSetting) sb;
- if (userId == UserHandle.USER_ALL) {
- killApplication(ps.pkg.packageName, ps.appId, reason);
- } else {
- final int uid = UserHandle.getUid(userId, ps.appId);
- killUid(uid, reason);
+ IActivityManager am = ActivityManagerNative.getDefault();
+ if (am != null) {
+ try {
+ am.killUid(appId, userId, reason);
+ } catch (RemoteException e) {
+ /* ignore - same process */
}
}
} finally {
@@ -3888,17 +3878,6 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
- private static void killUid(int uid, String reason) {
- IActivityManager am = ActivityManagerNative.getDefault();
- if (am != null) {
- try {
- am.killUid(uid, reason);
- } catch (RemoteException e) {
- /* ignore - same process */
- }
- }
- }
-
/**
* Compares two sets of signatures. Returns:
* <br />
@@ -12821,7 +12800,7 @@ public class PackageManagerService extends IPackageManager.Stub {
@Override
public void run() {
// This has to happen with no lock held.
- killSettingPackagesForUser(deletedPs, userIdToKill,
+ killApplication(deletedPs.name, deletedPs.appId,
KILL_APP_REASON_GIDS_CHANGED);
}
});
@@ -13407,13 +13386,11 @@ public class PackageManagerService extends IPackageManager.Stub {
case PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: {
writeRuntimePermissions = true;
- // If gids changed for this user, kill all affected packages.
+ final int appId = ps.appId;
mHandler.post(new Runnable() {
@Override
public void run() {
- // This has to happen with no lock held.
- killSettingPackagesForUser(ps, userId,
- KILL_APP_REASON_GIDS_CHANGED);
+ killUid(appId, userId, KILL_APP_REASON_GIDS_CHANGED);
}
});
} break;