summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Jozwiak <jjoz@google.com>2022-03-16 20:14:07 -0700
committerJordan Jozwiak <jjoz@google.com>2022-03-23 07:42:30 -0700
commitd64922ab303a49b4473d599bda5b504ccb2de90f (patch)
treeb7fba9478661771d69d94cad831d1ba375565a8a
parent0bfc545a78a261f3d1cad85297b542cabd16fd64 (diff)
downloadPermission-d64922ab303a49b4473d599bda5b504ccb2de90f.tar.gz
Log metrics for permission decisions
Logs metrics for the permission decision reminder notification and viewing and interaction with the review permission decisions screen. Since there's no callback where we log for the notification, we log that click action within the review permission decisions screen. Bug: 216475259 Test: statsd_testdrive -p com.google.android.permissioncontroller 438 439 Change-Id: Idcd88156d82219829377b5baacd1ff8fae3aa552
-rw-r--r--PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt21
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt63
3 files changed, 78 insertions, 10 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt b/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt
index daf0ba8c7..67c4cfac1 100644
--- a/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt
+++ b/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt
@@ -37,7 +37,10 @@ import android.text.BidiFormatter
import androidx.annotation.VisibleForTesting
import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.DumpableLog
+import com.android.permissioncontroller.PermissionControllerStatsLog
+import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_REMINDER_NOTIFICATION_INTERACTED__RESULT__NOTIFICATION_PRESENTED
import com.android.permissioncontroller.R
+import com.android.permissioncontroller.permission.ui.auto.AutoReviewPermissionDecisionsFragment
import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPackageLabel
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
@@ -64,6 +67,7 @@ class DrivingDecisionReminderService : Service() {
private var carUxRestrictionsManager: CarUxRestrictionsManager? = null
private val permissionReminders: MutableSet<PermissionReminder> = mutableSetOf()
private var car: Car? = null
+ private var sessionId = Constants.INVALID_SESSION_ID
companion object {
private const val LOG_TAG = "DrivingDecisionReminderService"
@@ -136,6 +140,9 @@ class DrivingDecisionReminderService : Service() {
}
scheduleNotificationForUnrestrictedState()
scheduled = true
+ while (sessionId == Constants.INVALID_SESSION_ID) {
+ sessionId = Random().nextLong()
+ }
return START_STICKY
}
@@ -202,6 +209,8 @@ class DrivingDecisionReminderService : Service() {
notificationManager.notify(DrivingDecisionReminderService::class.java.simpleName,
Constants.PERMISSION_DECISION_REMINDER_NOTIFICATION_ID,
createNotification(createNotificationTitle(), createNotificationContent()))
+
+ logNotificationPresented()
}
private fun createNotificationTitle(): String {
@@ -250,12 +259,10 @@ class DrivingDecisionReminderService : Service() {
}
private fun createNotification(title: String, body: String): Notification {
- var sessionId = Constants.INVALID_SESSION_ID
- while (sessionId == Constants.INVALID_SESSION_ID) {
- sessionId = Random().nextLong()
- }
val clickIntent = Intent(PermissionManager.ACTION_REVIEW_PERMISSION_DECISIONS).apply {
putExtra(Constants.EXTRA_SESSION_ID, sessionId)
+ putExtra(AutoReviewPermissionDecisionsFragment.EXTRA_SOURCE,
+ AutoReviewPermissionDecisionsFragment.EXTRA_SOURCE_NOTIFICATION)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
val pendingIntent = PendingIntent.getActivity(this, 0, clickIntent,
@@ -299,4 +306,10 @@ class DrivingDecisionReminderService : Service() {
val settingsComponent: ComponentName? = settingsIntent.resolveActivity(pm)
return settingsComponent?.packageName ?: SETTINGS_PACKAGE_NAME_FALLBACK
}
+
+ private fun logNotificationPresented() {
+ PermissionControllerStatsLog.write(
+ PermissionControllerStatsLog.PERMISSION_REMINDER_NOTIFICATION_INTERACTED,
+ sessionId, PERMISSION_REMINDER_NOTIFICATION_INTERACTED__RESULT__NOTIFICATION_PRESENTED)
+ }
} \ No newline at end of file
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
index d83714422..959a1c692 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
@@ -394,8 +394,10 @@ public final class ManagePermissionsActivity extends SettingsActivity {
userHandle = Process.myUserHandle();
}
if (DeviceUtils.isAuto(this)) {
+ String source = getIntent().getStringExtra(
+ AutoReviewPermissionDecisionsFragment.EXTRA_SOURCE);
androidXFragment = AutoReviewPermissionDecisionsFragment.Companion
- .newInstance(sessionId, userHandle);
+ .newInstance(sessionId, userHandle, source);
} else {
Log.e(LOG_TAG, "ACTION_REVIEW_PERMISSION_DECISIONS is not "
+ "supported on this device type");
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt
index c7b293878..8136bef21 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt
@@ -25,12 +25,18 @@ import androidx.preference.PreferenceGroup
import com.android.car.ui.preference.CarUiPreference
import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.DumpableLog
+import com.android.permissioncontroller.PermissionControllerStatsLog
+import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_REMINDER_NOTIFICATION_INTERACTED__RESULT__NOTIFICATION_CLICKED
+import com.android.permissioncontroller.PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__REVIEW_DECISION
+import com.android.permissioncontroller.PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__SCREEN_VIEWED
+import com.android.permissioncontroller.PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__VIEW_ALL_CLICKED
import com.android.permissioncontroller.R
import com.android.permissioncontroller.auto.AutoSettingsFrameFragment
import com.android.permissioncontroller.permission.data.PermissionDecision
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity
import com.android.permissioncontroller.permission.ui.model.ReviewPermissionDecisionsViewModel
import com.android.permissioncontroller.permission.ui.model.ReviewPermissionDecisionsViewModelFactory
+import com.android.permissioncontroller.permission.utils.KotlinUtils.getPackageUid
import com.android.permissioncontroller.permission.utils.Utils
import kotlin.math.min
@@ -38,6 +44,8 @@ import kotlin.math.min
class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
companion object {
+ const val EXTRA_SOURCE = "source"
+ const val EXTRA_SOURCE_NOTIFICATION = "notification"
private const val LOG_TAG = "AutoReviewPermissionDecisionsFragment"
private const val MAX_DECISIONS = 3
@@ -46,12 +54,14 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
*/
fun newInstance(
sessionId: Long,
- userHandle: UserHandle
+ userHandle: UserHandle,
+ source: String?
): AutoReviewPermissionDecisionsFragment {
return AutoReviewPermissionDecisionsFragment().apply {
arguments = Bundle().apply {
putLong(Constants.EXTRA_SESSION_ID, sessionId)
putParcelable(Intent.EXTRA_USER, userHandle)
+ putString(EXTRA_SOURCE, source)
}
}
}
@@ -60,7 +70,7 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
private lateinit var user: UserHandle
private lateinit var viewModel: ReviewPermissionDecisionsViewModel
private lateinit var recentPermissionsGroup: PreferenceCategory
- private var sessionId: Long? = null
+ private var sessionId: Long = Constants.INVALID_SESSION_ID
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -81,6 +91,10 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
}
user = requireArguments().getParcelable<UserHandle>(Intent.EXTRA_USER)!!
sessionId = requireArguments().getLong(Constants.EXTRA_SESSION_ID)
+ if (requireArguments().containsKey(EXTRA_SOURCE) &&
+ (requireArguments().getString(EXTRA_SOURCE) == EXTRA_SOURCE_NOTIFICATION)) {
+ logDecisionReminderNotificationClicked()
+ }
val factory = ReviewPermissionDecisionsViewModelFactory(
requireActivity().getApplication()!!, user)
viewModel = ViewModelProvider(this,
@@ -98,6 +112,8 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
onRecentDecisionsChanged(recentDecisions)
}
headerLabel = getString(R.string.app_permissions)
+
+ logScreenViewed()
}
override fun onCreatePreferences(bundle: Bundle?, s: String?) {
@@ -123,7 +139,7 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
summary = getString(R.string.auto_permission_usage_summary)
onPreferenceClickListener = Preference.OnPreferenceClickListener { _ ->
val intent = Intent(Intent.ACTION_REVIEW_PERMISSION_USAGE).apply {
- putExtra(Constants.EXTRA_SESSION_ID, sessionId!!)
+ putExtra(Constants.EXTRA_SESSION_ID, sessionId)
}
startActivity(intent)
true
@@ -140,7 +156,7 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
val intent = Intent(Intent.ACTION_MANAGE_PERMISSIONS).apply {
putExtra(Intent.EXTRA_USER, user)
putExtra(ManagePermissionsActivity.EXTRA_CALLER_NAME, javaClass.name)
- putExtra(Constants.EXTRA_SESSION_ID, sessionId!!)
+ putExtra(Constants.EXTRA_SESSION_ID, sessionId)
}
startActivity(intent)
true
@@ -163,6 +179,8 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
viewModel.createManageAppPermissionIntent(recentDecision).also {
startActivity(it)
}
+ logPermissionDecisionClicked(recentDecision.packageName,
+ recentDecision.permissionGroupName)
true
}
}
@@ -176,12 +194,13 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
icon = Utils.applyTint(context, viewAllIcon, android.R.attr.colorControlNormal)
title = getString(R.string.review_permission_decisions_view_all)
onPreferenceClickListener = Preference.OnPreferenceClickListener {
- val frag = AutoReviewPermissionDecisionsViewAllFragment.newInstance(sessionId!!,
+ val frag = AutoReviewPermissionDecisionsViewAllFragment.newInstance(sessionId,
user)
getParentFragmentManager().beginTransaction()
.replace(android.R.id.content, frag)
.addToBackStack(null)
.commit()
+ logViewAllClicked()
true
}
}
@@ -194,4 +213,38 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
}
preferenceGroup.addPreference(preference)
}
+
+ private fun logScreenViewed() {
+ PermissionControllerStatsLog.write(
+ PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED,
+ sessionId,
+ RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__SCREEN_VIEWED,
+ null,
+ null)
+ }
+
+ private fun logViewAllClicked() {
+ PermissionControllerStatsLog.write(
+ PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED,
+ sessionId,
+ RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__VIEW_ALL_CLICKED,
+ null,
+ null)
+ }
+
+ private fun logPermissionDecisionClicked(packageName: String, permissionGroupName: String) {
+ val uid = getPackageUid(requireActivity().getApplication(), packageName, user) ?: return
+ PermissionControllerStatsLog.write(
+ PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED,
+ sessionId,
+ RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__REVIEW_DECISION,
+ uid,
+ permissionGroupName)
+ }
+
+ private fun logDecisionReminderNotificationClicked() {
+ PermissionControllerStatsLog.write(
+ PermissionControllerStatsLog.PERMISSION_REMINDER_NOTIFICATION_INTERACTED,
+ sessionId, PERMISSION_REMINDER_NOTIFICATION_INTERACTED__RESULT__NOTIFICATION_CLICKED)
+ }
}