|
@@ -6,15 +6,8 @@ import android.support.annotation.Nullable;
|
6
|
6
|
import android.view.ViewGroup;
|
7
|
7
|
import android.widget.FrameLayout;
|
8
|
8
|
|
9
|
|
-import com.reactnativenavigation.utils.StringUtils;
|
10
|
|
-
|
11
|
|
-import java.util.ArrayDeque;
|
12
|
|
-import java.util.HashMap;
|
13
|
|
-import java.util.Map;
|
14
|
|
-
|
15
|
9
|
public class StackController extends ViewController {
|
16
|
|
- private final ArrayDeque<String> idStack = new ArrayDeque<>();
|
17
|
|
- private final Map<String, ViewController> controllersById = new HashMap<>();
|
|
10
|
+ private final IndexedStack<ViewController> stack = new IndexedStack<>();
|
18
|
11
|
|
19
|
12
|
public StackController(final Activity activity, String id) {
|
20
|
13
|
super(activity, id);
|
|
@@ -24,8 +17,7 @@ public class StackController extends ViewController {
|
24
|
17
|
final ViewController previousTop = peek();
|
25
|
18
|
|
26
|
19
|
child.setStackController(this);
|
27
|
|
- idStack.push(child.getId());
|
28
|
|
- controllersById.put(child.getId(), child);
|
|
20
|
+ stack.push(child.getId(), child);
|
29
|
21
|
|
30
|
22
|
getView().addView(child.getView());
|
31
|
23
|
if (previousTop != null) {
|
|
@@ -34,15 +26,14 @@ public class StackController extends ViewController {
|
34
|
26
|
}
|
35
|
27
|
|
36
|
28
|
public boolean canPop() {
|
37
|
|
- return idStack.size() > 1;
|
|
29
|
+ return stack.size() > 1;
|
38
|
30
|
}
|
39
|
31
|
|
40
|
32
|
public void pop() {
|
41
|
33
|
if (!canPop()) {
|
42
|
34
|
return;
|
43
|
35
|
}
|
44
|
|
- String poppedId = idStack.pop();
|
45
|
|
- ViewController poppedController = controllersById.remove(poppedId);
|
|
36
|
+ ViewController poppedController = stack.pop();
|
46
|
37
|
getView().removeView(poppedController.getView());
|
47
|
38
|
|
48
|
39
|
ViewController previousTop = peek();
|
|
@@ -50,28 +41,23 @@ public class StackController extends ViewController {
|
50
|
41
|
}
|
51
|
42
|
|
52
|
43
|
public void pop(final ViewController childController) {
|
53
|
|
- if (StringUtils.isEqual(peekId(), childController.getId())) {
|
|
44
|
+ if (stack.isTop(childController.getId())) {
|
54
|
45
|
pop();
|
55
|
46
|
} else {
|
56
|
|
- idStack.remove(childController.getId());
|
57
|
|
- controllersById.remove(childController.getId());
|
|
47
|
+ stack.remove(childController.getId());
|
58
|
48
|
}
|
59
|
49
|
}
|
60
|
50
|
|
61
|
51
|
public ViewController peek() {
|
62
|
|
- return controllersById.get(peekId());
|
63
|
|
- }
|
64
|
|
-
|
65
|
|
- public String peekId() {
|
66
|
|
- return idStack.peek();
|
|
52
|
+ return stack.peek();
|
67
|
53
|
}
|
68
|
54
|
|
69
|
55
|
public int size() {
|
70
|
|
- return idStack.size();
|
|
56
|
+ return stack.size();
|
71
|
57
|
}
|
72
|
58
|
|
73
|
59
|
public boolean isEmpty() {
|
74
|
|
- return idStack.isEmpty();
|
|
60
|
+ return stack.isEmpty();
|
75
|
61
|
}
|
76
|
62
|
|
77
|
63
|
@Override
|
|
@@ -103,10 +89,10 @@ public class StackController extends ViewController {
|
103
|
89
|
}
|
104
|
90
|
|
105
|
91
|
public void popTo(final ViewController viewController) {
|
106
|
|
- if (!idStack.contains(viewController.getId())) {
|
|
92
|
+ if (!stack.containsId(viewController.getId())) {
|
107
|
93
|
return;
|
108
|
94
|
}
|
109
|
|
- while (!StringUtils.isEqual(peekId(), viewController.getId())) {
|
|
95
|
+ while (!stack.isTop(viewController.getId())) {
|
110
|
96
|
pop();
|
111
|
97
|
}
|
112
|
98
|
}
|
|
@@ -118,10 +104,10 @@ public class StackController extends ViewController {
|
118
|
104
|
}
|
119
|
105
|
|
120
|
106
|
public ViewController getChildById(final String id) {
|
121
|
|
- return controllersById.get(id);
|
|
107
|
+ return stack.get(id);
|
122
|
108
|
}
|
123
|
109
|
|
124
|
|
- ArrayDeque<String> getStack() {
|
125
|
|
- return idStack;
|
|
110
|
+ boolean containsId(String id) {
|
|
111
|
+ return stack.containsId(id);
|
126
|
112
|
}
|
127
|
113
|
}
|