FileDocCategorySizeDatePackage
RequestFocusTest.javaAPI DocAndroid 5.1 API7718Thu Mar 12 22:22:12 GMT 2015android.widget.focus

RequestFocusTest

public class RequestFocusTest extends android.test.ActivityInstrumentationTestCase2
{@link RequestFocusTest} is set up to exercise cases where the views that have focus become invisible or GONE.

Fields Summary
private android.widget.Button
mTopLeftButton
private android.widget.Button
mBottomLeftButton
private android.widget.Button
mTopRightButton
private android.widget.Button
mBottomRightButton
private android.os.Handler
mHandler
Constructors Summary
public RequestFocusTest()

        super(RequestFocus.class);
    
Methods Summary
public voidsetUp()

        super.setUp();

        final RequestFocus a = getActivity();
        mHandler = a.getHandler();
        mTopLeftButton = (Button) a.findViewById(R.id.topLeftButton);
        mBottomLeftButton = (Button) a.findViewById(R.id.bottomLeftButton);
        mTopRightButton = (Button) a.findViewById(R.id.topRightButton);
        mBottomRightButton = (Button) a.findViewById(R.id.bottomRightButton);
    
public voidtestOnFocusChangeCallbackOrderWhenClearingFocusOfFirstFocusable()
This tests checks the case in which the first focusable View clears focus. In such a case the framework tries to give the focus to another View starting from the top. Hence, the framework will try to give focus to the view that wants to clear its focus.

throws
Exception If an error occurs.

        // Get the first focusable.
        Button clearingFocusButton = mTopLeftButton;
        Button gainingFocusButton = mTopLeftButton;

        // Make sure that the clearing focus View is the first focusable.
        View focusCandidate = clearingFocusButton.getRootView().getParent().focusSearch(null,
                View.FOCUS_FORWARD);
        assertSame("The clearing focus button is the first focusable.",
                clearingFocusButton, focusCandidate);
        assertSame("The gaining focus button is the first focusable.",
                gainingFocusButton, focusCandidate);

        // Focus the clearing focus button.
        clearingFocusButton.requestFocus();
        assertTrue(clearingFocusButton.hasFocus());

        // Register the invocation order checker.
        CombinedListeners mock = mock(CombinedListeners.class);
        clearingFocusButton.setOnFocusChangeListener(mock);
        gainingFocusButton.setOnFocusChangeListener(mock);
        clearingFocusButton.getViewTreeObserver().addOnGlobalFocusChangeListener(mock);

        // Try to clear focus.
        clearingFocusButton.clearFocus();

        // Check that no callback was invoked since focus did not move.
        InOrder inOrder = inOrder(mock);
        inOrder.verify(mock).onFocusChange(clearingFocusButton, false);
        inOrder.verify(mock).onGlobalFocusChanged(clearingFocusButton, gainingFocusButton);
        inOrder.verify(mock).onFocusChange(gainingFocusButton, true);
    
public voidtestOnFocusChangeCallbackOrderWhenClearingFocusOfNotFirstFocusable()
This tests check whether the on focus change callbacks are invoked in the proper order when a View loses focus and the framework gives it to the fist focusable one.

throws
Exception

        Button clearingFocusButton = mTopRightButton;
        Button gainingFocusButton = mTopLeftButton;

        // Make sure that the clearing focus View is not the first focusable.
        View focusCandidate = clearingFocusButton.getRootView().getParent().focusSearch(null,
                View.FOCUS_FORWARD);
        assertNotSame("The clearing focus button is not the first focusable.",
                clearingFocusButton, focusCandidate);
        assertSame("The gaining focus button is the first focusable.",
                gainingFocusButton, focusCandidate);

        // Focus the clearing focus button.
        clearingFocusButton.requestFocus();
        assertTrue(clearingFocusButton.hasFocus());

        // Register the invocation order checker.
        CombinedListeners mock = mock(CombinedListeners.class);
        clearingFocusButton.setOnFocusChangeListener(mock);
        gainingFocusButton.setOnFocusChangeListener(mock);
        clearingFocusButton.getViewTreeObserver().addOnGlobalFocusChangeListener(mock);

        // Try to clear focus.
        clearingFocusButton.clearFocus();

        // Check that no callback was invoked since focus did not move.
        InOrder inOrder = inOrder(mock);
        inOrder.verify(mock).onFocusChange(clearingFocusButton, false);
        inOrder.verify(mock).onGlobalFocusChanged(clearingFocusButton, gainingFocusButton);
        inOrder.verify(mock).onFocusChange(gainingFocusButton, true);
    
public voidtestPostedRequestFocus()

        mHandler.post(new Runnable() { public void run() {
            mBottomLeftButton.requestFocus();
        }});
        synchronized(this) {
            try {
                wait(500);
            } catch (InterruptedException e) {
                // Don't care.
            }
        }
        assertTrue("Focus should move to bottom left", mBottomLeftButton.hasFocus());
    
public voidtestSetUpConditions()

        assertNotNull(mHandler);
        assertNotNull(mTopLeftButton);
        assertNotNull(mTopRightButton);
        assertNotNull(mBottomLeftButton);
        assertNotNull(mBottomRightButton);
        assertTrue("requestFocus() should work from onCreate.", mBottomRightButton.hasFocus());
    
public voidtestWrongThreadRequestFocusFails()

        try {
            mTopRightButton.requestFocus();
            fail("requestFocus from wrong thread should raise exception.");
        } catch (AndroidRuntimeException e) {
            // Expected.  The actual exception is not public, so we can't catch it.
            assertEquals("android.view.ViewRootImpl$CalledFromWrongThreadException",
                         e.getClass().getName());
        }