Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(401)

Unified Diff: ui/android/view_android_unittests.cc

Issue 2708613002: Add EventForwarder for routing touch events (Closed)
Patch Set: EventForwarder... Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/android/view_android.cc ('k') | ui/android/view_client.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/android/view_android_unittests.cc
diff --git a/ui/android/view_android_unittests.cc b/ui/android/view_android_unittests.cc
new file mode 100644
index 0000000000000000000000000000000000000000..56d39e8c918b37a5a8ebc6e79871ab241f8cbe6a
--- /dev/null
+++ b/ui/android/view_android_unittests.cc
@@ -0,0 +1,169 @@
+// 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 "testing/gtest/include/gtest/gtest.h"
+#include "ui/android/event_forwarder.h"
+#include "ui/android/view_android.h"
+#include "ui/android/view_client.h"
+#include "ui/events/android/motion_event_android.h"
+
+namespace ui {
+
+using base::android::JavaParamRef;
+
+class TestViewClient : public ViewClient {
+ public:
+ TestViewClient() : handle_event_(true), called_(false) {}
+
+ void SetHandleEvent(bool handle_event) { handle_event_ = handle_event; }
+ bool OnTouchEvent(const MotionEventAndroid& event,
+ bool for_touch_handle) override {
+ called_ = true;
+ return handle_event_;
+ }
+
+ bool EventHandled() { return called_ && handle_event_; }
+ bool EventCalled() { return called_; }
+ void Reset() { called_ = false; }
+
+ private:
+ bool handle_event_; // Marks as event was consumed. True by default.
+ bool called_;
+};
+
+class ViewAndroidBoundsTest : public testing::Test {
+ public:
+ ViewAndroidBoundsTest()
+ : root_(nullptr),
+ view1_(&client1_),
+ view2_(&client2_),
+ view3_(&client3_) {
+ root_.GetEventForwarder();
+ root_.SetLayout(ViewAndroid::LayoutParams::MatchParent());
+ }
+
+ void Reset() {
+ client1_.Reset();
+ client2_.Reset();
+ client3_.Reset();
+ }
+
+ void GenerateTouchEventAt(float x, float y) {
+ ui::MotionEventAndroid::Pointer pointer0(0, x, y, 0, 0, 0, 0, 0);
+ ui::MotionEventAndroid::Pointer pointer1(0, 0, 0, 0, 0, 0, 0, 0);
+ ui::MotionEventAndroid event(1.f, nullptr, JavaParamRef<jobject>(nullptr),
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, &pointer0,
+ &pointer1);
+ root_.OnTouchEvent(event, false);
+ }
+
+ void ExpectHit(const TestViewClient& hitClient) {
+ TestViewClient* clients[3] = {&client1_, &client2_, &client3_};
+ for (auto* client : clients) {
+ if (&hitClient == client)
+ EXPECT_TRUE(client->EventHandled());
+ else
+ EXPECT_FALSE(client->EventHandled());
+ }
+ Reset();
+ }
+
+ ViewAndroid root_;
+ ViewAndroid view1_;
+ ViewAndroid view2_;
+ ViewAndroid view3_;
+ TestViewClient client1_;
+ TestViewClient client2_;
+ TestViewClient client3_;
+};
+
+TEST_F(ViewAndroidBoundsTest, MatchesViewInFront) {
+ view1_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 400, 600));
+ view2_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 400, 600));
+ root_.AddChild(&view2_);
+ root_.AddChild(&view1_);
+
+ GenerateTouchEventAt(100.f, 100.f);
+ ExpectHit(client1_);
+
+ // View 2 moves up to the top, and events should hit it from now.
+ root_.MoveToFront(&view2_);
+ GenerateTouchEventAt(100.f, 100.f);
+ ExpectHit(client2_);
+}
+
+TEST_F(ViewAndroidBoundsTest, MatchesViewArea) {
+ view1_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 200, 200));
+ view2_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 20, 400, 600));
+
+ root_.AddChild(&view2_);
+ root_.AddChild(&view1_);
+
+ // Falls within |view1_|'s bounds
+ GenerateTouchEventAt(100.f, 100.f);
+ ExpectHit(client1_);
+
+ // Falls within |view2_|'s bounds
+ GenerateTouchEventAt(300.f, 400.f);
+ ExpectHit(client2_);
+}
+
+TEST_F(ViewAndroidBoundsTest, MatchesViewAfterMove) {
+ view1_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 200, 200));
+ view2_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 20, 400, 600));
+ root_.AddChild(&view2_);
+ root_.AddChild(&view1_);
+
+ GenerateTouchEventAt(100.f, 100.f);
+ ExpectHit(client1_);
+
+ view1_.SetLayout(ViewAndroid::LayoutParams::Normal(150, 150, 200, 200));
+ GenerateTouchEventAt(100.f, 100.f);
+ ExpectHit(client2_);
+}
+
+TEST_F(ViewAndroidBoundsTest, MatchesViewSizeOfkMatchParent) {
+ view1_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 20, 400, 600));
+ view3_.SetLayout(ViewAndroid::LayoutParams::MatchParent());
+ view2_.SetLayout(ViewAndroid::LayoutParams::Normal(50, 50, 200, 200));
+
+ root_.AddChild(&view1_);
+ root_.AddChild(&view2_);
+ view1_.AddChild(&view3_);
+
+ GenerateTouchEventAt(100.f, 100.f);
+ ExpectHit(client2_);
+
+ GenerateTouchEventAt(300.f, 400.f);
+ ExpectHit(client1_);
+
+ client1_.SetHandleEvent(false);
+ GenerateTouchEventAt(300.f, 400.f);
+ EXPECT_TRUE(client1_.EventCalled());
+ ExpectHit(client3_);
+}
+
+TEST_F(ViewAndroidBoundsTest, MatchesViewsWithOffset) {
+ view1_.SetLayout(ViewAndroid::LayoutParams::Normal(10, 20, 150, 100));
+ view2_.SetLayout(ViewAndroid::LayoutParams::Normal(20, 30, 40, 30));
+ view3_.SetLayout(ViewAndroid::LayoutParams::Normal(70, 30, 40, 30));
+
+ root_.AddChild(&view1_);
+ view1_.AddChild(&view2_);
+ view1_.AddChild(&view3_);
+
+ GenerateTouchEventAt(70, 30);
+ ExpectHit(client1_);
+
+ client1_.SetHandleEvent(false);
+ GenerateTouchEventAt(40, 60);
+ EXPECT_TRUE(client1_.EventCalled());
+ ExpectHit(client2_);
+
+ GenerateTouchEventAt(100, 70);
+ EXPECT_TRUE(client1_.EventCalled());
+ ExpectHit(client3_);
+}
+
+} // namespace ui
« no previous file with comments | « ui/android/view_android.cc ('k') | ui/android/view_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698