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