Merge "Unlink to death before removing the callback wrapper in SmartspaceService/AppPredictionServic3e" into tm-dev

This commit is contained in:
Shashwat Razdan
2022-05-23 17:56:46 +00:00
committed by Android (Google) Code Review
2 changed files with 41 additions and 23 deletions

View File

@@ -224,17 +224,16 @@ public abstract class AppPredictionService extends Service {
} }
final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback); final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
if (wrapper != null) { removeCallbackWrapper(callbacks, wrapper);
removeCallbackWrapper(callbacks, wrapper);
}
} }
private void removeCallbackWrapper( private void removeCallbackWrapper(@Nullable ArrayList<CallbackWrapper> callbacks,
ArrayList<CallbackWrapper> callbacks, CallbackWrapper wrapper) { @Nullable CallbackWrapper wrapper) {
if (callbacks == null) { if (callbacks == null || wrapper == null) {
return; return;
} }
callbacks.remove(wrapper); callbacks.remove(wrapper);
wrapper.destroy();
if (callbacks.isEmpty()) { if (callbacks.isEmpty()) {
onStopPredictionUpdates(); onStopPredictionUpdates();
} }
@@ -264,7 +263,8 @@ public abstract class AppPredictionService extends Service {
public abstract void onRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId); public abstract void onRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId);
private void doDestroyPredictionSession(@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); onDestroyPredictionSession(sessionId);
} }
@@ -314,10 +314,12 @@ public abstract class AppPredictionService extends Service {
@Nullable Consumer<CallbackWrapper> onBinderDied) { @Nullable Consumer<CallbackWrapper> onBinderDied) {
mCallback = callback; mCallback = callback;
mOnBinderDied = onBinderDied; mOnBinderDied = onBinderDied;
try { if (mOnBinderDied != null) {
mCallback.asBinder().linkToDeath(this, 0); try {
} catch (RemoteException e) { mCallback.asBinder().linkToDeath(this, 0);
Slog.e(TAG, "Failed to link to death: " + e); } 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); return mCallback.equals(callback);
} }
public void destroy() {
if (mCallback != null && mOnBinderDied != null) {
mCallback.asBinder().unlinkToDeath(this, 0);
}
}
@Override @Override
public void accept(List<AppTarget> ts) { public void accept(List<AppTarget> ts) {
try { try {
@@ -342,6 +350,7 @@ public abstract class AppPredictionService extends Service {
@Override @Override
public void binderDied() { public void binderDied() {
destroy();
mCallback = null; mCallback = null;
if (mOnBinderDied != null) { if (mOnBinderDied != null) {
mOnBinderDied.accept(this); mOnBinderDied.accept(this);

View File

@@ -202,9 +202,7 @@ public abstract class SmartspaceService extends Service {
} }
final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback); final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
if (wrapper != null) { removeCallbackWrapper(callbacks, wrapper);
removeCallbackWrapper(callbacks, wrapper);
}
} }
private void doRequestPredictionUpdate(@NonNull SmartspaceSessionId sessionId) { private void doRequestPredictionUpdate(@NonNull SmartspaceSessionId sessionId) {
@@ -231,12 +229,13 @@ public abstract class SmartspaceService extends Service {
return null; return null;
} }
private void removeCallbackWrapper( private void removeCallbackWrapper(@Nullable ArrayList<CallbackWrapper> callbacks,
ArrayList<CallbackWrapper> callbacks, CallbackWrapper wrapper) { @Nullable CallbackWrapper wrapper) {
if (callbacks == null) { if (callbacks == null || wrapper == null) {
return; return;
} }
callbacks.remove(wrapper); callbacks.remove(wrapper);
wrapper.destroy();
} }
/** /**
@@ -249,7 +248,9 @@ public abstract class SmartspaceService extends Service {
Log.d(TAG, "doDestroy mSessionCallbacks: " + mSessionCallbacks); Log.d(TAG, "doDestroy mSessionCallbacks: " + mSessionCallbacks);
} }
super.onDestroy(); super.onDestroy();
mSessionCallbacks.remove(sessionId);
final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.remove(sessionId);
if (callbacks != null) callbacks.forEach(CallbackWrapper::destroy);
onDestroySmartspaceSession(sessionId); onDestroySmartspaceSession(sessionId);
} }
@@ -287,10 +288,12 @@ public abstract class SmartspaceService extends Service {
@Nullable Consumer<CallbackWrapper> onBinderDied) { @Nullable Consumer<CallbackWrapper> onBinderDied) {
mCallback = callback; mCallback = callback;
mOnBinderDied = onBinderDied; mOnBinderDied = onBinderDied;
try { if (mOnBinderDied != null) {
mCallback.asBinder().linkToDeath(this, 0); try {
} catch (RemoteException e) { mCallback.asBinder().linkToDeath(this, 0);
Slog.e(TAG, "Failed to link to death: " + e); } 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 @Override
public void binderDied() { public void binderDied() {
mCallback.asBinder().unlinkToDeath(this, 0); destroy();
mCallback = null; mCallback = null;
if (mOnBinderDied != null) { if (mOnBinderDied != null) {
mOnBinderDied.accept(this); mOnBinderDied.accept(this);