Loading core/java/android/service/selectiontoolbar/SelectionToolbarRenderService.java +27 −39 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. * Loading @@ -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. Loading @@ -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); Loading @@ -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) { Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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); /** Loading packages/SystemUI/src/com/android/systemui/selectiontoolbar/app/service/SysUiSelectionToolbarRenderService.kt +5 −9 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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") } Loading @@ -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) } } } Loading @@ -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 } } Loading Loading
core/java/android/service/selectiontoolbar/SelectionToolbarRenderService.java +27 −39 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. * Loading @@ -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. Loading @@ -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); Loading @@ -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) { Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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); /** Loading
packages/SystemUI/src/com/android/systemui/selectiontoolbar/app/service/SysUiSelectionToolbarRenderService.kt +5 −9 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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") } Loading @@ -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) } } } Loading @@ -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 } } Loading