• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
24 namespace chromeos {
25 
26 namespace {
27 
28 // Returns info about extensions for files we support as user images.
GetUserImageFileTypeInfo()29 SelectFileDialog::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 
ChangePictureOptionsHandler()50 ChangePictureOptionsHandler::ChangePictureOptionsHandler() {
51 }
52 
~ChangePictureOptionsHandler()53 ChangePictureOptionsHandler::~ChangePictureOptionsHandler() {
54   if (select_file_dialog_.get())
55     select_file_dialog_->ListenerDestroyed();
56 }
57 
GetLocalizedValues(DictionaryValue * localized_strings)58 void 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 
RegisterMessages()71 void 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 
ChooseFile(const ListValue * args)87 void 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 
TakePhoto(const ListValue * args)114 void 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 
GetAvailableImages(const ListValue * args)124 void 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 
SelectImage(const ListValue * args)134 void 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 
FileSelected(const FilePath & path,int index,void * params)155 void ChangePictureOptionsHandler::FileSelected(const FilePath& path,
156                                                int index,
157                                                void* params) {
158   UserManager::Get()->LoadLoggedInUserImage(path);
159 }
160 
GetBrowserWindow() const161 gfx::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