| Index: chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_arc_home_service.cc
|
| diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_arc_home_service.cc b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_arc_home_service.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b2b0551c00de127abc9ca5ccc3d2c058834c4262
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_arc_home_service.cc
|
| @@ -0,0 +1,117 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_arc_home_service.h"
|
| +
|
| +#include <utility>
|
| +#include <vector>
|
| +
|
| +#include "ash/common/wm_shell.h"
|
| +#include "ash/shell.h"
|
| +#include "base/logging.h"
|
| +#include "base/strings/string16.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/browser/ui/browser_window.h"
|
| +#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "components/arc/arc_bridge_service.h"
|
| +#include "components/arc/instance_holder.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/voice_interaction_helper.h"
|
| +#include "ui/aura/window.h"
|
| +#include "ui/snapshot/snapshot.h"
|
| +#include "ui/wm/public/activation_client.h"
|
| +
|
| +namespace arc {
|
| +
|
| +namespace {
|
| +
|
| +// We can't use mojom::VoiceInteractionStructure directly here since
|
| +// the code in voice_interaction_helper will be shared with
|
| +// Android Chromium. Thus we still need to convert from the intermediate
|
| +// representation.
|
| +mojom::VoiceInteractionStructurePtr CreateVoiceInteractionStructure(
|
| + const content::AXViewStructure& view_structure) {
|
| + auto structure = mojom::VoiceInteractionStructure::New();
|
| + structure->text = view_structure.text;
|
| + structure->text_size = view_structure.text_size;
|
| +
|
| + structure->bold = view_structure.bold;
|
| + structure->italic = view_structure.italic;
|
| + structure->underline = view_structure.underline;
|
| + structure->line_through = view_structure.line_through;
|
| + structure->color = view_structure.color;
|
| + structure->bgcolor = view_structure.bgcolor;
|
| +
|
| + structure->class_name = view_structure.class_name;
|
| + structure->rect = view_structure.rect;
|
| +
|
| + if (view_structure.has_selection) {
|
| + auto selection = mojom::TextSelection::New();
|
| + selection->start_selection = view_structure.start_selection;
|
| + selection->end_selection = view_structure.end_selection;
|
| + structure->selection = std::move(selection);
|
| + }
|
| +
|
| + for (auto& child : view_structure.children)
|
| + structure->children.push_back(CreateVoiceInteractionStructure(*child));
|
| +
|
| + return structure;
|
| +}
|
| +
|
| +void RequestVoiceInteractionStructureCallback(
|
| + const base::Callback<void(mojom::VoiceInteractionStructurePtr)>& callback,
|
| + std::unique_ptr<content::AXViewStructure> result) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + callback.Run(CreateVoiceInteractionStructure(*result));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +ArcVoiceInteractionArcHomeService::ArcVoiceInteractionArcHomeService(
|
| + ArcBridgeService* bridge_service)
|
| + : ArcService(bridge_service), binding_(this) {
|
| + arc_bridge_service()->voice_interaction_arc_home()->AddObserver(this);
|
| +}
|
| +
|
| +ArcVoiceInteractionArcHomeService::~ArcVoiceInteractionArcHomeService() {
|
| + arc_bridge_service()->voice_interaction_arc_home()->RemoveObserver(this);
|
| +}
|
| +
|
| +void ArcVoiceInteractionArcHomeService::OnInstanceReady() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + mojom::VoiceInteractionArcHomeInstance* home_instance =
|
| + ARC_GET_INSTANCE_FOR_METHOD(
|
| + arc_bridge_service()->voice_interaction_arc_home(), Init);
|
| + DCHECK(home_instance);
|
| + home_instance->Init(binding_.CreateInterfacePtrAndBind());
|
| +}
|
| +
|
| +void ArcVoiceInteractionArcHomeService::GetVoiceInteractionStructure(
|
| + const GetVoiceInteractionStructureCallback& callback) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + Browser* browser = BrowserList::GetInstance()->GetLastActive();
|
| + if (!browser || !browser->window()->IsActive()) {
|
| + // TODO(muyuanli): retrieve context for apps.
|
| + LOG(ERROR) << "Retrieving context from apps is not implemented.";
|
| + callback.Run(mojom::VoiceInteractionStructure::New());
|
| + return;
|
| + }
|
| +
|
| + content::WebContents* web_contents =
|
| + browser->tab_strip_model()->GetActiveWebContents();
|
| + // Do not process incognito tab.
|
| + if (web_contents->GetBrowserContext()->IsOffTheRecord()) {
|
| + callback.Run(mojom::VoiceInteractionStructure::New());
|
| + return;
|
| + }
|
| +
|
| + content::GetAXViewStructure(
|
| + web_contents,
|
| + base::Bind(&RequestVoiceInteractionStructureCallback, callback));
|
| +}
|
| +
|
| +} // namespace arc
|
|
|