Loading core/java/android/view/ViewRootImpl.java +30 −12 Original line number Original line Diff line number Diff line Loading @@ -2284,18 +2284,36 @@ public final class ViewRootImpl implements ViewParent, } } } } if (mFirst && sAlwaysAssignFocus) { if (mFirst) { if (sAlwaysAssignFocus) { // handle first focus request // handle first focus request if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: mView.hasFocus()=" if (DEBUG_INPUT_RESIZE) { + mView.hasFocus()); Log.v(mTag, "First: mView.hasFocus()=" + mView.hasFocus()); } if (mView != null) { if (mView != null) { if (!mView.hasFocus()) { if (!mView.hasFocus()) { mView.restoreDefaultFocus(); mView.restoreDefaultFocus(); if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: requested focused view=" if (DEBUG_INPUT_RESIZE) { + mView.findFocus()); Log.v(mTag, "First: requested focused view=" + mView.findFocus()); } } else { } else { if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: existing focused view=" if (DEBUG_INPUT_RESIZE) { + mView.findFocus()); 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(); } } } } } } Loading core/java/android/widget/ListPopupWindow.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -657,6 +657,7 @@ public class ListPopupWindow implements ShowableListMenu { mPopup.update(getAnchorView(), mDropDownHorizontalOffset, mPopup.update(getAnchorView(), mDropDownHorizontalOffset, mDropDownVerticalOffset, (widthSpec < 0)? -1 : widthSpec, mDropDownVerticalOffset, (widthSpec < 0)? -1 : widthSpec, (heightSpec < 0)? -1 : heightSpec); (heightSpec < 0)? -1 : heightSpec); mPopup.getContentView().restoreDefaultFocus(); } else { } else { final int widthSpec; final int widthSpec; if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { Loading Loading @@ -695,6 +696,7 @@ public class ListPopupWindow implements ShowableListMenu { mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset, mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset, mDropDownVerticalOffset, mDropDownGravity); mDropDownVerticalOffset, mDropDownGravity); mDropDownList.setSelection(ListView.INVALID_POSITION); mDropDownList.setSelection(ListView.INVALID_POSITION); mPopup.getContentView().restoreDefaultFocus(); if (!mModal || mDropDownList.isInTouchMode()) { if (!mModal || mDropDownList.isInTouchMode()) { clearListSelection(); clearListSelection(); Loading core/java/android/widget/PopupWindow.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -2461,14 +2461,14 @@ public class PopupWindow { for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { final View child = getChildAt(i); final View child = getChildAt(i); enterTransition.addTarget(child); enterTransition.addTarget(child); child.setVisibility(View.INVISIBLE); child.setTransitionVisibility(View.INVISIBLE); } } TransitionManager.beginDelayedTransition(this, enterTransition); TransitionManager.beginDelayedTransition(this, enterTransition); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { final View child = getChildAt(i); final View child = getChildAt(i); child.setVisibility(View.VISIBLE); child.setTransitionVisibility(View.VISIBLE); } } } } Loading core/tests/coretests/src/android/util/ScrollViewScenario.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.util; package android.util; import com.google.android.collect.Lists; import android.app.Activity; import android.app.Activity; import android.content.Context; import android.content.Context; import android.os.Bundle; import android.os.Bundle; Loading @@ -29,6 +27,8 @@ import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.TextView; import com.google.android.collect.Lists; import java.util.List; import java.util.List; /** /** Loading Loading @@ -269,5 +269,6 @@ public abstract class ScrollViewScenario extends Activity { mScrollView.setSmoothScrollingEnabled(false); mScrollView.setSmoothScrollingEnabled(false); setContentView(mScrollView); setContentView(mScrollView); mScrollView.restoreDefaultFocus(); } } } } core/tests/coretests/src/android/view/DisabledLongpressTest.java +7 −10 Original line number Original line Diff line number Diff line Loading @@ -16,17 +16,15 @@ package android.view; package android.view; import android.view.Longpress; import android.test.ActivityInstrumentationTestCase; import com.android.frameworks.coretests.R; import android.util.KeyUtils; import android.test.TouchUtils; import android.test.TouchUtils; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.MediumTest; import android.util.KeyUtils; import android.test.ActivityInstrumentationTestCase; import android.view.View; import android.view.View.OnLongClickListener; import android.view.View.OnLongClickListener; import com.android.frameworks.coretests.R; /** /** * Exercises {@link android.view.View}'s longpress plumbing by testing the * Exercises {@link android.view.View}'s longpress plumbing by testing the * disabled case. * disabled case. Loading Loading @@ -66,13 +64,12 @@ public class DisabledLongpressTest extends ActivityInstrumentationTestCase<Longp @MediumTest @MediumTest public void testSetUpConditions() throws Exception { public void testSetUpConditions() throws Exception { assertNotNull(mSimpleView); assertNotNull(mSimpleView); assertTrue(mSimpleView.hasFocus()); assertFalse(mLongClicked); assertFalse(mLongClicked); } } @LargeTest @LargeTest public void testKeypadLongClick() throws Exception { public void testKeypadLongClick() throws Exception { mSimpleView.requestFocus(); getActivity().runOnUiThread(() -> mSimpleView.requestFocus()); getInstrumentation().waitForIdleSync(); getInstrumentation().waitForIdleSync(); KeyUtils.longClick(this); KeyUtils.longClick(this); Loading Loading
core/java/android/view/ViewRootImpl.java +30 −12 Original line number Original line Diff line number Diff line Loading @@ -2284,18 +2284,36 @@ public final class ViewRootImpl implements ViewParent, } } } } if (mFirst && sAlwaysAssignFocus) { if (mFirst) { if (sAlwaysAssignFocus) { // handle first focus request // handle first focus request if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: mView.hasFocus()=" if (DEBUG_INPUT_RESIZE) { + mView.hasFocus()); Log.v(mTag, "First: mView.hasFocus()=" + mView.hasFocus()); } if (mView != null) { if (mView != null) { if (!mView.hasFocus()) { if (!mView.hasFocus()) { mView.restoreDefaultFocus(); mView.restoreDefaultFocus(); if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: requested focused view=" if (DEBUG_INPUT_RESIZE) { + mView.findFocus()); Log.v(mTag, "First: requested focused view=" + mView.findFocus()); } } else { } else { if (DEBUG_INPUT_RESIZE) Log.v(mTag, "First: existing focused view=" if (DEBUG_INPUT_RESIZE) { + mView.findFocus()); 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(); } } } } } } Loading
core/java/android/widget/ListPopupWindow.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -657,6 +657,7 @@ public class ListPopupWindow implements ShowableListMenu { mPopup.update(getAnchorView(), mDropDownHorizontalOffset, mPopup.update(getAnchorView(), mDropDownHorizontalOffset, mDropDownVerticalOffset, (widthSpec < 0)? -1 : widthSpec, mDropDownVerticalOffset, (widthSpec < 0)? -1 : widthSpec, (heightSpec < 0)? -1 : heightSpec); (heightSpec < 0)? -1 : heightSpec); mPopup.getContentView().restoreDefaultFocus(); } else { } else { final int widthSpec; final int widthSpec; if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { Loading Loading @@ -695,6 +696,7 @@ public class ListPopupWindow implements ShowableListMenu { mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset, mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset, mDropDownVerticalOffset, mDropDownGravity); mDropDownVerticalOffset, mDropDownGravity); mDropDownList.setSelection(ListView.INVALID_POSITION); mDropDownList.setSelection(ListView.INVALID_POSITION); mPopup.getContentView().restoreDefaultFocus(); if (!mModal || mDropDownList.isInTouchMode()) { if (!mModal || mDropDownList.isInTouchMode()) { clearListSelection(); clearListSelection(); Loading
core/java/android/widget/PopupWindow.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -2461,14 +2461,14 @@ public class PopupWindow { for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { final View child = getChildAt(i); final View child = getChildAt(i); enterTransition.addTarget(child); enterTransition.addTarget(child); child.setVisibility(View.INVISIBLE); child.setTransitionVisibility(View.INVISIBLE); } } TransitionManager.beginDelayedTransition(this, enterTransition); TransitionManager.beginDelayedTransition(this, enterTransition); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { final View child = getChildAt(i); final View child = getChildAt(i); child.setVisibility(View.VISIBLE); child.setTransitionVisibility(View.VISIBLE); } } } } Loading
core/tests/coretests/src/android/util/ScrollViewScenario.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.util; package android.util; import com.google.android.collect.Lists; import android.app.Activity; import android.app.Activity; import android.content.Context; import android.content.Context; import android.os.Bundle; import android.os.Bundle; Loading @@ -29,6 +27,8 @@ import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.TextView; import com.google.android.collect.Lists; import java.util.List; import java.util.List; /** /** Loading Loading @@ -269,5 +269,6 @@ public abstract class ScrollViewScenario extends Activity { mScrollView.setSmoothScrollingEnabled(false); mScrollView.setSmoothScrollingEnabled(false); setContentView(mScrollView); setContentView(mScrollView); mScrollView.restoreDefaultFocus(); } } } }
core/tests/coretests/src/android/view/DisabledLongpressTest.java +7 −10 Original line number Original line Diff line number Diff line Loading @@ -16,17 +16,15 @@ package android.view; package android.view; import android.view.Longpress; import android.test.ActivityInstrumentationTestCase; import com.android.frameworks.coretests.R; import android.util.KeyUtils; import android.test.TouchUtils; import android.test.TouchUtils; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.MediumTest; import android.util.KeyUtils; import android.test.ActivityInstrumentationTestCase; import android.view.View; import android.view.View.OnLongClickListener; import android.view.View.OnLongClickListener; import com.android.frameworks.coretests.R; /** /** * Exercises {@link android.view.View}'s longpress plumbing by testing the * Exercises {@link android.view.View}'s longpress plumbing by testing the * disabled case. * disabled case. Loading Loading @@ -66,13 +64,12 @@ public class DisabledLongpressTest extends ActivityInstrumentationTestCase<Longp @MediumTest @MediumTest public void testSetUpConditions() throws Exception { public void testSetUpConditions() throws Exception { assertNotNull(mSimpleView); assertNotNull(mSimpleView); assertTrue(mSimpleView.hasFocus()); assertFalse(mLongClicked); assertFalse(mLongClicked); } } @LargeTest @LargeTest public void testKeypadLongClick() throws Exception { public void testKeypadLongClick() throws Exception { mSimpleView.requestFocus(); getActivity().runOnUiThread(() -> mSimpleView.requestFocus()); getInstrumentation().waitForIdleSync(); getInstrumentation().waitForIdleSync(); KeyUtils.longClick(this); KeyUtils.longClick(this); Loading