Merge "Change landing page from PrivacyDialog" into sc-dev

This commit is contained in:
Fabian Kozynski
2021-02-09 16:36:38 +00:00
committed by Android (Google) Code Review
5 changed files with 74 additions and 26 deletions

View File

@@ -41,13 +41,12 @@ import java.util.concurrent.atomic.AtomicBoolean
* @param context A context to create the dialog * @param context A context to create the dialog
* @param list list of elements to show in the dialog. The elements will show in the same order they * @param list list of elements to show in the dialog. The elements will show in the same order they
* appear in the list * appear in the list
* @param activityStarter a callback to start an activity for a given permission group name (as * @param activityStarter a callback to start an activity for a given package name and user id
* given by [PrivacyType.permGroupName])
*/ */
class PrivacyDialog( class PrivacyDialog(
context: Context, context: Context,
private val list: List<PrivacyElement>, private val list: List<PrivacyElement>,
activityStarter: (String) -> Unit activityStarter: (String, Int) -> Unit
) : SystemUIDialog(context, R.style.ScreenRecord) { ) : SystemUIDialog(context, R.style.ScreenRecord) {
private val dismissListeners = mutableListOf<WeakReference<OnDialogDismissed>>() private val dismissListeners = mutableListOf<WeakReference<OnDialogDismissed>>()
@@ -129,7 +128,7 @@ class PrivacyDialog(
} ?: firstLine } ?: firstLine
newView.requireViewById<TextView>(R.id.text).text = finalText newView.requireViewById<TextView>(R.id.text).text = finalText
newView.apply { newView.apply {
tag = element.type.permGroupName setTag(element)
setOnClickListener(clickListener) setOnClickListener(clickListener)
} }
return newView return newView
@@ -152,12 +151,17 @@ class PrivacyDialog(
} }
private val clickListener = View.OnClickListener { v -> private val clickListener = View.OnClickListener { v ->
v.tag?.let { activityStarter(it as String) } v.tag?.let {
val element = it as PrivacyElement
activityStarter(element.packageName, element.userId)
}
} }
/** */ /** */
data class PrivacyElement( data class PrivacyElement(
val type: PrivacyType, val type: PrivacyType,
val packageName: String,
val userId: Int,
val applicationName: CharSequence, val applicationName: CharSequence,
val attribution: CharSequence?, val attribution: CharSequence?,
val lastActiveTimestamp: Long, val lastActiveTimestamp: Long,
@@ -169,6 +173,8 @@ class PrivacyDialog(
init { init {
builder.append("type=${type.logName}") builder.append("type=${type.logName}")
builder.append(", packageName=$packageName")
builder.append(", userId=$userId")
builder.append(", appName=$applicationName") builder.append(", appName=$applicationName")
if (attribution != null) { if (attribution != null) {
builder.append(", attribution=$attribution") builder.append(", attribution=$attribution")

View File

@@ -43,7 +43,7 @@ private val defaultDialogProvider = object : PrivacyDialogController.DialogProvi
override fun makeDialog( override fun makeDialog(
context: Context, context: Context,
list: List<PrivacyDialog.PrivacyElement>, list: List<PrivacyDialog.PrivacyElement>,
starter: (String) -> Unit starter: (String, Int) -> Unit
): PrivacyDialog { ): PrivacyDialog {
return PrivacyDialog(context, list, starter) return PrivacyDialog(context, list, starter)
} }
@@ -107,10 +107,11 @@ class PrivacyDialogController(
} }
@MainThread @MainThread
private fun startActivity(permGroupName: String) { private fun startActivity(packageName: String, userId: Int) {
val intent = Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) val intent = Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS)
intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, permGroupName) intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName)
privacyLogger.logStartSettingsActivityFromDialog(permGroupName) intent.putExtra(Intent.EXTRA_USER, UserHandle.of(userId))
privacyLogger.logStartSettingsActivityFromDialog(packageName, userId)
if (!keyguardStateController.isUnlocked) { if (!keyguardStateController.isUnlocked) {
// If we are locked, hide the dialog so the user can unlock // If we are locked, hide the dialog so the user can unlock
dialog?.hide() dialog?.hide()
@@ -159,6 +160,8 @@ class PrivacyDialogController(
} }
PrivacyDialog.PrivacyElement( PrivacyDialog.PrivacyElement(
t, t,
it.packageName,
UserHandle.getUserId(it.uid),
appName, appName,
it.attribution, it.attribution,
it.lastAccess, it.lastAccess,
@@ -257,7 +260,7 @@ class PrivacyDialogController(
fun makeDialog( fun makeDialog(
context: Context, context: Context,
list: List<PrivacyDialog.PrivacyElement>, list: List<PrivacyDialog.PrivacyElement>,
starter: (String) -> Unit starter: (String, Int) -> Unit
): PrivacyDialog ): PrivacyDialog
} }
} }

View File

@@ -121,11 +121,12 @@ class PrivacyLogger @Inject constructor(
}) })
} }
fun logStartSettingsActivityFromDialog(permGroupName: String) { fun logStartSettingsActivityFromDialog(packageName: String, userId: Int) {
log(LogLevel.INFO, { log(LogLevel.INFO, {
str1 = permGroupName str1 = packageName
int1 = userId
}, { }, {
"Start settings activity from dialog for perm group: $str1" "Start settings activity from dialog for packageName=$str1, userId=$int1 "
}) })
} }

View File

@@ -100,12 +100,12 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
private val dialogProvider = object : PrivacyDialogController.DialogProvider { private val dialogProvider = object : PrivacyDialogController.DialogProvider {
var list: List<PrivacyDialog.PrivacyElement>? = null var list: List<PrivacyDialog.PrivacyElement>? = null
var starter: ((String) -> Unit)? = null var starter: ((String, Int) -> Unit)? = null
override fun makeDialog( override fun makeDialog(
context: Context, context: Context,
list: List<PrivacyDialog.PrivacyElement>, list: List<PrivacyDialog.PrivacyElement>,
starter: (String) -> Unit starter: (String, Int) -> Unit
): PrivacyDialog { ): PrivacyDialog {
this.list = list this.list = list
this.starter = starter this.starter = starter
@@ -210,7 +210,7 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
fun testSingleElementInList() { fun testSingleElementInList() {
val usage = createMockPermGroupUsage( val usage = createMockPermGroupUsage(
packageName = TEST_PACKAGE_NAME, packageName = TEST_PACKAGE_NAME,
uid = generateUidForUser(0), uid = generateUidForUser(USER_ID),
permGroupName = PERM_CAMERA, permGroupName = PERM_CAMERA,
lastAccess = 5L, lastAccess = 5L,
isActive = true, isActive = true,
@@ -224,6 +224,8 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
val expected = PrivacyDialog.PrivacyElement( val expected = PrivacyDialog.PrivacyElement(
type = PrivacyType.TYPE_CAMERA, type = PrivacyType.TYPE_CAMERA,
packageName = TEST_PACKAGE_NAME,
userId = USER_ID,
applicationName = TEST_PACKAGE_NAME, applicationName = TEST_PACKAGE_NAME,
attribution = TEST_ATTRIBUTION, attribution = TEST_ATTRIBUTION,
lastActiveTimestamp = 5L, lastActiveTimestamp = 5L,
@@ -459,13 +461,28 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
controller.showDialog(context) controller.showDialog(context)
exhaustExecutors() exhaustExecutors()
dialogProvider.starter?.invoke(PERM_MICROPHONE) dialogProvider.starter?.invoke(TEST_PACKAGE_NAME, USER_ID)
verify(activityStarter) verify(activityStarter)
.startActivity(capture(intentCaptor), eq(true), any<ActivityStarter.Callback>()) .startActivity(capture(intentCaptor), eq(true), any<ActivityStarter.Callback>())
assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_MANAGE_PERMISSION_APPS) assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_MANAGE_APP_PERMISSIONS)
assertThat(intentCaptor.value.getStringExtra(Intent.EXTRA_PERMISSION_GROUP_NAME)) assertThat(intentCaptor.value.getStringExtra(Intent.EXTRA_PACKAGE_NAME))
.isEqualTo(PERM_MICROPHONE) .isEqualTo(TEST_PACKAGE_NAME)
assertThat(intentCaptor.value.getParcelableExtra(Intent.EXTRA_USER) as? UserHandle)
.isEqualTo(UserHandle.of(USER_ID))
}
@Test
fun testStartActivityCorrectIntent_enterpriseUser() {
controller.showDialog(context)
exhaustExecutors()
dialogProvider.starter?.invoke(TEST_PACKAGE_NAME, ENT_USER_ID)
verify(activityStarter)
.startActivity(capture(intentCaptor), eq(true), any<ActivityStarter.Callback>())
assertThat(intentCaptor.value.getParcelableExtra(Intent.EXTRA_USER) as? UserHandle)
.isEqualTo(UserHandle.of(ENT_USER_ID))
} }
@Test @Test
@@ -473,7 +490,7 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
controller.showDialog(context) controller.showDialog(context)
exhaustExecutors() exhaustExecutors()
dialogProvider.starter?.invoke(PERM_MICROPHONE) dialogProvider.starter?.invoke(TEST_PACKAGE_NAME, USER_ID)
verify(activityStarter).startActivity(any(), eq(true), capture(activityStartedCaptor)) verify(activityStarter).startActivity(any(), eq(true), capture(activityStartedCaptor))
activityStartedCaptor.value.onActivityStarted(ActivityManager.START_DELIVERED_TO_TOP) activityStartedCaptor.value.onActivityStarted(ActivityManager.START_DELIVERED_TO_TOP)
@@ -486,7 +503,7 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
controller.showDialog(context) controller.showDialog(context)
exhaustExecutors() exhaustExecutors()
dialogProvider.starter?.invoke(PERM_MICROPHONE) dialogProvider.starter?.invoke(TEST_PACKAGE_NAME, USER_ID)
verify(activityStarter).startActivity(any(), eq(true), capture(activityStartedCaptor)) verify(activityStarter).startActivity(any(), eq(true), capture(activityStartedCaptor))
activityStartedCaptor.value.onActivityStarted(ActivityManager.START_ABORTED) activityStartedCaptor.value.onActivityStarted(ActivityManager.START_ABORTED)

View File

@@ -40,8 +40,13 @@ import org.mockito.MockitoAnnotations
@TestableLooper.RunWithLooper(setAsMainLooper = true) @TestableLooper.RunWithLooper(setAsMainLooper = true)
class PrivacyDialogTest : SysuiTestCase() { class PrivacyDialogTest : SysuiTestCase() {
companion object {
private const val TEST_PACKAGE_NAME = "test_pkg"
private const val TEST_USER_ID = 0
}
@Mock @Mock
private lateinit var starter: (String) -> Unit private lateinit var starter: (String, Int) -> Unit
private lateinit var dialog: PrivacyDialog private lateinit var dialog: PrivacyDialog
@@ -58,10 +63,12 @@ class PrivacyDialogTest : SysuiTestCase() {
} }
@Test @Test
fun testStarterCalledWithCorrectPermGroupName() { fun testStarterCalledWithCorrectParams() {
val list = listOf( val list = listOf(
PrivacyDialog.PrivacyElement( PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE, PrivacyType.TYPE_MICROPHONE,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -73,7 +80,7 @@ class PrivacyDialogTest : SysuiTestCase() {
dialog = PrivacyDialog(context, list, starter) dialog = PrivacyDialog(context, list, starter)
dialog.show() dialog.show()
dialog.requireViewById<View>(R.id.privacy_item).callOnClick() dialog.requireViewById<View>(R.id.privacy_item).callOnClick()
verify(starter).invoke(PrivacyType.TYPE_MICROPHONE.permGroupName) verify(starter).invoke(TEST_PACKAGE_NAME, TEST_USER_ID)
} }
@Test @Test
@@ -104,6 +111,8 @@ class PrivacyDialogTest : SysuiTestCase() {
val list = listOf( val list = listOf(
PrivacyDialog.PrivacyElement( PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_CAMERA, PrivacyType.TYPE_CAMERA,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -113,6 +122,8 @@ class PrivacyDialogTest : SysuiTestCase() {
), ),
PrivacyDialog.PrivacyElement( PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE, PrivacyType.TYPE_MICROPHONE,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -130,6 +141,8 @@ class PrivacyDialogTest : SysuiTestCase() {
fun testUsingText() { fun testUsingText() {
val element = PrivacyDialog.PrivacyElement( val element = PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_CAMERA, PrivacyType.TYPE_CAMERA,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -154,6 +167,8 @@ class PrivacyDialogTest : SysuiTestCase() {
fun testRecentText() { fun testRecentText() {
val element = PrivacyDialog.PrivacyElement( val element = PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE, PrivacyType.TYPE_MICROPHONE,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -178,6 +193,8 @@ class PrivacyDialogTest : SysuiTestCase() {
fun testEnterprise() { fun testEnterprise() {
val element = PrivacyDialog.PrivacyElement( val element = PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE, PrivacyType.TYPE_MICROPHONE,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -198,6 +215,8 @@ class PrivacyDialogTest : SysuiTestCase() {
fun testPhoneCall() { fun testPhoneCall() {
val element = PrivacyDialog.PrivacyElement( val element = PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE, PrivacyType.TYPE_MICROPHONE,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
null, null,
0L, 0L,
@@ -218,6 +237,8 @@ class PrivacyDialogTest : SysuiTestCase() {
fun testAttribution() { fun testAttribution() {
val element = PrivacyDialog.PrivacyElement( val element = PrivacyDialog.PrivacyElement(
PrivacyType.TYPE_MICROPHONE, PrivacyType.TYPE_MICROPHONE,
TEST_PACKAGE_NAME,
TEST_USER_ID,
"App", "App",
"attribution", "attribution",
0L, 0L,