Commit 89d850c3 authored by mukai@chromium.org's avatar mukai@chromium.org

Minimize HomeCard if the user opens something in the home card.

This is applied to:
- open to the search result
- click on app icon

I am not sure this is the right approach. We may want to introduce
an ActivityObserver or something, and minimize the home card
by itself. However, activity may be created for various reason
but minimizing should work upon the user's action on the
home card, so this approach isn't bad.

BUG=None
R=oshima@chromium.org, sadrul@chromium.org
TBR=sky@chromium.org
TEST=manually

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284962 0039d316-1c4b-4281-b951-d872f2087c98
parent b7a490e0
......@@ -40,6 +40,7 @@ class ActivityWidget {
void Show() {
Update();
widget_->Show();
widget_->Activate();
}
void Update() {
......
......@@ -152,6 +152,7 @@
'sources': [
'test/athena_unittests.cc',
'activity/activity_manager_unittest.cc',
'home/home_card_unittest.cc',
'input/accelerator_manager_unittest.cc',
'wm/window_manager_unittest.cc',
],
......
......@@ -8,4 +8,10 @@ include_rules = [
"+ui/gfx/image",
"+ui/views",
"+ui/wm/core",
"+ui/wm/public",
]
specific_include_rules = {
".*_unittest.cc": [
"+athena/activity/public",
]
}
......@@ -26,6 +26,8 @@
#include "ui/views/widget/widget_delegate.h"
#include "ui/wm/core/visibility_controller.h"
#include "ui/wm/core/window_animations.h"
#include "ui/wm/public/activation_change_observer.h"
#include "ui/wm/public/activation_client.h"
namespace athena {
namespace {
......@@ -153,7 +155,8 @@ class HomeCardImpl : public HomeCard,
public AcceleratorHandler,
public HomeCardLayoutManager::Delegate,
public MinimizedHomeDragDelegate,
public WindowManagerObserver {
public WindowManagerObserver,
public aura::client::ActivationChangeObserver {
public:
explicit HomeCardImpl(AppModelBuilder* model_builder);
virtual ~HomeCardImpl();
......@@ -168,6 +171,7 @@ class HomeCardImpl : public HomeCard,
// Overridden from HomeCard:
virtual void SetState(State state) OVERRIDE;
virtual State GetState() OVERRIDE;
virtual void RegisterSearchProvider(
app_list::SearchProvider* search_provider) OVERRIDE;
virtual void UpdateVirtualKeyboardBounds(
......@@ -232,6 +236,13 @@ class HomeCardImpl : public HomeCard,
SetState(VISIBLE_MINIMIZED);
}
// aura::client::ActivationChangeObserver:
virtual void OnWindowActivated(aura::Window* gained_active,
aura::Window* lost_active) OVERRIDE {
if (gained_active != home_card_widget_->GetNativeWindow())
SetState(VISIBLE_MINIMIZED);
}
scoped_ptr<AppModelBuilder> model_builder_;
HomeCard::State state_;
......@@ -244,6 +255,7 @@ class HomeCardImpl : public HomeCard,
HomeCardView* home_card_view_;
scoped_ptr<AppListViewDelegate> view_delegate_;
HomeCardLayoutManager* layout_manager_;
aura::client::ActivationClient* activation_client_; // Not owned
// Right now HomeCard allows only one search provider.
// TODO(mukai): port app-list's SearchController and Mixer.
......@@ -254,11 +266,12 @@ class HomeCardImpl : public HomeCard,
HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder)
: model_builder_(model_builder),
state_(VISIBLE_MINIMIZED),
state_(HIDDEN),
original_state_(VISIBLE_MINIMIZED),
home_card_widget_(NULL),
home_card_view_(NULL),
layout_manager_(NULL) {
layout_manager_(NULL),
activation_client_(NULL) {
DCHECK(!instance);
instance = this;
WindowManager::GetInstance()->AddObserver(this);
......@@ -267,11 +280,16 @@ HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder)
HomeCardImpl::~HomeCardImpl() {
DCHECK(instance);
WindowManager::GetInstance()->RemoveObserver(this);
if (activation_client_)
activation_client_->RemoveObserver(this);
home_card_widget_->CloseNow();
instance = NULL;
}
void HomeCardImpl::SetState(HomeCard::State state) {
if (state_ == state)
return;
// Update |state_| before changing the visibility of the widgets, so that
// LayoutManager callbacks get the correct state.
state_ = state;
......@@ -285,6 +303,10 @@ void HomeCardImpl::SetState(HomeCard::State state) {
}
}
HomeCard::State HomeCardImpl::GetState() {
return state_;
}
void HomeCardImpl::RegisterSearchProvider(
app_list::SearchProvider* search_provider) {
DCHECK(!search_provider_);
......@@ -330,6 +352,11 @@ void HomeCardImpl::Init() {
SetState(VISIBLE_MINIMIZED);
home_card_view_->Layout();
activation_client_ =
aura::client::GetActivationClient(container->GetRootWindow());
if (activation_client_)
activation_client_->AddObserver(this);
}
void HomeCardImpl::InstallAccelerators() {
......
// Copyright 2014 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 "athena/home/public/home_card.h"
#include "athena/activity/public/activity_factory.h"
#include "athena/activity/public/activity_manager.h"
#include "athena/test/athena_test_base.h"
#include "athena/wm/public/window_manager.h"
namespace athena {
typedef test::AthenaTestBase HomeCardTest;
TEST_F(HomeCardTest, BasicTransition) {
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
WindowManager::GetInstance()->ToggleOverview();
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
WindowManager::GetInstance()->ToggleOverview();
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
}
TEST_F(HomeCardTest, VirtualKeyboardTransition) {
// Minimized -> Hidden for virtual keyboard.
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
const gfx::Rect vk_bounds(0, 0, 100, 100);
HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds);
EXPECT_EQ(HomeCard::HIDDEN, HomeCard::Get()->GetState());
HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect());
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
// bottom -> centered for virtual keyboard.
WindowManager::GetInstance()->ToggleOverview();
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds);
EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect());
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
// Overview mode has to finish before ending test, otherwise it crashes.
// TODO(mukai): fix this.
WindowManager::GetInstance()->ToggleOverview();
}
// Verify if the home card is correctly minimized after app launch.
TEST_F(HomeCardTest, AppSelection) {
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
WindowManager::GetInstance()->ToggleOverview();
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
athena::ActivityManager::Get()->AddActivity(
athena::ActivityFactory::Get()->CreateWebActivity(
NULL, GURL("http://www.google.com/")));
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
// Overview mode has to finish before ending test, otherwise it crashes.
// TODO(mukai): fix this.
WindowManager::GetInstance()->ToggleOverview();
}
} // namespace athena
......@@ -44,8 +44,9 @@ class ATHENA_EXPORT HomeCard {
virtual ~HomeCard() {}
// Update the current state of the home card to |state|.
// Updates/gets the current state of the home card.
virtual void SetState(State state) = 0;
virtual State GetState() = 0;
// Registers a search_provider to the HomeCard. Receiver will take
// the ownership of the specified provider.
......
......@@ -7,8 +7,10 @@
#include "athena/main/athena_launcher.h"
#include "athena/test/sample_activity_factory.h"
#include "athena/test/test_app_model_builder.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "ui/app_list/app_list_switches.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/env.h"
#include "ui/aura/input_state_lookup.h"
......@@ -46,6 +48,10 @@ AthenaTestHelper::~AthenaTestHelper() {
void AthenaTestHelper::SetUp(ui::ContextFactory* context_factory) {
setup_called_ = true;
// Force showing in the experimental app-list view.
base::CommandLine::ForCurrentProcess()->AppendSwitch(
app_list::switches::kEnableExperimentalAppList);
aura::Env::CreateInstance(true);
aura::Env::GetInstance()->set_context_factory(context_factory);
......
......@@ -12,6 +12,7 @@
#include "base/observer_list.h"
#include "ui/aura/layout_manager.h"
#include "ui/aura/window.h"
#include "ui/wm/core/window_util.h"
#include "ui/wm/public/window_types.h"
namespace athena {
......@@ -67,6 +68,7 @@ class WindowManagerImpl : public WindowManager,
virtual void OnSelectWindow(aura::Window* window) OVERRIDE {
CHECK_EQ(container_.get(), window->parent());
container_->StackChildAtTop(window);
wm::ActivateWindow(window);
overview_.reset();
FOR_EACH_OBSERVER(WindowManagerObserver, observers_,
OnOverviewModeExit());
......
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