Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2014ca3b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add some basic metrics for file operations on virtual files." into oc-dev

parents 8e5c67f5 331de98f
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -85,6 +85,8 @@ public final class Metrics {
            = "docsui_external_storage_fileop_failure";
    private static final String COUNT_MTP_FILEOP_FAILURE = "docsui_mtp_fileop_failure";
    private static final String COUNT_OTHER_FILEOP_FAILURE = "docsui_other_fileop_failure";
    private static final String COUNT_FILE_COPIED = "docsui_file_copied";
    private static final String COUNT_FILE_MOVED = "docsui_file_moved";

    // Indices for bucketing roots in the roots histogram. "Other" is the catch-all index for any
    // root that is not explicitly recognized by the Metrics code (see {@link
@@ -352,6 +354,16 @@ public final class Metrics {
    @Retention(RetentionPolicy.SOURCE)
    public @interface UserAction {}

    // Codes representing different approaches to copy/move a document. OPMODE_PROVIDER indicates
    // it's an optimized operation provided by providers; OPMODE_CONVERTED means it's converted from
    // a virtual file; and OPMODE_CONVENTIONAL means it's byte copied.
    public static final int OPMODE_PROVIDER = 1;
    public static final int OPMODE_CONVERTED = 2;
    public static final int OPMODE_CONVENTIONAL = 3;
    @IntDef({OPMODE_PROVIDER, OPMODE_CONVERTED, OPMODE_CONVENTIONAL})
    @Retention(RetentionPolicy.SOURCE)
    public @interface FileOpMode {}

    // Codes representing different menu actions. These are used for bucketing stats in the
    // COUNT_MENU_ACTION histogram.
    // Do not change or rearrange these values, that will break historical data. Only add to the
@@ -514,6 +526,18 @@ public final class Metrics {
        }
    }

    public static void logFileOperated(
            Context context, @OpType int operationType, @FileOpMode int approach) {
        switch (operationType) {
            case FileOperationService.OPERATION_COPY:
                logHistogram(context, COUNT_FILE_COPIED, approach);
                break;
            case FileOperationService.OPERATION_MOVE:
                logHistogram(context, COUNT_FILE_MOVED, approach);
                break;
        }
    }

    /**
     * Logs create directory operation. It is a part of file operation stats. We do not
     * differentiate between internal and external locations, all create directory operations are
+8 −1
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import static com.android.documentsui.base.Shared.DEBUG;
import static com.android.documentsui.services.FileOperationService.EXTRA_DIALOG_TYPE;
import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION_TYPE;
import static com.android.documentsui.services.FileOperationService.EXTRA_FAILED_DOCS;
import static com.android.documentsui.services.FileOperationService.EXTRA_SRC_LIST;
import static com.android.documentsui.services.FileOperationService.OPERATION_COPY;

import android.annotation.StringRes;
@@ -348,6 +347,8 @@ class CopyJob extends ResolvedResourcesJob {
                try {
                    if (DocumentsContract.copyDocument(getClient(src), src.derivedUri,
                            dstDirInfo.derivedUri) != null) {
                        Metrics.logFileOperated(
                                appContext, operationType, Metrics.OPMODE_PROVIDER);
                        return;
                    }
                } catch (RemoteException | RuntimeException e) {
@@ -540,6 +541,9 @@ class CopyJob extends ResolvedResourcesJob {
                    throw new ResourceException("Failed to open a file input stream for %s due "
                            + "an exception.", src.derivedUri, e);
                }

                Metrics.logFileOperated(
                        appContext, operationType, Metrics.OPMODE_CONVERTED);
            } else {
                try {
                    srcFile = getClient(src).openFile(src.derivedUri, "r", canceller);
@@ -550,6 +554,9 @@ class CopyJob extends ResolvedResourcesJob {
                            "Failed to open a file for %s due to an exception.", src.derivedUri, e);
                }
                in = new ParcelFileDescriptor.AutoCloseInputStream(srcFile);

                Metrics.logFileOperated(
                        appContext, operationType, Metrics.OPMODE_CONVENTIONAL);
            }

            try {
+2 −0
Original line number Diff line number Diff line
@@ -147,6 +147,8 @@ final class MoveJob extends CopyJob {
                    if (DocumentsContract.moveDocument(getClient(src), src.derivedUri,
                            srcParent != null ? srcParent.derivedUri : mSrcParent.derivedUri,
                            dest.derivedUri) != null) {
                        Metrics.logFileOperated(
                                appContext, operationType, Metrics.OPMODE_PROVIDER);
                        return;
                    }
                } catch (RemoteException | RuntimeException e) {