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

Commit 7cebec66 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Don't post work for SelectionToolbarRenderService on main thread" into main

parents 4195a9f9 8a3a5875
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
        }
    }