summaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorMaurice Lam <yukl@google.com>2015-05-21 21:19:09 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-05-21 21:19:31 +0000
commit173c7bc879c47660f943f2a3cd67ed440f55d3d3 (patch)
tree1a0b83da28b06aa490abc7a821db5271bbd49b9d /library
parentcaf3ce9f8da61e59a7b7dacbce2e1f8e23d3231e (diff)
parent578dd1c111c2461620777b315eab3a95bee9ecd1 (diff)
downloadsetupwizard-173c7bc879c47660f943f2a3cd67ed440f55d3d3.tar.gz
Merge "[SetupWizardLib] Add tests for BottomScrollView" into ub-setupwizard-alatar
Diffstat (limited to 'library')
-rw-r--r--library/main/src/com/android/setupwizardlib/view/BottomScrollView.java12
-rw-r--r--library/test/src/com/android/setupwizardlib/test/BottomScrollViewTest.java125
2 files changed, 134 insertions, 3 deletions
diff --git a/library/main/src/com/android/setupwizardlib/view/BottomScrollView.java b/library/main/src/com/android/setupwizardlib/view/BottomScrollView.java
index 806ecf4..3683cc9 100644
--- a/library/main/src/com/android/setupwizardlib/view/BottomScrollView.java
+++ b/library/main/src/com/android/setupwizardlib/view/BottomScrollView.java
@@ -21,6 +21,8 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.ScrollView;
+import com.android.annotations.VisibleForTesting;
+
/**
* An extension of ScrollView that will invoke a listener callback when the ScrollView needs
* scrolling, and when the ScrollView is being scrolled to the bottom. This is often used in Setup
@@ -60,13 +62,17 @@ public class BottomScrollView extends ScrollView {
mListener = l;
}
+ @VisibleForTesting
+ public int getScrollThreshold() {
+ return mScrollThreshold;
+ }
+
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
- View child = getChildAt(0);
+ final View child = getChildAt(0);
if (child != null) {
- mScrollThreshold = Math.max(0, getChildAt(0).getHeight() - b + t
- - getPaddingBottom());
+ mScrollThreshold = Math.max(0, child.getMeasuredHeight() - b + t - getPaddingBottom());
}
if (b - t > 0) {
// Post check scroll in the next run loop, so that the callback methods will be invoked
diff --git a/library/test/src/com/android/setupwizardlib/test/BottomScrollViewTest.java b/library/test/src/com/android/setupwizardlib/test/BottomScrollViewTest.java
new file mode 100644
index 0000000..0880fb9
--- /dev/null
+++ b/library/test/src/com/android/setupwizardlib/test/BottomScrollViewTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.setupwizardlib.test;
+
+import android.content.Context;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+
+import com.android.setupwizardlib.view.BottomScrollView;
+
+public class BottomScrollViewTest extends AndroidTestCase {
+
+ private TestBottomScrollListener mListener;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mListener = new TestBottomScrollListener();
+ }
+
+ @SmallTest
+ public void testNoNeedScroll() {
+ createScrollView(20);
+ assertTrue("Scroll should not be required", mListener.scrolledToBottom);
+ }
+
+ @SmallTest
+ public void testNeedScroll() {
+ createScrollView(110);
+ assertFalse("Scroll should be required", mListener.scrolledToBottom);
+ }
+
+ @SmallTest
+ public void testScrollToBottom() {
+ final BottomScrollView bottomScrollView = createScrollView(110);
+
+ assertFalse("Scroll should be required", mListener.scrolledToBottom);
+
+ bottomScrollView.scrollTo(0, 10);
+ assertTrue("Should already be scrolled to bottom", mListener.scrolledToBottom);
+ }
+
+ @SmallTest
+ public void testScrollThreshold() {
+ final BottomScrollView bottomScrollView = createScrollView(110);
+ assertEquals("Scroll threshold should be 10", 10, bottomScrollView.getScrollThreshold());
+ }
+
+ private BottomScrollView createScrollView(final int childHeight) {
+ final BottomScrollView bottomScrollView = new TestBottomScrollView(getContext());
+ bottomScrollView.setBottomScrollListener(mListener);
+
+ final View child = new TestChildView(getContext(), childHeight);
+
+ child.measure(0, 0); // TestChildView's measured dimensions doesn't depend on the arguments
+ bottomScrollView.addView(child);
+ bottomScrollView.layout(0, 0, 100, 100);
+
+ return bottomScrollView;
+ }
+
+ private static class TestChildView extends View {
+
+ private static final int WIDTH = 10;
+ private int mHeight;
+
+ public TestChildView(Context context, int height) {
+ super(context);
+ mHeight = height;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(WIDTH, mHeight);
+ }
+
+ public void setHeight(int height) {
+ mHeight = height;
+ }
+ }
+
+ private static class TestBottomScrollView extends BottomScrollView {
+
+ public TestBottomScrollView(Context context) {
+ super(context);
+ }
+
+ @Override
+ public boolean post(Runnable action) {
+ // Post all runnables synchronously so that tests can check the callbacks.
+ action.run();
+ return true;
+ }
+ }
+
+ private static class TestBottomScrollListener implements BottomScrollView.BottomScrollListener {
+
+ boolean scrolledToBottom = true;
+
+ @Override
+ public void onScrolledToBottom() {
+ scrolledToBottom = true;
+ }
+
+ @Override
+ public void onRequiresScroll() {
+ scrolledToBottom = false;
+ }
+ }
+}