diff options
-rw-r--r-- | Android.mk | 1 | ||||
-rw-r--r-- | api/system-current.txt | 17 | ||||
-rw-r--r-- | cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java | 4 | ||||
-rw-r--r-- | core/java/android/app/backup/BackupManager.java | 27 | ||||
-rw-r--r-- | core/java/android/app/backup/BackupManagerMonitor.java | 80 | ||||
-rw-r--r-- | core/java/android/app/backup/IBackupManager.aidl | 7 | ||||
-rw-r--r-- | core/java/android/app/backup/IBackupManagerMonitor.aidl | 36 | ||||
-rw-r--r-- | services/backup/java/com/android/server/backup/BackupManagerService.java | 86 | ||||
-rw-r--r-- | services/backup/java/com/android/server/backup/Trampoline.java | 7 |
9 files changed, 237 insertions, 28 deletions
diff --git a/Android.mk b/Android.mk index 9e8973886320..9ebc276d4a84 100644 --- a/Android.mk +++ b/Android.mk @@ -104,6 +104,7 @@ LOCAL_SRC_FILES += \ core/java/android/app/trust/ITrustListener.aidl \ core/java/android/app/backup/IBackupManager.aidl \ core/java/android/app/backup/IBackupObserver.aidl \ + core/java/android/app/backup/IBackupManagerMonitor.aidl \ core/java/android/app/backup/IFullBackupRestoreObserver.aidl \ core/java/android/app/backup/IRestoreObserver.aidl \ core/java/android/app/backup/IRestoreSession.aidl \ diff --git a/api/system-current.txt b/api/system-current.txt index 3a58bf4c8d7a..63489a9c33f0 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6895,7 +6895,7 @@ package android.app.backup { method public boolean isBackupEnabled(); method public java.lang.String[] listAllTransports(); method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver); - method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver, int); + method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver, android.app.backup.BackupManagerMonitor, int); method public int requestRestore(android.app.backup.RestoreObserver); method public deprecated java.lang.String selectBackupTransport(java.lang.String); method public void selectBackupTransport(android.content.ComponentName, android.app.backup.SelectBackupTransportCallback); @@ -6914,6 +6914,21 @@ package android.app.backup { field public static final int SUCCESS = 0; // 0x0 } + public class BackupManagerMonitor { + ctor public BackupManagerMonitor(); + method public void onEvent(android.os.Bundle); + field public static final java.lang.String EXTRA_LOG_EVENT_CATEGORY = "android.app.backup.extra.LOG_EVENT_CATEGORY"; + field public static final java.lang.String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID"; + field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME"; + field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION"; + field public static final int LOG_EVENT_CATEGORY_AGENT = 2; // 0x2 + field public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; // 0x3 + field public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; // 0x1 + field public static final int LOG_EVENT_ID_FULL_BACKUP_TIMEOUT = 4; // 0x4 + field public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT = 21; // 0x15 + field public static final int LOG_EVENT_ID_NO_PACKAGES = 49; // 0x31 + } + public abstract class BackupObserver { ctor public BackupObserver(); method public void backupFinished(int); diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index 7e913913dfae..3e5c3e8efb88 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -17,6 +17,7 @@ package com.android.commands.bmgr; import android.app.backup.BackupManager; +import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; import android.app.backup.IBackupManager; import android.app.backup.IBackupObserver; @@ -312,8 +313,9 @@ public final class Bmgr { } try { BackupObserver observer = new BackupObserver(); + // TODO: implement monitor here? int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer, - flags); + null, flags); if (err == 0) { // Off and running -- wait for the backup to complete observer.waitForCompletion(); diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index f0abe33c4df3..f5c223522213 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -19,6 +19,7 @@ package android.app.backup; import android.annotation.SystemApi; import android.content.ComponentName; import android.content.Context; +import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.RemoteException; @@ -556,7 +557,7 @@ public class BackupManager { */ @SystemApi public int requestBackup(String[] packages, BackupObserver observer) { - return requestBackup(packages, observer, 0); + return requestBackup(packages, observer, null, 0); } /** @@ -570,20 +571,26 @@ public class BackupManager { * @param packages List of package names to backup. * @param observer The {@link BackupObserver} to receive callbacks during the backup * operation. Could be {@code null}. + * @param monitor The {@link BackupManagerMonitorWrapper} to receive callbacks of important + * events during the backup operation. Could be {@code null}. * @param flags {@link #FLAG_NON_INCREMENTAL_BACKUP}. * @return {@link BackupManager#SUCCESS} on success; nonzero on error. * @throws IllegalArgumentException on null or empty {@code packages} param. * @hide */ @SystemApi - public int requestBackup(String[] packages, BackupObserver observer, int flags) { + public int requestBackup(String[] packages, BackupObserver observer, + BackupManagerMonitor monitor, int flags) { checkServiceBinder(); if (sService != null) { try { BackupObserverWrapper observerWrapper = observer == null ? null : new BackupObserverWrapper(mContext, observer); - return sService.requestBackup(packages, observerWrapper, flags); + BackupManagerMonitorWrapper monitorWrapper = monitor == null + ? null + : new BackupManagerMonitorWrapper(monitor); + return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags); } catch (RemoteException e) { Log.e(TAG, "requestBackup() couldn't connect"); } @@ -680,4 +687,18 @@ public class BackupManager { }); } } + + private class BackupManagerMonitorWrapper extends IBackupManagerMonitor.Stub { + final BackupManagerMonitor mMonitor; + + BackupManagerMonitorWrapper(BackupManagerMonitor monitor) { + mMonitor = monitor; + } + + @Override + public void onEvent(final Bundle event) throws RemoteException { + mMonitor.onEvent(event); + } + } + } diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java new file mode 100644 index 000000000000..b937886e2032 --- /dev/null +++ b/core/java/android/app/backup/BackupManagerMonitor.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.app.backup; + +import android.annotation.SystemApi; +import android.os.Bundle; + +/** + * Callback class for receiving important events during backup/restore operations. + * Events consist mostly of errors and exceptions, giving detailed reason on why a restore/backup + * failed or any time BackupManager makes an important decision. + * On the other hand {@link BackupObserver} will give a failure/success view without + * getting into details why. This callback runs on the thread it was called on because it can get + * a bit spammy. + * These callbacks will run on the binder thread. + * + * @hide + */ +@SystemApi +public class BackupManagerMonitor { + + // Logging constants for BackupManagerMonitor + public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; + public static final int LOG_EVENT_CATEGORY_AGENT = 2; + public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; + /** string : the package name */ + public static final String EXTRA_LOG_EVENT_PACKAGE_NAME = + "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME"; + /** int : the versionCode of the package named by EXTRA_LOG_EVENT_PACKAGE_NAME */ + public static final String EXTRA_LOG_EVENT_PACKAGE_VERSION = + "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION"; + /** int : the id of the log message, will be a unique identifier */ + public static final String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID"; + /** + * int : category will be one of + * { LOG_EVENT_CATEGORY_TRANSPORT, + * LOG_EVENT_CATEGORY_AGENT, + * LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY}. + */ + public static final String EXTRA_LOG_EVENT_CATEGORY = + "android.app.backup.extra.LOG_EVENT_CATEGORY"; + + // TODO complete this list with all log messages. And document properly. + public static final int LOG_EVENT_ID_FULL_BACKUP_TIMEOUT = 4; + public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT = 21; + public static final int LOG_EVENT_ID_NO_PACKAGES = 49; + + + + /** + * This method will be called each time something important happens on BackupManager. + * + * @param event bundle will contain data about event: + * - event id, not optional, a unique identifier for each event. + * - package name, optional, the current package we're backing up/restoring if applicable. + * - package version, optional, the current package version we're backing up/restoring + * if applicable. + * - category of event, not optional, one of + * { LOG_EVENT_CATEGORY_TRANSPORT, + * LOG_EVENT_CATEGORY_AGENT, + * LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY} + * + */ + public void onEvent(Bundle event) { + } +} diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl index 1657e2e98698..393667d7ff2d 100644 --- a/core/java/android/app/backup/IBackupManager.aidl +++ b/core/java/android/app/backup/IBackupManager.aidl @@ -17,6 +17,7 @@ package android.app.backup; import android.app.backup.IBackupObserver; +import android.app.backup.IBackupManagerMonitor; import android.app.backup.IFullBackupRestoreObserver; import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; @@ -376,9 +377,13 @@ interface IBackupManager { * @param observer The {@link BackupObserver} to receive callbacks during the backup * operation. * + * @param monitor the {@link BackupManagerMonitor} to receive callbacks about important events + * during the backup operation. + * * @param flags {@link BackupManager#FLAG_NON_INCREMENTAL_BACKUP}. * * @return Zero on success; nonzero on error. */ - int requestBackup(in String[] packages, IBackupObserver observer, int flags); + int requestBackup(in String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, + int flags); } diff --git a/core/java/android/app/backup/IBackupManagerMonitor.aidl b/core/java/android/app/backup/IBackupManagerMonitor.aidl new file mode 100644 index 000000000000..cf1d9f80718f --- /dev/null +++ b/core/java/android/app/backup/IBackupManagerMonitor.aidl @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.app.backup; + +import android.os.Bundle; + +/** + * Callback class for receiving important events during backup/restore operations. + * These callbacks will run on the binder thread. + * + * @hide + */ +oneway interface IBackupManagerMonitor { + + /** + * This method will be called each time something important happens on BackupManager. + * + * @param event bundle will contain data about event, like package name, package version etc. + */ + void onEvent(in Bundle event); + +}
\ No newline at end of file diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 2eab813c01e9..043c8ad91eb6 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -30,18 +30,20 @@ import android.app.backup.BackupAgent; import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; import android.app.backup.BackupManager; +import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; import android.app.backup.BackupTransport; import android.app.backup.FullBackup; import android.app.backup.FullBackupDataOutput; -import android.app.backup.IBackupManager; import android.app.backup.IBackupObserver; +import android.app.backup.IBackupManagerMonitor; +import android.app.backup.RestoreDescription; +import android.app.backup.RestoreSet; +import android.app.backup.IBackupManager; import android.app.backup.IFullBackupRestoreObserver; import android.app.backup.IRestoreObserver; import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; -import android.app.backup.RestoreDescription; -import android.app.backup.RestoreSet; import android.app.backup.SelectBackupTransportCallback; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; @@ -427,6 +429,7 @@ public class BackupManagerService { public IBackupTransport transport; public String dirName; public IRestoreObserver observer; + public IBackupManagerMonitor monitor; public long token; public PackageInfo pkgInfo; public int pmToken; // in post-install restore, the PM's token for this transaction @@ -565,17 +568,19 @@ public class BackupManagerService { public ArrayList<String> kvPackages; public ArrayList<String> fullPackages; public IBackupObserver observer; + public IBackupManagerMonitor monitor; public boolean userInitiated; public boolean nonIncrementalBackup; BackupParams(IBackupTransport transport, String dirName, ArrayList<String> kvPackages, - ArrayList<String> fullPackages, IBackupObserver observer, boolean userInitiated, - boolean nonIncrementalBackup) { + ArrayList<String> fullPackages, IBackupObserver observer, + IBackupManagerMonitor monitor,boolean userInitiated, boolean nonIncrementalBackup) { this.transport = transport; this.dirName = dirName; this.kvPackages = kvPackages; this.fullPackages = fullPackages; this.observer = observer; + this.monitor = monitor; this.userInitiated = userInitiated; this.nonIncrementalBackup = nonIncrementalBackup; } @@ -785,8 +790,8 @@ public class BackupManagerService { // Spin up a backup state sequence and set it running try { String dirName = transport.transportDirName(); - PerformBackupTask pbt = new PerformBackupTask(transport, dirName, - queue, oldJournal, null, null, false, false /* nonIncremental */); + PerformBackupTask pbt = new PerformBackupTask(transport, dirName, queue, + oldJournal, null, null, null, false, false /* nonIncremental */); Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt); sendMessage(pbtMessage); } catch (Exception e) { @@ -861,8 +866,8 @@ public class BackupManagerService { RestoreParams params = (RestoreParams)msg.obj; Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer); BackupRestoreTask task = new PerformUnifiedRestoreTask(params.transport, - params.observer, params.token, params.pkgInfo, params.pmToken, - params.isSystemRestore, params.filterSet); + params.observer, params.monitor, params.token, params.pkgInfo, + params.pmToken, params.isSystemRestore, params.filterSet); Message restoreMsg = obtainMessage(MSG_BACKUP_RESTORE_STEP, task); sendMessage(restoreMsg); break; @@ -1025,7 +1030,7 @@ public class BackupManagerService { mWakelock.acquire(); PerformBackupTask pbt = new PerformBackupTask(params.transport, params.dirName, - kvQueue, null, params.observer, params.fullPackages, true, + kvQueue, null, params.observer, params.monitor, params.fullPackages, true, params.nonIncrementalBackup); Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt); sendMessage(pbtMessage); @@ -2281,11 +2286,18 @@ public class BackupManagerService { } public int requestBackup(String[] packages, IBackupObserver observer, int flags) { + return requestBackup(packages, observer, null, flags); + } + + public int requestBackup(String[] packages, IBackupObserver observer, + IBackupManagerMonitor monitor, int flags) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup"); if (packages == null || packages.length < 1) { Slog.e(TAG, "No packages named for backup request"); sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED); + monitor = monitorEvent(monitor, BackupManagerMonitor.LOG_EVENT_ID_NO_PACKAGES, + null, BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT); throw new IllegalArgumentException("No packages are provided for backup"); } @@ -2340,7 +2352,7 @@ public class BackupManagerService { Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP); msg.obj = new BackupParams(transport, dirName, kvBackupList, fullBackupList, observer, - true, nonIncrementalBackup); + monitor, true, nonIncrementalBackup); mBackupHandler.sendMessage(msg); return BackupManager.SUCCESS; } @@ -2456,6 +2468,7 @@ public class BackupManagerService { BackupState mCurrentState; ArrayList<String> mPendingFullBackups; IBackupObserver mObserver; + IBackupManagerMonitor mMonitor; // carried information about the current in-flight operation IBackupAgent mAgentBinder; @@ -2473,12 +2486,13 @@ public class BackupManagerService { public PerformBackupTask(IBackupTransport transport, String dirName, ArrayList<BackupRequest> queue, File journal, IBackupObserver observer, - ArrayList<String> pendingFullBackups, boolean userInitiated, - boolean nonIncremental) { + IBackupManagerMonitor monitor, ArrayList<String> pendingFullBackups, + boolean userInitiated, boolean nonIncremental) { mTransport = transport; mOriginalQueue = queue; mJournal = journal; mObserver = observer; + mMonitor = monitor; mPendingFullBackups = pendingFullBackups; mUserInitiated = userInitiated; mNonIncremental = nonIncremental; @@ -2838,7 +2852,7 @@ public class BackupManagerService { PerformFullTransportBackupTask task = new PerformFullTransportBackupTask(/*fullBackupRestoreObserver*/ null, fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, latch, - mObserver, mUserInitiated); + mObserver, mMonitor, mUserInitiated); // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); (new Thread(task, "full-transport-requested")).start(); @@ -3215,6 +3229,9 @@ public class BackupManagerService { Slog.e(TAG, "Timeout backing up " + mCurrentPackage.packageName); EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, mCurrentPackage.packageName, "timeout"); + mMonitor = monitorEvent(mMonitor, + BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT, + mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT); addBackupTrace("timeout of " + mCurrentPackage.packageName); agentErrorCleanup(); dataChangedImpl(mCurrentPackage.packageName); @@ -4197,17 +4214,19 @@ public class BackupManagerService { class PerformFullTransportBackupTask extends FullBackupTask { static final String TAG = "PFTBT"; ArrayList<PackageInfo> mPackages; + PackageInfo mCurrentPackage; boolean mUpdateSchedule; CountDownLatch mLatch; AtomicBoolean mKeepRunning; // signal from job scheduler FullBackupJob mJob; // if a scheduled job needs to be finished afterwards IBackupObserver mBackupObserver; + IBackupManagerMonitor mMonitor; boolean mUserInitiated; PerformFullTransportBackupTask(IFullBackupRestoreObserver observer, String[] whichPackages, boolean updateSchedule, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, - boolean userInitiated) { + IBackupManagerMonitor monitor, boolean userInitiated) { super(observer); mUpdateSchedule = updateSchedule; mLatch = latch; @@ -4215,12 +4234,14 @@ public class BackupManagerService { mJob = runningJob; mPackages = new ArrayList<PackageInfo>(whichPackages.length); mBackupObserver = backupObserver; + mMonitor = monitor; mUserInitiated = userInitiated; for (String pkg : whichPackages) { try { PackageInfo info = mPackageManager.getPackageInfo(pkg, PackageManager.GET_SIGNATURES); + mCurrentPackage = info; if (!appIsEligibleForBackup(info.applicationInfo)) { // Cull any packages that have indicated that backups are not permitted, // that run as system-domain uids but do not define their own backup agents, @@ -4732,6 +4753,9 @@ public class BackupManagerService { if (DEBUG) { Slog.w(TAG, "Full backup timeout of " + mTarget.packageName); } + mMonitor = monitorEvent(mMonitor, + BackupManagerMonitor.LOG_EVENT_ID_FULL_BACKUP_TIMEOUT, + mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT); tearDownAgentAndKill(mTarget.applicationInfo); } } @@ -4993,7 +5017,7 @@ public class BackupManagerService { CountDownLatch latch = new CountDownLatch(1); String[] pkg = new String[] {entry.packageName}; mRunningFullBackupTask = new PerformFullTransportBackupTask(null, pkg, true, - scheduledJob, latch, null, false /* userInitiated */); + scheduledJob, latch, null, null, false /* userInitiated */); // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); (new Thread(mRunningFullBackupTask)).start(); @@ -7825,8 +7849,8 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF // Invariant: mWakelock is already held, and this task is responsible for // releasing it at the end of the restore operation. PerformUnifiedRestoreTask(IBackupTransport transport, IRestoreObserver observer, - long restoreSetToken, PackageInfo targetPackage, int pmToken, - boolean isFullSystemRestore, String[] filterSet) { + IBackupManagerMonitor monitor, long restoreSetToken, PackageInfo targetPackage, + int pmToken, boolean isFullSystemRestore, String[] filterSet) { mState = UnifiedRestoreState.INITIAL; mStartRealtime = SystemClock.elapsedRealtime(); @@ -9247,7 +9271,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF try { CountDownLatch latch = new CountDownLatch(1); PerformFullTransportBackupTask task = new PerformFullTransportBackupTask(null, - pkgNames, false, null, latch, null, false /* userInitiated */); + pkgNames, false, null, latch, null, null, false /* userInitiated */); // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); (new Thread(task, "full-transport-master")).start(); @@ -10436,4 +10460,28 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF } } } + + private static IBackupManagerMonitor monitorEvent(IBackupManagerMonitor monitor, int id, + PackageInfo pkg, int category) { + if (monitor != null) { + try { + Bundle bundle = new Bundle(); + bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID, id); + bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_CATEGORY, category); + if (pkg != null) { + bundle.putString(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME, + pkg.packageName); + bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION, + pkg.versionCode); + } + monitor.onEvent(bundle); + return monitor; + } catch(RemoteException e) { + if (DEBUG) { + Slog.w(TAG, "backup manager monitor went away"); + } + } + } + return null; + } } diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index a1a2c95e1eac..da0cee5aa4fa 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -18,6 +18,7 @@ package com.android.server.backup; import android.app.backup.IBackupManager; import android.app.backup.IBackupObserver; +import android.app.backup.IBackupManagerMonitor; import android.app.backup.IFullBackupRestoreObserver; import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; @@ -355,10 +356,10 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public int requestBackup(String[] packages, IBackupObserver observer, int flags) - throws RemoteException { + public int requestBackup(String[] packages, IBackupObserver observer, + IBackupManagerMonitor monitor, int flags) throws RemoteException { BackupManagerService svc = mService; - return (svc != null) ? svc.requestBackup(packages, observer, flags) : null; + return (svc != null) ? svc.requestBackup(packages, observer, monitor, flags) : null; } @Override |