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

Commit 53ce386c authored by Winson Chung's avatar Winson Chung
Browse files

Ensure the current controller when handling a remote call in the Shell

- Move executeRemoteCallWithTaskPermission() to the ExternalInterface
  class which is the only case in which it's needed
- Fix a few cases where we aren't unregistering the listener when
  invalidating an external interface
- Remove some dead code

Bug: 343544451
Test: atest WMShellUnitTests
Change-Id: I88c1d4e63311602a01060bd036e6a899e9ab9e04
parent 0df08188
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.wm.shell.back;


import static com.android.internal.jank.InteractionJankMonitor.CUJ_PREDICTIVE_BACK_HOME;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_PREDICTIVE_BACK_HOME;
import static com.android.window.flags.Flags.predictiveBackSystemAnims;
import static com.android.window.flags.Flags.predictiveBackSystemAnims;
import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BACK_PREVIEW;
import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BACK_PREVIEW;
import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_BACK_ANIMATION;
import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_BACK_ANIMATION;


+3 −12
Original line number Original line Diff line number Diff line
@@ -518,7 +518,7 @@ public class BubbleController implements ConfigurationChangeListener,
    }
    }


    private ExternalInterfaceBinder createExternalInterface() {
    private ExternalInterfaceBinder createExternalInterface() {
        return new BubbleController.IBubblesImpl(this);
        return new IBubblesImpl(this);
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -2354,6 +2354,8 @@ public class BubbleController implements ConfigurationChangeListener,
        @Override
        @Override
        public void invalidate() {
        public void invalidate() {
            mController = null;
            mController = null;
            // Unregister the listeners to ensure any binder death recipients are unlinked
            mListener.unregister();
        }
        }


        @Override
        @Override
@@ -2531,17 +2533,6 @@ public class BubbleController implements ConfigurationChangeListener,


        private CachedState mCachedState = new CachedState();
        private CachedState mCachedState = new CachedState();


        private IBubblesImpl mIBubbles;

        @Override
        public IBubbles createExternalInterface() {
            if (mIBubbles != null) {
                mIBubbles.invalidate();
            }
            mIBubbles = new IBubblesImpl(BubbleController.this);
            return mIBubbles;
        }

        @Override
        @Override
        public boolean isBubbleNotificationSuppressedFromShade(String key, String groupKey) {
        public boolean isBubbleNotificationSuppressedFromShade(String key, String groupKey) {
            return mCachedState.isBubbleNotificationSuppressedFromShade(key, groupKey);
            return mCachedState.isBubbleNotificationSuppressedFromShade(key, groupKey);
+0 −64
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.common;

import android.Manifest;
import android.util.Slog;

import java.util.function.Consumer;

/**
 * Helpers for working with executors
 */
public class ExecutorUtils {

    /**
     * Checks that the caller has the MANAGE_ACTIVITY_TASKS permission and executes the given
     * callback.
     */
    public static <T> void executeRemoteCallWithTaskPermission(RemoteCallable<T> controllerInstance,
            String log, Consumer<T> callback) {
        executeRemoteCallWithTaskPermission(controllerInstance, log, callback,
                false /* blocking */);
    }

    /**
     * Checks that the caller has the MANAGE_ACTIVITY_TASKS permission and executes the given
     * callback.
     */
    public static <T> void executeRemoteCallWithTaskPermission(RemoteCallable<T> controllerInstance,
            String log, Consumer<T> callback, boolean blocking) {
        if (controllerInstance == null) return;

        final RemoteCallable<T> controller = controllerInstance;
        controllerInstance.getContext().enforceCallingPermission(
                Manifest.permission.MANAGE_ACTIVITY_TASKS, log);
        if (blocking) {
            try {
                controllerInstance.getRemoteCallExecutor().executeBlocking(() -> {
                    callback.accept((T) controller);
                });
            } catch (InterruptedException e) {
                Slog.e("ExecutorUtils", "Remote call failed", e);
            }
        } else {
            controllerInstance.getRemoteCallExecutor().execute(() -> {
                callback.accept((T) controller);
            });
        }
    }
}
+40 −0
Original line number Original line Diff line number Diff line
@@ -16,7 +16,11 @@


package com.android.wm.shell.common;
package com.android.wm.shell.common;


import android.Manifest;
import android.os.IBinder;
import android.os.IBinder;
import android.util.Slog;

import java.util.function.Consumer;


/**
/**
 * An interface for binders which can be registered to be sent to other processes.
 * An interface for binders which can be registered to be sent to other processes.
@@ -31,4 +35,40 @@ public interface ExternalInterfaceBinder {
     * Returns the IBinder to send.
     * Returns the IBinder to send.
     */
     */
    IBinder asBinder();
    IBinder asBinder();

    /**
     * Checks that the caller has the MANAGE_ACTIVITY_TASKS permission and executes the given
     * callback.
     */
    default <T> void executeRemoteCallWithTaskPermission(RemoteCallable<T> controllerInstance,
            String log, Consumer<T> callback) {
        executeRemoteCallWithTaskPermission(controllerInstance, log, callback,
                false /* blocking */);
    }

    /**
     * Checks that the caller has the MANAGE_ACTIVITY_TASKS permission and executes the given
     * callback.
     */
    default <T> void executeRemoteCallWithTaskPermission(RemoteCallable<T> controllerInstance,
            String log, Consumer<T> callback, boolean blocking) {
        if (controllerInstance == null) return;

        final RemoteCallable<T> controller = controllerInstance;
        controllerInstance.getContext().enforceCallingPermission(
                Manifest.permission.MANAGE_ACTIVITY_TASKS, log);
        if (blocking) {
            try {
                controllerInstance.getRemoteCallExecutor().executeBlocking(() -> {
                    callback.accept((T) controller);
                });
            } catch (InterruptedException e) {
                Slog.e("ExternalInterfaceBinder", "Remote call failed", e);
            }
        } else {
            controllerInstance.getRemoteCallExecutor().execute(() -> {
                callback.accept((T) controller);
            });
        }
    }
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -19,7 +19,7 @@ package com.android.wm.shell.common;
import android.content.Context;
import android.content.Context;


/**
/**
 * An interface for controllers that can receive remote calls.
 * An interface for controllers (of type T) that can receive remote calls.
 */
 */
public interface RemoteCallable<T> {
public interface RemoteCallable<T> {
    /**
    /**
Loading