blob: 53ffb8275ee9b3b86ec8944ccc5458013b15446a [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"
[email protected]f2263352014-02-04 13:09:4117#include "ui/shell_dialogs/selected_file_info.h"
[email protected]e8c62b92013-01-16 23:08:2718
[email protected]98dd29f2014-08-06 16:04:3519using base::android::ConvertJavaStringToUTF8;
torne86560112016-08-04 15:59:0420using base::android::JavaParamRef;
21using base::android::ScopedJavaLocalRef;
[email protected]98dd29f2014-08-06 16:04:3522
[email protected]e8c62b92013-01-16 23:08:2723namespace ui {
24
25// static
26SelectFileDialogImpl* SelectFileDialogImpl::Create(Listener* listener,
[email protected]0b59171c2013-06-04 08:38:3827 SelectFilePolicy* policy) {
[email protected]e8c62b92013-01-16 23:08:2728 return new SelectFileDialogImpl(listener, policy);
29}
30
tornebb13c832015-12-07 12:49:1431void SelectFileDialogImpl::OnFileSelected(
32 JNIEnv* env,
33 const JavaParamRef<jobject>& java_object,
34 const JavaParamRef<jstring>& filepath,
35 const JavaParamRef<jstring>& display_name) {
[email protected]98dd29f2014-08-06 16:04:3536 if (!listener_)
37 return;
38
39 std::string path = ConvertJavaStringToUTF8(env, filepath);
40 std::string file_name = ConvertJavaStringToUTF8(env, display_name);
41 base::FilePath file_path = base::FilePath(path);
42 ui::SelectedFileInfo file_info;
43 file_info.file_path = file_path;
44 file_info.local_path = file_path;
45 if (!file_name.empty())
46 file_info.display_name = file_name;
47
48 listener_->FileSelectedWithExtraInfo(file_info, 0, NULL);
49}
50
tornebb13c832015-12-07 12:49:1451void SelectFileDialogImpl::OnMultipleFilesSelected(
52 JNIEnv* env,
53 const JavaParamRef<jobject>& java_object,
54 const JavaParamRef<jobjectArray>& filepaths,
55 const JavaParamRef<jobjectArray>& display_names) {
[email protected]98dd29f2014-08-06 16:04:3556 if (!listener_)
57 return;
58
59 std::vector<ui::SelectedFileInfo> selected_files;
60
61 jsize length = env->GetArrayLength(filepaths);
62 DCHECK(length == env->GetArrayLength(display_names));
63 for (int i = 0; i < length; ++i) {
64 std::string path = ConvertJavaStringToUTF8(
65 env, static_cast<jstring>(env->GetObjectArrayElement(filepaths, i)));
66 std::string display_name = ConvertJavaStringToUTF8(
67 env,
68 static_cast<jstring>(env->GetObjectArrayElement(display_names, i)));
69
[email protected]f2263352014-02-04 13:09:4170 base::FilePath file_path = base::FilePath(path);
[email protected]98dd29f2014-08-06 16:04:3571
[email protected]f2263352014-02-04 13:09:4172 ui::SelectedFileInfo file_info;
73 file_info.file_path = file_path;
74 file_info.local_path = file_path;
[email protected]98dd29f2014-08-06 16:04:3575 file_info.display_name = display_name;
76
77 selected_files.push_back(file_info);
[email protected]e8c62b92013-01-16 23:08:2778 }
[email protected]98dd29f2014-08-06 16:04:3579
80 listener_->MultiFilesSelectedWithExtraInfo(selected_files, NULL);
[email protected]e8c62b92013-01-16 23:08:2781}
82
83void SelectFileDialogImpl::OnFileNotSelected(
84 JNIEnv* env,
tornebb13c832015-12-07 12:49:1485 const JavaParamRef<jobject>& java_object) {
[email protected]e8c62b92013-01-16 23:08:2786 if (listener_)
87 listener_->FileSelectionCanceled(NULL);
[email protected]e8c62b92013-01-16 23:08:2788}
89
90bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow) const {
[email protected]64e82b22014-03-05 00:20:0691 return listener_;
[email protected]e8c62b92013-01-16 23:08:2792}
93
94void SelectFileDialogImpl::ListenerDestroyed() {
95 listener_ = NULL;
96}
97
98void SelectFileDialogImpl::SelectFileImpl(
[email protected]0b59171c2013-06-04 08:38:3899 SelectFileDialog::Type type,
100 const base::string16& title,
[email protected]79f63882013-02-10 05:15:45101 const base::FilePath& default_path,
[email protected]e8c62b92013-01-16 23:08:27102 const SelectFileDialog::FileTypeInfo* file_types,
103 int file_type_index,
104 const std::string& default_extension,
105 gfx::NativeWindow owning_window,
106 void* params) {
107 JNIEnv* env = base::android::AttachCurrentThread();
108
[email protected]b7b4beb2013-07-09 14:06:50109 // The first element in the pair is a list of accepted types, the second
110 // indicates whether the device's capture capabilities should be used.
111 typedef std::pair<std::vector<base::string16>, bool> AcceptTypes;
112 AcceptTypes accept_types = std::make_pair(std::vector<base::string16>(),
113 false);
[email protected]e8c62b92013-01-16 23:08:27114
[email protected]98dd29f2014-08-06 16:04:35115 if (params)
[email protected]b7b4beb2013-07-09 14:06:50116 accept_types = *(reinterpret_cast<AcceptTypes*>(params));
[email protected]e8c62b92013-01-16 23:08:27117
[email protected]e8c62b92013-01-16 23:08:27118 ScopedJavaLocalRef<jobjectArray> accept_types_java =
[email protected]b7b4beb2013-07-09 14:06:50119 base::android::ToJavaArrayOfStrings(env, accept_types.first);
[email protected]e8c62b92013-01-16 23:08:27120
[email protected]98dd29f2014-08-06 16:04:35121 bool accept_multiple_files = SelectFileDialog::SELECT_OPEN_MULTI_FILE == type;
122
torne948f3662016-08-16 15:10:44123 Java_SelectFileDialog_selectFile(env, java_object_, accept_types_java,
124 accept_types.second, accept_multiple_files,
125 owning_window->GetJavaObject());
[email protected]e8c62b92013-01-16 23:08:27126}
127
[email protected]e8c62b92013-01-16 23:08:27128SelectFileDialogImpl::~SelectFileDialogImpl() {
129}
130
131SelectFileDialogImpl::SelectFileDialogImpl(Listener* listener,
[email protected]0b59171c2013-06-04 08:38:38132 SelectFilePolicy* policy)
[email protected]64e82b22014-03-05 00:20:06133 : SelectFileDialog(listener, policy) {
[email protected]e8c62b92013-01-16 23:08:27134 JNIEnv* env = base::android::AttachCurrentThread();
135 java_object_.Reset(
[email protected]cfccf262013-11-11 23:27:54136 Java_SelectFileDialog_create(env, reinterpret_cast<intptr_t>(this)));
[email protected]e8c62b92013-01-16 23:08:27137}
138
139bool SelectFileDialogImpl::HasMultipleFileTypeChoicesImpl() {
140 NOTIMPLEMENTED();
141 return false;
142}
143
karandeepb25767282016-03-08 03:40:11144SelectFileDialog* CreateSelectFileDialog(SelectFileDialog::Listener* listener,
145 SelectFilePolicy* policy) {
[email protected]e8c62b92013-01-16 23:08:27146 return SelectFileDialogImpl::Create(listener, policy);
147}
148
149} // namespace ui