Trampoline.java revision bbe23b31dcd0eec8af5b5198970de7ff2a9ef79a
1bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate/* 2bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * Copyright (C) 2014 The Android Open Source Project 3bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * 4bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * Licensed under the Apache License, Version 2.0 (the "License"); 5bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * you may not use this file except in compliance with the License. 6bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * You may obtain a copy of the License at 7bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * 8bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * http://www.apache.org/licenses/LICENSE-2.0 9bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * 10bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * Unless required by applicable law or agreed to in writing, software 11bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * distributed under the License is distributed on an "AS IS" BASIS, 12bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * See the License for the specific language governing permissions and 14bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate * limitations under the License. 15bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate */ 16bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 17bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tatepackage com.android.server.backup; 18bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 19bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.app.backup.IBackupManager; 20bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.app.backup.IFullBackupRestoreObserver; 21bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.app.backup.IRestoreSession; 22bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.content.Context; 23bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.content.Intent; 24bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.Binder; 25bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.Environment; 26bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.IBinder; 27bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.ParcelFileDescriptor; 28bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.Process; 29bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.RemoteException; 30bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.SystemProperties; 31bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.os.UserHandle; 32bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport android.util.Slog; 33bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 34bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport java.io.File; 35bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport java.io.FileDescriptor; 36bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport java.io.IOException; 37bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tateimport java.io.PrintWriter; 38bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 39bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tatepublic class Trampoline extends IBackupManager.Stub { 40bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate static final String TAG = "BackupManagerService"; 41bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate static final boolean DEBUG_TRAMPOLINE = false; 42bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 43bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // When this file is present, the backup service is inactive 44bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate static final String BACKUP_SUPPRESS_FILENAME = "backup-suppress"; 45bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 46bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // Product-level suppression of backup/restore 47bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate static final String BACKUP_DISABLE_PROPERTY = "ro.backup.disable"; 48bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 49bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate final Context mContext; 50bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate final File mSuppressFile; // existence testing & creating synchronized on 'this' 51bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate final boolean mGlobalDisable; 52bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate volatile BackupManagerService mService; 53bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 54bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public Trampoline(Context context) { 55bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mContext = context; 56bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate File dir = new File(Environment.getSecureDataDirectory(), "backup"); 57bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate dir.mkdirs(); 58bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mSuppressFile = new File(dir, BACKUP_SUPPRESS_FILENAME); 59bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mGlobalDisable = SystemProperties.getBoolean(BACKUP_DISABLE_PROPERTY, false); 60bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 61bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 62bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // internal control API 63bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void initialize(final int whichUser) { 64bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // Note that only the owner user is currently involved in backup/restore 65bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (whichUser == UserHandle.USER_OWNER) { 66bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // Does this product support backup/restore at all? 67bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (mGlobalDisable) { 68bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate Slog.i(TAG, "Backup/restore not supported"); 69bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return; 70bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 71bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 72bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate synchronized (this) { 73bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (!mSuppressFile.exists()) { 74bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mService = new BackupManagerService(mContext, this); 75bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } else { 76bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate Slog.i(TAG, "Backup inactive in user " + whichUser); 77bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 78bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 79bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 80bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 81bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 82bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void setBackupServiceActive(final int userHandle, boolean makeActive) { 83bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // Only the DPM should be changing the active state of backup 84bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate final int caller = Binder.getCallingUid(); 85bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (caller != Process.SYSTEM_UID 86bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate && caller != Process.ROOT_UID) { 87bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate throw new SecurityException("No permission to configure backup activity"); 88bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 89bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 90bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (mGlobalDisable) { 91bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate Slog.i(TAG, "Backup/restore not supported"); 92bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return; 93bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 94bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 95bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (userHandle == UserHandle.USER_OWNER) { 96bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate synchronized (this) { 97bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (makeActive != (mService != null)) { 98bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate Slog.i(TAG, "Making backup " 99bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate + (makeActive ? "" : "in") + "active in user " + userHandle); 100bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (makeActive) { 101bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mService = new BackupManagerService(mContext, this); 102bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mSuppressFile.delete(); 103bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } else { 104bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mService = null; 105bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate try { 106bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate mSuppressFile.createNewFile(); 107bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } catch (IOException e) { 108bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate Slog.e(TAG, "Unable to persist backup service inactivity"); 109bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 110bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 111bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 112bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 113bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 114bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 115bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 116bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // IBackupManager binder API 117bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 118bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void dataChanged(String packageName) throws RemoteException { 119bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 120bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 121bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.dataChanged(packageName); 122bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 123bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 124bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 125bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 126bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void clearBackupData(String transportName, String packageName) 127bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate throws RemoteException { 128bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 129bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 130bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.clearBackupData(transportName, packageName); 131bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 132bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 133bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 134bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 135bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void agentConnected(String packageName, IBinder agent) throws RemoteException { 136bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 137bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 138bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.agentConnected(packageName, agent); 139bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 140bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 141bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 142bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 143bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void agentDisconnected(String packageName) throws RemoteException { 144bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 145bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 146bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.agentDisconnected(packageName); 147bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 148bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 149bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 150bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 151bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void restoreAtInstall(String packageName, int token) throws RemoteException { 152bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 153bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 154bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.restoreAtInstall(packageName, token); 155bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 156bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 157bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 158bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 159bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void setBackupEnabled(boolean isEnabled) throws RemoteException { 160bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 161bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 162bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.setBackupEnabled(isEnabled); 163bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 164bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 165bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 166bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 167bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void setAutoRestore(boolean doAutoRestore) throws RemoteException { 168bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 169bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 170bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.setAutoRestore(doAutoRestore); 171bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 172bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 173bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 174bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 175bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void setBackupProvisioned(boolean isProvisioned) throws RemoteException { 176bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 177bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 178bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.setBackupProvisioned(isProvisioned); 179bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 180bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 181bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 182bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 183bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public boolean isBackupEnabled() throws RemoteException { 184bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 185bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.isBackupEnabled() : false; 186bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 187bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 188bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 189bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public boolean setBackupPassword(String currentPw, String newPw) throws RemoteException { 190bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 191bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.setBackupPassword(currentPw, newPw) : false; 192bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 193bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 194bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 195bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public boolean hasBackupPassword() throws RemoteException { 196bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 197bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.hasBackupPassword() : false; 198bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 199bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 200bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 201bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void backupNow() throws RemoteException { 202bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 203bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 204bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.backupNow(); 205bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 206bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 207bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 208bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 209bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void fullBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeObbs, 210bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate boolean includeShared, boolean doWidgets, boolean allApps, 211bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate boolean allIncludesSystem, boolean doCompress, String[] packageNames) 212bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate throws RemoteException { 213bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 214bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 215bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.fullBackup(fd, includeApks, includeObbs, includeShared, doWidgets, 216bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate allApps, allIncludesSystem, doCompress, packageNames); 217bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 218bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 219bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 220bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 221bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void fullTransportBackup(String[] packageNames) throws RemoteException { 222bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 223bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 224bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.fullTransportBackup(packageNames); 225bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 226bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 227bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 228bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 229bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void fullRestore(ParcelFileDescriptor fd) throws RemoteException { 230bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 231bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 232bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.fullRestore(fd); 233bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 234bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 235bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 236bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 237bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void acknowledgeFullBackupOrRestore(int token, boolean allow, String curPassword, 238bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate String encryptionPassword, IFullBackupRestoreObserver observer) 239bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate throws RemoteException { 240bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 241bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 242bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.acknowledgeFullBackupOrRestore(token, allow, 243bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate curPassword, encryptionPassword, observer); 244bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 245bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 246bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 247bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 248bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public String getCurrentTransport() throws RemoteException { 249bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 250bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.getCurrentTransport() : null; 251bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 252bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 253bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 254bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public String[] listAllTransports() throws RemoteException { 255bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 256bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.listAllTransports() : null; 257bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 258bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 259bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 260bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public String selectBackupTransport(String transport) throws RemoteException { 261bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 262bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.selectBackupTransport(transport) : null; 263bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 264bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 265bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 266bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public Intent getConfigurationIntent(String transport) throws RemoteException { 267bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 268bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.getConfigurationIntent(transport) : null; 269bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 270bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 271bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 272bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public String getDestinationString(String transport) throws RemoteException { 273bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 274bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.getDestinationString(transport) : null; 275bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 276bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 277bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 278bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public Intent getDataManagementIntent(String transport) throws RemoteException { 279bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 280bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.getDataManagementIntent(transport) : null; 281bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 282bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 283bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 284bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public String getDataManagementLabel(String transport) throws RemoteException { 285bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 286bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.getDataManagementLabel(transport) : null; 287bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 288bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 289bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 290bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public IRestoreSession beginRestoreSession(String packageName, String transportID) 291bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate throws RemoteException { 292bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 293bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.beginRestoreSession(packageName, transportID) : null; 294bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 295bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 296bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 297bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void opComplete(int token) throws RemoteException { 298bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 299bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 300bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.opComplete(token); 301bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 302bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 303bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 304bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate @Override 305bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 306bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 307bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 308bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.dump(fd, pw, args); 309bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } else { 310bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate pw.println("Inactive"); 311bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 312bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 313bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 314bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // Full backup/restore entry points - non-Binder; called directly 315bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate // by the full-backup scheduled job 316bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate /* package */ boolean beginFullBackup(FullBackupJob scheduledJob) { 317bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 318bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate return (svc != null) ? svc.beginFullBackup(scheduledJob) : false; 319bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 320bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate 321bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate /* package */ void endFullBackup() { 322bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate BackupManagerService svc = mService; 323bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate if (svc != null) { 324bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate svc.endFullBackup(); 325bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 326bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate } 327bbe23b31dcd0eec8af5b5198970de7ff2a9ef79aChristopher Tate} 328