Merge "Change landing page from PrivacyDialog" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f8c2d0ebf5
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 "
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user