Loading cmds/statsd/src/atoms.proto +27 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,7 @@ message Atom { TouchGestureClassified touch_gesture_classified = 177; HiddenApiUsed hidden_api_used = 178 [(allow_from_any_uid) = true]; StyleUIChanged style_ui_changed = 179; PrivacyIndicatorsInteracted privacy_indicators_interacted = 180; } // Pulled events will start at field 10000. Loading Loading @@ -3395,6 +3396,32 @@ message HiddenApiUsed { optional bool access_denied = 4; } /** * Logs user interaction with the Privacy Indicators added in Q. In particular: * - When user sees privacy chip * - When user clicks privacy chip * - How does the user exit the Privacy Dialog * Logged from: * packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt * packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java */ message PrivacyIndicatorsInteracted { enum Type { UNKNOWN = 0; CHIP_VIEWED = 1; CHIP_CLICKED = 2; DIALOG_PRIVACY_SETTINGS = 3; DIALOG_DISMISS = 4; DIALOG_LINE_ITEM = 5; } optional Type type = 1 [(state_field_option).option = EXCLUSIVE]; // Used if the type is LINE_ITEM optional string package_name = 2; } ////////////////////////////////////////////////////////////////////// // Pulled atoms below this line // ////////////////////////////////////////////////////////////////////// Loading packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt +13 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.res.ColorStateList import android.os.UserHandle import android.provider.Settings import android.util.IconDrawableFactory import android.util.StatsLog import android.view.Gravity import android.view.LayoutInflater import android.view.View Loading Loading @@ -55,7 +56,13 @@ class OngoingPrivacyDialog constructor( fun createDialog(): Dialog { val builder = AlertDialog.Builder(context).apply { setPositiveButton(R.string.ongoing_privacy_dialog_ok, null) setPositiveButton(R.string.ongoing_privacy_dialog_ok, object : DialogInterface.OnClickListener { override fun onClick(dialog: DialogInterface?, which: Int) { StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_DISMISS) } }) setNeutralButton(R.string.ongoing_privacy_dialog_open_settings, object : DialogInterface.OnClickListener { val intent = Intent(Settings.ACTION_PRIVACY_SETTINGS).putExtra( Loading @@ -63,6 +70,8 @@ class OngoingPrivacyDialog constructor( @Suppress("DEPRECATION") override fun onClick(dialog: DialogInterface?, which: Int) { StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog .PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_PRIVACY_SETTINGS) Dependency.get(ActivityStarter::class.java) .postStartActivityDismissingKeyguard(intent, 0) } Loading Loading @@ -136,6 +145,9 @@ class OngoingPrivacyDialog constructor( .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName) .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid)) override fun onClick(v: View?) { StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_LINE_ITEM, app.packageName) Dependency.get(ActivityStarter::class.java) .postStartActivityDismissingKeyguard(intent, 0) dismissDialog?.invoke() Loading packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +13 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; import android.util.StatsLog; import android.view.DisplayCutout; import android.view.View; import android.view.WindowInsets; Loading Loading @@ -156,6 +157,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements } }; private boolean mHasTopCutout = false; private boolean mPrivacyChipLogged = false; /** * Runnable for automatically fading out the long press tooltip (as if it were animating away). Loading Loading @@ -210,6 +212,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mPrivacyChip.setOnClickListener(this); mCarrierGroup = findViewById(R.id.carrier_group); updateResources(); Rect tintArea = new Rect(0, 0, 0, 0); Loading Loading @@ -265,6 +268,13 @@ public class QuickStatusBarHeader extends RelativeLayout implements private void setChipVisibility(boolean chipVisible) { if (chipVisible) { mPrivacyChip.setVisibility(View.VISIBLE); // Makes sure that the chip is logged as viewed at most once each time QS is opened // mListening makes sure that the callback didn't return after the user closed QS if (!mPrivacyChipLogged && mListening) { mPrivacyChipLogged = true; StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_VIEWED); } } else { mPrivacyChip.setVisibility(View.GONE); } Loading Loading @@ -534,6 +544,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mAlarmController.removeCallback(this); mPrivacyItemController.removeCallback(mPICCallback); mContext.unregisterReceiver(mRingerReceiver); mPrivacyChipLogged = false; } } Loading @@ -547,6 +558,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements PrivacyDialogBuilder builder = mPrivacyChip.getBuilder(); if (builder.getAppsAndTypes().size() == 0) return; Handler mUiHandler = new Handler(Looper.getMainLooper()); StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_CLICKED); mUiHandler.post(() -> { Dialog mDialog = new OngoingPrivacyDialog(mContext, builder).createDialog(); SystemUIDialog.setShowForAllUsers(mDialog, false); Loading Loading
cmds/statsd/src/atoms.proto +27 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,7 @@ message Atom { TouchGestureClassified touch_gesture_classified = 177; HiddenApiUsed hidden_api_used = 178 [(allow_from_any_uid) = true]; StyleUIChanged style_ui_changed = 179; PrivacyIndicatorsInteracted privacy_indicators_interacted = 180; } // Pulled events will start at field 10000. Loading Loading @@ -3395,6 +3396,32 @@ message HiddenApiUsed { optional bool access_denied = 4; } /** * Logs user interaction with the Privacy Indicators added in Q. In particular: * - When user sees privacy chip * - When user clicks privacy chip * - How does the user exit the Privacy Dialog * Logged from: * packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt * packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java */ message PrivacyIndicatorsInteracted { enum Type { UNKNOWN = 0; CHIP_VIEWED = 1; CHIP_CLICKED = 2; DIALOG_PRIVACY_SETTINGS = 3; DIALOG_DISMISS = 4; DIALOG_LINE_ITEM = 5; } optional Type type = 1 [(state_field_option).option = EXCLUSIVE]; // Used if the type is LINE_ITEM optional string package_name = 2; } ////////////////////////////////////////////////////////////////////// // Pulled atoms below this line // ////////////////////////////////////////////////////////////////////// Loading
packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt +13 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.res.ColorStateList import android.os.UserHandle import android.provider.Settings import android.util.IconDrawableFactory import android.util.StatsLog import android.view.Gravity import android.view.LayoutInflater import android.view.View Loading Loading @@ -55,7 +56,13 @@ class OngoingPrivacyDialog constructor( fun createDialog(): Dialog { val builder = AlertDialog.Builder(context).apply { setPositiveButton(R.string.ongoing_privacy_dialog_ok, null) setPositiveButton(R.string.ongoing_privacy_dialog_ok, object : DialogInterface.OnClickListener { override fun onClick(dialog: DialogInterface?, which: Int) { StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_DISMISS) } }) setNeutralButton(R.string.ongoing_privacy_dialog_open_settings, object : DialogInterface.OnClickListener { val intent = Intent(Settings.ACTION_PRIVACY_SETTINGS).putExtra( Loading @@ -63,6 +70,8 @@ class OngoingPrivacyDialog constructor( @Suppress("DEPRECATION") override fun onClick(dialog: DialogInterface?, which: Int) { StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog .PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_PRIVACY_SETTINGS) Dependency.get(ActivityStarter::class.java) .postStartActivityDismissingKeyguard(intent, 0) } Loading Loading @@ -136,6 +145,9 @@ class OngoingPrivacyDialog constructor( .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName) .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid)) override fun onClick(v: View?) { StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_LINE_ITEM, app.packageName) Dependency.get(ActivityStarter::class.java) .postStartActivityDismissingKeyguard(intent, 0) dismissDialog?.invoke() Loading
packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +13 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; import android.util.StatsLog; import android.view.DisplayCutout; import android.view.View; import android.view.WindowInsets; Loading Loading @@ -156,6 +157,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements } }; private boolean mHasTopCutout = false; private boolean mPrivacyChipLogged = false; /** * Runnable for automatically fading out the long press tooltip (as if it were animating away). Loading Loading @@ -210,6 +212,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mPrivacyChip.setOnClickListener(this); mCarrierGroup = findViewById(R.id.carrier_group); updateResources(); Rect tintArea = new Rect(0, 0, 0, 0); Loading Loading @@ -265,6 +268,13 @@ public class QuickStatusBarHeader extends RelativeLayout implements private void setChipVisibility(boolean chipVisible) { if (chipVisible) { mPrivacyChip.setVisibility(View.VISIBLE); // Makes sure that the chip is logged as viewed at most once each time QS is opened // mListening makes sure that the callback didn't return after the user closed QS if (!mPrivacyChipLogged && mListening) { mPrivacyChipLogged = true; StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_VIEWED); } } else { mPrivacyChip.setVisibility(View.GONE); } Loading Loading @@ -534,6 +544,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mAlarmController.removeCallback(this); mPrivacyItemController.removeCallback(mPICCallback); mContext.unregisterReceiver(mRingerReceiver); mPrivacyChipLogged = false; } } Loading @@ -547,6 +558,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements PrivacyDialogBuilder builder = mPrivacyChip.getBuilder(); if (builder.getAppsAndTypes().size() == 0) return; Handler mUiHandler = new Handler(Looper.getMainLooper()); StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_CLICKED); mUiHandler.post(() -> { Dialog mDialog = new OngoingPrivacyDialog(mContext, builder).createDialog(); SystemUIDialog.setShowForAllUsers(mDialog, false); Loading