diff options
author | Jeff Hamilton <jham@google.com> | 2013-01-24 17:40:15 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-01-24 17:40:15 +0000 |
commit | a9dac6d391780b442bad54bce986683095d6a36b (patch) | |
tree | effe8f53fb24316ba80458cd1a8aee21bf590705 | |
parent | 665c73f08d5681d345c0c559f1b1008740371bd8 (diff) | |
parent | 10afa627a8dc3aba930189ee6b15d1aa99531ec8 (diff) | |
download | robolectric-a9dac6d391780b442bad54bce986683095d6a36b.tar.gz |
Merge "Implementing Activity#getCurrentFocus and View#findFocus."
8 files changed, 144 insertions, 10 deletions
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java index 8893decfa..d3162159e 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java @@ -337,7 +337,20 @@ public class ShadowActivity extends ShadowContextWrapper { @Implementation public View getCurrentFocus() { - return currentFocus; + if (currentFocus != null) { + return currentFocus; + } else if (contentView != null) { + return contentView.findFocus(); + } else { + return null; + } + } + + public void clearFocus() { + currentFocus = null; + if (contentView != null) { + contentView.clearFocus(); + } } @Implementation diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowFragmentActivity.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowFragmentActivity.java index 89bd3d5e6..3071162ed 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowFragmentActivity.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowFragmentActivity.java @@ -4,6 +4,8 @@ import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; +import android.view.View; + import com.xtremelabs.robolectric.internal.Implementation; import com.xtremelabs.robolectric.internal.Implements; import com.xtremelabs.robolectric.internal.RealObject; @@ -76,7 +78,7 @@ public class ShadowFragmentActivity extends ShadowActivity { // terrible looking hack. I am very sorry. List<SerializedFragmentState> fragmentStates = new ArrayList<SerializedFragmentState>(); - for (Map.Entry<Integer, Fragment> entry : ((TestFragmentManager) fragmentManager).getFragments().entrySet()) { + for (Map.Entry<Integer, Fragment> entry : fragmentManager.getFragments().entrySet()) { Fragment fragment = entry.getValue(); fragment.onSaveInstanceState(outState); fragmentStates.add(new SerializedFragmentState(entry.getKey(), fragment)); @@ -84,4 +86,36 @@ public class ShadowFragmentActivity extends ShadowActivity { outState.putSerializable(FRAGMENTS_TAG, fragmentStates.toArray()); } + + @Implementation + @Override + public View getCurrentFocus() { + View focusedView = super.getCurrentFocus(); + if (focusedView != null) { + return focusedView; + } + + for (Fragment fragment : fragmentManager.getFragments().values()) { + View view = shadowOf(fragment).view; + if (view != null) { + focusedView = view.findFocus(); + if (focusedView != null) { + return focusedView; + } + } + } + return null; + } + + @Override + public void clearFocus() { + super.clearFocus(); + + for (Fragment fragment : fragmentManager.getFragments().values()) { + View view = shadowOf(fragment).view; + if (view != null) { + view.clearFocus(); + } + } + } } diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowView.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowView.java index 25a7669b8..45022bca7 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowView.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowView.java @@ -528,6 +528,11 @@ public class ShadowView { } @Implementation + public View findFocus() { + return hasFocus() ? realView : null; + } + + @Implementation public void setOnFocusChangeListener(View.OnFocusChangeListener listener) { onFocusChangeListener = listener; } diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowViewGroup.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowViewGroup.java index 90505615c..bc998d960 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowViewGroup.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowViewGroup.java @@ -170,6 +170,23 @@ public class ShadowViewGroup extends ShadowView { } } + @Implementation + @Override + public View findFocus() { + if (super.hasFocus()) { + return this.realView; + } + + for (View child : children) { + View focusedView = child.findFocus(); + if (focusedView != null) { + return focusedView; + } + } + + return null; + } + /** * Returns a string representation of this {@code ViewGroup} by concatenating all of the strings contained in all * of the descendants of this {@code ViewGroup}. diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java index d5b837648..273cce959 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java @@ -336,6 +336,27 @@ public class ActivityTest { } @Test + public void getCurrentFocus_shouldBeNullWhenNoFocusRequested() { + Activity activity = new Activity(); + activity.setContentView(R.layout.main); + + View focusedView = shadowOf(activity).getCurrentFocus(); + assertNull(focusedView); + } + + @Test + public void getCurrentFocus_shouldReturnSubViewAfterFocusedRequest() { + Activity activity = new Activity(); + activity.setContentView(R.layout.main); + + View view = activity.findViewById(R.id.button); + view.requestFocus(); + + View focusedView = shadowOf(activity).getCurrentFocus(); + assertEquals(R.id.button, focusedView.getId()); + } + + @Test public void retrieveIdOfNonExistingResource() { Activity activity = new Activity(); @@ -431,16 +452,16 @@ public class ActivityTest { Integer storedValue = (Integer) activity.getLastNonConfigurationInstance(); assertEquals(5, storedValue.intValue()); } - + @Test public void startAndStopManagingCursorTracksCursors() throws Exception { TestActivity activity = new TestActivity(); ShadowActivity shadow = shadowOf(activity); - + assertThat( shadow.getManagedCursors(), notNullValue() ); - assertThat( shadow.getManagedCursors().size(), equalTo(0) ); - + assertThat( shadow.getManagedCursors().size(), equalTo(0) ); + Cursor c = Robolectric.newInstanceOf(SQLiteCursor.class); activity.startManagingCursor(c); @@ -449,7 +470,7 @@ public class ActivityTest { assertThat( shadow.getManagedCursors().get(0), sameInstance(c) ); activity.stopManagingCursor(c); - + assertThat( shadow.getManagedCursors(), notNullValue() ); assertThat( shadow.getManagedCursors().size(), equalTo(0) ); } diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/FragmentActivityTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/FragmentActivityTest.java index 5026439a5..d03deed34 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/FragmentActivityTest.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/FragmentActivityTest.java @@ -5,6 +5,8 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; + import com.xtremelabs.robolectric.R; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import com.xtremelabs.robolectric.tester.android.util.TestFragmentManager; @@ -148,6 +150,21 @@ public class FragmentActivityTest { assertTrue(fragment.onPauseWasCalled); } + @Test + public void getCurrentFocus_shouldGetFocusFromFragment() { + activity = new TestFragmentActivity(); + activity.onCreate(null); + shadowOf(activity).onStart(); + + Fragment fragment = activity.getSupportFragmentManager().findFragmentById( + TestFragment.FRAGMENT_VIEW_ID); + View button = activity.findViewById(R.id.button); + button.requestFocus(); + + View focusedView = activity.getCurrentFocus(); + assertSame(button, focusedView); + } + private static class TestFragmentActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/TestFragment.java b/src/test/java/com/xtremelabs/robolectric/shadows/TestFragment.java index 348544d1b..9eb2b2539 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/TestFragment.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/TestFragment.java @@ -1,11 +1,16 @@ package com.xtremelabs.robolectric.shadows; import android.app.Activity; +import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; +import android.widget.FrameLayout; + +import com.xtremelabs.robolectric.R; import com.xtremelabs.robolectric.Robolectric; import com.xtremelabs.robolectric.util.Transcript; @@ -45,7 +50,14 @@ public class TestFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { onCreateViewWasCalled = true; onCreateViewInflater = inflater; - onCreateViewReturnValue = new View(Robolectric.application.getApplicationContext()); + + Context context = Robolectric.application.getApplicationContext(); + Button button = new Button(context); + button.setId(R.id.button); + FrameLayout view = new FrameLayout(context); + view.addView(button); + + onCreateViewReturnValue = view; onCreateViewReturnValue.setId(FRAGMENT_VIEW_ID); transcript.add("onCreateView"); return onCreateViewReturnValue; diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java index 1c9badb3f..74a0225ea 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java @@ -117,7 +117,7 @@ public class ViewGroupTest { root.addView(child2); root.addView(child3, 1); assertThat(root.findViewWithTag("tag1"), sameInstance(child1)); - assertThat(root.findViewWithTag("tag2"), sameInstance((View) child2)); + assertThat(root.findViewWithTag("tag2"), sameInstance(child2)); assertThat((ViewGroup) root.findViewWithTag("tag3"), sameInstance(child3)); } @@ -149,7 +149,7 @@ public class ViewGroupTest { //can find views by tag from root assertThat(root.findViewWithTag("tag1"), sameInstance(child1)); - assertThat(root.findViewWithTag("tag2"), sameInstance((View) child2)); + assertThat(root.findViewWithTag("tag2"), sameInstance(child2)); assertThat((ViewGroup) root.findViewWithTag("tag3"), sameInstance(child3)); //can find views by tag from child3 @@ -204,6 +204,21 @@ public class ViewGroupTest { } @Test + public void findFocus_shouldRecursivelyFindTheViewWithFocus() { + child3a.requestFocus(); + + assertSame(child3a, root.findFocus()); + } + + @Test + public void findFocus_shouldReturnThisBeforeChildrenWithFocus() { + child3a.requestFocus(); + child3.requestFocus(); + + assertSame(child3, root.findFocus()); + } + + @Test public void dump_shouldDumpStructure() throws Exception { child3.setId(R.id.snippet_text); |