| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/lacros/arc/arc_intent_helper_mojo_lacros.h" |
| |
| #include "base/functional/bind.h" |
| #include "base/functional/callback.h" |
| #include "base/logging.h" |
| #include "chromeos/lacros/lacros_service.h" |
| |
| namespace arc { |
| |
| ArcIntentHelperMojoLacros::ArcIntentHelperMojoLacros() = default; |
| ArcIntentHelperMojoLacros::~ArcIntentHelperMojoLacros() = default; |
| |
| bool ArcIntentHelperMojoLacros::IsArcAvailable() { |
| auto* service = chromeos::LacrosService::Get(); |
| if (!service || !service->IsAvailable<crosapi::mojom::Arc>()) { |
| LOG(WARNING) << "ARC is not supported in Lacros."; |
| return false; |
| } |
| return true; |
| } |
| |
| bool ArcIntentHelperMojoLacros::IsRequestUrlHandlerListAvailable() { |
| auto* service = chromeos::LacrosService::Get(); |
| return service && service->IsAvailable<crosapi::mojom::Arc>() && |
| service->GetInterfaceVersion<crosapi::mojom::Arc>() >= |
| int{crosapi::mojom::Arc::MethodMinVersions:: |
| kRequestUrlHandlerListMinVersion}; |
| } |
| |
| bool ArcIntentHelperMojoLacros::IsRequestTextSelectionActionsAvailable() { |
| auto* service = chromeos::LacrosService::Get(); |
| return service && service->IsAvailable<crosapi::mojom::Arc>() && |
| service->GetInterfaceVersion<crosapi::mojom::Arc>() >= |
| int{crosapi::mojom::Arc::MethodMinVersions:: |
| kRequestTextSelectionActionsMinVersion}; |
| } |
| |
| bool ArcIntentHelperMojoLacros::RequestUrlHandlerList( |
| const std::string& url, |
| RequestUrlHandlerListCallback callback) { |
| if (!IsArcAvailable()) { |
| std::move(callback).Run(std::vector<IntentHandlerInfo>()); |
| return false; |
| } |
| |
| auto* service = chromeos::LacrosService::Get(); |
| if (service->GetInterfaceVersion<crosapi::mojom::Arc>() < |
| int{crosapi::mojom::Arc::MethodMinVersions:: |
| kRequestUrlHandlerListMinVersion}) { |
| LOG(WARNING) << "RequestUrlHandlerList is not supported in Lacros."; |
| std::move(callback).Run(std::vector<IntentHandlerInfo>()); |
| return false; |
| } |
| |
| service->GetRemote<crosapi::mojom::Arc>()->RequestUrlHandlerList( |
| url, base::BindOnce(&ArcIntentHelperMojoLacros::OnRequestUrlHandlerList, |
| weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| return true; |
| } |
| |
| void ArcIntentHelperMojoLacros::OnRequestUrlHandlerList( |
| RequestUrlHandlerListCallback callback, |
| std::vector<crosapi::mojom::IntentHandlerInfoPtr> handlers, |
| crosapi::mojom::RequestUrlHandlerListStatus status) { |
| if (status == crosapi::mojom::RequestUrlHandlerListStatus::kArcNotAvailable) { |
| LOG(WARNING) << "Faild to connect to ARC in ash-chrome."; |
| std::move(callback).Run(std::vector<IntentHandlerInfo>()); |
| return; |
| } |
| |
| std::vector<IntentHandlerInfo> converted_handlers; |
| for (auto const& handler : handlers) { |
| converted_handlers.emplace_back( |
| handler->name, handler->package_name, handler->activity_name, |
| handler->is_preferred, handler->fallback_url); |
| } |
| std::move(callback).Run(std::move(converted_handlers)); |
| } |
| |
| bool ArcIntentHelperMojoLacros::RequestTextSelectionActions( |
| const std::string& text, |
| ui::ResourceScaleFactor scale_factor, |
| RequestTextSelectionActionsCallback callback) { |
| if (!IsArcAvailable()) { |
| std::move(callback).Run(std::vector<TextSelectionAction>()); |
| return false; |
| } |
| |
| auto* service = chromeos::LacrosService::Get(); |
| if (service->GetInterfaceVersion<crosapi::mojom::Arc>() < |
| int{crosapi::mojom::Arc::MethodMinVersions:: |
| kRequestTextSelectionActionsMinVersion}) { |
| LOG(WARNING) << "RequestTextSelectionActions is not supported in Lacros."; |
| std::move(callback).Run(std::vector<TextSelectionAction>()); |
| return false; |
| } |
| |
| service->GetRemote<crosapi::mojom::Arc>()->RequestTextSelectionActions( |
| text, crosapi::mojom::ScaleFactor(scale_factor), |
| base::BindOnce(&ArcIntentHelperMojoLacros::OnRequestTextSelectionActions, |
| weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| return true; |
| } |
| |
| void ArcIntentHelperMojoLacros::OnRequestTextSelectionActions( |
| RequestTextSelectionActionsCallback callback, |
| crosapi::mojom::RequestTextSelectionActionsStatus status, |
| std::vector<crosapi::mojom::TextSelectionActionPtr> actions) { |
| if (status == |
| crosapi::mojom::RequestTextSelectionActionsStatus::kArcNotAvailable) { |
| LOG(WARNING) << "Failed to connect to ARC in ash-chrome."; |
| std::move(callback).Run(std::vector<TextSelectionAction>()); |
| return; |
| } |
| |
| std::vector<TextSelectionAction> converted_actions; |
| for (const auto& action : actions) { |
| converted_actions.emplace_back(TextSelectionAction( |
| std::move(action->app_id), std::move(action->icon), |
| ActivityName( |
| std::move(action->activity->package_name), |
| std::move(action->activity->activity_name.value_or(std::string()))), |
| std::move(action->title), |
| IntentInfo(std::move(action->action_intent->action), |
| std::move(action->action_intent->categories), |
| std::move(action->action_intent->data), |
| std::move(action->action_intent->type), |
| action->action_intent->ui_bypassed, |
| std::move(action->action_intent->extras)))); |
| } |
| std::move(callback).Run(std::move(converted_actions)); |
| } |
| |
| bool ArcIntentHelperMojoLacros::HandleUrl(const std::string& url, |
| const std::string& package_name) { |
| if (!IsArcAvailable()) |
| return false; |
| |
| auto* service = chromeos::LacrosService::Get(); |
| if (service->GetInterfaceVersion<crosapi::mojom::Arc>() < |
| int{crosapi::mojom::Arc::MethodMinVersions::kHandleUrlMinVersion}) { |
| LOG(WARNING) << "HandleUrl is not supported in Lacros."; |
| return false; |
| } |
| |
| service->GetRemote<crosapi::mojom::Arc>()->HandleUrl(url, package_name); |
| return true; |
| } |
| |
| bool ArcIntentHelperMojoLacros::HandleIntent(const IntentInfo& intent, |
| const ActivityName& activity) { |
| if (!IsArcAvailable()) |
| return false; |
| |
| auto* service = chromeos::LacrosService::Get(); |
| if (service->GetInterfaceVersion<crosapi::mojom::Arc>() < |
| int{crosapi::mojom::Arc::MethodMinVersions::kHandleIntentMinVersion}) { |
| LOG(WARNING) << "HandleIntent is not supported in Lacros."; |
| return false; |
| } |
| |
| crosapi::mojom::IntentInfoPtr converted_intent = |
| crosapi::mojom::IntentInfo::New(); |
| converted_intent->action = intent.action; |
| converted_intent->categories = intent.categories; |
| converted_intent->data = intent.data; |
| converted_intent->type = intent.type; |
| converted_intent->ui_bypassed = intent.ui_bypassed; |
| converted_intent->extras = intent.extras; |
| service->GetRemote<crosapi::mojom::Arc>()->HandleIntent( |
| std::move(converted_intent), |
| crosapi::mojom::ActivityName::New(activity.package_name, |
| activity.activity_name)); |
| return true; |
| } |
| |
| bool ArcIntentHelperMojoLacros::AddPreferredPackage( |
| const std::string& package_name) { |
| if (!IsArcAvailable()) |
| return false; |
| |
| auto* service = chromeos::LacrosService::Get(); |
| if (service->GetInterfaceVersion<crosapi::mojom::Arc>() < |
| int{crosapi::mojom::Arc::MethodMinVersions:: |
| kAddPreferredPackageMinVersion}) { |
| LOG(WARNING) << "AddPreferredPackage is not supported in Lacros."; |
| return false; |
| } |
| |
| service->GetRemote<crosapi::mojom::Arc>()->AddPreferredPackage(package_name); |
| return true; |
| } |
| |
| } // namespace arc |