Commit 201f15f1 authored by Nancy Wang's avatar Nancy Wang Committed by Chromium LUCI CQ

Create standard icons on shelf for non-app icons.

AppService creates standard circle icons for all apps. However, there
are a few cases that icons on shelf are not app icons, e.g.:
1. Task manager
2. A few extensions show icons when open a new window, e.g. google
hangouts.

This CL create standard circle icons for them when they are shown on
shelf.

Modify TaskManagerView to create standard icon when running in Chrome
OS.

Modify ChromeLauncherController::OnAppImageUpdated. If the icon is not
loaded by AppServiceAppIconLoader (which loads the standard circle
icons), create standard icons.

BUG=1162514
BUG=1142373

Change-Id: Ibfe40c33944a1120ca9c991c4953d0da906ee2e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2624273
Commit-Queue: Nancy Wang <nancylingwang@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842874}
parent 92a78310
......@@ -32,20 +32,10 @@ std::string GetAppId(Profile* profile, const std::string& id) {
} // namespace
AppServiceAppIconLoader::AppServiceAppIconLoader(
Profile* profile,
int resource_size_in_dip,
AppIconLoaderDelegate* delegate)
: AppIconLoader(profile, resource_size_in_dip, delegate) {
apps::AppServiceProxy* proxy =
apps::AppServiceProxyFactory::GetForProfile(profile);
Observe(&proxy->AppRegistryCache());
}
AppServiceAppIconLoader::~AppServiceAppIconLoader() = default;
bool AppServiceAppIconLoader::CanLoadImageForApp(const std::string& id) {
const std::string app_id = GetAppId(profile(), id);
// static
bool AppServiceAppIconLoader::CanLoadImage(Profile* profile,
const std::string& id) {
const std::string app_id = GetAppId(profile, id);
// Skip the ARC intent helper, the system Android app that proxies links to
// Chrome, which should be hidden.
......@@ -53,13 +43,15 @@ bool AppServiceAppIconLoader::CanLoadImageForApp(const std::string& id) {
return false;
}
apps::AppServiceProxy* proxy =
apps::AppServiceProxyFactory::GetForProfile(profile());
if (!apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile)) {
return false;
}
// Support icon loading for apps registered in AppService or Crostini apps
// with the prefix "crostini:".
if (proxy->AppRegistryCache().GetAppType(app_id) !=
apps::mojom::AppType::kUnknown ||
if (apps::AppServiceProxyFactory::GetForProfile(profile)
->AppRegistryCache()
.GetAppType(app_id) != apps::mojom::AppType::kUnknown ||
crostini::IsUnmatchedCrostiniShelfAppId(app_id)) {
return true;
}
......@@ -67,6 +59,22 @@ bool AppServiceAppIconLoader::CanLoadImageForApp(const std::string& id) {
return false;
}
AppServiceAppIconLoader::AppServiceAppIconLoader(
Profile* profile,
int resource_size_in_dip,
AppIconLoaderDelegate* delegate)
: AppIconLoader(profile, resource_size_in_dip, delegate) {
apps::AppServiceProxy* proxy =
apps::AppServiceProxyFactory::GetForProfile(profile);
Observe(&proxy->AppRegistryCache());
}
AppServiceAppIconLoader::~AppServiceAppIconLoader() = default;
bool AppServiceAppIconLoader::CanLoadImageForApp(const std::string& id) {
return AppServiceAppIconLoader::CanLoadImage(profile(), id);
}
void AppServiceAppIconLoader::FetchImage(const std::string& id) {
const std::string app_id = GetAppId(profile(), id);
......
......@@ -22,6 +22,8 @@ class Profile;
class AppServiceAppIconLoader : public AppIconLoader,
private apps::AppRegistryCache::Observer {
public:
static bool CanLoadImage(Profile* profile, const std::string& id);
AppServiceAppIconLoader(Profile* profile,
int resource_size_in_dip,
AppIconLoaderDelegate* delegate);
......
......@@ -39,6 +39,7 @@
#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
#include "chrome/browser/ui/app_list/app_service/app_service_app_icon_loader.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
#include "chrome/browser/ui/app_list/icon_standardizer.h"
#include "chrome/browser/ui/app_list/md_icon_normalizer.h"
#include "chrome/browser/ui/apps/app_info_dialog.h"
#include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
......@@ -928,6 +929,10 @@ void ChromeLauncherController::OnAppUninstalledPrepared(
void ChromeLauncherController::OnAppImageUpdated(const std::string& app_id,
const gfx::ImageSkia& image) {
bool is_standard_icon = true;
if (!AppServiceAppIconLoader::CanLoadImage(latest_active_profile_, app_id))
is_standard_icon = false;
// TODO: need to get this working for shortcuts.
for (int index = 0; index < model_->item_count(); ++index) {
ash::ShelfItem item = model_->items()[index];
......@@ -936,7 +941,8 @@ void ChromeLauncherController::OnAppImageUpdated(const std::string& app_id,
item.id.app_id != app_id) {
continue;
}
item.image = image;
item.image =
is_standard_icon ? image : app_list::CreateStandardIconImage(image);
shelf_spinner_controller_->MaybeApplySpinningEffect(app_id, &item.image);
model_->Set(index, item);
// It's possible we're waiting on more than one item, so don't break.
......
......@@ -38,6 +38,7 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/public/cpp/shelf_item.h"
#include "ash/public/cpp/window_properties.h"
#include "chrome/browser/ui/app_list/icon_standardizer.h"
#include "chrome/grit/theme_resources.h"
#include "ui/aura/window.h"
#include "ui/base/resource/resource_bundle.h"
......@@ -171,8 +172,11 @@ bool TaskManagerView::ExecuteWindowsCommand(int command_id) {
gfx::ImageSkia TaskManagerView::GetWindowIcon() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
IDR_ASH_SHELF_ICON_TASK_MANAGER);
// TODO(crbug.com/1162514): Move app_list::CreateStandardIconImage to some
// where lower in the stack.
return app_list::CreateStandardIconImage(
*ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
IDR_ASH_SHELF_ICON_TASK_MANAGER));
#else
return views::DialogDelegateView::GetWindowIcon();
#endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment