Home | History | Annotate | Download | only in documentsui
      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 
     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 
     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      */
    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