blob: dcba08775175249822a40c3d64daee3d2edda5ed [file] [log] [blame]
// Copyright (c) 2019 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/apps/app_service/uninstall_dialog.h"
#include "base/metrics/histogram_macros.h"
#include "chrome/browser/apps/app_service/app_icon_factory.h"
#include "chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/native_window_tracker.h"
#include "chrome/common/chrome_features.h"
#include "components/services/app_service/public/cpp/icon_loader.h"
#include "extensions/browser/uninstall_reason.h"
namespace {
constexpr int32_t kUninstallIconSize = 48;
} // namespace
namespace apps {
UninstallDialog::UninstallDialog(Profile* profile,
apps::mojom::AppType app_type,
const std::string& app_id,
const std::string& app_name,
apps::mojom::IconKeyPtr icon_key,
apps::IconLoader* icon_loader,
gfx::NativeWindow parent_window,
UninstallCallback uninstall_callback)
: profile_(profile),
app_type_(app_type),
app_id_(app_id),
app_name_(app_name),
parent_window_(parent_window),
uninstall_callback_(std::move(uninstall_callback)) {
if (parent_window)
parent_window_tracker_ = NativeWindowTracker::Create(parent_window);
switch (app_type) {
case apps::mojom::AppType::kArc:
case apps::mojom::AppType::kBorealis:
case apps::mojom::AppType::kPluginVm:
break;
case apps::mojom::AppType::kCrostini:
// Crostini icons might be a big image, and not fit the size, so add the
// resize icon effect, to resize the image.
icon_key->icon_effects = static_cast<apps::IconEffects>(
icon_key->icon_effects | apps::IconEffects::kResizeAndPad);
break;
case apps::mojom::AppType::kExtension:
case apps::mojom::AppType::kWeb:
UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallSource",
extensions::UNINSTALL_SOURCE_APP_LIST,
extensions::NUM_UNINSTALL_SOURCES);
break;
default:
NOTREACHED();
return;
}
constexpr bool kAllowPlaceholderIcon = false;
// Currently ARC apps only support 48*48 native icon.
int32_t size_hint_in_dip = kUninstallIconSize;
auto icon_type =
(base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
? apps::mojom::IconType::kStandard
: apps::mojom::IconType::kUncompressed;
icon_loader->LoadIconFromIconKey(
app_type, app_id, std::move(icon_key), icon_type, size_hint_in_dip,
kAllowPlaceholderIcon,
base::BindOnce(&UninstallDialog::OnLoadIcon,
weak_ptr_factory_.GetWeakPtr()));
}
UninstallDialog::~UninstallDialog() = default;
void UninstallDialog::OnDialogClosed(bool uninstall,
bool clear_site_data,
bool report_abuse) {
if (!uninstall && (app_type_ == apps::mojom::AppType::kExtension ||
app_type_ == apps::mojom::AppType::kWeb)) {
ExtensionAppsChromeOs::RecordUninstallCanceledAction(profile_, app_id_);
}
std::move(uninstall_callback_)
.Run(uninstall, clear_site_data, report_abuse, this);
}
void UninstallDialog::SetDialogCreatedCallbackForTesting(
base::OnceClosure callback) {
dialog_created_callback_ = std::move(callback);
}
void UninstallDialog::OnLoadIcon(apps::mojom::IconValuePtr icon_value) {
auto icon_type =
(base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
? apps::mojom::IconType::kStandard
: apps::mojom::IconType::kUncompressed;
if (icon_value->icon_type != icon_type) {
OnDialogClosed(false, false, false);
return;
}
if (parent_window_ && parent_window_tracker_->WasNativeWindowClosed()) {
OnDialogClosed(false, false, false);
return;
}
UiBase::Create(profile_, app_type_, app_id_, app_name_,
icon_value->uncompressed, parent_window_, this);
// For browser tests, if the callback is set, run the callback to stop the run
// loop.
if (!dialog_created_callback_.is_null()) {
std::move(dialog_created_callback_).Run();
}
}
} // namespace apps