Chromium Code Reviews| 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; |