Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit adf5bec5 authored by Evan Rosky's avatar Evan Rosky
Browse files

Fixed several core and CTS tests

Fixes in framework include:
- ListPopupWindow requests focus for itself so it can receive
  MENU key.
- PopupWindow uses setTransitionVisibility to avoid losing
  focus upon enter transition.
- First-traversal will explicitly handle FOCUS_AFTER_DESCENDANTS
  on the current focus if applicable -- details in code comment.

Fixes in tests usually just required focusing what they expected
to have initial focus; however, there were a couple tests that
had been broken for other reasons for a long time.

app.cts.ActionBarTest
app.cts.ToolbarActionBarTest
android.view.DisabledLongpressTest
android.widget.scroll.arrowscroll.ShortButtonsTest
android.view.VisibilityTest
android.widget.listview.ListScrollListenerTest
android.widget.listview.arrowscroll.ListOfThinItemsTest
andorid.widget.listview.arrowscroll.ListWithNoFadingEdgeTest
android.view.LongpressTest
android.widget.focus.ScrollingThroughListOfFocusablesTest
android.widget.gridview.GridScrollListenerTest

Bug: 67467972
Test: Failing tests should pass now.
Change-Id: I9e2fbfeb183eb777f35c67eca53e1f70809b7670
parent e033dbd7
Loading
Loading
Loading
Loading
+30 −12
Original line number Diff line number Diff line
@@ -2284,18 +2284,36 @@ public final class ViewRootImpl implements ViewParent,
            }
        }

        if (mFirst && sAlwaysAssignFocus) {
        if (mFirst) {
            if (sAlwaysAssignFocus) {
                // handle first focus request
            if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: mView.hasFocus()="
                    + mView.hasFocus());
                if (DEBUG_INPUT_RESIZE) {
                    Log.v(mTag, "First: mView.hasFocus()=" + mView.hasFocus());
                }
                if (mView != null) {
                    if (!mView.hasFocus()) {
                        mView.restoreDefaultFocus();
                    if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: requested focused view="
                            + mView.findFocus());
                        if (DEBUG_INPUT_RESIZE) {
                            Log.v(mTag, "First: requested focused view=" + mView.findFocus());
                        }
                    } else {
                    if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: existing focused view="
                            + mView.findFocus());
                        if (DEBUG_INPUT_RESIZE) {
                            Log.v(mTag, "First: existing focused view=" + mView.findFocus());
                        }
                    }
                }
            } else {
                // Some views (like ScrollView) won't hand focus to descendants that aren't within
                // their viewport. Before layout, there's a good change these views are size 0
                // which means no children can get focus. After layout, this view now has size, but
                // is not guaranteed to hand-off focus to a focusable child (specifically, the edge-
                // case where the child has a size prior to layout and thus won't trigger
                // focusableViewAvailable).
                View focused = mView.findFocus();
                if (focused instanceof ViewGroup
                        && ((ViewGroup) focused).getDescendantFocusability()
                                == ViewGroup.FOCUS_AFTER_DESCENDANTS) {
                    focused.restoreDefaultFocus();
                }
            }
        }
+2 −0
Original line number Diff line number Diff line
@@ -657,6 +657,7 @@ public class ListPopupWindow implements ShowableListMenu {
            mPopup.update(getAnchorView(), mDropDownHorizontalOffset,
                            mDropDownVerticalOffset, (widthSpec < 0)? -1 : widthSpec,
                            (heightSpec < 0)? -1 : heightSpec);
            mPopup.getContentView().restoreDefaultFocus();
        } else {
            final int widthSpec;
            if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
@@ -695,6 +696,7 @@ public class ListPopupWindow implements ShowableListMenu {
            mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset,
                    mDropDownVerticalOffset, mDropDownGravity);
            mDropDownList.setSelection(ListView.INVALID_POSITION);
            mPopup.getContentView().restoreDefaultFocus();

            if (!mModal || mDropDownList.isInTouchMode()) {
                clearListSelection();
+2 −2
Original line number Diff line number Diff line
@@ -2461,14 +2461,14 @@ public class PopupWindow {
            for (int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                enterTransition.addTarget(child);
                child.setVisibility(View.INVISIBLE);
                child.setTransitionVisibility(View.INVISIBLE);
            }

            TransitionManager.beginDelayedTransition(this, enterTransition);

            for (int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                child.setVisibility(View.VISIBLE);
                child.setTransitionVisibility(View.VISIBLE);
            }
        }

+3 −2
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package android.util;

import com.google.android.collect.Lists;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
@@ -29,6 +27,8 @@ import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import com.google.android.collect.Lists;

import java.util.List;

/**
@@ -269,5 +269,6 @@ public abstract class ScrollViewScenario extends Activity {
        mScrollView.setSmoothScrollingEnabled(false);

        setContentView(mScrollView);
        mScrollView.restoreDefaultFocus();
    }
}
+7 −10
Original line number Diff line number Diff line
@@ -16,17 +16,15 @@

package android.view;

import android.view.Longpress;
import com.android.frameworks.coretests.R;
import android.util.KeyUtils;
import android.test.ActivityInstrumentationTestCase;
import android.test.TouchUtils;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;

import android.test.ActivityInstrumentationTestCase;
import android.view.View;
import android.util.KeyUtils;
import android.view.View.OnLongClickListener;

import com.android.frameworks.coretests.R;

/**
 * Exercises {@link android.view.View}'s longpress plumbing by testing the
 * disabled case.
@@ -66,13 +64,12 @@ public class DisabledLongpressTest extends ActivityInstrumentationTestCase<Longp
    @MediumTest
    public void testSetUpConditions() throws Exception {
        assertNotNull(mSimpleView);
        assertTrue(mSimpleView.hasFocus());
        assertFalse(mLongClicked);
    }

    @LargeTest
    public void testKeypadLongClick() throws Exception {
        mSimpleView.requestFocus();
        getActivity().runOnUiThread(() -> mSimpleView.requestFocus());
        getInstrumentation().waitForIdleSync();
        KeyUtils.longClick(this);

Loading