Commit 694b06c5 authored by Yue Li's avatar Yue Li Committed by Commit Bot

Notify android app capabilities change to display connection

Bug: b/123953783
Test: Local Build
Change-Id: I2eccb356604ade028cb63471ee73484a470aeff5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1536767
Commit-Queue: Yue Li <updowndota@chromium.org>
Reviewed-by: default avatarXiaohui Chen <xiaohuic@chromium.org>
Reviewed-by: default avatarTao Wu <wutao@chromium.org>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#663999}
parent 1557d904
......@@ -81,9 +81,43 @@ std::string GetLaunchIntent(AndroidAppInfoPtr app_info) {
kPackage, package_name.c_str(), kEndSuffix);
}
std::vector<AndroidAppInfoPtr> GetAppsInfo() {
std::vector<AndroidAppInfoPtr> android_apps_info;
auto* prefs = ArcAppListPrefs::Get(ProfileManager::GetActiveUserProfile());
if (!prefs) {
LOG(ERROR) << "ArcAppListPrefs is not available.";
return android_apps_info;
}
for (const auto& app_id : prefs->GetAppIds()) {
std::unique_ptr<ArcAppListPrefs::AppInfo> app_info = prefs->GetApp(app_id);
if (!app_info)
continue;
AndroidAppInfoPtr app_info_ptr =
chromeos::assistant::mojom::AndroidAppInfo::New();
app_info_ptr->package_name = app_info->package_name;
auto package = prefs->GetPackage(app_info->package_name);
if (package)
app_info_ptr->version = package->package_version;
app_info_ptr->localized_app_name = app_info->name;
app_info_ptr->intent = app_info->intent_uri;
android_apps_info.push_back(std::move(app_info_ptr));
}
return android_apps_info;
}
void NotifyAndroidAppListRefreshed(
mojo::InterfacePtrSet<chromeos::assistant::mojom::AppListEventSubscriber>
subscribers) {
std::vector<AndroidAppInfoPtr> android_apps_info = GetAppsInfo();
subscribers.ForAllPtrs([&android_apps_info](auto* ptr) {
ptr->OnAndroidAppListRefreshed(mojo::Clone(android_apps_info));
});
}
} // namespace
DeviceActions::DeviceActions() {}
DeviceActions::DeviceActions() : scoped_prefs_observer_(this) {}
DeviceActions::~DeviceActions() {
bindings_.CloseAllBindings();
......@@ -172,9 +206,8 @@ void DeviceActions::OpenAndroidApp(AndroidAppInfoPtr app_info,
std::move(callback).Run(!!app);
}
void DeviceActions::VerifyAndroidApp(
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) {
void DeviceActions::VerifyAndroidApp(std::vector<AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) {
for (const auto& app_info : apps_info) {
app_info->status = GetAndroidAppStatus(app_info->package_name);
}
......@@ -192,3 +225,32 @@ void DeviceActions::LaunchAndroidIntent(const std::string& intent) {
// TODO(updowndota): Launch the intent in current active display.
app->LaunchIntent(intent, display::kDefaultDisplayId);
}
void DeviceActions::AddAppListEventSubscriber(
chromeos::assistant::mojom::AppListEventSubscriberPtr subscriber) {
app_list_subscribers_.AddPtr(std::move(subscriber));
auto* prefs = ArcAppListPrefs::Get(ProfileManager::GetActiveUserProfile());
if (!prefs)
return;
if (!scoped_prefs_observer_.IsObserving(prefs)) {
scoped_prefs_observer_.Add(prefs);
}
if (prefs->package_list_initial_refreshed()) {
std::vector<AndroidAppInfoPtr> android_apps_info = GetAppsInfo();
subscriber->OnAndroidAppListRefreshed(mojo::Clone(android_apps_info));
}
}
void DeviceActions::OnPackageListInitialRefreshed() {
NotifyAndroidAppListRefreshed(app_list_subscribers_);
}
void DeviceActions::OnAppRegistered(const std::string& app_id,
const ArcAppListPrefs::AppInfo& app_info) {
NotifyAndroidAppListRefreshed(app_list_subscribers_);
}
void DeviceActions::OnAppRemoved(const std::string& id) {
NotifyAndroidAppListRefreshed(app_list_subscribers_);
}
......@@ -5,10 +5,14 @@
#ifndef CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_
#define CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_
#include "base/scoped_observer.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "mojo/public/cpp/bindings/interface_ptr_set.h"
class DeviceActions : public chromeos::assistant::mojom::DeviceActions {
class DeviceActions : public chromeos::assistant::mojom::DeviceActions,
public ArcAppListPrefs::Observer {
public:
DeviceActions();
~DeviceActions() override;
......@@ -28,10 +32,21 @@ class DeviceActions : public chromeos::assistant::mojom::DeviceActions {
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) override;
void LaunchAndroidIntent(const std::string& intent) override;
void AddAppListEventSubscriber(
chromeos::assistant::mojom::AppListEventSubscriberPtr subscriber)
override;
private:
mojo::BindingSet<chromeos::assistant::mojom::DeviceActions> bindings_;
// ArcAppListPrefs::Observer overrides.
void OnPackageListInitialRefreshed() override;
void OnAppRegistered(const std::string& app_id,
const ArcAppListPrefs::AppInfo& app_info) override;
void OnAppRemoved(const std::string& id) override;
ScopedObserver<ArcAppListPrefs, DeviceActions> scoped_prefs_observer_;
mojo::BindingSet<chromeos::assistant::mojom::DeviceActions> bindings_;
mojo::InterfacePtrSet<chromeos::assistant::mojom::AppListEventSubscriber>
app_list_subscribers_;
DISALLOW_COPY_AND_ASSIGN(DeviceActions);
};
......
......@@ -148,6 +148,7 @@ AssistantManagerServiceImpl::AssistantManagerServiceImpl(
service_(service),
background_thread_("background thread"),
media_controller_observer_binding_(this),
app_list_subscriber_binding_(this),
weak_factory_(this) {
background_thread_.Start();
platform_api_ = std::make_unique<PlatformApiImpl>(
......@@ -1030,6 +1031,13 @@ void AssistantManagerServiceImpl::PostInitAssistant(
service_->assistant_state()->hotword_enabled().value()) {
assistant_settings_manager_->SyncSpeakerIdEnrollmentStatus();
}
if (base::FeatureList::IsEnabled(assistant::features::kAssistantAppSupport)) {
mojom::AppListEventSubscriberPtr subscriber_ptr;
app_list_subscriber_binding_.Bind(mojo::MakeRequest(&subscriber_ptr));
service_->device_actions()->AddAppListEventSubscriber(
std::move(subscriber_ptr));
}
}
void AssistantManagerServiceImpl::HandleLaunchMediaIntentResponse(
......@@ -1118,6 +1126,17 @@ void AssistantManagerServiceImpl::OnTimerSoundingFinished() {
service_->assistant_alarm_timer_controller()->OnTimerSoundingFinished();
}
void AssistantManagerServiceImpl::OnAndroidAppListRefreshed(
std::vector<mojom::AndroidAppInfoPtr> apps_info) {
std::vector<action::AndroidAppInfo> android_apps_info;
for (const auto& app_info : apps_info) {
android_apps_info.push_back({app_info->package_name, app_info->version,
app_info->localized_app_name,
app_info->intent});
}
display_connection_->OnAndroidAppListRefreshed(android_apps_info);
}
void AssistantManagerServiceImpl::UpdateInternalOptions(
assistant_client::AssistantManagerInternal* assistant_manager_internal) {
// Build user agent string.
......
......@@ -90,7 +90,8 @@ class AssistantManagerServiceImpl
public assistant_client::AssistantManagerDelegate,
public assistant_client::DeviceStateListener,
public assistant_client::MediaManager::Listener,
public media_session::mojom::MediaControllerObserver {
public media_session::mojom::MediaControllerObserver,
public mojom::AppListEventSubscriber {
public:
// |service| owns this class and must outlive this class.
AssistantManagerServiceImpl(
......@@ -184,6 +185,10 @@ class AssistantManagerServiceImpl
void OnTimerSoundingStarted() override;
void OnTimerSoundingFinished() override;
// mojom::AppListEventSubscriber overrides:
void OnAndroidAppListRefreshed(
std::vector<mojom::AndroidAppInfoPtr> apps_info) override;
void UpdateInternalOptions(
assistant_client::AssistantManagerInternal* assistant_manager_internal);
......@@ -337,6 +342,8 @@ class AssistantManagerServiceImpl
bool start_finished_ = false;
mojo::Binding<mojom::AppListEventSubscriber> app_list_subscriber_binding_;
base::WeakPtrFactory<AssistantManagerServiceImpl> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(AssistantManagerServiceImpl);
......
......@@ -187,6 +187,15 @@ interface DeviceActions {
// Launch Android intent. The intent is encoded as a URI string.
// See Intent.toUri().
LaunchAndroidIntent(string intent);
// Register App list event subscriber.
AddAppListEventSubscriber(AppListEventSubscriber subscriber);
};
// Subscribes to App list events.
interface AppListEventSubscriber {
// Called when the android app list changed.
OnAndroidAppListRefreshed(array<AndroidAppInfo> apps_info);
};
// Enumeration of possible completions for an Assistant interaction.
......
......@@ -143,6 +143,9 @@ class FakeDeviceActions : mojom::DeviceActions {
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) override {}
void LaunchAndroidIntent(const std::string& intent) override {}
void AddAppListEventSubscriber(
chromeos::assistant::mojom::AppListEventSubscriberPtr subscriber)
override {}
mojo::Binding<mojom::DeviceActions> binding_;
......
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