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..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; |