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) { ...@@ -81,9 +81,43 @@ std::string GetLaunchIntent(AndroidAppInfoPtr app_info) {
kPackage, package_name.c_str(), kEndSuffix); 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 } // namespace
DeviceActions::DeviceActions() {} DeviceActions::DeviceActions() : scoped_prefs_observer_(this) {}
DeviceActions::~DeviceActions() { DeviceActions::~DeviceActions() {
bindings_.CloseAllBindings(); bindings_.CloseAllBindings();
...@@ -172,8 +206,7 @@ void DeviceActions::OpenAndroidApp(AndroidAppInfoPtr app_info, ...@@ -172,8 +206,7 @@ void DeviceActions::OpenAndroidApp(AndroidAppInfoPtr app_info,
std::move(callback).Run(!!app); std::move(callback).Run(!!app);
} }
void DeviceActions::VerifyAndroidApp( void DeviceActions::VerifyAndroidApp(std::vector<AndroidAppInfoPtr> apps_info,
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) { VerifyAndroidAppCallback callback) {
for (const auto& app_info : apps_info) { for (const auto& app_info : apps_info) {
app_info->status = GetAndroidAppStatus(app_info->package_name); app_info->status = GetAndroidAppStatus(app_info->package_name);
...@@ -192,3 +225,32 @@ void DeviceActions::LaunchAndroidIntent(const std::string& intent) { ...@@ -192,3 +225,32 @@ void DeviceActions::LaunchAndroidIntent(const std::string& intent) {
// TODO(updowndota): Launch the intent in current active display. // TODO(updowndota): Launch the intent in current active display.
app->LaunchIntent(intent, display::kDefaultDisplayId); 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 @@ ...@@ -5,10 +5,14 @@
#ifndef CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_ #ifndef CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_
#define 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 "chromeos/services/assistant/public/mojom/assistant.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.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: public:
DeviceActions(); DeviceActions();
~DeviceActions() override; ~DeviceActions() override;
...@@ -28,10 +32,21 @@ class DeviceActions : public chromeos::assistant::mojom::DeviceActions { ...@@ -28,10 +32,21 @@ class DeviceActions : public chromeos::assistant::mojom::DeviceActions {
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info, std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) override; VerifyAndroidAppCallback callback) override;
void LaunchAndroidIntent(const std::string& intent) override; void LaunchAndroidIntent(const std::string& intent) override;
void AddAppListEventSubscriber(
chromeos::assistant::mojom::AppListEventSubscriberPtr subscriber)
override;
private: 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); DISALLOW_COPY_AND_ASSIGN(DeviceActions);
}; };
......
...@@ -148,6 +148,7 @@ AssistantManagerServiceImpl::AssistantManagerServiceImpl( ...@@ -148,6 +148,7 @@ AssistantManagerServiceImpl::AssistantManagerServiceImpl(
service_(service), service_(service),
background_thread_("background thread"), background_thread_("background thread"),
media_controller_observer_binding_(this), media_controller_observer_binding_(this),
app_list_subscriber_binding_(this),
weak_factory_(this) { weak_factory_(this) {
background_thread_.Start(); background_thread_.Start();
platform_api_ = std::make_unique<PlatformApiImpl>( platform_api_ = std::make_unique<PlatformApiImpl>(
...@@ -1030,6 +1031,13 @@ void AssistantManagerServiceImpl::PostInitAssistant( ...@@ -1030,6 +1031,13 @@ void AssistantManagerServiceImpl::PostInitAssistant(
service_->assistant_state()->hotword_enabled().value()) { service_->assistant_state()->hotword_enabled().value()) {
assistant_settings_manager_->SyncSpeakerIdEnrollmentStatus(); 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( void AssistantManagerServiceImpl::HandleLaunchMediaIntentResponse(
...@@ -1118,6 +1126,17 @@ void AssistantManagerServiceImpl::OnTimerSoundingFinished() { ...@@ -1118,6 +1126,17 @@ void AssistantManagerServiceImpl::OnTimerSoundingFinished() {
service_->assistant_alarm_timer_controller()->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( void AssistantManagerServiceImpl::UpdateInternalOptions(
assistant_client::AssistantManagerInternal* assistant_manager_internal) { assistant_client::AssistantManagerInternal* assistant_manager_internal) {
// Build user agent string. // Build user agent string.
......
...@@ -90,7 +90,8 @@ class AssistantManagerServiceImpl ...@@ -90,7 +90,8 @@ class AssistantManagerServiceImpl
public assistant_client::AssistantManagerDelegate, public assistant_client::AssistantManagerDelegate,
public assistant_client::DeviceStateListener, public assistant_client::DeviceStateListener,
public assistant_client::MediaManager::Listener, public assistant_client::MediaManager::Listener,
public media_session::mojom::MediaControllerObserver { public media_session::mojom::MediaControllerObserver,
public mojom::AppListEventSubscriber {
public: public:
// |service| owns this class and must outlive this class. // |service| owns this class and must outlive this class.
AssistantManagerServiceImpl( AssistantManagerServiceImpl(
...@@ -184,6 +185,10 @@ class AssistantManagerServiceImpl ...@@ -184,6 +185,10 @@ class AssistantManagerServiceImpl
void OnTimerSoundingStarted() override; void OnTimerSoundingStarted() override;
void OnTimerSoundingFinished() override; void OnTimerSoundingFinished() override;
// mojom::AppListEventSubscriber overrides:
void OnAndroidAppListRefreshed(
std::vector<mojom::AndroidAppInfoPtr> apps_info) override;
void UpdateInternalOptions( void UpdateInternalOptions(
assistant_client::AssistantManagerInternal* assistant_manager_internal); assistant_client::AssistantManagerInternal* assistant_manager_internal);
...@@ -337,6 +342,8 @@ class AssistantManagerServiceImpl ...@@ -337,6 +342,8 @@ class AssistantManagerServiceImpl
bool start_finished_ = false; bool start_finished_ = false;
mojo::Binding<mojom::AppListEventSubscriber> app_list_subscriber_binding_;
base::WeakPtrFactory<AssistantManagerServiceImpl> weak_factory_; base::WeakPtrFactory<AssistantManagerServiceImpl> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(AssistantManagerServiceImpl); DISALLOW_COPY_AND_ASSIGN(AssistantManagerServiceImpl);
......
...@@ -187,6 +187,15 @@ interface DeviceActions { ...@@ -187,6 +187,15 @@ interface DeviceActions {
// Launch Android intent. The intent is encoded as a URI string. // Launch Android intent. The intent is encoded as a URI string.
// See Intent.toUri(). // See Intent.toUri().
LaunchAndroidIntent(string intent); 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. // Enumeration of possible completions for an Assistant interaction.
......
...@@ -143,6 +143,9 @@ class FakeDeviceActions : mojom::DeviceActions { ...@@ -143,6 +143,9 @@ class FakeDeviceActions : mojom::DeviceActions {
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info, std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) override {} VerifyAndroidAppCallback callback) override {}
void LaunchAndroidIntent(const std::string& intent) override {} void LaunchAndroidIntent(const std::string& intent) override {}
void AddAppListEventSubscriber(
chromeos::assistant::mojom::AppListEventSubscriberPtr subscriber)
override {}
mojo::Binding<mojom::DeviceActions> binding_; 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