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:
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ interface ControlsUiController {
|
||||
*/
|
||||
fun getPreferredSelectedItem(structures: List<StructureInfo>): SelectedItem
|
||||
|
||||
fun onOrientationChange()
|
||||
fun onSizeChange()
|
||||
}
|
||||
|
||||
sealed class SelectedItem {
|
||||
|
||||
@@ -809,7 +809,7 @@ class ControlsUiControllerImpl @Inject constructor (
|
||||
}
|
||||
}
|
||||
|
||||
override fun onOrientationChange() {
|
||||
override fun onSizeChange() {
|
||||
selectionItem?.let {
|
||||
when (selectedItem) {
|
||||
is SelectedItem.StructureItem -> createListView(it)
|
||||
|
||||
@@ -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" />
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -450,7 +450,7 @@ class ControlsUiControllerImplTest : SysuiTestCase() {
|
||||
|
||||
taskViewConsumerCaptor.value.accept(taskView)
|
||||
|
||||
underTest.onOrientationChange()
|
||||
underTest.onSizeChange()
|
||||
verify(taskView).onLocationChanged()
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
Reference in New Issue
Block a user