Home | History | Annotate | Download | only in shell_dialogs
      1 // 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"
      8 #include "base/android/jni_array.h"
      9 #include "base/android/jni_string.h"
     10 #include "base/android/scoped_java_ref.h"
     11 #include "base/logging.h"
     12 #include "base/strings/string_split.h"
     13 #include "base/strings/string_util.h"
     14 #include "base/strings/utf_string_conversions.h"
     15 #include "jni/SelectFileDialog_jni.h"
     16 #include "ui/base/android/window_android.h"
     17 #include "ui/shell_dialogs/selected_file_info.h"
     18 
     19 using base::android::ConvertJavaStringToUTF8;
     20 
     21 namespace ui {
     22 
     23 // static
     24 SelectFileDialogImpl* SelectFileDialogImpl::Create(Listener* listener,
     25                                                    SelectFilePolicy* policy) {
     26   return new SelectFileDialogImpl(listener, policy);
     27 }
     28 
     29 void SelectFileDialogImpl::OnFileSelected(JNIEnv* env,
     30                                           jobject java_object,
     31                                           jstring filepath,
     32                                           jstring display_name) {
     33   if (!listener_)
     34     return;
     35 
     36   std::string path = ConvertJavaStringToUTF8(env, filepath);
     37   std::string file_name = ConvertJavaStringToUTF8(env, display_name);
     38   base::FilePath file_path = base::FilePath(path);
     39   ui::SelectedFileInfo file_info;
     40   file_info.file_path = file_path;
     41   file_info.local_path = file_path;
     42   if (!file_name.empty())
     43     file_info.display_name = file_name;
     44 
     45   listener_->FileSelectedWithExtraInfo(file_info, 0, NULL);
     46 }
     47 
     48 void SelectFileDialogImpl::OnMultipleFilesSelected(JNIEnv* env,
     49                                                    jobject java_object,
     50                                                    jobjectArray filepaths,
     51                                                    jobjectArray display_names) {
     52   if (!listener_)
     53     return;
     54 
     55   std::vector<ui::SelectedFileInfo> selected_files;
     56 
     57   jsize length = env->GetArrayLength(filepaths);
     58   DCHECK(length == env->GetArrayLength(display_names));
     59   for (int i = 0; i < length; ++i) {
     60     std::string path = ConvertJavaStringToUTF8(
     61         env, static_cast<jstring>(env->GetObjectArrayElement(filepaths, i)));
     62     std::string display_name = ConvertJavaStringToUTF8(
     63         env,
     64         static_cast<jstring>(env->GetObjectArrayElement(display_names, i)));
     65 
     66     base::FilePath file_path = base::FilePath(path);
     67 
     68     ui::SelectedFileInfo file_info;
     69     file_info.file_path = file_path;
     70     file_info.local_path = file_path;
     71     file_info.display_name = display_name;
     72 
     73     selected_files.push_back(file_info);
     74   }
     75 
     76   listener_->MultiFilesSelectedWithExtraInfo(selected_files, NULL);
     77 }
     78 
     79 void SelectFileDialogImpl::OnFileNotSelected(
     80     JNIEnv* env,
     81     jobject java_object) {
     82   if (listener_)
     83     listener_->FileSelectionCanceled(NULL);
     84 }
     85 
     86 bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow) const {
     87   return listener_;
     88 }
     89 
     90 void SelectFileDialogImpl::ListenerDestroyed() {
     91   listener_ = NULL;
     92 }
     93 
     94 void SelectFileDialogImpl::SelectFileImpl(
     95     SelectFileDialog::Type type,
     96     const base::string16& title,
     97     const base::FilePath& default_path,
     98     const SelectFileDialog::FileTypeInfo* file_types,
     99     int file_type_index,
    100     const std::string& default_extension,
    101     gfx::NativeWindow owning_window,
    102     void* params) {
    103   JNIEnv* env = base::android::AttachCurrentThread();
    104 
    105   // The first element in the pair is a list of accepted types, the second
    106   // indicates whether the device's capture capabilities should be used.
    107   typedef std::pair<std::vector<base::string16>, bool> AcceptTypes;
    108   AcceptTypes accept_types = std::make_pair(std::vector<base::string16>(),
    109                                             false);
    110 
    111   if (params)
    112     accept_types = *(reinterpret_cast<AcceptTypes*>(params));
    113 
    114   ScopedJavaLocalRef<jobjectArray> accept_types_java =
    115       base::android::ToJavaArrayOfStrings(env, accept_types.first);
    116 
    117   bool accept_multiple_files = SelectFileDialog::SELECT_OPEN_MULTI_FILE == type;
    118 
    119   Java_SelectFileDialog_selectFile(env, java_object_.obj(),
    120                                    accept_types_java.obj(),
    121                                    accept_types.second,
    122                                    accept_multiple_files,
    123                                    owning_window->GetJavaObject().obj());
    124 }
    125 
    126 bool SelectFileDialogImpl::RegisterSelectFileDialog(JNIEnv* env) {
    127   return RegisterNativesImpl(env);
    128 }
    129 
    130 SelectFileDialogImpl::~SelectFileDialogImpl() {
    131 }
    132 
    133 SelectFileDialogImpl::SelectFileDialogImpl(Listener* listener,
    134                                            SelectFilePolicy* policy)
    135     : SelectFileDialog(listener, policy) {
    136   JNIEnv* env = base::android::AttachCurrentThread();
    137   java_object_.Reset(
    138       Java_SelectFileDialog_create(env, reinterpret_cast<intptr_t>(this)));
    139 }
    140 
    141 bool SelectFileDialogImpl::HasMultipleFileTypeChoicesImpl() {
    142   NOTIMPLEMENTED();
    143   return false;
    144 }
    145 
    146 SelectFileDialog* CreateAndroidSelectFileDialog(
    147     SelectFileDialog::Listener* listener,
    148     SelectFilePolicy* policy) {
    149   return SelectFileDialogImpl::Create(listener, policy);
    150 }
    151 
    152 }  // namespace ui
    153