Chromium Code Reviews| Index: chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc |
| diff --git a/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc b/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc |
| index ce4eaa611c9d91bd407b31222c7ae182d1b31c72..3c0a42efb3eb9008d9f7226b0b028a3761da5445 100644 |
| --- a/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc |
| +++ b/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc |
| @@ -7,17 +7,23 @@ |
| #include <vector> |
| #include "base/android/jni_string.h" |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| #include "base/guid.h" |
| +#include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "chrome/browser/android/offline_pages/downloads/offline_page_notification_bridge.h" |
| #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" |
| #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
| +#include "chrome/browser/android/offline_pages/request_coordinator_factory.h" |
| #include "chrome/browser/android/tab_android.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_android.h" |
| +#include "components/offline_pages/background/request_coordinator.h" |
| #include "components/offline_pages/client_namespace_constants.h" |
| #include "components/offline_pages/downloads/download_ui_item.h" |
| #include "components/offline_pages/offline_page_model.h" |
| +#include "content/public/browser/browser_context.h" |
| #include "content/public/browser/web_contents.h" |
| #include "jni/OfflinePageDownloadBridge_jni.h" |
| #include "net/base/filename_util.h" |
| @@ -36,6 +42,9 @@ namespace android { |
| namespace { |
| +using RequestContinuationCallback = |
| + base::Callback<void(const std::vector<int64_t>&)>; |
| + |
| void ToJavaOfflinePageDownloadItemList( |
| JNIEnv* env, |
| jobject j_result_obj, |
| @@ -60,14 +69,50 @@ ScopedJavaLocalRef<jobject> ToJavaOfflinePageDownloadItem( |
| ConvertUTF8ToJavaString(env, item.target_path.value()), |
| item.start_time.ToJavaTime(), item.total_bytes); |
| } |
| + |
| +void FilterRequestsByGuid(const std::string& guid, |
| + const RequestContinuationCallback& callback, |
|
dewittj
2016/08/25 17:26:57
Using a callback here is fancy but maybe less read
fgorski
2016/08/25 18:09:01
Done.
|
| + const std::vector<SavePageRequest>& requests) { |
| + std::vector<int64_t> request_ids; |
| + for (const SavePageRequest& request : requests) { |
| + if (request.client_id().id == guid && |
| + (request.client_id().name_space == kDownloadNamespace || |
|
dewittj
2016/08/25 17:26:57
Any chance you can make a function NamespaceIsUsed
fgorski
2016/08/25 18:09:01
Good idea, but I'd rather have it in separate patc
|
| + request.client_id().name_space == kAsyncNamespace)) { |
| + request_ids.push_back(request.request_id()); |
| + } |
| + } |
| + callback.Run(request_ids); |
| +} |
| + |
| +void CancelRequestCallback(const RequestQueue::UpdateMultipleRequestResults&) { |
| + // Results ignored here, as UI uses observer to update itself. |
| +} |
| + |
| +void CancelRequestsContinuation(RequestCoordinator* coordinator, |
|
dewittj
2016/08/25 17:26:57
As we discussed offline, I'd recommend passing a B
fgorski
2016/08/25 18:09:01
Done.
|
| + const std::vector<int64_t>& request_ids) { |
| + coordinator->RemoveRequests(request_ids, base::Bind(&CancelRequestCallback)); |
| +} |
| + |
| +void PauseRequestsContinuation(RequestCoordinator* coordinator, |
| + const std::vector<int64_t>& request_ids) { |
| + coordinator->PauseRequests(request_ids); |
| +} |
| + |
| +void ResumeRequestsContinuation(RequestCoordinator* coordinator, |
| + const std::vector<int64_t>& request_ids) { |
| + coordinator->ResumeRequests(request_ids); |
| +} |
| + |
| } // namespace |
| OfflinePageDownloadBridge::OfflinePageDownloadBridge( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| - DownloadUIAdapter* download_ui_adapter) |
| + DownloadUIAdapter* download_ui_adapter, |
| + content::BrowserContext* browser_context) |
| : weak_java_ref_(env, obj), |
| - download_ui_adapter_(download_ui_adapter) { |
| + download_ui_adapter_(download_ui_adapter), |
| + browser_context_(browser_context) { |
| DCHECK(download_ui_adapter_); |
| download_ui_adapter_->AddObserver(this); |
| } |
| @@ -150,7 +195,7 @@ void OfflinePageDownloadBridge::StartDownload( |
| offline_pages::OfflinePageModel* offline_page_model = |
| OfflinePageModelFactory::GetForBrowserContext( |
| - tab->GetProfile()->GetOriginalProfile()); |
| + tab->GetProfile()->GetOriginalProfile()); |
| if (!offline_page_model) |
| return; |
| @@ -174,6 +219,45 @@ void OfflinePageDownloadBridge::StartDownload( |
| base::Bind(&OfflinePageDownloadBridge::SavePageCallback, item)); |
| } |
| +void OfflinePageDownloadBridge::CancelDownload( |
| + JNIEnv* env, |
| + const JavaParamRef<jobject>& obj, |
| + const JavaParamRef<jstring>& j_guid) { |
| + std::string guid = ConvertJavaStringToUTF8(env, j_guid); |
| + RequestCoordinator* request_coordinator = |
| + RequestCoordinatorFactory::GetForBrowserContext(browser_context_); |
| + |
| + request_coordinator->GetAllRequests( |
| + base::Bind(&FilterRequestsByGuid, guid, |
| + base::Bind(&CancelRequestsContinuation, request_coordinator))); |
| +} |
| + |
| +void OfflinePageDownloadBridge::PauseDownload( |
| + JNIEnv* env, |
| + const JavaParamRef<jobject>& obj, |
| + const JavaParamRef<jstring>& j_guid) { |
| + std::string guid = ConvertJavaStringToUTF8(env, j_guid); |
| + RequestCoordinator* request_coordinator = |
| + RequestCoordinatorFactory::GetForBrowserContext(browser_context_); |
| + |
| + request_coordinator->GetAllRequests( |
| + base::Bind(&FilterRequestsByGuid, guid, |
| + base::Bind(&PauseRequestsContinuation, request_coordinator))); |
| +} |
| + |
| +void OfflinePageDownloadBridge::ResumeDownload( |
| + JNIEnv* env, |
| + const JavaParamRef<jobject>& obj, |
| + const JavaParamRef<jstring>& j_guid) { |
| + std::string guid = ConvertJavaStringToUTF8(env, j_guid); |
| + RequestCoordinator* request_coordinator = |
| + RequestCoordinatorFactory::GetForBrowserContext(browser_context_); |
| + |
| + request_coordinator->GetAllRequests( |
| + base::Bind(&FilterRequestsByGuid, guid, |
| + base::Bind(&ResumeRequestsContinuation, request_coordinator))); |
| +} |
| + |
| void OfflinePageDownloadBridge::ItemsLoaded() { |
| JNIEnv* env = AttachCurrentThread(); |
| ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env); |
| @@ -212,15 +296,17 @@ void OfflinePageDownloadBridge::ItemUpdated(const DownloadUIItem& item) { |
| static jlong Init(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jobject>& j_profile) { |
| - Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); |
| + content::BrowserContext* browser_context = |
| + ProfileAndroid::FromProfileAndroid(j_profile); |
| + |
| OfflinePageModel* offline_page_model = |
| - OfflinePageModelFactory::GetForBrowserContext(profile); |
| + OfflinePageModelFactory::GetForBrowserContext(browser_context); |
| DownloadUIAdapter* adapter = |
| DownloadUIAdapter::FromOfflinePageModel(offline_page_model); |
| return reinterpret_cast<jlong>( |
| - new OfflinePageDownloadBridge(env, obj, adapter)); |
| + new OfflinePageDownloadBridge(env, obj, adapter, browser_context)); |
| } |
| } // namespace android |