summaryrefslogtreecommitdiff
path: root/chromium/components/offline_items_collection
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/components/offline_items_collection
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-chromium-85-based.tar.gz
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/components/offline_items_collection')
-rw-r--r--chromium/components/offline_items_collection/core/BUILD.gn28
-rw-r--r--chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java14
-rw-r--r--chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java3
-rw-r--r--chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java2
-rw-r--r--chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemSchedule.java37
-rw-r--r--chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java12
-rw-r--r--chromium/components/offline_items_collection/core/android/native_java_unittests/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridgeUnitTest.java45
-rw-r--r--chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc20
-rw-r--r--chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h7
-rw-r--r--chromium/components/offline_items_collection/core/android/offline_item_bridge.cc16
-rw-r--r--chromium/components/offline_items_collection/core/android/offline_item_bridge.h5
-rw-r--r--chromium/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc68
-rw-r--r--chromium/components/offline_items_collection/core/offline_content_aggregator.cc10
-rw-r--r--chromium/components/offline_items_collection/core/offline_content_aggregator.h2
-rw-r--r--chromium/components/offline_items_collection/core/offline_content_provider.h5
-rw-r--r--chromium/components/offline_items_collection/core/offline_item.cc29
-rw-r--r--chromium/components/offline_items_collection/core/offline_item.h26
-rw-r--r--chromium/components/offline_items_collection/core/offline_item_unittest.cc26
-rw-r--r--chromium/components/offline_items_collection/core/test_support/mock_offline_content_provider.h4
-rw-r--r--chromium/components/offline_items_collection/core/throttled_offline_content_provider.cc6
-rw-r--r--chromium/components/offline_items_collection/core/throttled_offline_content_provider.h2
21 files changed, 363 insertions, 4 deletions
diff --git a/chromium/components/offline_items_collection/core/BUILD.gn b/chromium/components/offline_items_collection/core/BUILD.gn
index 4901f2b63a1..2ed74b1b4ff 100644
--- a/chromium/components/offline_items_collection/core/BUILD.gn
+++ b/chromium/components/offline_items_collection/core/BUILD.gn
@@ -65,6 +65,7 @@ source_set("unit_tests") {
sources = [
"filtered_offline_item_observer_unittest.cc",
"offline_content_aggregator_unittest.cc",
+ "offline_item_unittest.cc",
"throttled_offline_content_provider_unittest.cc",
]
@@ -74,6 +75,14 @@ source_set("unit_tests") {
"//base/test:test_support",
"//components/offline_items_collection/core/test_support",
]
+
+ if (is_android) {
+ sources += [ "android/offline_item_bridge_unittest.cc" ]
+ deps += [
+ ":native_j_unittests_jni_headers",
+ ":native_java_unittests_java",
+ ]
+ }
}
if (is_android) {
@@ -84,6 +93,7 @@ if (is_android) {
"android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java",
"android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java",
"android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java",
+ "android/java/src/org/chromium/components/offline_items_collection/OfflineItemSchedule.java",
"android/java/src/org/chromium/components/offline_items_collection/OfflineItemShareInfo.java",
"android/java/src/org/chromium/components/offline_items_collection/OfflineItemVisuals.java",
"android/java/src/org/chromium/components/offline_items_collection/OpenParams.java",
@@ -129,4 +139,22 @@ if (is_android) {
"rename_result.h",
]
}
+
+ android_library("native_java_unittests_java") {
+ testonly = true
+ deps = [
+ ":core_java",
+ "//base:base_java",
+ "//third_party/junit",
+ ]
+
+ sources = [ "android/native_java_unittests/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridgeUnitTest.java" ]
+
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+ }
+
+ generate_jni("native_j_unittests_jni_headers") {
+ testonly = true
+ sources = [ "android/native_java_unittests/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridgeUnitTest.java" ]
+ }
}
diff --git a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
index 7606cb58f7d..cc8a4380f36 100644
--- a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
+++ b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
@@ -77,6 +77,17 @@ public class OfflineContentAggregatorBridge implements OfflineContentProvider {
}
@Override
+ public void changeSchedule(final ContentId id, final OfflineItemSchedule schedule) {
+ if (mNativeOfflineContentAggregatorBridge == 0) return;
+ boolean onlyOnWifi = (schedule == null) ? false : schedule.onlyOnWifi;
+ long startTimeMs = (schedule == null) ? -1 : schedule.startTimeMs;
+
+ OfflineContentAggregatorBridgeJni.get().changeSchedule(
+ mNativeOfflineContentAggregatorBridge, OfflineContentAggregatorBridge.this,
+ id.namespace, id.id, onlyOnWifi, startTimeMs);
+ }
+
+ @Override
public void getItemById(ContentId id, Callback<OfflineItem> callback) {
if (mNativeOfflineContentAggregatorBridge == 0) return;
OfflineContentAggregatorBridgeJni.get().getItemById(mNativeOfflineContentAggregatorBridge,
@@ -209,5 +220,8 @@ public class OfflineContentAggregatorBridge implements OfflineContentProvider {
void renameItem(long nativeOfflineContentAggregatorBridge,
OfflineContentAggregatorBridge caller, String nameSpace, String id, String name,
Callback</*RenameResult*/ Integer> callback);
+ void changeSchedule(long nativeOfflineContentAggregatorBridge,
+ OfflineContentAggregatorBridge caller, String nameSpace, String id,
+ boolean onlyOnWifi, long startTimeMs);
}
}
diff --git a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
index 1d33c464d53..6a2eb26a963 100644
--- a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
+++ b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
@@ -43,6 +43,9 @@ public interface OfflineContentProvider {
/** See OfflineContentProvider::ResumeDownload(...). */
void resumeDownload(ContentId id, boolean hasUserGesture);
+ /** See OfflineContentProvider::ChangeSchedule(...). */
+ void changeSchedule(final ContentId id, final OfflineItemSchedule schedule);
+
/** See OfflineContentProvider::GetItemById(...). */
void getItemById(ContentId id, Callback<OfflineItem> callback);
diff --git a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
index 4676ac2d926..8dcfdbe0509 100644
--- a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
+++ b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
@@ -107,6 +107,7 @@ public class OfflineItem implements Cloneable {
public int failState;
@PendingState
public int pendingState;
+ public OfflineItemSchedule schedule;
public OfflineItem() {
id = new ContentId();
@@ -146,6 +147,7 @@ public class OfflineItem implements Cloneable {
clone.timeRemainingMs = timeRemainingMs;
clone.failState = failState;
clone.pendingState = pendingState;
+ if (schedule != null) clone.schedule = schedule.clone();
if (progress != null) {
clone.progress = new Progress(progress.value, progress.max, progress.unit);
diff --git a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemSchedule.java b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemSchedule.java
new file mode 100644
index 00000000000..055c72e3774
--- /dev/null
+++ b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemSchedule.java
@@ -0,0 +1,37 @@
+// Copyright 2020 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.offline_items_collection;
+
+/**
+ * Java counter part of OfflineItemSchedule in native, see
+ * components/offline_items_collection/core/offline_item.h.
+ */
+public class OfflineItemSchedule {
+ /**
+ * Constructs a OfflineItemSchedule.
+ * @param onlyOnWifi See {@link #onlyOnWifi}.
+ * @param startTimeMs See {@link #startTimeMs}.
+ */
+ public OfflineItemSchedule(boolean onlyOnWifi, long startTimeMs) {
+ this.onlyOnWifi = onlyOnWifi;
+ this.startTimeMs = startTimeMs;
+ }
+
+ @Override
+ public OfflineItemSchedule clone() {
+ return new OfflineItemSchedule(onlyOnWifi, startTimeMs);
+ }
+
+ /**
+ * Whether the offline item will be downloaded only on WIFI.
+ */
+ public final boolean onlyOnWifi;
+
+ /**
+ * The trigger time to download the offline item. Will not triggered at particular time if the
+ * value is 0.
+ */
+ public final long startTimeMs;
+}
diff --git a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
index d46d7daa71b..9c290de88db 100644
--- a/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
+++ b/chromium/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
@@ -10,6 +10,7 @@ import org.chromium.components.offline_items_collection.FailState;
import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.OfflineItemFilter;
import org.chromium.components.offline_items_collection.OfflineItemProgressUnit;
+import org.chromium.components.offline_items_collection.OfflineItemSchedule;
import org.chromium.components.offline_items_collection.OfflineItemState;
import org.chromium.components.offline_items_collection.PendingState;
import org.chromium.components.offline_items_collection.UpdateDelta;
@@ -54,7 +55,8 @@ public final class OfflineItemBridge {
@FailState int failState, @PendingState int pendingState, boolean isResumable,
boolean allowMetered, long receivedBytes, long progressValue, long progressMax,
@OfflineItemProgressUnit int progressUnit, long timeRemainingMs, boolean isDangerous,
- boolean canRename, boolean ignoreVisuals, double contentQualityScore) {
+ boolean canRename, boolean ignoreVisuals, double contentQualityScore,
+ OfflineItemSchedule schedule) {
OfflineItem item = new OfflineItem();
item.id.namespace = nameSpace;
item.id.id = id;
@@ -89,6 +91,8 @@ public final class OfflineItemBridge {
item.canRename = canRename;
item.ignoreVisuals = ignoreVisuals;
item.contentQualityScore = contentQualityScore;
+ item.schedule = schedule;
+
if (list != null) list.add(item);
return item;
}
@@ -105,4 +109,10 @@ public final class OfflineItemBridge {
updateDelta.visualsChanged = visualsChanged;
return updateDelta;
}
+
+ @CalledByNative
+ private static OfflineItemSchedule createOfflineItemSchedule(
+ boolean onlyOnWifi, long startTimeMs) {
+ return new OfflineItemSchedule(onlyOnWifi, startTimeMs);
+ }
}
diff --git a/chromium/components/offline_items_collection/core/android/native_java_unittests/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridgeUnitTest.java b/chromium/components/offline_items_collection/core/android/native_java_unittests/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridgeUnitTest.java
new file mode 100644
index 00000000000..59cc533a08e
--- /dev/null
+++ b/chromium/components/offline_items_collection/core/android/native_java_unittests/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridgeUnitTest.java
@@ -0,0 +1,45 @@
+// Copyright 2020 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.offline_items_collection.bridges;
+
+import org.junit.Assert;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.components.offline_items_collection.FailState;
+import org.chromium.components.offline_items_collection.OfflineItem;
+import org.chromium.components.offline_items_collection.OfflineItemFilter;
+import org.chromium.components.offline_items_collection.OfflineItemState;
+import org.chromium.components.offline_items_collection.PendingState;
+
+/**
+ * Unit test to verify {@link OfflineItemBridge} can create {@link OfflineItem} correctly through
+ * JNI bridge from native. See native unit test:
+ * (components/offline_items_collection/core/android/offline_item_bridge_unittest.cc).
+ */
+public class OfflineItemBridgeUnitTest {
+ @CalledByNative
+ private OfflineItemBridgeUnitTest() {}
+
+ @CalledByNative
+ public void testCreateDefaultOfflineItem(OfflineItem item) {
+ // Verifies key fields for a default offline item.
+ Assert.assertNotNull(item);
+ Assert.assertEquals(OfflineItemFilter.OTHER, item.filter);
+ Assert.assertFalse(item.isTransient);
+ Assert.assertEquals(OfflineItemState.COMPLETE, item.state);
+ Assert.assertEquals(FailState.NO_FAILURE, item.failState);
+ Assert.assertEquals(PendingState.NOT_PENDING, item.pendingState);
+ Assert.assertNull(item.schedule);
+ }
+
+ @CalledByNative
+ public void testOfflineItemSchedule(
+ OfflineItem item, boolean expectedOnlyOnWifi, long expectedStartTime) {
+ Assert.assertNotNull(item);
+ Assert.assertNotNull(item.schedule);
+ Assert.assertEquals(expectedOnlyOnWifi, item.schedule.onlyOnWifi);
+ Assert.assertEquals(expectedStartTime, item.schedule.startTimeMs);
+ }
+} \ No newline at end of file
diff --git a/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc b/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
index 124d8a45796..45df4c4dd35 100644
--- a/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
+++ b/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
@@ -248,6 +248,26 @@ void OfflineContentAggregatorBridge::RenameItem(
std::move(callback));
}
+void OfflineContentAggregatorBridge::ChangeSchedule(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jobj,
+ const base::android::JavaParamRef<jstring>& j_namespace,
+ const base::android::JavaParamRef<jstring>& j_id,
+ jboolean j_only_on_wifi,
+ jlong j_start_time_ms) {
+ base::Optional<OfflineItemSchedule> schedule;
+ if (j_only_on_wifi)
+ schedule = base::make_optional<OfflineItemSchedule>(true, base::nullopt);
+ else if (j_start_time_ms > 0) {
+ schedule = base::make_optional<OfflineItemSchedule>(
+ false, base::Time::FromJavaTime(j_start_time_ms));
+ }
+
+ provider_->ChangeSchedule(JNI_OfflineContentAggregatorBridge_CreateContentId(
+ env, j_namespace, j_id),
+ std::move(schedule));
+}
+
void OfflineContentAggregatorBridge::OnItemsAdded(
const OfflineContentProvider::OfflineItemList& items) {
if (java_ref_.is_null())
diff --git a/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h b/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
index ac80a6a2109..ab61885c469 100644
--- a/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
+++ b/chromium/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
@@ -87,6 +87,13 @@ class OfflineContentAggregatorBridge : public OfflineContentProvider::Observer,
const base::android::JavaParamRef<jstring>& j_name,
const base::android::JavaParamRef<jobject>& j_callback);
+ void ChangeSchedule(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jobj,
+ const base::android::JavaParamRef<jstring>& j_namespace,
+ const base::android::JavaParamRef<jstring>& j_id,
+ jboolean j_only_on_wifi,
+ jlong j_start_time_ms);
+
private:
OfflineContentAggregatorBridge(OfflineContentAggregator* aggregator);
diff --git a/chromium/components/offline_items_collection/core/android/offline_item_bridge.cc b/chromium/components/offline_items_collection/core/android/offline_item_bridge.cc
index 6d1b7cf87ee..4b7d1be4bcb 100644
--- a/chromium/components/offline_items_collection/core/android/offline_item_bridge.cc
+++ b/chromium/components/offline_items_collection/core/android/offline_item_bridge.cc
@@ -46,7 +46,8 @@ JNI_OfflineItemBridge_createOfflineItemAndMaybeAddToList(
item.progress.value, item.progress.max.value_or(-1),
static_cast<jint>(item.progress.unit), item.time_remaining_ms,
item.is_dangerous, item.can_rename, item.ignore_visuals,
- item.content_quality_score);
+ item.content_quality_score,
+ OfflineItemBridge::CreateOfflineItemSchedule(env, item.schedule));
}
} // namespace
@@ -82,6 +83,19 @@ ScopedJavaLocalRef<jobject> OfflineItemBridge::CreateUpdateDelta(
update_delta.value().visuals_changed);
}
+// static
+ScopedJavaLocalRef<jobject> OfflineItemBridge::CreateOfflineItemSchedule(
+ JNIEnv* env,
+ const base::Optional<OfflineItemSchedule>& schedule) {
+ if (!schedule.has_value())
+ return ScopedJavaLocalRef<jobject>();
+
+ int64_t start_time_ms =
+ schedule->start_time.has_value() ? schedule->start_time->ToJavaTime() : 0;
+ return Java_OfflineItemBridge_createOfflineItemSchedule(
+ env, schedule->only_on_wifi, start_time_ms);
+}
+
OfflineItemBridge::OfflineItemBridge() = default;
} // namespace android
diff --git a/chromium/components/offline_items_collection/core/android/offline_item_bridge.h b/chromium/components/offline_items_collection/core/android/offline_item_bridge.h
index 9f1acc4cefd..84167113ebb 100644
--- a/chromium/components/offline_items_collection/core/android/offline_item_bridge.h
+++ b/chromium/components/offline_items_collection/core/android/offline_item_bridge.h
@@ -34,6 +34,11 @@ class OfflineItemBridge {
JNIEnv* env,
const base::Optional<UpdateDelta>& update_delta);
+ // Creates a Java OfflineItemSchedule.
+ static base::android::ScopedJavaLocalRef<jobject> CreateOfflineItemSchedule(
+ JNIEnv* env,
+ const base::Optional<OfflineItemSchedule>& schedule);
+
private:
OfflineItemBridge();
};
diff --git a/chromium/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc b/chromium/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc
new file mode 100644
index 00000000000..014dc64999e
--- /dev/null
+++ b/chromium/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc
@@ -0,0 +1,68 @@
+// Copyright 2020 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.
+
+#include "components/offline_items_collection/core/android/offline_item_bridge.h"
+
+#include "base/android/jni_android.h"
+#include "components/offline_items_collection/core/native_j_unittests_jni_headers/OfflineItemBridgeUnitTest_jni.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::android::AttachCurrentThread;
+
+namespace offline_items_collection {
+namespace android {
+namespace {
+
+// Tests the JNI bridge that creates Java OfflineItem.
+class OfflineItemBridgeTest : public ::testing::Test {
+ public:
+ OfflineItemBridgeTest()
+ : j_test_(
+ Java_OfflineItemBridgeUnitTest_Constructor(AttachCurrentThread())) {
+ }
+
+ const base::android::ScopedJavaGlobalRef<jobject>& j_test() {
+ return j_test_;
+ }
+
+ private:
+ base::android::ScopedJavaGlobalRef<jobject> j_test_;
+};
+
+// Verfies a default offline item can be created in Java.
+TEST_F(OfflineItemBridgeTest, CreateOfflineItem) {
+ OfflineItem item;
+ auto* env = AttachCurrentThread();
+ auto j_offline_item = OfflineItemBridge::CreateOfflineItem(env, item);
+ Java_OfflineItemBridgeUnitTest_testCreateDefaultOfflineItem(env, j_test(),
+ j_offline_item);
+}
+
+// Verifies OfflineItemSchedule can be plumbed to Java correctly.
+TEST_F(OfflineItemBridgeTest, OfflineItemSchedule) {
+ // OfflineItemSchedule only on wifi.
+ auto* env = AttachCurrentThread();
+ OfflineItem item;
+ item.schedule = base::make_optional<OfflineItemSchedule>(
+ true /*only_on_wifi*/, base::nullopt);
+ auto j_offline_item = OfflineItemBridge::CreateOfflineItem(env, item);
+ Java_OfflineItemBridgeUnitTest_testOfflineItemSchedule(
+ env, j_test(), j_offline_item, true /*only_on_wifi*/, 0);
+
+ // OfflineItemSchedule with specific start time.
+ auto start_time =
+ base::Time::FromDeltaSinceWindowsEpoch(base::TimeDelta::FromDays(1));
+ item.schedule = base::make_optional<OfflineItemSchedule>(
+ false /*only_on_wifi*/, start_time);
+ EXPECT_EQ(start_time, item.schedule->start_time);
+ EXPECT_FALSE(start_time.is_null());
+ j_offline_item = OfflineItemBridge::CreateOfflineItem(env, item);
+ Java_OfflineItemBridgeUnitTest_testOfflineItemSchedule(
+ env, j_test(), j_offline_item, false /*only_on_wifi*/,
+ start_time.ToJavaTime());
+}
+
+} // namespace
+} // namespace android
+} // namespace offline_items_collection
diff --git a/chromium/components/offline_items_collection/core/offline_content_aggregator.cc b/chromium/components/offline_items_collection/core/offline_content_aggregator.cc
index 7a9ae71bfeb..8c099bff9d5 100644
--- a/chromium/components/offline_items_collection/core/offline_content_aggregator.cc
+++ b/chromium/components/offline_items_collection/core/offline_content_aggregator.cc
@@ -234,6 +234,16 @@ void OfflineContentAggregator::RenameItem(const ContentId& id,
it->second->RenameItem(id, name, std::move(callback));
}
+void OfflineContentAggregator::ChangeSchedule(
+ const ContentId& id,
+ base::Optional<OfflineItemSchedule> schedule) {
+ auto it = providers_.find(id.name_space);
+ if (it == providers_.end())
+ return;
+
+ it->second->ChangeSchedule(id, std::move(schedule));
+}
+
void OfflineContentAggregator::AddObserver(
OfflineContentProvider::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chromium/components/offline_items_collection/core/offline_content_aggregator.h b/chromium/components/offline_items_collection/core/offline_content_aggregator.h
index cbf7d1f31e2..35bdd0da6ed 100644
--- a/chromium/components/offline_items_collection/core/offline_content_aggregator.h
+++ b/chromium/components/offline_items_collection/core/offline_content_aggregator.h
@@ -82,6 +82,8 @@ class OfflineContentAggregator : public OfflineContentProvider,
void RenameItem(const ContentId& id,
const std::string& name,
RenameCallback callback) override;
+ void ChangeSchedule(const ContentId& id,
+ base::Optional<OfflineItemSchedule> schedule) override;
void AddObserver(OfflineContentProvider::Observer* observer) override;
void RemoveObserver(OfflineContentProvider::Observer* observer) override;
diff --git a/chromium/components/offline_items_collection/core/offline_content_provider.h b/chromium/components/offline_items_collection/core/offline_content_provider.h
index 06f4cd0d342..81c0fca27ca 100644
--- a/chromium/components/offline_items_collection/core/offline_content_provider.h
+++ b/chromium/components/offline_items_collection/core/offline_content_provider.h
@@ -21,6 +21,7 @@ namespace offline_items_collection {
struct ContentId;
struct OfflineItem;
+struct OfflineItemSchedule;
struct OfflineItemShareInfo;
struct OfflineItemVisuals;
@@ -154,6 +155,10 @@ class OfflineContentProvider {
const std::string& name,
RenameCallback callback) = 0;
+ // Called to change when to start the OfflineItem represented by |id|.
+ virtual void ChangeSchedule(const ContentId& id,
+ base::Optional<OfflineItemSchedule> schedule) = 0;
+
// Adds an observer that should be notified of OfflineItem list modifications.
virtual void AddObserver(Observer* observer) = 0;
diff --git a/chromium/components/offline_items_collection/core/offline_item.cc b/chromium/components/offline_items_collection/core/offline_item.cc
index 69aa4154373..38428650855 100644
--- a/chromium/components/offline_items_collection/core/offline_item.cc
+++ b/chromium/components/offline_items_collection/core/offline_item.cc
@@ -4,8 +4,12 @@
#include "components/offline_items_collection/core/offline_item.h"
+#include <utility>
+
namespace offline_items_collection {
+// -----------------------------------------------------------------------------
+// ContentId.
ContentId::ContentId() = default;
ContentId::ContentId(const ContentId& other) = default;
@@ -26,6 +30,26 @@ bool ContentId::operator<(const ContentId& content_id) const {
std::tie(content_id.name_space, content_id.id);
}
+// -----------------------------------------------------------------------------
+// OfflineItemSchedule.
+OfflineItemSchedule::OfflineItemSchedule(bool only_on_wifi,
+ base::Optional<base::Time> start_time)
+ : only_on_wifi(only_on_wifi), start_time(std::move(start_time)) {}
+
+OfflineItemSchedule::OfflineItemSchedule(const OfflineItemSchedule& other) =
+ default;
+
+OfflineItemSchedule& OfflineItemSchedule::operator=(
+ const OfflineItemSchedule& other) = default;
+
+OfflineItemSchedule::~OfflineItemSchedule() = default;
+
+bool OfflineItemSchedule::operator==(const OfflineItemSchedule& other) const {
+ return only_on_wifi == other.only_on_wifi && start_time == other.start_time;
+}
+
+// -----------------------------------------------------------------------------
+// OfflineItem.
OfflineItem::Progress::Progress()
: value(0), unit(OfflineItemProgressUnit::BYTES) {}
@@ -62,6 +86,8 @@ OfflineItem::OfflineItem()
OfflineItem::OfflineItem(const OfflineItem& other) = default;
+OfflineItem& OfflineItem::operator=(const OfflineItem& other) = default;
+
OfflineItem::OfflineItem(const ContentId& id) : OfflineItem() {
this->id = id;
}
@@ -98,7 +124,8 @@ bool OfflineItem::operator==(const OfflineItem& offline_item) const {
received_bytes == offline_item.received_bytes &&
progress == offline_item.progress &&
time_remaining_ms == offline_item.time_remaining_ms &&
- is_dangerous == offline_item.is_dangerous;
+ is_dangerous == offline_item.is_dangerous &&
+ schedule == offline_item.schedule;
}
OfflineItemVisuals::OfflineItemVisuals() = default;
diff --git a/chromium/components/offline_items_collection/core/offline_item.h b/chromium/components/offline_items_collection/core/offline_item.h
index 42c5eb597ba..d5d46639438 100644
--- a/chromium/components/offline_items_collection/core/offline_item.h
+++ b/chromium/components/offline_items_collection/core/offline_item.h
@@ -42,6 +42,25 @@ struct ContentId {
bool operator<(const ContentId& content_id) const;
};
+// Contains all the information to schedule the download of the offline item.
+struct OfflineItemSchedule {
+ public:
+ OfflineItemSchedule(bool only_on_wifi, base::Optional<base::Time> start_time);
+
+ OfflineItemSchedule(const OfflineItemSchedule& other);
+ OfflineItemSchedule& operator=(const OfflineItemSchedule& other);
+ ~OfflineItemSchedule();
+
+ bool operator==(const OfflineItemSchedule& other) const;
+
+ // Whether the download should only happen on WIFI.
+ bool only_on_wifi;
+
+ // Time to start downloading the offline item. Will be ignored if
+ // |only_on_wifi_| is true.
+ base::Optional<base::Time> start_time;
+};
+
// A Java counterpart will be generated for this enum.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.offline_items_collection
enum class OfflineItemProgressUnit {
@@ -80,6 +99,8 @@ struct OfflineItem {
OfflineItem();
OfflineItem(const OfflineItem& other);
+ OfflineItem& operator=(const OfflineItem& other);
+
explicit OfflineItem(const ContentId& id);
~OfflineItem();
@@ -211,6 +232,9 @@ struct OfflineItem {
// Whether the download might be dangerous and will require additional
// validation from user.
bool is_dangerous;
+
+ // The criteria for when the offline item is likely to download.
+ base::Optional<OfflineItemSchedule> schedule;
};
// Implemented for test-only. See test_support/offline_item_test_support.cc.
@@ -261,4 +285,4 @@ struct OfflineItemShareInfo {
} // namespace offline_items_collection
-#endif // COMPONENTS_OFFLINE_ITEMS_COLLECTION_OFFLINE_ITEM_H_
+#endif // COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_OFFLINE_ITEM_H_
diff --git a/chromium/components/offline_items_collection/core/offline_item_unittest.cc b/chromium/components/offline_items_collection/core/offline_item_unittest.cc
new file mode 100644
index 00000000000..b099d714ac1
--- /dev/null
+++ b/chromium/components/offline_items_collection/core/offline_item_unittest.cc
@@ -0,0 +1,26 @@
+// Copyright 2020 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.
+
+#include "components/offline_items_collection/core/offline_item.h"
+
+#include "base/optional.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace offline_items_collection {
+namespace {
+
+TEST(OfflineItemTest, OfflineItemSchedule) {
+ OfflineItemSchedule schedule(true, base::nullopt);
+ EXPECT_TRUE(schedule.only_on_wifi);
+ EXPECT_FALSE(schedule.start_time.has_value());
+
+ base::Time time = base::Time::Now();
+ schedule = OfflineItemSchedule(false, time);
+ EXPECT_FALSE(schedule.only_on_wifi);
+ EXPECT_EQ(schedule.start_time, time);
+}
+
+} // namespace
+} // namespace offline_items_collection
diff --git a/chromium/components/offline_items_collection/core/test_support/mock_offline_content_provider.h b/chromium/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
index 748ce984ebf..682cc664489 100644
--- a/chromium/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
+++ b/chromium/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
@@ -60,6 +60,10 @@ class MockOfflineContentProvider : public OfflineContentProvider {
void RemoveObserver(Observer* observer) override;
MOCK_METHOD3(RenameItem,
void(const ContentId&, const std::string&, RenameCallback));
+ MOCK_METHOD(void,
+ ChangeSchedule,
+ (const ContentId&, base::Optional<OfflineItemSchedule>),
+ (override));
private:
base::ObserverList<Observer>::Unchecked observers_;
diff --git a/chromium/components/offline_items_collection/core/throttled_offline_content_provider.cc b/chromium/components/offline_items_collection/core/throttled_offline_content_provider.cc
index 1c11171990b..25c0dbbd841 100644
--- a/chromium/components/offline_items_collection/core/throttled_offline_content_provider.cc
+++ b/chromium/components/offline_items_collection/core/throttled_offline_content_provider.cc
@@ -113,6 +113,12 @@ void ThrottledOfflineContentProvider::RenameItem(const ContentId& id,
wrapped_provider_->RenameItem(id, name, std::move(callback));
}
+void ThrottledOfflineContentProvider::ChangeSchedule(
+ const ContentId& id,
+ base::Optional<OfflineItemSchedule> schedule) {
+ wrapped_provider_->ChangeSchedule(id, std::move(schedule));
+}
+
void ThrottledOfflineContentProvider::AddObserver(
OfflineContentProvider::Observer* observer) {
DCHECK(observer);
diff --git a/chromium/components/offline_items_collection/core/throttled_offline_content_provider.h b/chromium/components/offline_items_collection/core/throttled_offline_content_provider.h
index cde9afcce30..76ee06b9eb6 100644
--- a/chromium/components/offline_items_collection/core/throttled_offline_content_provider.h
+++ b/chromium/components/offline_items_collection/core/throttled_offline_content_provider.h
@@ -53,6 +53,8 @@ class ThrottledOfflineContentProvider
void RenameItem(const ContentId& id,
const std::string& name,
RenameCallback callback) override;
+ void ChangeSchedule(const ContentId& id,
+ base::Optional<OfflineItemSchedule> schedule) override;
void AddObserver(OfflineContentProvider::Observer* observer) override;
void RemoveObserver(OfflineContentProvider::Observer* observer) override;