Merge "Unlink to death before removing the callback wrapper in SmartspaceService/AppPredictionServic3e" into tm-dev am: 1ec2fe2e7d
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18475472 Change-Id: I89a69292956df070dadb4e3fa83464ff41436a21 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user