Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.75 KB | None | 0 0
  1. public class MainActivity extends AppCompatActivity implements FragmentInteractionCallback {
  2.  
  3. private Map<String, Stack<String>> tagStacks;
  4. private String currentTab;
  5. private ActivityMainBinding binder;
  6. private List<String> stackList;
  7. private List<String> menuStacks;
  8. private Fragment currentFragment;
  9. private Fragment homeFragment;
  10. private Fragment dashboardFragment;
  11. private Fragment notificationFragment;
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. binder = DataBindingUtil.setContentView(this, R.layout.activity_main);
  17. createStacks();
  18. }
  19.  
  20. @Override
  21. public void onFragmentInteractionCallback(Bundle bundle) {
  22. String action = bundle.getString(ACTION);
  23.  
  24. if (action != null) {
  25. switch (action) {
  26. case HomeFragment.ACTION_DASHBOARD:
  27. showFragment(bundle, DashboardFragment.newInstance(false));
  28. break;
  29. case DashboardFragment.ACTION_NOTIFICATION:
  30. showFragment(bundle, NotificationsFragment.newInstance(false));
  31. break;
  32. case NotificationsFragment.ACTION_DASHBOARD:
  33. showFragment(bundle, DashboardFragment.newInstance(false));
  34. break;
  35. }
  36. }
  37. }
  38.  
  39. @Override
  40. public void onBackPressed() {
  41. resolveBackPressed();
  42. }
  43.  
  44. private void createStacks() {
  45. binder.bottomNavigationView.inflateMenu(R.menu.bottom_nav_tabs);
  46. binder.bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
  47.  
  48. homeFragment = HomeFragment.newInstance(true);
  49. dashboardFragment = DashboardFragment.newInstance(true);
  50. notificationFragment = NotificationsFragment.newInstance(true);
  51.  
  52. tagStacks = new LinkedHashMap<>();
  53. tagStacks.put(TAB_HOME, new Stack<>());
  54. tagStacks.put(TAB_DASHBOARD, new Stack<>());
  55. tagStacks.put(TAB_NOTIFICATIONS, new Stack<>());
  56.  
  57. menuStacks = new ArrayList<>();
  58. menuStacks.add(TAB_HOME);
  59.  
  60. stackList = new ArrayList<>();
  61. stackList.add(TAB_HOME);
  62. stackList.add(TAB_DASHBOARD);
  63. stackList.add(TAB_NOTIFICATIONS);
  64.  
  65. binder.bottomNavigationView.setSelectedItemId(R.id.tab_home);
  66. binder.bottomNavigationView.setOnNavigationItemReselectedListener(onNavigationItemReselectedListener);
  67. }
  68.  
  69. private final BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener = item -> {
  70. switch (item.getItemId()) {
  71. case R.id.tab_home:
  72. selectedTab(TAB_HOME);
  73. return true;
  74. case R.id.tab_dashboard:
  75. selectedTab(TAB_DASHBOARD);
  76. return true;
  77. case R.id.tab_notifications:
  78. selectedTab(TAB_NOTIFICATIONS);
  79. return true;
  80. }
  81. return false;
  82. };
  83.  
  84. private final BottomNavigationView.OnNavigationItemReselectedListener onNavigationItemReselectedListener = menuItem -> {
  85. switch (menuItem.getItemId()) {
  86. case R.id.tab_home:
  87. popStackExceptFirst();
  88. break;
  89. case R.id.tab_dashboard:
  90. popStackExceptFirst();
  91. break;
  92. case R.id.tab_notifications:
  93. popStackExceptFirst();
  94. break;
  95. }
  96. };
  97.  
  98. private void selectedTab(String tabId) {
  99. currentTab = tabId;
  100. BaseFragment.setCurrentTab(currentTab);
  101.  
  102. if (tagStacks.get(tabId).size() == 0) {
  103. /*
  104. First time this tab is selected. So add first fragment of that tab.
  105. We are adding a new fragment which is not present in stack. So add to stack is true.
  106. */
  107. switch (tabId) {
  108. case TAB_HOME:
  109. addInitialTabFragment(getSupportFragmentManager(), tagStacks, TAB_HOME, homeFragment, R.id.frame_layout, true);
  110. resolveStackLists(tabId);
  111. assignCurrentFragment(homeFragment);
  112. break;
  113. case TAB_DASHBOARD:
  114. addAdditionalTabFragment(getSupportFragmentManager(), tagStacks, TAB_DASHBOARD, dashboardFragment, currentFragment, R.id.frame_layout, true);
  115. resolveStackLists(tabId);
  116. assignCurrentFragment(dashboardFragment);
  117. break;
  118. case TAB_NOTIFICATIONS:
  119. addAdditionalTabFragment(getSupportFragmentManager(), tagStacks, TAB_NOTIFICATIONS, notificationFragment, currentFragment, R.id.frame_layout, true);
  120. resolveStackLists(tabId);
  121. assignCurrentFragment(notificationFragment);
  122. break;
  123. }
  124. } else {
  125. /*
  126. * We are switching tabs, and target tab already has at least one fragment.
  127. * Show the target fragment
  128. */
  129. Fragment targetFragment = getSupportFragmentManager().findFragmentByTag(tagStacks.get(tabId).lastElement());
  130. showHideTabFragment(getSupportFragmentManager(), targetFragment, currentFragment);
  131. resolveStackLists(tabId);
  132. assignCurrentFragment(targetFragment);
  133. }
  134. }
  135.  
  136. private void popFragment() {
  137. /*
  138. * Select the second last fragment in current tab's stack,
  139. * which will be shown after the fragment transaction given below
  140. */
  141. String fragmentTag = tagStacks.get(currentTab).elementAt(tagStacks.get(currentTab).size() - 2);
  142. Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
  143.  
  144. /*pop current fragment from stack */
  145. tagStacks.get(currentTab).pop();
  146.  
  147. removeFragment(getSupportFragmentManager(), fragment, currentFragment);
  148.  
  149. assignCurrentFragment(fragment);
  150. }
  151.  
  152. private void resolveBackPressed() {
  153. int stackValue = 0;
  154. if (tagStacks.get(currentTab).size() == 1) {
  155. Stack<String> value = tagStacks.get(stackList.get(1));
  156. if (value.size() > 1) {
  157. stackValue = value.size();
  158. popAndNavigateToPreviousMenu();
  159. }
  160. if (stackValue <= 1) {
  161. if (menuStacks.size() > 1) {
  162. navigateToPreviousMenu();
  163. } else {
  164. finish();
  165. }
  166. }
  167. } else {
  168. popFragment();
  169. }
  170. }
  171.  
  172. /*Pops the last fragment inside particular tab and goes to the second tab in the stack*/
  173. private void popAndNavigateToPreviousMenu() {
  174. String tempCurrent = stackList.get(0);
  175. currentTab = stackList.get(1);
  176. BaseFragment.setCurrentTab(currentTab);
  177. binder.bottomNavigationView.setSelectedItemId(resolveTabPositions(currentTab));
  178. Fragment targetFragment = getSupportFragmentManager().findFragmentByTag(tagStacks.get(currentTab).lastElement());
  179. showHideTabFragment(getSupportFragmentManager(), targetFragment, currentFragment);
  180. assignCurrentFragment(targetFragment);
  181. updateStackToIndexFirst(stackList, tempCurrent);
  182. menuStacks.remove(0);
  183. }
  184.  
  185. private void navigateToPreviousMenu() {
  186. menuStacks.remove(0);
  187. currentTab = menuStacks.get(0);
  188. BaseFragment.setCurrentTab(currentTab);
  189. binder.bottomNavigationView.setSelectedItemId(resolveTabPositions(currentTab));
  190. Fragment targetFragment = getSupportFragmentManager().findFragmentByTag(tagStacks.get(currentTab).lastElement());
  191. showHideTabFragment(getSupportFragmentManager(), targetFragment, currentFragment);
  192. assignCurrentFragment(targetFragment);
  193. }
  194.  
  195. private void popStackExceptFirst() {
  196. if (tagStacks.get(currentTab).size() == 1) {
  197. return;
  198. }
  199. while (!tagStacks.get(currentTab).empty()
  200. && !getSupportFragmentManager().findFragmentByTag(tagStacks.get(currentTab).peek()).getArguments().getBoolean(EXTRA_IS_ROOT_FRAGMENT)) {
  201. getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentByTag(tagStacks.get(currentTab).peek()));
  202. tagStacks.get(currentTab).pop();
  203. }
  204. Fragment fragment = getSupportFragmentManager().findFragmentByTag(tagStacks.get(currentTab).elementAt(0));
  205. removeFragment(getSupportFragmentManager(), fragment, currentFragment);
  206. assignCurrentFragment(fragment);
  207. }
  208.  
  209. /*
  210. * Add a fragment to the stack of a particular tab
  211. */
  212. private void showFragment(Bundle bundle, Fragment fragmentToAdd) {
  213. String tab = bundle.getString(DATA_KEY_1);
  214. boolean shouldAdd = bundle.getBoolean(DATA_KEY_2);
  215. addShowHideFragment(getSupportFragmentManager(), tagStacks, tab, fragmentToAdd, getCurrentFragmentFromShownStack(), R.id.frame_layout, shouldAdd);
  216. assignCurrentFragment(fragmentToAdd);
  217. }
  218.  
  219. private int resolveTabPositions(String currentTab) {
  220. int tabIndex = 0;
  221. switch (currentTab) {
  222. case TAB_HOME:
  223. tabIndex = R.id.tab_home;
  224. break;
  225. case TAB_DASHBOARD:
  226. tabIndex = R.id.tab_dashboard;
  227. break;
  228. case TAB_NOTIFICATIONS:
  229. tabIndex = R.id.tab_notifications;
  230. break;
  231. }
  232. return tabIndex;
  233. }
  234.  
  235. private void resolveStackLists(String tabId) {
  236. updateStackIndex(stackList, tabId);
  237. updateTabStackIndex(menuStacks, tabId);
  238. }
  239.  
  240. private Fragment getCurrentFragmentFromShownStack() {
  241. return getSupportFragmentManager().findFragmentByTag(tagStacks.get(currentTab).elementAt(tagStacks.get(currentTab).size() - 1));
  242. }
  243.  
  244. private void assignCurrentFragment(Fragment current) {
  245. currentFragment = current;
  246. }
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement