aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Hamilton <jham@google.com>2013-01-24 17:40:15 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-01-24 17:40:15 +0000
commita9dac6d391780b442bad54bce986683095d6a36b (patch)
treeeffe8f53fb24316ba80458cd1a8aee21bf590705
parent665c73f08d5681d345c0c559f1b1008740371bd8 (diff)
parent10afa627a8dc3aba930189ee6b15d1aa99531ec8 (diff)
downloadrobolectric-a9dac6d391780b442bad54bce986683095d6a36b.tar.gz
Merge "Implementing Activity#getCurrentFocus and View#findFocus."
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java15
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowFragmentActivity.java36
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowView.java5
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowViewGroup.java17
-rw-r--r--src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java31
-rw-r--r--src/test/java/com/xtremelabs/robolectric/shadows/FragmentActivityTest.java17
-rw-r--r--src/test/java/com/xtremelabs/robolectric/shadows/TestFragment.java14
-rw-r--r--src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java19
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);