Commit 70aa1e82 authored by mfomitchev's avatar mfomitchev Committed by Commit bot

Revert of Introduce AndroidFocusRules and NativeWidgetAndroid (patchset #13...

Revert of Introduce AndroidFocusRules and NativeWidgetAndroid (patchset #13 id:560001 of https://codereview.chromium.org/1403293003/ )

Reason for revert:
Reverting the CL as the Android Aura project has been cancelled.

Also removing menu_config_android.cc which was added in https://codereview.chromium.org/1477253002.

Original issue's description:
> Introduce AndroidFocusRules and NativeWidgetAndroid
>
> NativeWidgetAndroidis very similar to NativeWidgetAura. It
> owns a WindowTreeHost and FocusController which initialized
> from AndroidFocusRules. Aura on Android should use this
> native widget for top level windows. It should create and host
> the Widget in a native Android window.
>
> BUG=507792
>
> Committed: https://crrev.com/31db6ee3532c748f40d2ae00514b5d91031d78e7
> Cr-Commit-Position: refs/heads/master@{#360645}

TBR=sadrul@chromium.org,sky@chromium.org,bshe@chromium.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=507792

Review URL: https://codereview.chromium.org/1639003002

Cr-Commit-Position: refs/heads/master@{#371918}
parent e6dc3f42
...@@ -53,10 +53,6 @@ ...@@ -53,10 +53,6 @@
#include "ui/views/linux_ui/linux_ui.h" #include "ui/views/linux_ui/linux_ui.h"
#endif #endif
#if defined(OS_ANDROID)
#include "ui/views/widget/android/native_widget_android.h"
#endif
#if defined(USE_ASH) #if defined(USE_ASH)
#include "ash/accelerators/accelerator_controller.h" #include "ash/accelerators/accelerator_controller.h"
#include "ash/shell.h" #include "ash/shell.h"
...@@ -438,11 +434,7 @@ void ChromeViewsDelegate::OnBeforeWidgetInit( ...@@ -438,11 +434,7 @@ void ChromeViewsDelegate::OnBeforeWidgetInit(
params->context ? params->context : params->parent; params->context ? params->context : params->parent;
if (chrome::GetHostDesktopTypeForNativeView(to_check) == if (chrome::GetHostDesktopTypeForNativeView(to_check) ==
chrome::HOST_DESKTOP_TYPE_NATIVE) { chrome::HOST_DESKTOP_TYPE_NATIVE) {
#if defined(OS_ANDROID)
params->native_widget = new views::NativeWidgetAndroid(delegate);
#else
params->native_widget = new views::DesktopNativeWidgetAura(delegate); params->native_widget = new views::DesktopNativeWidgetAura(delegate);
#endif
} }
} }
#endif #endif
......
...@@ -128,9 +128,6 @@ component("views") { ...@@ -128,9 +128,6 @@ component("views") {
sources += gypi_values.views_desktop_aura_linux_sources sources += gypi_values.views_desktop_aura_linux_sources
} }
} }
if (is_android) {
sources += gypi_values.views_android_sources
}
} }
if (is_mac) { if (is_mac) {
......
// Copyright 2015 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 "ui/views/controls/menu/menu_config.h"
namespace views {
void MenuConfig::Init() {
// Android uses the config provided by data member initializers.
}
} // namespace views
...@@ -410,13 +410,6 @@ ...@@ -410,13 +410,6 @@
'widget/window_reorderer.cc', 'widget/window_reorderer.cc',
'widget/window_reorderer.h', 'widget/window_reorderer.h',
], ],
'views_android_sources': [
'controls/menu/menu_config_android.cc',
'widget/android/android_focus_rules.cc',
'widget/android/android_focus_rules.h',
'widget/android/native_widget_android.cc',
'widget/android/native_widget_android.h',
],
'views_desktop_aura_sources': [ 'views_desktop_aura_sources': [
'widget/desktop_aura/desktop_capture_client.cc', 'widget/desktop_aura/desktop_capture_client.cc',
'widget/desktop_aura/desktop_capture_client.h', 'widget/desktop_aura/desktop_capture_client.h',
......
// Copyright 2015 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 "ui/views/widget/android/android_focus_rules.h"
#include "ui/aura/window.h"
namespace views {
AndroidFocusRules::AndroidFocusRules() {}
AndroidFocusRules::~AndroidFocusRules() {}
bool AndroidFocusRules::SupportsChildActivation(aura::Window* window) const {
return window->IsRootWindow();
}
} // namespace views
// Copyright 2015 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.
#ifndef UI_VIEWS_WIDGET_ANDROID_ANDROID_FOCUS_RULES_H_
#define UI_VIEWS_WIDGET_ANDROID_ANDROID_FOCUS_RULES_H_
#include "base/macros.h"
#include "ui/wm/core/base_focus_rules.h"
namespace views {
// A set of focus rules for Android using aura.
class AndroidFocusRules : public wm::BaseFocusRules {
public:
AndroidFocusRules();
~AndroidFocusRules() override;
private:
// wm::BaseFocusRules:
bool SupportsChildActivation(aura::Window* window) const override;
DISALLOW_COPY_AND_ASSIGN(AndroidFocusRules);
};
} // namespace views
#endif // UI_VIEWS_WIDGET_ANDROID_ANDROID_FOCUS_RULES_H_
// Copyright 2015 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 "ui/views/widget/android/native_widget_android.h"
#include "base/bind.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/strings/string_util.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/aura/client/default_capture_client.h"
#include "ui/aura/client/focus_client.h"
#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/client/window_tree_client.h"
#include "ui/aura/env.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_observer.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/base/ui_base_types.h"
#include "ui/compositor/layer.h"
#include "ui/events/event.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/screen.h"
#include "ui/native_theme/native_theme_aura.h"
#include "ui/views/drag_utils.h"
#include "ui/views/views_delegate.h"
#include "ui/views/widget/android/android_focus_rules.h"
#include "ui/views/widget/native_widget_aura.h"
#include "ui/views/widget/native_widget_delegate.h"
#include "ui/views/widget/root_view.h"
#include "ui/views/widget/tooltip_manager_aura.h"
#include "ui/views/widget/widget_aura_utils.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/widget/window_reorderer.h"
#include "ui/wm/core/default_activation_client.h"
#include "ui/wm/core/default_screen_position_client.h"
#include "ui/wm/core/focus_controller.h"
#include "ui/wm/core/shadow_types.h"
#include "ui/wm/core/window_animations.h"
#include "ui/wm/core/window_util.h"
#include "ui/wm/public/activation_client.h"
#include "ui/wm/public/dispatcher_client.h"
#include "ui/wm/public/drag_drop_client.h"
#include "ui/wm/public/window_move_client.h"
#include "ui/wm/public/window_types.h"
// TODO(bshe): Most of the code is copied from NativeWidgetAura or
// DesktopNativeWidgetAura. Share more code instead of duplicate code when
// possible. crbug.com/554961.
namespace {
class WindowTreeClientImpl : public aura::client::WindowTreeClient {
public:
explicit WindowTreeClientImpl(aura::Window* root_window)
: root_window_(root_window) {
aura::client::SetWindowTreeClient(root_window_, this);
}
~WindowTreeClientImpl() override {
aura::client::SetWindowTreeClient(root_window_, nullptr);
}
// Overridden from client::WindowTreeClient:
aura::Window* GetDefaultParent(aura::Window* context,
aura::Window* window,
const gfx::Rect& bounds) override {
return root_window_;
}
private:
aura::Window* root_window_;
DISALLOW_COPY_AND_ASSIGN(WindowTreeClientImpl);
};
// TODO(bshe|jonross): Get rid of nested message loop once crbug.com/523680 is
// fixed.
class AndroidDispatcherClient : public aura::client::DispatcherClient {
public:
AndroidDispatcherClient() {}
~AndroidDispatcherClient() override {}
// aura::client::DispatcherClient:
void PrepareNestedLoopClosures(base::MessagePumpDispatcher* dispatcher,
base::Closure* run_closure,
base::Closure* quit_closure) override {
scoped_ptr<base::RunLoop> run_loop(new base::RunLoop());
*quit_closure = run_loop->QuitClosure();
*run_closure =
base::Bind(&AndroidDispatcherClient::RunNestedDispatcher,
base::Unretained(this), base::Passed(&run_loop), dispatcher);
}
private:
void RunNestedDispatcher(scoped_ptr<base::RunLoop> run_loop,
base::MessagePumpDispatcher* dispatcher) {
base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
base::MessageLoop::ScopedNestableTaskAllower allow(loop);
run_loop->Run();
}
DISALLOW_COPY_AND_ASSIGN(AndroidDispatcherClient);
};
} // namespace
namespace views {
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, public
NativeWidgetAndroid::NativeWidgetAndroid(
internal::NativeWidgetDelegate* delegate)
: delegate_(delegate),
window_(new aura::Window(this)),
ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET),
destroying_(false),
cursor_(gfx::kNullCursor),
saved_window_state_(ui::SHOW_STATE_DEFAULT),
close_widget_factory_(this) {
aura::client::SetFocusChangeObserver(window_, this);
aura::client::SetActivationChangeObserver(window_, this);
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, internal::NativeWidgetPrivate implementation:
void NativeWidgetAndroid::InitNativeWidget(const Widget::InitParams& params) {
ownership_ = params.ownership;
NativeWidgetAura::RegisterNativeWidgetForWindow(this, window_);
window_->SetType(GetAuraWindowTypeForWidgetType(params.type));
window_->Init(params.layer_type);
wm::SetShadowType(window_, wm::SHADOW_TYPE_NONE);
window_->Show();
// TODO(bshe): Get rid of the hard coded size. Tracked in crbug.com/551923.
host_.reset(aura::WindowTreeHost::Create(gfx::Rect(0, 0, 800, 600)));
host_->InitHost();
host_->AddObserver(this);
window_tree_client_.reset(new WindowTreeClientImpl(host_->window()));
focus_client_.reset(new wm::FocusController(new AndroidFocusRules));
aura::client::SetFocusClient(host_->window(), focus_client_.get());
host_->window()->AddPreTargetHandler(focus_client_.get());
new wm::DefaultActivationClient(host_->window());
capture_client_.reset(
new aura::client::DefaultCaptureClient(host_->window()));
screen_position_client_.reset(new wm::DefaultScreenPositionClient);
aura::client::SetScreenPositionClient(host_->window(),
screen_position_client_.get());
dispatcher_client_.reset(new AndroidDispatcherClient);
aura::client::SetDispatcherClient(host_->window(), dispatcher_client_.get());
delegate_->OnNativeWidgetCreated(false);
DCHECK(GetWidget()->GetRootView());
if (params.type != Widget::InitParams::TYPE_TOOLTIP)
tooltip_manager_.reset(new views::TooltipManagerAura(GetWidget()));
if (params.type != Widget::InitParams::TYPE_TOOLTIP &&
params.type != Widget::InitParams::TYPE_POPUP) {
aura::client::SetDragDropDelegate(window_, this);
}
aura::client::SetActivationDelegate(window_, this);
host_->window()->AddChild(window_);
window_reorderer_.reset(
new WindowReorderer(window_, GetWidget()->GetRootView()));
// TODO(bshe): figure out how to add cursor manager, drag drop client and all
// the necessary parts that exists in desktop_native_widget_aura.
}
void NativeWidgetAndroid::OnWidgetInitDone() {}
NonClientFrameView* NativeWidgetAndroid::CreateNonClientFrameView() {
NOTIMPLEMENTED();
return nullptr;
}
bool NativeWidgetAndroid::ShouldUseNativeFrame() const {
// There is only one frame type for aura.
return false;
}
bool NativeWidgetAndroid::ShouldWindowContentsBeTransparent() const {
NOTIMPLEMENTED();
return false;
}
void NativeWidgetAndroid::FrameTypeChanged() {
NOTIMPLEMENTED();
}
Widget* NativeWidgetAndroid::GetWidget() {
return delegate_->AsWidget();
}
const Widget* NativeWidgetAndroid::GetWidget() const {
return delegate_->AsWidget();
}
gfx::NativeView NativeWidgetAndroid::GetNativeView() const {
return window_;
}
gfx::NativeWindow NativeWidgetAndroid::GetNativeWindow() const {
return window_;
}
Widget* NativeWidgetAndroid::GetTopLevelWidget() {
return GetWidget();
}
const ui::Compositor* NativeWidgetAndroid::GetCompositor() const {
return host_->compositor();
}
const ui::Layer* NativeWidgetAndroid::GetLayer() const {
return GetNativeWindow()->layer();
}
void NativeWidgetAndroid::ReorderNativeViews() {
window_reorderer_->ReorderChildWindows();
}
void NativeWidgetAndroid::ViewRemoved(View* view) {
// TODO(bshe): Implement drag and drop. crbug.com/554029.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::SetNativeWindowProperty(const char* name,
void* value) {
GetNativeWindow()->SetNativeWindowProperty(name, value);
}
void* NativeWidgetAndroid::GetNativeWindowProperty(const char* name) const {
return GetNativeWindow()->GetNativeWindowProperty(name);
}
TooltipManager* NativeWidgetAndroid::GetTooltipManager() const {
return tooltip_manager_.get();
}
void NativeWidgetAndroid::SetCapture() {
GetNativeWindow()->SetCapture();
}
void NativeWidgetAndroid::ReleaseCapture() {
GetNativeWindow()->ReleaseCapture();
}
bool NativeWidgetAndroid::HasCapture() const {
return GetNativeWindow()->HasCapture();
}
ui::InputMethod* NativeWidgetAndroid::GetInputMethod() {
return host_->GetInputMethod();
}
void NativeWidgetAndroid::CenterWindow(const gfx::Size& size) {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::GetWindowPlacement(
gfx::Rect* bounds,
ui::WindowShowState* show_state) const {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
bool NativeWidgetAndroid::SetWindowTitle(const base::string16& title) {
if (GetNativeWindow()->title() == title)
return false;
GetNativeWindow()->SetTitle(title);
return true;
}
void NativeWidgetAndroid::SetWindowIcons(const gfx::ImageSkia& window_icon,
const gfx::ImageSkia& app_icon) {
// TODO(bshe): Implement this. See crbug.com/554953.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::InitModalType(ui::ModalType modal_type) {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
gfx::Rect NativeWidgetAndroid::GetWindowBoundsInScreen() const {
return GetNativeWindow()->GetBoundsInScreen();
}
gfx::Rect NativeWidgetAndroid::GetClientAreaBoundsInScreen() const {
// View-to-screen coordinate system transformations depend on this returning
// the full window bounds, for example View::ConvertPointToScreen().
return GetNativeWindow()->GetBoundsInScreen();
}
gfx::Rect NativeWidgetAndroid::GetRestoredBounds() const {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
return gfx::Rect();
}
void NativeWidgetAndroid::SetBounds(const gfx::Rect& bounds) {
// TODO(bshe): This may not work. We may need to resize SurfaceView too. See
// crbug.com/554952.
host_->SetBounds(bounds);
}
void NativeWidgetAndroid::SetSize(const gfx::Size& size) {
gfx::Rect bounds = host_->GetBounds();
SetBounds(gfx::Rect(bounds.origin(), size));
}
void NativeWidgetAndroid::StackAbove(gfx::NativeView native_view) {
// TODO(bshe): Implements window stacking logic. See crbug.com/554047
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::StackAtTop() {
// TODO(bshe): Implements window stacking logic. See crbug.com/554047
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::StackBelow(gfx::NativeView native_view) {
// TODO(bshe): Implements window stacking logic. See crbug.com/554047
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::SetShape(SkRegion* region) {
GetNativeWindow()->layer()->SetAlphaShape(make_scoped_ptr(region));
}
void NativeWidgetAndroid::Close() {
// TODO(bshe): This might not be right. See crbug.com/554259.
DCHECK(ownership_ == Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET);
GetNativeWindow()->SuppressPaint();
Hide();
GetNativeWindow()->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_NONE);
if (!close_widget_factory_.HasWeakPtrs()) {
base::MessageLoop::current()->PostTask(
FROM_HERE, base::Bind(&NativeWidgetAndroid::CloseNow,
close_widget_factory_.GetWeakPtr()));
}
}
void NativeWidgetAndroid::CloseNow() {
// TODO(bshe): This might not be right. See crbug.com/554259.
host_->RemoveObserver(this);
host_.reset();
delete window_;
}
void NativeWidgetAndroid::Show() {
host_->Show();
GetNativeWindow()->Show();
}
void NativeWidgetAndroid::Hide() {
host_->Hide();
GetNativeWindow()->Hide();
}
void NativeWidgetAndroid::ShowMaximizedWithBounds(
const gfx::Rect& restored_bounds) {
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::ShowWithWindowState(ui::WindowShowState state) {
NOTIMPLEMENTED();
}
bool NativeWidgetAndroid::IsVisible() const {
return GetNativeWindow()->IsVisible();
}
void NativeWidgetAndroid::Activate() {
aura::client::GetActivationClient(host_->window())
->ActivateWindow(GetNativeWindow());
}
void NativeWidgetAndroid::Deactivate() {
aura::client::GetActivationClient(host_->window())
->DeactivateWindow(GetNativeWindow());
}
bool NativeWidgetAndroid::IsActive() const {
return wm::IsActiveWindow(GetNativeWindow());
}
void NativeWidgetAndroid::SetAlwaysOnTop(bool on_top) {
GetNativeWindow()->SetProperty(aura::client::kAlwaysOnTopKey, on_top);
}
bool NativeWidgetAndroid::IsAlwaysOnTop() const {
return GetNativeWindow()->GetProperty(aura::client::kAlwaysOnTopKey);
}
void NativeWidgetAndroid::SetVisibleOnAllWorkspaces(bool always_visible) {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::Maximize() {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::Minimize() {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
bool NativeWidgetAndroid::IsMaximized() const {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
return false;
}
bool NativeWidgetAndroid::IsMinimized() const {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
return false;
}
void NativeWidgetAndroid::Restore() {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::SetFullscreen(bool fullscreen) {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
bool NativeWidgetAndroid::IsFullscreen() const {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
return false;
}
void NativeWidgetAndroid::SetOpacity(unsigned char opacity) {
GetNativeWindow()->layer()->SetOpacity(opacity / 255.0);
}
void NativeWidgetAndroid::SetUseDragFrame(bool use_drag_frame) {
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::FlashFrame(bool flash) {
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::RunShellDrag(
View* view,
const ui::OSExchangeData& data,
const gfx::Point& location,
int operation,
ui::DragDropTypes::DragEventSource source) {
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::SchedulePaintInRect(const gfx::Rect& rect) {
GetNativeWindow()->SchedulePaintInRect(rect);
}
void NativeWidgetAndroid::SetCursor(gfx::NativeCursor cursor) {
cursor_ = cursor;
aura::client::CursorClient* cursor_client =
aura::client::GetCursorClient(host_->window());
if (cursor_client)
cursor_client->SetCursor(cursor);
}
bool NativeWidgetAndroid::IsMouseEventsEnabled() const {
aura::client::CursorClient* cursor_client =
aura::client::GetCursorClient(host_->window());
return cursor_client ? cursor_client->IsMouseEventsEnabled() : true;
}
void NativeWidgetAndroid::ClearNativeFocus() {
aura::client::FocusClient* client = aura::client::GetFocusClient(window_);
if (client && window_->Contains(client->GetFocusedWindow()))
client->ResetFocusWithinActiveWindow(window_);
}
gfx::Rect NativeWidgetAndroid::GetWorkAreaBoundsInScreen() const {
return gfx::Screen::GetScreenFor(window_)
->GetDisplayNearestWindow(window_)
.work_area();
}
Widget::MoveLoopResult NativeWidgetAndroid::RunMoveLoop(
const gfx::Vector2d& drag_offset,
Widget::MoveLoopSource source,
Widget::MoveLoopEscapeBehavior escape_behavior) {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
return Widget::MOVE_LOOP_SUCCESSFUL;
}
void NativeWidgetAndroid::EndMoveLoop() {
// TODO(bshe): Implement this. See crbug.com/554208.
NOTIMPLEMENTED();
}
void NativeWidgetAndroid::SetVisibilityChangedAnimationsEnabled(bool value) {
GetNativeWindow()->SetProperty(aura::client::kAnimationsDisabledKey, !value);
}
void NativeWidgetAndroid::SetVisibilityAnimationDuration(
const base::TimeDelta& duration) {
wm::SetWindowVisibilityAnimationDuration(GetNativeWindow(), duration);
}
void NativeWidgetAndroid::SetVisibilityAnimationTransition(
Widget::VisibilityTransition transition) {
wm::WindowVisibilityAnimationTransition wm_transition = wm::ANIMATE_NONE;
switch (transition) {
case Widget::ANIMATE_SHOW:
wm_transition = wm::ANIMATE_SHOW;
break;
case Widget::ANIMATE_HIDE:
wm_transition = wm::ANIMATE_HIDE;
break;
case Widget::ANIMATE_BOTH:
wm_transition = wm::ANIMATE_BOTH;
break;
case Widget::ANIMATE_NONE:
wm_transition = wm::ANIMATE_NONE;
break;
}
wm::SetWindowVisibilityAnimationTransition(GetNativeWindow(), wm_transition);
}
ui::NativeTheme* NativeWidgetAndroid::GetNativeTheme() const {
return ui::NativeThemeAura::instance();
}
void NativeWidgetAndroid::OnRootViewLayout() {
NOTIMPLEMENTED();
}
bool NativeWidgetAndroid::IsTranslucentWindowOpacitySupported() const {
return true;
}
void NativeWidgetAndroid::OnSizeConstraintsChanged() {
window_->SetProperty(aura::client::kCanMaximizeKey,
GetWidget()->widget_delegate()->CanMaximize());
window_->SetProperty(aura::client::kCanMinimizeKey,
GetWidget()->widget_delegate()->CanMinimize());
window_->SetProperty(aura::client::kCanResizeKey,
GetWidget()->widget_delegate()->CanResize());
}
void NativeWidgetAndroid::RepostNativeEvent(gfx::NativeEvent native_event) {
OnEvent(native_event);
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, aura::WindowDelegate implementation:
gfx::Size NativeWidgetAndroid::GetMinimumSize() const {
return delegate_->GetMinimumSize();
}
gfx::Size NativeWidgetAndroid::GetMaximumSize() const {
// If a window have a maximum size, the window should not be
// maximizable.
DCHECK(delegate_->GetMaximumSize().IsEmpty() ||
!window_->GetProperty(aura::client::kCanMaximizeKey));
return delegate_->GetMaximumSize();
}
void NativeWidgetAndroid::OnBoundsChanged(const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds) {
// Assume that if the old bounds was completely empty a move happened. This
// handles the case of a maximize animation acquiring the layer (acquiring a
// layer results in clearing the bounds).
if (old_bounds.origin() != new_bounds.origin() ||
(old_bounds == gfx::Rect(0, 0, 0, 0) && !new_bounds.IsEmpty())) {
delegate_->OnNativeWidgetMove();
}
if (old_bounds.size() != new_bounds.size())
delegate_->OnNativeWidgetSizeChanged(new_bounds.size());
}
gfx::NativeCursor NativeWidgetAndroid::GetCursor(const gfx::Point& point) {
return cursor_;
}
int NativeWidgetAndroid::GetNonClientComponent(const gfx::Point& point) const {
return delegate_->GetNonClientComponent(point);
}
bool NativeWidgetAndroid::ShouldDescendIntoChildForEventHandling(
aura::Window* child,
const gfx::Point& location) {
views::WidgetDelegate* widget_delegate = GetWidget()->widget_delegate();
if (widget_delegate &&
!widget_delegate->ShouldDescendIntoChildForEventHandling(child, location))
return false;
// Don't descend into |child| if there is a view with a Layer that contains
// the point and is stacked above |child|s layer.
typedef std::vector<ui::Layer*> Layers;
const Layers& root_layers(delegate_->GetRootLayers());
if (root_layers.empty())
return true;
Layers::const_iterator child_layer_iter(
std::find(window_->layer()->children().begin(),
window_->layer()->children().end(), child->layer()));
if (child_layer_iter == window_->layer()->children().end())
return true;
for (std::vector<ui::Layer*>::const_reverse_iterator i = root_layers.rbegin();
i != root_layers.rend(); ++i) {
ui::Layer* layer = *i;
if (layer->visible() && layer->bounds().Contains(location)) {
Layers::const_iterator root_layer_iter(
std::find(window_->layer()->children().begin(),
window_->layer()->children().end(), layer));
if (root_layer_iter > child_layer_iter)
return false;
}
}
return true;
}
bool NativeWidgetAndroid::CanFocus() {
return ShouldActivate();
}
void NativeWidgetAndroid::OnCaptureLost() {
delegate_->OnMouseCaptureLost();
}
void NativeWidgetAndroid::OnPaint(const ui::PaintContext& context) {
delegate_->OnNativeWidgetPaint(context);
}
void NativeWidgetAndroid::OnDeviceScaleFactorChanged(
float device_scale_factor) {
GetWidget()->DeviceScaleFactorChanged(device_scale_factor);
}
void NativeWidgetAndroid::OnWindowDestroying(aura::Window* window) {
delegate_->OnNativeWidgetDestroying();
// If the aura::Window is destroyed, we can no longer show tooltips.
tooltip_manager_.reset();
}
void NativeWidgetAndroid::OnWindowDestroyed(aura::Window* window) {
window_ = nullptr;
delegate_->OnNativeWidgetDestroyed();
if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
delete this;
}
void NativeWidgetAndroid::OnWindowTargetVisibilityChanged(bool visible) {
delegate_->OnNativeWidgetVisibilityChanged(visible);
}
bool NativeWidgetAndroid::HasHitTestMask() const {
return delegate_->HasHitTestMask();
}
void NativeWidgetAndroid::GetHitTestMask(gfx::Path* mask) const {
DCHECK(mask);
delegate_->GetHitTestMask(mask);
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, ui::EventHandler implementation:
void NativeWidgetAndroid::OnKeyEvent(ui::KeyEvent* event) {
DCHECK(window_);
// Renderer may send a key event back to us if the key event wasn't handled,
// and the window may be invisible by that time.
if (!window_->IsVisible())
return;
FocusManager* focus_manager = GetWidget()->GetFocusManager();
delegate_->OnKeyEvent(event);
if (!event->handled() && focus_manager)
focus_manager->OnKeyEvent(*event);
event->SetHandled();
}
void NativeWidgetAndroid::OnMouseEvent(ui::MouseEvent* event) {
DCHECK(window_);
DCHECK(window_->IsVisible());
if (event->type() == ui::ET_MOUSEWHEEL) {
delegate_->OnMouseEvent(event);
if (event->handled())
return;
}
if (tooltip_manager_.get())
tooltip_manager_->UpdateTooltip();
TooltipManagerAura::UpdateTooltipManagerForCapture(GetWidget());
delegate_->OnMouseEvent(event);
}
void NativeWidgetAndroid::OnScrollEvent(ui::ScrollEvent* event) {
delegate_->OnScrollEvent(event);
}
void NativeWidgetAndroid::OnGestureEvent(ui::GestureEvent* event) {
DCHECK(window_);
DCHECK(window_->IsVisible() || event->IsEndingEvent());
delegate_->OnGestureEvent(event);
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, aura::client::ActivationDelegate implementation:
bool NativeWidgetAndroid::ShouldActivate() const {
return delegate_->CanActivate();
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, aura::client::ActivationChangeObserver
// implementation:
void NativeWidgetAndroid::OnWindowActivated(
aura::client::ActivationChangeObserver::ActivationReason,
aura::Window* gained_active,
aura::Window* lost_active) {
DCHECK(window_ == gained_active || window_ == lost_active);
if (GetWidget()->GetFocusManager()) {
if (window_ == gained_active)
GetWidget()->GetFocusManager()->RestoreFocusedView();
else if (window_ == lost_active)
GetWidget()->GetFocusManager()->StoreFocusedView(true);
}
delegate_->OnNativeWidgetActivationChanged(window_ == gained_active);
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, aura::client::FocusChangeObserver:
void NativeWidgetAndroid::OnWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) {
if (window_ == gained_focus)
delegate_->OnNativeFocus();
else if (window_ == lost_focus)
delegate_->OnNativeBlur();
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, aura::WindowDragDropDelegate implementation:
void NativeWidgetAndroid::OnDragEntered(const ui::DropTargetEvent& event) {
// TODO: Implement drag and drop. crbug.com/554029.
NOTIMPLEMENTED();
}
int NativeWidgetAndroid::OnDragUpdated(const ui::DropTargetEvent& event) {
// TODO: Implement drag and drop. crbug.com/554029.
NOTIMPLEMENTED();
return 0;
}
void NativeWidgetAndroid::OnDragExited() {
// TODO: Implement drag and drop. crbug.com/554029.
NOTIMPLEMENTED();
}
int NativeWidgetAndroid::OnPerformDrop(const ui::DropTargetEvent& event) {
// TODO: Implement drag and drop. crbug.com/554029.
NOTIMPLEMENTED();
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, aura::WindowTreeHostObserver implementation:
void NativeWidgetAndroid::OnHostCloseRequested(
const aura::WindowTreeHost* host) {
GetWidget()->Close();
}
void NativeWidgetAndroid::OnHostResized(const aura::WindowTreeHost* host) {
gfx::Rect new_bounds = gfx::Rect(host_->window()->bounds().size());
GetNativeWindow()->SetBounds(new_bounds);
delegate_->OnNativeWidgetSizeChanged(new_bounds.size());
}
void NativeWidgetAndroid::OnHostMoved(const aura::WindowTreeHost* host,
const gfx::Point& new_origin) {
TRACE_EVENT1("views", "NativeWidgetAndroid::OnHostMoved", "new_origin",
new_origin.ToString());
delegate_->OnNativeWidgetMove();
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, protected:
NativeWidgetAndroid::~NativeWidgetAndroid() {
destroying_ = true;
if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
delete delegate_;
else
CloseNow();
}
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetAndroid, private:
bool NativeWidgetAndroid::IsDocked() const {
NOTIMPLEMENTED();
return false;
}
void NativeWidgetAndroid::SetInitialFocus(ui::WindowShowState show_state) {
// The window does not get keyboard messages unless we focus it.
if (!GetWidget()->SetInitialFocus(show_state))
window_->Focus();
}
} // namespace views
// Copyright 2015 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.
#ifndef UI_VIEWS_WIDGET_ANDROID_NATIVE_WIDGET_ANDROID_H_
#define UI_VIEWS_WIDGET_ANDROID_NATIVE_WIDGET_ANDROID_H_
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/aura/client/focus_change_observer.h"
#include "ui/aura/window_delegate.h"
#include "ui/aura/window_observer.h"
#include "ui/aura/window_tree_host_observer.h"
#include "ui/base/cursor/cursor.h"
#include "ui/events/event_constants.h"
#include "ui/views/views_export.h"
#include "ui/views/widget/native_widget_private.h"
#include "ui/wm/public/activation_change_observer.h"
#include "ui/wm/public/activation_delegate.h"
#include "ui/wm/public/drag_drop_delegate.h"
namespace aura {
class Window;
class WindowTreeHost;
namespace client {
class DefaultCaptureClient;
class DispatcherClient;
class ScreenPositionClient;
class WindowTreeClient;
}
}
namespace gfx {
class FontList;
}
namespace wm {
class FocusController;
}
namespace views {
class TooltipManagerAura;
class WindowReorderer;
// NativeWidgetAndroid creates and hosts the Widget in an Android native window.
// It is used to create a top level window on Android platform.
class VIEWS_EXPORT NativeWidgetAndroid
: public internal::NativeWidgetPrivate,
public aura::WindowDelegate,
public aura::client::ActivationDelegate,
public aura::client::ActivationChangeObserver,
public aura::client::FocusChangeObserver,
public aura::client::DragDropDelegate,
public aura::WindowTreeHostObserver {
public:
explicit NativeWidgetAndroid(internal::NativeWidgetDelegate* delegate);
aura::WindowTreeHost* host() { return host_.get(); }
// Overridden from internal::NativeWidgetPrivate:
void InitNativeWidget(const Widget::InitParams& params) override;
void OnWidgetInitDone() override;
NonClientFrameView* CreateNonClientFrameView() override;
bool ShouldUseNativeFrame() const override;
bool ShouldWindowContentsBeTransparent() const override;
void FrameTypeChanged() override;
Widget* GetWidget() override;
const Widget* GetWidget() const override;
gfx::NativeView GetNativeView() const override;
gfx::NativeWindow GetNativeWindow() const override;
Widget* GetTopLevelWidget() override;
const ui::Compositor* GetCompositor() const override;
const ui::Layer* GetLayer() const override;
void ReorderNativeViews() override;
void ViewRemoved(View* view) override;
void SetNativeWindowProperty(const char* name, void* value) override;
void* GetNativeWindowProperty(const char* name) const override;
TooltipManager* GetTooltipManager() const override;
void SetCapture() override;
void ReleaseCapture() override;
bool HasCapture() const override;
ui::InputMethod* GetInputMethod() override;
void CenterWindow(const gfx::Size& size) override;
void GetWindowPlacement(gfx::Rect* bounds,
ui::WindowShowState* maximized) const override;
bool SetWindowTitle(const base::string16& title) override;
void SetWindowIcons(const gfx::ImageSkia& window_icon,
const gfx::ImageSkia& app_icon) override;
void InitModalType(ui::ModalType modal_type) override;
gfx::Rect GetWindowBoundsInScreen() const override;
gfx::Rect GetClientAreaBoundsInScreen() const override;
gfx::Rect GetRestoredBounds() const override;
void SetBounds(const gfx::Rect& bounds) override;
void SetSize(const gfx::Size& size) override;
void StackAbove(gfx::NativeView native_view) override;
void StackAtTop() override;
void StackBelow(gfx::NativeView native_view) override;
void SetShape(SkRegion* shape) override;
void Close() override;
void CloseNow() override;
void Show() override;
void Hide() override;
void ShowMaximizedWithBounds(const gfx::Rect& restored_bounds) override;
void ShowWithWindowState(ui::WindowShowState state) override;
bool IsVisible() const override;
void Activate() override;
void Deactivate() override;
bool IsActive() const override;
void SetAlwaysOnTop(bool always_on_top) override;
bool IsAlwaysOnTop() const override;
void SetVisibleOnAllWorkspaces(bool always_visible) override;
void Maximize() override;
void Minimize() override;
bool IsMaximized() const override;
bool IsMinimized() const override;
void Restore() override;
void SetFullscreen(bool fullscreen) override;
bool IsFullscreen() const override;
void SetOpacity(unsigned char opacity) override;
void SetUseDragFrame(bool use_drag_frame) override;
void FlashFrame(bool flash_frame) override;
void RunShellDrag(View* view,
const ui::OSExchangeData& data,
const gfx::Point& location,
int operation,
ui::DragDropTypes::DragEventSource source) override;
void SchedulePaintInRect(const gfx::Rect& rect) override;
void SetCursor(gfx::NativeCursor cursor) override;
bool IsMouseEventsEnabled() const override;
void ClearNativeFocus() override;
gfx::Rect GetWorkAreaBoundsInScreen() const override;
Widget::MoveLoopResult RunMoveLoop(
const gfx::Vector2d& drag_offset,
Widget::MoveLoopSource source,
Widget::MoveLoopEscapeBehavior escape_behavior) override;
void EndMoveLoop() override;
void SetVisibilityChangedAnimationsEnabled(bool value) override;
void SetVisibilityAnimationDuration(const base::TimeDelta& duration) override;
void SetVisibilityAnimationTransition(
Widget::VisibilityTransition transition) override;
ui::NativeTheme* GetNativeTheme() const override;
void OnRootViewLayout() override;
bool IsTranslucentWindowOpacitySupported() const override;
void OnSizeConstraintsChanged() override;
void RepostNativeEvent(gfx::NativeEvent native_event) override;
// Overridden from aura::WindowDelegate:
gfx::Size GetMinimumSize() const override;
gfx::Size GetMaximumSize() const override;
void OnBoundsChanged(const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds) override;
gfx::NativeCursor GetCursor(const gfx::Point& point) override;
int GetNonClientComponent(const gfx::Point& point) const override;
bool ShouldDescendIntoChildForEventHandling(
aura::Window* child,
const gfx::Point& location) override;
bool CanFocus() override;
void OnCaptureLost() override;
void OnPaint(const ui::PaintContext& context) override;
void OnDeviceScaleFactorChanged(float device_scale_factor) override;
void OnWindowDestroying(aura::Window* window) override;
void OnWindowDestroyed(aura::Window* window) override;
void OnWindowTargetVisibilityChanged(bool visible) override;
bool HasHitTestMask() const override;
void GetHitTestMask(gfx::Path* mask) const override;
// Overridden from ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
void OnScrollEvent(ui::ScrollEvent* event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
// Overridden from aura::client::ActivationDelegate:
bool ShouldActivate() const override;
// Overridden from aura::client::ActivationChangeObserver:
void OnWindowActivated(
aura::client::ActivationChangeObserver::ActivationReason reason,
aura::Window* gained_active,
aura::Window* lost_active) override;
// Overridden from aura::client::FocusChangeObserver:
void OnWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) override;
// Overridden from aura::client::DragDropDelegate:
void OnDragEntered(const ui::DropTargetEvent& event) override;
int OnDragUpdated(const ui::DropTargetEvent& event) override;
void OnDragExited() override;
int OnPerformDrop(const ui::DropTargetEvent& event) override;
// Overridden from aura::WindowTreeHostObserver:
void OnHostCloseRequested(const aura::WindowTreeHost* host) override;
void OnHostResized(const aura::WindowTreeHost* host) override;
void OnHostMoved(const aura::WindowTreeHost* host,
const gfx::Point& new_origin) override;
protected:
~NativeWidgetAndroid() override;
internal::NativeWidgetDelegate* delegate() { return delegate_; }
private:
class ActiveWindowObserver;
bool IsDocked() const;
void SetInitialFocus(ui::WindowShowState show_state);
internal::NativeWidgetDelegate* delegate_;
// WARNING: set to NULL when destroyed. As the Widget is not necessarily
// destroyed along with |window_| all usage of |window_| should first verify
// non-NULL.
aura::Window* window_;
// See class documentation for Widget in widget.h for a note about ownership.
Widget::InitParams::Ownership ownership_;
// Are we in the destructor?
bool destroying_;
gfx::NativeCursor cursor_;
// The saved window state for exiting full screen state.
ui::WindowShowState saved_window_state_;
scoped_ptr<TooltipManagerAura> tooltip_manager_;
// Reorders child windows of |window_| associated with a view based on the
// order of the associated views in the widget's view hierarchy.
scoped_ptr<WindowReorderer> window_reorderer_;
scoped_ptr<aura::WindowTreeHost> host_;
scoped_ptr<wm::FocusController> focus_client_;
scoped_ptr<aura::client::DefaultCaptureClient> capture_client_;
scoped_ptr<aura::client::WindowTreeClient> window_tree_client_;
scoped_ptr<aura::client::ScreenPositionClient> screen_position_client_;
scoped_ptr<aura::client::DispatcherClient> dispatcher_client_;
// The following factory is used for calls to close the
// NativeWidgetAndroid instance.
base::WeakPtrFactory<NativeWidgetAndroid> close_widget_factory_;
DISALLOW_COPY_AND_ASSIGN(NativeWidgetAndroid);
};
} // namespace views
#endif // UI_VIEWS_WIDGET_ANDROID_NATIVE_WIDGET_ANDROID_H_
...@@ -42,8 +42,8 @@ class VIEWS_EXPORT NativeWidgetAura ...@@ -42,8 +42,8 @@ class VIEWS_EXPORT NativeWidgetAura
public: public:
explicit NativeWidgetAura(internal::NativeWidgetDelegate* delegate); explicit NativeWidgetAura(internal::NativeWidgetDelegate* delegate);
// Called internally by NativeWidget implementations to associate // Called internally by NativeWidgetAura and DesktopNativeWidgetAura to
// |native_widget| with |window|. // associate |native_widget| with |window|.
static void RegisterNativeWidgetForWindow( static void RegisterNativeWidgetForWindow(
internal::NativeWidgetPrivate* native_widget, internal::NativeWidgetPrivate* native_widget,
aura::Window* window); aura::Window* window);
......
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