diff options
| -rw-r--r-- | core/java/android/os/RemoteCallbackList.java | 26 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/LauncherAppsService.java | 152 |
2 files changed, 101 insertions, 77 deletions
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java index 5849350cc49e..3546e17698b9 100644 --- a/core/java/android/os/RemoteCallbackList.java +++ b/core/java/android/os/RemoteCallbackList.java @@ -288,20 +288,22 @@ public class RemoteCallbackList<E extends IInterface> { * @see #beginBroadcast */ public void finishBroadcast() { - if (mBroadcastCount < 0) { - throw new IllegalStateException( - "finishBroadcast() called outside of a broadcast"); - } - - Object[] active = mActiveBroadcast; - if (active != null) { - final int N = mBroadcastCount; - for (int i=0; i<N; i++) { - active[i] = null; + synchronized (mCallbacks) { + if (mBroadcastCount < 0) { + throw new IllegalStateException( + "finishBroadcast() called outside of a broadcast"); } + + Object[] active = mActiveBroadcast; + if (active != null) { + final int N = mBroadcastCount; + for (int i=0; i<N; i++) { + active[i] = null; + } + } + + mBroadcastCount = -1; } - - mBroadcastCount = -1; } /** diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 53e328c7ee5f..4387e769c7bb 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -631,17 +631,20 @@ public class LauncherAppsService extends SystemService { public void onPackageAdded(String packageName, int uid) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue; - try { - listener.onPackageAdded(user, packageName); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue; + try { + listener.onPackageAdded(user, packageName); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackageAdded(packageName, uid); } @@ -650,17 +653,20 @@ public class LauncherAppsService extends SystemService { public void onPackageRemoved(String packageName, int uid) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue; - try { - listener.onPackageRemoved(user, packageName); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue; + try { + listener.onPackageRemoved(user, packageName); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackageRemoved(packageName, uid); } @@ -669,17 +675,20 @@ public class LauncherAppsService extends SystemService { public void onPackageModified(String packageName) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue; - try { - listener.onPackageChanged(user, packageName); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue; + try { + listener.onPackageChanged(user, packageName); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackageModified(packageName); } @@ -688,17 +697,20 @@ public class LauncherAppsService extends SystemService { public void onPackagesAvailable(String[] packages) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue; - try { - listener.onPackagesAvailable(user, packages, isReplacing()); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue; + try { + listener.onPackagesAvailable(user, packages, isReplacing()); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackagesAvailable(packages); } @@ -707,17 +719,20 @@ public class LauncherAppsService extends SystemService { public void onPackagesUnavailable(String[] packages) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue; - try { - listener.onPackagesUnavailable(user, packages, isReplacing()); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue; + try { + listener.onPackagesUnavailable(user, packages, isReplacing()); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackagesUnavailable(packages); } @@ -726,17 +741,20 @@ public class LauncherAppsService extends SystemService { public void onPackagesSuspended(String[] packages) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue; - try { - listener.onPackagesSuspended(user, packages); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue; + try { + listener.onPackagesSuspended(user, packages); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackagesSuspended(packages); } @@ -745,17 +763,20 @@ public class LauncherAppsService extends SystemService { public void onPackagesUnsuspended(String[] packages) { UserHandle user = new UserHandle(getChangingUserId()); final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue; - try { - listener.onPackagesUnsuspended(user, packages); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue; + try { + listener.onPackagesUnsuspended(user, packages); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } } + } finally { + mListeners.finishBroadcast(); } - mListeners.finishBroadcast(); super.onPackagesUnsuspended(packages); } @@ -768,10 +789,10 @@ public class LauncherAppsService extends SystemService { private void onShortcutChangedInner(@NonNull String packageName, @UserIdInt int userId) { + final int n = mListeners.beginBroadcast(); try { final UserHandle user = UserHandle.of(userId); - final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); @@ -803,10 +824,11 @@ public class LauncherAppsService extends SystemService { Slog.d(TAG, "Callback failed ", re); } } - mListeners.finishBroadcast(); } catch (RuntimeException e) { // When the user is locked we get IllegalState, so just catch all. Log.w(TAG, e.getMessage(), e); + } finally { + mListeners.finishBroadcast(); } } } |