11fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov/* 21fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * Copyright (C) 2017 The Android Open Source Project 31fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * 41fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * Licensed under the Apache License, Version 2.0 (the "License"); 51fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * you may not use this file except in compliance with the License. 61fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * You may obtain a copy of the License at 71fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * 81fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * http://www.apache.org/licenses/LICENSE-2.0 91fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * 101fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * Unless required by applicable law or agreed to in writing, software 111fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * distributed under the License is distributed on an "AS IS" BASIS, 121fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * See the License for the specific language governing permissions and 141fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * limitations under the License 151fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov */ 161fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 171fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovpackage com.android.server.backup; 181fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 19adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikovimport android.app.IBackupAgent; 20adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikovimport android.app.backup.IBackupManager; 211fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.app.backup.IBackupManagerMonitor; 221fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.app.backup.IBackupObserver; 231fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.app.backup.IFullBackupRestoreObserver; 241fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.app.backup.IRestoreSession; 251fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.app.backup.ISelectBackupTransportCallback; 261fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.content.ComponentName; 271fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.content.Intent; 28adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikovimport android.content.pm.ApplicationInfo; 291fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.os.IBinder; 301fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport android.os.ParcelFileDescriptor; 311fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport java.io.FileDescriptor; 321fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikovimport java.io.PrintWriter; 331fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 341fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov/** 351fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * Interface for BackupManagerService. 361fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * 371fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * Current and future implementations of BackupManagerService should use this interface, so that 381fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov * Trampoline is able to switch between them. 391fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov */ 40ada1f001e63994e96ff4c417e3979f909a996eeaArtem Iglikovpublic interface BackupManagerServiceInterface { 411fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 42adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov // Utility: build a new random integer token 43adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov int generateRandomIntegerToken(); 44adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 451fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov boolean setBackupPassword(String currentPw, String newPw); 461fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 471fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov boolean hasBackupPassword(); 481fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 49adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov // fire off a backup agent, blocking until it attaches or times out 50adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov IBackupAgent bindToAgentSynchronous(ApplicationInfo app, int mode); 51adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 521fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Get the restore-set token for the best-available restore set for this package: 531fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // the active set if possible, else the ancestral one. Returns zero if none available. 541fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov long getAvailableRestoreToken(String packageName); 551fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 561fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov int requestBackup(String[] packages, IBackupObserver observer, int flags); 571fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 581fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov int requestBackup(String[] packages, IBackupObserver observer, 591fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov IBackupManagerMonitor monitor, int flags); 601fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 611fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Cancel all running backups. 621fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void cancelBackups(); 631fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 64adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov void prepareOperationTimeout(int token, long interval, BackupRestoreTask callback, 65adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov int operationType); 66adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 67adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov // synchronous waiter case 68adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov boolean waitUntilOperationComplete(int token); 69adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 70adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov void tearDownAgentAndKill(ApplicationInfo app); 71adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 72adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov boolean beginFullBackup(FullBackupJob scheduledJob); 73adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 74adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov // The job scheduler says our constraints don't hold any more, 75adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov // so tear down any ongoing backup task right away. 76adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov void endFullBackup(); 77adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 781fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void dataChanged(String packageName); 791fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 80924afe2b0f721afa857a55c33da559f6efc41d32Christopher Tate // Initialize the given transport 81924afe2b0f721afa857a55c33da559f6efc41d32Christopher Tate void initializeTransports(String[] transportName, IBackupObserver observer); 82924afe2b0f721afa857a55c33da559f6efc41d32Christopher Tate 831fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Clear the given package's backup data from the current transport 841fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void clearBackupData(String transportName, String packageName); 851fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 861fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Run a backup pass immediately for any applications that have declared 871fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // that they have pending updates. 881fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void backupNow(); 891fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 901fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Run a backup pass for the given packages, writing the resulting data stream 911fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // to the supplied file descriptor. This method is synchronous and does not return 921fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // to the caller until the backup has been completed. 931fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // 941fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // This is the variant used by 'adb backup'; it requires on-screen confirmation 951fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // by the user because it can be used to offload data over untrusted USB. 961fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void adbBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeObbs, 971fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov boolean includeShared, boolean doWidgets, boolean doAllApps, boolean includeSystem, 981fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov boolean compress, boolean doKeyValue, String[] pkgList); 991fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1001fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void fullTransportBackup(String[] pkgNames); 1011fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1021fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void adbRestore(ParcelFileDescriptor fd); 1031fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1041fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Confirm that the previously-requested full backup/restore operation can proceed. This 1051fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // is used to require a user-facing disclosure about the operation. 1061fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void acknowledgeAdbBackupOrRestore(int token, boolean allow, 1071fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String curPassword, String encPpassword, IFullBackupRestoreObserver observer); 1081fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1091fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Enable/disable backups 1101fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void setBackupEnabled(boolean enable); 1111fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1121fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Enable/disable automatic restore of app data at install time 1131fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void setAutoRestore(boolean doAutoRestore); 1141fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1151fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Mark the backup service as having been provisioned 1161fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void setBackupProvisioned(boolean available); 1171fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1181fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Report whether the backup mechanism is currently enabled 1191fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov boolean isBackupEnabled(); 1201fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1211fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Report the name of the currently active transport 1221fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String getCurrentTransport(); 1231fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1241fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Report all known, available backup transports 1251fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String[] listAllTransports(); 1261fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1271fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov ComponentName[] listAllTransportComponents(); 1281fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1291fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String[] getTransportWhitelist(); 1301fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1311fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Select which transport to use for the next backup operation. 1321fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String selectBackupTransport(String transport); 1331fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1341fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void selectBackupTransportAsync(ComponentName transport, 1351fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov ISelectBackupTransportCallback listener); 1361fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1371fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Supply the configuration Intent for the given transport. If the name is not one 1381fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // of the available transports, or if the transport does not supply any configuration 1391fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // UI, the method returns null. 1401fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov Intent getConfigurationIntent(String transportName); 1411fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1421fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Supply the configuration summary string for the given transport. If the name is 1431fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // not one of the available transports, or if the transport does not supply any 1441fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // summary / destination string, the method can return null. 1451fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // 1461fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // This string is used VERBATIM as the summary text of the relevant Settings item! 1471fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String getDestinationString(String transportName); 1481fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1491fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Supply the manage-data intent for the given transport. 1501fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov Intent getDataManagementIntent(String transportName); 1511fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1521fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Supply the menu label for affordances that fire the manage-data intent 1531fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // for the given transport. 1541fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov String getDataManagementLabel(String transportName); 1551fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1561fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Callback: a requested backup agent has been instantiated. This should only 1571fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // be called from the Activity Manager. 1581fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void agentConnected(String packageName, IBinder agentBinder); 1591fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1601fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Callback: a backup agent has failed to come up, or has unexpectedly quit. 1611fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // If the agent failed to come up in the first place, the agentBinder argument 1621fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // will be null. This should only be called from the Activity Manager. 1631fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void agentDisconnected(String packageName); 1641fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1651fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // An application being installed will need a restore pass, then the Package Manager 1661fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // will need to be told when the restore is finished. 1671fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void restoreAtInstall(String packageName, int token); 1681fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1691fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Hand off a restore session 1701fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov IRestoreSession beginRestoreSession(String packageName, String transport); 1711fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1721fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // Note that a currently-active backup agent has notified us that it has 1731fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov // completed the given outstanding asynchronous backup/restore operation. 1741fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void opComplete(int token, long result); 1751fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1761fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov boolean isAppEligibleForBackup(String packageName); 1771fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov 1781fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov void dump(FileDescriptor fd, PrintWriter pw, String[] args); 179adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov 180adf8288a3f1291fad9db7ced9301905841bbf66cArtem Iglikov IBackupManager getBackupManagerBinder(); 1811fb72bc2e12025f79b1a42b49c2ca8aac9b3bc13Artem Iglikov} 182