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

Side by Side Diff: chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc

Issue 11418114: Add policy for ash launcher auto-hide behavior (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 8 years 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/ui/ash/launcher/chrome_launcher_controller_per_app.h" 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "ash/launcher/launcher_model.h" 9 #include "ash/launcher/launcher_model.h"
10 #include "ash/shell.h" 10 #include "ash/shell.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 120
121 // If the value of the pref at |local_path is not empty, it is returned 121 // If the value of the pref at |local_path is not empty, it is returned
122 // otherwise the value of the pref at |synced_path| is returned. 122 // otherwise the value of the pref at |synced_path| is returned.
123 std::string GetLocalOrRemotePref(PrefService* pref_service, 123 std::string GetLocalOrRemotePref(PrefService* pref_service,
124 const char* local_path, 124 const char* local_path,
125 const char* synced_path) { 125 const char* synced_path) {
126 const std::string value(pref_service->GetString(local_path)); 126 const std::string value(pref_service->GetString(local_path));
127 return value.empty() ? pref_service->GetString(synced_path) : value; 127 return value.empty() ? pref_service->GetString(synced_path) : value;
128 } 128 }
129 129
130 // If prefs have synced and the pref value at |local_path| is empty the value 130 // If prefs have synced and no user-set value exists at |local_path|, the value
131 // from |synced_path| is copied to |local_path|. 131 // from |synced_path| is copied to |local_path|.
132 void MaybePropagatePrefToLocal(PrefService* pref_service, 132 void MaybePropagatePrefToLocal(PrefService* pref_service,
133 const char* local_path, 133 const char* local_path,
134 const char* synced_path) { 134 const char* synced_path) {
135 if (pref_service->GetString(local_path).empty() && 135 if (!pref_service->FindPreference(local_path)->HasUserSetting() &&
136 pref_service->IsSyncing()) { 136 pref_service->IsSyncing()) {
137 // First time the user is using this machine, propagate from remote to 137 // First time the user is using this machine, propagate from remote to
138 // local. 138 // local.
139 pref_service->SetString(local_path, pref_service->GetString(synced_path)); 139 pref_service->SetString(local_path, pref_service->GetString(synced_path));
140 } 140 }
141 } 141 }
142 142
143 } // namespace 143 } // namespace
144 144
145 // ChromeLauncherControllerPerApp --------------------------------------------- 145 // ChromeLauncherControllerPerApp ---------------------------------------------
(...skipping 24 matching lines...) Expand all
170 chrome::NOTIFICATION_EXTENSION_LOADED, 170 chrome::NOTIFICATION_EXTENSION_LOADED,
171 content::Source<Profile>(profile_)); 171 content::Source<Profile>(profile_));
172 notification_registrar_.Add(this, 172 notification_registrar_.Add(this,
173 chrome::NOTIFICATION_EXTENSION_UNLOADED, 173 chrome::NOTIFICATION_EXTENSION_UNLOADED,
174 content::Source<Profile>(profile_)); 174 content::Source<Profile>(profile_));
175 pref_change_registrar_.Init(profile_->GetPrefs()); 175 pref_change_registrar_.Init(profile_->GetPrefs());
176 pref_change_registrar_.Add( 176 pref_change_registrar_.Add(
177 prefs::kPinnedLauncherApps, 177 prefs::kPinnedLauncherApps,
178 base::Bind(&ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref, 178 base::Bind(&ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref,
179 base::Unretained(this))); 179 base::Unretained(this)));
180 pref_change_registrar_.Add(
181 prefs::kShelfAlignmentLocal,
182 base::Bind(&ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs,
183 base::Unretained(this)));
184 pref_change_registrar_.Add(
185 prefs::kShelfAutoHideBehaviorLocal,
186 base::Bind(&ChromeLauncherControllerPerApp::
187 SetShelfAutoHideBehaviorFromPrefs,
188 base::Unretained(this)));
180 } 189 }
181 190
182 ChromeLauncherControllerPerApp::~ChromeLauncherControllerPerApp() { 191 ChromeLauncherControllerPerApp::~ChromeLauncherControllerPerApp() {
183 // Reset the shell window controller here since it has a weak pointer to this. 192 // Reset the shell window controller here since it has a weak pointer to this.
184 shell_window_controller_.reset(); 193 shell_window_controller_.reset();
185 194
186 model_->RemoveObserver(this); 195 model_->RemoveObserver(this);
187 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); 196 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin();
188 i != id_to_item_controller_map_.end(); ++i) { 197 i != id_to_item_controller_map_.end(); ++i) {
189 i->second->OnRemoved(); 198 i->second->OnRemoved();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 updater.Get()->Clear(); 232 updater.Get()->Clear();
224 } 233 }
225 234
226 UpdateAppLaunchersFromPref(); 235 UpdateAppLaunchersFromPref();
227 236
228 // TODO(sky): update unit test so that this test isn't necessary. 237 // TODO(sky): update unit test so that this test isn't necessary.
229 if (ash::Shell::HasInstance()) { 238 if (ash::Shell::HasInstance()) {
230 SetShelfAutoHideBehaviorFromPrefs(); 239 SetShelfAutoHideBehaviorFromPrefs();
231 SetShelfAlignmentFromPrefs(); 240 SetShelfAlignmentFromPrefs();
232 PrefService* prefs = profile_->GetPrefs(); 241 PrefService* prefs = profile_->GetPrefs();
233 if (prefs->GetString(prefs::kShelfAlignmentLocal).empty() || 242 if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() ||
234 prefs->GetString(prefs::kShelfAutoHideBehaviorLocal).empty()) { 243 !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal)->
244 HasUserSetting()) {
235 // This causes OnIsSyncingChanged to be called when the value of 245 // This causes OnIsSyncingChanged to be called when the value of
236 // PrefService::IsSyncing() changes. 246 // PrefService::IsSyncing() changes.
237 prefs->AddObserver(this); 247 prefs->AddObserver(this);
238 } 248 }
239 ash::Shell::GetInstance()->AddShellObserver(this); 249 ash::Shell::GetInstance()->AddShellObserver(this);
240 } 250 }
241 } 251 }
242 252
243 ash::LauncherID ChromeLauncherControllerPerApp::CreateTabbedLauncherItem( 253 ash::LauncherID ChromeLauncherControllerPerApp::CreateTabbedLauncherItem(
244 LauncherItemController* controller, 254 LauncherItemController* controller,
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 void ChromeLauncherControllerPerApp::CreateNewIncognitoWindow() { 566 void ChromeLauncherControllerPerApp::CreateNewIncognitoWindow() {
557 chrome::NewEmptyWindow(GetProfileForNewWindows()->GetOffTheRecordProfile()); 567 chrome::NewEmptyWindow(GetProfileForNewWindows()->GetOffTheRecordProfile());
558 } 568 }
559 569
560 bool ChromeLauncherControllerPerApp::CanPin() const { 570 bool ChromeLauncherControllerPerApp::CanPin() const {
561 const PrefService::Preference* pref = 571 const PrefService::Preference* pref =
562 profile_->GetPrefs()->FindPreference(prefs::kPinnedLauncherApps); 572 profile_->GetPrefs()->FindPreference(prefs::kPinnedLauncherApps);
563 return pref && pref->IsUserModifiable(); 573 return pref && pref->IsUserModifiable();
564 } 574 }
565 575
566 void ChromeLauncherControllerPerApp::SetAutoHideBehavior( 576 ash::ShelfAutoHideBehavior
567 ash::ShelfAutoHideBehavior behavior, 577 ChromeLauncherControllerPerApp::GetShelfAutoHideBehavior(
578 aura::RootWindow* root_window) const {
579 // TODO(oshima): Support multiple launchers.
580
581 // See comment in |kShelfAlignment| as to why we consider two prefs.
582 const std::string behavior_value(
583 GetLocalOrRemotePref(profile_->GetPrefs(),
584 prefs::kShelfAutoHideBehaviorLocal,
585 prefs::kShelfAutoHideBehavior));
586
587 // Note: To maintain sync compatibility with old images of chrome/chromeos
588 // the set of values that may be encountered includes the now-extinct
589 // "Default" as well as "Never" and "Always", "Default" should now
590 // be treated as "Never" (http://crbug.com/146773).
591 if (behavior_value == ash::kShelfAutoHideBehaviorAlways)
592 return ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
593 return ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
594 }
595
596 bool ChromeLauncherControllerPerApp::CanUserModifyShelfAutoHideBehavior(
597 aura::RootWindow* root_window) const {
598 // TODO(oshima): Support multiple launchers.
599 return profile_->GetPrefs()->
600 FindPreference(prefs::kShelfAutoHideBehaviorLocal)->IsUserModifiable();
601 }
602
603 void ChromeLauncherControllerPerApp::ToggleShelfAutoHideBehavior(
568 aura::RootWindow* root_window) { 604 aura::RootWindow* root_window) {
569 ash::Shell::GetInstance()->SetShelfAutoHideBehavior( 605 ash::ShelfAutoHideBehavior behavior = GetShelfAutoHideBehavior(root_window) ==
570 behavior, 606 ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ?
571 root_window); 607 ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER :
572 // TODO(oshima): Support multiple launcher. 608 ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
573 if (root_window != ash::Shell::GetPrimaryRootWindow()) 609 SetShelfAutoHideBehaviorPrefs(behavior, root_window);
574 return; 610 return;
575
576 const char* value = NULL;
577 switch (behavior) {
578 case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
579 value = ash::kShelfAutoHideBehaviorAlways;
580 break;
581 case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
582 value = ash::kShelfAutoHideBehaviorNever;
583 break;
584 }
585 // See comment in |kShelfAlignment| about why we have two prefs here.
586 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value);
587 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value);
588 } 611 }
589 612
590 void ChromeLauncherControllerPerApp::RemoveTabFromRunningApp( 613 void ChromeLauncherControllerPerApp::RemoveTabFromRunningApp(
591 TabContents* tab, 614 TabContents* tab,
592 const std::string& app_id) { 615 const std::string& app_id) {
593 tab_contents_to_app_id_.erase(tab); 616 tab_contents_to_app_id_.erase(tab);
594 AppIDToTabContentsListMap::iterator i_app_id = 617 AppIDToTabContentsListMap::iterator i_app_id =
595 app_id_to_tab_contents_list_.find(app_id); 618 app_id_to_tab_contents_list_.find(app_id);
596 if (i_app_id != app_id_to_tab_contents_list_.end()) { 619 if (i_app_id != app_id_to_tab_contents_list_.end()) {
597 TabContentsList* tab_list = &i_app_id->second; 620 TabContentsList* tab_list = &i_app_id->second;
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 LauncherItemClosed(item.id); 997 LauncherItemClosed(item.id);
975 else 998 else
976 ++index; 999 ++index;
977 } 1000 }
978 1001
979 // Append unprocessed items from the pref to the end of the model. 1002 // Append unprocessed items from the pref to the end of the model.
980 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) 1003 for (; pref_app_id != pinned_apps.end(); ++pref_app_id)
981 DoPinAppWithID(*pref_app_id); 1004 DoPinAppWithID(*pref_app_id);
982 } 1005 }
983 1006
1007 void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorPrefs(
1008 ash::ShelfAutoHideBehavior behavior,
1009 aura::RootWindow* root_window) {
1010 // TODO(oshima): Support multiple launchers.
1011 if (root_window != ash::Shell::GetPrimaryRootWindow())
1012 return;
1013
1014 const char* value = NULL;
1015 switch (behavior) {
1016 case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS:
1017 value = ash::kShelfAutoHideBehaviorAlways;
1018 break;
1019 case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER:
1020 value = ash::kShelfAutoHideBehaviorNever;
1021 break;
1022 }
1023 // See comment in |kShelfAlignment| about why we have two prefs here.
1024 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value);
1025 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value);
1026 }
1027
984 void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorFromPrefs() { 1028 void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorFromPrefs() {
985 // See comment in |kShelfAlignment| as to why we consider two prefs.
986 const std::string behavior_value(
987 GetLocalOrRemotePref(profile_->GetPrefs(),
988 prefs::kShelfAutoHideBehaviorLocal,
989 prefs::kShelfAutoHideBehavior));
990
991 // Note: To maintain sync compatibility with old images of chrome/chromeos
992 // the set of values that may be encountered includes the now-extinct
993 // "Default" as well as "Never" and "Always", "Default" should now
994 // be treated as "Never".
995 // (http://code.google.com/p/chromium/issues/detail?id=146773)
996 ash::ShelfAutoHideBehavior behavior =
997 ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER;
998 if (behavior_value == ash::kShelfAutoHideBehaviorAlways)
999 behavior = ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
1000 // TODO(oshima): Support multiple displays. 1029 // TODO(oshima): Support multiple displays.
1030 aura::RootWindow* root_window = ash::Shell::GetPrimaryRootWindow();
1001 ash::Shell::GetInstance()->SetShelfAutoHideBehavior( 1031 ash::Shell::GetInstance()->SetShelfAutoHideBehavior(
1002 behavior, ash::Shell::GetPrimaryRootWindow()); 1032 GetShelfAutoHideBehavior(root_window), root_window);
1003 } 1033 }
1004 1034
1005 void ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs() { 1035 void ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs() {
1006 if (!CommandLine::ForCurrentProcess()->HasSwitch( 1036 if (!CommandLine::ForCurrentProcess()->HasSwitch(
1007 switches::kShowLauncherAlignmentMenu)) 1037 switches::kShowLauncherAlignmentMenu))
1008 return; 1038 return;
1009 1039
1010 // See comment in |kShelfAlignment| as to why we consider two prefs. 1040 // See comment in |kShelfAlignment| as to why we consider two prefs.
1011 const std::string alignment_value( 1041 const std::string alignment_value(
1012 GetLocalOrRemotePref(profile_->GetPrefs(), 1042 GetLocalOrRemotePref(profile_->GetPrefs(),
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 void ChromeLauncherControllerPerApp::SetAppIconLoaderForTest( 1122 void ChromeLauncherControllerPerApp::SetAppIconLoaderForTest(
1093 AppIconLoader* loader) { 1123 AppIconLoader* loader) {
1094 app_icon_loader_.reset(loader); 1124 app_icon_loader_.reset(loader);
1095 } 1125 }
1096 1126
1097 const std::string& 1127 const std::string&
1098 ChromeLauncherControllerPerApp::GetAppIdFromLauncherIdForTest( 1128 ChromeLauncherControllerPerApp::GetAppIdFromLauncherIdForTest(
1099 ash::LauncherID id) { 1129 ash::LauncherID id) {
1100 return id_to_item_controller_map_[id]->app_id(); 1130 return id_to_item_controller_map_[id]->app_id();
1101 } 1131 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698