Merge "DO NOT MERGE Remove orientation restriction to only fullscreen activities."

This commit is contained in:
brycelee
2017-11-13 23:21:09 +00:00
committed by Gerrit Code Review
5 changed files with 12 additions and 62 deletions

View File

@@ -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);
} }

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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

View File

@@ -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);