19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.widget.scroll;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenimport android.widget.scroll.ScrollViewButtonsAndLabels;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Button;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.LinearLayout;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ScrollView;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ScrollViewButtonsAndLabelsTest
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        extends ActivityInstrumentationTestCase<ScrollViewButtonsAndLabels> {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ScrollView mScrollView;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LinearLayout mLinearLayout;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mScreenBottom;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mScreenTop;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ScrollViewButtonsAndLabelsTest() {
391d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyen        super("com.android.frameworks.coretests",
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              ScrollViewButtonsAndLabels.class);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setUp() throws Exception {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView = getActivity().getScrollView();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLinearLayout = getActivity().getLinearLayout();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int origin[] = {0, 0};
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView.getLocationOnScreen(origin);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenTop = origin[1];
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenBottom = origin[1] + mScrollView.getHeight();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPreconditions() {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("vertical fading edge width needs to be non-zero for this "
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "test to be worth anything",
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrollView.getVerticalFadingEdgeLength() > 0);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // moving down to something off screen should move the element
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // onto the screen just above the vertical fading edge
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testArrowScrollDownOffScreenVerticalFadingEdge() {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int offScreenIndex = findFirstButtonOffScreenTop2Bottom();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Button firstButtonOffScreen = getActivity().getButton(offScreenIndex);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < offScreenIndex; i++) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getInstrumentation().waitForIdleSync();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(firstButtonOffScreen.hasFocus());
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("the button we've moved to off screen must not be the last "
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "button in the scroll view for this test to work (since we "
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "are expecting the fading edge to be there).",
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                offScreenIndex < getActivity().getNumButtons());
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now we are at the first button off screen
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int buttonLoc[] = {0, 0};
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        firstButtonOffScreen.getLocationOnScreen(buttonLoc);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int buttonBottom = buttonLoc[1] + firstButtonOffScreen.getHeight();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int verticalFadingEdgeLength = mScrollView
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .getVerticalFadingEdgeLength();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("bottom of button should be verticalFadingEdgeLength "
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "above the bottom of the screen",
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buttonBottom, mScreenBottom - verticalFadingEdgeLength);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // there should be no offset for vertical fading edge
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if the item is the last one on screen
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testArrowScrollDownToBottomElementOnScreen() {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numGroups = getActivity().getNumButtons();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Button lastButton = getActivity().getButton(numGroups - 1);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("button needs to be at the very bottom of the layout for "
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "this test to work",
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLinearLayout.getHeight(), lastButton.getBottom());
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // move down to last button
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numGroups; i++) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getInstrumentation().waitForIdleSync();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("last button should have focus", lastButton.hasFocus());
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int buttonLoc[] = {0, 0};
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lastButton.getLocationOnScreen(buttonLoc);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int buttonBottom = buttonLoc[1] + lastButton.getHeight();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("button should be at very bottom of screen",
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScreenBottom, buttonBottom);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testArrowScrollUpOffScreenVerticalFadingEdge() {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get to bottom button
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numGroups = goToBottomButton();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // go up to first off screen button
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int offScreenIndex = findFirstButtonOffScreenBottom2Top();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Button offScreenButton = getActivity().getButton(offScreenIndex);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int clicksToOffScreenIndex = numGroups - offScreenIndex - 1;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < clicksToOffScreenIndex; i++) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendKeys(KeyEvent.KEYCODE_DPAD_UP);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getInstrumentation().waitForIdleSync();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("we want to be at offScreenButton", offScreenButton.hasFocus());
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // top should take into account fading edge
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int buttonLoc[] = {0, 0};
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        offScreenButton.getLocationOnScreen(buttonLoc);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("top should take into account fading edge",
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenTop + mScrollView.getVerticalFadingEdgeLength(), buttonLoc[1]);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testArrowScrollUpToTopElementOnScreen() {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get to bottom button
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numButtons = goToBottomButton();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // go back to the top
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numButtons; i++) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendKeys(KeyEvent.KEYCODE_DPAD_UP);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getInstrumentation().waitForIdleSync();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Button topButton = getActivity().getButton(0);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("should be back at top button", topButton.hasFocus());
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int buttonLoc[] = {0, 0};
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        topButton.getLocationOnScreen(buttonLoc);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("top of top button should be at top of screen; no need to take"
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " into account vertical fading edge.",
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScreenTop, buttonLoc[1]);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int goToBottomButton() {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numButtons = getActivity().getNumButtons();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Button lastButton = getActivity().getButton(numButtons - 1);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numButtons; i++) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getInstrumentation().waitForIdleSync();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("we want to be at the last button", lastButton.hasFocus());
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return numButtons;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // search from top to bottom for the first button off screen
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findFirstButtonOffScreenTop2Bottom() {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int origin[] = {0, 0};
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView.getLocationOnScreen(origin);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int screenHeight = mScrollView.getHeight();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < getActivity().getNumButtons(); i++) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int buttonLoc[] = {0, 0};
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Button button = getActivity().getButton(i);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            button.getLocationOnScreen(buttonLoc);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (buttonLoc[1] - origin[1] > screenHeight) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return i;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fail("couldn't find first button off screen");
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1; // this won't execute, but the compiler needs it
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findFirstButtonOffScreenBottom2Top() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int origin[] = {0, 0};
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView.getLocationOnScreen(origin);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = getActivity().getNumButtons() - 1; i >= 0; i--) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int buttonLoc[] = {0, 0};
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Button button = getActivity().getButton(i);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            button.getLocationOnScreen(buttonLoc);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (buttonLoc[1] < 0) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return i;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fail("couldn't find first button off screen");
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1; // this won't execute, but the compiler needs it
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
215