| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/download/android/download_utils.h" |
| |
| #include <utility> |
| |
| #include "base/android/jni_string.h" |
| #include "base/metrics/field_trial_params.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "chrome/browser/download/android/jni_headers/MimeUtils_jni.h" |
| #include "chrome/browser/download/offline_item_utils.h" |
| #include "chrome/browser/flags/android/chrome_feature_list.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/download/public/common/download_utils.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/download_item_utils.h" |
| #include "content/public/browser/download_manager.h" |
| #include "content/public/browser/download_manager_delegate.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "url/gurl.h" |
| |
| // Must come after other headers because it uses |
| // offline_items_collection::FailState. |
| #include "chrome/android/chrome_jni_headers/DownloadUtils_jni.h" |
| |
| using base::android::JavaParamRef; |
| using base::android::ScopedJavaLocalRef; |
| |
| namespace { |
| // If received bytes is more than the size limit and resumption will restart |
| // from the beginning, throttle it. |
| int kDefaultAutoResumptionSizeLimit = 10 * 1024 * 1024; // 10 MB |
| } // namespace |
| |
| static jint JNI_DownloadUtils_GetResumeMode( |
| JNIEnv* env, |
| std::string& url, |
| offline_items_collection::FailState failState) { |
| auto reason = |
| OfflineItemUtils::ConvertFailStateToDownloadInterruptReason(failState); |
| return static_cast<jint>(download::GetDownloadResumeMode( |
| GURL(std::move(url)), reason, false /* restart_required */, |
| true /* user_action_required */)); |
| } |
| |
| static jboolean JNI_DownloadUtils_IsDownloadRestrictedByPolicy( |
| JNIEnv* env, |
| Profile* profile) { |
| content::DownloadManager* manager = profile->GetDownloadManager(); |
| if (manager) { |
| return manager->GetDelegate()->IsDownloadRestrictedByPolicy(); |
| } |
| return false; |
| } |
| |
| // static |
| base::FilePath DownloadUtils::GetUriStringForPath( |
| const base::FilePath& file_path) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| auto uri_string = |
| Java_DownloadUtils_getUriStringForPath(env, file_path.AsUTF8Unsafe()); |
| return base::FilePath(uri_string); |
| } |
| |
| // static |
| int DownloadUtils::GetAutoResumptionSizeLimit() { |
| return kDefaultAutoResumptionSizeLimit; |
| } |
| |
| // static |
| void DownloadUtils::OpenDownload(download::DownloadItem* item, |
| DownloadOpenSource open_source) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| content::BrowserContext* browser_context = |
| content::DownloadItemUtils::GetBrowserContext(item); |
| std::string original_url = item->GetOriginalUrl().SchemeIs(url::kDataScheme) |
| ? std::string() |
| : item->GetOriginalUrl().spec(); |
| base::android::ScopedJavaLocalRef<jobject> otr_profile_id; |
| if (browser_context && browser_context->IsOffTheRecord()) { |
| Profile* profile = Profile::FromBrowserContext(browser_context); |
| otr_profile_id = profile->GetOTRProfileID().ConvertToJavaOTRProfileID(env); |
| } |
| |
| Java_DownloadUtils_openDownload( |
| env, item->GetTargetFilePath().value(), item->GetMimeType(), |
| item->GetGuid(), otr_profile_id, original_url, |
| item->GetReferrerUrl().spec(), static_cast<jint>(open_source)); |
| } |
| |
| // static |
| std::string DownloadUtils::RemapGenericMimeType(const std::string& mime_type, |
| const GURL& url, |
| const std::string& file_name) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| return Java_MimeUtils_remapGenericMimeType(env, mime_type, url.spec(), |
| file_name); |
| } |
| |
| // static |
| bool DownloadUtils::ShouldAutoOpenDownload(download::DownloadItem* item) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| return Java_MimeUtils_canAutoOpenMimeType(env, item->GetMimeType()) && |
| IsDownloadUserInitiated(item); |
| } |
| |
| // static |
| bool DownloadUtils::IsOmaDownloadDescription(const std::string& mime_type) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| return Java_MimeUtils_isOMADownloadDescription(env, mime_type); |
| } |
| |
| bool DownloadUtils::IsDownloadUserInitiated(download::DownloadItem* download) { |
| ui::PageTransition page_transition = download->GetTransitionType(); |
| return download->HasUserGesture() || |
| (page_transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) || |
| PageTransitionCoreTypeIs(page_transition, ui::PAGE_TRANSITION_TYPED) || |
| PageTransitionCoreTypeIs(page_transition, |
| ui::PAGE_TRANSITION_AUTO_BOOKMARK) || |
| PageTransitionCoreTypeIs(page_transition, |
| ui::PAGE_TRANSITION_GENERATED) || |
| PageTransitionCoreTypeIs(page_transition, |
| ui::PAGE_TRANSITION_RELOAD) || |
| PageTransitionCoreTypeIs(page_transition, ui::PAGE_TRANSITION_KEYWORD); |
| } |