Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Side by Side Diff: chrome/browser/chromeos/accessibility/magnification_manager.cc

Issue 11821053: Revert 176087 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/accessibility/magnification_manager.h" 5 #include "chrome/browser/chromeos/accessibility/magnification_manager.h"
6 6
7 #include "ash/magnifier/magnification_controller.h" 7 #include "ash/magnifier/magnification_controller.h"
8 #include "ash/magnifier/partial_magnification_controller.h" 8 #include "ash/magnifier/partial_magnification_controller.h"
9 #include "ash/shell.h" 9 #include "ash/shell.h"
10 #include "ash/system/tray/system_tray_notifier.h" 10 #include "ash/system/tray/system_tray_notifier.h"
(...skipping 16 matching lines...) Expand all
27 namespace { 27 namespace {
28 const double kInitialMagnifiedScale = 2.0; 28 const double kInitialMagnifiedScale = 2.0;
29 static MagnificationManager* g_magnification_manager = NULL; 29 static MagnificationManager* g_magnification_manager = NULL;
30 } 30 }
31 31
32 class MagnificationManagerImpl : public MagnificationManager, 32 class MagnificationManagerImpl : public MagnificationManager,
33 public content::NotificationObserver { 33 public content::NotificationObserver {
34 public: 34 public:
35 MagnificationManagerImpl() : first_time_update_(true), 35 MagnificationManagerImpl() : first_time_update_(true),
36 profile_(NULL), 36 profile_(NULL),
37 type_(ash::kDefaultMagnifierType), 37 type_(ash::MAGNIFIER_OFF) {
38 enabled_(false) {
39 registrar_.Add(this, 38 registrar_.Add(this,
40 chrome::NOTIFICATION_PROFILE_CREATED, 39 chrome::NOTIFICATION_PROFILE_CREATED,
41 content::NotificationService::AllSources()); 40 content::NotificationService::AllSources());
42 registrar_.Add(this, 41 registrar_.Add(this,
43 chrome::NOTIFICATION_SESSION_STARTED, 42 chrome::NOTIFICATION_SESSION_STARTED,
44 content::NotificationService::AllSources()); 43 content::NotificationService::AllSources());
45 registrar_.Add(this, 44 registrar_.Add(this,
46 chrome::NOTIFICATION_PROFILE_DESTROYED, 45 chrome::NOTIFICATION_PROFILE_DESTROYED,
47 content::NotificationService::AllSources()); 46 content::NotificationService::AllSources());
48 registrar_.Add(this, 47 registrar_.Add(this,
49 chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE, 48 chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE,
50 content::NotificationService::AllSources()); 49 content::NotificationService::AllSources());
51 } 50 }
52 51
53 virtual ~MagnificationManagerImpl() { 52 virtual ~MagnificationManagerImpl() {
54 CHECK(this == g_magnification_manager); 53 CHECK(this == g_magnification_manager);
55 } 54 }
56 55
57 // MagnificationManager implimentation: 56 // MagnificationManager implimentation:
58 bool IsMagnifierEnabled() const OVERRIDE { 57 ash::MagnifierType GetMagnifierType() OVERRIDE {
59 return enabled_;
60 }
61
62 ash::MagnifierType GetMagnifierType() const OVERRIDE {
63 return type_; 58 return type_;
64 } 59 }
65 60
66 void SetMagnifierEnabled(bool enabled) OVERRIDE { 61 void SetMagnifier(ash::MagnifierType type) OVERRIDE {
67 // This method may be invoked even when the other magnifier settings (e.g. 62 if (type == type_ && type == ash::MAGNIFIER_OFF)
68 // type or scale) are changed, so we need to call magnification controller
69 // even if |enabled| is unchanged. Only if |enabled| is false and the
70 // magnifier is already disabled, we are sure that we don't need to reflect
71 // the new settings right now because the magnifier keeps disabled.
72 if (!enabled && !enabled_)
73 return; 63 return;
74 64
75 enabled_ = enabled;
76
77 if (profile_) {
78 PrefService* prefs = profile_->GetPrefs();
79 DCHECK(prefs);
80 if (enabled != prefs->GetBoolean(prefs::kScreenMagnifierEnabled)) {
81 prefs->SetBoolean(prefs::kScreenMagnifierEnabled, enabled);
82 prefs->CommitPendingWrite();
83 }
84 }
85
86 NotifyMagnifierChanged();
87
88 if (type_ == ash::MAGNIFIER_FULL) {
89 ash::Shell::GetInstance()->magnification_controller()->SetEnabled(
90 enabled_);
91 } else {
92 ash::Shell::GetInstance()->partial_magnification_controller()->SetEnabled(
93 enabled_);
94 }
95 }
96
97 void SetMagnifierType(ash::MagnifierType type) OVERRIDE {
98 if (type_ == type)
99 return;
100
101 DCHECK(type == ash::MAGNIFIER_FULL || type == ash::MAGNIFIER_PARTIAL);
102 type_ = type; 65 type_ = type;
103 66
104 if (profile_) { 67 if (profile_) {
105 PrefService* prefs = profile_->GetPrefs(); 68 PrefService* prefs = profile_->GetPrefs();
106 DCHECK(prefs); 69 if (prefs) {
107 prefs->SetInteger(prefs::kScreenMagnifierType, type); 70 bool enabled = (type != ash::MAGNIFIER_OFF);
108 prefs->CommitPendingWrite(); 71 if (enabled != prefs->GetBoolean(prefs::kScreenMagnifierEnabled)) {
72 prefs->SetBoolean(prefs::kScreenMagnifierEnabled, enabled);
73 prefs->CommitPendingWrite();
74 }
75 }
109 } 76 }
110 77
111 NotifyMagnifierChanged(); 78 accessibility::AccessibilityStatusEventDetails details(
79 type != ash::MAGNIFIER_OFF, ash::A11Y_NOTIFICATION_NONE);
80 content::NotificationService::current()->Notify(
81 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER,
82 content::NotificationService::AllSources(),
83 content::Details<accessibility::AccessibilityStatusEventDetails>(
84 &details));
112 85
113 if (enabled_) { 86 ash::Shell::GetInstance()->magnification_controller()->SetEnabled(
114 ash::Shell::GetInstance()->magnification_controller()->SetEnabled( 87 type == ash::MAGNIFIER_FULL);
115 type_ == ash::MAGNIFIER_FULL); 88 ash::Shell::GetInstance()->partial_magnification_controller()->SetEnabled(
116 ash::Shell::GetInstance()->partial_magnification_controller()->SetEnabled( 89 type == ash::MAGNIFIER_PARTIAL);
117 type_ == ash::MAGNIFIER_PARTIAL);
118 }
119 } 90 }
120 91
121 void SaveScreenMagnifierScale(double scale) OVERRIDE { 92 void SaveScreenMagnifierScale(double scale) OVERRIDE {
122 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); 93 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
123 DCHECK(profile->GetPrefs());
124 profile->GetPrefs()->SetDouble(prefs::kScreenMagnifierScale, scale); 94 profile->GetPrefs()->SetDouble(prefs::kScreenMagnifierScale, scale);
125 } 95 }
126 96
127 double GetSavedScreenMagnifierScale() const OVERRIDE { 97 double GetSavedScreenMagnifierScale() OVERRIDE {
128 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); 98 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
129 DCHECK(profile->GetPrefs());
130 if (profile->GetPrefs()->HasPrefPath(prefs::kScreenMagnifierScale)) 99 if (profile->GetPrefs()->HasPrefPath(prefs::kScreenMagnifierScale))
131 return profile->GetPrefs()->GetDouble(prefs::kScreenMagnifierScale); 100 return profile->GetPrefs()->GetDouble(prefs::kScreenMagnifierScale);
132 return std::numeric_limits<double>::min(); 101 return std::numeric_limits<double>::min();
133 } 102 }
134 103
135 private: 104 private:
136 void NotifyMagnifierChanged() {
137 accessibility::AccessibilityStatusEventDetails details(
138 enabled_, type_, ash::A11Y_NOTIFICATION_NONE);
139 content::NotificationService::current()->Notify(
140 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER,
141 content::NotificationService::AllSources(),
142 content::Details<accessibility::AccessibilityStatusEventDetails>(
143 &details));
144 }
145
146 bool IsMagnifierEnabledFromPref() {
147 if (!profile_)
148 return false;
149
150 DCHECK(profile_->GetPrefs());
151 return profile_->GetPrefs()->GetBoolean(prefs::kScreenMagnifierEnabled);
152 }
153
154 ash::MagnifierType GetMagnifierTypeFromPref() { 105 ash::MagnifierType GetMagnifierTypeFromPref() {
155 if (!profile_) 106 if (!profile_)
156 return ash::kDefaultMagnifierType; 107 return ash::MAGNIFIER_OFF;
157 108
158 DCHECK(profile_->GetPrefs()); 109 PrefService* prefs = profile_->GetPrefs();
159 ash::MagnifierType type = static_cast<ash::MagnifierType>( 110 if (!prefs)
160 profile_->GetPrefs()->GetInteger(prefs::kScreenMagnifierType)); 111 return ash::MAGNIFIER_OFF;
161 112
162 if (type == ash::MAGNIFIER_FULL || type == ash::MAGNIFIER_PARTIAL) 113 return prefs->GetBoolean(prefs::kScreenMagnifierEnabled) ?
163 return type; 114 ash::MAGNIFIER_FULL : ash::MAGNIFIER_OFF;
164
165 return ash::kDefaultMagnifierType;
166 } 115 }
167 116
168 void SetProfile(Profile* profile) { 117 void SetProfile(Profile* profile) {
169 if (pref_change_registrar_) { 118 if (pref_change_registrar_) {
170 pref_change_registrar_.reset(); 119 pref_change_registrar_.reset();
171 } 120 }
172 121
173 if (profile) { 122 if (profile) {
174 pref_change_registrar_.reset(new PrefChangeRegistrar); 123 pref_change_registrar_.reset(new PrefChangeRegistrar);
175 pref_change_registrar_->Init(profile->GetPrefs()); 124 pref_change_registrar_->Init(profile->GetPrefs());
176 pref_change_registrar_->Add( 125 pref_change_registrar_->Add(
177 prefs::kScreenMagnifierEnabled, 126 prefs::kScreenMagnifierEnabled,
178 base::Bind(&MagnificationManagerImpl::UpdateMagnifierStatusFromPref, 127 base::Bind(&MagnificationManagerImpl::UpdateMagnifierStatus,
179 base::Unretained(this)));
180 pref_change_registrar_->Add(
181 prefs::kScreenMagnifierType,
182 base::Bind(&MagnificationManagerImpl::UpdateMagnifierStatusFromPref,
183 base::Unretained(this))); 128 base::Unretained(this)));
184 } 129 }
185 130
186 profile_ = profile; 131 profile_ = profile;
187 UpdateMagnifierStatusFromPref(); 132 UpdateMagnifierStatus();
188 } 133 }
189 134
190 void UpdateMagnifierStatusFromPref() { 135 void UpdateMagnifierStatus() {
191 bool enabled = IsMagnifierEnabledFromPref(); 136 ash::MagnifierType type = GetMagnifierTypeFromPref();
192 if (!enabled) { 137 SetMagnifier(type);
193 SetMagnifierEnabled(enabled);
194 SetMagnifierType(GetMagnifierTypeFromPref());
195 } else {
196 SetMagnifierType(GetMagnifierTypeFromPref());
197 SetMagnifierEnabled(enabled);
198 }
199 } 138 }
200 139
201 // content::NotificationObserver implimentation: 140 // content::NotificationObserver implimentation:
202 virtual void Observe(int type, 141 virtual void Observe(int type,
203 const content::NotificationSource& source, 142 const content::NotificationSource& source,
204 const content::NotificationDetails& details) OVERRIDE { 143 const content::NotificationDetails& details) OVERRIDE {
205 switch (type) { 144 switch (type) {
206 // When entering the login screen or non-guest desktop. 145 // When entering the login screen or non-guest desktop.
207 case chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE: 146 case chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE:
208 case chrome::NOTIFICATION_SESSION_STARTED: { 147 case chrome::NOTIFICATION_SESSION_STARTED: {
(...skipping 13 matching lines...) Expand all
222 case chrome::NOTIFICATION_PROFILE_DESTROYED: { 161 case chrome::NOTIFICATION_PROFILE_DESTROYED: {
223 SetProfile(NULL); 162 SetProfile(NULL);
224 break; 163 break;
225 } 164 }
226 } 165 }
227 } 166 }
228 167
229 bool first_time_update_; 168 bool first_time_update_;
230 Profile* profile_; 169 Profile* profile_;
231 ash::MagnifierType type_; 170 ash::MagnifierType type_;
232 bool enabled_;
233 content::NotificationRegistrar registrar_; 171 content::NotificationRegistrar registrar_;
234 scoped_ptr<PrefChangeRegistrar> pref_change_registrar_; 172 scoped_ptr<PrefChangeRegistrar> pref_change_registrar_;
235 173
236 DISALLOW_COPY_AND_ASSIGN(MagnificationManagerImpl); 174 DISALLOW_COPY_AND_ASSIGN(MagnificationManagerImpl);
237 }; 175 };
238 176
239 // static 177 // static
240 void MagnificationManager::Initialize() { 178 void MagnificationManager::Initialize() {
241 CHECK(g_magnification_manager == NULL); 179 CHECK(g_magnification_manager == NULL);
242 g_magnification_manager = new MagnificationManagerImpl(); 180 g_magnification_manager = new MagnificationManagerImpl();
243 } 181 }
244 182
245 // static 183 // static
246 void MagnificationManager::Shutdown() { 184 void MagnificationManager::Shutdown() {
247 CHECK(g_magnification_manager); 185 CHECK(g_magnification_manager);
248 delete g_magnification_manager; 186 delete g_magnification_manager;
249 g_magnification_manager = NULL; 187 g_magnification_manager = NULL;
250 } 188 }
251 189
252 // static 190 // static
253 MagnificationManager* MagnificationManager::Get() { 191 MagnificationManager* MagnificationManager::Get() {
254 return g_magnification_manager; 192 return g_magnification_manager;
255 } 193 }
256 194
257 } // namespace chromeos 195 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698