Chromium Code Reviews| Index: chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
| diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
| index 4257b96d5bf7dd00a8aadf47818886bee9635631..80e7eb4e91d53bd9e77712503fbc5fa1d5de0397 100644 |
| --- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
| +++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
| @@ -14,8 +14,11 @@ |
| #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" |
| #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_item_controller.h" |
| #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
| +#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" |
| #include "components/arc/arc_bridge_service.h" |
| #include "components/exo/shell_surface.h" |
| +#include "components/signin/core/account_id/account_id.h" |
| +#include "components/user_manager/user_manager.h" |
| #include "ui/aura/client/aura_constants.h" |
| #include "ui/aura/env.h" |
| #include "ui/base/base_window.h" |
| @@ -36,8 +39,10 @@ std::string GetShelfAppId(const std::string& app_id) { |
| class ArcAppWindowLauncherController::AppWindow : public ui::BaseWindow { |
| public: |
| - AppWindow(int task_id, ArcAppWindowLauncherController* owner) |
| - : task_id_(task_id), owner_(owner) {} |
| + AppWindow(int task_id, |
| + const std::string app_id, |
| + ArcAppWindowLauncherController* owner) |
| + : task_id_(task_id), app_id_(app_id), owner_(owner) {} |
| ~AppWindow() {} |
| void SetController(ArcAppWindowLauncherItemController* controller) { |
| @@ -64,6 +69,8 @@ class ArcAppWindowLauncherController::AppWindow : public ui::BaseWindow { |
| ArcAppWindowLauncherItemController* controller() { return controller_; } |
| + const std::string app_id() { return app_id_; } |
| + |
| // ui::BaseWindow: |
| bool IsActive() const override { |
| return widget_ && widget_->IsActive() && |
| @@ -167,6 +174,7 @@ class ArcAppWindowLauncherController::AppWindow : public ui::BaseWindow { |
| int task_id_; |
| ash::ShelfID shelf_id_ = 0; |
| + std::string app_id_; |
| FullScreenMode fullscreen_mode_ = FullScreenMode::NOT_DEFINED; |
| // Unowned pointers |
| ArcAppWindowLauncherController* owner_; |
| @@ -193,8 +201,18 @@ ArcAppWindowLauncherController::~ArcAppWindowLauncherController() { |
| void ArcAppWindowLauncherController::ActiveUserChanged( |
| const std::string& user_email) { |
| - // TODO(xdai): Traverse the Arc App list to show / hide the apps one by one |
| - // if there are Arc Apps running. |
| + for (auto& it : task_id_to_app_window_) { |
| + AppWindow* app_window = it.second.get(); |
| + if (user_email == |
| + user_manager::UserManager::Get() |
| + ->GetPrimaryUser() |
| + ->GetAccountId() |
| + .GetUserEmail()) { |
| + RegisterApp(app_window); |
| + } else { |
| + UnRegisterApp(app_window); |
| + } |
| + } |
| } |
| void ArcAppWindowLauncherController::AdditionalUserAddedToSession( |
| @@ -251,8 +269,12 @@ void ArcAppWindowLauncherController::CheckForAppWindowWidget( |
| if (task_id) { |
| AppWindow* app_window = GetAppWindowForTask(task_id); |
| - if (app_window) |
| + if (app_window) { |
| app_window->set_widget(views::Widget::GetWidgetForNativeWindow(window)); |
| + chrome::MultiUserWindowManager::GetInstance()->SetWindowOwner( |
| + window, |
| + user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); |
| + } |
| } |
| } |
| @@ -288,34 +310,11 @@ void ArcAppWindowLauncherController::OnTaskCreated( |
| const std::string& activity_name) { |
| DCHECK(!GetAppWindowForTask(task_id)); |
| - std::unique_ptr<AppWindow> app_window(new AppWindow(task_id, this)); |
| - |
| const std::string app_id = |
| GetShelfAppId(ArcAppListPrefs::GetAppId(package_name, activity_name)); |
| - ArcAppWindowLauncherItemController* controller; |
| - AppControllerMap::iterator it = app_controller_map_.find(app_id); |
| - ash::ShelfID shelf_id = 0; |
| - if (it != app_controller_map_.end()) { |
| - controller = it->second; |
| - DCHECK_EQ(controller->app_id(), app_id); |
| - shelf_id = controller->shelf_id(); |
| - } else { |
| - controller = new ArcAppWindowLauncherItemController(app_id, owner()); |
| - shelf_id = owner()->GetShelfIDForAppID(app_id); |
| - if (shelf_id == 0) { |
| - // Map Play Store shelf icon to Arc Support host, to share one entry. |
| - shelf_id = owner()->CreateAppLauncherItem(controller, app_id, |
| - ash::STATUS_RUNNING); |
| - } else { |
| - owner()->SetItemController(shelf_id, controller); |
| - } |
| - app_controller_map_[app_id] = controller; |
| - } |
| - controller->AddWindow(app_window.get()); |
| - owner()->SetItemStatus(shelf_id, ash::STATUS_RUNNING); |
| - app_window->SetController(controller); |
| - app_window->set_shelf_id(shelf_id); |
| + std::unique_ptr<AppWindow> app_window(new AppWindow(task_id, app_id, this)); |
| + RegisterApp(app_window.get()); |
| task_id_to_app_window_[task_id] = std::move(app_window); |
| @@ -329,18 +328,7 @@ void ArcAppWindowLauncherController::OnTaskDestroyed(int task_id) { |
| return; |
| AppWindow* app_window = it->second.get(); |
| - ArcAppWindowLauncherItemController* controller = app_window->controller(); |
| - DCHECK(controller); |
| - const std::string app_id = controller->app_id(); |
| - controller->RemoveWindow(app_window); |
| - if (!controller->window_count()) { |
| - ash::ShelfID shelf_id = app_window->shelf_id(); |
| - DCHECK(shelf_id); |
| - owner()->CloseLauncherItem(shelf_id); |
| - AppControllerMap::iterator it2 = app_controller_map_.find(app_id); |
| - DCHECK(it2 != app_controller_map_.end()); |
| - app_controller_map_.erase(it2); |
| - } |
| + UnRegisterApp(app_window); |
| task_id_to_app_window_.erase(it); |
| } |
| @@ -399,7 +387,16 @@ void ArcAppWindowLauncherController::OnWindowActivated( |
| aura::client::ActivationChangeObserver::ActivationReason reason, |
| aura::Window* gained_active, |
| aura::Window* lost_active) { |
|
reveman
2016/06/03 21:51:47
can you explain what the changes to this function
xdai1
2016/06/03 22:14:46
This change is necessary because otherwise OnTaskS
reveman
2016/06/03 22:49:35
Ok, I think that might be a bit easier to understa
|
| - OnTaskSetActive(active_task_id_); |
| + AppWindow* app_window = GetAppWindowForTask(active_task_id_); |
| + if (app_window && |
| + ((gained_active && |
| + app_window->widget() == |
| + views::Widget::GetWidgetForNativeWindow(gained_active)) || |
| + (lost_active && |
| + app_window->widget() == |
| + views::Widget::GetWidgetForNativeWindow(lost_active)))) { |
| + OnTaskSetActive(active_task_id_); |
| + } |
| } |
| void ArcAppWindowLauncherController::StartObserving(Profile* profile) { |
| @@ -420,3 +417,47 @@ void ArcAppWindowLauncherController::StopObserving(Profile* profile) { |
| if (env) |
| env->RemoveObserver(this); |
| } |
| + |
| +void ArcAppWindowLauncherController::RegisterApp(AppWindow* app_window) { |
| + const std::string app_id = app_window->app_id(); |
| + DCHECK(!app_id.empty()); |
| + |
| + ArcAppWindowLauncherItemController* controller; |
| + AppControllerMap::iterator it = app_controller_map_.find(app_id); |
| + ash::ShelfID shelf_id = 0; |
| + if (it != app_controller_map_.end()) { |
| + controller = it->second; |
| + DCHECK_EQ(controller->app_id(), app_id); |
| + shelf_id = controller->shelf_id(); |
| + } else { |
| + controller = new ArcAppWindowLauncherItemController(app_id, owner()); |
| + shelf_id = owner()->GetShelfIDForAppID(app_id); |
| + if (shelf_id == 0) { |
| + // Map Play Store shelf icon to Arc Support host, to share one entry. |
| + shelf_id = owner()->CreateAppLauncherItem(controller, app_id, |
| + ash::STATUS_RUNNING); |
| + } else { |
| + owner()->SetItemController(shelf_id, controller); |
| + } |
| + app_controller_map_[app_id] = controller; |
| + } |
| + controller->AddWindow(app_window); |
| + owner()->SetItemStatus(shelf_id, ash::STATUS_RUNNING); |
| + app_window->SetController(controller); |
| + app_window->set_shelf_id(shelf_id); |
| +} |
| + |
| +void ArcAppWindowLauncherController::UnRegisterApp(AppWindow* app_window) { |
| + const std::string app_id = app_window->app_id(); |
| + DCHECK(!app_id.empty()); |
| + AppControllerMap::iterator it = app_controller_map_.find(app_id); |
| + DCHECK(it != app_controller_map_.end()); |
| + |
| + ArcAppWindowLauncherItemController* controller = it->second; |
| + controller->RemoveWindow(app_window); |
| + if (!controller->window_count()) { |
| + ash::ShelfID shelf_id = app_window->shelf_id(); |
| + owner()->CloseLauncherItem(shelf_id); |
| + app_controller_map_.erase(it); |
| + } |
| +} |