summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hyunyoung Song <hyunyoungs@google.com> 2022-05-18 17:05:18 -0700
committer Hyunyoung Song <hyunyoungs@google.com> 2022-05-20 15:49:02 -0700
commit9f3fde7d70e45756b3c3af3a6fb6e7a11f788b3d (patch)
tree134da97407f6841dc32fc8a78d201137f02170f9
parentac94a2dacd0d57751a75b2f5a634c27a6775a94e (diff)
Unlink to death before removing the callback wrapper in
SmartspaceService/AppPredictionServic3e Bug: 232548271 Test: ahat Change-Id: Ia86343721c4c8c57e52dd7d3e76de0eba6809058
-rw-r--r--core/java/android/service/appprediction/AppPredictionService.java31
-rw-r--r--core/java/android/service/smartspace/SmartspaceService.java33
2 files changed, 41 insertions, 23 deletions
diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java
index 2d8aee567010..4f37cd91b11f 100644
--- a/core/java/android/service/appprediction/AppPredictionService.java
+++ b/core/java/android/service/appprediction/AppPredictionService.java
@@ -224,17 +224,16 @@ public abstract class AppPredictionService extends Service {
}
final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
- if (wrapper != null) {
- removeCallbackWrapper(callbacks, wrapper);
- }
+ removeCallbackWrapper(callbacks, wrapper);
}
- private void removeCallbackWrapper(
- ArrayList<CallbackWrapper> callbacks, CallbackWrapper wrapper) {
- if (callbacks == null) {
+ private void removeCallbackWrapper(@Nullable ArrayList<CallbackWrapper> callbacks,
+ @Nullable CallbackWrapper wrapper) {
+ if (callbacks == null || wrapper == null) {
return;
}
callbacks.remove(wrapper);
+ wrapper.destroy();
if (callbacks.isEmpty()) {
onStopPredictionUpdates();
}
@@ -264,7 +263,8 @@ public abstract class AppPredictionService extends Service {
public abstract void onRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId);
private void doDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) {
- mSessionCallbacks.remove(sessionId);
+ final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.remove(sessionId);
+ if (callbacks != null) callbacks.forEach(CallbackWrapper::destroy);
onDestroyPredictionSession(sessionId);
}
@@ -314,10 +314,12 @@ public abstract class AppPredictionService extends Service {
@Nullable Consumer<CallbackWrapper> onBinderDied) {
mCallback = callback;
mOnBinderDied = onBinderDied;
- try {
- mCallback.asBinder().linkToDeath(this, 0);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to link to death: " + e);
+ if (mOnBinderDied != null) {
+ try {
+ mCallback.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to link to death: " + e);
+ }
}
}
@@ -329,6 +331,12 @@ public abstract class AppPredictionService extends Service {
return mCallback.equals(callback);
}
+ public void destroy() {
+ if (mCallback != null && mOnBinderDied != null) {
+ mCallback.asBinder().unlinkToDeath(this, 0);
+ }
+ }
+
@Override
public void accept(List<AppTarget> ts) {
try {
@@ -342,6 +350,7 @@ public abstract class AppPredictionService extends Service {
@Override
public void binderDied() {
+ destroy();
mCallback = null;
if (mOnBinderDied != null) {
mOnBinderDied.accept(this);
diff --git a/core/java/android/service/smartspace/SmartspaceService.java b/core/java/android/service/smartspace/SmartspaceService.java
index b903fbeb035c..3a148dffe6d6 100644
--- a/core/java/android/service/smartspace/SmartspaceService.java
+++ b/core/java/android/service/smartspace/SmartspaceService.java
@@ -202,9 +202,7 @@ public abstract class SmartspaceService extends Service {
}
final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
- if (wrapper != null) {
- removeCallbackWrapper(callbacks, wrapper);
- }
+ removeCallbackWrapper(callbacks, wrapper);
}
private void doRequestPredictionUpdate(@NonNull SmartspaceSessionId sessionId) {
@@ -231,12 +229,13 @@ public abstract class SmartspaceService extends Service {
return null;
}
- private void removeCallbackWrapper(
- ArrayList<CallbackWrapper> callbacks, CallbackWrapper wrapper) {
- if (callbacks == null) {
+ private void removeCallbackWrapper(@Nullable ArrayList<CallbackWrapper> callbacks,
+ @Nullable CallbackWrapper wrapper) {
+ if (callbacks == null || wrapper == null) {
return;
}
callbacks.remove(wrapper);
+ wrapper.destroy();
}
/**
@@ -249,7 +248,9 @@ public abstract class SmartspaceService extends Service {
Log.d(TAG, "doDestroy mSessionCallbacks: " + mSessionCallbacks);
}
super.onDestroy();
- mSessionCallbacks.remove(sessionId);
+
+ final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.remove(sessionId);
+ if (callbacks != null) callbacks.forEach(CallbackWrapper::destroy);
onDestroySmartspaceSession(sessionId);
}
@@ -287,10 +288,12 @@ public abstract class SmartspaceService extends Service {
@Nullable Consumer<CallbackWrapper> onBinderDied) {
mCallback = callback;
mOnBinderDied = onBinderDied;
- try {
- mCallback.asBinder().linkToDeath(this, 0);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to link to death: " + e);
+ if (mOnBinderDied != null) {
+ try {
+ mCallback.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to link to death: " + e);
+ }
}
}
@@ -317,9 +320,15 @@ public abstract class SmartspaceService extends Service {
}
}
+ public void destroy() {
+ if (mCallback != null && mOnBinderDied != null) {
+ mCallback.asBinder().unlinkToDeath(this, 0);
+ }
+ }
+
@Override
public void binderDied() {
- mCallback.asBinder().unlinkToDeath(this, 0);
+ destroy();
mCallback = null;
if (mOnBinderDied != null) {
mOnBinderDied.accept(this);