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

Commit 9f3fde7d authored by Hyunyoung Song's avatar Hyunyoung Song
Browse files

Unlink to death before removing the callback wrapper in

SmartspaceService/AppPredictionServic3e

Bug: 232548271
Test: ahat

Change-Id: Ia86343721c4c8c57e52dd7d3e76de0eba6809058
parent ac94a2da
Loading
Loading
Loading
Loading
+20 −11
Original line number Original line Diff line number Diff line
@@ -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,12 +314,14 @@ public abstract class AppPredictionService extends Service {
                @Nullable Consumer<CallbackWrapper> onBinderDied) {
                @Nullable Consumer<CallbackWrapper> onBinderDied) {
            mCallback = callback;
            mCallback = callback;
            mOnBinderDied = onBinderDied;
            mOnBinderDied = onBinderDied;
            if (mOnBinderDied != null) {
                try {
                try {
                    mCallback.asBinder().linkToDeath(this, 0);
                    mCallback.asBinder().linkToDeath(this, 0);
                } catch (RemoteException e) {
                } catch (RemoteException e) {
                    Slog.e(TAG, "Failed to link to death: " + e);
                    Slog.e(TAG, "Failed to link to death: " + e);
                }
                }
            }
            }
        }


        public boolean isCallback(@NonNull IPredictionCallback callback) {
        public boolean isCallback(@NonNull IPredictionCallback callback) {
            if (mCallback == null) {
            if (mCallback == null) {
@@ -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);
+21 −12
Original line number Original line Diff line number Diff line
@@ -202,10 +202,8 @@ 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) {
        if (DEBUG) {
        if (DEBUG) {
@@ -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,12 +288,14 @@ public abstract class SmartspaceService extends Service {
                @Nullable Consumer<CallbackWrapper> onBinderDied) {
                @Nullable Consumer<CallbackWrapper> onBinderDied) {
            mCallback = callback;
            mCallback = callback;
            mOnBinderDied = onBinderDied;
            mOnBinderDied = onBinderDied;
            if (mOnBinderDied != null) {
                try {
                try {
                    mCallback.asBinder().linkToDeath(this, 0);
                    mCallback.asBinder().linkToDeath(this, 0);
                } catch (RemoteException e) {
                } catch (RemoteException e) {
                    Slog.e(TAG, "Failed to link to death: " + e);
                    Slog.e(TAG, "Failed to link to death: " + e);
                }
                }
            }
            }
        }


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