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

Unified Diff: chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc

Issue 2391253004: Use mojo Shelf interfaces for both mash and classic ash. (Closed)
Patch Set: Address comments. Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index fc449710294349a639917781960c42b219c9c39d..c2381343c78fe4374f6810b7ed9b70ad469c38eb 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -4,6 +4,18 @@
#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/extensions/extension_app_icon_loader.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_icon_loader.h"
+#include "chrome/browser/ui/ash/ash_util.h"
+#include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
+#include "content/public/common/service_manager_connection.h"
+#include "services/shell/public/cpp/connector.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
+
// static
ChromeLauncherController* ChromeLauncherController::instance_ = nullptr;
@@ -12,4 +24,165 @@ ChromeLauncherController::~ChromeLauncherController() {
instance_ = nullptr;
}
-ChromeLauncherController::ChromeLauncherController() {}
+void ChromeLauncherController::LaunchApp(const std::string& app_id,
+ ash::LaunchSource source,
+ int event_flags) {
+ launcher_controller_helper_->LaunchApp(app_id, source, event_flags);
+}
+
+ChromeLauncherController::ChromeLauncherController() : observer_binding_(this) {
+ DCHECK(!instance_);
+ instance_ = this;
+ // Start observing the shelf controller immediately.
+ if (ConnectToShelfController()) {
+ ash::mojom::ShelfObserverAssociatedPtrInfo ptr_info;
+ observer_binding_.Bind(&ptr_info, shelf_controller_.associated_group());
+ shelf_controller_->AddObserver(std::move(ptr_info));
+ }
+}
+
+bool ChromeLauncherController::ConnectToShelfController() {
+ if (shelf_controller_.is_bound())
+ return true;
+
+ auto connection = content::ServiceManagerConnection::GetForProcess();
+ auto connector = connection ? connection->GetConnector() : nullptr;
+ // Unit tests may not have a connector.
+ if (!connector)
+ return false;
+
+ // Under mash the ShelfController interface is in the ash process. In classic
+ // ash we provide it to ourself.
+ if (chrome::IsRunningInMash()) {
+ connector->ConnectToInterface("service:ash", &shelf_controller_);
+ } else {
+ connector->ConnectToInterface("service:content_browser",
+ &shelf_controller_);
+ }
+ return true;
+}
+
+AppIconLoader* ChromeLauncherController::GetAppIconLoaderForApp(
+ const std::string& app_id) {
+ for (const auto& app_icon_loader : app_icon_loaders_) {
+ if (app_icon_loader->CanLoadImageForApp(app_id))
+ return app_icon_loader.get();
+ }
+
+ return nullptr;
+}
+
+void ChromeLauncherController::SetShelfAutoHideBehaviorFromPrefs() {
+ if (!ConnectToShelfController())
+ return;
+
+ // The pref helper functions return default values for invalid display ids.
+ PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
+ for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) {
+ shelf_controller_->SetAutoHideBehavior(
+ ash::launcher::GetShelfAutoHideBehaviorPref(prefs, display.id()),
+ display.id());
+ }
+}
+
+void ChromeLauncherController::SetShelfAlignmentFromPrefs() {
+ if (!ConnectToShelfController())
+ return;
+
+ // The pref helper functions return default values for invalid display ids.
+ PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
+ for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) {
+ shelf_controller_->SetAlignment(
+ ash::launcher::GetShelfAlignmentPref(prefs, display.id()),
+ display.id());
+ }
+}
+
+void ChromeLauncherController::SetShelfBehaviorsFromPrefs() {
+ SetShelfAutoHideBehaviorFromPrefs();
+ SetShelfAlignmentFromPrefs();
+}
+
+void ChromeLauncherController::SetLauncherControllerHelperForTest(
+ std::unique_ptr<LauncherControllerHelper> helper) {
+ launcher_controller_helper_ = std::move(helper);
+}
+
+void ChromeLauncherController::SetAppIconLoadersForTest(
+ std::vector<std::unique_ptr<AppIconLoader>>& loaders) {
+ app_icon_loaders_.clear();
+ for (auto& loader : loaders)
+ app_icon_loaders_.push_back(std::move(loader));
+}
+
+void ChromeLauncherController::SetProfileForTest(Profile* profile) {
+ profile_ = profile;
+}
+
+void ChromeLauncherController::AttachProfile(Profile* profile_to_attach) {
+ profile_ = profile_to_attach;
+ // Either add the profile to the list of known profiles and make it the active
+ // one for some functions of LauncherControllerHelper or create a new one.
+ if (!launcher_controller_helper_.get()) {
+ launcher_controller_helper_ =
+ base::MakeUnique<LauncherControllerHelper>(profile_);
+ } else {
+ launcher_controller_helper_->set_profile(profile_);
+ }
+
+ // TODO(skuhne): The AppIconLoaderImpl has the same problem. Each loaded
+ // image is associated with a profile (its loader requires the profile).
+ // Since icon size changes are possible, the icon could be requested to be
+ // reloaded. However - having it not multi profile aware would cause problems
+ // if the icon cache gets deleted upon user switch.
+ std::unique_ptr<AppIconLoader> extension_app_icon_loader =
+ base::MakeUnique<extensions::ExtensionAppIconLoader>(
+ profile_, extension_misc::EXTENSION_ICON_SMALL, this);
+ app_icon_loaders_.push_back(std::move(extension_app_icon_loader));
+
+ if (arc::ArcAuthService::IsAllowedForProfile(profile_)) {
+ std::unique_ptr<AppIconLoader> arc_app_icon_loader =
+ base::MakeUnique<ArcAppIconLoader>(
+ profile_, extension_misc::EXTENSION_ICON_SMALL, this);
+ app_icon_loaders_.push_back(std::move(arc_app_icon_loader));
+ }
+}
+
+void ChromeLauncherController::OnShelfCreated(int64_t display_id) {
+ if (!ConnectToShelfController())
+ return;
+
+ // The pref helper functions return default values for invalid display ids.
+ PrefService* prefs = profile_->GetPrefs();
+ shelf_controller_->SetAlignment(
+ ash::launcher::GetShelfAlignmentPref(prefs, display_id), display_id);
+ shelf_controller_->SetAutoHideBehavior(
+ ash::launcher::GetShelfAutoHideBehaviorPref(prefs, display_id),
+ display_id);
+}
+
+void ChromeLauncherController::OnAlignmentChanged(ash::ShelfAlignment alignment,
+ int64_t display_id) {
+ // The locked alignment is set temporarily and not saved to preferences.
+ if (alignment == ash::SHELF_ALIGNMENT_BOTTOM_LOCKED)
+ return;
+ // This will uselessly store a preference value for invalid display ids.
+ // TODO(msw): Avoid handling this pref change and forwarding the value to ash.
+ ash::launcher::SetShelfAlignmentPref(profile_->GetPrefs(), display_id,
+ alignment);
+}
+
+void ChromeLauncherController::OnAutoHideBehaviorChanged(
+ ash::ShelfAutoHideBehavior auto_hide,
+ int64_t display_id) {
+ // This will uselessly store a preference value for invalid display ids.
+ // TODO(msw): Avoid handling this pref change and forwarding the value to ash.
+ ash::launcher::SetShelfAutoHideBehaviorPref(profile_->GetPrefs(), display_id,
+ auto_hide);
+}
+
+void ChromeLauncherController::OnAppImageUpdated(const std::string& app_id,
+ const gfx::ImageSkia& image) {
+ // Implemented by subclasses; this should not be called.
+ NOTREACHED();
+}

Powered by Google App Engine
This is Rietveld 408576698