/*
 * Copyright (C) 2007 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 android.widget.focus;

import android.widget.focus.FocusAfterRemoval;
import com.android.frameworks.coretests.R;

import android.test.ActivityInstrumentationTestCase;
import android.test.suitebuilder.annotation.MediumTest;
import android.widget.Button;
import android.widget.LinearLayout;
import android.view.KeyEvent;
import android.view.View;

/**
 * {@link FocusAfterRemoval} is set up to exercise cases where the views that
 * have focus become invisible or GONE.
 */
public class FocusAfterRemovalTest extends ActivityInstrumentationTestCase<FocusAfterRemoval> {

    private LinearLayout mLeftLayout;
    private Button mTopLeftButton;
    private Button mBottomLeftButton;
    private Button mTopRightButton;
    private Button mBottomRightButton;

    public FocusAfterRemovalTest() {
        super("com.android.frameworks.coretests", FocusAfterRemoval.class);
    }

    @Override
    public void setUp() throws Exception {
        super.setUp();

        final FocusAfterRemoval a = getActivity();
        mLeftLayout = (LinearLayout) a.findViewById(R.id.leftLayout);
        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);
    }

    // Test that setUp did what we expect it to do.  These asserts
    // can't go in SetUp, or the test will hang.
    @MediumTest
    public void testSetUpConditions() throws Exception {
        assertNotNull(mLeftLayout);
        assertNotNull(mTopLeftButton);
        assertNotNull(mTopRightButton);
        assertNotNull(mBottomLeftButton);
        assertNotNull(mBottomRightButton);

        assertTrue(mTopLeftButton.hasFocus());
    }

    // if a parent layout becomes GONE when one of its children has focus,
    // make sure the focus moves to something visible (bug 827087)
    @MediumTest
    public void testFocusLeavesWhenParentLayoutIsGone() throws Exception {

        // clicking on this button makes its parent linear layout GONE
        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
        assertEquals(View.GONE, mLeftLayout.getVisibility());

        assertTrue("focus should jump to visible button",
                mTopRightButton.hasFocus());

    }

    @MediumTest
    public void testFocusLeavesWhenParentLayoutInvisible() throws Exception {

        // move down to bottom left button
        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
        assertTrue(mBottomLeftButton.hasFocus());

        // clicking on this button makes its parent linear layout INVISIBLE
        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
        assertEquals(View.INVISIBLE,
                getActivity().findViewById(R.id.leftLayout).getVisibility());

        assertTrue("focus should jump to visible button",
                mTopRightButton.hasFocus());
    }

    @MediumTest
    public void testFocusLeavesWhenFocusedViewBecomesGone() throws Exception {

        // move to top right
        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
        assertTrue(mTopRightButton.hasFocus());

        // click making it GONE
        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
        assertEquals(View.GONE, mTopRightButton.getVisibility());

        assertTrue("focus should jump to visible button",
                mTopLeftButton.hasFocus());
    }

    @MediumTest
    public void testFocusLeavesWhenFocusedViewBecomesInvisible() throws Exception {

        // move to bottom right
        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
        assertTrue(mBottomRightButton.hasFocus());

        // click making it INVISIBLE
        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
        assertEquals(View.INVISIBLE, mBottomRightButton.getVisibility());

        assertTrue("focus should jump to visible button",
                mTopLeftButton.hasFocus());
    }

}
