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

Commit a4ceea02 authored by Bryce Lee's avatar Bryce Lee Committed by brycelee
Browse files

DO NOT MERGE Remove orientation restriction to only fullscreen activities.

This changelist removes checks that enforce that only fullscreen,
opaque activities may request orientation changes. An application
may itself be compatible with the change and update their SDK level.
However, it is possible they use a library that has not itself been
updated and still leverages this feature for non-fullscreen
activities.

Fixes: 68684796
Test: bit FrameworksServicesTests:com.android.server.wm.AppWindowTokenTests

Change-Id: I75bbda96b132694c722b0b535e33ea5e1b9a55db
parent f8fdb06c
Loading
Loading
Loading
Loading
+0 −14
Original line number Original line Diff line number Diff line
@@ -16,8 +16,6 @@


package android.app;
package android.app;


import static android.os.Build.VERSION_CODES.O;

import static java.lang.Character.MIN_VALUE;
import static java.lang.Character.MIN_VALUE;


import android.annotation.CallSuper;
import android.annotation.CallSuper;
@@ -976,18 +974,6 @@ public class Activity extends ContextThemeWrapper
    @CallSuper
    @CallSuper
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);

        if (getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation()) {
            final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
            final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
            ta.recycle();

            if (isTranslucentOrFloating) {
                throw new IllegalStateException(
                        "Only fullscreen opaque activities can request orientation");
            }
        }

        if (mLastNonConfigurationInstances != null) {
        if (mLastNonConfigurationInstances != null) {
            mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);
            mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);
        }
        }
+2 −29
Original line number Original line Diff line number Diff line
@@ -20,7 +20,6 @@ import android.annotation.IntDef;
import android.content.Intent;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Configuration.NativeConfig;
import android.content.res.Configuration.NativeConfig;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.util.Printer;
import android.util.Printer;
@@ -439,6 +438,7 @@ public class ActivityInfo extends ComponentInfo
     * @hide
     * @hide
     */
     */
    public static final int FLAG_SUPPORTS_PICTURE_IN_PICTURE = 0x400000;
    public static final int FLAG_SUPPORTS_PICTURE_IN_PICTURE = 0x400000;

    /**
    /**
     * @hide Bit in {@link #flags}: If set, this component will only be seen
     * @hide Bit in {@link #flags}: If set, this component will only be seen
     * by the system user.  Only works with broadcast receivers.  Set from the
     * by the system user.  Only works with broadcast receivers.  Set from the
@@ -976,19 +976,11 @@ public class ActivityInfo extends ComponentInfo
     * Returns true if the activity's orientation is fixed.
     * Returns true if the activity's orientation is fixed.
     * @hide
     * @hide
     */
     */
    public boolean isFixedOrientation() {
    boolean isFixedOrientation() {
        return isFixedOrientationLandscape() || isFixedOrientationPortrait()
        return isFixedOrientationLandscape() || isFixedOrientationPortrait()
                || screenOrientation == SCREEN_ORIENTATION_LOCKED;
                || screenOrientation == SCREEN_ORIENTATION_LOCKED;
    }
    }


    /**
     * Returns true if the specified orientation is considered fixed.
     * @hide
     */
    static public boolean isFixedOrientation(int orientation) {
        return isFixedOrientationLandscape(orientation) || isFixedOrientationPortrait(orientation);
    }

    /**
    /**
     * Returns true if the activity's orientation is fixed to landscape.
     * Returns true if the activity's orientation is fixed to landscape.
     * @hide
     * @hide
@@ -1168,25 +1160,6 @@ public class ActivityInfo extends ComponentInfo
        dest.writeFloat(maxAspectRatio);
        dest.writeFloat(maxAspectRatio);
    }
    }


    /**
     * Determines whether the {@link Activity} is considered translucent or floating.
     * @hide
     */
    public static boolean isTranslucentOrFloating(TypedArray attributes) {
        final boolean isTranslucent =
                attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent,
                        false);
        final boolean isSwipeToDismiss = !attributes.hasValue(
                com.android.internal.R.styleable.Window_windowIsTranslucent)
                && attributes.getBoolean(
                        com.android.internal.R.styleable.Window_windowSwipeToDismiss, false);
        final boolean isFloating =
                attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating,
                        false);

        return isFloating || isTranslucent || isSwipeToDismiss;
    }

    public static final Parcelable.Creator<ActivityInfo> CREATOR
    public static final Parcelable.Creator<ActivityInfo> CREATOR
            = new Parcelable.Creator<ActivityInfo>() {
            = new Parcelable.Creator<ActivityInfo>() {
        public ActivityInfo createFromParcel(Parcel source) {
        public ActivityInfo createFromParcel(Parcel source) {
+9 −7
Original line number Original line Diff line number Diff line
@@ -133,7 +133,6 @@ import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap;
import android.graphics.GraphicBuffer;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Debug;
import android.os.Debug;
import android.os.IBinder;
import android.os.IBinder;
@@ -897,7 +896,15 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo


        Entry ent = AttributeCache.instance().get(packageName,
        Entry ent = AttributeCache.instance().get(packageName,
                realTheme, com.android.internal.R.styleable.Window, userId);
                realTheme, com.android.internal.R.styleable.Window, userId);
        fullscreen = ent != null && !ActivityInfo.isTranslucentOrFloating(ent.array);
        final boolean translucent = ent != null && (ent.array.getBoolean(
                com.android.internal.R.styleable.Window_windowIsTranslucent, false)
                || (!ent.array.hasValue(
                        com.android.internal.R.styleable.Window_windowIsTranslucent)
                        && ent.array.getBoolean(
                                com.android.internal.R.styleable.Window_windowSwipeToDismiss,
                                        false)));
        fullscreen = ent != null && !ent.array.getBoolean(
                com.android.internal.R.styleable.Window_windowIsFloating, false) && !translucent;
        noDisplay = ent != null && ent.array.getBoolean(
        noDisplay = ent != null && ent.array.getBoolean(
                com.android.internal.R.styleable.Window_windowNoDisplay, false);
                com.android.internal.R.styleable.Window_windowNoDisplay, false);


@@ -2195,11 +2202,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
    }
    }


    void setRequestedOrientation(int requestedOrientation) {
    void setRequestedOrientation(int requestedOrientation) {
        if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen
                && appInfo.targetSdkVersion > O) {
            throw new IllegalStateException("Only fullscreen activities can request orientation");
        }

        final int displayId = getDisplayId();
        final int displayId = getDisplayId();
        final Configuration displayConfig =
        final Configuration displayConfig =
                mStackSupervisor.getDisplayOverrideConfiguration(displayId);
                mStackSupervisor.getDisplayOverrideConfiguration(displayId);
+0 −11
Original line number Original line Diff line number Diff line
@@ -72,8 +72,6 @@ import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.ArrayList;


import static android.os.Build.VERSION_CODES.O;

class AppTokenList extends ArrayList<AppWindowToken> {
class AppTokenList extends ArrayList<AppWindowToken> {
}
}


@@ -1293,15 +1291,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
     */
     */
    @Override
    @Override
    int getOrientation(int candidate) {
    int getOrientation(int candidate) {
        // We do not allow non-fullscreen apps to influence orientation beyond O. While we do
        // throw an exception in {@link Activity#onCreate} and
        // {@link Activity#setRequestedOrientation}, we also ignore the orientation here so that
        // other calculations aren't affected.
        if (!fillsParent() && mTargetSdk > O) {
            // Can't specify orientation if app doesn't fill parent.
            return SCREEN_ORIENTATION_UNSET;
        }

        if (candidate == SCREEN_ORIENTATION_BEHIND) {
        if (candidate == SCREEN_ORIENTATION_BEHIND) {
            // Allow app to specify orientation regardless of its visibility state if the current
            // Allow app to specify orientation regardless of its visibility state if the current
            // candidate want us to use orientation behind. I.e. the visible app on-top of this one
            // candidate want us to use orientation behind. I.e. the visible app on-top of this one
+1 −1
Original line number Original line Diff line number Diff line
@@ -175,7 +175,7 @@ public class AppWindowTokenTests extends WindowTestsBase {
        token.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
        token.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);


        token.setFillsParent(false);
        token.setFillsParent(false);
        // Can specify orientation if app doesn't fill parent. Allowed for SDK <= 25.
        // Can specify orientation if app doesn't fill parent.
        assertEquals(SCREEN_ORIENTATION_LANDSCAPE, token.getOrientation());
        assertEquals(SCREEN_ORIENTATION_LANDSCAPE, token.getOrientation());


        token.setFillsParent(true);
        token.setFillsParent(true);