Merge "[3/n] Add aspect ratio app info page" into udc-qpr-dev am: 386b02e906
am: e5e57a8d9e
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/23819685 Change-Id: I0a880774214c804f2c22fb7aa876c39349e71b62 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* 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.settings.applications.appcompat;
|
||||
|
||||
import static com.android.settings.applications.appcompat.UserAspectRatioDetails.KEY_PREF_3_2;
|
||||
import static com.android.settings.applications.appcompat.UserAspectRatioDetails.KEY_PREF_DEFAULT;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.IActivityManager;
|
||||
import android.content.Context;
|
||||
import android.os.RemoteException;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.testutils.shadow.ShadowActivityManager;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
/**
|
||||
* To run test: atest SettingsRoboTests:UserAspectRatioDetailsTest
|
||||
*/
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = {ShadowActivityManager.class})
|
||||
public class UserAspectRatioDetailsTest {
|
||||
|
||||
@Mock
|
||||
private UserAspectRatioManager mUserAspectRatioManager;
|
||||
@Mock
|
||||
private IActivityManager mAm;
|
||||
|
||||
private SelectorWithWidgetPreference mRadioButtonPref;
|
||||
private Context mContext;
|
||||
private UserAspectRatioDetails mFragment;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
mFragment = spy(new UserAspectRatioDetails());
|
||||
when(mFragment.getContext()).thenReturn(mContext);
|
||||
when(mFragment.getAspectRatioManager()).thenReturn(mUserAspectRatioManager);
|
||||
ShadowActivityManager.setService(mAm);
|
||||
mRadioButtonPref = new SelectorWithWidgetPreference(mContext);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRadioButtonClicked_prefChange_shouldStopActivity() throws RemoteException {
|
||||
// Default was already selected
|
||||
mRadioButtonPref.setKey(KEY_PREF_DEFAULT);
|
||||
mFragment.onRadioButtonClicked(mRadioButtonPref);
|
||||
// Preference changed
|
||||
mRadioButtonPref.setKey(KEY_PREF_3_2);
|
||||
mFragment.onRadioButtonClicked(mRadioButtonPref);
|
||||
// Only triggered once when preference change
|
||||
verify(mAm).stopAppForUser(any(), anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRadioButtonClicked_prefChange_shouldSetAspectRatio() throws RemoteException {
|
||||
// Default was already selected
|
||||
mRadioButtonPref.setKey(KEY_PREF_DEFAULT);
|
||||
mFragment.onRadioButtonClicked(mRadioButtonPref);
|
||||
// Preference changed
|
||||
mRadioButtonPref.setKey(KEY_PREF_3_2);
|
||||
mFragment.onRadioButtonClicked(mRadioButtonPref);
|
||||
// Only triggered once when preference changes
|
||||
verify(mUserAspectRatioManager).setUserMinAspectRatio(
|
||||
any(), anyInt(), anyInt());
|
||||
}
|
||||
}
|
@@ -0,0 +1,204 @@
|
||||
/*
|
||||
* 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.settings.spa.app.appcompat
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.pm.ResolveInfo
|
||||
import android.os.Build
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.test.assertIsDisplayed
|
||||
import androidx.compose.ui.test.assertIsEnabled
|
||||
import androidx.compose.ui.test.assertIsNotDisplayed
|
||||
import androidx.compose.ui.test.hasTextExactly
|
||||
import androidx.compose.ui.test.junit4.createComposeRule
|
||||
import androidx.compose.ui.test.onRoot
|
||||
import androidx.compose.ui.test.performClick
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.android.dx.mockito.inline.extended.ExtendedMockito
|
||||
import android.provider.DeviceConfig.NAMESPACE_WINDOW_MANAGER
|
||||
import com.android.settings.R
|
||||
import com.android.settings.applications.appinfo.AppInfoDashboardFragment
|
||||
import com.android.settings.applications.appcompat.UserAspectRatioDetails
|
||||
import com.android.settings.applications.appcompat.UserAspectRatioManager
|
||||
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
|
||||
import com.android.settings.testutils.TestDeviceConfig
|
||||
import com.android.settingslib.spa.testutils.delay
|
||||
import com.android.settingslib.spa.testutils.waitUntilExists
|
||||
import org.junit.After
|
||||
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.any
|
||||
import org.mockito.Mockito.anyInt
|
||||
import org.mockito.Mockito.eq
|
||||
import org.mockito.Mockito.mock
|
||||
import org.mockito.MockitoSession
|
||||
import org.mockito.Spy
|
||||
import org.mockito.quality.Strictness
|
||||
import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
/**
|
||||
* To run this test: atest SettingsSpaUnitTests:UserAspectRatioAppPreferenceTest
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class UserAspectRatioAppPreferenceTest {
|
||||
@get:Rule
|
||||
val composeTestRule = createComposeRule()
|
||||
|
||||
private lateinit var mockSession: MockitoSession
|
||||
|
||||
@Spy
|
||||
private val context: Context = ApplicationProvider.getApplicationContext()
|
||||
|
||||
@Spy
|
||||
private val resources = context.resources
|
||||
|
||||
private val aspectRatioEnabledConfig =
|
||||
TestDeviceConfig(NAMESPACE_WINDOW_MANAGER, "enable_app_compat_user_aspect_ratio_settings")
|
||||
|
||||
private lateinit var userAspectRatioManager: UserAspectRatioManager
|
||||
|
||||
@Mock
|
||||
private lateinit var packageManager: PackageManager
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
mockSession = ExtendedMockito.mockitoSession()
|
||||
.initMocks(this)
|
||||
.mockStatic(UserAspectRatioDetails::class.java)
|
||||
.mockStatic(AppInfoDashboardFragment::class.java)
|
||||
.strictness(Strictness.LENIENT)
|
||||
.startMocking()
|
||||
whenever(context.resources).thenReturn(resources)
|
||||
whenever(context.packageManager).thenReturn(packageManager)
|
||||
userAspectRatioManager = mock(UserAspectRatioManager::class.java)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
aspectRatioEnabledConfig.reset()
|
||||
mockSession.finishMocking()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun whenConfigIsFalse_notDisplayed() {
|
||||
setConfig(false)
|
||||
|
||||
setContent()
|
||||
|
||||
composeTestRule.onRoot().assertIsNotDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun whenCannotDisplayAspectRatioUi_notDisplayed() {
|
||||
setContent()
|
||||
|
||||
composeTestRule.onRoot().assertIsNotDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun whenCanDisplayAspectRatioUiAndConfigFalse_notDisplayed() {
|
||||
setConfig(false)
|
||||
whenever(packageManager.queryIntentActivities(any(), anyInt()))
|
||||
.thenReturn(listOf(RESOLVE_INFO))
|
||||
|
||||
setContent()
|
||||
|
||||
composeTestRule.onRoot().assertIsNotDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun whenCannotDisplayAspectRatioUiAndConfigTrue_notDisplayed() {
|
||||
setConfig(true)
|
||||
|
||||
setContent()
|
||||
|
||||
composeTestRule.onRoot().assertIsNotDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun whenCanDisplayAspectRatioUiAndConfigTrue_Displayed() {
|
||||
setConfig(true)
|
||||
whenever(packageManager.queryIntentActivities(any(), anyInt()))
|
||||
.thenReturn(listOf(RESOLVE_INFO))
|
||||
|
||||
setContent()
|
||||
|
||||
composeTestRule.onNode(
|
||||
hasTextExactly(
|
||||
context.getString(R.string.aspect_ratio_title),
|
||||
context.getString(R.string.user_aspect_ratio_app_default)
|
||||
),
|
||||
).assertIsDisplayed().assertIsEnabled()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun onClick_startActivity() {
|
||||
setConfig(true)
|
||||
whenever(packageManager.queryIntentActivities(any(), anyInt()))
|
||||
.thenReturn(listOf(RESOLVE_INFO))
|
||||
|
||||
setContent()
|
||||
composeTestRule.onRoot().performClick()
|
||||
|
||||
ExtendedMockito.verify {
|
||||
AppInfoDashboardFragment.startAppInfoFragment(
|
||||
UserAspectRatioDetails::class.java,
|
||||
APP,
|
||||
context,
|
||||
AppInfoSettingsProvider.METRICS_CATEGORY,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setConfig(enabled: Boolean) {
|
||||
whenever(resources.getBoolean(
|
||||
com.android.internal.R.bool.config_appCompatUserAppAspectRatioSettingsIsEnabled
|
||||
)).thenReturn(enabled)
|
||||
aspectRatioEnabledConfig.override(enabled)
|
||||
}
|
||||
|
||||
private fun setContent() {
|
||||
composeTestRule.setContent {
|
||||
CompositionLocalProvider(LocalContext provides context) {
|
||||
UserAspectRatioAppPreference(APP)
|
||||
}
|
||||
}
|
||||
composeTestRule.delay()
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val PACKAGE_NAME = "package.name"
|
||||
const val UID = 123
|
||||
val APP = ApplicationInfo().apply {
|
||||
packageName = PACKAGE_NAME
|
||||
uid = UID
|
||||
}
|
||||
private val RESOLVE_INFO = ResolveInfo().apply {
|
||||
activityInfo = ActivityInfo().apply {
|
||||
packageName = PACKAGE_NAME
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -60,21 +60,21 @@ class UserAspectRatioAppsPageProviderTest {
|
||||
@Test
|
||||
fun injectEntry_title() {
|
||||
setInjectEntry()
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.screen_size_title))
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_title))
|
||||
.assertIsDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun injectEntry_summary() {
|
||||
setInjectEntry()
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.screen_size_summary, Build.MODEL))
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_summary, Build.MODEL))
|
||||
.assertIsDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun injectEntry_onClick_navigate() {
|
||||
setInjectEntry()
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.screen_size_title)).performClick()
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_title)).performClick()
|
||||
assertThat(fakeNavControllerWrapper.navigateCalledWith).isEqualTo("UserAspectRatioAppsPage")
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ class UserAspectRatioAppsPageProviderTest {
|
||||
UserAspectRatioAppList {}
|
||||
}
|
||||
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.screen_size_title))
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_title))
|
||||
.assertIsDisplayed()
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user