Add trunk flag check to prevent changing the special app access settings for 'Change media output' for direct intent based entry when trunk flag is not enabled.

Bug: 321905521
Test: Ensure trunk flag is disabled > Open app specific settings for 'Change media output' > Ensure that settings should not be changeable
Change-Id: Iedfd82d97eb49fc65c56d332bde815ff41e24736
This commit is contained in:
Anubhav Kakkar
2024-01-19 16:34:17 +00:00
parent 00f4225c2c
commit 1a2774e3d8
2 changed files with 31 additions and 3 deletions

View File

@@ -22,6 +22,7 @@ import android.app.role.RoleManager
import android.app.settings.SettingsEnums import android.app.settings.SettingsEnums
import android.companion.AssociationRequest import android.companion.AssociationRequest
import android.content.Context import android.content.Context
import com.android.media.flags.Flags;
import com.android.settings.R import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
@@ -48,8 +49,9 @@ class MediaRoutingControlAppsListModel(context: Context) : AppOpPermissionListMo
} }
override fun isChangeable(record: AppOpPermissionRecord): Boolean { override fun isChangeable(record: AppOpPermissionRecord): Boolean {
return super.isChangeable(record) && (this.roleManager return Flags.enablePrivilegedRoutingForMediaRoutingControl()
?.getRoleHolders(AssociationRequest.DEVICE_PROFILE_WATCH) && super.isChangeable(record)
&& (this.roleManager?.getRoleHolders(AssociationRequest.DEVICE_PROFILE_WATCH)
?.contains(record.app.packageName) == true) ?.contains(record.app.packageName) == true)
} }

View File

@@ -23,9 +23,11 @@ import android.app.settings.SettingsEnums
import android.companion.AssociationRequest import android.companion.AssociationRequest
import android.content.Context import android.content.Context
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.platform.test.flag.junit.SetFlagsRule
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.media.flags.Flags
import com.android.settings.R import com.android.settings.R
import com.android.settings.testutils.FakeFeatureFactory import com.android.settings.testutils.FakeFeatureFactory
import com.android.settingslib.spaprivileged.model.app.IAppOpsController import com.android.settingslib.spaprivileged.model.app.IAppOpsController
@@ -36,17 +38,19 @@ import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.Spy import org.mockito.Spy
import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule import org.mockito.junit.MockitoRule
import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever
import org.mockito.Mockito.verify
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class MediaRoutingControlTest { class MediaRoutingControlTest {
@get:Rule @get:Rule
val mockito: MockitoRule = MockitoJUnit.rule() val mockito: MockitoRule = MockitoJUnit.rule()
@get:Rule val setFlagsRule: SetFlagsRule = SetFlagsRule();
@Spy @Spy
private val context: Context = ApplicationProvider.getApplicationContext() private val context: Context = ApplicationProvider.getApplicationContext()
@@ -143,6 +147,7 @@ class MediaRoutingControlTest {
@Test @Test
fun isChangeable_permissionRequestedByAppAndWatchCompanionRoleAssigned_shouldReturnTrue() { fun isChangeable_permissionRequestedByAppAndWatchCompanionRoleAssigned_shouldReturnTrue() {
setFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVILEGED_ROUTING_FOR_MEDIA_ROUTING_CONTROL)
val permissionRequestedRecord = val permissionRequestedRecord =
AppOpPermissionRecord( AppOpPermissionRecord(
app = ApplicationInfo().apply { packageName = PACKAGE_NAME }, app = ApplicationInfo().apply { packageName = PACKAGE_NAME },
@@ -161,6 +166,7 @@ class MediaRoutingControlTest {
@Test @Test
fun isChangeable_permissionNotRequestedByAppButWatchCompanionRoleAssigned_shouldReturnFalse() { fun isChangeable_permissionNotRequestedByAppButWatchCompanionRoleAssigned_shouldReturnFalse() {
setFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVILEGED_ROUTING_FOR_MEDIA_ROUTING_CONTROL)
val permissionNotRequestedRecord = val permissionNotRequestedRecord =
AppOpPermissionRecord( AppOpPermissionRecord(
app = ApplicationInfo().apply { packageName = PACKAGE_NAME }, app = ApplicationInfo().apply { packageName = PACKAGE_NAME },
@@ -179,6 +185,7 @@ class MediaRoutingControlTest {
@Test @Test
fun isChangeable_permissionRequestedByAppButWatchCompanionRoleNotAssigned_shouldReturnFalse() { fun isChangeable_permissionRequestedByAppButWatchCompanionRoleNotAssigned_shouldReturnFalse() {
setFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVILEGED_ROUTING_FOR_MEDIA_ROUTING_CONTROL)
val permissionRequestedRecord = val permissionRequestedRecord =
AppOpPermissionRecord( AppOpPermissionRecord(
app = ApplicationInfo().apply { packageName = PACKAGE_NAME }, app = ApplicationInfo().apply { packageName = PACKAGE_NAME },
@@ -195,6 +202,25 @@ class MediaRoutingControlTest {
assertThat(isSpecialAccessChangeable).isFalse() assertThat(isSpecialAccessChangeable).isFalse()
} }
@Test
fun isChangeable_withFlagDisabled_shouldReturnFalse() {
setFlagsRule.disableFlags(Flags.FLAG_ENABLE_PRIVILEGED_ROUTING_FOR_MEDIA_ROUTING_CONTROL)
val permissionRequestedRecord =
AppOpPermissionRecord(
app = ApplicationInfo().apply { packageName = PACKAGE_NAME },
hasRequestPermission = true,
hasRequestBroaderPermission = false,
appOpsController =
FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
)
whenever(mockRoleManager.getRoleHolders(AssociationRequest.DEVICE_PROFILE_WATCH))
.thenReturn(listOf(PACKAGE_NAME))
val isSpecialAccessChangeable = listModel.isChangeable(permissionRequestedRecord)
assertThat(isSpecialAccessChangeable).isFalse()
}
private class FakeAppOpsController(fakeMode: Int) : IAppOpsController { private class FakeAppOpsController(fakeMode: Int) : IAppOpsController {
override val mode = MutableLiveData(fakeMode) override val mode = MutableLiveData(fakeMode)