diff options
author | Jordan Jozwiak <jjoz@google.com> | 2022-03-16 20:14:07 -0700 |
---|---|---|
committer | Jordan Jozwiak <jjoz@google.com> | 2022-03-23 07:42:30 -0700 |
commit | d64922ab303a49b4473d599bda5b504ccb2de90f (patch) | |
tree | b7fba9478661771d69d94cad831d1ba375565a8a | |
parent | 0bfc545a78a261f3d1cad85297b542cabd16fd64 (diff) | |
download | Permission-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
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) + } } |