From d1ee43e576b2a87b28c096404f7cb3cf7a123ae2 Mon Sep 17 00:00:00 2001 From: Chandan Nath Date: Sun, 16 Dec 2018 21:41:03 +0000 Subject: [PATCH] [Multi-user] Change more BackupManager AIDL methods to accept userId in methods Bug: 120120742 Test: 1) atest RunFrameworksServicesRoboTests 2) atest $(find \ frameworks/base/services/tests/servicestests/src/com/android/server/backup \ -name '*Test.java') 3) atest CtsBackupTestCases 4) atest CtsBackupHostTestCases 5) atest GtsBackupTestCases 6) atest GtsBackupHostTestCases 7) 'adb shell bmgr' enabled/backupnow flow Change-Id: Ia0641f66dd0a935420f1aee332bb2e21ca03610e --- .../src/com/android/commands/bmgr/Bmgr.java | 40 +-- .../android/app/backup/BackupManager.java | 23 +- .../android/app/backup/IBackupManager.aidl | 192 +++++++++++++- .../com/android/server/backup/Trampoline.java | 146 ++++++++-- .../android/server/backup/TrampolineTest.java | 250 +++++++++++++++--- 5 files changed, 550 insertions(+), 101 deletions(-) diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index e3748f1653ab5..3defdc5467c8f 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -247,7 +247,7 @@ public class Bmgr { } try { - mBmgr.dataChanged(pkg); + mBmgr.dataChangedForUser(userId, pkg); } catch (RemoteException e) { System.err.println(e.toString()); System.err.println(BMGR_NOT_RUNNING_ERR); @@ -264,7 +264,8 @@ public class Bmgr { } if (allPkgs.size() > 0) { try { - mBmgr.fullTransportBackup(allPkgs.toArray(new String[allPkgs.size()])); + mBmgr.fullTransportBackupForUser( + userId, allPkgs.toArray(new String[allPkgs.size()])); } catch (RemoteException e) { System.err.println(e.toString()); System.err.println(BMGR_NOT_RUNNING_ERR); @@ -393,7 +394,7 @@ public class Bmgr { installedPackages.stream().map(p -> p.packageName).toArray(String[]::new); String[] filteredPackages = {}; try { - filteredPackages = mBmgr.filterAppsEligibleForBackup(packages); + filteredPackages = mBmgr.filterAppsEligibleForBackupForUser(userId, packages); } catch (RemoteException e) { System.err.println(e.toString()); System.err.println(BMGR_NOT_RUNNING_ERR); @@ -498,11 +499,11 @@ public class Bmgr { } if ("-c".equals(which)) { - doTransportByComponent(); + doTransportByComponent(userId); return; } - String old = mBmgr.selectBackupTransport(which); + String old = mBmgr.selectBackupTransportForUser(userId, which); if (old == null) { System.out.println("Unknown transport '" + which + "' specified; no changes made."); @@ -516,7 +517,7 @@ public class Bmgr { } } - private void doTransportByComponent() { + private void doTransportByComponent(@UserIdInt int userId) { String which = nextArg(); if (which == null) { showUsage(); @@ -526,7 +527,9 @@ public class Bmgr { final CountDownLatch latch = new CountDownLatch(1); try { - mBmgr.selectBackupTransportAsync(ComponentName.unflattenFromString(which), + mBmgr.selectBackupTransportAsyncForUser( + userId, + ComponentName.unflattenFromString(which), new ISelectBackupTransportCallback.Stub() { @Override public void onSuccess(String transportName) { @@ -567,7 +570,7 @@ public class Bmgr { } try { - mBmgr.clearBackupData(transport, pkg); + mBmgr.clearBackupDataForUser(userId, transport, pkg); System.out.println("Wiped backup data for " + pkg + " on " + transport); } catch (RemoteException e) { System.err.println(e.toString()); @@ -599,7 +602,8 @@ public class Bmgr { InitObserver observer = new InitObserver(); try { System.out.println("Initializing transports: " + transports); - mBmgr.initializeTransports(transports.toArray(new String[transports.size()]), observer); + mBmgr.initializeTransportsForUser( + userId, transports.toArray(new String[transports.size()]), observer); observer.waitForCompletion(30*1000L); System.out.println("Initialization result: " + observer.result); } catch (RemoteException e) { @@ -611,13 +615,13 @@ public class Bmgr { private void doList(@UserIdInt int userId) { String arg = nextArg(); // sets, transports, packages set# if ("transports".equals(arg)) { - doListTransports(); + doListTransports(userId); return; } // The rest of the 'list' options work with a restore session on the current transport try { - mRestore = mBmgr.beginRestoreSession(null, null); + mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null); if (mRestore == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return; @@ -634,19 +638,19 @@ public class Bmgr { } } - private void doListTransports() { + private void doListTransports(@UserIdInt int userId) { String arg = nextArg(); try { if ("-c".equals(arg)) { - for (ComponentName transport : mBmgr.listAllTransportComponents()) { + for (ComponentName transport : mBmgr.listAllTransportComponentsForUser(userId)) { System.out.println(transport.flattenToShortString()); } return; } - String current = mBmgr.getCurrentTransport(); - String[] transports = mBmgr.listAllTransports(); + String current = mBmgr.getCurrentTransportForUser(userId); + String[] transports = mBmgr.listAllTransportsForUser(userId); if (transports == null || transports.length == 0) { System.out.println("No transports available."); return; @@ -756,7 +760,7 @@ public class Bmgr { filter.add(arg); } - doRestoreAll(token, filter); + doRestoreAll(userId, token, filter); } catch (NumberFormatException e) { showUsage(); return; @@ -769,12 +773,12 @@ public class Bmgr { System.err.println("'restore '."); } - private void doRestoreAll(long token, HashSet filter) { + private void doRestoreAll(@UserIdInt int userId, long token, HashSet filter) { RestoreObserver observer = new RestoreObserver(); try { boolean didRestore = false; - mRestore = mBmgr.beginRestoreSession(null, null); + mRestore = mBmgr.beginRestoreSessionForUser(userId, null, null); if (mRestore == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return; diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index c6086f10bd00c..a6f6d06ae71af 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -335,7 +335,8 @@ public class BackupManager { if (sService != null) { try { // All packages, current transport - IRestoreSession binder = sService.beginRestoreSession(null, null); + IRestoreSession binder = + sService.beginRestoreSessionForUser(mContext.getUserId(), null, null); if (binder != null) { session = new RestoreSession(mContext, binder); } @@ -465,7 +466,7 @@ public class BackupManager { checkServiceBinder(); if (sService != null) { try { - return sService.getCurrentTransportComponent(); + return sService.getCurrentTransportComponentForUser(mContext.getUserId()); } catch (RemoteException e) { Log.e(TAG, "getCurrentTransportComponent() couldn't connect"); } @@ -530,7 +531,8 @@ public class BackupManager { checkServiceBinder(); if (sService != null) { try { - sService.updateTransportAttributes( + sService.updateTransportAttributesForUser( + mContext.getUserId(), transportComponent, name, configurationIntent, @@ -590,7 +592,8 @@ public class BackupManager { try { SelectTransportListenerWrapper wrapper = listener == null ? null : new SelectTransportListenerWrapper(mContext, listener); - sService.selectBackupTransportAsync(transport, wrapper); + sService.selectBackupTransportAsyncForUser( + mContext.getUserId(), transport, wrapper); } catch (RemoteException e) { Log.e(TAG, "selectBackupTransportAsync() couldn't connect"); } @@ -637,7 +640,7 @@ public class BackupManager { checkServiceBinder(); if (sService != null) { try { - return sService.getAvailableRestoreToken(packageName); + return sService.getAvailableRestoreTokenForUser(mContext.getUserId(), packageName); } catch (RemoteException e) { Log.e(TAG, "getAvailableRestoreToken() couldn't connect"); } @@ -659,7 +662,7 @@ public class BackupManager { checkServiceBinder(); if (sService != null) { try { - return sService.isAppEligibleForBackup(packageName); + return sService.isAppEligibleForBackupForUser(mContext.getUserId(), packageName); } catch (RemoteException e) { Log.e(TAG, "isAppEligibleForBackup(pkg) couldn't connect"); } @@ -760,7 +763,7 @@ public class BackupManager { public Intent getConfigurationIntent(String transportName) { if (sService != null) { try { - return sService.getConfigurationIntent(transportName); + return sService.getConfigurationIntentForUser(mContext.getUserId(), transportName); } catch (RemoteException e) { Log.e(TAG, "getConfigurationIntent() couldn't connect"); } @@ -781,7 +784,7 @@ public class BackupManager { public String getDestinationString(String transportName) { if (sService != null) { try { - return sService.getDestinationString(transportName); + return sService.getDestinationStringForUser(mContext.getUserId(), transportName); } catch (RemoteException e) { Log.e(TAG, "getDestinationString() couldn't connect"); } @@ -802,7 +805,7 @@ public class BackupManager { public Intent getDataManagementIntent(String transportName) { if (sService != null) { try { - return sService.getDataManagementIntent(transportName); + return sService.getDataManagementIntentForUser(mContext.getUserId(), transportName); } catch (RemoteException e) { Log.e(TAG, "getDataManagementIntent() couldn't connect"); } @@ -825,7 +828,7 @@ public class BackupManager { public String getDataManagementLabel(String transportName) { if (sService != null) { try { - return sService.getDataManagementLabel(transportName); + return sService.getDataManagementLabelForUser(mContext.getUserId(), transportName); } catch (RemoteException e) { Log.e(TAG, "getDataManagementLabel() couldn't connect"); } diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl index f1e6b06e8bac4..19de19a820b16 100644 --- a/core/java/android/app/backup/IBackupManager.aidl +++ b/core/java/android/app/backup/IBackupManager.aidl @@ -43,6 +43,15 @@ interface IBackupManager { * Any application can invoke this method for its own package, but * only callers who hold the android.permission.BACKUP permission * may invoke it for arbitrary packages. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the caller has made changes to its data. + */ + void dataChangedForUser(int userId, String packageName); + + /** + * {@link android.app.backup.IBackupManager.dataChangedForUser} for the calling user id. */ void dataChanged(String packageName); @@ -53,6 +62,15 @@ interface IBackupManager { * Any application can invoke this method for its own package, but * only callers who hold the android.permission.BACKUP permission * may invoke it for arbitrary packages. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which backup data should be erased. + */ + void clearBackupDataForUser(int userId, String transportName, String packageName); + + /** + * {@link android.app.backup.IBackupManager.clearBackupDataForUser} for the calling user id. */ void clearBackupData(String transportName, String packageName); @@ -62,24 +80,59 @@ interface IBackupManager { * operations. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the given transports should be initialized. */ - void initializeTransports(in String[] transportNames, IBackupObserver observer); + void initializeTransportsForUser(int userId, in String[] transportNames, + IBackupObserver observer); /** * Notifies the Backup Manager Service that an agent has become available. This * method is only invoked by the Activity Manager. + * + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which an agent has become available. + */ + void agentConnectedForUser(int userId, String packageName, IBinder agent); + + /** + * {@link android.app.backup.IBackupManager.agentConnected} for the calling user id. */ void agentConnected(String packageName, IBinder agent); /** * Notify the Backup Manager Service that an agent has unexpectedly gone away. * This method is only invoked by the Activity Manager. + * + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which an agent has unexpectedly gone away. + */ + void agentDisconnectedForUser(int userId, String packageName); + + /** + * {@link android.app.backup.IBackupManager.agentDisconnected} for the calling user id. */ void agentDisconnected(String packageName); /** * Notify the Backup Manager Service that an application being installed will * need a data-restore pass. This method is only invoked by the Package Manager. + * + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the application will need a data-restore pass. + */ + void restoreAtInstallForUser(int userId, String packageName, int token); + + /** + * {@link android.app.backup.IBackupManager.restoreAtInstallForUser} for the calling user id. */ void restoreAtInstall(String packageName, int token); @@ -112,10 +165,18 @@ interface IBackupManager { * is made generally available for launch. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which automatic restore should be enabled/disabled. * @param doAutoRestore When true, enables the automatic app-data restore facility. When * false, this facility will be disabled. */ + void setAutoRestoreForUser(int userId, boolean doAutoRestore); + + /** + * {@link android.app.backup.IBackupManager.setAutoRestoreForUser} for the calling user id. + */ void setAutoRestore(boolean doAutoRestore); /** @@ -220,9 +281,13 @@ interface IBackupManager { * Perform a full-dataset backup of the given applications via the currently active * transport. * + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the full-dataset backup should be performed. * @param packageNames The package names of the apps whose data are to be backed up. */ - void fullTransportBackup(in String[] packageNames); + void fullTransportBackupForUser(int userId, in String[] packageNames); /** * Restore device content from the data stream passed through the given socket. The @@ -250,6 +315,18 @@ interface IBackupManager { * backup dataset being used for restore. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the requested backup/restore operation can proceed. + */ + void acknowledgeFullBackupOrRestoreForUser(int userId, int token, boolean allow, + in String curPassword, in String encryptionPassword, + IFullBackupRestoreObserver observer); + + /** + * {@link android.app.backup.IBackupManager.acknowledgeFullBackupOrRestoreForUser} for the + * calling user id. */ void acknowledgeFullBackupOrRestore(int token, boolean allow, in String curPassword, in String encryptionPassword, @@ -260,7 +337,10 @@ interface IBackupManager { * specified transport has not been bound at least once (for registration), this call will be * ignored. Only the host process of the transport can change its description, otherwise a * {@link SecurityException} will be thrown. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which the attributes of the transport should be updated. * @param transportComponent The identity of the transport being described. * @param name A {@link String} with the new name for the transport. This is NOT for * identification. MUST NOT be {@code null}. @@ -279,13 +359,23 @@ interface IBackupManager { * @throws SecurityException If the UID of the calling process differs from the package UID of * {@code transportComponent} or if the caller does NOT have BACKUP permission. */ - void updateTransportAttributes(in ComponentName transportComponent, in String name, + void updateTransportAttributesForUser(int userId, in ComponentName transportComponent, + in String name, in Intent configurationIntent, in String currentDestinationString, in Intent dataManagementIntent, in String dataManagementLabel); /** * Identify the currently selected transport. Callers must hold the * android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the currently selected transport should be identified. + */ + String getCurrentTransportForUser(int userId); + + /** + * {@link android.app.backup.IBackupManager.getCurrentTransportForUser} for the calling user id. */ String getCurrentTransport(); @@ -293,16 +383,35 @@ interface IBackupManager { * Returns the {@link ComponentName} of the host service of the selected transport or {@code * null} if no transport selected or if the transport selected is not registered. Callers must * hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the currently selected transport should be identified. */ - ComponentName getCurrentTransportComponent(); + ComponentName getCurrentTransportComponentForUser(int userId); /** * Request a list of all available backup transports' names. Callers must * hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which all available backup transports' names should be listed. + */ + String[] listAllTransportsForUser(int userId); + + /** + * {@link android.app.backup.IBackupManager.listAllTransportsForUser} for the calling user id. */ String[] listAllTransports(); - ComponentName[] listAllTransportComponents(); + /** + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which all available backup transports should be listed. + */ + ComponentName[] listAllTransportComponentsForUser(int userId); /** * Retrieve the list of whitelisted transport components. Callers do not need @@ -315,13 +424,22 @@ interface IBackupManager { /** * Specify the current backup transport. Callers must hold the * android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which the transport should be selected. * @param transport The name of the transport to select. This should be one * of {@link BackupManager.TRANSPORT_GOOGLE} or {@link BackupManager.TRANSPORT_ADB}. * @return The name of the previously selected transport. If the given transport * name is not one of the currently available transports, no change is made to * the current transport setting and the method returns null. */ + String selectBackupTransportForUser(int userId, String transport); + + /** + * {@link android.app.backup.IBackupManager.selectBackupTransportForUser} for the calling user + * id. + */ String selectBackupTransport(String transport); /** @@ -330,43 +448,85 @@ interface IBackupManager { * which is in a separate process. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which the transport should be selected. * @param transport ComponentName of the service hosting the transport. This is different from * the transport's name that is returned by {@link BackupTransport#name()}. * @param listener A listener object to get a callback on the transport being selected. */ - void selectBackupTransportAsync(in ComponentName transport, ISelectBackupTransportCallback listener); + void selectBackupTransportAsyncForUser(int userId, in ComponentName transport, + ISelectBackupTransportCallback listener); /** * Get the configuration Intent, if any, from the given transport. Callers must * hold the android.permission.BACKUP permission in order to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which the configuration Intent should be reported. * @param transport The name of the transport to query. * @return An Intent to use with Activity#startActivity() to bring up the configuration * UI supplied by the transport. If the transport has no configuration UI, it should * return {@code null} here. */ + Intent getConfigurationIntentForUser(int userId, String transport); + + /** + * {@link android.app.backup.IBackupManager.getConfigurationIntentForUser} for the calling user + * id. + */ Intent getConfigurationIntent(String transport); /** * Get the destination string supplied by the given transport. Callers must * hold the android.permission.BACKUP permission in order to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which the transport destination string should be reported. * @param transport The name of the transport to query. * @return A string describing the current backup destination. This string is used * verbatim by the Settings UI as the summary text of the "configure..." item. */ + String getDestinationStringForUser(int userId, String transport); + + /** + * {@link android.app.backup.IBackupManager.getDestinationStringForUser} for the calling user + * id. + */ String getDestinationString(String transport); /** * Get the manage-data UI intent, if any, from the given transport. Callers must * hold the android.permission.BACKUP permission in order to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the manage-data UI intent should be reported. + */ + Intent getDataManagementIntentForUser(int userId, String transport); + + /** + * {@link android.app.backup.IBackupManager.getDataManagementIntentForUser} for the calling user + * id. */ Intent getDataManagementIntent(String transport); /** * Get the manage-data menu label, if any, from the given transport. Callers must * hold the android.permission.BACKUP permission in order to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id for which the manage-data menu label should be reported. + */ + String getDataManagementLabelForUser(int userId, String transport); + + /** + * {@link android.app.backup.IBackupManager.getDataManagementLabelForUser} for the calling user + * id. */ String getDataManagementLabel(String transport); @@ -381,7 +541,10 @@ interface IBackupManager { * package. In that case, the restore session returned is suitable for supporting * the BackupManager.requestRestore() functionality via RestoreSession.restorePackage() * without requiring the app to hold any special permission. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which a restore session should be begun. * @param packageName The name of the single package for which a restore will * be requested. May be null, in which case all packages in the restore * set can be restored. @@ -389,7 +552,7 @@ interface IBackupManager { * May be null, in which case the current active transport is used. * @return An interface to the restore session, or null on error. */ - IRestoreSession beginRestoreSession(String packageName, String transportID); + IRestoreSession beginRestoreSessionForUser(int userId, String packageName, String transportID); /** * Notify the backup manager that a BackupAgent has completed the operation @@ -427,13 +590,16 @@ interface IBackupManager { * restored from if we were to install it right now. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which this operation should be performed. * @param packageName The name of the package whose most-suitable dataset we * wish to look up * @return The dataset token from which a restore should be attempted, or zero if * no suitable data is available. */ - long getAvailableRestoreToken(String packageName); + long getAvailableRestoreTokenForUser(int userId, String packageName); /** * Ask the framework whether this app is eligible for backup. @@ -442,21 +608,27 @@ interface IBackupManager { * {@link #filterAppsEligibleForBackup(String[])} to save resources. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which this operation should be performed. * @param packageName The name of the package. * @return Whether this app is eligible for backup. */ - boolean isAppEligibleForBackup(String packageName); + boolean isAppEligibleForBackupForUser(int userId, String packageName); /** * Filter the packages that are eligible for backup and return the result. * *

Callers must hold the android.permission.BACKUP permission to use this method. + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. * + * @param userId User id for which the filter should be performed. * @param packages The list of packages to filter. * @return The packages eligible for backup. */ - String[] filterAppsEligibleForBackup(in String[] packages); + String[] filterAppsEligibleForBackupForUser(int userId, in String[] packages); /** * Request an immediate backup, providing an observer to which results of the backup operation diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 4acd5c494ac75..2112ab9c938bc 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -274,7 +274,7 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void dataChanged(String packageName) throws RemoteException { + public void dataChangedForUser(int userId, String packageName) throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.dataChanged(packageName); @@ -282,8 +282,13 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void initializeTransports(String[] transportNames, IBackupObserver observer) - throws RemoteException { + public void dataChanged(String packageName) throws RemoteException { + dataChangedForUser(binderGetCallingUserId(), packageName); + } + + @Override + public void initializeTransportsForUser( + int userId, String[] transportNames, IBackupObserver observer) throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.initializeTransports(transportNames, observer); @@ -291,7 +296,7 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void clearBackupData(String transportName, String packageName) + public void clearBackupDataForUser(int userId, String transportName, String packageName) throws RemoteException { BackupManagerService svc = mService; if (svc != null) { @@ -300,7 +305,14 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void agentConnected(String packageName, IBinder agent) throws RemoteException { + public void clearBackupData(String transportName, String packageName) + throws RemoteException { + clearBackupDataForUser(binderGetCallingUserId(), transportName, packageName); + } + + @Override + public void agentConnectedForUser(int userId, String packageName, IBinder agent) + throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.agentConnected(packageName, agent); @@ -308,7 +320,12 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void agentDisconnected(String packageName) throws RemoteException { + public void agentConnected(String packageName, IBinder agent) throws RemoteException { + agentConnectedForUser(binderGetCallingUserId(), packageName, agent); + } + + @Override + public void agentDisconnectedForUser(int userId, String packageName) throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.agentDisconnected(packageName); @@ -316,13 +333,24 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void restoreAtInstall(String packageName, int token) throws RemoteException { + public void agentDisconnected(String packageName) throws RemoteException { + agentDisconnectedForUser(binderGetCallingUserId(), packageName); + } + + @Override + public void restoreAtInstallForUser(int userId, String packageName, int token) + throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.restoreAtInstall(packageName, token); } } + @Override + public void restoreAtInstall(String packageName, int token) throws RemoteException { + restoreAtInstallForUser(binderGetCallingUserId(), packageName, token); + } + @Override public void setBackupEnabledForUser(@UserIdInt int userId, boolean isEnabled) throws RemoteException { @@ -338,13 +366,18 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void setAutoRestore(boolean doAutoRestore) throws RemoteException { + public void setAutoRestoreForUser(int userId, boolean doAutoRestore) throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.setAutoRestore(doAutoRestore); } } + @Override + public void setAutoRestore(boolean doAutoRestore) throws RemoteException { + setAutoRestoreForUser(binderGetCallingUserId(), doAutoRestore); + } + @Override public void setBackupProvisioned(boolean isProvisioned) throws RemoteException { BackupManagerService svc = mService; @@ -401,7 +434,8 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void fullTransportBackup(String[] packageNames) throws RemoteException { + public void fullTransportBackupForUser(int userId, String[] packageNames) + throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.fullTransportBackup(packageNames); @@ -417,9 +451,14 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void acknowledgeFullBackupOrRestore(int token, boolean allow, String curPassword, - String encryptionPassword, IFullBackupRestoreObserver observer) - throws RemoteException { + public void acknowledgeFullBackupOrRestoreForUser( + int userId, + int token, + boolean allow, + String curPassword, + String encryptionPassword, + IFullBackupRestoreObserver observer) + throws RemoteException { BackupManagerService svc = mService; if (svc != null) { svc.acknowledgeAdbBackupOrRestore(token, allow, @@ -428,30 +467,50 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public String getCurrentTransport() throws RemoteException { + public void acknowledgeFullBackupOrRestore(int token, boolean allow, String curPassword, + String encryptionPassword, IFullBackupRestoreObserver observer) + throws RemoteException { + BackupManagerService svc = mService; + acknowledgeFullBackupOrRestoreForUser( + binderGetCallingUserId(), token, allow, curPassword, encryptionPassword, observer); + } + + + @Override + public String getCurrentTransportForUser(int userId) throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.getCurrentTransport() : null; } + @Override + public String getCurrentTransport() throws RemoteException { + return getCurrentTransportForUser(binderGetCallingUserId()); + } + /** * Returns the {@link ComponentName} of the host service of the selected transport or * {@code null} if no transport selected or if the transport selected is not registered. */ @Override @Nullable - public ComponentName getCurrentTransportComponent() { + public ComponentName getCurrentTransportComponentForUser(int userId) { BackupManagerService svc = mService; return (svc != null) ? svc.getCurrentTransportComponent() : null; } @Override - public String[] listAllTransports() throws RemoteException { + public String[] listAllTransportsForUser(int userId) throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.listAllTransports() : null; } @Override - public ComponentName[] listAllTransportComponents() throws RemoteException { + public String[] listAllTransports() throws RemoteException { + return listAllTransportsForUser(binderGetCallingUserId()); + } + + @Override + public ComponentName[] listAllTransportComponentsForUser(int userId) throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.listAllTransportComponents() : null; } @@ -463,7 +522,8 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public void updateTransportAttributes( + public void updateTransportAttributesForUser( + int userId, ComponentName transportComponent, String name, @Nullable Intent configurationIntent, @@ -483,13 +543,19 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public String selectBackupTransport(String transport) throws RemoteException { + public String selectBackupTransportForUser(int userId, String transport) + throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.selectBackupTransport(transport) : null; } @Override - public void selectBackupTransportAsync(ComponentName transport, + public String selectBackupTransport(String transport) throws RemoteException { + return selectBackupTransportForUser(binderGetCallingUserId(), transport); + } + + @Override + public void selectBackupTransportAsyncForUser(int userId, ComponentName transport, ISelectBackupTransportCallback listener) throws RemoteException { BackupManagerService svc = mService; if (svc != null) { @@ -506,32 +572,58 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public Intent getConfigurationIntent(String transport) throws RemoteException { + public Intent getConfigurationIntentForUser(int userId, String transport) + throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.getConfigurationIntent(transport) : null; } @Override - public String getDestinationString(String transport) throws RemoteException { + public Intent getConfigurationIntent(String transport) + throws RemoteException { + return getConfigurationIntentForUser(binderGetCallingUserId(), transport); + } + + @Override + public String getDestinationStringForUser(int userId, String transport) throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.getDestinationString(transport) : null; } @Override - public Intent getDataManagementIntent(String transport) throws RemoteException { + public String getDestinationString(String transport) throws RemoteException { + return getDestinationStringForUser(binderGetCallingUserId(), transport); + } + + @Override + public Intent getDataManagementIntentForUser(int userId, String transport) + throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.getDataManagementIntent(transport) : null; } @Override - public String getDataManagementLabel(String transport) throws RemoteException { + public Intent getDataManagementIntent(String transport) + throws RemoteException { + return getDataManagementIntentForUser(binderGetCallingUserId(), transport); + } + + @Override + public String getDataManagementLabelForUser(int userId, String transport) + throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.getDataManagementLabel(transport) : null; } @Override - public IRestoreSession beginRestoreSession(String packageName, String transportID) + public String getDataManagementLabel(String transport) throws RemoteException { + return getDataManagementLabelForUser(binderGetCallingUserId(), transport); + } + + @Override + public IRestoreSession beginRestoreSessionForUser( + int userId, String packageName, String transportID) throws RemoteException { BackupManagerService svc = mService; return (svc != null) ? svc.beginRestoreSession(packageName, transportID) : null; } @@ -545,19 +637,19 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public long getAvailableRestoreToken(String packageName) { + public long getAvailableRestoreTokenForUser(int userId, String packageName) { BackupManagerService svc = mService; return (svc != null) ? svc.getAvailableRestoreToken(packageName) : 0; } @Override - public boolean isAppEligibleForBackup(String packageName) { + public boolean isAppEligibleForBackupForUser(int userId, String packageName) { BackupManagerService svc = mService; return (svc != null) ? svc.isAppEligibleForBackup(packageName) : false; } @Override - public String[] filterAppsEligibleForBackup(String[] packages) { + public String[] filterAppsEligibleForBackupForUser(int userId, String[] packages) { BackupManagerService svc = mService; return (svc != null) ? svc.filterAppsEligibleForBackup(packages) : null; } diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java index d7a398e50a663..8436089bc0aed 100644 --- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java @@ -299,6 +299,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void dataChangedForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.dataChangedForUser(mUserId, PACKAGE_NAME); + + verify(mBackupManagerServiceMock).dataChanged(PACKAGE_NAME); + } + @Test public void dataChanged_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -312,6 +321,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void clearBackupDataForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.clearBackupDataForUser(mUserId, TRANSPORT_NAME, PACKAGE_NAME); + + verify(mBackupManagerServiceMock).clearBackupData(TRANSPORT_NAME, PACKAGE_NAME); + } + @Test public void clearBackupData_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -325,6 +343,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void agentConnectedForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.agentConnectedForUser(mUserId, PACKAGE_NAME, mAgentMock); + + verify(mBackupManagerServiceMock).agentConnected(PACKAGE_NAME, mAgentMock); + } + @Test public void agentConnected_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -338,6 +365,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void agentDisconnectedForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.agentDisconnectedForUser(mUserId, PACKAGE_NAME); + + verify(mBackupManagerServiceMock).agentDisconnected(PACKAGE_NAME); + } + @Test public void agentDisconnected_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -351,6 +387,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void restoreAtInstallForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.restoreAtInstallForUser(mUserId, PACKAGE_NAME, 123); + + verify(mBackupManagerServiceMock).restoreAtInstall(PACKAGE_NAME, 123); + } + @Test public void restoreAtInstall_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -389,6 +434,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void setAutoRestoreForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.setAutoRestoreForUser(mUserId, true); + + verify(mBackupManagerServiceMock).setAutoRestore(true); + } + @Test public void setAutoRestore_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -505,14 +559,14 @@ public class TrampolineTest { @Test public void fullTransportBackup_calledBeforeInitialize_ignored() throws RemoteException { - mTrampoline.fullTransportBackup(PACKAGE_NAMES); + mTrampoline.fullTransportBackupForUser(mUserId, PACKAGE_NAMES); verifyNoMoreInteractions(mBackupManagerServiceMock); } @Test - public void fullTransportBackup_forwarded() throws RemoteException { + public void fullTransportBackupForUser_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); - mTrampoline.fullTransportBackup(PACKAGE_NAMES); + mTrampoline.fullTransportBackupForUser(mUserId, PACKAGE_NAMES); verify(mBackupManagerServiceMock).fullTransportBackup(PACKAGE_NAMES); } @@ -537,6 +591,22 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void acknowledgeFullBackupOrRestoreForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.acknowledgeFullBackupOrRestoreForUser( + mUserId, + 123, + true, + CURRENT_PASSWORD, + ENCRYPTION_PASSWORD, + mFullBackupRestoreObserverMock); + + verify(mBackupManagerServiceMock).acknowledgeAdbBackupOrRestore(123, true, CURRENT_PASSWORD, + ENCRYPTION_PASSWORD, mFullBackupRestoreObserverMock); + } + @Test public void acknowledgeFullBackupOrRestore_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -552,6 +622,16 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void getCurrentTransportForUser_forwarded() throws RemoteException { + when(mBackupManagerServiceMock.getCurrentTransport()).thenReturn(TRANSPORT_NAME); + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransportForUser(mUserId)); + + verify(mBackupManagerServiceMock).getCurrentTransport(); + } + @Test public void getCurrentTransport_forwarded() throws RemoteException { when(mBackupManagerServiceMock.getCurrentTransport()).thenReturn(TRANSPORT_NAME); @@ -568,6 +648,16 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void listAllTransportsForUser_forwarded() throws RemoteException { + when(mBackupManagerServiceMock.listAllTransports()).thenReturn(TRANSPORTS); + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + assertEquals(TRANSPORTS, mTrampoline.listAllTransportsForUser(mUserId)); + verify(mBackupManagerServiceMock).listAllTransports(); + } + + @Test public void listAllTransports_forwarded() throws RemoteException { when(mBackupManagerServiceMock.listAllTransports()).thenReturn(TRANSPORTS); @@ -578,18 +668,19 @@ public class TrampolineTest { } @Test - public void listAllTransportComponents_calledBeforeInitialize_ignored() throws RemoteException { - assertNull(mTrampoline.listAllTransportComponents()); + public void listAllTransportComponentsForUser_calledBeforeInitialize_ignored() + throws RemoteException { + assertNull(mTrampoline.listAllTransportComponentsForUser(mUserId)); verifyNoMoreInteractions(mBackupManagerServiceMock); } @Test - public void listAllTransportComponents_forwarded() throws RemoteException { + public void listAllTransportComponentsForUser_forwarded() throws RemoteException { when(mBackupManagerServiceMock.listAllTransportComponents()).thenReturn( TRANSPORT_COMPONENTS); - mTrampoline.initializeService(UserHandle.USER_SYSTEM); - assertEquals(TRANSPORT_COMPONENTS, mTrampoline.listAllTransportComponents()); + + assertEquals(TRANSPORT_COMPONENTS, mTrampoline.listAllTransportComponentsForUser(mUserId)); verify(mBackupManagerServiceMock).listAllTransportComponents(); } @@ -609,19 +700,34 @@ public class TrampolineTest { } @Test - public void describeTransport_calledBeforeInitialize_ignored() throws RemoteException { - mTrampoline.updateTransportAttributes(TRANSPORT_COMPONENT_NAME, TRANSPORT_NAME, null, - "Transport Destination", null, "Data Management"); + public void updateTransportAttributesForUser_calledBeforeInitialize_ignored() + throws RemoteException { + mTrampoline.updateTransportAttributesForUser( + mUserId, + TRANSPORT_COMPONENT_NAME, + TRANSPORT_NAME, + null, + "Transport Destination", + null, + "Data Management"); + verifyNoMoreInteractions(mBackupManagerServiceMock); } @Test - public void describeTransport_forwarded() throws RemoteException { + public void updateTransportAttributesForUser_forwarded() throws RemoteException { when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); - mTrampoline.initializeService(UserHandle.USER_SYSTEM); - mTrampoline.updateTransportAttributes(TRANSPORT_COMPONENT_NAME, TRANSPORT_NAME, null, - "Transport Destination", null, "Data Management"); + + mTrampoline.updateTransportAttributesForUser( + mUserId, + TRANSPORT_COMPONENT_NAME, + TRANSPORT_NAME, + null, + "Transport Destination", + null, + "Data Management"); + verify(mBackupManagerServiceMock).updateTransportAttributes(TRANSPORT_COMPONENT_NAME, TRANSPORT_NAME, null, "Transport Destination", null, "Data Management"); } @@ -632,6 +738,15 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void selectBackupTransportForUser_forwarded() throws RemoteException { + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + mTrampoline.selectBackupTransportForUser(mUserId, TRANSPORT_NAME); + + verify(mBackupManagerServiceMock).selectBackupTransport(TRANSPORT_NAME); + } + @Test public void selectBackupTransport_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); @@ -640,9 +755,12 @@ public class TrampolineTest { } @Test - public void selectBackupTransportAsync_calledBeforeInitialize_ignored() throws Exception { + public void selectBackupTransportAsyncForUser_calledBeforeInitialize_ignored() + throws Exception { LinkedBlockingQueue q = new LinkedBlockingQueue(); - mTrampoline.selectBackupTransportAsync( + + mTrampoline.selectBackupTransportAsyncForUser( + mUserId, TRANSPORT_COMPONENT_NAME, new ISelectBackupTransportCallback() { @Override @@ -660,6 +778,7 @@ public class TrampolineTest { return null; } }); + verifyNoMoreInteractions(mBackupManagerServiceMock); Integer errorCode = q.poll(5, TimeUnit.SECONDS); assertNotNull(errorCode); @@ -667,17 +786,19 @@ public class TrampolineTest { } @Test - public void selectBackupTransportAsync_calledBeforeInitialize_ignored_nullListener() + public void selectBackupTransportAsyncForUser_calledBeforeInitialize_ignored_nullListener() throws Exception { - mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null); + mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, null); + verifyNoMoreInteractions(mBackupManagerServiceMock); // No crash. } @Test - public void selectBackupTransportAsync_calledBeforeInitialize_ignored_listenerThrowException() + public void selectBackupTransportAsyncForUser_calledBeforeInitialize_ignored_listenerThrows() throws Exception { - mTrampoline.selectBackupTransportAsync( + mTrampoline.selectBackupTransportAsyncForUser( + mUserId, TRANSPORT_COMPONENT_NAME, new ISelectBackupTransportCallback() { @Override @@ -695,14 +816,17 @@ public class TrampolineTest { return null; } }); + verifyNoMoreInteractions(mBackupManagerServiceMock); // No crash. } @Test - public void selectBackupTransportAsync_forwarded() throws RemoteException { + public void selectBackupTransportAsyncForUser_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); - mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null); + + mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, null); + verify(mBackupManagerServiceMock).selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null); } @@ -713,6 +837,19 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void getConfigurationIntentForUser_forwarded() throws RemoteException { + Intent configurationIntentStub = new Intent(); + when(mBackupManagerServiceMock.getConfigurationIntent(TRANSPORT_NAME)).thenReturn( + configurationIntentStub); + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + assertEquals( + configurationIntentStub, + mTrampoline.getConfigurationIntentForUser(mUserId, TRANSPORT_NAME)); + verify(mBackupManagerServiceMock).getConfigurationIntent(TRANSPORT_NAME); + } + @Test public void getConfigurationIntent_forwarded() throws RemoteException { Intent configurationIntentStub = new Intent(); @@ -730,6 +867,18 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void getDestinationStringForUser_forwarded() throws RemoteException { + when(mBackupManagerServiceMock.getDestinationString(TRANSPORT_NAME)).thenReturn( + DESTINATION_STRING); + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + assertEquals( + DESTINATION_STRING, + mTrampoline.getDestinationStringForUser(mUserId, TRANSPORT_NAME)); + verify(mBackupManagerServiceMock).getDestinationString(TRANSPORT_NAME); + } + @Test public void getDestinationString_forwarded() throws RemoteException { when(mBackupManagerServiceMock.getDestinationString(TRANSPORT_NAME)).thenReturn( @@ -746,6 +895,19 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void getDataManagementIntentForUser_forwarded() throws RemoteException { + Intent dataManagementIntent = new Intent(); + when(mBackupManagerServiceMock.getDataManagementIntent(TRANSPORT_NAME)).thenReturn( + dataManagementIntent); + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + assertEquals( + dataManagementIntent, + mTrampoline.getDataManagementIntentForUser(mUserId, TRANSPORT_NAME)); + verify(mBackupManagerServiceMock).getDataManagementIntent(TRANSPORT_NAME); + } + @Test public void getDataManagementIntent_forwarded() throws RemoteException { Intent dataManagementIntent = new Intent(); @@ -763,6 +925,18 @@ public class TrampolineTest { verifyNoMoreInteractions(mBackupManagerServiceMock); } + @Test + public void getDataManagementLabelForUser_forwarded() throws RemoteException { + when(mBackupManagerServiceMock.getDataManagementLabel(TRANSPORT_NAME)).thenReturn( + DATA_MANAGEMENT_LABEL); + mTrampoline.initializeService(UserHandle.USER_SYSTEM); + + assertEquals( + DATA_MANAGEMENT_LABEL, + mTrampoline.getDataManagementLabelForUser(mUserId, TRANSPORT_NAME)); + verify(mBackupManagerServiceMock).getDataManagementLabel(TRANSPORT_NAME); + } + @Test public void getDataManagementLabel_forwarded() throws RemoteException { when(mBackupManagerServiceMock.getDataManagementLabel(TRANSPORT_NAME)).thenReturn( @@ -775,14 +949,16 @@ public class TrampolineTest { @Test public void beginRestoreSession_calledBeforeInitialize_ignored() throws RemoteException { - mTrampoline.beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME); + mTrampoline.beginRestoreSessionForUser(mUserId, PACKAGE_NAME, TRANSPORT_NAME); verifyNoMoreInteractions(mBackupManagerServiceMock); } @Test - public void beginRestoreSession_forwarded() throws RemoteException { + public void beginRestoreSessionForUser_forwarded() throws RemoteException { mTrampoline.initializeService(UserHandle.USER_SYSTEM); - mTrampoline.beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME); + + mTrampoline.beginRestoreSessionForUser(mUserId, PACKAGE_NAME, TRANSPORT_NAME); + verify(mBackupManagerServiceMock).beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME); } @@ -800,32 +976,34 @@ public class TrampolineTest { } @Test - public void getAvailableRestoreToken_calledBeforeInitialize_ignored() throws RemoteException { - assertEquals(0, mTrampoline.getAvailableRestoreToken(PACKAGE_NAME)); + public void getAvailableRestoreTokenForUser_calledBeforeInitialize_ignored() + throws RemoteException { + assertEquals(0, mTrampoline.getAvailableRestoreTokenForUser(mUserId, PACKAGE_NAME)); verifyNoMoreInteractions(mBackupManagerServiceMock); } @Test - public void getAvailableRestoreToken_forwarded() throws RemoteException { + public void getAvailableRestoreTokenForUser_forwarded() throws RemoteException { when(mBackupManagerServiceMock.getAvailableRestoreToken(PACKAGE_NAME)).thenReturn(123L); - mTrampoline.initializeService(UserHandle.USER_SYSTEM); - assertEquals(123, mTrampoline.getAvailableRestoreToken(PACKAGE_NAME)); + + assertEquals(123, mTrampoline.getAvailableRestoreTokenForUser(mUserId, PACKAGE_NAME)); verify(mBackupManagerServiceMock).getAvailableRestoreToken(PACKAGE_NAME); } @Test - public void isAppEligibleForBackup_calledBeforeInitialize_ignored() throws RemoteException { - assertFalse(mTrampoline.isAppEligibleForBackup(PACKAGE_NAME)); + public void isAppEligibleForBackupForUser_calledBeforeInitialize_ignored() + throws RemoteException { + assertFalse(mTrampoline.isAppEligibleForBackupForUser(mUserId, PACKAGE_NAME)); verifyNoMoreInteractions(mBackupManagerServiceMock); } @Test - public void isAppEligibleForBackup_forwarded() throws RemoteException { + public void isAppEligibleForBackupForUser_forwarded() throws RemoteException { when(mBackupManagerServiceMock.isAppEligibleForBackup(PACKAGE_NAME)).thenReturn(true); - mTrampoline.initializeService(UserHandle.USER_SYSTEM); - assertTrue(mTrampoline.isAppEligibleForBackup(PACKAGE_NAME)); + + assertTrue(mTrampoline.isAppEligibleForBackupForUser(mUserId, PACKAGE_NAME)); verify(mBackupManagerServiceMock).isAppEligibleForBackup(PACKAGE_NAME); }