Commit 83473ca0 authored by nancy's avatar nancy Committed by Commit Bot

Close ARC app tasks when the ARC app is removed or paused.

BUG=1011235

Change-Id: Iecc5a8b598d3933aed90d0da1c31fe3c882ca73e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1951274
Commit-Queue: Nancy Wang <nancylingwang@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#722390}
parent 641414b7
......@@ -10,8 +10,10 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/containers/flat_map.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_macros.h"
#include "base/optional.h"
#include "base/stl_util.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/apps/app_service/arc_apps_factory.h"
......@@ -21,6 +23,7 @@
#include "chrome/browser/ui/app_list/arc/arc_app_dialog.h"
#include "chrome/browser/ui/app_list/arc/arc_app_icon.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
#include "chrome/common/chrome_features.h"
#include "chrome/grit/component_extension_resources.h"
#include "chrome/services/app_service/public/cpp/intent_filter_util.h"
#include "components/arc/app_permissions/arc_app_permissions_bridge.h"
......@@ -477,7 +480,7 @@ void ArcApps::PauseApp(const std::string& app_id) {
paused_apps_.insert(app_id);
SetIconEffect(app_id);
// TODO(crbug.com/1011235): If the app is running, Stop the app.
CloseTasks(app_id);
}
void ArcApps::UnpauseApps(const std::string& app_id) {
......@@ -599,6 +602,12 @@ void ArcApps::OnAppStatesChanged(const std::string& app_id,
void ArcApps::OnAppRemoved(const std::string& app_id) {
paused_apps_.erase(app_id);
if (base::Contains(app_id_to_task_ids_, app_id)) {
for (int task_id : app_id_to_task_ids_[app_id]) {
task_id_to_app_id_.erase(task_id);
}
app_id_to_task_ids_.erase(app_id);
}
apps::mojom::AppPtr app = apps::mojom::App::New();
app->app_type = apps::mojom::AppType::kArc;
......@@ -677,6 +686,30 @@ void ArcApps::OnPackageListInitialRefreshed() {
}
}
void ArcApps::OnTaskCreated(int task_id,
const std::string& package_name,
const std::string& activity,
const std::string& intent) {
const std::string app_id = ArcAppListPrefs::GetAppId(package_name, activity);
app_id_to_task_ids_[app_id].insert(task_id);
task_id_to_app_id_[task_id] = app_id;
}
void ArcApps::OnTaskDestroyed(int task_id) {
auto it = task_id_to_app_id_.find(task_id);
if (it == task_id_to_app_id_.end()) {
return;
}
const std::string app_id = it->second;
task_id_to_app_id_.erase(it);
DCHECK(base::Contains(app_id_to_task_ids_, app_id));
app_id_to_task_ids_[app_id].erase(task_id);
if (app_id_to_task_ids_[app_id].empty()) {
app_id_to_task_ids_.erase(app_id);
}
}
void ArcApps::OnIntentFiltersUpdated(
const base::Optional<std::string>& package_name) {
ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
......@@ -913,6 +946,22 @@ void ArcApps::SetIconEffect(const std::string& app_id) {
Publish(std::move(app));
}
void ArcApps::CloseTasks(const std::string& app_id) {
if (!base::FeatureList::IsEnabled(features::kAppServiceInstanceRegistry)) {
return;
}
if (!base::Contains(app_id_to_task_ids_, app_id)) {
return;
}
for (int task_id : app_id_to_task_ids_[app_id]) {
arc::CloseTask(task_id);
task_id_to_app_id_.erase(task_id);
}
app_id_to_task_ids_.erase(app_id);
}
void ArcApps::UpdateAppIntentFilters(
std::string package_name,
arc::ArcIntentHelperBridge* intent_helper_bridge,
......
......@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_APPS_APP_SERVICE_ARC_APPS_H_
#define CHROME_BROWSER_APPS_APP_SERVICE_ARC_APPS_H_
#include <map>
#include <set>
#include <string>
#include <vector>
......@@ -49,6 +51,9 @@ class ArcApps : public KeyedService,
~ArcApps() override;
private:
using AppIdToTaskIds = std::map<std::string, std::set<int>>;
using TaskIdToAppId = std::map<int, std::string>;
ArcApps(Profile* profile, apps::AppServiceProxy* proxy);
// KeyedService overrides.
......@@ -100,6 +105,11 @@ class ArcApps : public KeyedService,
void OnPackageModified(
const arc::mojom::ArcPackageInfo& package_info) override;
void OnPackageListInitialRefreshed() override;
void OnTaskCreated(int task_id,
const std::string& package_name,
const std::string& activity,
const std::string& intent) override;
void OnTaskDestroyed(int task_id) override;
// arc::ArcIntentHelperObserver overrides.
void OnIntentFiltersUpdated(
......@@ -120,6 +130,7 @@ class ArcApps : public KeyedService,
const arc::mojom::ArcPackageInfo& package_info,
bool update_icon = true);
void SetIconEffect(const std::string& app_id);
void CloseTasks(const std::string& app_id);
void UpdateAppIntentFilters(
std::string package_name,
arc::ArcIntentHelperBridge* intent_helper_bridge,
......@@ -135,6 +146,9 @@ class ArcApps : public KeyedService,
std::set<std::string> paused_apps_;
AppIdToTaskIds app_id_to_task_ids_;
TaskIdToAppId task_id_to_app_id_;
ScopedObserver<arc::ArcIntentHelperBridge, arc::ArcIntentHelperObserver>
arc_intent_helper_observer_{this};
......
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