summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-04-29 03:05:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-04-29 03:05:29 +0000
commit78a00503dbf555a7a49109f6ea14af1e341fc8bb (patch)
treefe2b3180e45ae23c34644d8875e2d63c1112a8e0
parent23a66d44ea23ae7c72cdd9907a7ad52dc4407b9d (diff)
parentee87b96ee572e7245cf7b791e30c51505a8ba2a2 (diff)
Merge "API: make "what's the quota?" an operation on the backup data sinks" into oc-dev
-rw-r--r--api/current.txt3
-rw-r--r--api/system-current.txt4
-rw-r--r--api/test-current.txt3
-rw-r--r--core/java/android/app/backup/BackupAgent.java37
-rw-r--r--core/java/android/app/backup/BackupDataOutput.java23
-rw-r--r--core/java/android/app/backup/FullBackupDataOutput.java22
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 */