diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/components/offline_items_collection | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-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')
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; |