Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ec2fe2e authored by Shashwat Razdan's avatar Shashwat Razdan Committed by Android (Google) Code Review
Browse files

Merge "Unlink to death before removing the callback wrapper in...

Merge "Unlink to death before removing the callback wrapper in SmartspaceService/AppPredictionServic3e" into tm-dev
parents d7d0d4b1 9f3fde7d
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -224,17 +224,16 @@ public abstract class AppPredictionService extends Service {
        }

        final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
        if (wrapper != null) {
        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,12 +314,14 @@ public abstract class AppPredictionService extends Service {
                @Nullable Consumer<CallbackWrapper> onBinderDied) {
            mCallback = callback;
            mOnBinderDied = onBinderDied;
            if (mOnBinderDied != null) {
                try {
                    mCallback.asBinder().linkToDeath(this, 0);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Failed to link to death: " + e);
                }
            }
        }

        public boolean isCallback(@NonNull IPredictionCallback callback) {
            if (mCallback == null) {
@@ -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);
+21 −12
Original line number Diff line number Diff line
@@ -202,10 +202,8 @@ public abstract class SmartspaceService extends Service {
        }

        final CallbackWrapper wrapper = findCallbackWrapper(callbacks, callback);
        if (wrapper != null) {
        removeCallbackWrapper(callbacks, wrapper);
    }
    }

    private void doRequestPredictionUpdate(@NonNull SmartspaceSessionId sessionId) {
        if (DEBUG) {
@@ -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,12 +288,14 @@ public abstract class SmartspaceService extends Service {
                @Nullable Consumer<CallbackWrapper> onBinderDied) {
            mCallback = callback;
            mOnBinderDied = onBinderDied;
            if (mOnBinderDied != null) {
                try {
                    mCallback.asBinder().linkToDeath(this, 0);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Failed to link to death: " + e);
                }
            }
        }

        public boolean isCallback(@NonNull ISmartspaceCallback callback) {
            if (mCallback == null) {
@@ -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);