fix picture-in-picture logging

+ log uid and activity name

Test: manual test. Will add cts test
Change-Id: I3d3e77b24779e439eacc06007fae62c037a19fd6
This commit is contained in:
Chenjie Yu
2018-02-15 10:19:32 -08:00
parent 2094d9d306
commit ae9fdf0403
5 changed files with 53 additions and 48 deletions

View File

@ -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 short_name = 2;
optional string class_name = 3;
// 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;
}
/**

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -8655,8 +8655,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);
};

View File

@ -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