Merge "Don't send configuration that app doesn't support to it." into oc-dev

am: 22c1275c89

Change-Id: Ib7b3b945c476fae59800421c6075397d8bb6352c
This commit is contained in:
Wale Ogunwale
2017-05-02 14:06:01 +00:00
committed by android-build-merger
2 changed files with 73 additions and 16 deletions

View File

@@ -988,10 +988,18 @@ public class ActivityInfo extends ComponentInfo
* @hide * @hide
*/ */
boolean isFixedOrientationLandscape() { boolean isFixedOrientationLandscape() {
return screenOrientation == SCREEN_ORIENTATION_LANDSCAPE return isFixedOrientationLandscape(screenOrientation);
|| screenOrientation == SCREEN_ORIENTATION_SENSOR_LANDSCAPE }
|| screenOrientation == SCREEN_ORIENTATION_REVERSE_LANDSCAPE
|| screenOrientation == SCREEN_ORIENTATION_USER_LANDSCAPE; /**
* Returns true if the activity's orientation is fixed to landscape.
* @hide
*/
public static boolean isFixedOrientationLandscape(@ScreenOrientation int orientation) {
return orientation == SCREEN_ORIENTATION_LANDSCAPE
|| orientation == SCREEN_ORIENTATION_SENSOR_LANDSCAPE
|| orientation == SCREEN_ORIENTATION_REVERSE_LANDSCAPE
|| orientation == SCREEN_ORIENTATION_USER_LANDSCAPE;
} }
/** /**
@@ -999,10 +1007,18 @@ public class ActivityInfo extends ComponentInfo
* @hide * @hide
*/ */
boolean isFixedOrientationPortrait() { boolean isFixedOrientationPortrait() {
return screenOrientation == SCREEN_ORIENTATION_PORTRAIT return isFixedOrientationPortrait(screenOrientation);
|| screenOrientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT }
|| screenOrientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
|| screenOrientation == SCREEN_ORIENTATION_USER_PORTRAIT; /**
* Returns true if the activity's orientation is fixed to portrait.
* @hide
*/
public static boolean isFixedOrientationPortrait(@ScreenOrientation int orientation) {
return orientation == SCREEN_ORIENTATION_PORTRAIT
|| orientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
|| orientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
|| orientation == SCREEN_ORIENTATION_USER_PORTRAIT;
} }
/** /**

View File

@@ -61,6 +61,8 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION; import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ActivityInfo.isFixedOrientationLandscape;
import static android.content.pm.ActivityInfo.isFixedOrientationPortrait;
import static android.content.res.Configuration.EMPTY; import static android.content.res.Configuration.EMPTY;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
@@ -2222,15 +2224,19 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
} }
@Override @Override
void onOverrideConfigurationChanged(Configuration overrideConfiguration) { void onOverrideConfigurationChanged(Configuration newConfig) {
super.onOverrideConfigurationChanged(overrideConfiguration); final Configuration currentConfig = getOverrideConfiguration();
if (mWindowContainerController != null) { if (currentConfig.equals(newConfig)) {
mWindowContainerController.onOverrideConfigurationChanged( return;
overrideConfiguration, mBounds);
// TODO(b/36505427): Can we consolidate the call points of onOverrideConfigurationSent()
// to just use this method instead?
onOverrideConfigurationSent();
} }
super.onOverrideConfigurationChanged(newConfig);
if (mWindowContainerController == null) {
return;
}
mWindowContainerController.onOverrideConfigurationChanged(newConfig, mBounds);
// TODO(b/36505427): Can we consolidate the call points of onOverrideConfigurationSent()
// to just use this method instead?
onOverrideConfigurationSent();
} }
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
@@ -2238,6 +2244,26 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
mTmpConfig.unset(); mTmpConfig.unset();
computeBounds(mTmpBounds); computeBounds(mTmpBounds);
if (mTmpBounds.equals(mBounds)) { if (mTmpBounds.equals(mBounds)) {
final ActivityStack stack = getStack();
if (!mBounds.isEmpty() || task == null || stack == null || !task.mFullscreen) {
// We don't want to influence the override configuration here if our task is in
// multi-window mode or there is a bounds specified to calculate the override
// config. In both of this cases the app should be compatible with whatever the
// current configuration is or will be.
return;
}
// Currently limited to the top activity for now to avoid situations where non-top
// visible activity and top might have conflicting requests putting the non-top activity
// windows in an odd state.
final ActivityRecord top = mStackSupervisor.topRunningActivityLocked();
final Configuration parentConfig = getParent().getConfiguration();
if (top != this || isConfigurationCompatible(parentConfig)) {
onOverrideConfigurationChanged(mTmpConfig);
} else if (isConfigurationCompatible(
mLastReportedConfiguration.getMergedConfiguration())) {
onOverrideConfigurationChanged(mLastReportedConfiguration.getMergedConfiguration());
}
return; return;
} }
@@ -2250,6 +2276,21 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
onOverrideConfigurationChanged(mTmpConfig); onOverrideConfigurationChanged(mTmpConfig);
} }
/** Returns true if the configuration is compatible with this activity. */
private boolean isConfigurationCompatible(Configuration config) {
final int orientation = mWindowContainerController != null
? mWindowContainerController.getOrientation() : info.screenOrientation;
if (isFixedOrientationPortrait(orientation)
&& config.orientation != ORIENTATION_PORTRAIT) {
return false;
}
if (isFixedOrientationLandscape(orientation)
&& config.orientation != ORIENTATION_LANDSCAPE) {
return false;
}
return true;
}
/** /**
* Computes the bounds to fit the Activity within the bounds of the {@link Configuration}. * Computes the bounds to fit the Activity within the bounds of the {@link Configuration}.
*/ */