diff options
author | Shriya Gupta <shrigupt@google.com> | 2023-03-06 17:49:11 +0000 |
---|---|---|
committer | Shriya Gupta <shrigupt@google.com> | 2023-03-07 15:00:11 +0000 |
commit | 02892492229bffa90c17075462ad7dfe276d1e17 (patch) | |
tree | d475a7798472e04f17cd830a943d74eb9d8806db /PermissionController/src/com/android/permissioncontroller/safetycenter | |
parent | 0c20dd12ec57e6813e48945590394a651225937a (diff) | |
download | Permission-02892492229bffa90c17075462ad7dfe276d1e17.tar.gz |
Add interaction logging for subpages
Separate tests will be added in a follow-up CL
Bug: 268309208
Test: atest SafetyCenterHostSideTestCases
Test: statsd_testdrive 473
Change-Id: Ifb6d43e999f90a72371dd23bce3535e6ac36aa12
Diffstat (limited to 'PermissionController/src/com/android/permissioncontroller/safetycenter')
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) } |