summaryrefslogtreecommitdiff
path: root/apex/blobstore/framework
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2020-01-15 01:51:15 -0800
committerSudheer Shanka <sudheersai@google.com>2020-01-23 18:02:00 -0800
commitf6e23b96b5f289a4c6dd4884288e2eeb42713270 (patch)
treef95bdad240e1ee56d7e53191ada746a7cf24750b /apex/blobstore/framework
parent75b5b13c65f19a2905acfd9fab254ca1266021e3 (diff)
Persist committed blobs data and any pending sessions.
+ Implement BlobStoreManager.Session.getSize(). Bug: 143559646 Test: atest CtsBlobStoreHostTestCases Change-Id: I34f4ace1293f4d5acc85b61dfb14c1e78d55a611
Diffstat (limited to 'apex/blobstore/framework')
-rw-r--r--apex/blobstore/framework/java/android/app/blob/BlobHandle.java47
-rw-r--r--apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java23
-rw-r--r--apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl3
-rw-r--r--apex/blobstore/framework/java/android/app/blob/XmlTags.java55
4 files changed, 128 insertions, 0 deletions
diff --git a/apex/blobstore/framework/java/android/app/blob/BlobHandle.java b/apex/blobstore/framework/java/android/app/blob/BlobHandle.java
index 60c313683240..f7e6a987ded3 100644
--- a/apex/blobstore/framework/java/android/app/blob/BlobHandle.java
+++ b/apex/blobstore/framework/java/android/app/blob/BlobHandle.java
@@ -15,13 +15,26 @@
*/
package android.app.blob;
+import static android.app.blob.XmlTags.ATTR_ALGO;
+import static android.app.blob.XmlTags.ATTR_DIGEST;
+import static android.app.blob.XmlTags.ATTR_EXPIRY_TIME;
+import static android.app.blob.XmlTags.ATTR_LABEL;
+import static android.app.blob.XmlTags.ATTR_TAG;
+
import android.annotation.CurrentTimeMillisLong;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Base64;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
+import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;
@@ -41,17 +54,20 @@ public final class BlobHandle implements Parcelable {
* @hide
*/
@NonNull public final String algorithm;
+
/**
* Hash of the blob this handle is representing using {@link #algorithm}.
*
* @hide
*/
@NonNull public final byte[] digest;
+
/**
* Label of the blob that can be surfaced to the user.
* @hide
*/
@NonNull public final CharSequence label;
+
/**
* Time in milliseconds after which the blob should be invalidated and not
* allowed to be accessed by any other app, in {@link System#currentTimeMillis()} timebase.
@@ -59,6 +75,7 @@ public final class BlobHandle implements Parcelable {
* @hide
*/
@CurrentTimeMillisLong public final long expiryTimeMillis;
+
/**
* An opaque {@link String} associated with the blob.
*
@@ -197,6 +214,15 @@ public final class BlobHandle implements Parcelable {
return Objects.hash(algorithm, Arrays.hashCode(digest), label, expiryTimeMillis, tag);
}
+ /** @hide */
+ public void dump(IndentingPrintWriter fout) {
+ fout.println("algo: " + algorithm);
+ fout.println("digest: " + Base64.encodeToString(digest, Base64.NO_WRAP));
+ fout.println("label: " + label);
+ fout.println("expiryMs: " + expiryTimeMillis);
+ fout.println("tag: " + tag);
+ }
+
public static final @NonNull Creator<BlobHandle> CREATOR = new Creator<BlobHandle>() {
@Override
public @NonNull BlobHandle createFromParcel(@NonNull Parcel source) {
@@ -208,4 +234,25 @@ public final class BlobHandle implements Parcelable {
return new BlobHandle[size];
}
};
+
+ /** @hide */
+ public void writeToXml(@NonNull XmlSerializer out) throws IOException {
+ XmlUtils.writeStringAttribute(out, ATTR_ALGO, algorithm);
+ XmlUtils.writeByteArrayAttribute(out, ATTR_DIGEST, digest);
+ XmlUtils.writeStringAttribute(out, ATTR_LABEL, label);
+ XmlUtils.writeLongAttribute(out, ATTR_EXPIRY_TIME, expiryTimeMillis);
+ XmlUtils.writeStringAttribute(out, ATTR_TAG, tag);
+ }
+
+ /** @hide */
+ @NonNull
+ public static BlobHandle createFromXml(@NonNull XmlPullParser in) throws IOException {
+ final String algo = XmlUtils.readStringAttribute(in, ATTR_ALGO);
+ final byte[] digest = XmlUtils.readByteArrayAttribute(in, ATTR_DIGEST);
+ final CharSequence label = XmlUtils.readStringAttribute(in, ATTR_LABEL);
+ final long expiryTimeMs = XmlUtils.readLongAttribute(in, ATTR_EXPIRY_TIME);
+ final String tag = XmlUtils.readStringAttribute(in, ATTR_TAG);
+
+ return BlobHandle.create(algo, digest, label, expiryTimeMs, tag);
+ }
}
diff --git a/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java b/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java
index 00d9efbb1fcd..fe15ac50c5c4 100644
--- a/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java
+++ b/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java
@@ -25,13 +25,17 @@ import android.annotation.SystemService;
import android.content.Context;
import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
+import android.os.RemoteCallback;
import android.os.RemoteException;
import com.android.internal.util.function.pooled.PooledLambda;
import java.io.Closeable;
import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
/**
@@ -265,6 +269,25 @@ public class BlobStoreManager {
}
/**
+ * Wait until any pending tasks (like persisting data to disk) have finished.
+ *
+ * @hide
+ */
+ public void waitForIdle(long timeoutMillis) throws InterruptedException, TimeoutException {
+ try {
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
+ mService.waitForIdle(new RemoteCallback((result) -> countDownLatch.countDown()));
+ if (!countDownLatch.await(timeoutMillis, TimeUnit.MILLISECONDS)) {
+ throw new TimeoutException("Timed out waiting for service to become idle");
+ }
+ } catch (ParcelableException e) {
+ throw new RuntimeException(e);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Represents an ongoing session of a blob's contribution to the blob store managed by the
* system.
*
diff --git a/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl b/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl
index dfbf78f4009b..e2128b421746 100644
--- a/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl
+++ b/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl
@@ -17,6 +17,7 @@ package android.app.blob;
import android.app.blob.BlobHandle;
import android.app.blob.IBlobStoreSession;
+import android.os.RemoteCallback;
/** {@hide} */
interface IBlobStoreManager {
@@ -28,4 +29,6 @@ interface IBlobStoreManager {
void acquireLease(in BlobHandle handle, int descriptionResId, long leaseTimeout,
in String packageName);
void releaseLease(in BlobHandle handle, in String packageName);
+
+ void waitForIdle(in RemoteCallback callback);
} \ No newline at end of file
diff --git a/apex/blobstore/framework/java/android/app/blob/XmlTags.java b/apex/blobstore/framework/java/android/app/blob/XmlTags.java
new file mode 100644
index 000000000000..803c9a40e5ea
--- /dev/null
+++ b/apex/blobstore/framework/java/android/app/blob/XmlTags.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2020 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.blob;
+
+/** @hide */
+public final class XmlTags {
+ public static final String ATTR_VERSION = "v";
+
+ public static final String TAG_SESSIONS = "ss";
+ public static final String TAG_BLOBS = "bs";
+
+ // For BlobStoreSession
+ public static final String TAG_SESSION = "s";
+ public static final String ATTR_ID = "id";
+ public static final String ATTR_PACKAGE = "p";
+ public static final String ATTR_UID = "u";
+
+ // For BlobMetadata
+ public static final String TAG_BLOB = "b";
+ public static final String ATTR_USER_ID = "us";
+
+ // For BlobAccessMode
+ public static final String TAG_ACCESS_MODE = "am";
+ public static final String ATTR_TYPE = "t";
+ public static final String TAG_WHITELISTED_PACKAGE = "wl";
+ public static final String ATTR_CERTIFICATE = "ct";
+
+ // For BlobHandle
+ public static final String TAG_BLOB_HANDLE = "bh";
+ public static final String ATTR_ALGO = "al";
+ public static final String ATTR_DIGEST = "dg";
+ public static final String ATTR_LABEL = "lbl";
+ public static final String ATTR_EXPIRY_TIME = "ex";
+ public static final String ATTR_TAG = "tg";
+
+ // For committer
+ public static final String TAG_COMMITTER = "c";
+
+ // For leasee
+ public static final String TAG_LEASEE = "l";
+ public static final String ATTR_DESCRIPTION_RES_ID = "rid";
+}