Merge "Add screenSize and smallestScreenSize to manifest" into tm-qpr-dev am: 66338519e8 am: c70bbdf032

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22198744

Change-Id: I452d19c56873435726fe3e155e4f0e7df326cf8b
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3dbaf16..09c62d0 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -932,7 +932,7 @@
                   android:showForAllUsers="true"
                   android:finishOnTaskLaunch="true"
                   android:launchMode="singleInstance"
-                  android:configChanges="screenLayout|keyboard|keyboardHidden|orientation"
+                  android:configChanges="screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|orientation"
                   android:visibleToInstantApps="true">
         </activity>
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt
index 224eb1c..c964b96 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt
@@ -47,7 +47,8 @@
  * destroyed on SCREEN_OFF events, due to issues with occluded activities over lockscreen as well as
  * user expectations for the activity to not continue running.
  */
-class ControlsActivity @Inject constructor(
+// Open for testing
+open class ControlsActivity @Inject constructor(
     private val uiController: ControlsUiController,
     private val broadcastDispatcher: BroadcastDispatcher,
     private val dreamManager: IDreamManager,
@@ -98,8 +99,11 @@
 
     override fun onConfigurationChanged(newConfig: Configuration) {
         super.onConfigurationChanged(newConfig)
-        if (lastConfiguration.diff(newConfig) and ActivityInfo.CONFIG_ORIENTATION != 0 ) {
-            uiController.onOrientationChange()
+        val interestingFlags = ActivityInfo.CONFIG_ORIENTATION or
+                ActivityInfo.CONFIG_SCREEN_SIZE or
+                ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE
+        if (lastConfiguration.diff(newConfig) and interestingFlags != 0 ) {
+            uiController.onSizeChange()
         }
         lastConfiguration = newConfig
     }
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
index 3ecf423..0cc4683 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
@@ -65,7 +65,7 @@
      */
     fun getPreferredSelectedItem(structures: List<StructureInfo>): SelectedItem
 
-    fun onOrientationChange()
+    fun onSizeChange()
 }
 
 sealed class SelectedItem {
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index 868e527..09ba373 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -809,7 +809,7 @@
         }
     }
 
-    override fun onOrientationChange() {
+    override fun onSizeChange() {
         selectionItem?.let {
             when (selectedItem) {
                 is SelectedItem.StructureItem -> createListView(it)
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index ce2d15f..29680d8 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -108,6 +108,11 @@
             android:excludeFromRecents="true"
             />
 
+        <activity android:name="com.android.systemui.controls.ui.TestableControlsActivity"
+            android:exported="false"
+            android:excludeFromRecents="true"
+            />
+
         <activity android:name="com.android.systemui.screenshot.ScrollViewActivity"
                   android:exported="false" />
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsActivityTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsActivityTest.kt
new file mode 100644
index 0000000..0f62b24
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsActivityTest.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.controls.ui
+
+import android.content.Intent
+import android.content.res.Configuration
+import android.service.dreams.IDreamManager
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import androidx.test.rule.ActivityTestRule
+import androidx.test.runner.intercepting.SingleActivityFactory
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.controls.settings.ControlsSettingsDialogManager
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected]
+class ControlsActivityTest : SysuiTestCase() {
+    @Mock private lateinit var uiController: ControlsUiController
+    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
+    @Mock private lateinit var dreamManager: IDreamManager
+    @Mock private lateinit var featureFlags: FeatureFlags
+    @Mock private lateinit var controlsSettingsDialogManager: ControlsSettingsDialogManager
+    @Mock private lateinit var keyguardStateController: KeyguardStateController
+
+    @Rule
+    @JvmField
+    var activityRule =
+        ActivityTestRule(
+            object :
+                SingleActivityFactory<TestableControlsActivity>(
+                    TestableControlsActivity::class.java
+                ) {
+                override fun create(intent: Intent?): TestableControlsActivity {
+                    return TestableControlsActivity(
+                        uiController,
+                        broadcastDispatcher,
+                        dreamManager,
+                        featureFlags,
+                        controlsSettingsDialogManager,
+                        keyguardStateController,
+                    )
+                }
+            },
+            false,
+            false
+        )
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        activityRule.launchActivity(Intent())
+    }
+
+    @Test
+    fun testOrientationChangeForwardsToUiController() {
+        val currentConfig = activityRule.activity.resources.configuration
+        val newConfig = Configuration(currentConfig)
+        newConfig.orientation = switchOrientation(currentConfig.orientation)
+        activityRule.runOnUiThread { activityRule.activity.onConfigurationChanged(newConfig) }
+
+        verify(uiController).onSizeChange()
+    }
+
+    @Test
+    fun testScreenChangeForwardsToUiController() {
+        val currentConfig = activityRule.activity.resources.configuration
+        val newConfig = Configuration(currentConfig)
+        swapHeightWidth(newConfig)
+        activityRule.runOnUiThread { activityRule.activity.onConfigurationChanged(newConfig) }
+
+        verify(uiController).onSizeChange()
+    }
+
+    @Test
+    fun testChangeSmallestScreenSizeForwardsToUiController() {
+        val currentConfig = activityRule.activity.resources.configuration
+        val newConfig = Configuration(currentConfig)
+        newConfig.smallestScreenWidthDp *= 2
+        newConfig.screenWidthDp *= 2
+        activityRule.runOnUiThread { activityRule.activity.onConfigurationChanged(newConfig) }
+
+        verify(uiController).onSizeChange()
+    }
+
+    private fun switchOrientation(orientation: Int): Int {
+        return if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            Configuration.ORIENTATION_PORTRAIT
+        } else {
+            Configuration.ORIENTATION_LANDSCAPE
+        }
+    }
+
+    private fun swapHeightWidth(configuration: Configuration) {
+        val oldHeight = configuration.screenHeightDp
+        val oldWidth = configuration.screenWidthDp
+        configuration.screenHeightDp = oldWidth
+        configuration.screenWidthDp = oldHeight
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
index 5b3e518..330a1e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt
@@ -470,7 +470,7 @@
 
         taskViewConsumerCaptor.value.accept(taskView)
 
-        underTest.onOrientationChange()
+        underTest.onSizeChange()
         verify(taskView).onLocationChanged()
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/TestableControlsActivity.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/TestableControlsActivity.kt
new file mode 100644
index 0000000..f0b4732
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/TestableControlsActivity.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.controls.ui
+
+import android.service.dreams.IDreamManager
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.controls.settings.ControlsSettingsDialogManager
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.statusbar.policy.KeyguardStateController
+
+class TestableControlsActivity(
+    uiController: ControlsUiController,
+    broadcastDispatcher: BroadcastDispatcher,
+    dreamManager: IDreamManager,
+    featureFlags: FeatureFlags,
+    controlsSettingsDialogManager: ControlsSettingsDialogManager,
+    keyguardStateController: KeyguardStateController
+) :
+    ControlsActivity(
+        uiController,
+        broadcastDispatcher,
+        dreamManager,
+        featureFlags,
+        controlsSettingsDialogManager,
+        keyguardStateController
+    )