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