Skip to content

Commit 4bf2712

Browse files
committed
2.3.2: Fix that removeAllStateChangeListeners() conflicts with internals
1 parent d44bfc8 commit 4bf2712

4 files changed

Lines changed: 114 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Change log
22

3+
-Simple Stack 2.3.2 (2020-04-11)
4+
--------------------------------
5+
6+
- FIX: Bug introduced in 2.3.1, using `backstack.removeAllStateChangeCompletionListeners()` would remove an internal completion listener and therefore scope activation callbacks would stop being dispatched.
7+
38
-Simple Stack 2.3.1 (2020-03-31)
49
--------------------------------
510

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ and then, add the dependency to your module's `build.gradle.kts` (or `build.grad
122122

123123
``` kotlin
124124
// build.gradle.kts
125-
implementation("com.github.Zhuinden:simple-stack:2.3.1")
125+
implementation("com.github.Zhuinden:simple-stack:2.3.2")
126126
```
127127

128128
or
129129

130130
``` groovy
131131
// build.gradle
132-
implementation 'com.github.Zhuinden:simple-stack:2.3.1'
132+
implementation 'com.github.Zhuinden:simple-stack:2.3.2'
133133
```
134134

135135
## How does it work?

simple-stack/src/main/java/com/zhuinden/simplestack/Backstack.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@ public void removeStateChangeCompletionListener(@Nonnull Backstack.CompletionLis
678678
public void removeAllStateChangeCompletionListeners() {
679679
checkBackstack("A backstack must be set up before state change completion listeners are removed from it.");
680680
this.core.removeCompletionListeners();
681+
this.core.addCompletionListener(managedStateChangerCompletionListener); // #221
681682
}
682683

683684
/**

simple-stack/src/test/java/com/zhuinden/simplestack/BackstackTest.java

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,4 +304,110 @@ public void uninitializedStackGoBackWorks() {
304304

305305
assertThat(backstack.goBack()).isFalse();
306306
}
307+
308+
@Test
309+
public void removeStateChangerListenersDoesNotBreakScoping() {
310+
Backstack backstack = new Backstack();
311+
312+
ScopeKey key1 = new ScopeKey() {
313+
@Nonnull
314+
@Override
315+
public String getScopeTag() {
316+
return "key1";
317+
}
318+
319+
@Override
320+
public String toString() {
321+
return "KEY1";
322+
}
323+
};
324+
325+
final ScopeKey key2 = new ScopeKey() {
326+
@Nonnull
327+
@Override
328+
public String getScopeTag() {
329+
return "key2";
330+
}
331+
332+
@Override
333+
public String toString() {
334+
return "KEY2";
335+
}
336+
};
337+
338+
final Object key3 = new Object();
339+
340+
class Service implements ScopedServices.Registered, ScopedServices.Activated {
341+
private boolean isActivatedCalled;
342+
private boolean isDeactivatedCalled;
343+
private boolean isRegisteredCalled;
344+
private boolean isUnregisteredCalled;
345+
346+
@Override
347+
public void onServiceActive() {
348+
isActivatedCalled = true;
349+
}
350+
351+
@Override
352+
public void onServiceInactive() {
353+
isDeactivatedCalled = true;
354+
}
355+
356+
@Override
357+
public void onServiceRegistered() {
358+
isRegisteredCalled = true;
359+
}
360+
361+
@Override
362+
public void onServiceUnregistered() {
363+
isUnregisteredCalled = true;
364+
}
365+
}
366+
367+
final Service service1 = new Service();
368+
final Service service2 = new Service();
369+
370+
backstack.setScopedServices(new ScopedServices() {
371+
@Override
372+
public void bindServices(@Nonnull ServiceBinder serviceBinder) {
373+
if("key1".equals(serviceBinder.getScopeTag())) {
374+
serviceBinder.addService("service1", service1);
375+
}
376+
if("key2".equals(serviceBinder.getScopeTag())) {
377+
serviceBinder.addService("service2", service2);
378+
}
379+
}
380+
});
381+
382+
backstack.setup(History.of(key1));
383+
384+
final StateChanger stateChanger = new StateChanger() {
385+
@Override
386+
public void handleStateChange(@Nonnull StateChange stateChange, @Nonnull Callback completionCallback) {
387+
completionCallback.stateChangeComplete();
388+
}
389+
};
390+
391+
backstack.setStateChanger(stateChanger);
392+
393+
backstack.removeStateChanger();
394+
395+
backstack.setHistory(History.of(key2), StateChange.REPLACE);
396+
397+
backstack.removeAllStateChangeCompletionListeners();
398+
399+
backstack.setStateChanger(stateChanger);
400+
401+
backstack.setHistory(History.of(key3), StateChange.REPLACE);
402+
403+
assertThat(service1.isActivatedCalled).isTrue();
404+
assertThat(service1.isDeactivatedCalled).isTrue();
405+
assertThat(service1.isRegisteredCalled).isTrue();
406+
assertThat(service1.isUnregisteredCalled).isTrue();
407+
408+
assertThat(service2.isRegisteredCalled).isTrue();
409+
assertThat(service2.isUnregisteredCalled).isTrue();
410+
assertThat(service2.isActivatedCalled).isTrue();
411+
assertThat(service2.isDeactivatedCalled).isTrue();
412+
}
307413
}

0 commit comments

Comments
 (0)