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..177047ec791e5d49ed239941daff291394b66fb9 100644 |
--- a/chrome/browser/android/download/download_manager_service.cc |
+++ b/chrome/browser/android/download/download_manager_service.cc |
@@ -23,6 +23,8 @@ using base::android::JavaParamRef; |
using base::android::ConvertJavaStringToUTF8; |
using base::android::ConvertUTF8ToJavaString; |
+using DownloadVector = content::DownloadManager::DownloadVector; |
+ |
// static |
bool DownloadManagerService::RegisterDownloadManagerService(JNIEnv* env) { |
return RegisterNativesImpl(env); |
@@ -73,6 +75,56 @@ 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; |
+ |
+ DownloadVector all_items; |
+ manager->GetAllDownloads(&all_items); |
+ |
+ // Create a list in Java-land and then add information about all the |
+ // downloads to it. |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
qinmin
2016/07/14 17:08:05
Since we always call onAllDownloadsRetrieved, can
gone
2016/07/14 17:11:08
This is actually what the DownloadsBridge does, so
qinmin
2016/07/14 18:06:54
You can call a jni call to pack the fields into a
Ian Wen
2016/07/14 18:16:26
Aha! I found a trick that BookmarkBridge did to si
gone
2016/07/14 19:11:56
Changed it around to create the jobjectarray like
|
+ ScopedJavaLocalRef<jobject> jdownload_item_list = |
+ Java_DownloadManagerService_createDownloadItemList( |
+ env, java_ref_.obj()); |
+ |
+ for (size_t i = 0; i < all_items.size(); i++) { |
+ content::DownloadItem* item = all_items[i]; |
+ if (item->IsTemporary() || |
+ item->GetFileNameToReportUser().empty() || |
+ item->GetTargetFilePath().empty()) { |
+ continue; |
+ } |
+ |
+ Java_DownloadManagerService_addItemToDownloadItemList( |
+ env, |
+ java_ref_.obj(), |
+ jdownload_item_list.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()); |
+ } |
+ |
+ Java_DownloadManagerService_onAllDownloadsRetrieved( |
+ env, java_ref_.obj(), jdownload_item_list.obj()); |
+} |
+ |
+ |
void DownloadManagerService::CancelDownload( |
JNIEnv* env, |
jobject obj, |
@@ -114,6 +166,9 @@ void DownloadManagerService::OnHistoryQueryComplete() { |
case CANCEL: |
CancelDownloadInternal(download_guid, false); |
break; |
+ case INITIALIZE_UI: |
+ GetAllDownloadsInternal(); |
+ break; |
default: |
NOTREACHED(); |
break; |
@@ -188,6 +243,9 @@ void DownloadManagerService::EnqueueDownloadAction( |
case CANCEL: |
iter->second = action; |
break; |
+ case INITIALIZE_UI: |
+ iter->second = action; |
+ break; |
default: |
NOTREACHED(); |
break; |