Skip to content

Navigation

This library uses koin as preferred DI in MVVM part

Navigation is a library for simple management for your app views (or some other logics). In this library there are several important terms:

  • Node - is a core thing. Node itself contains current config and its state
  • Chain - some sequence of nodes. In one chain only the last one node can be active

Work explanation

  • Only the last (most deep) node can be RESUMED
  • All the chains of resumed node will have status RESUMED
  • Only in the chain with status RESUMED there are RESUMED nodes
Statuses

There are 4 real statuses:

  • New - Means that Node/Chain is just created (even before constructor) or has been fully destroyed (in context of navigation)
  • Created - Means that Node/Chain is created or preparing for destroing
  • Started - Means that Node/Chain is hidden and can be resumed/stopped at any time
  • Resumed - Means that Node/Chain now active

In fact node will retrieve 6 changes of statuses:

flowchart TB New -.-> Create Create -.-> Created Created -.-> Start -.-> Started Started --> Resume --> Resumed Resumed --> Pause --> Started Started --> Stop --> Created Created --> Destroy Destroy --> New DashedLineLegendTitle(Dashed line) -.-> DashedLineLegend(Possible direction before `Created` state) SolidLineLegendTitle(Solid line) --> SolidLineLegend(Possible direction after `Created` state) class New navigation-new; class Destroyed navigation-new; class Created navigation-created; class Started navigation-started; class Resumed navigation-resumed;

Nodes behaviour

Let’s see the next sample:

flowchart LR subgraph Nodes/Chains tree NodeN1(N1) NodeN2(N2) class NodeN1 navigation-started; class NodeN2 navigation-resumed; subgraph RootChain direction LR NodeN1 --> NodeN2 end class RootChain navigation-resumed; end

we may say several things about the sample above:

  • N2 is the latest node and it is RESUMED
  • N1 PAUSED
  • RootChain is RESUMED

So, we would like to add new node in the end of stack:

flowchart LR subgraph Nodes/Chains tree NodeN1(N1) NodeN2(N2) NodeN3(N3) class NodeN1 navigation-started; class NodeN2 navigation-started; class NodeN3 navigation-resumed; subgraph RootChain direction LR NodeN1 --> NodeN2 NodeN2 --> NodeN3 end class RootChain navigation-resumed; end

As we can see, N3 became RESUMED and N2 PAUSED. Let’s try to remove N3:

flowchart LR subgraph Nodes/Chains tree NodeN1(N1) NodeN2(N2) class NodeN1 navigation-started; class NodeN2 navigation-resumed; subgraph RootChain direction LR NodeN1 --> NodeN2 end class RootChain navigation-resumed; end

Chains behaviour

So, let’s continue with the sample above. Let’s imagine, we need to add new subchain for N2 node. Whole tree will look like:

flowchart LR subgraph Nodes/Chains tree direction LR NodeN1(N1) NodeN2(N2) NodeN3(N3) class NodeN1 navigation-started; class NodeN2 navigation-resumed; class NodeN3 navigation-resumed; subgraph RootChain direction LR NodeN1 --> NodeN2 NodeN2 end NodeN2 --> N2Subchain subgraph N2Subchain direction LR NodeN3 end class RootChain navigation-resumed; class N2Subchain navigation-resumed; end

Here has been created new N2Subchain with N3 node. Both them resumed because of:

  • N2 is resumed. So, N2Subchain supposed to be resumed
  • Due to N2Subhain is resumed and N3 is the latest node, it will be resumed too

We may add new subchain to N1:

flowchart LR subgraph Nodes/Chains tree direction LR NodeN1(N1) NodeN2(N2) NodeN3(N3) NodeN4(N4) class NodeN1 navigation-started; class NodeN2 navigation-resumed; class NodeN3 navigation-resumed; class NodeN4 navigation-started; subgraph RootChain direction LR NodeN1 --> NodeN2 NodeN2 end NodeN1 --> N1Subchain NodeN2 --> N2Subchain subgraph N1Subchain direction LR NodeN4 end subgraph N2Subchain direction LR NodeN3 end class RootChain navigation-resumed; class N1Subchain navigation-started; class N2Subchain navigation-resumed; end

So, it has been added, but:

  • Due to N1 paused state, N1Subchain have inherited it
  • Due to N1Subhain is paused, all its nodes paused too

And now we may remove N2 node. This action will trigger next changes:

flowchart LR subgraph Changes subgraph OldNodesChainsTree [Old Nodes/Chains tree] direction TB OldNodeN1(N1) OldNodeN2(N2) OldNodeN3(N3) OldNodeN4(N4) class OldNodeN1 navigation-started; class OldNodeN2 navigation-created; class OldNodeN3 navigation-created; class OldNodeN4 navigation-started; subgraph OldRootChain [RootChain] direction TB OldNodeN1 --> OldNodeN2 OldNodeN2 end OldNodeN1 --> OldN1Subchain OldNodeN2 --> OldN2Subchain subgraph OldN1Subchain [N1Subchain] direction TB OldNodeN4 end subgraph OldN2Subchain [N2Subchain] direction TB OldNodeN3 end class OldRootChain navigation-resumed; class OldN1Subchain navigation-started; class OldN2Subchain navigation-created; end subgraph NewNodesChainsTree [New Nodes/Chains tree] direction TB NewNodeN1(N1) NewNodeN4(N4) class NewNodeN1 navigation-resumed; class NewNodeN4 navigation-resumed; subgraph NewRootChain [RootChain] direction TB NewNodeN1 end NewNodeN1 ---> NewN1Subchain subgraph NewN1Subchain [N1Subchain] direction TB NewNodeN4 end class NewRootChain navigation-resumed; class NewN1Subchain navigation-resumed; end %% OldNodesChainsTree -.-> NewNodesChainsTree OldNodeN1-.->|Become resumed| NewNodeN1 OldNodeN4-.->|Become resumed| NewNodeN4 end

What has happened:

  1. We solved to remove N2 node. Status is changing to stopped
  2. N2Subchain must be stopped
  3. N3 must be stopped as well

Stopping in context of navigation means destroying

Large tree sample

flowchart TB NodeN1(N1) NodeN2(N2) NodeN3(N3) class NodeN1 navigation-started; class NodeN2 navigation-started; class NodeN3 navigation-resumed; subgraph RootChain direction TB NodeN1-->NodeN2 NodeN2-->NodeN3 end class RootChain navigation-resumed; NodeN4(N4) NodeN5(N5) NodeN6(N6) class NodeN4 navigation-started; class NodeN5 navigation-started; class NodeN6 navigation-started; subgraph N2Subchain direction TB NodeN4-->NodeN5 NodeN5-->NodeN6 end class N2Subchain navigation-started; NodeN2 --> N2Subchain NodeN7(N7) NodeN8(N8) class NodeN7 navigation-started; class NodeN8 navigation-resumed; subgraph N3Subchain direction TB NodeN7 --> NodeN8 end class N3Subchain navigation-resumed; NodeN3 --> N3Subchain NodeN9(N9) NodeN10(N10) class NodeN9 navigation-started; class NodeN10 navigation-resumed; subgraph N3Subchain2 direction TB NodeN9 --> NodeN10 end class N3Subchain2 navigation-resumed; NodeN3 --> N3Subchain2