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

Commit 2190f8fa authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes I11d239f9,I11d239f9 into main

* changes:
  Make LocalTransport.DEBUG dynamic.
  Improved logging and dump() on LocalTransport.
parents a4ce9e92 26378261
Loading
Loading
Loading
Loading
+121 −11
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@ import android.system.Os;
import android.system.StructStat;
import android.system.StructStat;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.Base64;
import android.util.Base64;
import android.util.Dumpable;
import android.util.Log;
import android.util.Log;


import com.android.tools.r8.keepanno.annotations.KeepTarget;
import com.android.tools.r8.keepanno.annotations.KeepTarget;
@@ -52,18 +53,24 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;


/**
/**
 * Backup transport for stashing stuff into a known location on disk, and
 * Backup transport for stashing stuff into a known location on disk, and
 * later restoring from there.  For testing only.
 * later restoring from there.  For testing only.
 *
 * <p>Note: the quickest way to build and sync this class is:
 * {@code m LocalTransport && adb install $OUT/system/priv-app/LocalTransport/LocalTransport.apk}
 */
 */


public class LocalTransport extends BackupTransport {
public class LocalTransport extends BackupTransport {
    private static final String TAG = "LocalTransport";
    static final String TAG = "LocalTransport";
    private static final boolean DEBUG = false;
    static final boolean DEBUG = Log.isLoggable(TAG, Log.VERBOSE);


    private static final String TRANSPORT_DIR_NAME
    private static final String TRANSPORT_DIR_NAME
            = "com.android.localtransport.LocalTransport";
            = "com.android.localtransport.LocalTransport";
@@ -124,6 +131,8 @@ public class LocalTransport extends BackupTransport {
    }
    }


    public LocalTransport(Context context, LocalTransportParameters parameters) {
    public LocalTransport(Context context, LocalTransportParameters parameters) {
        Log.i(TAG, "Creating LocalTransport for user " + context.getUserId()
                + " (DEBUG=" + DEBUG + ")");
        mContext = context;
        mContext = context;
        mParameters = parameters;
        mParameters = parameters;
        makeDataDirs();
        makeDataDirs();
@@ -910,25 +919,70 @@ public class LocalTransport extends BackupTransport {
        return mMonitor;
        return mMonitor;
    }
    }


    private class TestBackupManagerMonitor extends BackupManagerMonitor {
    private class TestBackupManagerMonitor extends BackupManagerMonitor implements Dumpable {

        private final List<DataTypeResult> mReceivedResults = new ArrayList<>();
        private int mNumberReceivedEvents;

        @Override
        @Override
        public void onEvent(Bundle event) {
        public void onEvent(Bundle event) {
            if (event == null || !mParameters.logAgentResults()) {
            if (event == null) {
                if (DEBUG) {
                    Log.w(TAG, "onEvent() called with null");
                }
                return;
                return;
            }
            }

            int eventId = event.getInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID);
            if (event.getInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID)
            if (eventId != BackupManagerMonitor.LOG_EVENT_ID_AGENT_LOGGING_RESULTS) {
                    == BackupManagerMonitor.LOG_EVENT_ID_AGENT_LOGGING_RESULTS) {
                if (DEBUG) Log.v(TAG, "ignoring event with id " + eventId);
                Log.i(TAG, "agent_logging_results {");
                return;
            }
            mNumberReceivedEvents++;
            boolean logResults = mParameters.logAgentResults();
            ArrayList<DataTypeResult> results = event.getParcelableArrayList(
            ArrayList<DataTypeResult> results = event.getParcelableArrayList(
                    BackupManagerMonitor.EXTRA_LOG_AGENT_LOGGING_RESULTS,
                    BackupManagerMonitor.EXTRA_LOG_AGENT_LOGGING_RESULTS,
                    DataTypeResult.class);
                    DataTypeResult.class);
                for (DataTypeResult result : results) {
            int size = results.size();
            if (size == 0) {
                if (logResults) {
                    Log.i(TAG, "no agent_logging_results on event #" + mNumberReceivedEvents);
                }
                return;
            }
            if (logResults) {
                Log.i(TAG, "agent_logging_results {");
            }
            for (int i = 0; i < size; i++) {
                var result = results.get(i);
                mReceivedResults.add(result);
                if (logResults) {
                    Log.i(TAG, "\t" + BackupRestoreEventLogger.toString(result));
                    Log.i(TAG, "\t" + BackupRestoreEventLogger.toString(result));
                }
                }
            }
            if (logResults) {
                Log.i(TAG, "}");
                Log.i(TAG, "}");
            }
            }
        }
        }

        @Override
        public void dump(PrintWriter pw, String[] args) {
            pw.println("TestBackupManagerMonitor");
            pw.printf("%d events received", mNumberReceivedEvents);
            if (mNumberReceivedEvents == 0) {
                pw.println();
                return;
            }
            int size = mReceivedResults.size();
            if (size == 0) {
                pw.println("; no results on them");
                return;
            }
            pw.printf("; %d results on them:\n", size);
            for (int i = 0; i < size; i++) {
                DataTypeResult result = mReceivedResults.get(i);
                pw.printf("  #%d: %s\n", i, BackupRestoreEventLogger.toString(result));
            }
        }
    }
    }


    @NonNull
    @NonNull
@@ -941,4 +995,60 @@ public class LocalTransport extends BackupTransport {
        }
        }
        return mParameters.noRestrictedModePackages();
        return mParameters.noRestrictedModePackages();
    }
    }

    @Override
    public String toString() {
        try {
            try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
                dump(pw, /* args= */ null);
                pw.flush();
                return sw.toString();
            }
        } catch (IOException e) {
            // Shouldn't happen...
            Log.e(TAG, "toString(): failed to dump", e);
            return super.toString();
        }
    }

    void dump(PrintWriter pw, String[] args) {
        pw.printf("mDataDir: %s\n", mDataDir);
        pw.printf("mCurrentSetDir: %s\n", mCurrentSetDir);
        pw.printf("mCurrentSetIncrementalDir: %s\n", mCurrentSetIncrementalDir);
        pw.printf("mCurrentSetFullDir: %s\n", mCurrentSetFullDir);

        pw.printf("mRestorePackages: %s\n", Arrays.toString(mRestorePackages));
        pw.printf("mRestorePackage: %d\n", mRestorePackage);
        pw.printf("mRestoreType: %d\n", mRestoreType);
        pw.printf("mRestoreSetDir: %s\n", mRestoreSetDir);
        pw.printf("mRestoreSetIncrementalDir: %s\n", mRestoreSetIncrementalDir);
        pw.printf("mRestoreSetFullDir: %s\n", mRestoreSetFullDir);

        pw.printf("mFullTargetPackage: %s\n", mFullTargetPackage);
        pw.printf("mSocket: %s\n", mSocket);
        pw.printf("mSocketInputStream: %s\n", mSocketInputStream);
        pw.printf("mFullBackupOutputStream: %s\n", mFullBackupOutputStream);
        dumpByteArray(pw, "mFullBackupBuffer", mFullBackupBuffer);
        pw.printf("mFullBackupSize: %d\n", mFullBackupSize);

        pw.printf("mCurFullRestoreStream: %s\n", mCurFullRestoreStream);
        dumpByteArray(pw, "mFullRestoreBuffer", mFullRestoreBuffer);
        if (mParameters == null) {
            pw.println("No LocalTransportParameters");
        } else {
            pw.println(mParameters);
        }
        if (mMonitor instanceof Dumpable) {
            ((Dumpable) mMonitor).dump(pw, args);
        }

        pw.printf("currentDestinationString(): %s\n", currentDestinationString());
        pw.printf("dataManagementIntent(): %s\n", dataManagementIntent());
        pw.printf("dataManagementIntentLabel(): %s\n", dataManagementIntentLabel());
        pw.printf("transportDirName(): %s\n", transportDirName());
    }

    private void dumpByteArray(PrintWriter pw, String name, byte[] array) {
        pw.printf("%s size: %d\n", name, (array == null ? 0 : array.length));
    }
}
}
+25 −6
Original line number Original line Diff line number Diff line
@@ -16,11 +16,15 @@


package com.android.localtransport;
package com.android.localtransport;


import static com.android.localtransport.LocalTransport.DEBUG;
import static com.android.localtransport.LocalTransport.TAG;

import android.content.ContentResolver;
import android.content.ContentResolver;
import android.os.Handler;
import android.os.Handler;
import android.provider.Settings;
import android.provider.Settings;
import android.util.KeyValueListParser;
import android.util.KeyValueListParser;
import android.util.KeyValueSettingObserver;
import android.util.KeyValueSettingObserver;
import android.util.Log;


import java.util.Arrays;
import java.util.Arrays;
import java.util.List;
import java.util.List;
@@ -76,15 +80,30 @@ public class LocalTransportParameters extends KeyValueSettingObserver {
    }
    }


    public String getSettingValue(ContentResolver resolver) {
    public String getSettingValue(ContentResolver resolver) {
        return Settings.Secure.getString(resolver, SETTING);
        String value = Settings.Secure.getString(resolver, SETTING);
        if (DEBUG) {
            Log.d(TAG, "LocalTransportParameters.getSettingValue(): returning " + value);
        }
        return value;
    }
    }


    public void update(KeyValueListParser parser) {
    public void update(KeyValueListParser parser) {
        mFakeEncryptionFlag = parser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, false);
        mFakeEncryptionFlag = parser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, /* def= */ false);
        mIsNonIncrementalOnly = parser.getBoolean(KEY_NON_INCREMENTAL_ONLY, false);
        mIsNonIncrementalOnly = parser.getBoolean(KEY_NON_INCREMENTAL_ONLY, /* def= */ false);
        mIsDeviceTransfer = parser.getBoolean(KEY_IS_DEVICE_TRANSFER, false);
        mIsDeviceTransfer = parser.getBoolean(KEY_IS_DEVICE_TRANSFER, /* def= */ false);
        mIsEncrypted = parser.getBoolean(KEY_IS_ENCRYPTED, false);
        mIsEncrypted = parser.getBoolean(KEY_IS_ENCRYPTED, /* def= */ false);
        mLogAgentResults = parser.getBoolean(KEY_LOG_AGENT_RESULTS, /* def */ false);
        mLogAgentResults = parser.getBoolean(KEY_LOG_AGENT_RESULTS, /* def= */ false);
        mNoRestrictedModePackages = parser.getString(KEY_NO_RESTRICTED_MODE_PACKAGES, /* def */ "");
        mNoRestrictedModePackages = parser.getString(KEY_NO_RESTRICTED_MODE_PACKAGES, /* def */ "");
    }
    }

    @Override
    public String toString() {
        return "LocalTransportParameters[mFakeEncryptionFlag=" + mFakeEncryptionFlag
                + ", mIsNonIncrementalOnly=" + mIsNonIncrementalOnly
                + ", mIsDeviceTransfer=" + mIsDeviceTransfer
                + ", mIsEncrypted=" + mIsEncrypted
                + ", mLogAgentResults=" + mLogAgentResults
                + ", noRestrictedModePackages()=" + noRestrictedModePackages()
                + "]";
    }
}
}
+30 −1
Original line number Original line Diff line number Diff line
@@ -16,15 +16,28 @@


package com.android.localtransport;
package com.android.localtransport;


import static com.android.localtransport.LocalTransport.DEBUG;
import static com.android.localtransport.LocalTransport.TAG;

import android.annotation.Nullable;
import android.app.Service;
import android.app.Service;
import android.content.Intent;
import android.content.Intent;
import android.os.IBinder;
import android.os.IBinder;
import android.util.Log;

import java.io.FileDescriptor;
import java.io.PrintWriter;


public class LocalTransportService extends Service {
public class LocalTransportService extends Service {
    private static LocalTransport sTransport = null;

    @Nullable
    private static LocalTransport sTransport;


    @Override
    @Override
    public void onCreate() {
    public void onCreate() {
        if (DEBUG) {
            Log.d(TAG, "LocalTransportService.onCreate()");
        }
        if (sTransport == null) {
        if (sTransport == null) {
            LocalTransportParameters parameters =
            LocalTransportParameters parameters =
                    new LocalTransportParameters(getMainThreadHandler(), getContentResolver());
                    new LocalTransportParameters(getMainThreadHandler(), getContentResolver());
@@ -35,11 +48,27 @@ public class LocalTransportService extends Service {


    @Override
    @Override
    public void onDestroy() {
    public void onDestroy() {
        if (DEBUG) {
            Log.d(TAG, "LocalTransportService.onDestroy()");
        }
        sTransport.getParameters().stop();
        sTransport.getParameters().stop();
    }
    }


    @Override
    @Override
    public IBinder onBind(Intent intent) {
    public IBinder onBind(Intent intent) {
        if (DEBUG) {
            Log.d(TAG, "LocalTransportService.onBind(" + intent + "): parameters="
                    + sTransport.getParameters());
        }
        return sTransport.getBinder();
        return sTransport.getBinder();
    }
    }

    @Override
    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        if (sTransport == null) {
            pw.println("No sTransport");
            return;
        }
        sTransport.dump(pw, args);
    }
}
}