diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index fb3acbe79114d..a5b2b853fddd6 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5035,8 +5035,8 @@
Rotate for a better view
- Exit split screen for a better view
+ to display the camera preview correctly while in multi-window. [CHAR LIMIT=NONE] -->
+ Open %s in full screen for a better view
Done
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6ab671a70c3c6..a8518afd7d3dd 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2533,7 +2533,7 @@
-
+
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index e4defcfa359f8..93e44f1d2f871 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -1813,6 +1813,12 @@
"group": "WM_DEBUG_KEEP_SCREEN_ON",
"at": "com\/android\/server\/wm\/RootWindowContainer.java"
},
+ "-479665533": {
+ "message": "DisplayRotationCompatPolicy: Multi-window toast not shown as package '%s' cannot be found.",
+ "level": "ERROR",
+ "group": "WM_DEBUG_ORIENTATION",
+ "at": "com\/android\/server\/wm\/DisplayRotationCompatPolicy.java"
+ },
"-464564167": {
"message": "Current transition prevents automatic focus change",
"level": "VERBOSE",
diff --git a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
index 1fbf59301191e..2b34bb22729dc 100644
--- a/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java
@@ -42,6 +42,7 @@ import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.RefreshCallbackItem;
import android.app.servertransaction.ResumeActivityItem;
import android.content.pm.ActivityInfo.ScreenOrientation;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.hardware.camera2.CameraManager;
import android.os.Handler;
@@ -423,7 +424,18 @@ final class DisplayRotationCompatPolicy {
// for the activity embedding case.
if (topActivity.getTask().getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW
&& isTreatmentEnabledForActivity(topActivity, /* mustBeFullscreen */ false)) {
- showToast(R.string.display_rotation_camera_compat_toast_in_split_screen);
+ final PackageManager packageManager = mWmService.mContext.getPackageManager();
+ try {
+ showToast(
+ R.string.display_rotation_camera_compat_toast_in_multi_window,
+ (String) packageManager.getApplicationLabel(
+ packageManager.getApplicationInfo(packageName, /* flags */ 0)));
+ } catch (PackageManager.NameNotFoundException e) {
+ ProtoLog.e(WM_DEBUG_ORIENTATION,
+ "DisplayRotationCompatPolicy: Multi-window toast not shown as "
+ + "package '%s' cannot be found.",
+ packageName);
+ }
}
}
}
@@ -434,6 +446,15 @@ final class DisplayRotationCompatPolicy {
() -> Toast.makeText(mWmService.mContext, stringRes, Toast.LENGTH_LONG).show());
}
+ @VisibleForTesting
+ void showToast(@StringRes int stringRes, @NonNull String applicationLabel) {
+ UiThread.getHandler().post(
+ () -> Toast.makeText(
+ mWmService.mContext,
+ mWmService.mContext.getString(stringRes, applicationLabel),
+ Toast.LENGTH_LONG).show());
+ }
+
private synchronized void notifyCameraClosed(@NonNull String cameraId) {
ProtoLog.v(WM_DEBUG_ORIENTATION,
"Display id=%d is notified that Camera %s is closed, scheduling rotation update.",
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java
index 3ca35ef7cc26f..8e015d4d228da 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java
@@ -40,7 +40,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -51,6 +53,8 @@ import android.app.servertransaction.RefreshCallbackItem;
import android.app.servertransaction.ResumeActivityItem;
import android.content.ComponentName;
import android.content.pm.ActivityInfo.ScreenOrientation;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Configuration.Orientation;
import android.hardware.camera2.CameraManager;
@@ -84,7 +88,7 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase {
private static final String TEST_PACKAGE_2 = "com.test.package.two";
private static final String CAMERA_ID_1 = "camera-1";
private static final String CAMERA_ID_2 = "camera-2";
-
+ private static final String TEST_PACKAGE_1_LABEL = "testPackage1";
private CameraManager mMockCameraManager;
private Handler mMockHandler;
private LetterboxConfiguration mLetterboxConfiguration;
@@ -133,17 +137,27 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase {
}
@Test
- public void testOpenedCameraInSplitScreen_showToast() {
+ public void testOpenedCameraInSplitScreen_showToast() throws Exception {
configureActivity(SCREEN_ORIENTATION_PORTRAIT);
spyOn(mTask);
spyOn(mDisplayRotationCompatPolicy);
doReturn(WINDOWING_MODE_MULTI_WINDOW).when(mActivity).getWindowingMode();
doReturn(WINDOWING_MODE_MULTI_WINDOW).when(mTask).getWindowingMode();
+ final PackageManager mockPackageManager = mock(PackageManager.class);
+ final ApplicationInfo mockApplicationInfo = mock(ApplicationInfo.class);
+ when(mContext.getPackageManager()).thenReturn(mockPackageManager);
+ when(mockPackageManager.getApplicationInfo(anyString(), anyInt()))
+ .thenReturn(mockApplicationInfo);
+
+ doReturn(TEST_PACKAGE_1_LABEL).when(mockPackageManager)
+ .getApplicationLabel(mockApplicationInfo);
+
mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
verify(mDisplayRotationCompatPolicy).showToast(
- R.string.display_rotation_camera_compat_toast_in_split_screen);
+ R.string.display_rotation_camera_compat_toast_in_multi_window,
+ TEST_PACKAGE_1_LABEL);
}
@Test
@@ -157,7 +171,8 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase {
mCameraAvailabilityCallback.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
verify(mDisplayRotationCompatPolicy, never()).showToast(
- R.string.display_rotation_camera_compat_toast_in_split_screen);
+ R.string.display_rotation_camera_compat_toast_in_multi_window,
+ TEST_PACKAGE_1_LABEL);
}
@Test