Merge "DO NOT MERGE Remove orientation restriction to only fullscreen activities."
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user