/** * This method returns a {@link ReflectionPresenterFactory} instance if a given view class has * a {@link RequiresPresenter} annotation, or null otherwise. * * @param viewClass a class of the view * @param <P> a type of the presenter * @return a {@link ReflectionPresenterFactory} instance that is supposed to create a presenter from {@link RequiresPresenter} annotation. */ @Nullable public static <P extends Presenter> ReflectionPresenterFactory<P> fromViewClass(Class<?> viewClass) { RequiresPresenter annotation = viewClass.getAnnotation(RequiresPresenter.class); //noinspection unchecked Class<P> presenterClass = annotation == null ? null : (Class<P>)annotation.value(); return presenterClass == null ? null : new ReflectionPresenterFactory<>(presenterClass); }
@RequiresPresenter(MainPresenter.class) public class MainActivity extends NucleusActivity<MainPresenter> {
/** * {@link ViewWithPresenter#getPresenter()} */ public P getPresenter() { if (presenterFactory != null) { if (presenter == null && bundle != null) presenter = PresenterStorage.INSTANCE.getPresenter(bundle.getString(PRESENTER_ID_KEY)); if (presenter == null) { presenter = presenterFactory.createPresenter(); PresenterStorage.INSTANCE.add(presenter); presenter.create(bundle == null ? null : bundle.getBundle(PRESENTER_KEY)); } bundle = null; } return presenter; }
@Test public void testSavePresenter() throws Exception { Presenter presenter = new Presenter(); PresenterStorage.INSTANCE.add(presenter); Presenter presenter2 = new Presenter(); PresenterStorage.INSTANCE.add(presenter2); String id = PresenterStorage.INSTANCE.getId(presenter); assertNotEquals(id, PresenterStorage.INSTANCE.getId(presenter2)); assertEquals(presenter, PresenterStorage.INSTANCE.getPresenter(id)); presenter.destroy(); assertNull(PresenterStorage.INSTANCE.getPresenter(id)); }
@Test public void testProvidePresenter() throws Exception { assertNotNull(new ReflectionPresenterFactory<>(TestPresenter.class).createPresenter()); PresenterFactory<Presenter> factory = ReflectionPresenterFactory.fromViewClass(ViewWithPresenter.class); assertNotNull(factory); assertTrue(factory.createPresenter() instanceof TestPresenter); } }
@Override public void onCreate(Bundle savedInstanceState) { final PresenterFactory<P> superFactory = super.getPresenterFactory(); setPresenterFactory(superFactory == null ? null : (PresenterFactory<P>) () -> { P presenter = superFactory.createPresenter(); ((Injector) getActivity().getApplication()).inject(presenter); return presenter; }); super.onCreate(savedInstanceState); Icepick.restoreInstanceState(this, savedInstanceState); }
private void setUpPresenter() throws Exception { mockPresenter = mock(TestPresenter.class); mockDelegate = mock(PresenterLifecycleDelegate.class); PowerMockito.whenNew(PresenterLifecycleDelegate.class).withAnyArguments().thenReturn(mockDelegate); when(mockDelegate.getPresenter()).thenReturn(mockPresenter); mockFactory = mock(ReflectionPresenterFactory.class); when(mockFactory.createPresenter()).thenReturn(mockPresenter); PowerMockito.mockStatic(ReflectionPresenterFactory.class); when(ReflectionPresenterFactory.fromViewClass(any(Class.class))).thenReturn(mockFactory); }
/** * {@link android.app.Activity#onSaveInstanceState(Bundle)}, {@link android.app.Fragment#onSaveInstanceState(Bundle)}, {@link android.view.View#onSaveInstanceState()}. */ public Bundle onSaveInstanceState() { Bundle bundle = new Bundle(); getPresenter(); if (presenter != null) { Bundle presenterBundle = new Bundle(); presenter.save(presenterBundle); bundle.putBundle(PRESENTER_KEY, presenterBundle); bundle.putString(PRESENTER_ID_KEY, PresenterStorage.INSTANCE.getId(presenter)); } return bundle; }
@After public void after() { PresenterStorage.INSTANCE.clear(); } }
@Test public void testNoPresenter() throws Exception { assertNull(ReflectionPresenterFactory.fromViewClass(ViewNoPresenter.class)); }
@RequiresPresenter(LoggingPresenter.class) public class ItemFragment extends LoggingFragment<MainPresenter> {
public PresenterStorage mockStorage() { PresenterStorage storage = mock(PresenterStorage.class); doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { presenters.add((Presenter) invocation.getArguments()[0]); return null; } }).when(storage).add(any(Presenter.class)); doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return "" + presenters.indexOf(invocation.getArguments()[0]); } }).when(storage).getId(any(Presenter.class)); doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return presenters.get(Integer.parseInt((String) invocation.getArguments()[0])); } }).when(storage).getPresenter(anyString()); Whitebox.setInternalState(PresenterStorage.class, "INSTANCE", storage); return storage; }
private void setUpPresenter() throws Exception { mockPresenter = mock(TestPresenter.class); mockDelegate = mock(PresenterLifecycleDelegate.class); PowerMockito.whenNew(PresenterLifecycleDelegate.class).withAnyArguments().thenReturn(mockDelegate); when(mockDelegate.getPresenter()).thenReturn(mockPresenter); mockFactory = mock(ReflectionPresenterFactory.class); when(mockFactory.createPresenter()).thenReturn(mockPresenter); PowerMockito.mockStatic(ReflectionPresenterFactory.class); when(ReflectionPresenterFactory.fromViewClass(any(Class.class))).thenReturn(mockFactory); }
@RequiresPresenter(MainPresenter.class) public class MainFragment extends LoggingFragment<MainPresenter> {
@RequiresPresenter(TestPresenter.class) public static class TestView extends NucleusActivity { @Override protected void onDestroy() { super.onDestroy(); } }
@RequiresPresenter(TestPresenter.class) public static class TestView extends NucleusLayout { public TestView() { super(null); } @Override public boolean isInEditMode() { return false; } }
@RequiresPresenter(TestPresenter.class) public static class ViewWithPresenter extends Presenter { }
@RequiresPresenter(TestPresenter.class) public static class TestView extends NucleusFragment { }
@RequiresPresenter(ItemPresenter.class) public class ItemFragment extends BaseFragment<ItemPresenter> {
@RequiresPresenter(MainPresenter.class) public class MainFragment extends BaseFragment<MainPresenter> {