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

Commit 331de98f authored by Garfield Tan's avatar Garfield Tan
Browse files

Add some basic metrics for file operations on virtual files.

Test: It builds.
Bug: 36571722
Change-Id: I88324cdfee1352ba7f92dca9b357cbac02438b2c
parent a413c355
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
@@ -358,6 +360,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
@@ -520,6 +532,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) {