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

Commit 8a3a5875 authored by Evan Severson's avatar Evan Severson
Browse files

Don't post work for SelectionToolbarRenderService on main thread

Test: CtsWidgetTestCases
Bug: 421408244
Flag: android.permission.flags.system_selection_toolbar_enabled
Change-Id: I6f19d0a3d598aba7e089fdd03524aa5c309bc4cf
parent 865dbadf
Loading
Loading
Loading
Loading
+27 −39
Original line number Diff line number Diff line
@@ -16,16 +16,11 @@

package android.service.selectiontoolbar;

import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;

import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
import android.util.SparseArray;
@@ -33,6 +28,8 @@ import android.view.selectiontoolbar.ISelectionToolbarCallback;
import android.view.selectiontoolbar.ShowInfo;
import android.view.selectiontoolbar.WidgetInfo;

import com.android.internal.annotations.GuardedBy;

/**
 * Service for rendering selection toolbar.
 *
@@ -52,8 +49,8 @@ public abstract class SelectionToolbarRenderService extends Service {
    public static final String SERVICE_INTERFACE =
            "android.service.selectiontoolbar.SelectionToolbarRenderService";

    private Handler mHandler;
    private ISelectionToolbarRenderServiceCallback mServiceCallback;
    private final Object mLock = new Object();
    private volatile ISelectionToolbarRenderServiceCallback mServiceCallback;

    /**
     * Binder to receive calls from system server.
@@ -68,16 +65,21 @@ public abstract class SelectionToolbarRenderService extends Service {
                private final SparseArray<RemoteCallbackWrapper> mCache =
                        new SparseArray<>();

                @Override
                public void onConnected(IBinder callback) {
                    mServiceCallback = ISelectionToolbarRenderServiceCallback.Stub.asInterface(
                            callback);
                }

                @Override
                public void onShow(int uid, ShowInfo showInfo,
                        ISelectionToolbarCallback callback) {
                    RemoteCallbackWrapper remoteCallbackWrapper;
                    synchronized (mCache) {
                        remoteCallbackWrapper = mCache.get(uid);
                    synchronized (mLock) {
                        RemoteCallbackWrapper remoteCallbackWrapper = mCache.get(uid);
                        if (remoteCallbackWrapper == null) {
                            try {
                                DeathRecipient deathRecipient = () -> {
                                    synchronized (mCache) {
                                    synchronized (mLock) {
                                        mCache.remove(uid);
                                    }
                                    onUidDied(uid);
@@ -91,23 +93,22 @@ public abstract class SelectionToolbarRenderService extends Service {
                                return;
                            }
                        }
                        SelectionToolbarRenderService.this.onShow(uid, showInfo,
                                remoteCallbackWrapper);
                    }
                    mHandler.sendMessage(obtainMessage(SelectionToolbarRenderService::onShow,
                            SelectionToolbarRenderService.this, uid, showInfo,
                            remoteCallbackWrapper));
                }

                @Override
                public void onHide(int uid) {
                    mHandler.sendMessage(obtainMessage(SelectionToolbarRenderService::onHide,
                            SelectionToolbarRenderService.this, uid));
                    synchronized (mLock) {
                        SelectionToolbarRenderService.this.onHide(uid);
                    }
                }

                @Override
                public void onDismiss(int uid) {
                    mHandler.sendMessage(obtainMessage(SelectionToolbarRenderService::onDismiss,
                            SelectionToolbarRenderService.this, uid));
                    synchronized (mCache) {
                    synchronized (mLock) {
                        SelectionToolbarRenderService.this.onDismiss(uid);
                        RemoteCallbackWrapper remoteCallbackWrapper =
                                mCache.removeReturnOld(uid);
                        if (remoteCallbackWrapper != null) {
@@ -116,26 +117,13 @@ public abstract class SelectionToolbarRenderService extends Service {
                    }
                }

                @Override
                public void onConnected(IBinder callback) {
                    mHandler.sendMessage(
                            obtainMessage(SelectionToolbarRenderService::handleOnConnected,
                                    SelectionToolbarRenderService.this, callback));
                }

                @Override
                public void onUidDied(int uid) {
                    mHandler.sendMessage(obtainMessage(SelectionToolbarRenderService::onUidDied,
                            SelectionToolbarRenderService.this, uid));
                    synchronized (mLock) {
                        SelectionToolbarRenderService.this.onUidDied(uid);
                    }
            };

    @CallSuper
    @Override
    public void onCreate() {
        super.onCreate();
        mHandler = new Handler(Looper.getMainLooper(), null, true);
                }
            };

    @Override
    @Nullable
@@ -147,10 +135,6 @@ public abstract class SelectionToolbarRenderService extends Service {
        return null;
    }

    private void handleOnConnected(@NonNull IBinder callback) {
        mServiceCallback = ISelectionToolbarRenderServiceCallback.Stub.asInterface(callback);
    }

    protected void transferTouch(@NonNull IBinder source, @NonNull IBinder target) {
        final ISelectionToolbarRenderServiceCallback callback = mServiceCallback;
        if (callback == null) {
@@ -180,22 +164,26 @@ public abstract class SelectionToolbarRenderService extends Service {
    /**
     * Called when showing the selection toolbar.
     */
    @GuardedBy("mLock")
    public abstract void onShow(int uid, ShowInfo showInfo,
            RemoteCallbackWrapper callbackWrapper);

    /**
     * Called when hiding the selection toolbar.
     */
    @GuardedBy("mLock")
    public abstract void onHide(int uid);

    /**
     * Called when dismissing the selection toolbar.
     */
    @GuardedBy("mLock")
    public abstract void onDismiss(int uid);

    /**
     * Called when the client process dies.
     */
    @GuardedBy("mLock")
    public abstract void onUidDied(int uid);

    /**
+5 −9
Original line number Diff line number Diff line
@@ -29,11 +29,7 @@ class SysUiSelectionToolbarRenderService : SelectionToolbarRenderService() {
    // Only show one toolbar, dismiss the old ones and remove from cache
    private val toolbarCache = mutableMapOf<Int, RemoteSelectionToolbar>()

    override fun onShow(
        uid: Int,
        showInfo: ShowInfo,
        callbackWrapper: RemoteCallbackWrapper,
    ) {
    override fun onShow(uid: Int, showInfo: ShowInfo, callbackWrapper: RemoteCallbackWrapper) {
        val existingToolbar = toolbarCache[uid]
        // Only allow one package to create one toolbar
        if (existingToolbar != null) {
@@ -51,7 +47,7 @@ class SysUiSelectionToolbarRenderService : SelectionToolbarRenderService() {
                ::onPasteAction,
            )
        toolbarCache[uid] = toolbar
        toolbar.show(showInfo)
        mainThreadHandler.post { toolbar.show(showInfo) }

        Slog.v(TAG, "onShow() for uid: $uid")
    }
@@ -60,7 +56,7 @@ class SysUiSelectionToolbarRenderService : SelectionToolbarRenderService() {
        val toolbar = toolbarCache[uid]
        if (toolbar != null) {
            Slog.v(TAG, "onHide() for uid: $uid")
            toolbar.hide(uid)
            mainThreadHandler.post { toolbar.hide(uid) }
        }
    }

@@ -72,8 +68,8 @@ class SysUiSelectionToolbarRenderService : SelectionToolbarRenderService() {
    private fun removeAndDismissToolbar(uid: Int) {
        val toolbar = toolbarCache[uid]
        if (toolbar != null) {
            toolbar.dismiss(uid)
            toolbarCache.remove(uid)
            mainThreadHandler.post { toolbar.dismiss(uid) }
            toolbarCache -= uid
        }
    }