Change the resource ID of advanced protection help URI

Change-Id I3c6d24e3e9a4358ab1adb342dbee8fc56ac16794 added advanced
protection help URI to frameworks/base/core/res/res/values/config.xml,
so this change removes the duplicate resource from Settings and updates
ActionDisabledByAdvancedProtectionDialog to use the framework resource.

Bug: 401233918
Test: manual
Test: atest ActionDisabledByAdvancedProtectionDialog
Flag: EXEMPT bug fix
Change-Id: Ic84909f4c16d3449bd9981be6659987b1963a26a
This commit is contained in:
Azhara Assanova
2025-03-11 16:35:22 +00:00
parent bfab8a80d9
commit 96c6ed59a6
4 changed files with 129 additions and 9 deletions

View File

@@ -12221,9 +12221,6 @@ Data usage charges may apply.</string>
<!-- Help URI, action disabled by restricted settings [DO NOT TRANSLATE] --> <!-- Help URI, action disabled by restricted settings [DO NOT TRANSLATE] -->
<string name="help_url_action_disabled_by_restricted_settings" translatable="false"></string> <string name="help_url_action_disabled_by_restricted_settings" translatable="false"></string>
<!-- Help URI, action disabled by advanced protection [DO NOT TRANSLATE] -->
<string name="help_url_action_disabled_by_advanced_protection" translatable="false"></string>
<!-- Title label for dnd suggestion, which is displayed in Settings homepage [CHAR LIMIT=100] --> <!-- Title label for dnd suggestion, which is displayed in Settings homepage [CHAR LIMIT=100] -->
<string name="zen_suggestion_title">Update Do Not Disturb</string> <string name="zen_suggestion_title">Update Do Not Disturb</string>

View File

@@ -14,21 +14,23 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.settings.security; package com.android.settings.security
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.security.advancedprotection.AdvancedProtectionManager
import android.security.advancedprotection.AdvancedProtectionManager.EXTRA_SUPPORT_DIALOG_FEATURE import android.security.advancedprotection.AdvancedProtectionManager.EXTRA_SUPPORT_DIALOG_FEATURE
import android.security.advancedprotection.AdvancedProtectionManager.EXTRA_SUPPORT_DIALOG_TYPE import android.security.advancedprotection.AdvancedProtectionManager.EXTRA_SUPPORT_DIALOG_TYPE
import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_CELLULAR_2G import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_CELLULAR_2G
import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_INSTALL_UNKNOWN_SOURCES
import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_WEP import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_DISALLOW_WEP
import android.content.pm.PackageManager
import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_ENABLE_MTE import android.security.advancedprotection.AdvancedProtectionManager.FEATURE_ID_ENABLE_MTE
import android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION import android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION
import android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_DISABLED_SETTING import android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_DISABLED_SETTING
import android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_UNKNOWN import android.security.advancedprotection.AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_UNKNOWN
import android.util.Log import android.util.Log
import android.view.WindowManager import android.view.WindowManager
import androidx.annotation.VisibleForTesting
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -38,7 +40,6 @@ import com.android.settingslib.spa.SpaDialogWindowTypeActivity
import com.android.settingslib.spa.widget.dialog.AlertDialogButton import com.android.settingslib.spa.widget.dialog.AlertDialogButton
import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogContent import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogContent
import com.android.settingslib.wifi.WifiUtils.Companion.DIALOG_WINDOW_TYPE import com.android.settingslib.wifi.WifiUtils.Companion.DIALOG_WINDOW_TYPE
import android.security.advancedprotection.AdvancedProtectionManager
class ActionDisabledByAdvancedProtectionDialog : SpaDialogWindowTypeActivity() { class ActionDisabledByAdvancedProtectionDialog : SpaDialogWindowTypeActivity() {
@@ -85,9 +86,12 @@ class ActionDisabledByAdvancedProtectionDialog : SpaDialogWindowTypeActivity() {
return getString(messageId) return getString(messageId)
} }
private fun getSupportButtonIfExists(): AlertDialogButton? { @VisibleForTesting
fun getSupportButtonIfExists(): AlertDialogButton? {
try { try {
val helpIntentUri = getString(R.string.help_url_action_disabled_by_advanced_protection) val helpIntentUri = getString(
com.android.internal.R.string.config_help_url_action_disabled_by_advanced_protection
)
val helpIntent = Intent.parseUri(helpIntentUri, Intent.URI_INTENT_SCHEME) val helpIntent = Intent.parseUri(helpIntentUri, Intent.URI_INTENT_SCHEME)
if (helpIntent == null) return null if (helpIntent == null) return null
val helpActivityInfo = packageManager.resolveActivity(helpIntent, /* flags */ 0) val helpActivityInfo = packageManager.resolveActivity(helpIntent, /* flags */ 0)

View File

@@ -30,6 +30,14 @@
<provider android:name="com.android.settings.slices.SettingsSliceProvider" <provider android:name="com.android.settings.slices.SettingsSliceProvider"
android:authorities="${applicationId}.slices" android:authorities="${applicationId}.slices"
tools:replace="android:authorities"/> tools:replace="android:authorities"/>
<activity android:name="com.android.settings.security.ActionDisabledByAdvancedProtectionDialogTest$HelpTestActivity"
android:exported="true">
<intent-filter>
<action android:name="com.android.settings.tests.spa_unit.HELP_ACTION" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application> </application>
<instrumentation <instrumentation

View File

@@ -16,9 +16,14 @@
package com.android.settings.security package com.android.settings.security
import android.app.Activity
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.os.Bundle
import android.platform.test.annotations.RequiresFlagsEnabled import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.CheckFlagsRule import android.platform.test.flag.junit.CheckFlagsRule
import android.platform.test.flag.junit.DeviceFlagsValueProvider import android.platform.test.flag.junit.DeviceFlagsValueProvider
@@ -36,9 +41,21 @@ import androidx.test.core.app.ActivityScenario.launch
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.settings.R import com.android.settings.R
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Rule 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.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@RequiresFlagsEnabled(Flags.FLAG_AAPM_API) @RequiresFlagsEnabled(Flags.FLAG_AAPM_API)
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
@@ -49,7 +66,9 @@ class ActionDisabledByAdvancedProtectionDialogTest {
@get:Rule @get:Rule
val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
val context: Context = ApplicationProvider.getApplicationContext() private val mockPackageManager = mock<PackageManager>()
private val context: Context = ApplicationProvider.getApplicationContext()
@Test @Test
fun blockedInteractionDialog_showsCorrectTitleAndMessage() { fun blockedInteractionDialog_showsCorrectTitleAndMessage() {
@@ -159,6 +178,85 @@ class ActionDisabledByAdvancedProtectionDialogTest {
} }
} }
@Test
fun helpIntentDoesNotExist_getSupportButtonIfExists_returnsNull() {
launchDialogActivity(defaultIntent) { scenario ->
scenario.onActivity { activity ->
val spyActivity = spyOnActivityHelpIntentUri(activity, /* uriToReturn */ null)
val button = spyActivity.getSupportButtonIfExists()
assertNull(button)
}
}
}
@Test
fun helpIntentExistsAndDoesNotResolveToActivity_getSupportButtonIfExists_returnsNull() {
launchDialogActivity(defaultIntent) { scenario ->
scenario.onActivity { activity ->
val spyActivity = spyOnActivityHelpIntentUri(activity, helpIntentUri)
mockResolveActivity(spyActivity, /* resolveInfoToReturn */ null)
val button = spyActivity.getSupportButtonIfExists()
assertNull(button)
}
}
}
@Test
fun helpIntentExistsAndResolvesToActivity_getSupportButtonIfExists_returnsButton() {
launchDialogActivity(defaultIntent) { scenario ->
scenario.onActivity { activity ->
val spyActivity = spyOnActivityHelpIntentUri(activity, helpIntentUri)
val resolveInfoToReturn = ResolveInfo().apply {
activityInfo = ActivityInfo().apply {
packageName = HELP_INTENT_PKG_NAME
}
}
mockResolveActivity(spyActivity, resolveInfoToReturn)
// 1. Check the button is returned.
val button = spyActivity.getSupportButtonIfExists()
assertNotNull(button)
// 2. Check the button has correct text.
assertEquals(context.getString(
R.string.disabled_by_advanced_protection_help_button_title), button!!.text
)
// 3. Check the button's onClick launches the help activity and finishes the dialog.
button.onClick()
val intentCaptor = ArgumentCaptor.forClass(Intent::class.java)
verify(spyActivity).startActivity(intentCaptor.capture())
val launchedIntent = intentCaptor.value
assertEquals(HELP_INTENT_ACTION, launchedIntent.action)
assertEquals(HELP_INTENT_PKG_NAME, launchedIntent.`package`)
assertTrue(spyActivity.isFinishing)
}
}
}
private fun spyOnActivityHelpIntentUri(
activity: ActionDisabledByAdvancedProtectionDialog,
uriToReturn: String?
): ActionDisabledByAdvancedProtectionDialog {
val spyActivity = spy(activity)
val spyResources = spy(spyActivity.resources)
doReturn(spyResources).whenever(spyActivity).resources
doReturn(uriToReturn).whenever(spyResources).getString(helpUriResourceId)
return spyActivity
}
private fun mockResolveActivity(
spyActivity: ActionDisabledByAdvancedProtectionDialog,
resolveInfoToReturn: ResolveInfo?
) {
doReturn(mockPackageManager).whenever(spyActivity).packageManager
doReturn(resolveInfoToReturn).whenever(mockPackageManager).resolveActivity(any(), anyInt())
}
private fun launchDialogActivity( private fun launchDialogActivity(
intent: Intent, intent: Intent,
onScenario: (ActivityScenario<ActionDisabledByAdvancedProtectionDialog>) -> Unit onScenario: (ActivityScenario<ActionDisabledByAdvancedProtectionDialog>) -> Unit
@@ -172,10 +270,23 @@ class ActionDisabledByAdvancedProtectionDialogTest {
launch<ActionDisabledByAdvancedProtectionDialog>(intent).use(onScenario) launch<ActionDisabledByAdvancedProtectionDialog>(intent).use(onScenario)
} }
class HelpTestActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
finish()
}
}
private companion object { private companion object {
val defaultIntent = AdvancedProtectionManager.createSupportIntent( val defaultIntent = AdvancedProtectionManager.createSupportIntent(
FEATURE_ID_DISALLOW_CELLULAR_2G, FEATURE_ID_DISALLOW_CELLULAR_2G,
SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION SUPPORT_DIALOG_TYPE_BLOCKED_INTERACTION
) )
const val HELP_INTENT_PKG_NAME = "com.android.settings.tests.spa_unit"
const val HELP_INTENT_ACTION = "$HELP_INTENT_PKG_NAME.HELP_ACTION"
val helpIntent = Intent(HELP_INTENT_ACTION).setPackage(HELP_INTENT_PKG_NAME)
val helpIntentUri = helpIntent.toUri(Intent.URI_INTENT_SCHEME)
val helpUriResourceId =
com.android.internal.R.string.config_help_url_action_disabled_by_advanced_protection
} }
} }