|  | // Copyright 2020 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/ui/ash/shelf/arc_app_window_info.h" | 
|  |  | 
|  | #include "ash/public/cpp/window_properties.h" | 
|  | #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" | 
|  | #include "chrome/browser/ui/app_list/arc/intent.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // Prefix in intent that specifies a logical window. Among a group of windows | 
|  | // belonging to the same logical window, only one will be represented in the | 
|  | // shelf and in the alt-tab menu. S. means string type. | 
|  | constexpr char kLogicalWindowIntentPrefix[] = | 
|  | "S.org.chromium.arc.logical_window_id="; | 
|  |  | 
|  | std::string GetLogicalWindowIdFromIntent(const std::string& launch_intent) { | 
|  | auto intent = arc::Intent::Get(launch_intent); | 
|  | if (!intent) | 
|  | return std::string(); | 
|  | const std::string prefix(kLogicalWindowIntentPrefix); | 
|  | for (const auto& param : intent->extra_params()) { | 
|  | if (base::StartsWith(param, prefix, base::CompareCase::SENSITIVE)) | 
|  | return param.substr(prefix.length()); | 
|  | } | 
|  | return std::string(); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | ArcAppWindowInfo::ArcAppWindowInfo(const arc::ArcAppShelfId& app_shelf_id, | 
|  | const std::string& launch_intent, | 
|  | const std::string& package_name) | 
|  | : app_shelf_id_(app_shelf_id), | 
|  | launch_intent_(launch_intent), | 
|  | package_name_(package_name), | 
|  | logical_window_id_(GetLogicalWindowIdFromIntent(launch_intent)) {} | 
|  |  | 
|  | ArcAppWindowInfo::~ArcAppWindowInfo() = default; | 
|  |  | 
|  | void ArcAppWindowInfo::OnWindowDestroying(aura::Window* window) { | 
|  | DCHECK(observed_window_.IsObservingSource(window)); | 
|  | observed_window_.Reset(); | 
|  | window_ = nullptr; | 
|  | } | 
|  |  | 
|  | void ArcAppWindowInfo::SetDescription(const std::string& title, | 
|  | const gfx::ImageSkia& icon) { | 
|  | DCHECK(base::IsStringUTF8(title)); | 
|  | title_ = title; | 
|  |  | 
|  | // Chrome has custom Play Store icon. Don't overwrite it. | 
|  | if (app_shelf_id_.app_id() == arc::kPlayStoreAppId) | 
|  | return; | 
|  | icon_ = icon; | 
|  | } | 
|  |  | 
|  | void ArcAppWindowInfo::set_window_hidden_from_shelf(bool hidden) { | 
|  | if (window_hidden_from_shelf_ != hidden) { | 
|  | window_hidden_from_shelf_ = hidden; | 
|  | UpdateWindowProperties(); | 
|  | } | 
|  | } | 
|  |  | 
|  | void ArcAppWindowInfo::UpdateWindowProperties() { | 
|  | aura::Window* const win = window(); | 
|  | if (!win) | 
|  | return; | 
|  | bool hidden = window_hidden_from_shelf_ || task_hidden_from_shelf_; | 
|  | win->SetProperty(ash::kHideInDeskMiniViewKey, hidden); | 
|  | win->SetProperty(ash::kHideInOverviewKey, hidden); | 
|  | win->SetProperty(ash::kHideInShelfKey, hidden); | 
|  | } | 
|  |  | 
|  | void ArcAppWindowInfo::set_window(aura::Window* window) { | 
|  | if (window_ == window) | 
|  | return; | 
|  |  | 
|  | if (window_ && observed_window_.IsObservingSource(window_)) | 
|  | observed_window_.Reset(); | 
|  |  | 
|  | window_ = window; | 
|  | UpdateWindowProperties(); | 
|  |  | 
|  | if (window && !observed_window_.IsObservingSource(window)) | 
|  | observed_window_.Observe(window); | 
|  | } | 
|  |  | 
|  | aura::Window* ArcAppWindowInfo::ArcAppWindowInfo::window() { | 
|  | return window_; | 
|  | } | 
|  |  | 
|  | const arc::ArcAppShelfId& ArcAppWindowInfo::app_shelf_id() const { | 
|  | return app_shelf_id_; | 
|  | } | 
|  |  | 
|  | ash::ShelfID ArcAppWindowInfo::shelf_id() const { | 
|  | return ash::ShelfID(app_shelf_id_.ToString()); | 
|  | } | 
|  |  | 
|  | const std::string& ArcAppWindowInfo::launch_intent() const { | 
|  | return launch_intent_; | 
|  | } | 
|  |  | 
|  | const std::string& ArcAppWindowInfo::package_name() const { | 
|  | return package_name_; | 
|  | } | 
|  |  | 
|  | const std::string& ArcAppWindowInfo::title() const { | 
|  | return title_; | 
|  | } | 
|  |  | 
|  | const gfx::ImageSkia& ArcAppWindowInfo::icon() const { | 
|  | return icon_; | 
|  | } | 
|  |  | 
|  | const std::string& ArcAppWindowInfo::logical_window_id() const { | 
|  | return logical_window_id_; | 
|  | } | 
|  |  | 
|  | void ArcAppWindowInfo::set_task_hidden_from_shelf() { | 
|  | if (!task_hidden_from_shelf_) { | 
|  | task_hidden_from_shelf_ = true; | 
|  | UpdateWindowProperties(); | 
|  | } | 
|  | } | 
|  |  | 
|  | bool ArcAppWindowInfo::task_hidden_from_shelf() const { | 
|  | return task_hidden_from_shelf_; | 
|  | } |