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

Commit 28297eef authored by Sergey Poromov's avatar Sergey Poromov Committed by android-build-merger
Browse files

Merge "Update bmgr tool." into nyc-dev

am: f4f1ca0b

* commit 'f4f1ca0b':
  Update bmgr tool.
parents 044454ac f4f1ca0b
Loading
Loading
Loading
Loading
+79 −18
Original line number Original line Diff line number Diff line
@@ -23,11 +23,15 @@ import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
import android.app.backup.IBackupObserver;
import android.app.backup.IRestoreObserver;
import android.app.backup.IRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.IRestoreSession;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.UserHandle;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.HashSet;
import java.util.List;


public final class Bmgr {
public final class Bmgr {
    IBackupManager mBmgr;
    IBackupManager mBmgr;
@@ -37,6 +41,8 @@ public final class Bmgr {
            "Error: Could not access the Backup Manager.  Is the system running?";
            "Error: Could not access the Backup Manager.  Is the system running?";
    static final String TRANSPORT_NOT_RUNNING_ERR =
    static final String TRANSPORT_NOT_RUNNING_ERR =
            "Error: Could not access the backup transport.  Is the system running?";
            "Error: Could not access the backup transport.  Is the system running?";
    static final String PM_NOT_RUNNING_ERR =
            "Error: Could not access the Package Manager.  Is the system running?";


    private String[] mArgs;
    private String[] mArgs;
    private int mNextArg;
    private int mNextArg;
@@ -203,19 +209,20 @@ public final class Bmgr {
        @Override
        @Override
        public void onUpdate(String currentPackage, BackupProgress backupProgress) {
        public void onUpdate(String currentPackage, BackupProgress backupProgress) {
            System.out.println(
            System.out.println(
                "onUpdate: " + currentPackage + " with progress: " + backupProgress.bytesTransferred
                "Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred
                    + "/" + backupProgress.bytesExpected);
                    + "/" + backupProgress.bytesExpected);
        }
        }


        @Override
        @Override
        public void onResult(String currentPackage, int status) {
        public void onResult(String currentPackage, int status) {
            System.out.println("onResult: " + currentPackage + " with result: "
            System.out.println("Package " + currentPackage + " with result: "
                    + convertBackupStatusToString(status));
                    + convertBackupStatusToString(status));
        }
        }


        @Override
        @Override
        public void backupFinished(int status) {
        public void backupFinished(int status) {
            System.out.println("backupFinished: " + convertBackupStatusToString(status));
            System.out.println("Backup finished with result: "
                    + convertBackupStatusToString(status));
            synchronized (this) {
            synchronized (this) {
                done = true;
                done = true;
                this.notify();
                this.notify();
@@ -251,21 +258,48 @@ public final class Bmgr {
                return "Transport rejected package";
                return "Transport rejected package";
            case BackupManager.ERROR_AGENT_FAILURE:
            case BackupManager.ERROR_AGENT_FAILURE:
                return "Agent error";
                return "Agent error";
            case BackupManager.ERROR_TRANSPORT_QUOTA_EXCEEDED:
                return "Size quota exceeded";
            default:
            default:
                return "Unknown error";
                return "Unknown error";
        }
        }
    }
    }


    private void doBackupNow() {
    private void backupNowAllPackages() {
        String pkg;
        int userId = UserHandle.USER_SYSTEM;
        ArrayList<String> allPkgs = new ArrayList<String>();
        IPackageManager mPm =
        while ((pkg = nextArg()) != null) {
                IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
            allPkgs.add(pkg);
        if (mPm == null) {
            System.err.println(PM_NOT_RUNNING_ERR);
            return;
        }
        }
        if (allPkgs.size() > 0) {
        List<PackageInfo> installedPackages = null;
        try {
            installedPackages =  mPm.getInstalledPackages(0, userId).getList();
        } catch (RemoteException e) {
            System.err.println(e.toString());
            System.err.println(PM_NOT_RUNNING_ERR);
        }
        if (installedPackages != null) {
            List<String> packages = new ArrayList<>();
            for (PackageInfo pi : installedPackages) {
                try {
                    if (mBmgr.isAppEligibleForBackup(pi.packageName)) {
                        packages.add(pi.packageName);
                    }
                } catch (RemoteException e) {
                    System.err.println(e.toString());
                    System.err.println(BMGR_NOT_RUNNING_ERR);
                }
            }
            backupNowPackages(packages);
        }
    }

    private void backupNowPackages(List<String> packages) {
        try {
        try {
            BackupObserver observer = new BackupObserver();
            BackupObserver observer = new BackupObserver();
                int err = mBmgr.requestBackup(allPkgs.toArray(new String[allPkgs.size()]), observer);
            int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer);
            if (err == 0) {
            if (err == 0) {
                // Off and running -- wait for the backup to complete
                // Off and running -- wait for the backup to complete
                observer.waitForCompletion();
                observer.waitForCompletion();
@@ -277,6 +311,31 @@ public final class Bmgr {
            System.err.println(BMGR_NOT_RUNNING_ERR);
            System.err.println(BMGR_NOT_RUNNING_ERR);
        }
        }
    }
    }

    private void doBackupNow() {
        String pkg;
        boolean backupAll = false;
        ArrayList<String> allPkgs = new ArrayList<String>();
        while ((pkg = nextArg()) != null) {
            if (pkg.equals("--all")) {
                backupAll = true;
            } else {
                allPkgs.add(pkg);
            }
        }
        if (backupAll) {
            if (allPkgs.size() == 0) {
                System.out.println("Running backup for all packages.");
                backupNowAllPackages();
            } else {
                System.err.println("Provide only '--all' flag or list of packages.");
            }
        } else if (allPkgs.size() > 0) {
            System.out.println("Running backup for " + allPkgs.size() +" requested packages.");
            backupNowPackages(allPkgs);
        } else {
            System.err.println("Provide '--all' flag or list of packages.");
        }
    }
    }


    private void doTransport() {
    private void doTransport() {
@@ -568,6 +627,7 @@ public final class Bmgr {
        System.err.println("       bmgr run");
        System.err.println("       bmgr run");
        System.err.println("       bmgr wipe TRANSPORT PACKAGE");
        System.err.println("       bmgr wipe TRANSPORT PACKAGE");
        System.err.println("       bmgr fullbackup PACKAGE...");
        System.err.println("       bmgr fullbackup PACKAGE...");
        System.err.println("       bmgr backupnow --all|PACKAGE...");
        System.err.println("");
        System.err.println("");
        System.err.println("The 'backup' command schedules a backup pass for the named package.");
        System.err.println("The 'backup' command schedules a backup pass for the named package.");
        System.err.println("Note that the backup pass will effectively be a no-op if the package");
        System.err.println("Note that the backup pass will effectively be a no-op if the package");
@@ -620,6 +680,7 @@ public final class Bmgr {
        System.err.println("packages.  The data is sent via the currently active transport.");
        System.err.println("packages.  The data is sent via the currently active transport.");
        System.err.println("");
        System.err.println("");
        System.err.println("The 'backupnow' command runs an immediate backup for one or more packages.");
        System.err.println("The 'backupnow' command runs an immediate backup for one or more packages.");
        System.err.println("    --all flag runs backup for all eligible packages.");
        System.err.println("For each package it will run key/value or full data backup ");
        System.err.println("For each package it will run key/value or full data backup ");
        System.err.println("depending on the package's manifest declarations.");
        System.err.println("depending on the package's manifest declarations.");
        System.err.println("The data is sent via the currently active transport.");
        System.err.println("The data is sent via the currently active transport.");