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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "select_file_dialog_android.h"
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/logging.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "jni/SelectFileDialog_jni.h"
#include "ui/base/android/window_android.h"
#include "ui/shell_dialogs/selected_file_info.h"
using base::android::ConvertJavaStringToUTF8;
namespace ui {
// static
SelectFileDialogImpl* SelectFileDialogImpl::Create(Listener* listener,
SelectFilePolicy* policy) {
return new SelectFileDialogImpl(listener, policy);
}
void SelectFileDialogImpl::OnFileSelected(JNIEnv* env,
jobject java_object,
jstring filepath,
jstring display_name) {
if (!listener_)
return;
std::string path = ConvertJavaStringToUTF8(env, filepath);
std::string file_name = ConvertJavaStringToUTF8(env, display_name);
base::FilePath file_path = base::FilePath(path);
ui::SelectedFileInfo file_info;
file_info.file_path = file_path;
file_info.local_path = file_path;
if (!file_name.empty())
file_info.display_name = file_name;
listener_->FileSelectedWithExtraInfo(file_info, 0, NULL);
}
void SelectFileDialogImpl::OnMultipleFilesSelected(JNIEnv* env,
jobject java_object,
jobjectArray filepaths,
jobjectArray display_names) {
if (!listener_)
return;
std::vector<ui::SelectedFileInfo> selected_files;
jsize length = env->GetArrayLength(filepaths);
DCHECK(length == env->GetArrayLength(display_names));
for (int i = 0; i < length; ++i) {
std::string path = ConvertJavaStringToUTF8(
env, static_cast<jstring>(env->GetObjectArrayElement(filepaths, i)));
std::string display_name = ConvertJavaStringToUTF8(
env,
static_cast<jstring>(env->GetObjectArrayElement(display_names, i)));
base::FilePath file_path = base::FilePath(path);
ui::SelectedFileInfo file_info;
file_info.file_path = file_path;
file_info.local_path = file_path;
file_info.display_name = display_name;
selected_files.push_back(file_info);
}
listener_->MultiFilesSelectedWithExtraInfo(selected_files, NULL);
}
void SelectFileDialogImpl::OnFileNotSelected(
JNIEnv* env,
jobject java_object) {
if (listener_)
listener_->FileSelectionCanceled(NULL);
}
bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow) const {
return listener_;
}
void SelectFileDialogImpl::ListenerDestroyed() {
listener_ = NULL;
}
void SelectFileDialogImpl::SelectFileImpl(
SelectFileDialog::Type type,
const base::string16& title,
const base::FilePath& default_path,
const SelectFileDialog::FileTypeInfo* file_types,
int file_type_index,
const std::string& default_extension,
gfx::NativeWindow owning_window,
void* params) {
JNIEnv* env = base::android::AttachCurrentThread();
// The first element in the pair is a list of accepted types, the second
// indicates whether the device's capture capabilities should be used.
typedef std::pair<std::vector<base::string16>, bool> AcceptTypes;
AcceptTypes accept_types = std::make_pair(std::vector<base::string16>(),
false);
if (params)
accept_types = *(reinterpret_cast<AcceptTypes*>(params));
ScopedJavaLocalRef<jobjectArray> accept_types_java =
base::android::ToJavaArrayOfStrings(env, accept_types.first);
bool accept_multiple_files = SelectFileDialog::SELECT_OPEN_MULTI_FILE == type;
Java_SelectFileDialog_selectFile(env, java_object_.obj(),
accept_types_java.obj(),
accept_types.second,
accept_multiple_files,
owning_window->GetJavaObject().obj());
}
bool SelectFileDialogImpl::RegisterSelectFileDialog(JNIEnv* env) {
return RegisterNativesImpl(env);
}
SelectFileDialogImpl::~SelectFileDialogImpl() {
}
SelectFileDialogImpl::SelectFileDialogImpl(Listener* listener,
SelectFilePolicy* policy)
: SelectFileDialog(listener, policy) {
JNIEnv* env = base::android::AttachCurrentThread();
java_object_.Reset(
Java_SelectFileDialog_create(env, reinterpret_cast<intptr_t>(this)));
}
bool SelectFileDialogImpl::HasMultipleFileTypeChoicesImpl() {
NOTIMPLEMENTED();
return false;
}
SelectFileDialog* CreateAndroidSelectFileDialog(
SelectFileDialog::Listener* listener,
SelectFilePolicy* policy) {
return SelectFileDialogImpl::Create(listener, policy);
}
} // namespace ui
|