blob: 954e19c34d9a8e679b91bc0c6417e24ed7aa5bb2 [file] [log] [blame]
[email protected]e8c62b92013-01-16 23:08:271// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// 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"
11#include "base/logging.h"
[email protected]d778e0422013-03-06 18:10:2212#include "base/strings/string_split.h"
[email protected]3b3a30642013-06-11 19:48:3813#include "base/strings/string_util.h"
[email protected]c7057fbe2013-06-07 18:54:0114#include "base/strings/utf_string_conversions.h"
[email protected]e8c62b92013-01-16 23:08:2715#include "jni/SelectFileDialog_jni.h"
jaekyune4f9eed2015-02-24 02:06:5816#include "ui/android/window_android.h"
Brett Wilson804e83c2017-08-18 22:57:3317#include "ui/shell_dialogs/select_file_policy.h"
[email protected]f2263352014-02-04 13:09:4118#include "ui/shell_dialogs/selected_file_info.h"
[email protected]e8c62b92013-01-16 23:08:2719
[email protected]98dd29f2014-08-06 16:04:3520using base::android::ConvertJavaStringToUTF8;
torne86560112016-08-04 15:59:0421using base::android::JavaParamRef;
22using base::android::ScopedJavaLocalRef;
[email protected]98dd29f2014-08-06 16:04:3523
[email protected]e8c62b92013-01-16 23:08:2724namespace ui {
25
26// static
Brett Wilson804e83c2017-08-18 22:57:3327SelectFileDialogImpl* SelectFileDialogImpl::Create(
28 Listener* listener,
29 std::unique_ptr<SelectFilePolicy> policy) {
30 return new SelectFileDialogImpl(listener, std::move(policy));
[email protected]e8c62b92013-01-16 23:08:2731}
32
tornebb13c832015-12-07 12:49:1433void SelectFileDialogImpl::OnFileSelected(
34 JNIEnv* env,
35 const JavaParamRef<jobject>& java_object,
36 const JavaParamRef<jstring>& filepath,
37 const JavaParamRef<jstring>& display_name) {
[email protected]98dd29f2014-08-06 16:04:3538 if (!listener_)
39 return;
40
41 std::string path = ConvertJavaStringToUTF8(env, filepath);
42 std::string file_name = ConvertJavaStringToUTF8(env, display_name);
43 base::FilePath file_path = base::FilePath(path);
44 ui::SelectedFileInfo file_info;
45 file_info.file_path = file_path;
46 file_info.local_path = file_path;
47 if (!file_name.empty())
48 file_info.display_name = file_name;
49
50 listener_->FileSelectedWithExtraInfo(file_info, 0, NULL);
51}
52
tornebb13c832015-12-07 12:49:1453void SelectFileDialogImpl::OnMultipleFilesSelected(
54 JNIEnv* env,
55 const JavaParamRef<jobject>& java_object,
56 const JavaParamRef<jobjectArray>& filepaths,
57 const JavaParamRef<jobjectArray>& display_names) {
[email protected]98dd29f2014-08-06 16:04:3558 if (!listener_)
59 return;
60
61 std::vector<ui::SelectedFileInfo> selected_files;
62
63 jsize length = env->GetArrayLength(filepaths);
64 DCHECK(length == env->GetArrayLength(display_names));
65 for (int i = 0; i < length; ++i) {
66 std::string path = ConvertJavaStringToUTF8(
67 env, static_cast<jstring>(env->GetObjectArrayElement(filepaths, i)));
68 std::string display_name = ConvertJavaStringToUTF8(
69 env,
70 static_cast<jstring>(env->GetObjectArrayElement(display_names, i)));
71
[email protected]f2263352014-02-04 13:09:4172 base::FilePath file_path = base::FilePath(path);
[email protected]98dd29f2014-08-06 16:04:3573
[email protected]f2263352014-02-04 13:09:4174 ui::SelectedFileInfo file_info;
75 file_info.file_path = file_path;
76 file_info.local_path = file_path;
[email protected]98dd29f2014-08-06 16:04:3577 file_info.display_name = display_name;
78
79 selected_files.push_back(file_info);
[email protected]e8c62b92013-01-16 23:08:2780 }
[email protected]98dd29f2014-08-06 16:04:3581
82 listener_->MultiFilesSelectedWithExtraInfo(selected_files, NULL);
[email protected]e8c62b92013-01-16 23:08:2783}
84
85void SelectFileDialogImpl::OnFileNotSelected(
86 JNIEnv* env,
tornebb13c832015-12-07 12:49:1487 const JavaParamRef<jobject>& java_object) {
[email protected]e8c62b92013-01-16 23:08:2788 if (listener_)
89 listener_->FileSelectionCanceled(NULL);
[email protected]e8c62b92013-01-16 23:08:2790}
91
92bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow) const {
[email protected]64e82b22014-03-05 00:20:0693 return listener_;
[email protected]e8c62b92013-01-16 23:08:2794}
95
96void SelectFileDialogImpl::ListenerDestroyed() {
97 listener_ = NULL;
98}
99
100void SelectFileDialogImpl::SelectFileImpl(
[email protected]0b59171c2013-06-04 08:38:38101 SelectFileDialog::Type type,
102 const base::string16& title,
[email protected]79f63882013-02-10 05:15:45103 const base::FilePath& default_path,
[email protected]e8c62b92013-01-16 23:08:27104 const SelectFileDialog::FileTypeInfo* file_types,
105 int file_type_index,
106 const std::string& default_extension,
107 gfx::NativeWindow owning_window,
108 void* params) {
109 JNIEnv* env = base::android::AttachCurrentThread();
110
[email protected]b7b4beb2013-07-09 14:06:50111 // The first element in the pair is a list of accepted types, the second
112 // indicates whether the device's capture capabilities should be used.
113 typedef std::pair<std::vector<base::string16>, bool> AcceptTypes;
114 AcceptTypes accept_types = std::make_pair(std::vector<base::string16>(),
115 false);
[email protected]e8c62b92013-01-16 23:08:27116
[email protected]98dd29f2014-08-06 16:04:35117 if (params)
[email protected]b7b4beb2013-07-09 14:06:50118 accept_types = *(reinterpret_cast<AcceptTypes*>(params));
[email protected]e8c62b92013-01-16 23:08:27119
[email protected]e8c62b92013-01-16 23:08:27120 ScopedJavaLocalRef<jobjectArray> accept_types_java =
[email protected]b7b4beb2013-07-09 14:06:50121 base::android::ToJavaArrayOfStrings(env, accept_types.first);
[email protected]e8c62b92013-01-16 23:08:27122
[email protected]98dd29f2014-08-06 16:04:35123 bool accept_multiple_files = SelectFileDialog::SELECT_OPEN_MULTI_FILE == type;
124
torne948f3662016-08-16 15:10:44125 Java_SelectFileDialog_selectFile(env, java_object_, accept_types_java,
126 accept_types.second, accept_multiple_files,
127 owning_window->GetJavaObject());
[email protected]e8c62b92013-01-16 23:08:27128}
129
[email protected]e8c62b92013-01-16 23:08:27130SelectFileDialogImpl::~SelectFileDialogImpl() {
131}
132
Brett Wilson804e83c2017-08-18 22:57:33133SelectFileDialogImpl::SelectFileDialogImpl(
134 Listener* listener,
135 std::unique_ptr<SelectFilePolicy> policy)
136 : SelectFileDialog(listener, std::move(policy)) {
[email protected]e8c62b92013-01-16 23:08:27137 JNIEnv* env = base::android::AttachCurrentThread();
138 java_object_.Reset(
[email protected]cfccf262013-11-11 23:27:54139 Java_SelectFileDialog_create(env, reinterpret_cast<intptr_t>(this)));
[email protected]e8c62b92013-01-16 23:08:27140}
141
142bool SelectFileDialogImpl::HasMultipleFileTypeChoicesImpl() {
143 NOTIMPLEMENTED();
144 return false;
145}
146
Brett Wilson804e83c2017-08-18 22:57:33147SelectFileDialog* CreateSelectFileDialog(
148 SelectFileDialog::Listener* listener,
149 std::unique_ptr<SelectFilePolicy> policy) {
150 return SelectFileDialogImpl::Create(listener, std::move(policy));
[email protected]e8c62b92013-01-16 23:08:27151}
152
153} // namespace ui