1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
// 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_dialog_bridge.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/metrics/field_trial_params.h"
#include "base/metrics/histogram_macros.h"
#include "chrome/browser/download/android/download_controller.h"
#include "chrome/browser/download/android/jni_headers/DownloadDialogBridge_jni.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/pref_names.h"
#include "components/download/public/common/download_features.h"
#include "components/prefs/android/pref_service_android.h"
#include "components/prefs/pref_service.h"
#include "ui/android/window_android.h"
// -----------------------------------------------------------------------------
// DownloadDialogResult
DownloadDialogResult::DownloadDialogResult() = default;
DownloadDialogResult::DownloadDialogResult(const DownloadDialogResult&) =
default;
DownloadDialogResult::~DownloadDialogResult() = default;
// -----------------------------------------------------------------------------
// DownloadDialogBridge.
DownloadDialogBridge::DownloadDialogBridge() : is_dialog_showing_(false) {
JNIEnv* env = base::android::AttachCurrentThread();
java_obj_.Reset(env, Java_DownloadDialogBridge_create(
env, reinterpret_cast<intptr_t>(this))
.obj());
DCHECK(!java_obj_.is_null());
}
DownloadDialogBridge::~DownloadDialogBridge() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_DownloadDialogBridge_destroy(env, java_obj_);
}
void DownloadDialogBridge::ShowDialog(
gfx::NativeWindow native_window,
int64_t total_bytes,
net::NetworkChangeNotifier::ConnectionType connection_type,
DownloadLocationDialogType dialog_type,
const base::FilePath& suggested_path,
Profile* profile,
DialogCallback dialog_callback) {
if (!native_window)
return;
UMA_HISTOGRAM_ENUMERATION("MobileDownload.Location.Dialog.Type", dialog_type);
dialog_callback_ = std::move(dialog_callback);
// This shouldn't happen.
if (dialog_type == DownloadLocationDialogType::NO_DIALOG) {
NOTREACHED();
}
// If dialog is showing, run the callback to continue without confirmation.
if (is_dialog_showing_) {
DownloadDialogResult dialog_result;
dialog_result.location_result =
DownloadLocationDialogResult::DUPLICATE_DIALOG;
dialog_result.file_path = suggested_path;
CompleteSelection(std::move(dialog_result));
return;
}
is_dialog_showing_ = true;
JNIEnv* env = base::android::AttachCurrentThread();
Java_DownloadDialogBridge_showDialog(
env, java_obj_, native_window->GetJavaObject(),
static_cast<long>(total_bytes), static_cast<int>(connection_type),
static_cast<int>(dialog_type), suggested_path.AsUTF8Unsafe(),
profile->GetJavaObject());
}
void DownloadDialogBridge::OnComplete(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
std::string& returned_path) {
DownloadDialogResult dialog_result;
dialog_result.location_result = DownloadLocationDialogResult::USER_CONFIRMED;
dialog_result.file_path = base::FilePath(returned_path);
CompleteSelection(std::move(dialog_result));
is_dialog_showing_ = false;
}
void DownloadDialogBridge::OnCanceled(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
if (dialog_callback_) {
DownloadDialogResult dialog_result;
dialog_result.location_result = DownloadLocationDialogResult::USER_CANCELED;
CompleteSelection(std::move(dialog_result));
}
is_dialog_showing_ = false;
}
void DownloadDialogBridge::CompleteSelection(DownloadDialogResult result) {
if (!dialog_callback_)
return;
UMA_HISTOGRAM_ENUMERATION("MobileDownload.Location.Dialog.Result",
result.location_result);
std::move(dialog_callback_).Run(std::move(result));
}
// static
void JNI_DownloadDialogBridge_SetDownloadAndSaveFileDefaultDirectory(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jpref_service,
std::string& directory) {
PrefService* pref_service =
PrefServiceAndroid::FromPrefServiceAndroid(jpref_service);
base::FilePath path(directory);
pref_service->SetFilePath(prefs::kDownloadDefaultDirectory, path);
pref_service->SetFilePath(prefs::kSaveFileDefaultDirectory, path);
}
|