blob: dbbaff3c84307fb4e761e9e4bab938b0e699e3b3 [file] [log] [blame]
Avi Drissman3e1a26c2022-09-15 20:26:031// Copyright 2012 The Chromium Authors
[email protected]e8c62b92013-01-16 23:08:272// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "select_file_dialog_android.h"
6
7#include "base/android/jni_android.h"
[email protected]e8c62b92013-01-16 23:08:278#include "base/android/jni_array.h"
[email protected]d778e0422013-03-06 18:10:229#include "base/android/jni_string.h"
[email protected]e8c62b92013-01-16 23:08:2710#include "base/android/scoped_java_ref.h"
Hans Wennborg8586102b2020-05-05 13:43:2911#include "base/check.h"
12#include "base/notreached.h"
[email protected]d778e0422013-03-06 18:10:2213#include "base/strings/string_split.h"
[email protected]3b3a30642013-06-11 19:48:3814#include "base/strings/string_util.h"
[email protected]c7057fbe2013-06-07 18:54:0115#include "base/strings/utf_string_conversions.h"
jaekyune4f9eed2015-02-24 02:06:5816#include "ui/android/window_android.h"
Andrew Grieve4a42c22e2019-06-24 16:14:2917#include "ui/base/ui_base_jni_headers/SelectFileDialog_jni.h"
Brett Wilson804e83c2017-08-18 22:57:3318#include "ui/shell_dialogs/select_file_policy.h"
[email protected]f2263352014-02-04 13:09:4119#include "ui/shell_dialogs/selected_file_info.h"
[email protected]e8c62b92013-01-16 23:08:2720
[email protected]98dd29f2014-08-06 16:04:3521using base::android::ConvertJavaStringToUTF8;
torne86560112016-08-04 15:59:0422using base::android::JavaParamRef;
23using base::android::ScopedJavaLocalRef;
[email protected]98dd29f2014-08-06 16:04:3524
[email protected]e8c62b92013-01-16 23:08:2725namespace ui {
26
27// static
Brett Wilson804e83c2017-08-18 22:57:3328SelectFileDialogImpl* SelectFileDialogImpl::Create(
29 Listener* listener,
30 std::unique_ptr<SelectFilePolicy> policy) {
31 return new SelectFileDialogImpl(listener, std::move(policy));
[email protected]e8c62b92013-01-16 23:08:2732}
33
tornebb13c832015-12-07 12:49:1434void SelectFileDialogImpl::OnFileSelected(
35 JNIEnv* env,
36 const JavaParamRef<jobject>& java_object,
37 const JavaParamRef<jstring>& filepath,
38 const JavaParamRef<jstring>& display_name) {
[email protected]98dd29f2014-08-06 16:04:3539 if (!listener_)
40 return;
41
42 std::string path = ConvertJavaStringToUTF8(env, filepath);
43 std::string file_name = ConvertJavaStringToUTF8(env, display_name);
44 base::FilePath file_path = base::FilePath(path);
45 ui::SelectedFileInfo file_info;
46 file_info.file_path = file_path;
47 file_info.local_path = file_path;
48 if (!file_name.empty())
49 file_info.display_name = file_name;
50
Bartek Nowierskic740c76c2020-06-15 02:32:4451 listener_->FileSelectedWithExtraInfo(file_info, 0, nullptr);
[email protected]98dd29f2014-08-06 16:04:3552}
53
tornebb13c832015-12-07 12:49:1454void SelectFileDialogImpl::OnMultipleFilesSelected(
55 JNIEnv* env,
56 const JavaParamRef<jobject>& java_object,
57 const JavaParamRef<jobjectArray>& filepaths,
58 const JavaParamRef<jobjectArray>& display_names) {
[email protected]98dd29f2014-08-06 16:04:3559 if (!listener_)
60 return;
61
62 std::vector<ui::SelectedFileInfo> selected_files;
63
64 jsize length = env->GetArrayLength(filepaths);
65 DCHECK(length == env->GetArrayLength(display_names));
66 for (int i = 0; i < length; ++i) {
Ran Ji8a1874632018-01-29 21:04:3667 ScopedJavaLocalRef<jstring> path_ref(
[email protected]98dd29f2014-08-06 16:04:3568 env, static_cast<jstring>(env->GetObjectArrayElement(filepaths, i)));
Ran Ji8a1874632018-01-29 21:04:3669 base::FilePath file_path =
70 base::FilePath(ConvertJavaStringToUTF8(env, path_ref));
71
72 ScopedJavaLocalRef<jstring> display_name_ref(
[email protected]98dd29f2014-08-06 16:04:3573 env,
74 static_cast<jstring>(env->GetObjectArrayElement(display_names, i)));
Ran Ji8a1874632018-01-29 21:04:3675 std::string display_name =
76 ConvertJavaStringToUTF8(env, display_name_ref.obj());
[email protected]98dd29f2014-08-06 16:04:3577
[email protected]f2263352014-02-04 13:09:4178 ui::SelectedFileInfo file_info;
79 file_info.file_path = file_path;
80 file_info.local_path = file_path;
[email protected]98dd29f2014-08-06 16:04:3581 file_info.display_name = display_name;
82
83 selected_files.push_back(file_info);
[email protected]e8c62b92013-01-16 23:08:2784 }
[email protected]98dd29f2014-08-06 16:04:3585
Bartek Nowierskic740c76c2020-06-15 02:32:4486 listener_->MultiFilesSelectedWithExtraInfo(selected_files, nullptr);
[email protected]e8c62b92013-01-16 23:08:2787}
88
89void SelectFileDialogImpl::OnFileNotSelected(
90 JNIEnv* env,
tornebb13c832015-12-07 12:49:1491 const JavaParamRef<jobject>& java_object) {
[email protected]e8c62b92013-01-16 23:08:2792 if (listener_)
Bartek Nowierskic740c76c2020-06-15 02:32:4493 listener_->FileSelectionCanceled(nullptr);
[email protected]e8c62b92013-01-16 23:08:2794}
95
Finnur Thorarinsson658449a2018-10-09 11:18:2696void SelectFileDialogImpl::OnContactsSelected(
97 JNIEnv* env,
98 const JavaParamRef<jobject>& java_object,
99 const JavaParamRef<jstring>& java_contacts) {
100 std::string data = ConvertJavaStringToUTF8(env, java_contacts.obj());
101 listener_->FileSelectedWithExtraInfo(ui::SelectedFileInfo(), 0,
102 (void*)data.c_str());
103}
104
[email protected]e8c62b92013-01-16 23:08:27105bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow) const {
[email protected]64e82b22014-03-05 00:20:06106 return listener_;
[email protected]e8c62b92013-01-16 23:08:27107}
108
109void SelectFileDialogImpl::ListenerDestroyed() {
Bartek Nowierskic740c76c2020-06-15 02:32:44110 listener_ = nullptr;
[email protected]e8c62b92013-01-16 23:08:27111}
112
113void SelectFileDialogImpl::SelectFileImpl(
[email protected]0b59171c2013-06-04 08:38:38114 SelectFileDialog::Type type,
Jan Wilken Dörrie52639572021-03-11 16:49:54115 const std::u16string& title,
[email protected]79f63882013-02-10 05:15:45116 const base::FilePath& default_path,
[email protected]e8c62b92013-01-16 23:08:27117 const SelectFileDialog::FileTypeInfo* file_types,
118 int file_type_index,
119 const std::string& default_extension,
120 gfx::NativeWindow owning_window,
121 void* params) {
122 JNIEnv* env = base::android::AttachCurrentThread();
123
[email protected]b7b4beb2013-07-09 14:06:50124 // The first element in the pair is a list of accepted types, the second
125 // indicates whether the device's capture capabilities should be used.
Jan Wilken Dörrie52639572021-03-11 16:49:54126 typedef std::pair<std::vector<std::u16string>, bool> AcceptTypes;
127 AcceptTypes accept_types =
128 std::make_pair(std::vector<std::u16string>(), false);
[email protected]e8c62b92013-01-16 23:08:27129
[email protected]98dd29f2014-08-06 16:04:35130 if (params)
[email protected]b7b4beb2013-07-09 14:06:50131 accept_types = *(reinterpret_cast<AcceptTypes*>(params));
[email protected]e8c62b92013-01-16 23:08:27132
[email protected]e8c62b92013-01-16 23:08:27133 ScopedJavaLocalRef<jobjectArray> accept_types_java =
[email protected]b7b4beb2013-07-09 14:06:50134 base::android::ToJavaArrayOfStrings(env, accept_types.first);
[email protected]e8c62b92013-01-16 23:08:27135
[email protected]98dd29f2014-08-06 16:04:35136 bool accept_multiple_files = SelectFileDialog::SELECT_OPEN_MULTI_FILE == type;
137
torne948f3662016-08-16 15:10:44138 Java_SelectFileDialog_selectFile(env, java_object_, accept_types_java,
139 accept_types.second, accept_multiple_files,
140 owning_window->GetJavaObject());
[email protected]e8c62b92013-01-16 23:08:27141}
142
[email protected]e8c62b92013-01-16 23:08:27143SelectFileDialogImpl::~SelectFileDialogImpl() {
144}
145
Brett Wilson804e83c2017-08-18 22:57:33146SelectFileDialogImpl::SelectFileDialogImpl(
147 Listener* listener,
148 std::unique_ptr<SelectFilePolicy> policy)
149 : SelectFileDialog(listener, std::move(policy)) {
[email protected]e8c62b92013-01-16 23:08:27150 JNIEnv* env = base::android::AttachCurrentThread();
151 java_object_.Reset(
[email protected]cfccf262013-11-11 23:27:54152 Java_SelectFileDialog_create(env, reinterpret_cast<intptr_t>(this)));
[email protected]e8c62b92013-01-16 23:08:27153}
154
155bool SelectFileDialogImpl::HasMultipleFileTypeChoicesImpl() {
156 NOTIMPLEMENTED();
157 return false;
158}
159
Brett Wilson804e83c2017-08-18 22:57:33160SelectFileDialog* CreateSelectFileDialog(
161 SelectFileDialog::Listener* listener,
162 std::unique_ptr<SelectFilePolicy> policy) {
163 return SelectFileDialogImpl::Create(listener, std::move(policy));
[email protected]e8c62b92013-01-16 23:08:27164}
165
166} // namespace ui