public FragmentLifecycleProviderImpl(final NaviComponent fragment) { if (!fragment.handlesEvents(Event.ATTACH, Event.CREATE, Event.CREATE_VIEW, Event.START, Event.RESUME, Event.PAUSE, Event.STOP, Event.DESTROY_VIEW, Event.DESTROY, Event.DETACH)) { throw new IllegalArgumentException("NaviComponent does not handle all required events"); } RxNavi.observe(fragment, Event.ALL) .filter(FRAGMENT_EVENT_FILTER) .map(FRAGMENT_EVENT_MAP) .subscribe(lifecycleSubject); }
@Override public int hashCode() { int result = eventType.hashCode(); result = 31 * result + callbackType.hashCode(); return result; }
@Override public void subscribe(final ObservableEmitter<T> emitter) { EmitterListener listener = new EmitterListener(emitter); emitter.setDisposable(listener); component.addListener(event, listener); }
@Test public void createAllListener() { emitter.addListener(Event.ALL, listener); Bundle bundle = new Bundle(); emitter.onCreate(bundle); verify(listener).call(Type.CREATE); emitter.removeListener(listener); emitter.onCreate(bundle); }
@Test public void attachListener() { setSdkInt(21); Listener<Context> listener = mock(Listener.class); emitter.addListener(Event.ATTACH, listener); Activity activity = mock(Activity.class); emitter.onAttach(activity); verify(listener).call(activity); emitter.removeListener(listener); emitter.onAttach(activity); verifyNoMoreInteractions(listener); }
@Test public void requestPermissionsResultListener() { Listener<RequestPermissionsResult> listener = mock(Listener.class); emitter.addListener(Event.REQUEST_PERMISSIONS_RESULT, listener); int requestCode = 1; String[] permissions = new String[0]; int[] grantResults = new int[0]; emitter.onRequestPermissionsResult(requestCode, permissions, grantResults); verify(listener).call(RequestPermissionsResult.create(requestCode, permissions, grantResults)); emitter.removeListener(listener); emitter.onRequestPermissionsResult(requestCode, permissions, grantResults); verifyNoMoreInteractions(listener); }
@Test public void startAllListener() { emitter.addListener(Event.ALL, listener); emitter.onStart(); verify(listener).call(Type.START); emitter.removeListener(listener); emitter.onStart(); }
@Test public void resumeListener() { Listener<Object> listener = mock(Listener.class); emitter.addListener(Event.RESUME, listener); emitter.onResume(); verify(listener).call(any()); emitter.removeListener(listener); emitter.onResume(); verifyNoMoreInteractions(listener); }
@Test public void restoreInstanceStateListener() { Listener<Bundle> listener = mock(Listener.class); emitter.addListener(Event.RESTORE_INSTANCE_STATE, listener); Bundle bundle = new Bundle(); emitter.onRestoreInstanceState(bundle); verify(listener).call(bundle); emitter.removeListener(listener); emitter.onRestoreInstanceState(bundle); verifyNoMoreInteractions(listener); }
@Test public void viewStateRestoredListener() { Listener<Bundle> listener = mock(Listener.class); emitter.addListener(Event.VIEW_STATE_RESTORED, listener); Bundle bundle = new Bundle(); emitter.onViewStateRestored(bundle); verify(listener).call(bundle); emitter.removeListener(listener); emitter.onViewStateRestored(bundle); verifyNoMoreInteractions(listener); }
@Test public void destroyListener() { Listener<Object> listener = mock(Listener.class); emitter.addListener(Event.DESTROY, listener); emitter.onDestroy(); verify(listener).call(any()); emitter.removeListener(listener); emitter.onDestroy(); verifyNoMoreInteractions(listener); }
@Test public void configurationChangedListener() { Listener<Configuration> listener = mock(Listener.class); emitter.addListener(Event.CONFIGURATION_CHANGED, listener); Configuration configuration = new Configuration(); emitter.onConfigurationChanged(configuration); verify(listener).call(configuration); emitter.removeListener(listener); emitter.onConfigurationChanged(configuration); verifyNoMoreInteractions(listener); }
@Test public void addDuringEmitAll() { final Listener<Object> addedDuringEmit = mock(Listener.class); final Listener<Type> listener = spy(new Listener<Type>() { @Override public void call(@NonNull Type type) { emitter.addListener(Event.RESUME, addedDuringEmit); } }); emitter.addListener(Event.ALL, listener); emitter.onResume(); verify(listener).call(Type.RESUME); verifyZeroInteractions(addedDuringEmit); }
@Test public void handlesEventsMultiple() { NaviComponent component = NaviEmitter.createActivityEmitter(); assertTrue(component.handlesEvents(Event.CREATE, Event.START, Event.RESUME)); assertFalse(component.handlesEvents(Event.ATTACH, Event.CREATE_VIEW)); assertFalse(component.handlesEvents(Event.CREATE, Event.CREATE_VIEW)); }
private <T> void emitEvent(@NonNull Event<T> event, @NonNull T data) { // We gather listener iterators all at once so adding/removing listeners during emission // doesn't change the listener list. final List<Listener> listeners = listenerMap.get(event); final Iterator<Listener> listenersIterator = listeners != null ? listeners.listIterator() : null; final List<Listener> allListeners = listenerMap.get(Event.ALL); final Iterator<Listener> allListenersIterator = allListeners != null ? allListeners.iterator() : null; if (allListenersIterator != null) { final Type type = event.type(); while (allListenersIterator.hasNext()) { allListenersIterator.next().call(type); } } if (listeners != null) { while (listenersIterator.hasNext()) { listenersIterator.next().call(data); } } }
@Test public void createViewListener() { Listener<Bundle> listener = mock(Listener.class); emitter.addListener(Event.CREATE_VIEW, listener); Bundle bundle = new Bundle(); emitter.onCreateView(bundle); verify(listener).call(bundle); emitter.removeListener(listener); emitter.onCreate(bundle); verifyNoMoreInteractions(listener); }
@Test public void attachListenerApi23() { setSdkInt(23); Listener<Context> listener = mock(Listener.class); emitter.addListener(Event.ATTACH, listener); Context context = mock(Context.class); emitter.onAttach(context); verify(listener).call(context); emitter.removeListener(listener); emitter.onAttach(context); verifyNoMoreInteractions(listener); }
public ActivityLifecycleProviderImpl(final NaviComponent activity) { if (!activity.handlesEvents(Event.CREATE, Event.START, Event.RESUME, Event.PAUSE, Event.STOP, Event.DESTROY)) { throw new IllegalArgumentException("NaviComponent does not handle all required events"); } RxNavi.observe(activity, Event.ALL) .filter(ACTIVITY_EVENT_FILTER) .map(ACTIVITY_EVENT_MAP) .subscribe(lifecycleSubject); }
@Test public void handlesEventsSingle() { NaviComponent component = NaviEmitter.createActivityEmitter(); assertTrue(component.handlesEvents(Event.CREATE)); assertFalse(component.handlesEvents(Event.CREATE_VIEW)); }
@Test public void handlesEventsNone() { NaviComponent component = NaviEmitter.createActivityEmitter(); assertTrue(component.handlesEvents()); }