Add screenSize and smallestScreenSize to manifest

We need to be aware of these as an orientation change could cause change
in these (so we were not restarting for orientation but got restarted by
other changes).

UiControllerImpl already was set up in a previous CL to properly
re-inflate what's necessary if the screen size/orientation changes.

Test: atest ControlsActivityTest
Test: atest ControlsUiControllerImplTest
Test: manual: open a detailed view in panel and rotate device
Fixes: 270583496
Change-Id: I4c0caee6dfe76e5434f1545f750418816baf0189
This commit is contained in:
Fabian Kozynski
2023-03-22 10:35:01 -04:00
parent c59bcce7ec
commit 4d2fd6ee09
8 changed files with 181 additions and 7 deletions

View File

@@ -878,7 +878,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>

View File

@@ -47,7 +47,8 @@ import javax.inject.Inject
* 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 @@ class ControlsActivity @Inject constructor(
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
}

View File

@@ -65,7 +65,7 @@ interface ControlsUiController {
*/
fun getPreferredSelectedItem(structures: List<StructureInfo>): SelectedItem
fun onOrientationChange()
fun onSizeChange()
}
sealed class SelectedItem {

View File

@@ -809,7 +809,7 @@ class ControlsUiControllerImpl @Inject constructor (
}
}
override fun onOrientationChange() {
override fun onSizeChange() {
selectionItem?.let {
when (selectedItem) {
is SelectedItem.StructureItem -> createListView(it)

View File

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

View File

@@ -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)
@TestableLooper.RunWithLooper
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
}
}

View File

@@ -450,7 +450,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() {
taskViewConsumerCaptor.value.accept(taskView)
underTest.onOrientationChange()
underTest.onSizeChange()
verify(taskView).onLocationChanged()
}

View File

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