Skip to content

Commit fb556b2

Browse files
authored
Merge pull request #170 from milchopenchev/vieweffects-queueing-change
Add LiveQueue method to enable ignoring of paused effects entirely
2 parents 4c67db2 + 5af6d08 commit fb556b2

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

mobius-android/src/main/java/com/spotify/mobius/android/LiveQueue.java

+10
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ public interface LiveQueue<T> {
5252
void setObserver(
5353
@Nonnull LifecycleOwner lifecycleOwner, @Nonnull Observer<T> liveEffectsObserver);
5454

55+
/**
56+
* A utility method for calling {@link #setObserver(LifecycleOwner, Observer, Observer)} that
57+
* substitutes null for the optional observer. This method will also cause any effects that occur
58+
* in background to be ignored, and they will not besent if a new pausedEffectsObserver is added.
59+
* The paused effects will not be added in a queue at all, so there will be no exceptions thrown
60+
* due to queue size exceeding a limit.
61+
*/
62+
void setObserverIgnoringPausedEffects(
63+
@Nonnull LifecycleOwner lifecycleOwner, @Nonnull Observer<T> liveEffectsObserver);
64+
5565
/**
5666
* The <code>LiveQueue</code> supports only a single observer, so calling this method will
5767
* override any previous observers set.<br>

mobius-android/src/main/java/com/spotify/mobius/android/MutableLiveQueue.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ void onAny(LifecycleOwner source, Lifecycle.Event event) {
5555
@Nullable private Observer<T> liveObserver = null;
5656
@Nullable private Observer<Iterable<T>> pausedObserver = null;
5757
private boolean lifecycleOwnerIsPaused = true;
58+
private boolean ignoreBackgroundEffects = false;
5859

5960
MutableLiveQueue(WorkRunner effectsWorkRunner, int capacity) {
6061
this.effectsWorkRunner = effectsWorkRunner;
@@ -76,6 +77,16 @@ public void setObserver(@Nonnull LifecycleOwner owner, @Nonnull Observer<T> live
7677
setObserver(owner, liveEffectsObserver, null);
7778
}
7879

80+
@Override
81+
public void setObserverIgnoringPausedEffects(
82+
@Nonnull LifecycleOwner owner, @Nonnull Observer<T> liveEffectsObserver) {
83+
synchronized (lock) {
84+
setObserver(owner, liveEffectsObserver, null);
85+
ignoreBackgroundEffects = true;
86+
pausedEffectsQueue.clear();
87+
}
88+
}
89+
7990
@Override
8091
public void setObserver(
8192
@Nonnull LifecycleOwner lifecycleOwner,
@@ -89,6 +100,7 @@ public void setObserver(
89100
this.pausedObserver = pausedObserver;
90101
this.lifecycleOwnerIsPaused = true;
91102
lifecycleOwner.getLifecycle().addObserver(new LifecycleObserverHelper());
103+
ignoreBackgroundEffects = false;
92104
}
93105
}
94106

@@ -110,7 +122,7 @@ public void clearObserver() {
110122
void post(@Nonnull final T data) {
111123
synchronized (lock) {
112124
if (lifecycleOwnerIsPaused) {
113-
if (!pausedEffectsQueue.offer(data)) {
125+
if (shouldQueuePausedEffects() && !pausedEffectsQueue.offer(data)) {
114126
throw new IllegalStateException(
115127
"Maximum effect queue size ("
116128
+ pausedEffectsQueue.size()
@@ -123,6 +135,10 @@ void post(@Nonnull final T data) {
123135
}
124136
}
125137

138+
private boolean shouldQueuePausedEffects() {
139+
return !ignoreBackgroundEffects;
140+
}
141+
126142
private void onLifecycleChanged(Lifecycle.Event event) {
127143
switch (event) {
128144
case ON_RESUME:

mobius-android/src/test/java/com/spotify/mobius/android/MutableLiveQueueTest.java

+13
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,19 @@ public void shouldQueueEventsWithNoObserver() {
100100
assertThat(pausedObserver.valueCount(), equalTo(1));
101101
}
102102

103+
@Test
104+
public void shouldNotQueueEventsWhenSetToIgnoreBackgroundEventsAndNoObserver() {
105+
mutableLiveQueue.setObserverIgnoringPausedEffects(fakeLifecycleOwner1, liveObserver);
106+
fakeLifecycleOwner1.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
107+
mutableLiveQueue.post("one");
108+
mutableLiveQueue.post("two");
109+
mutableLiveQueue.setObserver(fakeLifecycleOwner1, liveObserver, pausedObserver);
110+
fakeLifecycleOwner1.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
111+
112+
assertThat(liveObserver.valueCount(), equalTo(0));
113+
assertThat(pausedObserver.valueCount(), equalTo(0));
114+
}
115+
103116
@Test
104117
public void shouldSendQueuedEventsWithValidPausedObserver() {
105118
fakeLifecycleOwner1.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);

0 commit comments

Comments
 (0)