Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2415)

Unified Diff: chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc

Issue 2277123002: [Offline pages] Hooking up cancel/pause/resume buttons for offline page related notifications (Closed)
Patch Set: Fixing tests Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698