summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <treehugger-gerrit@google.com> 2019-04-08 05:00:25 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2019-04-08 05:00:25 +0000
commit43b75cad9eed2d8d12375316a51ed31b3af01400 (patch)
treee71cd4763823082df1a0f79f8350c4432917f8f8
parent83152b1e5f90935f6b0e8a0c5a6cbf85afec80ab (diff)
parent369320574a87c15adc743a459944cecbff4b33fe (diff)
Merge "Fix exception of unregisterCallback when callback is not registered"
-rw-r--r--services/core/java/com/android/server/tv/TvInputManagerService.java69
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;