|  | @@ -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 |  }
 |