Loading services/core/java/com/android/server/wm/ActivityRecord.java +7 −0 Original line number Diff line number Diff line Loading @@ -2508,6 +2508,13 @@ final class ActivityRecord extends ConfigurationContainer { final IBinder binder = (freezeScreenIfNeeded && appToken != null) ? appToken.asBinder() : null; mAppWindowToken.setOrientation(requestedOrientation, binder, this); // Push the new configuration to the requested app in case where it's not pushed, e.g. when // the request is handled at task level with letterbox. if (!getMergedOverrideConfiguration().equals( mLastReportedConfiguration.getMergedConfiguration())) { ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */); } } int getOrientation() { Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +43 −0 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ package com.android.server.wm; import static android.view.Display.DEFAULT_DISPLAY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; Loading @@ -39,6 +41,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.app.ActivityOptions; import android.app.servertransaction.ActivityConfigurationChangeItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.PauseActivityItem; import android.content.pm.ActivityInfo; Loading Loading @@ -320,4 +323,44 @@ public class ActivityRecordTests extends ActivityTestsBase { assertEquals(ActivityTaskManagerService.RELAUNCH_REASON_NONE, mActivity.mRelaunchReason); } @Test public void testSetRequestedOrientationUpdatesConfiguration() throws Exception { mActivity.setState(ActivityStack.ActivityState.RESUMED, "Testing"); mTask.onRequestedOverrideConfigurationChanged(mTask.getConfiguration()); mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(), mActivity.getConfiguration())); mActivity.info.configChanges |= ActivityInfo.CONFIG_ORIENTATION; final Configuration newConfig = new Configuration(mActivity.getConfiguration()); newConfig.orientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT; // Mimic the behavior that display doesn't handle app's requested orientation. doAnswer(invocation -> { mTask.onConfigurationChanged(newConfig); return null; }).when(mActivity.mAppWindowToken).setOrientation(anyInt(), any(), any()); final int requestedOrientation; switch (newConfig.orientation) { case Configuration.ORIENTATION_LANDSCAPE: requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Configuration.ORIENTATION_PORTRAIT: requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; default: throw new IllegalStateException("Orientation in new config should be either" + "landscape or portrait."); } mActivity.setRequestedOrientation(requestedOrientation); final ActivityConfigurationChangeItem expected = ActivityConfigurationChangeItem.obtain(newConfig); verify(mService.getLifecycleManager()).scheduleTransaction(eq(mActivity.app.getThread()), eq(mActivity.appToken), eq(expected)); } } Loading
services/core/java/com/android/server/wm/ActivityRecord.java +7 −0 Original line number Diff line number Diff line Loading @@ -2508,6 +2508,13 @@ final class ActivityRecord extends ConfigurationContainer { final IBinder binder = (freezeScreenIfNeeded && appToken != null) ? appToken.asBinder() : null; mAppWindowToken.setOrientation(requestedOrientation, binder, this); // Push the new configuration to the requested app in case where it's not pushed, e.g. when // the request is handled at task level with letterbox. if (!getMergedOverrideConfiguration().equals( mLastReportedConfiguration.getMergedConfiguration())) { ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */); } } int getOrientation() { Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +43 −0 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ package com.android.server.wm; import static android.view.Display.DEFAULT_DISPLAY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; Loading @@ -39,6 +41,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.app.ActivityOptions; import android.app.servertransaction.ActivityConfigurationChangeItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.PauseActivityItem; import android.content.pm.ActivityInfo; Loading Loading @@ -320,4 +323,44 @@ public class ActivityRecordTests extends ActivityTestsBase { assertEquals(ActivityTaskManagerService.RELAUNCH_REASON_NONE, mActivity.mRelaunchReason); } @Test public void testSetRequestedOrientationUpdatesConfiguration() throws Exception { mActivity.setState(ActivityStack.ActivityState.RESUMED, "Testing"); mTask.onRequestedOverrideConfigurationChanged(mTask.getConfiguration()); mActivity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(), mActivity.getConfiguration())); mActivity.info.configChanges |= ActivityInfo.CONFIG_ORIENTATION; final Configuration newConfig = new Configuration(mActivity.getConfiguration()); newConfig.orientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT; // Mimic the behavior that display doesn't handle app's requested orientation. doAnswer(invocation -> { mTask.onConfigurationChanged(newConfig); return null; }).when(mActivity.mAppWindowToken).setOrientation(anyInt(), any(), any()); final int requestedOrientation; switch (newConfig.orientation) { case Configuration.ORIENTATION_LANDSCAPE: requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Configuration.ORIENTATION_PORTRAIT: requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; default: throw new IllegalStateException("Orientation in new config should be either" + "landscape or portrait."); } mActivity.setRequestedOrientation(requestedOrientation); final ActivityConfigurationChangeItem expected = ActivityConfigurationChangeItem.obtain(newConfig); verify(mService.getLifecycleManager()).scheduleTransaction(eq(mActivity.app.getThread()), eq(mActivity.appToken), eq(expected)); } }