Commit b0d7cfc2 authored by Yue Li's avatar Yue Li Committed by Commit Bot

Reland "Handle Open/Verify android apps for Assistant"

This is a reland of d20781e1

The cl was reverted due to an internal dependency issue, which has been resolved. So TBR for the reland.
TBR=sammc@chromium.com, xiaohuic@chromium.com

Original change's description:
> Handle Open/Verify android apps for Assistant
>
> Bug: b/117793081
> Test: Manual Test
> Change-Id: If747d3317cb163715ff907839203e0c0eee57a1c
> Reviewed-on: https://chromium-review.googlesource.com/c/1352341
> Commit-Queue: Yue Li <updowndota@chromium.org>
> Reviewed-by: Xiaohui Chen <xiaohuic@chromium.org>
> Reviewed-by: Sam McNally <sammc@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#612448}

Bug: b/117793081
Change-Id: I19268f1ad40deb7b77f68bb0f9a87e98154d55b9
Reviewed-on: https://chromium-review.googlesource.com/c/1356326Reviewed-by: default avatarYue Li <updowndota@chromium.org>
Commit-Queue: Yue Li <updowndota@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612861}
parent 6549c4a6
......@@ -9,16 +9,38 @@
#include "ash/public/cpp/ash_pref_names.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager/backlight.pb.h"
#include "chromeos/dbus/power_manager_client.h"
#include "chromeos/network/network_state_handler.h"
#include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_service_manager.h"
#include "components/arc/common/intent_helper.mojom.h"
#include "components/prefs/pref_service.h"
#include "components/user_manager/user_manager.h"
using chromeos::NetworkHandler;
using chromeos::NetworkStateHandler;
using chromeos::NetworkTypePattern;
using chromeos::assistant::mojom::AndroidAppInfoPtr;
using chromeos::assistant::mojom::AppStatus;
namespace {
AppStatus GetAndroidAppStatus(const std::string& package_name) {
auto* prefs = ArcAppListPrefs::Get(ProfileManager::GetActiveUserProfile());
if (!prefs) {
LOG(ERROR) << "ArcAppListPrefs is not available.";
return AppStatus::UNKNOWN;
}
std::string app_id = prefs->GetAppIdByPackageName(package_name);
return app_id.empty() ? AppStatus::UNAVAILABLE : AppStatus::AVAILABLE;
}
} // namespace
DeviceActions::DeviceActions() {}
......@@ -82,3 +104,41 @@ void DeviceActions::SetNightLightEnabled(bool enabled) {
// light controller.
profile->GetPrefs()->SetBoolean(ash::prefs::kNightLightEnabled, enabled);
}
void DeviceActions::OpenAndroidApp(AndroidAppInfoPtr app_info,
OpenAndroidAppCallback callback) {
app_info->status = GetAndroidAppStatus(app_info->package_name);
if (app_info->status != AppStatus::AVAILABLE) {
std::move(callback).Run(false);
return;
}
auto* helper = ARC_GET_INSTANCE_FOR_METHOD(
arc::ArcServiceManager::Get()->arc_bridge_service()->intent_helper(),
HandleIntent);
if (!helper) {
LOG(ERROR) << "Android container is not running.";
std::move(callback).Run(false);
return;
}
arc::mojom::ActivityNamePtr activity = arc::mojom::ActivityName::New();
activity->package_name = app_info->package_name;
auto intent = arc::mojom::IntentInfo::New();
if (!app_info->intent.empty()) {
intent->data = app_info->intent;
}
helper->HandleIntent(std::move(intent), std::move(activity));
std::move(callback).Run(true);
}
void DeviceActions::VerifyAndroidApp(
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) {
for (const auto& app_info : apps_info) {
app_info->status = GetAndroidAppStatus(app_info->package_name);
}
std::move(callback).Run(std::move(apps_info));
}
......@@ -20,6 +20,11 @@ class DeviceActions : public chromeos::assistant::mojom::DeviceActions {
GetScreenBrightnessLevelCallback callback) override;
void SetScreenBrightnessLevel(double level, bool gradual) override;
void SetNightLightEnabled(bool enabled) override;
void OpenAndroidApp(chromeos::assistant::mojom::AndroidAppInfoPtr app_info,
OpenAndroidAppCallback callback) override;
void VerifyAndroidApp(
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) override;
private:
DISALLOW_COPY_AND_ASSIGN(DeviceActions);
......
......@@ -77,7 +77,6 @@ source_set("lib") {
deps += [
"//chromeos/assistant/internal",
"//chromeos/assistant/internal:build_libassistant",
"//chromeos/assistant/internal/action",
"//chromeos/assistant/internal/proto/google3",
"//chromeos/resources",
"//chromeos/services/assistant/public/proto",
......
......@@ -98,6 +98,21 @@ void UpdateInternalOptions(
});
}
action::AppStatus GetActionAppStatus(mojom::AppStatus status) {
switch (status) {
case mojom::AppStatus::UNKNOWN:
return action::UNKNOWN;
case mojom::AppStatus::AVAILABLE:
return action::AVAILABLE;
case mojom::AppStatus::UNAVAILABLE:
return action::UNAVAILABLE;
case mojom::AppStatus::VERSION_MISMATCH:
return action::VERSION_MISMATCH;
case mojom::AppStatus::DISABLED:
return action::DISABLED;
}
}
} // namespace
AssistantManagerServiceImpl::AssistantManagerServiceImpl(
......@@ -533,6 +548,33 @@ void AssistantManagerServiceImpl::OnShowNotification(
weak_factory_.GetWeakPtr(), std::move(notification_ptr)));
}
void AssistantManagerServiceImpl::OnOpenAndroidApp(
const action::AndroidAppInfo& app_info,
const action::InteractionInfo& interaction) {
mojom::AndroidAppInfoPtr app_info_ptr = mojom::AndroidAppInfo::New();
app_info_ptr->package_name = app_info.package_name;
service_->device_actions()->OpenAndroidApp(
std::move(app_info_ptr),
base::BindOnce(&AssistantManagerServiceImpl::HandleOpenAndroidAppResponse,
weak_factory_.GetWeakPtr(), interaction));
}
void AssistantManagerServiceImpl::OnVerifyAndroidApp(
const std::vector<action::AndroidAppInfo>& apps_info,
const action::InteractionInfo& interaction) {
std::vector<mojom::AndroidAppInfoPtr> apps_info_list;
for (auto app_info : apps_info) {
mojom::AndroidAppInfoPtr app_info_ptr = mojom::AndroidAppInfo::New();
app_info_ptr->package_name = app_info.package_name;
apps_info_list.push_back(std::move(app_info_ptr));
}
service_->device_actions()->VerifyAndroidApp(
std::move(apps_info_list),
base::BindOnce(
&AssistantManagerServiceImpl::HandleVerifyAndroidAppResponse,
weak_factory_.GetWeakPtr(), interaction));
}
void AssistantManagerServiceImpl::OnRecognitionStateChanged(
assistant_client::ConversationStateListener::RecognitionState state,
const assistant_client::ConversationStateListener::RecognitionResult&
......@@ -894,6 +936,38 @@ void AssistantManagerServiceImpl::HandleStopSpeakerIdEnrollment(
callback.Run();
}
void AssistantManagerServiceImpl::HandleOpenAndroidAppResponse(
const action::InteractionInfo& interaction,
bool app_opened) {
std::string interaction_proto = CreateOpenProviderResponseInteraction(
interaction.interaction_id, app_opened);
assistant_client::VoicelessOptions options;
options.obfuscated_gaia_id = interaction.user_id;
assistant_manager_internal_->SendVoicelessInteraction(
interaction_proto, "open_provider_response", options, [](auto) {});
}
void AssistantManagerServiceImpl::HandleVerifyAndroidAppResponse(
const action::InteractionInfo& interaction,
std::vector<mojom::AndroidAppInfoPtr> apps_info) {
std::vector<action::AndroidAppInfo> action_apps_info;
for (const auto& app_info : apps_info) {
action_apps_info.push_back({app_info->package_name, app_info->version,
app_info->localized_app_name, app_info->intent,
GetActionAppStatus(app_info->status)});
}
std::string interaction_proto = CreateVerifyProviderResponseInteraction(
interaction.interaction_id, action_apps_info);
assistant_client::VoicelessOptions options;
options.obfuscated_gaia_id = interaction.user_id;
assistant_manager_internal_->SendVoicelessInteraction(
interaction_proto, "verify_provider_response", options, [](auto) {});
}
// assistant_client::DeviceStateListener overrides
// Run on LibAssistant threads
void AssistantManagerServiceImpl::OnStartFinished() {
......
......@@ -139,6 +139,10 @@ class AssistantManagerServiceImpl
void OnShowText(const std::string& text) override;
void OnOpenUrl(const std::string& url) override;
void OnShowNotification(const action::Notification& notification) override;
void OnOpenAndroidApp(const action::AndroidAppInfo& app_info,
const action::InteractionInfo& interaction) override;
void OnVerifyAndroidApp(const std::vector<action::AndroidAppInfo>& apps_info,
const action::InteractionInfo& interaction) override;
// AssistantEventObserver overrides:
void OnSpeechLevelUpdated(float speech_level) override;
......@@ -193,6 +197,12 @@ class AssistantManagerServiceImpl
const assistant_client::SpeakerIdEnrollmentUpdate& update);
void HandleStopSpeakerIdEnrollment(base::RepeatingCallback<void()> callback);
void HandleOpenAndroidAppResponse(const action::InteractionInfo& interaction,
bool app_opened);
void HandleVerifyAndroidAppResponse(
const action::InteractionInfo& interaction,
std::vector<mojom::AndroidAppInfoPtr> apps_info);
void OnConversationTurnStartedOnMainThread(bool is_mic_open);
void OnConversationTurnFinishedOnMainThread(
assistant_client::ConversationStateListener::Resolution resolution);
......
......@@ -162,6 +162,13 @@ interface DeviceActions {
// Enables or disables Night Light.
SetNightLightEnabled(bool enabled);
// Open the Android app if the app is available.
OpenAndroidApp(AndroidAppInfo app_info) => (bool app_opened);
// Verify the status of the Android apps.
VerifyAndroidApp(array<AndroidAppInfo> apps_info) => (array<AndroidAppInfo>
apps_info);
};
// Enumeration of possible completions for an Assistant interaction.
......@@ -226,3 +233,15 @@ struct AssistantNotification {
// Obfuscated Gaia id of the intended recipient of the user.
string obfuscated_gaia_id;
};
// Models status of an app.
enum AppStatus { UNKNOWN, AVAILABLE, UNAVAILABLE, VERSION_MISMATCH, DISABLED };
// Models an Android app.
struct AndroidAppInfo {
string package_name;
int32 version;
string localized_app_name;
string intent;
AppStatus status;
};
......@@ -142,6 +142,11 @@ class FakeDeviceActions : mojom::DeviceActions {
}
void SetScreenBrightnessLevel(double level, bool gradual) override {}
void SetNightLightEnabled(bool enabled) override {}
void OpenAndroidApp(chromeos::assistant::mojom::AndroidAppInfoPtr app_info,
OpenAndroidAppCallback callback) override {}
void VerifyAndroidApp(
std::vector<chromeos::assistant::mojom::AndroidAppInfoPtr> apps_info,
VerifyAndroidAppCallback callback) 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