1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.internal.os.logging;
18 
19 import android.content.ComponentName;
20 import android.content.Context;
21 import android.content.pm.PackageManager.NameNotFoundException;
22 import android.util.Pair;
23 import android.util.StatsLog;
24 import android.view.WindowManager.LayoutParams;
25 
26 import com.android.internal.logging.MetricsLogger;
27 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
28 
29 /**
30  * Used to wrap different logging calls in one, so that client side code base is clean and more
31  * readable.
32  */
33 public class MetricsLoggerWrapper {
34 
35     private static final int METRIC_VALUE_DISMISSED_BY_TAP = 0;
36     private static final int METRIC_VALUE_DISMISSED_BY_DRAG = 1;
37 
logPictureInPictureDismissByTap(Context context, Pair<ComponentName, Integer> topActivityInfo)38     public static void logPictureInPictureDismissByTap(Context context,
39             Pair<ComponentName, Integer> topActivityInfo) {
40         MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
41                 METRIC_VALUE_DISMISSED_BY_TAP);
42         StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
43                 getUid(context, topActivityInfo.first, topActivityInfo.second),
44                 topActivityInfo.first.flattenToString(),
45                 StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED);
46     }
47 
logPictureInPictureDismissByDrag(Context context, Pair<ComponentName, Integer> topActivityInfo)48     public static void logPictureInPictureDismissByDrag(Context context,
49             Pair<ComponentName, Integer> topActivityInfo) {
50         MetricsLogger.action(context,
51                 MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
52                 METRIC_VALUE_DISMISSED_BY_DRAG);
53         StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
54                 getUid(context, topActivityInfo.first, topActivityInfo.second),
55                 topActivityInfo.first.flattenToString(),
56                 StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED);
57     }
58 
logPictureInPictureMinimize(Context context, boolean isMinimized, Pair<ComponentName, Integer> topActivityInfo)59     public static void logPictureInPictureMinimize(Context context, boolean isMinimized,
60             Pair<ComponentName, Integer> topActivityInfo) {
61         MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_MINIMIZED,
62                 isMinimized);
63         StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
64                 getUid(context, topActivityInfo.first, topActivityInfo.second),
65                 topActivityInfo.first.flattenToString(),
66                 StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED);
67     }
68 
69     /**
70      * Get uid from component name and user Id
71      * @return uid. -1 if not found.
72      */
getUid(Context context, ComponentName componentName, int userId)73     private static int getUid(Context context, ComponentName componentName, int userId) {
74         int uid = -1;
75         try {
76             uid = context.getPackageManager().getApplicationInfoAsUser(
77                     componentName.getPackageName(), 0, userId).uid;
78         } catch (NameNotFoundException e) {
79         }
80         return uid;
81     }
82 
logPictureInPictureMenuVisible(Context context, boolean menuStateFull)83     public static void logPictureInPictureMenuVisible(Context context, boolean menuStateFull) {
84         MetricsLogger.visibility(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_MENU,
85                 menuStateFull);
86     }
87 
logPictureInPictureEnter(Context context, int uid, String shortComponentName, boolean supportsEnterPipOnTaskSwitch)88     public static void logPictureInPictureEnter(Context context,
89             int uid, String shortComponentName, boolean supportsEnterPipOnTaskSwitch) {
90         MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_ENTERED,
91                 supportsEnterPipOnTaskSwitch);
92         StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, uid,
93                 shortComponentName,
94                 StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED);
95     }
96 
logPictureInPictureFullScreen(Context context, int uid, String shortComponentName)97     public static void logPictureInPictureFullScreen(Context context, int uid,
98             String shortComponentName) {
99         MetricsLogger.action(context,
100                 MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN);
101         StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
102                 uid,
103                 shortComponentName,
104                 StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN);
105     }
106 
logAppOverlayEnter(int uid, String packageName, boolean changed, int type, boolean usingAlertWindow)107     public static void logAppOverlayEnter(int uid, String packageName, boolean changed, int type, boolean usingAlertWindow) {
108         if (changed) {
109             if (type != LayoutParams.TYPE_APPLICATION_OVERLAY) {
110                 StatsLog.write(StatsLog.OVERLAY_STATE_CHANGED, uid, packageName, true,
111                         StatsLog.OVERLAY_STATE_CHANGED__STATE__ENTERED);
112             } else if (!usingAlertWindow){
113                 StatsLog.write(StatsLog.OVERLAY_STATE_CHANGED, uid, packageName, false,
114                         StatsLog.OVERLAY_STATE_CHANGED__STATE__ENTERED);
115             }
116         }
117     }
118 
logAppOverlayExit(int uid, String packageName, boolean changed, int type, boolean usingAlertWindow)119     public static void logAppOverlayExit(int uid, String packageName, boolean changed, int type, boolean usingAlertWindow) {
120         if (changed) {
121             if (type != LayoutParams.TYPE_APPLICATION_OVERLAY) {
122                 StatsLog.write(StatsLog.OVERLAY_STATE_CHANGED, uid, packageName, true,
123                         StatsLog.OVERLAY_STATE_CHANGED__STATE__EXITED);
124             } else if (!usingAlertWindow){
125                 StatsLog.write(StatsLog.OVERLAY_STATE_CHANGED, uid, packageName, false,
126                         StatsLog.OVERLAY_STATE_CHANGED__STATE__EXITED);
127             }
128         }
129     }
130 }
131