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