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

Commit 6853a861 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Merge "Force Kids app to use LANDSCAPE when in REVERSE_LANDSCAPE" into...

Merge "Merge "Force Kids app to use LANDSCAPE when in REVERSE_LANDSCAPE" into tm-qpr-dev am: 4ad16867 am: 2e27a9c9" into udc-dev am: 81333e87

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21798742



Change-Id: Ibb985f891150d985a1a162a2bd2265698d07bc34
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents fabb48cb 81333e87
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -73,11 +73,17 @@ interface ITaskOrganizerController {


    /**
    /**
     * Controls whether ignore orientation request logic in {@link
     * Controls whether ignore orientation request logic in {@link
     * com.android.server.wm.DisplayArea} is disabled at runtime.
     * com.android.server.wm.DisplayArea} is disabled at runtime and how to optionally map some
     * requested orientations to others.
     *
     *
     * @param isDisabled when {@code true}, the system always ignores the value of {@link
     * @param isDisabled when {@code true}, the system always ignores the value of {@link
     *                   com.android.server.wm.DisplayArea#getIgnoreOrientationRequest} and app
     *                   com.android.server.wm.DisplayArea#getIgnoreOrientationRequest} and app
     *                   requested orientation is respected.
     *                   requested orientation is respected.
     * @param fromOrientations The orientations we want to map to the correspondent orientations
     *                        in toOrientation.
     * @param toOrientations The orientations we map to the ones in fromOrientations at the same
     *                       index
     */
     */
     void setIsIgnoreOrientationRequestDisabled(boolean isDisabled);
     void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
            in int[] fromOrientations, in int[] toOrientations);
}
}
+13 −6
Original line number Original line Diff line number Diff line
@@ -267,17 +267,24 @@ public class TaskOrganizer extends WindowOrganizer {


    /**
    /**
     * Controls whether ignore orientation request logic in {@link
     * Controls whether ignore orientation request logic in {@link
     * com.android.server.wm.DisplayArea} is disabled at runtime.
     * com.android.server.wm.DisplayArea} is disabled at runtime and how to optionally map some
     * requested orientation to others.
     *
     *
     * @param isDisabled when {@code true}, the system always ignores the value of {@link
     * @param isIgnoreOrientationRequestDisabled when {@code true}, the system always ignores the
     *                   com.android.server.wm.DisplayArea#getIgnoreOrientationRequest} and app
     *           value of  {@link com.android.server.wm.DisplayArea#getIgnoreOrientationRequest}
     *                   requested orientation is respected.
     *           and app requested orientation is respected.
     * @param fromOrientations The orientations we want to map to the correspondent orientations
     *                        in toOrientation.
     * @param toOrientations The orientations we map to the ones in fromOrientations at the same
     *                       index
     * @hide
     * @hide
     */
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    public void setIsIgnoreOrientationRequestDisabled(boolean isDisabled) {
    public void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
            @Nullable int[] fromOrientations, @Nullable int[] toOrientations) {
        try {
        try {
            mTaskOrganizerController.setIsIgnoreOrientationRequestDisabled(isDisabled);
            mTaskOrganizerController.setOrientationRequestPolicy(isIgnoreOrientationRequestDisabled,
                    fromOrientations, toOrientations);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
+24 −2
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.DEFAULT_DISPLAY;


import android.app.ActivityManager;
import android.app.ActivityManager;
@@ -33,6 +35,7 @@ import android.graphics.Rect;
import android.os.Binder;
import android.os.Binder;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.view.Display;
import android.view.InsetsSource;
import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.InsetsState;
import android.view.SurfaceControl;
import android.view.SurfaceControl;
@@ -44,6 +47,7 @@ import android.window.WindowContainerTransaction;


import androidx.annotation.NonNull;
import androidx.annotation.NonNull;


import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
@@ -80,6 +84,12 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {
    private final DisplayController mDisplayController;
    private final DisplayController mDisplayController;
    private final DisplayInsetsController mDisplayInsetsController;
    private final DisplayInsetsController mDisplayInsetsController;


    /**
     * The value of the {@link R.bool.config_reverseDefaultRotation} property which defines how
     * {@link Display#getRotation} values are mapped to screen orientations
     */
    private final boolean mReverseDefaultRotationEnabled;

    @VisibleForTesting
    @VisibleForTesting
    ActivityManager.RunningTaskInfo mLaunchRootTask;
    ActivityManager.RunningTaskInfo mLaunchRootTask;
    @VisibleForTesting
    @VisibleForTesting
@@ -188,6 +198,8 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {
        mDisplayInsetsController = displayInsetsController;
        mDisplayInsetsController = displayInsetsController;
        mKidsModeSettingsObserver = kidsModeSettingsObserver;
        mKidsModeSettingsObserver = kidsModeSettingsObserver;
        shellInit.addInitCallback(this::onInit, this);
        shellInit.addInitCallback(this::onInit, this);
        mReverseDefaultRotationEnabled = context.getResources().getBoolean(
                R.bool.config_reverseDefaultRotation);
    }
    }


    public KidsModeTaskOrganizer(
    public KidsModeTaskOrganizer(
@@ -211,6 +223,8 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {
        mDisplayController = displayController;
        mDisplayController = displayController;
        mDisplayInsetsController = displayInsetsController;
        mDisplayInsetsController = displayInsetsController;
        shellInit.addInitCallback(this::onInit, this);
        shellInit.addInitCallback(this::onInit, this);
        mReverseDefaultRotationEnabled = context.getResources().getBoolean(
                R.bool.config_reverseDefaultRotation);
    }
    }


    /**
    /**
@@ -294,7 +308,14 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {
        // Needed since many Kids apps aren't optimised to support both orientations and it will be
        // Needed since many Kids apps aren't optimised to support both orientations and it will be
        // hard for kids to understand the app compat mode.
        // hard for kids to understand the app compat mode.
        // TODO(229961548): Remove ignoreOrientationRequest exception for Kids Mode once possible.
        // TODO(229961548): Remove ignoreOrientationRequest exception for Kids Mode once possible.
        setIsIgnoreOrientationRequestDisabled(true);
        if (mReverseDefaultRotationEnabled) {
            setOrientationRequestPolicy(/* isIgnoreOrientationRequestDisabled */ true,
                    /* fromOrientations */ new int[]{SCREEN_ORIENTATION_REVERSE_LANDSCAPE},
                    /* toOrientations */ new int[]{SCREEN_ORIENTATION_LANDSCAPE});
        } else {
            setOrientationRequestPolicy(/* isIgnoreOrientationRequestDisabled */ true,
                    /* fromOrientations */ null, /* toOrientations */ null);
        }
        final DisplayLayout displayLayout = mDisplayController.getDisplayLayout(DEFAULT_DISPLAY);
        final DisplayLayout displayLayout = mDisplayController.getDisplayLayout(DEFAULT_DISPLAY);
        if (displayLayout != null) {
        if (displayLayout != null) {
            mDisplayWidth = displayLayout.width();
            mDisplayWidth = displayLayout.width();
@@ -315,7 +336,8 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {


    @VisibleForTesting
    @VisibleForTesting
    void disable() {
    void disable() {
        setIsIgnoreOrientationRequestDisabled(false);
        setOrientationRequestPolicy(/* isIgnoreOrientationRequestDisabled */ false,
                /* fromOrientations */ null, /* toOrientations */ null);
        mDisplayInsetsController.removeInsetsChangedListener(DEFAULT_DISPLAY,
        mDisplayInsetsController.removeInsetsChangedListener(DEFAULT_DISPLAY,
                mOnInsetsChangedListener);
                mOnInsetsChangedListener);
        mDisplayController.removeDisplayWindowListener(mOnDisplaysChangedListener);
        mDisplayController.removeDisplayWindowListener(mOnDisplaysChangedListener);
+12 −5
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.verify;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.content.pm.ParceledListSlice;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.RemoteException;
@@ -77,6 +78,7 @@ public class KidsModeTaskOrganizerTest extends ShellTestCase {
    @Mock private ShellInit mShellInit;
    @Mock private ShellInit mShellInit;
    @Mock private ShellCommandHandler mShellCommandHandler;
    @Mock private ShellCommandHandler mShellCommandHandler;
    @Mock private DisplayInsetsController mDisplayInsetsController;
    @Mock private DisplayInsetsController mDisplayInsetsController;
    @Mock private Resources mResources;


    KidsModeTaskOrganizer mOrganizer;
    KidsModeTaskOrganizer mOrganizer;


@@ -89,10 +91,12 @@ public class KidsModeTaskOrganizerTest extends ShellTestCase {
        } catch (RemoteException e) {
        } catch (RemoteException e) {
        }
        }
        // NOTE: KidsModeTaskOrganizer should have a null CompatUIController.
        // NOTE: KidsModeTaskOrganizer should have a null CompatUIController.
        mOrganizer = spy(new KidsModeTaskOrganizer(mContext, mShellInit, mShellCommandHandler,
        doReturn(mResources).when(mContext).getResources();
                mTaskOrganizerController, mSyncTransactionQueue, mDisplayController,
        final KidsModeTaskOrganizer kidsModeTaskOrganizer = new KidsModeTaskOrganizer(mContext,
                mDisplayInsetsController, Optional.empty(), Optional.empty(), mObserver,
                mShellInit, mShellCommandHandler, mTaskOrganizerController, mSyncTransactionQueue,
                mTestExecutor, mHandler));
                mDisplayController, mDisplayInsetsController, Optional.empty(), Optional.empty(),
                mObserver, mTestExecutor, mHandler);
        mOrganizer = spy(kidsModeTaskOrganizer);
        doReturn(mTransaction).when(mOrganizer).getWindowContainerTransaction();
        doReturn(mTransaction).when(mOrganizer).getWindowContainerTransaction();
        doReturn(new InsetsState()).when(mDisplayController).getInsetsState(DEFAULT_DISPLAY);
        doReturn(new InsetsState()).when(mDisplayController).getInsetsState(DEFAULT_DISPLAY);
    }
    }
@@ -112,6 +116,8 @@ public class KidsModeTaskOrganizerTest extends ShellTestCase {
        verify(mOrganizer, times(1)).registerOrganizer();
        verify(mOrganizer, times(1)).registerOrganizer();
        verify(mOrganizer, times(1)).createRootTask(
        verify(mOrganizer, times(1)).createRootTask(
                eq(DEFAULT_DISPLAY), eq(WINDOWING_MODE_FULLSCREEN), eq(mOrganizer.mCookie));
                eq(DEFAULT_DISPLAY), eq(WINDOWING_MODE_FULLSCREEN), eq(mOrganizer.mCookie));
        verify(mOrganizer, times(1))
                .setOrientationRequestPolicy(eq(true), any(), any());


        final ActivityManager.RunningTaskInfo rootTask = createTaskInfo(12,
        final ActivityManager.RunningTaskInfo rootTask = createTaskInfo(12,
                WINDOWING_MODE_FULLSCREEN, mOrganizer.mCookie);
                WINDOWING_MODE_FULLSCREEN, mOrganizer.mCookie);
@@ -132,10 +138,11 @@ public class KidsModeTaskOrganizerTest extends ShellTestCase {
        doReturn(false).when(mObserver).isEnabled();
        doReturn(false).when(mObserver).isEnabled();
        mOrganizer.updateKidsModeState();
        mOrganizer.updateKidsModeState();



        verify(mOrganizer, times(1)).disable();
        verify(mOrganizer, times(1)).disable();
        verify(mOrganizer, times(1)).unregisterOrganizer();
        verify(mOrganizer, times(1)).unregisterOrganizer();
        verify(mOrganizer, times(1)).deleteRootTask(rootTask.token);
        verify(mOrganizer, times(1)).deleteRootTask(rootTask.token);
        verify(mOrganizer, times(1))
                .setOrientationRequestPolicy(eq(false), any(), any());
        assertThat(mOrganizer.mLaunchRootLeash).isNull();
        assertThat(mOrganizer.mLaunchRootLeash).isNull();
        assertThat(mOrganizer.mLaunchRootTask).isNull();
        assertThat(mOrganizer.mLaunchRootTask).isNull();
    }
    }
+4 −0
Original line number Original line Diff line number Diff line
@@ -447,6 +447,10 @@ final class LetterboxUiController {


    @ScreenOrientation
    @ScreenOrientation
    int overrideOrientationIfNeeded(@ScreenOrientation int candidate) {
    int overrideOrientationIfNeeded(@ScreenOrientation int candidate) {
        // In some cases (e.g. Kids app) we need to map the candidate orientation to some other
        // orientation.
        candidate = mActivityRecord.mWmService.mapOrientationRequest(candidate);

        if (FALSE.equals(mBooleanPropertyAllowOrientationOverride)) {
        if (FALSE.equals(mBooleanPropertyAllowOrientationOverride)) {
            return candidate;
            return candidate;
        }
        }
Loading