diff options
5 files changed, 53 insertions, 48 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 85e209be6413..d9094dd1d86d 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -993,21 +993,18 @@ message AppStartFullyDrawnChanged { * frameworks/base/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java */ message PictureInPictureStateChanged { + // -1 if it is not available optional int32 uid = 1; - optional string package_name = 2; - - optional string class_name = 3; + optional string short_name = 2; - // Picture-in-Picture action occurred, similar to - // frameworks/base/proto/src/metrics_constants.proto enum State { ENTERED = 1; EXPANDED_TO_FULL_SCREEN = 2; MINIMIZED = 3; DISMISSED = 4; } - optional State state = 4; + optional State state = 3; } /** diff --git a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java index 1376687be019..adad0362eca9 100644 --- a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java +++ b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java @@ -16,7 +16,10 @@ package com.android.internal.os.logging; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager.NameNotFoundException; +import android.util.Pair; import android.util.StatsLog; import com.android.internal.logging.MetricsLogger; @@ -31,43 +34,49 @@ public class MetricsLoggerWrapper { private static final int METRIC_VALUE_DISMISSED_BY_TAP = 0; private static final int METRIC_VALUE_DISMISSED_BY_DRAG = 1; - public static void logPictureInPictureDismissByTap(Context context) { + public static void logPictureInPictureDismissByTap(Context context, + Pair<ComponentName, Integer> topActivityInfo) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED, METRIC_VALUE_DISMISSED_BY_TAP); StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, + getUid(context, topActivityInfo.first, topActivityInfo.second), + topActivityInfo.first.flattenToString(), StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED); } - public static void logPictureInPictureDismissByDrag(Context context) { + public static void logPictureInPictureDismissByDrag(Context context, + Pair<ComponentName, Integer> topActivityInfo) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED, METRIC_VALUE_DISMISSED_BY_DRAG); StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, + getUid(context, topActivityInfo.first, topActivityInfo.second), + topActivityInfo.first.flattenToString(), StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED); } - public static void logPictureInPictureMinimize(Context context, boolean isMinimized) { + public static void logPictureInPictureMinimize(Context context, boolean isMinimized, + Pair<ComponentName, Integer> topActivityInfo) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_MINIMIZED, isMinimized); - if (isMinimized) { - StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, - StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED); - } else { - StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, - StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN); + StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, + getUid(context, topActivityInfo.first, topActivityInfo.second), + topActivityInfo.first.flattenToString(), + StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED); + } + + /** + * Get uid from component name and user Id + * @return uid. -1 if not found. + */ + private static int getUid(Context context, ComponentName componentName, int userId) { + int uid = -1; + try { + uid = context.getPackageManager().getApplicationInfoAsUser( + componentName.getPackageName(), 0, userId).uid; + } catch (NameNotFoundException e) { } + return uid; } public static void logPictureInPictureMenuVisible(Context context, boolean menuStateFull) { @@ -76,24 +85,21 @@ public class MetricsLoggerWrapper { } public static void logPictureInPictureEnter(Context context, - boolean supportsEnterPipOnTaskSwitch) { + int uid, String shortComponentName, boolean supportsEnterPipOnTaskSwitch) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_ENTERED, supportsEnterPipOnTaskSwitch); - if (supportsEnterPipOnTaskSwitch) { - StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, - StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED); - } + StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, uid, + shortComponentName, + StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED); } - public static void logPictureInPictureFullScreen(Context context) { + public static void logPictureInPictureFullScreen(Context context, int uid, + String shortComponentName) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN); StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, + uid, + shortComponentName, StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index b25351731a35..77931e447e1d 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -16,9 +16,9 @@ package com.android.systemui.pip.phone; -import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_CLOSE; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_FULL; +import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -42,7 +42,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + import com.android.internal.os.logging.MetricsLoggerWrapper; import com.android.internal.policy.PipSnapAlgorithm; import com.android.systemui.R; @@ -158,8 +158,9 @@ public class PipTouchHandler { @Override public void onPipDismiss() { + MetricsLoggerWrapper.logPictureInPictureDismissByTap(mContext, + PipUtils.getTopPinnedActivity(mContext, mActivityManager)); mMotionHelper.dismissPip(); - MetricsLoggerWrapper.logPictureInPictureDismissByTap(mContext); } @Override @@ -458,7 +459,8 @@ public class PipTouchHandler { return; } if (mIsMinimized != isMinimized) { - MetricsLoggerWrapper.logPictureInPictureMinimize(mContext, isMinimized); + MetricsLoggerWrapper.logPictureInPictureMinimize(mContext, + isMinimized, PipUtils.getTopPinnedActivity(mContext, mActivityManager)); } mIsMinimized = isMinimized; mSnapAlgorithm.setMinimized(isMinimized); @@ -661,9 +663,10 @@ public class PipTouchHandler { if (ENABLE_DISMISS_DRAG_TO_EDGE) { // Check if the user dragged or flung the PiP offscreen to dismiss it if (mMotionHelper.shouldDismissPip() || isFlingToBot) { + MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext, + PipUtils.getTopPinnedActivity(mContext, mActivityManager)); mMotionHelper.animateDismiss(mMotionHelper.getBounds(), vel.x, vel.y, mUpdateScrimListener); - MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext); return true; } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 183862b8b8bc..e8f0113ac2ab 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -8657,8 +8657,8 @@ public class ActivityManagerService extends IActivityManager.Stub final PinnedActivityStack stack = r.getStack(); stack.setPictureInPictureAspectRatio(aspectRatio); stack.setPictureInPictureActions(actions); - - MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.supportsEnterPipOnTaskSwitch); + MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid, + r.shortComponentName, r.supportsEnterPipOnTaskSwitch); logPictureInPictureArgs(params); }; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index f4f60c2c43a9..a82facd174a3 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2599,9 +2599,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // resize when we remove task from it below and it is detached from the // display because it no longer contains any tasks. mAllowDockedStackResize = false; - } else if (inPinnedWindowingMode && onTop) { - // Log if we are expanding the PiP to fullscreen - MetricsLoggerWrapper.logPictureInPictureFullScreen(mService.mContext); } // If we are moving from the pinned stack, then the animation takes care of updating @@ -2624,6 +2621,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D isTopTask /* animate */, DEFER_RESUME, schedulePictureInPictureModeChange, "moveTasksToFullscreenStack - onTop"); + MetricsLoggerWrapper.logPictureInPictureFullScreen(mService.mContext, + task.effectiveUid, task.realActivity.flattenToString()); } else { // Position the tasks in the fullscreen stack in order at the bottom of the // stack. Also defer resume until all the tasks have been moved to the |