From 511d02fcc37dce092e17354d53023db44817ebe6 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Wed, 8 Apr 2015 20:05:30 -0700 Subject: [PATCH] Add system API for querying the available restore dataset for a package Bug 20123585 Change-Id: Ife6e77a224b5d4175178aacdb7c285e9944b9eab --- api/system-current.txt | 1 + .../android/app/backup/BackupManager.java | 26 +++++++++++++++++++ .../android/app/backup/IBackupManager.aidl | 13 ++++++++++ .../server/backup/BackupManagerService.java | 5 +++- .../com/android/server/backup/Trampoline.java | 6 +++++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/api/system-current.txt b/api/system-current.txt index 88892a37e0bdf..09682f8d0b1e2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5912,6 +5912,7 @@ package android.app.backup { method public android.app.backup.RestoreSession beginRestoreSession(); method public void dataChanged(); method public static void dataChanged(java.lang.String); + method public long getAvailableRestoreToken(java.lang.String); method public java.lang.String getCurrentTransport(); method public boolean isBackupEnabled(); method public java.lang.String[] listAllTransports(); diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 9151a162aeed6..8b79305901269 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -339,4 +339,30 @@ public class BackupManager { } } } + + /** + * Ask the framework which dataset, if any, the given package's data would be + * restored from if we were to install it right now. + * + *

Callers must hold the android.permission.BACKUP permission to use this method. + * + * @param packageName The name of the package whose most-suitable dataset we + * wish to look up + * @return The dataset token from which a restore should be attempted, or zero if + * no suitable data is available. + * + * @hide + */ + @SystemApi + public long getAvailableRestoreToken(String packageName) { + checkServiceBinder(); + if (sService != null) { + try { + return sService.getAvailableRestoreToken(packageName); + } catch (RemoteException e) { + Log.e(TAG, "getAvailableRestoreToken() couldn't connect"); + } + } + return 0; + } } diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl index 8f36dc473ff1e..87e4ef1207302 100644 --- a/core/java/android/app/backup/IBackupManager.aidl +++ b/core/java/android/app/backup/IBackupManager.aidl @@ -313,4 +313,17 @@ interface IBackupManager { * is being queried. */ boolean isBackupServiceActive(int whichUser); + + /** + * Ask the framework which dataset, if any, the given package's data would be + * restored from if we were to install it right now. + * + *

Callers must hold the android.permission.BACKUP permission to use this method. + * + * @param packageName The name of the package whose most-suitable dataset we + * wish to look up + * @return The dataset token from which a restore should be attempted, or zero if + * no suitable data is available. + */ + long getAvailableRestoreToken(String packageName); } diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 96840a2703ebc..1bed4f37d1f3c 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -2209,7 +2209,10 @@ public class BackupManagerService { // Get the restore-set token for the best-available restore set for this package: // the active set if possible, else the ancestral one. Returns zero if none available. - long getAvailableRestoreToken(String packageName) { + public long getAvailableRestoreToken(String packageName) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, + "getAvailableRestoreToken"); + long token = mAncestralToken; synchronized (mQueueLock) { if (mEverStoredApps.contains(packageName)) { diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 99bbdae6e7d78..5859c6a223d05 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -316,6 +316,12 @@ public class Trampoline extends IBackupManager.Stub { } } + @Override + public long getAvailableRestoreToken(String packageName) { + BackupManagerService svc = mService; + return (svc != null) ? svc.getAvailableRestoreToken(packageName) : 0; + } + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);