Implementing breadcrumb for tablet devices for navigation in the bar.
Bug: 29214736
Change-Id: I37de2c39a55c33d7111496e896a0c85e1c7fa553
diff --git a/src/com/android/documentsui/NavigationViewManager.java b/src/com/android/documentsui/NavigationViewManager.java
new file mode 100644
index 0000000..2554246
--- /dev/null
+++ b/src/com/android/documentsui/NavigationViewManager.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui;
+
+import static com.android.documentsui.Shared.DEBUG;
+
+import android.annotation.Nullable;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.view.View;
+
+import com.android.documentsui.dirlist.AnimationView;
+import com.android.documentsui.model.RootInfo;
+
+import java.util.function.Consumer;
+
+/**
+ * A facade over the portions of the app and drawer toolbars.
+ */
+public class NavigationViewManager {
+
+ private static final String TAG = "NavigationViewManager";
+
+ final DrawerController mDrawer;
+ final DocumentsToolbar mToolbar;
+ final State mState;
+ final NavigationViewManager.Environment mEnv;
+ final Breadcrumb mBreadcrumb;
+
+ public NavigationViewManager(
+ DrawerController drawer,
+ DocumentsToolbar toolbar,
+ State state,
+ NavigationViewManager.Environment env,
+ Breadcrumb breadcrumb) {
+
+ mToolbar = toolbar;
+ mDrawer = drawer;
+ mState = state;
+ mEnv = env;
+ mBreadcrumb = breadcrumb;
+ mBreadcrumb.setup(env, state, this::onNavigationItemSelected);
+
+ mToolbar.setNavigationOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onNavigationIconClicked();
+ }
+ });
+ }
+
+ private void onNavigationIconClicked() {
+ if (mDrawer.isPresent()) {
+ mDrawer.setOpen(true, DrawerController.OPENED_HAMBURGER);
+ }
+ }
+
+ void onNavigationItemSelected(int position) {
+ boolean changed = false;
+ while (mState.stack.size() > position + 1) {
+ changed = true;
+ mState.popDocument();
+ }
+ if (changed) {
+ mEnv.refreshCurrentRootAndDirectory(AnimationView.ANIM_LEAVE);
+ }
+ }
+
+ void update() {
+
+ // TODO: Looks to me like this block is never getting hit.
+ if (mEnv.isSearchExpanded()) {
+ mToolbar.setTitle(null);
+ mBreadcrumb.show(false);
+ return;
+ }
+
+ mDrawer.setTitle(mEnv.getDrawerTitle());
+
+ mToolbar.setNavigationIcon(getActionBarIcon());
+ mToolbar.setNavigationContentDescription(R.string.drawer_open);
+
+ if (mState.stack.size() <= 1) {
+ mBreadcrumb.show(false);
+ String title = mEnv.getCurrentRoot().title;
+ if (DEBUG) Log.d(TAG, "New toolbar title is: " + title);
+ mToolbar.setTitle(title);
+ } else {
+ mBreadcrumb.show(true);
+ mToolbar.setTitle(null);
+ mBreadcrumb.postUpdate();
+ }
+
+ if (DEBUG) Log.d(TAG, "Final toolbar title is: " + mToolbar.getTitle());
+ }
+
+ // Hamburger if drawer is present, else sad nullness.
+ private @Nullable Drawable getActionBarIcon() {
+ if (mDrawer.isPresent()) {
+ return mToolbar.getContext().getDrawable(R.drawable.ic_hamburger);
+ } else {
+ return null;
+ }
+ }
+
+ void revealRootsDrawer(boolean open) {
+ mDrawer.setOpen(open);
+ }
+
+ interface Breadcrumb {
+ void setup(Environment env, State state, Consumer<Integer> listener);
+ void show(boolean visibility);
+ void postUpdate();
+ }
+
+ interface Environment {
+ RootInfo getCurrentRoot();
+ String getDrawerTitle();
+ void refreshCurrentRootAndDirectory(int animation);
+ boolean isSearchExpanded();
+ }
+}