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