Home | History | Annotate | Download | only in home
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "athena/home/home_card_gesture_manager.h"
      6 
      7 #include "athena/home/home_card_constants.h"
      8 #include "athena/home/public/home_card.h"
      9 #include "athena/test/athena_test_base.h"
     10 #include "base/time/time.h"
     11 #include "ui/events/event.h"
     12 #include "ui/events/event_constants.h"
     13 
     14 namespace athena {
     15 
     16 class HomeCardGestureManagerTest : public test::AthenaTestBase,
     17                                    public HomeCardGestureManager::Delegate {
     18  public:
     19   HomeCardGestureManagerTest()
     20       : final_state_(HomeCard::HIDDEN),
     21         last_from_state_(HomeCard::HIDDEN),
     22         last_to_state_(HomeCard::HIDDEN),
     23         last_progress_(0.0f),
     24         was_fling_(false),
     25         last_y_(0),
     26         progress_count_(0),
     27         end_count_(0) {}
     28   virtual ~HomeCardGestureManagerTest() {}
     29 
     30   // testing::Test:
     31   virtual void SetUp() OVERRIDE {
     32     test::AthenaTestBase::SetUp();
     33     gesture_manager_.reset(new HomeCardGestureManager(this, screen_bounds()));
     34   }
     35 
     36  protected:
     37   int GetEndCountAndReset() {
     38     int result = end_count_;
     39     end_count_ = 0;
     40     return result;
     41   }
     42   int GetProgressCountAndReset() {
     43     int result = progress_count_;
     44     progress_count_ = 0;
     45     return result;
     46   }
     47 
     48   // Process a gesture event for our use case.
     49   bool ProcessGestureEvent(ui::EventType type, int y) {
     50     ui::GestureEventDetails details;
     51     if (type == ui::ET_GESTURE_SCROLL_BEGIN ||
     52         type == ui::ET_GESTURE_SCROLL_UPDATE)
     53       details = ui::GestureEventDetails(type, 0, (y - last_y_));
     54     else
     55       details = ui::GestureEventDetails(type);
     56     ui::GestureEvent event(0, y, ui::EF_NONE, base::TimeDelta(), details);
     57     if (type == ui::ET_GESTURE_SCROLL_BEGIN) {
     58       // Compute the position that the home card would have wrt to the top of
     59       // the screen if the screen had screen_bounds().
     60       HomeCard::State state = HomeCard::Get()->GetState();
     61       int home_card_top = 0;
     62       if (state == HomeCard::VISIBLE_BOTTOM)
     63         home_card_top = screen_bounds().height() - kHomeCardHeight;
     64       else if (state == HomeCard::VISIBLE_MINIMIZED)
     65         home_card_top = screen_bounds().height() - kHomeCardMinimizedHeight;
     66 
     67       gfx::Point location = event.location();
     68       location.set_y(location.y() - home_card_top);
     69       event.set_location(location);
     70     }
     71     gesture_manager_->ProcessGestureEvent(&event);
     72     last_y_ = y;
     73     return event.handled();
     74   }
     75 
     76   void ProcessFlingGesture(float velocity) {
     77     ui::GestureEvent event(0, last_y_, ui::EF_NONE, base::TimeDelta(),
     78                            ui::GestureEventDetails(
     79                                ui::ET_SCROLL_FLING_START, 0, velocity));
     80     gesture_manager_->ProcessGestureEvent(&event);
     81   }
     82 
     83   int screen_height() const {
     84     return screen_bounds().height();
     85   }
     86 
     87   HomeCard::State final_state_;
     88   HomeCard::State last_from_state_;
     89   HomeCard::State last_to_state_;
     90   float last_progress_;
     91   bool was_fling_;
     92 
     93  private:
     94   gfx::Rect screen_bounds() const {
     95     return gfx::Rect(0, 0, 1280, 1024);
     96   }
     97 
     98   // HomeCardGestureManager::Delegate:
     99   virtual void OnGestureEnded(HomeCard::State final_state,
    100                               bool is_fling) OVERRIDE {
    101     final_state_ = final_state;
    102     was_fling_ = is_fling;
    103     ++end_count_;
    104   }
    105 
    106   virtual void OnGestureProgressed(HomeCard::State from_state,
    107                                    HomeCard::State to_state,
    108                                    float progress) OVERRIDE {
    109     last_from_state_ = from_state;
    110     last_to_state_ = to_state;
    111     last_progress_ = progress;
    112     ++progress_count_;
    113   }
    114 
    115   int last_y_;
    116   int progress_count_;
    117   int end_count_;
    118   scoped_ptr<HomeCardGestureManager> gesture_manager_;
    119 
    120   DISALLOW_COPY_AND_ASSIGN(HomeCardGestureManagerTest);
    121 };
    122 
    123 TEST_F(HomeCardGestureManagerTest, Basic) {
    124   ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
    125 
    126   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
    127   EXPECT_EQ(0, GetEndCountAndReset());
    128   EXPECT_EQ(0, GetProgressCountAndReset());
    129 
    130   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1019);
    131   EXPECT_EQ(1, GetProgressCountAndReset());
    132   EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, last_from_state_);
    133   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_to_state_);
    134   EXPECT_GT(1.0f, last_progress_);
    135 
    136   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1020);
    137   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1022);
    138   EXPECT_EQ(2, GetProgressCountAndReset());
    139   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
    140   EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, last_to_state_);
    141   EXPECT_EQ(1.0f, last_progress_);
    142 
    143   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
    144   float progress_1010 = last_progress_;
    145   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1008);
    146   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1000);
    147   EXPECT_EQ(3, GetProgressCountAndReset());
    148   EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, last_from_state_);
    149   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_to_state_);
    150   EXPECT_LT(progress_1010, last_progress_);
    151 
    152   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 900);
    153   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 800);
    154   EXPECT_EQ(2, GetProgressCountAndReset());
    155   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
    156   EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
    157   float progress_800 = last_progress_;
    158   EXPECT_GT(1.0f, last_progress_);
    159   EXPECT_LT(0.0f, last_progress_);
    160 
    161   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 790);
    162   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
    163   EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
    164   EXPECT_LT(progress_800, last_progress_);
    165 
    166   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 810);
    167   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
    168   EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
    169   EXPECT_GT(progress_800, last_progress_);
    170 
    171   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 810));
    172   EXPECT_EQ(1, GetEndCountAndReset());
    173   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
    174   EXPECT_FALSE(was_fling_);
    175 }
    176 
    177 // Test gesture progress when the gesture is initiated when the home card is in
    178 // the centered state.
    179 TEST_F(HomeCardGestureManagerTest, StartCentered) {
    180   HomeCard::Get()->SetState(HomeCard::VISIBLE_CENTERED);
    181 
    182   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 20));
    183 
    184   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 10);
    185   EXPECT_EQ(1, GetProgressCountAndReset());
    186   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
    187   EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
    188   EXPECT_EQ(1.0f, last_progress_);
    189 
    190   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 900);
    191   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 910);
    192   EXPECT_EQ(2, GetProgressCountAndReset());
    193   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
    194   EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
    195   EXPECT_GT(1.0f, last_progress_);
    196   EXPECT_LT(0.0f, last_progress_);
    197 
    198   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 960);
    199   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 960));
    200   EXPECT_EQ(1, GetEndCountAndReset());
    201   EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, final_state_);
    202 }
    203 
    204 // Test gesture progress when the gesture is initiated when the home card is in
    205 // the centered state.
    206 TEST_F(HomeCardGestureManagerTest, StartBottom) {
    207   HomeCard::Get()->SetState(HomeCard::VISIBLE_BOTTOM);
    208 
    209   // No changes for slight moves.
    210   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 950));
    211   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 960);
    212   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 960));
    213   EXPECT_EQ(1, GetEndCountAndReset());
    214   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
    215 
    216   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 950));
    217   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 800));
    218   EXPECT_EQ(1, GetEndCountAndReset());
    219   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
    220 
    221   // State change for the bigger moves.
    222   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 950));
    223   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1000);
    224   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 1000));
    225   EXPECT_EQ(1, GetEndCountAndReset());
    226   EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, final_state_);
    227 
    228   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 950));
    229   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 300);
    230   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 300));
    231   EXPECT_EQ(1, GetEndCountAndReset());
    232   EXPECT_EQ(HomeCard::VISIBLE_CENTERED, final_state_);
    233   EXPECT_FALSE(was_fling_);
    234 }
    235 
    236 TEST_F(HomeCardGestureManagerTest, FlingUpAtEnd) {
    237   ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
    238 
    239   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
    240   EXPECT_EQ(0, GetEndCountAndReset());
    241   EXPECT_EQ(0, GetProgressCountAndReset());
    242 
    243   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
    244   ProcessFlingGesture(-150.0f);
    245   EXPECT_EQ(1, GetEndCountAndReset());
    246   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
    247   EXPECT_TRUE(was_fling_);
    248 }
    249 
    250 TEST_F(HomeCardGestureManagerTest, FlingDownAtEnd) {
    251   HomeCard::Get()->SetState(HomeCard::VISIBLE_CENTERED);
    252 
    253   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 20));
    254   EXPECT_EQ(0, GetEndCountAndReset());
    255   EXPECT_EQ(0, GetProgressCountAndReset());
    256 
    257   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 30);
    258   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 100);
    259   ProcessFlingGesture(150.0f);
    260   EXPECT_EQ(1, GetEndCountAndReset());
    261   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
    262   EXPECT_TRUE(was_fling_);
    263 }
    264 
    265 TEST_F(HomeCardGestureManagerTest, WeakFling) {
    266   ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
    267 
    268   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
    269   EXPECT_EQ(0, GetEndCountAndReset());
    270   EXPECT_EQ(0, GetProgressCountAndReset());
    271 
    272   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
    273   ProcessFlingGesture(-30.0f);
    274   EXPECT_EQ(1, GetEndCountAndReset());
    275   EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, final_state_);
    276   EXPECT_FALSE(was_fling_);
    277 }
    278 
    279 // Test the situation where the user intends a single fling but the finger
    280 // touches the screen long enough, so that the home card becomes bigger than the
    281 // height of VISIBLE_BOTTOM state due to the scroll events.
    282 // In this case the fling event should not change the final state from
    283 // VISIBLE_BOTTOM to VISIBLE_CENTERED because the user's intention was a single
    284 // fling. See http://crbug.com/415211
    285 TEST_F(HomeCardGestureManagerTest, FastFling) {
    286   ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
    287 
    288   EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
    289   EXPECT_EQ(0, GetEndCountAndReset());
    290   EXPECT_EQ(0, GetProgressCountAndReset());
    291 
    292   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
    293   ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE,
    294                       screen_height() - kHomeCardHeight);
    295   ProcessFlingGesture(-150.0f);
    296   EXPECT_EQ(1, GetEndCountAndReset());
    297   EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
    298   EXPECT_TRUE(was_fling_);
    299 }
    300 
    301 }  // namespace athena
    302