| Index: chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
|
| diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
|
| index 4c2aa1187891da7962ede8d519361e2666858b67..ed56783e504166b85e19e700fe3b48f7b401c143 100644
|
| --- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
|
| +++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.cc
|
| @@ -12,15 +12,25 @@
|
| #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "components/prefs/pref_service.h"
|
| +#include "ui/base/layout.h"
|
| +#include "ui/display/display.h"
|
| +#include "ui/display/screen.h"
|
| #include "ui/message_center/message_center.h"
|
| #include "ui/message_center/notification_blocker.h"
|
|
|
| namespace chromeos {
|
|
|
| +namespace {
|
| +
|
| // Timeout maintenance session after 30 minutes.
|
| constexpr base::TimeDelta kArcKioskMaintenanceSessionTimeout =
|
| base::TimeDelta::FromMinutes(30);
|
|
|
| +// ARC icon is available only for 48x48 dips.
|
| +constexpr int kArcAppIconSizeInDp = 48;
|
| +
|
| +} // namespace
|
| +
|
| // Blocks all notifications for ARC Kiosk
|
| class ArcKioskNotificationBlocker : public message_center::NotificationBlocker {
|
| public:
|
| @@ -134,6 +144,17 @@ void ArcKioskAppService::OnAppWindowLaunched() {
|
| delegate_->OnAppWindowLaunched();
|
| }
|
|
|
| +void ArcKioskAppService::OnIconUpdated(ArcAppIcon* icon) {
|
| + if (icon == app_icon_.get()) {
|
| + if (icon->image_skia().isNull()) {
|
| + app_icon_.release();
|
| + return;
|
| + }
|
| + app_manager_->UpdateNameAndIcon(app_info_->package_name, app_info_->name,
|
| + app_icon_->image_skia());
|
| + }
|
| +}
|
| +
|
| ArcKioskAppService::ArcKioskAppService(Profile* profile) : profile_(profile) {
|
| ArcAppListPrefs::Get(profile_)->AddObserver(this);
|
| app_manager_ = ArcKioskAppManager::Get();
|
| @@ -149,6 +170,16 @@ ArcKioskAppService::~ArcKioskAppService() {
|
| maintenance_timeout_timer_.Stop();
|
| }
|
|
|
| +void ArcKioskAppService::RequestNameAndIconUpdate() {
|
| + // Request only once when app_icon_ is not initialized.
|
| + if (!app_info_ || !app_info_->ready || app_icon_)
|
| + return;
|
| + app_icon_.reset(new ArcAppIcon(profile_, app_id_, kArcAppIconSizeInDp, this));
|
| + app_icon_->LoadForScaleFactor(ui::GetSupportedScaleFactor(
|
| + display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor()));
|
| + // Name and icon are updated when icon is loaded in OnIconUpdated()
|
| +}
|
| +
|
| void ArcKioskAppService::PreconditionsChanged() {
|
| app_id_ = GetAppId();
|
| if (app_id_.empty())
|
| @@ -161,17 +192,16 @@ void ArcKioskAppService::PreconditionsChanged() {
|
| } else if (task_id_ != -1) {
|
| arc::CloseTask(task_id_);
|
| }
|
| + RequestNameAndIconUpdate();
|
| }
|
|
|
| std::string ArcKioskAppService::GetAppId() {
|
| AccountId account_id = multi_user_util::GetAccountIdFromProfile(profile_);
|
| - const ArcKioskAppManager::ArcKioskApp* app =
|
| - app_manager_->GetAppByAccountId(account_id);
|
| + const ArcKioskAppData* app = app_manager_->GetAppByAccountId(account_id);
|
| if (!app)
|
| return std::string();
|
| std::unordered_set<std::string> app_ids =
|
| - ArcAppListPrefs::Get(profile_)->GetAppsForPackage(
|
| - app->app_info().package_name());
|
| + ArcAppListPrefs::Get(profile_)->GetAppsForPackage(app->app_id());
|
| if (app_ids.empty())
|
| return std::string();
|
| // TODO(poromov@): Choose appropriate app id to launch. See
|
|
|