blob: ec23e59bf483b515081697a72524a663a92f2a2e [file] [log] [blame]
/*
* 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);
}
}