• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.documentsui;
18 
19 import static android.os.Environment.STANDARD_DIRECTORIES;
20 
21 import static com.android.documentsui.base.SharedMinimal.DEBUG;
22 import static com.android.documentsui.base.SharedMinimal.DIRECTORY_ROOT;
23 
24 import android.annotation.IntDef;
25 import android.annotation.StringDef;
26 import android.app.Activity;
27 import android.content.Context;
28 import android.util.Log;
29 
30 import com.android.internal.logging.MetricsLogger;
31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
32 
33 import java.lang.annotation.Retention;
34 import java.lang.annotation.RetentionPolicy;
35 
36 /**
37  * Methods for logging scoped directory access metrics.
38  */
39 public final class ScopedAccessMetrics {
40     private static final String TAG = "ScopedAccessMetrics";
41 
42     // Types for logInvalidScopedAccessRequest
43     public static final String SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS =
44             "docsui_scoped_directory_access_invalid_args";
45     public static final String SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY =
46             "docsui_scoped_directory_access_invalid_dir";
47     public static final String SCOPED_DIRECTORY_ACCESS_ERROR =
48             "docsui_scoped_directory_access_error";
49 
50     @StringDef(value = {
51             SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS,
52             SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY,
53             SCOPED_DIRECTORY_ACCESS_ERROR
54     })
55     @Retention(RetentionPolicy.SOURCE)
56     public @interface InvalidScopedAccess{}
57 
logInvalidScopedAccessRequest(Context context, @InvalidScopedAccess String type)58     public static void logInvalidScopedAccessRequest(Context context,
59             @InvalidScopedAccess String type) {
60         switch (type) {
61             case SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS:
62             case SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY:
63             case SCOPED_DIRECTORY_ACCESS_ERROR:
64                 logCount(context, type);
65                 break;
66             default:
67                 Log.wtf(TAG, "invalid InvalidScopedAccess: " + type);
68         }
69     }
70 
71     // Types for logValidScopedAccessRequest
72     public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED = 0;
73     public static final int SCOPED_DIRECTORY_ACCESS_GRANTED = 1;
74     public static final int SCOPED_DIRECTORY_ACCESS_DENIED = 2;
75     public static final int SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST = 3;
76     public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED = 4;
77 
78     @IntDef(flag = true, value = {
79             SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED,
80             SCOPED_DIRECTORY_ACCESS_GRANTED,
81             SCOPED_DIRECTORY_ACCESS_DENIED,
82             SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST,
83             SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED
84     })
85     @Retention(RetentionPolicy.SOURCE)
86     public @interface ScopedAccessGrant {}
87 
logValidScopedAccessRequest(Activity activity, String directory, @ScopedAccessGrant int type)88     public static void logValidScopedAccessRequest(Activity activity, String directory,
89             @ScopedAccessGrant int type) {
90         int index = -1;
91         if (DIRECTORY_ROOT.equals(directory)) {
92             index = -2;
93         } else {
94             for (int i = 0; i < STANDARD_DIRECTORIES.length; i++) {
95                 if (STANDARD_DIRECTORIES[i].equals(directory)) {
96                     index = i;
97                     break;
98                 }
99             }
100         }
101         final String packageName = activity.getCallingPackage();
102         switch (type) {
103             case SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED:
104                 MetricsLogger.action(activity, MetricsEvent
105                         .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_PACKAGE, packageName);
106                 MetricsLogger.action(activity, MetricsEvent
107                         .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_FOLDER, index);
108                 break;
109             case SCOPED_DIRECTORY_ACCESS_GRANTED:
110                 MetricsLogger.action(activity, MetricsEvent
111                         .ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_PACKAGE, packageName);
112                 MetricsLogger.action(activity, MetricsEvent
113                         .ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_FOLDER, index);
114                 break;
115             case SCOPED_DIRECTORY_ACCESS_DENIED:
116                 MetricsLogger.action(activity, MetricsEvent
117                         .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_PACKAGE, packageName);
118                 MetricsLogger.action(activity, MetricsEvent
119                         .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_FOLDER, index);
120                 break;
121             case SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST:
122                 MetricsLogger.action(activity, MetricsEvent
123                         .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_PACKAGE, packageName);
124                 MetricsLogger.action(activity, MetricsEvent
125                         .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_FOLDER, index);
126                 break;
127             case SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED:
128                 MetricsLogger.action(activity, MetricsEvent
129                         .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_PACKAGE, packageName);
130                 MetricsLogger.action(activity, MetricsEvent
131                         .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_FOLDER, index);
132                 break;
133             default:
134                 Log.wtf(TAG, "invalid ScopedAccessGrant: " + type);
135         }
136     }
137 
138     /**
139      * Internal method for making a MetricsLogger.count call. Increments the given counter by 1.
140      *
141      * @param context
142      * @param name The counter to increment.
143      */
logCount(Context context, String name)144     private static void logCount(Context context, String name) {
145         if (DEBUG) Log.d(TAG, name + ": " + 1);
146         MetricsLogger.count(context, name, 1);
147     }
148 }
149