1// Copyright (c) 2011 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 "chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h"
6
7#include "base/callback.h"
8#include "base/path_service.h"
9#include "base/values.h"
10#include "chrome/browser/chromeos/login/default_user_images.h"
11#include "chrome/browser/chromeos/login/user_manager.h"
12#include "chrome/browser/chromeos/options/take_photo_dialog.h"
13#include "chrome/browser/ui/browser_list.h"
14#include "chrome/browser/ui/browser_window.h"
15#include "chrome/browser/ui/views/window.h"
16#include "chrome/common/chrome_paths.h"
17#include "grit/generated_resources.h"
18#include "grit/theme_resources.h"
19#include "third_party/skia/include/core/SkBitmap.h"
20#include "ui/base/l10n/l10n_util.h"
21#include "ui/base/resource/resource_bundle.h"
22#include "views/window/window.h"
23
24namespace chromeos {
25
26namespace {
27
28// Returns info about extensions for files we support as user images.
29SelectFileDialog::FileTypeInfo GetUserImageFileTypeInfo() {
30  SelectFileDialog::FileTypeInfo file_type_info;
31  file_type_info.extensions.resize(5);
32
33  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("bmp"));
34
35  file_type_info.extensions[1].push_back(FILE_PATH_LITERAL("gif"));
36
37  file_type_info.extensions[2].push_back(FILE_PATH_LITERAL("jpg"));
38  file_type_info.extensions[2].push_back(FILE_PATH_LITERAL("jpeg"));
39
40  file_type_info.extensions[3].push_back(FILE_PATH_LITERAL("png"));
41
42  file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tif"));
43  file_type_info.extensions[4].push_back(FILE_PATH_LITERAL("tiff"));
44
45  return file_type_info;
46}
47
48}  // namespace
49
50ChangePictureOptionsHandler::ChangePictureOptionsHandler() {
51}
52
53ChangePictureOptionsHandler::~ChangePictureOptionsHandler() {
54  if (select_file_dialog_.get())
55    select_file_dialog_->ListenerDestroyed();
56}
57
58void ChangePictureOptionsHandler::GetLocalizedValues(
59    DictionaryValue* localized_strings) {
60  DCHECK(localized_strings);
61  localized_strings->SetString("changePicturePage",
62      l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TITLE));
63  localized_strings->SetString("changePicturePageDescription",
64      l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT));
65  localized_strings->SetString("takePhoto",
66      l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO));
67  localized_strings->SetString("chooseFile",
68      l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_CHOOSE_FILE));
69}
70
71void ChangePictureOptionsHandler::RegisterMessages() {
72  DCHECK(web_ui_);
73  web_ui_->RegisterMessageCallback(
74      "chooseFile",
75      NewCallback(this, &ChangePictureOptionsHandler::ChooseFile));
76  web_ui_->RegisterMessageCallback(
77      "takePhoto",
78      NewCallback(this, &ChangePictureOptionsHandler::TakePhoto));
79  web_ui_->RegisterMessageCallback(
80      "getAvailableImages",
81      NewCallback(this, &ChangePictureOptionsHandler::GetAvailableImages));
82  web_ui_->RegisterMessageCallback(
83      "selectImage",
84      NewCallback(this, &ChangePictureOptionsHandler::SelectImage));
85}
86
87void ChangePictureOptionsHandler::ChooseFile(const ListValue* args) {
88  DCHECK(args && args->empty());
89  if (!select_file_dialog_.get())
90    select_file_dialog_ = SelectFileDialog::Create(this);
91
92  FilePath downloads_path;
93  if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &downloads_path)) {
94    NOTREACHED();
95    return;
96  }
97
98  // Static so we initialize it only once.
99  static SelectFileDialog::FileTypeInfo file_type_info =
100      GetUserImageFileTypeInfo();
101
102  select_file_dialog_->SelectFile(
103      SelectFileDialog::SELECT_OPEN_FILE,
104      l10n_util::GetStringUTF16(IDS_DOWNLOAD_TITLE),
105      downloads_path,
106      &file_type_info,
107      0,
108      FILE_PATH_LITERAL(""),
109      web_ui_->tab_contents(),
110      GetBrowserWindow(),
111      NULL);
112}
113
114void ChangePictureOptionsHandler::TakePhoto(const ListValue* args) {
115  DCHECK(args && args->empty());
116  views::Window* window = browser::CreateViewsWindow(
117      GetBrowserWindow(),
118      gfx::Rect(),
119      new TakePhotoDialog());
120  window->SetIsAlwaysOnTop(true);
121  window->Show();
122}
123
124void ChangePictureOptionsHandler::GetAvailableImages(const ListValue* args) {
125  DCHECK(args && args->empty());
126  ListValue image_urls;
127  for (int i = 0; i < kDefaultImagesCount; ++i) {
128    image_urls.Append(new StringValue(GetDefaultImageUrl(i)));
129  }
130  web_ui_->CallJavascriptFunction("ChangePictureOptions.addUserImages",
131                                  image_urls);
132}
133
134void ChangePictureOptionsHandler::SelectImage(const ListValue* args) {
135  std::string image_url;
136  if (!args ||
137      args->GetSize() != 1 ||
138      !args->GetString(0, &image_url)) {
139    NOTREACHED();
140    return;
141  }
142  int user_image_index = -1;
143  if (!IsDefaultImageUrl(image_url, &user_image_index))
144    return;
145
146  const SkBitmap* image = ResourceBundle::GetSharedInstance().GetBitmapNamed(
147          kDefaultImageResources[user_image_index]);
148  UserManager* user_manager = UserManager::Get();
149  user_manager->SetLoggedInUserImage(*image);
150  user_manager->SaveUserImagePath(
151      user_manager->logged_in_user().email(),
152      GetDefaultImagePath(user_image_index));
153}
154
155void ChangePictureOptionsHandler::FileSelected(const FilePath& path,
156                                               int index,
157                                               void* params) {
158  UserManager::Get()->LoadLoggedInUserImage(path);
159}
160
161gfx::NativeWindow ChangePictureOptionsHandler::GetBrowserWindow() const {
162  Browser* browser = BrowserList::FindBrowserWithProfile(web_ui_->GetProfile());
163  if (!browser)
164    return NULL;
165  return browser->window()->GetNativeHandle();
166}
167
168}  // namespace chromeos
169