1 package com.xtremelabs.robolectric.shadows; 2 3 import android.os.Bundle; 4 import android.support.v4.app.Fragment; 5 import android.support.v4.app.FragmentActivity; 6 import android.support.v4.app.FragmentManager; 7 import android.view.View; 8 9 import com.xtremelabs.robolectric.internal.Implementation; 10 import com.xtremelabs.robolectric.internal.Implements; 11 import com.xtremelabs.robolectric.internal.RealObject; 12 import com.xtremelabs.robolectric.tester.android.util.TestFragmentManager; 13 14 import java.util.ArrayList; 15 import java.util.List; 16 import java.util.Map; 17 18 import static com.xtremelabs.robolectric.Robolectric.shadowOf; 19 20 @Implements(FragmentActivity.class) 21 public class ShadowFragmentActivity extends ShadowActivity { 22 @RealObject 23 FragmentActivity realObject; 24 25 private TestFragmentManager fragmentManager; 26 public static final String FRAGMENTS_TAG = "android:fragments"; 27 __constructor__()28 public void __constructor__() { 29 fragmentManager = new TestFragmentManager(realObject); 30 } 31 32 @Implementation onCreate(Bundle bundle)33 public void onCreate(Bundle bundle) { 34 super.onCreate(bundle); 35 36 if (bundle != null && bundle.containsKey(FRAGMENTS_TAG)) { 37 Object[] fragments = (Object[]) bundle.getSerializable(FRAGMENTS_TAG); 38 39 for (Object o : fragments) { 40 SerializedFragmentState fragmentState = (SerializedFragmentState) o; 41 42 try { 43 Fragment fragment = fragmentState.fragmentClass.newInstance(); 44 shadowOf(fragment).setSavedInstanceState(bundle); 45 46 fragmentManager.addFragment(fragmentState.containerId, fragmentState.tag, fragment, true); 47 } catch (InstantiationException e) { 48 throw new RuntimeException(e); 49 } catch (IllegalAccessException e) { 50 throw new RuntimeException(e); 51 } 52 } 53 } 54 } 55 56 @Implementation onStart()57 public void onStart() { 58 for (Fragment fragment : fragmentManager.getFragments()) { 59 fragmentManager.startFragment(fragment); 60 } 61 } 62 63 @Implementation onPause()64 public void onPause() { 65 for(Fragment fragment : fragmentManager.getFragments()) { 66 fragment.onPause(); 67 } 68 } 69 70 @Implementation getSupportFragmentManager()71 public FragmentManager getSupportFragmentManager() { 72 return fragmentManager; 73 } 74 75 @Implementation onSaveInstanceState(Bundle outState)76 public void onSaveInstanceState(Bundle outState) { 77 // We cannot figure out how to pass the RobolectricWiring test without doing this incredibly 78 // terrible looking hack. I am very sorry. 79 List<SerializedFragmentState> fragmentStates = new ArrayList<SerializedFragmentState>(); 80 81 for (Map.Entry<Integer, Fragment> entry : fragmentManager.getFragmentsById().entrySet()) { 82 Fragment fragment = entry.getValue(); 83 fragment.onSaveInstanceState(outState); 84 fragmentStates.add(new SerializedFragmentState(entry.getKey(), fragment)); 85 } 86 87 outState.putSerializable(FRAGMENTS_TAG, fragmentStates.toArray()); 88 } 89 90 @Implementation 91 @Override getCurrentFocus()92 public View getCurrentFocus() { 93 View focusedView = super.getCurrentFocus(); 94 if (focusedView != null) { 95 return focusedView; 96 } 97 98 for (Fragment fragment : fragmentManager.getFragments()) { 99 View view = shadowOf(fragment).view; 100 if (view != null) { 101 focusedView = view.findFocus(); 102 if (focusedView != null) { 103 return focusedView; 104 } 105 } 106 } 107 return null; 108 } 109 110 @Override clearFocus()111 public void clearFocus() { 112 super.clearFocus(); 113 114 for (Fragment fragment : fragmentManager.getFragments()) { 115 View view = shadowOf(fragment).view; 116 if (view != null) { 117 view.clearFocus(); 118 } 119 } 120 } 121 } 122