Automatically open roots pane if default dir is empty.

Move drawer fiddling out of DirectoryFragment into respective
    FragmentTuner instance.

Bug: 27084308
Change-Id: Ia13fc2be1442e1a7164c2d67ea6ce4bcfda68bcc
diff --git a/packages/DocumentsUI/src/com/android/documentsui/State.java b/packages/DocumentsUI/src/com/android/documentsui/State.java
index d141de6..bd90eef 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/State.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/State.java
@@ -16,10 +16,13 @@
 
 package com.android.documentsui;
 
+import static com.android.documentsui.Shared.DEBUG;
+
 import android.annotation.IntDef;
 import android.content.Intent;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.util.Log;
 import android.util.SparseArray;
 
 import com.android.documentsui.model.DocumentInfo;
@@ -35,6 +38,8 @@
 
 public class State implements android.os.Parcelable {
 
+    private static final String TAG = "State";
+
     public static final int ACTION_OPEN = 1;
     public static final int ACTION_CREATE = 2;
     public static final int ACTION_GET_CONTENT = 3;
@@ -85,6 +90,8 @@
     /** Current user navigation stack; empty implies recents. */
     public DocumentStack stack = new DocumentStack();
     private boolean mStackTouched;
+    private boolean mInitialRootChanged;
+    private boolean mInitialDocChanged;
 
     /** Currently active search, overriding any stack. */
     public String currentSearch;
@@ -108,22 +115,32 @@
     }
 
     public void onRootChanged(RootInfo root) {
+        if (DEBUG) Log.d(TAG, "Root changed to: " + root);
+        if (!mInitialRootChanged && stack.root != null && !root.equals(stack.root)) {
+            mInitialRootChanged = true;
+        }
         stack.root = root;
         stack.clear();
         mStackTouched = true;
     }
 
     public void pushDocument(DocumentInfo info) {
+        if (DEBUG) Log.d(TAG, "Adding doc to stack: " + info);
+        if (!mInitialDocChanged && stack.size() > 0 && !info.equals(stack.peek())) {
+            mInitialDocChanged = true;
+        }
         stack.push(info);
         mStackTouched = true;
     }
 
     public void popDocument() {
+        if (DEBUG) Log.d(TAG, "Popping doc off stack.");
         stack.pop();
         mStackTouched = true;
     }
 
     public void setStack(DocumentStack stack) {
+        if (DEBUG) Log.d(TAG, "Setting the whole darn stack to: " + stack);
         this.stack = stack;
         mStackTouched = true;
     }
@@ -132,6 +149,10 @@
         return mStackTouched;
     }
 
+    public boolean initialiLocationHasChanged() {
+        return mInitialRootChanged || mInitialDocChanged;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -156,6 +177,8 @@
         out.writeList(excludedAuthorities);
         out.writeInt(openableOnly ? 1 : 0);
         out.writeInt(mStackTouched ? 1 : 0);
+        out.writeInt(mInitialRootChanged ? 1 : 0);
+        out.writeInt(mInitialDocChanged ? 1 : 0);
     }
 
     public static final ClassLoaderCreator<State> CREATOR = new ClassLoaderCreator<State>() {
@@ -184,6 +207,8 @@
             in.readList(state.excludedAuthorities, loader);
             state.openableOnly = in.readInt() != 0;
             state.mStackTouched = in.readInt() != 0;
+            state.mInitialRootChanged = in.readInt() != 0;
+            state.mInitialDocChanged = in.readInt() != 0;
             return state;
         }