/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.documentsui; import static android.os.Environment.STANDARD_DIRECTORIES; import static com.android.documentsui.base.SharedMinimal.DEBUG; import static com.android.documentsui.base.SharedMinimal.DIRECTORY_ROOT; import android.annotation.IntDef; import android.annotation.StringDef; import android.app.Activity; import android.content.Context; import android.util.Log; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Methods for logging scoped directory access metrics. */ public final class ScopedAccessMetrics { private static final String TAG = "ScopedAccessMetrics"; // Types for logInvalidScopedAccessRequest public static final String SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS = "docsui_scoped_directory_access_invalid_args"; public static final String SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY = "docsui_scoped_directory_access_invalid_dir"; public static final String SCOPED_DIRECTORY_ACCESS_ERROR = "docsui_scoped_directory_access_error"; @StringDef(value = { SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS, SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY, SCOPED_DIRECTORY_ACCESS_ERROR }) @Retention(RetentionPolicy.SOURCE) public @interface InvalidScopedAccess{} public static void logInvalidScopedAccessRequest(Context context, @InvalidScopedAccess String type) { switch (type) { case SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS: case SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY: case SCOPED_DIRECTORY_ACCESS_ERROR: logCount(context, type); break; default: Log.wtf(TAG, "invalid InvalidScopedAccess: " + type); } } // Types for logValidScopedAccessRequest public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED = 0; public static final int SCOPED_DIRECTORY_ACCESS_GRANTED = 1; public static final int SCOPED_DIRECTORY_ACCESS_DENIED = 2; public static final int SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST = 3; public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED = 4; @IntDef(flag = true, value = { SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED, SCOPED_DIRECTORY_ACCESS_GRANTED, SCOPED_DIRECTORY_ACCESS_DENIED, SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST, SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED }) @Retention(RetentionPolicy.SOURCE) public @interface ScopedAccessGrant {} public static void logValidScopedAccessRequest(Activity activity, String directory, @ScopedAccessGrant int type) { int index = -1; if (DIRECTORY_ROOT.equals(directory)) { index = -2; } else { for (int i = 0; i < STANDARD_DIRECTORIES.length; i++) { if (STANDARD_DIRECTORIES[i].equals(directory)) { index = i; break; } } } final String packageName = activity.getCallingPackage(); switch (type) { case SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED: MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_PACKAGE, packageName); MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_FOLDER, index); break; case SCOPED_DIRECTORY_ACCESS_GRANTED: MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_PACKAGE, packageName); MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_FOLDER, index); break; case SCOPED_DIRECTORY_ACCESS_DENIED: MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_PACKAGE, packageName); MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_FOLDER, index); break; case SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST: MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_PACKAGE, packageName); MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_FOLDER, index); break; case SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED: MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_PACKAGE, packageName); MetricsLogger.action(activity, MetricsEvent .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_FOLDER, index); break; default: Log.wtf(TAG, "invalid ScopedAccessGrant: " + type); } } /** * Internal method for making a MetricsLogger.count call. Increments the given counter by 1. * * @param context * @param name The counter to increment. */ private static void logCount(Context context, String name) { if (DEBUG) Log.d(TAG, name + ": " + 1); MetricsLogger.count(context, name, 1); } }