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..bdb17c703dd09eabab18cf41b02ddd16cc460460 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" |
| @@ -60,14 +66,65 @@ ScopedJavaLocalRef<jobject> ToJavaOfflinePageDownloadItem( |
| ConvertUTF8ToJavaString(env, item.target_path.value()), |
| item.start_time.ToJavaTime(), item.total_bytes); |
| } |
| + |
| +std::vector<int64_t> FilterRequestsByGuid( |
| + const std::vector<SavePageRequest>& requests, |
| + const std::string& guid) { |
| + std::vector<int64_t> request_ids; |
| + for (const SavePageRequest& request : requests) { |
| + if (request.client_id().id == guid && |
| + (request.client_id().name_space == kDownloadNamespace || |
| + request.client_id().name_space == kAsyncNamespace)) { |
|
Pete Williamson
2016/08/25 18:30:41
Like DewittJ suggested elsewhere, should we have a
fgorski
2016/08/25 18:51:34
Correct.
crbug.com/641053
|
| + request_ids.push_back(request.request_id()); |
| + } |
| + } |
| + return request_ids; |
| +} |
| + |
| +void CancelRequestCallback(const RequestQueue::UpdateMultipleRequestResults&) { |
| + // Results ignored here, as UI uses observer to update itself. |
| +} |
| + |
| +void CancelRequestsContinuation(content::BrowserContext* browser_context, |
| + const std::string& guid, |
| + const std::vector<SavePageRequest>& requests) { |
| + RequestCoordinator* coordinator = |
| + RequestCoordinatorFactory::GetForBrowserContext(browser_context); |
| + if (coordinator) { |
| + std::vector<int64_t> request_ids = FilterRequestsByGuid(requests, guid); |
| + coordinator->RemoveRequests(request_ids, |
| + base::Bind(&CancelRequestCallback)); |
| + } |
| +} |
| + |
| +void PauseRequestsContinuation(content::BrowserContext* browser_context, |
| + const std::string& guid, |
|
Pete Williamson
2016/08/25 18:30:41
nit - indentation off
fgorski
2016/08/25 18:51:34
Done.
|
| + const std::vector<SavePageRequest>& requests) { |
| + RequestCoordinator* coordinator = |
| + RequestCoordinatorFactory::GetForBrowserContext(browser_context); |
| + if (coordinator) |
| + coordinator->PauseRequests(FilterRequestsByGuid(requests, guid)); |
| +} |
| + |
| +void ResumeRequestsContinuation(content::BrowserContext* browser_context, |
| + const std::string& guid, |
| + const std::vector<SavePageRequest>& requests) { |
| + RequestCoordinator* coordinator = |
| + RequestCoordinatorFactory::GetForBrowserContext(browser_context); |
| + if (coordinator) |
| + coordinator->ResumeRequests(FilterRequestsByGuid(requests, guid)); |
| +} |
| + |
| } // 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 +207,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 +231,48 @@ 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_); |
| + |
| + if (request_coordinator) { |
|
Pete Williamson
2016/08/25 18:30:41
Should we log a warning if RC is not found? (Here
fgorski
2016/08/25 18:51:34
Done.
|
| + request_coordinator->GetAllRequests( |
| + base::Bind(&CancelRequestsContinuation, browser_context_, guid)); |
| + } |
| +} |
| + |
| +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_); |
| + |
| + if (request_coordinator) { |
| + request_coordinator->GetAllRequests( |
| + base::Bind(&PauseRequestsContinuation, browser_context_, guid)); |
| + } |
| +} |
| + |
| +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_); |
| + |
| + if (request_coordinator) { |
| + request_coordinator->GetAllRequests( |
| + base::Bind(&ResumeRequestsContinuation, browser_context_, guid)); |
| + } |
| +} |
| + |
| void OfflinePageDownloadBridge::ItemsLoaded() { |
| JNIEnv* env = AttachCurrentThread(); |
| ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env); |
| @@ -212,15 +311,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 |