| Index: components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BundleToPersistableBundleConverter.java
|
| diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BundleToPersistableBundleConverter.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BundleToPersistableBundleConverter.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1ae24f551593e28fb65f0b429c06aa39128dc10e
|
| --- /dev/null
|
| +++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BundleToPersistableBundleConverter.java
|
| @@ -0,0 +1,112 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.components.background_task_scheduler;
|
| +
|
| +import android.annotation.TargetApi;
|
| +import android.os.Build;
|
| +import android.os.Bundle;
|
| +import android.os.PersistableBundle;
|
| +import android.support.annotation.NonNull;
|
| +
|
| +import java.util.HashSet;
|
| +import java.util.Set;
|
| +
|
| +/**
|
| + * Converts from {@link Bundle} to {@link PersistableBundle}.
|
| + *
|
| + * The {@link android.app.job.JobScheduler} API requires the use of {@link PersistableBundle} in
|
| + * the {@link android.app.job.JobInfo}, but that was added in API 21 (Lollipop). A later change
|
| + * related to booleans means that this class required API 22 (Lollipop MR1).
|
| + * the API of the {@link BackgroundTaskScheduler} needs to take a {@link Bundle}, but convert it to
|
| + * a {@link PersistableBundle} in the case of using {@link android.app.job.JobScheduler} as the
|
| + * backend for scheduling.
|
| + */
|
| +@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
|
| +class BundleToPersistableBundleConverter {
|
| + /**
|
| + * A Result which contains the resulting {@link PersistableBundle} after a conversion, and also
|
| + * contains a set of all the failed keys.
|
| + */
|
| + static class Result {
|
| + @NonNull
|
| + private final PersistableBundle mBundle;
|
| + @NonNull
|
| + private final Set<String> mFailedKeys;
|
| +
|
| + private Result(@NonNull PersistableBundle bundle, @NonNull Set<String> failedKeys) {
|
| + mBundle = bundle;
|
| + mFailedKeys = failedKeys;
|
| + }
|
| +
|
| + boolean hasErrors() {
|
| + return mFailedKeys.size() > 0;
|
| + }
|
| +
|
| + @NonNull
|
| + PersistableBundle getPersistableBundle() {
|
| + return mBundle;
|
| + }
|
| +
|
| + @NonNull
|
| + Set<String> getFailedKeys() {
|
| + return mFailedKeys;
|
| + }
|
| +
|
| + String getFailedKeysErrorString() {
|
| + StringBuilder sb = new StringBuilder();
|
| + sb.append("{");
|
| + boolean first = true;
|
| + for (String key : mFailedKeys) {
|
| + if (!first) sb.append(", ");
|
| + first = false;
|
| +
|
| + sb.append(key);
|
| + }
|
| + sb.append("}");
|
| + return sb.toString();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Copy all entries in the {@link Bundle} that can be part of a {@link PersistableBundle}.
|
| + *
|
| + * @param bundle the {@link Bundle} to convert.
|
| + * @return a result object contain the resulting {@link PersistableBundle} and whether any of
|
| + * the keys failed.
|
| + */
|
| + static Result convert(Bundle bundle) {
|
| + PersistableBundle persistableBundle = new PersistableBundle();
|
| + Set<String> failedKeys = new HashSet<>();
|
| + for (String key : bundle.keySet()) {
|
| + Object obj = bundle.get(key);
|
| + if (obj == null) {
|
| + persistableBundle.putString(key, null);
|
| + } else if (obj instanceof Boolean) {
|
| + persistableBundle.putBoolean(key, (Boolean) obj);
|
| + } else if (obj instanceof boolean[]) {
|
| + persistableBundle.putBooleanArray(key, (boolean[]) obj);
|
| + } else if (obj instanceof Double) {
|
| + persistableBundle.putDouble(key, (Double) obj);
|
| + } else if (obj instanceof double[]) {
|
| + persistableBundle.putDoubleArray(key, (double[]) obj);
|
| + } else if (obj instanceof Integer) {
|
| + persistableBundle.putInt(key, (Integer) obj);
|
| + } else if (obj instanceof int[]) {
|
| + persistableBundle.putIntArray(key, (int[]) obj);
|
| + } else if (obj instanceof Long) {
|
| + persistableBundle.putLong(key, (Long) obj);
|
| + } else if (obj instanceof long[]) {
|
| + persistableBundle.putLongArray(key, (long[]) obj);
|
| + } else if (obj instanceof String) {
|
| + persistableBundle.putString(key, (String) obj);
|
| + } else if (obj instanceof String[]) {
|
| + persistableBundle.putStringArray(key, (String[]) obj);
|
| + } else {
|
| + failedKeys.add(key);
|
| + }
|
| + }
|
| + return new Result(persistableBundle, failedKeys);
|
| + }
|
| +}
|
|
|