diff options
| author | 2019-04-08 05:00:25 +0000 | |
|---|---|---|
| committer | 2019-04-08 05:00:25 +0000 | |
| commit | 43b75cad9eed2d8d12375316a51ed31b3af01400 (patch) | |
| tree | e71cd4763823082df1a0f79f8350c4432917f8f8 | |
| parent | 83152b1e5f90935f6b0e8a0c5a6cbf85afec80ab (diff) | |
| parent | 369320574a87c15adc743a459944cecbff4b33fe (diff) | |
Merge "Fix exception of unregisterCallback when callback is not registered"
| -rw-r--r-- | services/core/java/com/android/server/tv/TvInputManagerService.java | 69 |
1 files changed, 33 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index c30babd464f4..b2677cb77d9c 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -67,6 +67,7 @@ import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.Process; +import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.UserHandle; import android.text.TextUtils; @@ -128,8 +129,6 @@ public final class TvInputManagerService extends SystemService { private final WatchLogHandler mWatchLogHandler; - private IBinder.DeathRecipient mDeathRecipient; - public TvInputManagerService(Context context) { super(context); @@ -484,7 +483,7 @@ public final class TvInputManagerService extends SystemService { userState.packageSet.clear(); userState.contentRatingSystemList.clear(); userState.clientStateMap.clear(); - userState.callbackSet.clear(); + userState.mCallbacks.kill(); userState.mainSessionToken = null; mUserStates.remove(userId); @@ -749,39 +748,45 @@ public final class TvInputManagerService extends SystemService { if (DEBUG) { Slog.d(TAG, "notifyInputAddedLocked(inputId=" + inputId + ")"); } - for (ITvInputManagerCallback callback : userState.callbackSet) { + int n = userState.mCallbacks.beginBroadcast(); + for (int i = 0; i < n; ++i) { try { - callback.onInputAdded(inputId); + userState.mCallbacks.getBroadcastItem(i).onInputAdded(inputId); } catch (RemoteException e) { Slog.e(TAG, "failed to report added input to callback", e); } } + userState.mCallbacks.finishBroadcast(); } private void notifyInputRemovedLocked(UserState userState, String inputId) { if (DEBUG) { Slog.d(TAG, "notifyInputRemovedLocked(inputId=" + inputId + ")"); } - for (ITvInputManagerCallback callback : userState.callbackSet) { + int n = userState.mCallbacks.beginBroadcast(); + for (int i = 0; i < n; ++i) { try { - callback.onInputRemoved(inputId); + userState.mCallbacks.getBroadcastItem(i).onInputRemoved(inputId); } catch (RemoteException e) { Slog.e(TAG, "failed to report removed input to callback", e); } } + userState.mCallbacks.finishBroadcast(); } private void notifyInputUpdatedLocked(UserState userState, String inputId) { if (DEBUG) { Slog.d(TAG, "notifyInputUpdatedLocked(inputId=" + inputId + ")"); } - for (ITvInputManagerCallback callback : userState.callbackSet) { + int n = userState.mCallbacks.beginBroadcast(); + for (int i = 0; i < n; ++i) { try { - callback.onInputUpdated(inputId); + userState.mCallbacks.getBroadcastItem(i).onInputUpdated(inputId); } catch (RemoteException e) { Slog.e(TAG, "failed to report updated input to callback", e); } } + userState.mCallbacks.finishBroadcast(); } private void notifyInputStateChangedLocked(UserState userState, String inputId, @@ -791,13 +796,15 @@ public final class TvInputManagerService extends SystemService { + ", state=" + state + ")"); } if (targetCallback == null) { - for (ITvInputManagerCallback callback : userState.callbackSet) { + int n = userState.mCallbacks.beginBroadcast(); + for (int i = 0; i < n; ++i) { try { - callback.onInputStateChanged(inputId, state); + userState.mCallbacks.getBroadcastItem(i).onInputStateChanged(inputId, state); } catch (RemoteException e) { Slog.e(TAG, "failed to report state change to callback", e); } } + userState.mCallbacks.finishBroadcast(); } else { try { targetCallback.onInputStateChanged(inputId, state); @@ -819,13 +826,15 @@ public final class TvInputManagerService extends SystemService { } inputState.info = inputInfo; - for (ITvInputManagerCallback callback : userState.callbackSet) { + int n = userState.mCallbacks.beginBroadcast(); + for (int i = 0; i < n; ++i) { try { - callback.onTvInputInfoUpdated(inputInfo); + userState.mCallbacks.getBroadcastItem(i).onTvInputInfoUpdated(inputInfo); } catch (RemoteException e) { Slog.e(TAG, "failed to report updated input info to callback", e); } } + userState.mCallbacks.finishBroadcast(); } private void setStateLocked(String inputId, int state, int userId) { @@ -1003,22 +1012,8 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { final UserState userState = getOrCreateUserStateLocked(resolvedUserId); - userState.callbackSet.add(callback); - mDeathRecipient = new IBinder.DeathRecipient() { - @Override - public void binderDied() { - synchronized (mLock) { - if (userState.callbackSet != null) { - userState.callbackSet.remove(callback); - } - } - } - }; - - try { - callback.asBinder().linkToDeath(mDeathRecipient, 0); - } catch (RemoteException e) { - Slog.e(TAG, "client process has already died", e); + if (!userState.mCallbacks.register(callback)) { + Slog.e(TAG, "client process has already died"); } } } finally { @@ -1034,8 +1029,7 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { UserState userState = getOrCreateUserStateLocked(resolvedUserId); - userState.callbackSet.remove(callback); - callback.asBinder().unlinkToDeath(mDeathRecipient, 0); + userState.mCallbacks.unregister(callback); } } finally { Binder.restoreCallingIdentity(identity); @@ -2104,11 +2098,13 @@ public final class TvInputManagerService extends SystemService { } pw.decreaseIndent(); - pw.println("callbackSet:"); + pw.println("mCallbacks:"); pw.increaseIndent(); - for (ITvInputManagerCallback callback : userState.callbackSet) { - pw.println(callback.toString()); + int n = userState.mCallbacks.beginBroadcast(); + for (int j = 0; j < n; ++j) { + pw.println(userState.mCallbacks.getRegisteredCallbackItem(j).toString()); } + userState.mCallbacks.finishBroadcast(); pw.decreaseIndent(); pw.println("mainSessionToken: " + userState.mainSessionToken); @@ -2139,8 +2135,9 @@ public final class TvInputManagerService extends SystemService { // A mapping from the token of a TV input session to its state. private final Map<IBinder, SessionState> sessionStateMap = new HashMap<>(); - // A set of callbacks. - private final Set<ITvInputManagerCallback> callbackSet = new HashSet<>(); + // A list of callbacks. + private final RemoteCallbackList<ITvInputManagerCallback> mCallbacks = + new RemoteCallbackList<ITvInputManagerCallback>(); // The token of a "main" TV input session. private IBinder mainSessionToken = null; |