summaryrefslogtreecommitdiff
path: root/PermissionController/src/com/android/permissioncontroller/safetycenter
diff options
context:
space:
mode:
authorShriya Gupta <shrigupt@google.com>2023-03-07 16:51:37 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2023-03-07 16:51:37 +0000
commit8fc7026586356a82a9ff985d894e293e011120c1 (patch)
treed6b729a061cb654f639440f38a2cb6a32e3d8625 /PermissionController/src/com/android/permissioncontroller/safetycenter
parent02a2e70e8b0e7cc4dae7c8374d88196ea543aebd (diff)
parent02892492229bffa90c17075462ad7dfe276d1e17 (diff)
downloadPermission-8fc7026586356a82a9ff985d894e293e011120c1.tar.gz
Merge "Add interaction logging for subpages" into udc-dev
Diffstat (limited to 'PermissionController/src/com/android/permissioncontroller/safetycenter')
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/InteractionLogger.kt128
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/PrivacySubpageFragment.kt19
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyBrandChipPreference.kt15
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java23
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt19
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyHomepageEntryPreference.kt12
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt9
9 files changed, 166 insertions, 70 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/InteractionLogger.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/InteractionLogger.kt
index b48d74ad7..c4707c2a3 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/InteractionLogger.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/InteractionLogger.kt
@@ -33,6 +33,7 @@ import com.android.permissioncontroller.PermissionControllerStatsLog
import com.android.permissioncontroller.PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ISSUE_STATE__ISSUE_STATE_UNKNOWN
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.safetycenter.SafetyCenterConstants
+import com.android.permissioncontroller.safetycenter.SafetyCenterConstants.EXTRA_SETTINGS_FRAGMENT_ARGS_KEY
import com.android.safetycenter.internaldata.SafetyCenterIds
import java.math.BigInteger
import java.security.MessageDigest
@@ -43,7 +44,8 @@ class InteractionLogger(
var sessionId: Long = Constants.INVALID_SESSION_ID,
var viewType: ViewType = ViewType.UNKNOWN,
var navigationSource: NavigationSource = NavigationSource.UNKNOWN,
- var navigationSensor: Sensor = Sensor.UNKNOWN
+ var navigationSensor: Sensor = Sensor.UNKNOWN,
+ var groupId: String? = null
) {
fun record(action: Action) {
writeAtom(action)
@@ -57,7 +59,8 @@ class InteractionLogger(
sourceId = decodedId.safetyCenterIssueKey.safetySourceId,
sourceProfileType =
SafetySourceProfileType.fromUserId(decodedId.safetyCenterIssueKey.userId),
- issueTypeId = decodedId.issueTypeId)
+ issueTypeId = decodedId.issueTypeId
+ )
}
fun recordForEntry(action: Action, entry: SafetyCenterEntry) {
@@ -66,7 +69,8 @@ class InteractionLogger(
action,
LogSeverityLevel.fromEntrySeverityLevel(entry.severityLevel),
sourceId = decodedId.safetySourceId,
- sourceProfileType = SafetySourceProfileType.fromUserId(decodedId.userId))
+ sourceProfileType = SafetySourceProfileType.fromUserId(decodedId.userId)
+ )
}
fun recordForSensor(action: Action, sensor: Sensor) {
@@ -101,10 +105,10 @@ class InteractionLogger(
sourceProfileType.statsLogValue,
encodeStringId(issueTypeId),
(if (sensor != Sensor.UNKNOWN) sensor else navigationSensor).statsLogValue,
- // TODO(b/268309208): Log group ID and subpage viewType for subpages
- /* encodedSafetySourcesGroupId= */ 0,
+ encodeStringId(groupId),
// TODO(b/268309491): Log issue state for dismissed and un-dismissed issues.
- SAFETY_CENTER_INTERACTION_REPORTED__ISSUE_STATE__ISSUE_STATE_UNKNOWN)
+ SAFETY_CENTER_INTERACTION_REPORTED__ISSUE_STATE__ISSUE_STATE_UNKNOWN
+ )
}
private companion object {
@@ -127,76 +131,100 @@ class InteractionLogger(
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
enum class Action(val statsLogValue: Int) {
UNKNOWN(
- PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ACTION_UNKNOWN),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ACTION_UNKNOWN
+ ),
SAFETY_CENTER_VIEWED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SAFETY_CENTER_VIEWED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SAFETY_CENTER_VIEWED
+ ),
SAFETY_ISSUE_VIEWED(
- PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SAFETY_ISSUE_VIEWED),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SAFETY_ISSUE_VIEWED
+ ),
SCAN_INITIATED(
- PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SCAN_INITIATED),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SCAN_INITIATED
+ ),
ISSUE_PRIMARY_ACTION_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_PRIMARY_ACTION_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_PRIMARY_ACTION_CLICKED
+ ),
ISSUE_SECONDARY_ACTION_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_SECONDARY_ACTION_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_SECONDARY_ACTION_CLICKED
+ ),
ISSUE_DISMISS_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_DISMISS_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_DISMISS_CLICKED
+ ),
MORE_ISSUES_CLICKED(
- PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__MORE_ISSUES_CLICKED),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__MORE_ISSUES_CLICKED
+ ),
ENTRY_CLICKED(
- PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ENTRY_CLICKED),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ENTRY_CLICKED
+ ),
ENTRY_ICON_ACTION_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ENTRY_ICON_ACTION_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ENTRY_ICON_ACTION_CLICKED
+ ),
STATIC_ENTRY_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__STATIC_ENTRY_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__STATIC_ENTRY_CLICKED
+ ),
PRIVACY_CONTROL_TOGGLE_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__PRIVACY_CONTROL_TOGGLE_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__PRIVACY_CONTROL_TOGGLE_CLICKED
+ ),
SENSOR_PERMISSION_REVOKE_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SENSOR_PERMISSION_REVOKE_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SENSOR_PERMISSION_REVOKE_CLICKED
+ ),
SENSOR_PERMISSION_SEE_USAGES_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SENSOR_PERMISSION_SEE_USAGES_CLICKED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__SENSOR_PERMISSION_SEE_USAGES_CLICKED
+ ),
REVIEW_SETTINGS_CLICKED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__REVIEW_SETTINGS_CLICKED)
+ .SAFETY_CENTER_INTERACTION_REPORTED__ACTION__REVIEW_SETTINGS_CLICKED
+ )
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
enum class ViewType(val statsLogValue: Int) {
UNKNOWN(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__VIEW_TYPE__VIEW_TYPE_UNKNOWN),
+ .SAFETY_CENTER_INTERACTION_REPORTED__VIEW_TYPE__VIEW_TYPE_UNKNOWN
+ ),
FULL(PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__VIEW_TYPE__FULL),
QUICK_SETTINGS(
- PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__VIEW_TYPE__QUICK_SETTINGS)
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__VIEW_TYPE__QUICK_SETTINGS
+ ),
+ SUBPAGE(PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__VIEW_TYPE__SUBPAGE)
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
enum class NavigationSource(val statsLogValue: Int) {
UNKNOWN(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SOURCE_UNKNOWN),
+ .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SOURCE_UNKNOWN
+ ),
NOTIFICATION(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__NOTIFICATION),
+ .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__NOTIFICATION
+ ),
QUICK_SETTINGS_TILE(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__QUICK_SETTINGS_TILE),
+ .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__QUICK_SETTINGS_TILE
+ ),
SETTINGS(
- PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SETTINGS),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SETTINGS
+ ),
SENSOR_INDICATOR(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SENSOR_INDICATOR);
+ .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SENSOR_INDICATOR
+ ),
+ SAFETY_CENTER(
+ PermissionControllerStatsLog
+ .SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SAFETY_CENTER
+ );
fun addToIntent(intent: Intent) {
intent.putExtra(SafetyCenterConstants.EXTRA_NAVIGATION_SOURCE, this.toString())
@@ -215,9 +243,12 @@ enum class NavigationSource(val statsLogValue: Int) {
val intentNavigationSource =
intent.getStringExtra(SafetyCenterConstants.EXTRA_NAVIGATION_SOURCE)
val sourceIssueId = intent.getStringExtra(EXTRA_SAFETY_SOURCE_ISSUE_ID)
+ val searchKey = intent.getStringExtra(EXTRA_SETTINGS_FRAGMENT_ARGS_KEY)
return if (sourceIssueId != null) {
NOTIFICATION
+ } else if (searchKey != null) {
+ SETTINGS
} else if (intentNavigationSource != null) {
valueOf(intentNavigationSource)
} else {
@@ -228,7 +259,9 @@ enum class NavigationSource(val statsLogValue: Int) {
private fun fromQuickSettingsIntent(intent: Intent): NavigationSource {
val usages =
intent.getParcelableArrayListExtra(
- PermissionManager.EXTRA_PERMISSION_USAGES, PermissionGroupUsage::class.java)
+ PermissionManager.EXTRA_PERMISSION_USAGES,
+ PermissionGroupUsage::class.java
+ )
return if (usages != null && usages.isNotEmpty()) {
SENSOR_INDICATOR
@@ -243,19 +276,24 @@ enum class NavigationSource(val statsLogValue: Int) {
enum class LogSeverityLevel(val statsLogValue: Int) {
UNKNOWN(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_LEVEL_UNKNOWN),
+ .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_LEVEL_UNKNOWN
+ ),
UNSPECIFIED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_UNSPECIFIED),
+ .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_UNSPECIFIED
+ ),
OK(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_OK),
+ .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_OK
+ ),
RECOMMENDATION(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_RECOMMENDATION),
+ .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_RECOMMENDATION
+ ),
CRITICAL_WARNING(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_CRITICAL_WARNING);
+ .SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_CRITICAL_WARNING
+ );
companion object {
@JvmStatic
@@ -293,13 +331,16 @@ enum class LogSeverityLevel(val statsLogValue: Int) {
enum class SafetySourceProfileType(val statsLogValue: Int) {
UNKNOWN(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN),
+ .SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN
+ ),
PERSONAL(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL),
+ .SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL
+ ),
MANAGED(
PermissionControllerStatsLog
- .SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED);
+ .SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED
+ );
companion object {
@JvmStatic
@@ -311,7 +352,8 @@ enum class SafetySourceProfileType(val statsLogValue: Int) {
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
enum class Sensor(val statsLogValue: Int) {
UNKNOWN(
- PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__SENSOR_UNKNOWN),
+ PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__SENSOR_UNKNOWN
+ ),
MICROPHONE(PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__MICROPHONE),
CAMERA(PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__CAMERA),
LOCATION(PermissionControllerStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__LOCATION);
@@ -323,7 +365,9 @@ enum class Sensor(val statsLogValue: Int) {
val usages =
intent.getParcelableArrayListExtra(
- PermissionManager.EXTRA_PERMISSION_USAGES, PermissionGroupUsage::class.java)
+ PermissionManager.EXTRA_PERMISSION_USAGES,
+ PermissionGroupUsage::class.java
+ )
// Multiple usages may be in effect, but we can only log one. Log unknown in this
// scenario until we have a better solution (an explicit value approved for
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/PrivacySubpageFragment.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/PrivacySubpageFragment.kt
index 55161b53b..26746510f 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/PrivacySubpageFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/PrivacySubpageFragment.kt
@@ -24,7 +24,9 @@ import androidx.annotation.RequiresApi
import androidx.lifecycle.ViewModelProvider
import androidx.preference.Preference
import androidx.preference.PreferenceGroup
+import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.R
+import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.safetycenter.ui.SafetyBrandChipPreference.Companion.closeSubpage
import com.android.permissioncontroller.safetycenter.ui.model.PrivacyControlsViewModel
import com.android.permissioncontroller.safetycenter.ui.model.PrivacyControlsViewModel.Pref
@@ -42,16 +44,18 @@ class PrivacySubpageFragment : SafetyCenterFragment() {
private lateinit var subpageGenericEntryGroup: PreferenceGroup
private lateinit var subpageDataEntryGroup: PreferenceGroup
private lateinit var privacyControlsViewModel: PrivacyControlsViewModel
+ private var sessionId = Constants.INVALID_SESSION_ID
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
super.onCreatePreferences(savedInstanceState, rootKey)
setPreferencesFromResource(R.xml.privacy_subpage, rootKey)
+ sessionId = Utils.getOrGenerateSessionId(requireActivity().getIntent())
subpageBrandChip = getPreferenceScreen().findPreference(BRAND_CHIP_KEY)!!
subpageIssueGroup = getPreferenceScreen().findPreference(ISSUE_GROUP_KEY)!!
subpageGenericEntryGroup = getPreferenceScreen().findPreference(GENERIC_ENTRY_GROUP_KEY)!!
subpageDataEntryGroup = getPreferenceScreen().findPreference(DATA_ENTRY_GROUP_KEY)!!
- subpageBrandChip.setupListener(requireActivity())
+ subpageBrandChip.setupListener(requireActivity(), sessionId)
val factory = PrivacyControlsViewModelFactory(requireActivity().getApplication())
privacyControlsViewModel =
@@ -64,6 +68,14 @@ class PrivacySubpageFragment : SafetyCenterFragment() {
prerenderCurrentSafetyCenterData()
}
+ override fun configureInteractionLogger() {
+ val logger = safetyCenterViewModel.interactionLogger
+ logger.sessionId = sessionId
+ logger.navigationSource = NavigationSource.fromIntent(requireActivity().getIntent())
+ logger.viewType = ViewType.SUBPAGE
+ logger.groupId = SOURCE_GROUP_ID
+ }
+
override fun onResume() {
super.onResume()
safetyCenterViewModel.pageOpen(SOURCE_GROUP_ID)
@@ -74,7 +86,7 @@ class PrivacySubpageFragment : SafetyCenterFragment() {
val entryGroup = uiData?.getMatchingGroup(SOURCE_GROUP_ID)
if (entryGroup == null) {
Log.w(TAG, "$SOURCE_GROUP_ID doesn't match any of the existing SafetySourcesGroup IDs")
- closeSubpage(requireActivity(), requireContext())
+ closeSubpage(requireActivity(), requireContext(), sessionId)
return
}
@@ -122,7 +134,8 @@ class PrivacySubpageFragment : SafetyCenterFragment() {
sameTaskSourceIds,
requireActivity()
),
- entry
+ entry,
+ safetyCenterViewModel
)
when (sourceId) {
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyBrandChipPreference.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyBrandChipPreference.kt
index d437aecce..bf2d0565c 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyBrandChipPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyBrandChipPreference.kt
@@ -25,6 +25,7 @@ import androidx.annotation.RequiresApi
import androidx.fragment.app.FragmentActivity
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
+import com.android.permissioncontroller.Constants.EXTRA_SESSION_ID
import com.android.permissioncontroller.R
import com.android.permissioncontroller.safetycenter.SafetyCenterConstants
@@ -49,9 +50,10 @@ internal class SafetyBrandChipPreference(context: Context, attrs: AttributeSet)
* Sets the listener that handles clicks for the brand chip
*
* @param activity represents the parent activity of the fragment
+ * @param sessionId identifier for the current session
*/
- fun setupListener(activity: FragmentActivity) {
- brandChipClickListener = View.OnClickListener { closeSubpage(activity, context) }
+ fun setupListener(activity: FragmentActivity, sessionId: Long) {
+ brandChipClickListener = View.OnClickListener { closeSubpage(activity, context, sessionId) }
}
companion object {
@@ -60,14 +62,21 @@ internal class SafetyBrandChipPreference(context: Context, attrs: AttributeSet)
*
* @param fragmentActivity represents the parent activity of the fragment
* @param fragmentContext represents the context associated with the fragment
+ * @param sessionId identifier for the current session
*/
- fun closeSubpage(fragmentActivity: FragmentActivity, fragmentContext: Context) {
+ fun closeSubpage(
+ fragmentActivity: FragmentActivity,
+ fragmentContext: Context,
+ sessionId: Long
+ ) {
val openedFromHomepage =
fragmentActivity
.getIntent()
.getBooleanExtra(SafetyCenterConstants.EXTRA_OPENED_FROM_HOMEPAGE, false)
if (!openedFromHomepage) {
val intent = Intent(Intent.ACTION_SAFETY_CENTER)
+ intent.putExtra(EXTRA_SESSION_ID, sessionId)
+ NavigationSource.SAFETY_CENTER.addToIntent(intent)
fragmentContext.startActivity(intent)
}
fragmentActivity.finish()
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
index d6595a27b..9774ed107 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
@@ -203,6 +203,7 @@ public final class SafetyCenterActivity extends CollapsingToolbarBaseActivity {
}
if (Objects.equals(groupId, PrivacySubpageFragment.SOURCE_GROUP_ID)) {
+ logPrivacySourceMetric();
return new PrivacySubpageFragment();
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java
index 0e0e1bb90..b59177d43 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java
@@ -73,6 +73,7 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment {
private PreferenceGroup mEntriesGroup;
private PreferenceGroup mStaticEntriesGroup;
private boolean mIsQuickSettingsFragment;
+ private long mSessionId = Constants.INVALID_SESSION_ID;
public SafetyCenterDashboardFragment() {}
@@ -99,6 +100,9 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment {
setPreferencesFromResource(R.xml.safety_center_dashboard, rootKey);
if (getArguments() != null) {
+ mSessionId =
+ getArguments()
+ .getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID);
mIsQuickSettingsFragment =
getArguments().getBoolean(QUICK_SETTINGS_SAFETY_CENTER_FRAGMENT, false);
}
@@ -134,25 +138,15 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment {
}
@Override
- public void onStart() {
- super.onStart();
-
- configureInteractionLogger();
- getSafetyCenterViewModel().getInteractionLogger().record(Action.SAFETY_CENTER_VIEWED);
- }
-
- @Override
public void onResume() {
super.onResume();
getSafetyCenterViewModel().pageOpen();
}
- private void configureInteractionLogger() {
+ @Override
+ public void configureInteractionLogger() {
InteractionLogger logger = getSafetyCenterViewModel().getInteractionLogger();
-
- logger.setSessionId(
- requireArguments()
- .getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID));
+ logger.setSessionId(mSessionId);
logger.setViewType(mIsQuickSettingsFragment ? ViewType.QUICK_SETTINGS : ViewType.FULL);
Intent intent = requireActivity().getIntent();
@@ -232,7 +226,8 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment {
boolean isLastElement = i == size - 1;
if (SafetyCenterUiFlags.getShowSubpages() && group != null) {
- mEntriesGroup.addPreference(new SafetyHomepageEntryPreference(context, group));
+ mEntriesGroup.addPreference(
+ new SafetyHomepageEntryPreference(context, group, mSessionId));
} else if (entry != null) {
addTopLevelEntry(context, entry, isFirstElement, isLastElement);
} else if (group != null) {
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt
index 8ed8f7c8f..358c790cd 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt
@@ -113,6 +113,12 @@ abstract class SafetyCenterFragment : PreferenceFragmentCompat() {
highlightManager.unregisterObserverIfNeeded()
}
+ override fun onStart() {
+ super.onStart()
+ configureInteractionLogger()
+ safetyCenterViewModel.interactionLogger.record(Action.SAFETY_CENTER_VIEWED)
+ }
+
override fun onResume() {
super.onResume()
highlightManager.highlightPreferenceIfNeeded()
@@ -141,10 +147,12 @@ abstract class SafetyCenterFragment : PreferenceFragmentCompat() {
* preferences they will modify in [renderSafetyCenterData].
*/
protected fun prerenderCurrentSafetyCenterData() =
- renderSafetyCenterData(safetyCenterViewModel.getCurrentSafetyCenterDataAsUiData())
+ renderSafetyCenterData(safetyCenterViewModel.getCurrentSafetyCenterDataAsUiData())
abstract fun renderSafetyCenterData(uiData: SafetyCenterUiData?)
+ abstract fun configureInteractionLogger()
+
private fun displayErrorDetails(errorDetails: SafetyCenterErrorDetails?) {
if (errorDetails == null) return
Toast.makeText(requireContext(), errorDetails.errorMessage, Toast.LENGTH_LONG).show()
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt
index 84455a10a..6e13b6d29 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt
@@ -22,7 +22,9 @@ import android.safetycenter.SafetyCenterEntryGroup
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.preference.PreferenceGroup
+import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.R
+import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.safetycenter.ui.SafetyBrandChipPreference.Companion.closeSubpage
import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterUiData
import com.android.safetycenter.resources.SafetyCenterResourcesContext
@@ -38,11 +40,13 @@ class SafetyCenterSubpageFragment : SafetyCenterFragment() {
private lateinit var subpageIssueGroup: PreferenceGroup
private lateinit var subpageEntryGroup: PreferenceGroup
private lateinit var subpageFooter: FooterPreference
+ private var sessionId = Constants.INVALID_SESSION_ID
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
super.onCreatePreferences(savedInstanceState, rootKey)
setPreferencesFromResource(R.xml.safety_center_subpage, rootKey)
sourceGroupId = requireArguments().getString(SOURCE_GROUP_ID_KEY)!!
+ sessionId = Utils.getOrGenerateSessionId(requireActivity().getIntent())
subpageBrandChip = getPreferenceScreen().findPreference(BRAND_CHIP_KEY)!!
subpageIllustration = getPreferenceScreen().findPreference(ILLUSTRATION_KEY)!!
@@ -50,13 +54,21 @@ class SafetyCenterSubpageFragment : SafetyCenterFragment() {
subpageEntryGroup = getPreferenceScreen().findPreference(ENTRY_GROUP_KEY)!!
subpageFooter = getPreferenceScreen().findPreference(FOOTER_KEY)!!
- subpageBrandChip.setupListener(requireActivity())
+ subpageBrandChip.setupListener(requireActivity(), sessionId)
setupIllustration()
setupFooter()
prerenderCurrentSafetyCenterData()
}
+ override fun configureInteractionLogger() {
+ val logger = safetyCenterViewModel.interactionLogger
+ logger.sessionId = sessionId
+ logger.navigationSource = NavigationSource.fromIntent(requireActivity().getIntent())
+ logger.viewType = ViewType.SUBPAGE
+ logger.groupId = sourceGroupId
+ }
+
override fun onResume() {
super.onResume()
safetyCenterViewModel.pageOpen(sourceGroupId)
@@ -67,7 +79,7 @@ class SafetyCenterSubpageFragment : SafetyCenterFragment() {
val entryGroup = uiData?.getMatchingGroup(sourceGroupId)
if (entryGroup == null) {
Log.w(TAG, "$sourceGroupId doesn't match any of the existing SafetySourcesGroup IDs")
- closeSubpage(requireActivity(), requireContext())
+ closeSubpage(requireActivity(), requireContext(), sessionId)
return
}
@@ -137,7 +149,8 @@ class SafetyCenterSubpageFragment : SafetyCenterFragment() {
sameTaskSourceIds,
requireActivity()
),
- entry
+ entry,
+ safetyCenterViewModel
)
)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyHomepageEntryPreference.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyHomepageEntryPreference.kt
index 14d465544..057030a11 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyHomepageEntryPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyHomepageEntryPreference.kt
@@ -24,6 +24,7 @@ import android.safetycenter.SafetyCenterManager
import android.text.TextUtils
import androidx.annotation.RequiresApi
import androidx.preference.Preference
+import com.android.permissioncontroller.Constants.EXTRA_SESSION_ID
import com.android.permissioncontroller.safetycenter.SafetyCenterConstants
import java.util.Objects
@@ -34,7 +35,8 @@ import java.util.Objects
@RequiresApi(UPSIDE_DOWN_CAKE)
internal class SafetyHomepageEntryPreference(
context: Context,
- private val entryGroup: SafetyCenterEntryGroup
+ private val entryGroup: SafetyCenterEntryGroup,
+ sessionId: Long
) : Preference(context), ComparablePreference {
init {
@@ -42,12 +44,16 @@ internal class SafetyHomepageEntryPreference(
setSummary(entryGroup.summary)
setIcon(
SeverityIconPicker.selectIconResId(
- entryGroup.severityLevel, entryGroup.severityUnspecifiedIconType))
+ entryGroup.severityLevel,
+ entryGroup.severityUnspecifiedIconType
+ )
+ )
- // TODO(b/260822348): Check if there is a better way to open the subpage fragment
val intent = Intent(Intent.ACTION_SAFETY_CENTER)
intent.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, entryGroup.id)
intent.putExtra(SafetyCenterConstants.EXTRA_OPENED_FROM_HOMEPAGE, true)
+ intent.putExtra(EXTRA_SESSION_ID, sessionId)
+ NavigationSource.SAFETY_CENTER.addToIntent(intent)
setIntent(intent)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt
index b0564a873..7ff31d009 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt
@@ -31,6 +31,7 @@ import androidx.preference.PreferenceViewHolder
import com.android.permissioncontroller.R
import com.android.permissioncontroller.safetycenter.SafetyCenterConstants.PERSONAL_PROFILE_SUFFIX
import com.android.permissioncontroller.safetycenter.SafetyCenterConstants.WORK_PROFILE_SUFFIX
+import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterViewModel
import com.android.permissioncontroller.safetycenter.ui.view.SafetyEntryCommonViewsManager.Companion.changeEnabledState
import com.android.safetycenter.internaldata.SafetyCenterEntryId
import com.android.safetycenter.internaldata.SafetyCenterIds
@@ -44,7 +45,8 @@ import com.android.settingslib.widget.TwoTargetPreference
class SafetySubpageEntryPreference(
context: Context,
private val launchTaskId: Int?,
- private val entry: SafetyCenterEntry
+ private val entry: SafetyCenterEntry,
+ private val viewModel: SafetyCenterViewModel
) : TwoTargetPreference(context), ComparablePreference {
init {
@@ -75,6 +77,7 @@ class SafetySubpageEntryPreference(
setOnPreferenceClickListener {
try {
PendingIntentSender.send(pendingIntent, launchTaskId)
+ viewModel.interactionLogger.recordForEntry(Action.ENTRY_CLICKED, entry)
true
} catch (ex: Exception) {
Log.e(TAG, "Failed to execute pending intent for $entry", ex)
@@ -106,6 +109,10 @@ class SafetySubpageEntryPreference(
iconActionButton?.setOnClickListener {
try {
PendingIntentSender.send(iconAction.pendingIntent, launchTaskId)
+ viewModel.interactionLogger.recordForEntry(
+ Action.ENTRY_ICON_ACTION_CLICKED,
+ entry
+ )
} catch (ex: Exception) {
Log.e(TAG, "Failed to execute icon action intent for $entry", ex)
}