diff options
| author | 2017-04-29 03:05:25 +0000 | |
|---|---|---|
| committer | 2017-04-29 03:05:29 +0000 | |
| commit | 78a00503dbf555a7a49109f6ea14af1e341fc8bb (patch) | |
| tree | fe2b3180e45ae23c34644d8875e2d63c1112a8e0 | |
| parent | 23a66d44ea23ae7c72cdd9907a7ad52dc4407b9d (diff) | |
| parent | ee87b96ee572e7245cf7b791e30c51505a8ba2a2 (diff) | |
Merge "API: make "what's the quota?" an operation on the backup data sinks" into oc-dev
| -rw-r--r-- | api/current.txt | 3 | ||||
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | api/test-current.txt | 3 | ||||
| -rw-r--r-- | core/java/android/app/backup/BackupAgent.java | 37 | ||||
| -rw-r--r-- | core/java/android/app/backup/BackupDataOutput.java | 23 | ||||
| -rw-r--r-- | core/java/android/app/backup/FullBackupDataOutput.java | 22 |
6 files changed, 52 insertions, 40 deletions
diff --git a/api/current.txt b/api/current.txt index eb587df45e21..221f18814502 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6703,7 +6703,6 @@ package android.app.backup { public abstract class BackupAgent extends android.content.ContextWrapper { ctor public BackupAgent(); method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput); - method public long getBackupQuota(); method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException; method public void onCreate(); method public void onDestroy(); @@ -6738,6 +6737,7 @@ package android.app.backup { } public class BackupDataOutput { + method public long getQuota(); method public int writeEntityData(byte[], int) throws java.io.IOException; method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException; } @@ -6766,6 +6766,7 @@ package android.app.backup { } public class FullBackupDataOutput { + method public long getQuota(); } public abstract class RestoreObserver { diff --git a/api/system-current.txt b/api/system-current.txt index 260780eaf7e5..84f8b55b8730 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6952,7 +6952,6 @@ package android.app.backup { public abstract class BackupAgent extends android.content.ContextWrapper { ctor public BackupAgent(); method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput); - method public long getBackupQuota(); method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException; method public void onCreate(); method public void onDestroy(); @@ -6989,6 +6988,8 @@ package android.app.backup { public class BackupDataOutput { ctor public BackupDataOutput(java.io.FileDescriptor); + ctor public BackupDataOutput(java.io.FileDescriptor, long); + method public long getQuota(); method public int writeEntityData(byte[], int) throws java.io.IOException; method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException; } @@ -7165,6 +7166,7 @@ package android.app.backup { } public class FullBackupDataOutput { + method public long getQuota(); } public class RestoreDescription implements android.os.Parcelable { diff --git a/api/test-current.txt b/api/test-current.txt index 4f06bd68ee07..6d6abeccd362 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -6733,7 +6733,6 @@ package android.app.backup { public abstract class BackupAgent extends android.content.ContextWrapper { ctor public BackupAgent(); method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput); - method public long getBackupQuota(); method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException; method public void onCreate(); method public void onDestroy(); @@ -6768,6 +6767,7 @@ package android.app.backup { } public class BackupDataOutput { + method public long getQuota(); method public int writeEntityData(byte[], int) throws java.io.IOException; method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException; } @@ -6796,6 +6796,7 @@ package android.app.backup { } public class FullBackupDataOutput { + method public long getQuota(); } public abstract class RestoreObserver { diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index 11636a5a7c0c..5f92af9fb8da 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -133,8 +133,6 @@ public abstract class BackupAgent extends ContextWrapper { Handler mHandler = null; - private long mBackupQuotaBytes = -1; - Handler getHandler() { if (mHandler == null) { mHandler = new Handler(Looper.getMainLooper()); @@ -186,21 +184,6 @@ public abstract class BackupAgent extends ContextWrapper { } /** - * Returns the quota in bytes for the currently requested backup operation. The value can - * vary for each operation depending on the type of backup being done. - * - * <p>Can be called only from {@link BackupAgent#onFullBackup(FullBackupDataOutput)} or - * {@link BackupAgent#onBackup(ParcelFileDescriptor, BackupDataOutput, ParcelFileDescriptor)}. - */ - public long getBackupQuota() { - if (mBackupQuotaBytes < 0) { - throw new IllegalStateException( - "Backup quota is available only during backup operations."); - } - return mBackupQuotaBytes; - } - - /** * The application is being asked to write any data changed since the last * time it performed a backup operation. The state data recorded during the * last backup pass is provided in the <code>oldState</code> file @@ -918,10 +901,8 @@ public abstract class BackupAgent extends ContextWrapper { // Ensure that we're running with the app's normal permission level long ident = Binder.clearCallingIdentity(); - mBackupQuotaBytes = quotaBytes; - if (DEBUG) Log.v(TAG, "doBackup() invoked"); - BackupDataOutput output = new BackupDataOutput(data.getFileDescriptor()); + BackupDataOutput output = new BackupDataOutput(data.getFileDescriptor(), quotaBytes); try { BackupAgent.this.onBackup(oldState, output, newState); @@ -937,9 +918,6 @@ public abstract class BackupAgent extends ContextWrapper { // guarantee themselves). waitForSharedPrefs(); - // Unset quota after onBackup is done. - mBackupQuotaBytes = -1; - Binder.restoreCallingIdentity(ident); try { callbackBinder.opComplete(token, 0); @@ -997,8 +975,6 @@ public abstract class BackupAgent extends ContextWrapper { // Ensure that we're running with the app's normal permission level long ident = Binder.clearCallingIdentity(); - mBackupQuotaBytes = quotaBytes; - if (DEBUG) Log.v(TAG, "doFullBackup() invoked"); // Ensure that any SharedPreferences writes have landed *before* @@ -1006,7 +982,7 @@ public abstract class BackupAgent extends ContextWrapper { waitForSharedPrefs(); try { - BackupAgent.this.onFullBackup(new FullBackupDataOutput(data)); + BackupAgent.this.onFullBackup(new FullBackupDataOutput(data, quotaBytes)); } catch (IOException ex) { Log.d(TAG, "onFullBackup (" + BackupAgent.this.getClass().getName() + ") threw", ex); throw new RuntimeException(ex); @@ -1017,9 +993,6 @@ public abstract class BackupAgent extends ContextWrapper { // ... and then again after, as in the doBackup() case waitForSharedPrefs(); - // Unset quota after onFullBackup is done. - mBackupQuotaBytes = -1; - // Send the EOD marker indicating that there is no more data // forthcoming from this agent. try { @@ -1046,9 +1019,7 @@ public abstract class BackupAgent extends ContextWrapper { public void doMeasureFullBackup(long quotaBytes, int token, IBackupManager callbackBinder) { // Ensure that we're running with the app's normal permission level final long ident = Binder.clearCallingIdentity(); - FullBackupDataOutput measureOutput = new FullBackupDataOutput(); - - mBackupQuotaBytes = quotaBytes; + FullBackupDataOutput measureOutput = new FullBackupDataOutput(quotaBytes); waitForSharedPrefs(); try { @@ -1060,8 +1031,6 @@ public abstract class BackupAgent extends ContextWrapper { Log.d(TAG, "onFullBackup[M] (" + BackupAgent.this.getClass().getName() + ") threw", ex); throw ex; } finally { - // Unset quota after onFullBackup is done. - mBackupQuotaBytes = -1; Binder.restoreCallingIdentity(ident); try { callbackBinder.opComplete(token, measureOutput.getSize()); diff --git a/core/java/android/app/backup/BackupDataOutput.java b/core/java/android/app/backup/BackupDataOutput.java index 1fe63e7ec30f..c7586a299dd8 100644 --- a/core/java/android/app/backup/BackupDataOutput.java +++ b/core/java/android/app/backup/BackupDataOutput.java @@ -62,12 +62,23 @@ import java.io.IOException; * @see BackupAgent */ public class BackupDataOutput { + final long mQuota; long mBackupWriter; - /** @hide */ + /** + * Construct a BackupDataOutput purely for data-stream manipulation. This instance will + * not report usable quota information. + * @hide */ @SystemApi public BackupDataOutput(FileDescriptor fd) { + this(fd, -1); + } + + /** @hide */ + @SystemApi + public BackupDataOutput(FileDescriptor fd, long quota) { if (fd == null) throw new NullPointerException(); + mQuota = quota; mBackupWriter = ctor(fd); if (mBackupWriter == 0) { throw new RuntimeException("Native initialization failed with fd=" + fd); @@ -75,6 +86,16 @@ public class BackupDataOutput { } /** + * Returns the quota in bytes for the application's current backup operation. The + * value can vary for each operation. + * + * @see FullBackupDataOutput#getQuota() + */ + public long getQuota() { + return mQuota; + } + + /** * Mark the beginning of one record in the backup data stream. This must be called before * {@link #writeEntityData}. * @param key A string key that uniquely identifies the data record within the application. diff --git a/core/java/android/app/backup/FullBackupDataOutput.java b/core/java/android/app/backup/FullBackupDataOutput.java index 94704b95da7b..5deedd035d0b 100644 --- a/core/java/android/app/backup/FullBackupDataOutput.java +++ b/core/java/android/app/backup/FullBackupDataOutput.java @@ -10,17 +10,35 @@ import android.os.ParcelFileDescriptor; public class FullBackupDataOutput { // Currently a name-scoping shim around BackupDataOutput private final BackupDataOutput mData; + private final long mQuota; private long mSize; + /** + * Returns the quota in bytes for the application's current backup operation. The + * value can vary for each operation. + * + * @see BackupDataOutput#getQuota() + */ + public long getQuota() { + return mQuota; + } + /** @hide - used only in measure operation */ - public FullBackupDataOutput() { + public FullBackupDataOutput(long quota) { mData = null; + mQuota = quota; mSize = 0; } /** @hide */ + public FullBackupDataOutput(ParcelFileDescriptor fd, long quota) { + mData = new BackupDataOutput(fd.getFileDescriptor(), quota); + mQuota = quota; + } + + /** @hide - used only internally to the backup manager service's stream construction */ public FullBackupDataOutput(ParcelFileDescriptor fd) { - mData = new BackupDataOutput(fd.getFileDescriptor()); + this(fd, -1); } /** @hide */ |