|
|
@@ -900,8 +900,8 @@ public void bindServices(@NonNull ServiceBinder serviceBinder) { |
|
|
new ChildKey("C1", History.of("P0", "P1", "P2")),
|
|
|
new ChildKey("C2", History.of("P0", "P1", "P2")),
|
|
|
new ChildKey("C3", History.of("P0", "P1", "P3")),
|
|
|
new ChildKey("C4", History.of("P4")),
|
|
|
new ChildKey("C5", History.of("P4"))
|
|
|
new ChildKey("C4", History.of("P0", "P4")),
|
|
|
new ChildKey("C5", History.of("P0", "P4"))
|
|
|
)
|
|
|
);
|
|
|
backstackManager.setStateChanger(stateChanger);
|
|
|
@@ -930,7 +930,6 @@ public void bindServices(@NonNull ServiceBinder serviceBinder) { |
|
|
|
|
|
/// verified set up
|
|
|
|
|
|
assertThat(activated).containsExactly(serviceP0, serviceP4, serviceC5);
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
@@ -941,6 +940,7 @@ public void bindServices(@NonNull ServiceBinder serviceBinder) { |
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5);
|
|
|
assertThat(activated).containsExactly(serviceP0, serviceP4, serviceC5);
|
|
|
assertThat(inactivated).isEmpty();
|
|
|
assertThat(exitedScope).isEmpty();
|
|
|
|
|
|
@@ -1048,6 +1048,328 @@ public void bindServices(@NonNull ServiceBinder serviceBinder) { |
|
|
serviceP0);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
public void explicitParentServicesReceiveCallbacksBeforeChildInAscendingOrderOtherSetup() {
|
|
|
final List<Object> enteredScope = new ArrayList<>();
|
|
|
final List<Object> exitedScope = new ArrayList<>();
|
|
|
|
|
|
final List<Object> activated = new ArrayList<>();
|
|
|
final List<Object> inactivated = new ArrayList<>();
|
|
|
class Service
|
|
|
implements ScopedServices.Scoped, ScopedServices.Activated {
|
|
|
private boolean didEnterScope;
|
|
|
private boolean didExitScope;
|
|
|
private boolean didScopeActivate;
|
|
|
private boolean didScopeInactivate;
|
|
|
|
|
|
@Override
|
|
|
public void onEnterScope(@NonNull String scope) {
|
|
|
this.didEnterScope = true;
|
|
|
enteredScope.add(this);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onExitScope(@NonNull String scope) {
|
|
|
this.didExitScope = true;
|
|
|
exitedScope.add(this);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onScopeActive(@NonNull String scope) {
|
|
|
this.didScopeActivate = true;
|
|
|
activated.add(this);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onScopeInactive(@NonNull String scope) {
|
|
|
this.didScopeInactivate = true;
|
|
|
inactivated.add(this);
|
|
|
}
|
|
|
}
|
|
|
final Service serviceP0 = new Service();
|
|
|
final Service serviceP1 = new Service();
|
|
|
final Service serviceP2 = new Service();
|
|
|
final Service serviceP3 = new Service();
|
|
|
final Service serviceP4 = new Service();
|
|
|
final Service serviceC1 = new Service();
|
|
|
final Service serviceC2 = new Service();
|
|
|
final Service serviceC3 = new Service();
|
|
|
final Service serviceC4 = new Service();
|
|
|
final Service serviceC5 = new Service();
|
|
|
|
|
|
class ChildKey
|
|
|
extends TestKey
|
|
|
implements ScopeKey, ScopeKey.Child {
|
|
|
private final List<String> parentScopes;
|
|
|
|
|
|
ChildKey(String name, List<String> parentScopes) {
|
|
|
super(name);
|
|
|
this.parentScopes = parentScopes;
|
|
|
}
|
|
|
|
|
|
@NonNull
|
|
|
@Override
|
|
|
public String getScopeTag() {
|
|
|
return name;
|
|
|
}
|
|
|
|
|
|
@NonNull
|
|
|
@Override
|
|
|
public List<String> getParentScopes() {
|
|
|
return parentScopes;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
StateChanger stateChanger = new StateChanger() {
|
|
|
@Override
|
|
|
public void handleStateChange(@NonNull StateChange stateChange, @NonNull Callback completionCallback) {
|
|
|
completionCallback.stateChangeComplete();
|
|
|
}
|
|
|
};
|
|
|
|
|
|
BackstackManager backstackManager = new BackstackManager();
|
|
|
backstackManager.setScopedServices(new ScopedServices() {
|
|
|
@Override
|
|
|
public void bindServices(@NonNull ServiceBinder serviceBinder) {
|
|
|
if(serviceBinder.getScopeTag().equals("P0")) {
|
|
|
serviceBinder.add("service", serviceP0);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("P1")) {
|
|
|
serviceBinder.add("service", serviceP1);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("P2")) {
|
|
|
serviceBinder.add("service", serviceP2);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("P3")) {
|
|
|
serviceBinder.add("service", serviceP3);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("P4")) {
|
|
|
serviceBinder.add("service", serviceP4);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("C1")) {
|
|
|
serviceBinder.add("service", serviceC1);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("C2")) {
|
|
|
serviceBinder.add("service", serviceC2);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("C3")) {
|
|
|
serviceBinder.add("service", serviceC3);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("C4")) {
|
|
|
serviceBinder.add("service", serviceC4);
|
|
|
}
|
|
|
if(serviceBinder.getScopeTag().equals("C5")) {
|
|
|
serviceBinder.add("service", serviceC5);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
/*
|
|
|
* PARENT0 PARENT4
|
|
|
* PARENT1 CHILD4 CHILD5
|
|
|
* PARENT2 PARENT3
|
|
|
* CHILD1 CHILD2 CHILD3
|
|
|
*/
|
|
|
backstackManager.setup(
|
|
|
History.of(
|
|
|
new ChildKey("C1", History.of("P0", "P1", "P2")),
|
|
|
new ChildKey("C2", History.of("P0", "P1", "P2")),
|
|
|
new ChildKey("C3", History.of("P0", "P1", "P3")),
|
|
|
new ChildKey("C4", History.of("P4")),
|
|
|
new ChildKey("C5", History.of("P4"))
|
|
|
)
|
|
|
);
|
|
|
backstackManager.setStateChanger(stateChanger);
|
|
|
|
|
|
assertThat(backstackManager.hasScope("C1")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("C2")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("C3")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("C4")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("C5")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("P0")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("P1")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("P2")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("P3")).isTrue();
|
|
|
assertThat(backstackManager.hasScope("P4")).isTrue();
|
|
|
|
|
|
assertThat(backstackManager.getService("C1", "service")).isSameAs(serviceC1);
|
|
|
assertThat(backstackManager.getService("C2", "service")).isSameAs(serviceC2);
|
|
|
assertThat(backstackManager.getService("C3", "service")).isSameAs(serviceC3);
|
|
|
assertThat(backstackManager.getService("C4", "service")).isSameAs(serviceC4);
|
|
|
assertThat(backstackManager.getService("C5", "service")).isSameAs(serviceC5);
|
|
|
assertThat(backstackManager.getService("P0", "service")).isSameAs(serviceP0);
|
|
|
assertThat(backstackManager.getService("P1", "service")).isSameAs(serviceP1);
|
|
|
assertThat(backstackManager.getService("P2", "service")).isSameAs(serviceP2);
|
|
|
assertThat(backstackManager.getService("P3", "service")).isSameAs(serviceP3);
|
|
|
assertThat(backstackManager.getService("P4", "service")).isSameAs(serviceP4);
|
|
|
|
|
|
/// verified set up
|
|
|
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceC2,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5);
|
|
|
assertThat(activated).containsExactly(serviceP4, serviceC5);
|
|
|
assertThat(inactivated).isEmpty();
|
|
|
assertThat(exitedScope).isEmpty();
|
|
|
|
|
|
backstackManager.getBackstack().goBack(); // [C1, C2, C3, C4]
|
|
|
|
|
|
assertThat(activated).containsExactly(serviceP4, serviceC5, serviceC4);
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceC2,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5);
|
|
|
assertThat(inactivated).containsExactly(serviceC5);
|
|
|
assertThat(exitedScope).containsExactly(serviceC5);
|
|
|
|
|
|
backstackManager.getBackstack().goBack(); // [C1, C2, C3]
|
|
|
|
|
|
assertThat(activated).containsExactly(serviceP4,
|
|
|
serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP3,
|
|
|
serviceC3);
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceC2,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5);
|
|
|
assertThat(inactivated).containsExactly(serviceC5, serviceC4, serviceP4);
|
|
|
assertThat(exitedScope).containsExactly(serviceC5, serviceC4, serviceP4);
|
|
|
|
|
|
backstackManager.getBackstack().jumpToRoot(); // [C1]
|
|
|
|
|
|
assertThat(activated).containsExactly(serviceP4,
|
|
|
serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP2,
|
|
|
serviceC1);
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceC2,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5);
|
|
|
assertThat(inactivated).containsExactly(serviceC5, serviceC4, serviceP4, serviceC3, serviceP3);
|
|
|
assertThat(exitedScope).containsExactly(serviceC5, serviceC4, serviceP4, serviceC3, serviceP3, serviceC2);
|
|
|
|
|
|
backstackManager.getBackstack().setHistory(History.of(new TestKey("bye")), StateChange.REPLACE); // ["bye"]
|
|
|
|
|
|
assertThat(activated).containsExactly(serviceP4,
|
|
|
serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP2,
|
|
|
serviceC1);
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceC2,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5);
|
|
|
assertThat(inactivated).containsExactly(serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP4,
|
|
|
serviceC3,
|
|
|
serviceP3,
|
|
|
serviceC1,
|
|
|
serviceP2,
|
|
|
serviceP1,
|
|
|
serviceP0);
|
|
|
assertThat(exitedScope).containsExactly(serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP4,
|
|
|
serviceC3,
|
|
|
serviceP3,
|
|
|
serviceC2,
|
|
|
serviceC1,
|
|
|
serviceP2,
|
|
|
serviceP1,
|
|
|
serviceP0);
|
|
|
|
|
|
backstackManager.getBackstack().setHistory(History.of(new ChildKey("C5", History.of("P4"))),
|
|
|
StateChange.REPLACE);
|
|
|
|
|
|
assertThat(activated).containsExactly(serviceP4,
|
|
|
serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceP4,
|
|
|
serviceC5);
|
|
|
assertThat(enteredScope).containsExactly(serviceP0,
|
|
|
serviceP1,
|
|
|
serviceP2,
|
|
|
serviceC1,
|
|
|
serviceC2,
|
|
|
serviceP3,
|
|
|
serviceC3,
|
|
|
serviceP4,
|
|
|
serviceC4,
|
|
|
serviceC5,
|
|
|
serviceP4,
|
|
|
serviceC5);
|
|
|
assertThat(inactivated).containsExactly(serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP4,
|
|
|
serviceC3,
|
|
|
serviceP3,
|
|
|
serviceC1,
|
|
|
serviceP2,
|
|
|
serviceP1,
|
|
|
serviceP0);
|
|
|
assertThat(exitedScope).containsExactly(serviceC5,
|
|
|
serviceC4,
|
|
|
serviceP4,
|
|
|
serviceC3,
|
|
|
serviceP3,
|
|
|
serviceC2,
|
|
|
serviceC1,
|
|
|
serviceP2,
|
|
|
serviceP1,
|
|
|
serviceP0);
|
|
|
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
public void explicitParentsAreCreatedEvenIfThereAreNoScopeKeys() {
|
|
|
final List<Object> enteredScope = new ArrayList<>();
|
|
|
@@ -1148,6 +1470,4 @@ public void bindServices(@NonNull ServiceBinder serviceBinder) { |
|
|
assertThat(backstackManager.getService("boop", "service")).isSameAs(service1);
|
|
|
assertThat(backstackManager.lookupService("service")).isSameAs(service1);
|
|
|
}
|
|
|
|
|
|
// TODO: verify that parent scope services also have their states properly persisted by Bundleable
|
|
|
}
|