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

Unified Diff: chrome/browser/android/download/download_manager_service.cc

Issue 2143303002: [Downloads] Expose basic download history to UI (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments Created 4 years, 5 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/download/download_manager_service.cc
diff --git a/chrome/browser/android/download/download_manager_service.cc b/chrome/browser/android/download/download_manager_service.cc
index 3c410a414ef7fe62c03ad89b921406593510e8ad..bf3129576ae73a7255b2216fac315887ea7ecb15 100644
--- a/chrome/browser/android/download/download_manager_service.cc
+++ b/chrome/browser/android/download/download_manager_service.cc
@@ -23,6 +23,16 @@ using base::android::JavaParamRef;
using base::android::ConvertJavaStringToUTF8;
using base::android::ConvertUTF8ToJavaString;
+namespace {
+
+bool ShouldShowDownloadItem(content::DownloadItem* item) {
+ return !item->IsTemporary() &&
+ !item->GetFileNameToReportUser().empty() &&
+ !item->GetTargetFilePath().empty();
+}
+
+} // namespace
+
// static
bool DownloadManagerService::RegisterDownloadManagerService(JNIEnv* env) {
return RegisterNativesImpl(env);
@@ -73,6 +83,63 @@ void DownloadManagerService::PauseDownload(
EnqueueDownloadAction(download_guid, PAUSE);
}
+void DownloadManagerService::GetAllDownloads(JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ if (is_history_query_complete_)
+ GetAllDownloadsInternal();
+ else
+ EnqueueDownloadAction(std::string(), INITIALIZE_UI);
+}
+
+void DownloadManagerService::GetAllDownloadsInternal() {
+ content::DownloadManager* manager = GetDownloadManager(false);
+ if (java_ref_.is_null() || !manager)
+ return;
+
+ content::DownloadManager::DownloadVector all_items;
+ manager->GetAllDownloads(&all_items);
+
+ // Determine how many items will be displayed.
+ int num_to_display = 0;
+ for (size_t i = 0; i < all_items.size(); i++) {
+ content::DownloadItem* item = all_items[i];
+ num_to_display += (ShouldShowDownloadItem(item) ? 1 : 0);
+ }
+
+ // Create a Java array of all of the visible DownloadItems.
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jclass> j_download_item_class = base::android::GetClass(
qinmin 2016/07/14 19:48:18 This looks a little worse than the previous patch,
gone 2016/07/14 20:22:58 No worries; I reverted most of it, but kept the fu
+ env, "org/chromium/chrome/browser/download/DownloadItem");
+ ScopedJavaLocalRef<jobjectArray> j_item_array(
+ env,
+ env->NewObjectArray(
+ num_to_display, j_download_item_class.obj(), nullptr));
+
+ for (size_t i = 0, index = 0; i < all_items.size(); i++) {
+ content::DownloadItem* item = all_items[i];
+ if (!ShouldShowDownloadItem(item))
+ continue;
+
+ ScopedJavaLocalRef<jobject> j_item =
+ Java_DownloadManagerService_createDownloadItem(
+ env,
+ java_ref_.obj(),
+ ConvertUTF8ToJavaString(env, item->GetGuid()).obj(),
+ ConvertUTF8ToJavaString(
+ env,
+ item->GetFileNameToReportUser().BaseName().value()).obj(),
+ ConvertUTF8ToJavaString(env, item->GetTabUrl().spec()).obj(),
+ ConvertUTF8ToJavaString(env, item->GetMimeType()).obj(),
+ item->GetStartTime().ToJavaTime(),
+ item->GetTotalBytes());
+ env->SetObjectArrayElement(j_item_array.obj(), index++, j_item.obj());
+ }
+
+ Java_DownloadManagerService_onAllDownloadsRetrieved(
+ env, java_ref_.obj(), j_item_array.obj());
+}
+
+
void DownloadManagerService::CancelDownload(
JNIEnv* env,
jobject obj,
@@ -114,6 +181,9 @@ void DownloadManagerService::OnHistoryQueryComplete() {
case CANCEL:
CancelDownloadInternal(download_guid, false);
break;
+ case INITIALIZE_UI:
+ GetAllDownloadsInternal();
qinmin 2016/07/14 19:48:18 Do you need to check whether user has closed the d
gone 2016/07/14 20:22:58 Should be fine: the Adapter is owned by the Downlo
+ break;
default:
NOTREACHED();
break;
@@ -188,6 +258,9 @@ void DownloadManagerService::EnqueueDownloadAction(
case CANCEL:
iter->second = action;
break;
+ case INITIALIZE_UI:
+ iter->second = action;
+ break;
default:
NOTREACHED();
break;

Powered by Google App Engine
This is Rietveld 408576698