Move Activity classes to own packages.

FilesActivity > manager/ManageActivity
DocumentsActivity > picker/PickActivity

Change-Id: If2efb07fbebbd6ef84aa744af17c8cbeac05d770
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 206f9fc..cdad8d4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -15,7 +15,7 @@
         android:supportsRtl="true">
 
         <activity
-            android:name=".DocumentsActivity"
+            android:name=".picker.PickActivity"
             android:theme="@style/DocumentsTheme"
             android:icon="@drawable/picker_icon">
             <intent-filter>
@@ -43,18 +43,26 @@
         </activity>
 
         <activity
-            android:name=".LauncherActivity"
+            android:name=".manager.LauncherActivity"
             android:label="@string/downloads_label"
             android:icon="@drawable/files_icon"
             android:theme="@android:style/Theme.NoDisplay">
+        </activity>
+
+        <!--  Preserve original launcher activity from Nougat. -->
+        <activity-alias
+            android:name=".Launcher"
+            android:targetActivity=".manager.LauncherActivity"
+            android:label="@string/downloads_label"
+            android:icon="@drawable/files_icon" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-        </activity>
+        </activity-alias>
 
         <activity
-            android:name=".FilesActivity"
+            android:name=".manager.ManageActivity"
             android:label="@string/downloads_label"
             android:icon="@drawable/files_icon"
             android:documentLaunchMode="intoExisting"
diff --git a/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java b/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java
index ce2fc13..d39b49c 100644
--- a/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java
+++ b/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java
@@ -27,7 +27,6 @@
 import android.support.test.uiautomator.UiDevice;
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java b/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java
index bf056f1..a4a4a86 100644
--- a/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java
+++ b/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java
@@ -30,6 +30,7 @@
 
 import com.android.documentsui.model.RootInfo;
 import com.android.documentsui.EventListener;
+import com.android.documentsui.manager.ManageActivity;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -38,7 +39,7 @@
 import java.util.concurrent.CountDownLatch;
 
 @LargeTest
-public class FilesActivityPerfTest extends ActivityTest<FilesActivity> {
+public class FilesActivityPerfTest extends ActivityTest<ManageActivity> {
 
     // Constants starting with KEY_ are used to report metrics to APCT.
     private static final String KEY_FILES_LISTED_PERFORMANCE_FIRST =
@@ -53,7 +54,7 @@
     private static final int NUM_MEASUREMENTS = 10;
 
     public FilesActivityPerfTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java b/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java
index 9925d5b..84d23f7 100644
--- a/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java
+++ b/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java
@@ -33,8 +33,8 @@
 import android.support.test.uiautomator.UiScrollable;
 import android.util.Log;
 
-import com.android.documentsui.FilesActivity;
 import com.android.documentsui.bots.RootsListBot;
+import com.android.documentsui.manager.ManageActivity;
 import com.android.documentsui.bots.DirectoryListBot;
 
 @LargeTest
@@ -53,7 +53,7 @@
         mRootsListBot = new RootsListBot(device, context, BOT_TIMEOUT);
         mDirListBot = new DirectoryListBot(device, context, BOT_TIMEOUT);
 
-        final Intent intent = new Intent(context, FilesActivity.class);
+        final Intent intent = new Intent(context, ManageActivity.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mActivity = getInstrumentation().startActivitySync(intent);
         try {
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index 7ae2e51..2970eb1 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -104,14 +104,16 @@
 
     private static final String BENCHMARK_TESTING_PACKAGE = "com.android.documentsui.appperftests";
 
-    State mState;
-    @Nullable RetainedState mRetainedState;
-    RootsCache mRoots;
-    SearchViewManager mSearchManager;
-    DrawerController mDrawer;
-    NavigationViewManager mNavigator;
+    protected SearchViewManager mSearchManager;
+    // TODO: Unpublic this by injecting it into LoadLastAccessedStackTask
+    public State mState;
+
+    protected @Nullable RetainedState mRetainedState;
+    protected RootsCache mRoots;
+    protected DrawerController mDrawer;
+    protected NavigationViewManager mNavigator;
     List<EventListener> mEventListeners = new ArrayList<>();
-    SortController mSortController;
+    protected SortController mSortController;
 
     private final String mTag;
     private final ContentObserver mRootsCacheObserver = new ContentObserver(new Handler()) {
@@ -134,11 +136,11 @@
     public abstract MenuManager getMenuManager();
     public abstract DirectoryDetails getDirectoryDetails();
 
-    abstract void onTaskFinished(Uri... uris);
-    abstract void refreshDirectory(int anim);
+    protected abstract void onTaskFinished(Uri... uris);
+    protected abstract void refreshDirectory(int anim);
     /** Allows sub-classes to include information in a newly created State instance. */
-    abstract void includeState(State initialState);
-    abstract void onDirectoryCreated(DocumentInfo doc);
+    protected abstract void includeState(State initialState);
+    protected abstract void onDirectoryCreated(DocumentInfo doc);
 
     public BaseActivity(@LayoutRes int layoutId, String tag) {
         mLayoutId = layoutId;
@@ -321,11 +323,11 @@
         }
     }
 
-    final @Nullable DirectoryFragment getDirectoryFragment() {
+    protected final @Nullable DirectoryFragment getDirectoryFragment() {
         return DirectoryFragment.get(getFragmentManager());
     }
 
-    void showCreateDirectoryDialog() {
+    protected void showCreateDirectoryDialog() {
         Metrics.logUserAction(this, Metrics.USER_ACTION_CREATE_DIR);
 
         CreateDirectoryFragment.show(getFragmentManager());
@@ -335,7 +337,7 @@
      * Returns true if a directory can be created in the current location.
      * @return
      */
-    boolean canCreateDirectory() {
+    protected boolean canCreateDirectory() {
         final RootInfo root = getCurrentRoot();
         final DocumentInfo cwd = getCurrentDirectory();
         return cwd != null
@@ -345,7 +347,7 @@
                 && !root.isDownloads();
     }
 
-    void openContainerDocument(DocumentInfo doc) {
+    protected void openContainerDocument(DocumentInfo doc) {
         assert(doc.isContainer());
 
         notifyDirectoryNavigated(doc.derivedUri);
@@ -379,7 +381,7 @@
         invalidateOptionsMenu();
     }
 
-    final void loadRoot(final Uri uri) {
+    protected final void loadRoot(final Uri uri) {
         new LoadRootTask(this, uri).executeOnExecutor(
                 ProviderExecutor.forAuthority(uri.getAuthority()));
     }
@@ -417,7 +419,7 @@
         DirectoryFragment.reloadSearch(fm, root, cwd, query);
     }
 
-    final List<String> getExcludedAuthorities() {
+    private final List<String> getExcludedAuthorities() {
         List<String> authorities = new ArrayList<>();
         if (getIntent().getBooleanExtra(DocumentsContract.EXTRA_EXCLUDE_SELF, false)) {
             // Exclude roots provided by the calling package.
@@ -440,7 +442,7 @@
         return (root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0;
     }
 
-    final String getCallingPackageMaybeExtra() {
+    public final String getCallingPackageMaybeExtra() {
         String callingPackage = getCallingPackage();
         // System apps can set the calling package name using an extra.
         try {
@@ -514,10 +516,7 @@
     }
 
     public void setPending(boolean pending) {
-        final SaveFragment save = SaveFragment.get(getFragmentManager());
-        if (save != null) {
-            save.setPending(pending);
-        }
+        // TODO: Isolate this behavior to PickActivity.
     }
 
     @Override
@@ -601,7 +600,7 @@
         super.onBackPressed();
     }
 
-    boolean onBeforePopDir() {
+    protected boolean onBeforePopDir() {
         // Files app overrides this with some fancy logic.
         return false;
     }
diff --git a/src/com/android/documentsui/CheckedTask.java b/src/com/android/documentsui/CheckedTask.java
index 747eb9c..242a279 100644
--- a/src/com/android/documentsui/CheckedTask.java
+++ b/src/com/android/documentsui/CheckedTask.java
@@ -41,13 +41,13 @@
     }
 
     /** Called prior to run being executed. Analogous to {@link AsyncTask#onPreExecute} */
-    void prepare() {}
+    protected void prepare() {}
 
     /** Analogous to {@link AsyncTask#doInBackground} */
-    abstract Output run(Input... input);
+    protected abstract Output run(Input... input);
 
     /** Analogous to {@link AsyncTask#onPostExecute} */
-    abstract void finish(Output output);
+    protected abstract void finish(Output output);
 
     @Override
     final protected void onPreExecute() {
diff --git a/src/com/android/documentsui/DocumentsMenuManager.java b/src/com/android/documentsui/DocumentsMenuManager.java
index e9d502e..035268e 100644
--- a/src/com/android/documentsui/DocumentsMenuManager.java
+++ b/src/com/android/documentsui/DocumentsMenuManager.java
@@ -25,7 +25,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 
-final class DocumentsMenuManager extends MenuManager {
+public final class DocumentsMenuManager extends MenuManager {
 
     private boolean mPicking;
 
diff --git a/src/com/android/documentsui/DrawerController.java b/src/com/android/documentsui/DrawerController.java
index 97d459b..eca3f0a 100644
--- a/src/com/android/documentsui/DrawerController.java
+++ b/src/com/android/documentsui/DrawerController.java
@@ -36,7 +36,7 @@
  *
  * @see DrawerController#create(DrawerLayout)
  */
-abstract class DrawerController implements DrawerListener {
+public abstract class DrawerController implements DrawerListener {
     public static final String TAG = "DrawerController";
 
     // Drawer opening triggered by tapping the navigation icon
@@ -54,11 +54,12 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface Trigger {}
 
+    public abstract void update();
     /**
      * Toggles the drawer and sets the OPENED_OTHER as the action that causes opening the drawer.
      * @param open
      */
-    abstract void setOpen(boolean open);
+    public abstract void setOpen(boolean open);
 
     /**
      * Toggles the drawer.
@@ -66,10 +67,9 @@
      * @param trigger Indicates what action caused opening the drawer. It is ignored for closing.
      */
     abstract void setOpen(boolean open, @Trigger int trigger);
-    abstract boolean isPresent();
-    abstract boolean isOpen();
+    public abstract boolean isPresent();
+    public abstract boolean isOpen();
     abstract void setTitle(String title);
-    abstract void update();
 
     /**
      * Returns a controller suitable for {@code Layout}.
@@ -166,7 +166,7 @@
         }
 
         @Override
-        void setOpen(boolean open) {
+        public void setOpen(boolean open) {
             setOpen(open, OPENED_OTHER);
         }
 
@@ -181,12 +181,12 @@
         }
 
         @Override
-        boolean isOpen() {
+        public boolean isOpen() {
             return mLayout.isDrawerOpen(mDrawer);
         }
 
         @Override
-        boolean isPresent() {
+        public boolean isPresent() {
             return true;
         }
 
@@ -196,7 +196,7 @@
         }
 
         @Override
-        void update() {
+        public void update() {
             mToggle.syncState();
         }
 
@@ -232,18 +232,18 @@
     private static final class DummyDrawerController extends DrawerController {
 
         @Override
-        void setOpen(boolean open) {}
+        public void setOpen(boolean open) {}
 
         @Override
-        void setOpen(boolean open, @Trigger int trigger) {}
+        public void setOpen(boolean open, @Trigger int trigger) {}
 
         @Override
-        boolean isOpen() {
+        public boolean isOpen() {
             return false;
         }
 
         @Override
-        boolean isPresent() {
+        public boolean isPresent() {
             return false;
         }
 
@@ -251,7 +251,7 @@
         void setTitle(String title) {}
 
         @Override
-        void update() {}
+        public void update() {}
 
         @Override
         public void onDrawerSlide(View drawerView, float slideOffset) {}
diff --git a/src/com/android/documentsui/FilesMenuManager.java b/src/com/android/documentsui/FilesMenuManager.java
index f5ccbd5..94ea4f9 100644
--- a/src/com/android/documentsui/FilesMenuManager.java
+++ b/src/com/android/documentsui/FilesMenuManager.java
@@ -21,7 +21,7 @@
 
 import com.android.documentsui.model.RootInfo;
 
-final class FilesMenuManager extends MenuManager {
+public final class FilesMenuManager extends MenuManager {
 
     public FilesMenuManager(SearchViewManager searchManager, State displayState) {
         super(searchManager, displayState);
diff --git a/src/com/android/documentsui/Metrics.java b/src/com/android/documentsui/Metrics.java
index 3c45a93..22d7f34 100644
--- a/src/com/android/documentsui/Metrics.java
+++ b/src/com/android/documentsui/Metrics.java
@@ -31,6 +31,7 @@
 import android.util.Log;
 
 import com.android.documentsui.State.ActionType;
+import com.android.documentsui.manager.LauncherActivity;
 import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.RootInfo;
 import com.android.documentsui.services.FileOperationService;
diff --git a/src/com/android/documentsui/NavigationViewManager.java b/src/com/android/documentsui/NavigationViewManager.java
index 8c0972b..1479ed4 100644
--- a/src/com/android/documentsui/NavigationViewManager.java
+++ b/src/com/android/documentsui/NavigationViewManager.java
@@ -81,7 +81,7 @@
         }
     }
 
-    void update() {
+    public void update() {
 
         // TODO: Looks to me like this block is never getting hit.
         if (mEnv.isSearchExpanded()) {
diff --git a/src/com/android/documentsui/PairedTask.java b/src/com/android/documentsui/PairedTask.java
index 7d2da0b..fe0e0f8 100644
--- a/src/com/android/documentsui/PairedTask.java
+++ b/src/com/android/documentsui/PairedTask.java
@@ -17,7 +17,6 @@
 package com.android.documentsui;
 
 import android.app.Activity;
-import android.os.AsyncTask;
 
 /**
  * An {@link CheckedTask} that guards work with checks that a paired {@link Activity}
@@ -27,7 +26,7 @@
  * @template Input input type
  * @template Output output type
  */
-abstract class PairedTask<Owner extends Activity, Input, Output>
+public abstract class PairedTask<Owner extends Activity, Input, Output>
         extends CheckedTask<Input, Output> {
 
     protected final Owner mOwner;
diff --git a/src/com/android/documentsui/PickFragment.java b/src/com/android/documentsui/PickFragment.java
index 933506c..e7ce944 100644
--- a/src/com/android/documentsui/PickFragment.java
+++ b/src/com/android/documentsui/PickFragment.java
@@ -31,6 +31,7 @@
 import android.widget.Button;
 
 import com.android.documentsui.model.DocumentInfo;
+import com.android.documentsui.picker.PickActivity;
 import com.android.documentsui.services.FileOperationService.OpType;
 
 /**
@@ -81,7 +82,7 @@
     private View.OnClickListener mPickListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
-            final DocumentsActivity activity = DocumentsActivity.get(PickFragment.this);
+            final PickActivity activity = PickActivity.get(PickFragment.this);
             activity.onPickRequested(mPickTarget);
         }
     };
diff --git a/src/com/android/documentsui/RootsFragment.java b/src/com/android/documentsui/RootsFragment.java
index 335ae4c..e4d44f2 100644
--- a/src/com/android/documentsui/RootsFragment.java
+++ b/src/com/android/documentsui/RootsFragment.java
@@ -63,6 +63,7 @@
 import com.android.documentsui.clipping.DocumentClipper;
 import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.RootInfo;
+import com.android.documentsui.picker.PickActivity;
 import com.android.documentsui.services.FileOperations;
 
 import java.util.ArrayList;
@@ -549,7 +550,7 @@
 
         @Override
         void open(RootsFragment fragment) {
-            DocumentsActivity activity = DocumentsActivity.get(fragment);
+            PickActivity activity = PickActivity.get(fragment);
             Metrics.logAppVisited(fragment.getActivity(), info);
             activity.onAppPicked(info);
         }
diff --git a/src/com/android/documentsui/SearchViewManager.java b/src/com/android/documentsui/SearchViewManager.java
index de2d155..63c07dd 100644
--- a/src/com/android/documentsui/SearchViewManager.java
+++ b/src/com/android/documentsui/SearchViewManager.java
@@ -295,12 +295,11 @@
         return mCurrentSearch;
     }
 
-    boolean isSearching() {
+    public boolean isSearching() {
         return mCurrentSearch != null;
     }
 
     boolean isExpanded() {
         return mSearchExpanded;
     }
-
 }
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index fe07958..29b605d 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -67,7 +67,6 @@
 import com.android.documentsui.BaseActivity;
 import com.android.documentsui.DirectoryLoader;
 import com.android.documentsui.DirectoryResult;
-import com.android.documentsui.DocumentsActivity;
 import com.android.documentsui.DocumentsApplication;
 import com.android.documentsui.Events.InputEvent;
 import com.android.documentsui.Events.MotionInputEvent;
@@ -89,6 +88,7 @@
 import com.android.documentsui.dirlist.MultiSelectManager.Selection;
 import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.RootInfo;
+import com.android.documentsui.picker.PickActivity;
 import com.android.documentsui.services.FileOperation;
 import com.android.documentsui.services.FileOperationService;
 import com.android.documentsui.services.FileOperationService.OpType;
@@ -862,7 +862,7 @@
                 Shared.ACTION_PICK_COPY_DESTINATION,
                 Uri.EMPTY,
                 getActivity(),
-                DocumentsActivity.class);
+                PickActivity.class);
 
         UrisSupplier srcs;
         try {
diff --git a/src/com/android/documentsui/LauncherActivity.java b/src/com/android/documentsui/manager/LauncherActivity.java
similarity index 95%
rename from src/com/android/documentsui/LauncherActivity.java
rename to src/com/android/documentsui/manager/LauncherActivity.java
index 5d7e8cd..165bb14 100644
--- a/src/com/android/documentsui/LauncherActivity.java
+++ b/src/com/android/documentsui/manager/LauncherActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.manager;
 
 import static com.android.documentsui.Shared.DEBUG;
 
@@ -29,6 +29,8 @@
 import android.support.annotation.Nullable;
 import android.util.Log;
 
+import com.android.documentsui.Shared;
+
 import java.util.List;
 
 /**
@@ -97,7 +99,7 @@
     }
 
     static final Intent createLaunchIntent(Activity activity) {
-        Intent intent = new Intent(activity, FilesActivity.class);
+        Intent intent = new Intent(activity, ManageActivity.class);
         intent.setData(buildLaunchUri());
 
         // Relay any config overrides bits present in the original intent.
@@ -128,7 +130,7 @@
                 .build();
     }
 
-    static boolean isLaunchUri(@Nullable Uri uri) {
+    public static boolean isLaunchUri(@Nullable Uri uri) {
         boolean result = uri != null && LAUNCH_CONTROL_AUTHORITY.equals(uri.getAuthority());
         return result;
     }
diff --git a/src/com/android/documentsui/FilesActivity.java b/src/com/android/documentsui/manager/ManageActivity.java
similarity index 94%
rename from src/com/android/documentsui/FilesActivity.java
rename to src/com/android/documentsui/manager/ManageActivity.java
index 1d60387..2cde713 100644
--- a/src/com/android/documentsui/FilesActivity.java
+++ b/src/com/android/documentsui/manager/ManageActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.manager;
 
 import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_UNKNOWN;
 import static com.android.documentsui.Shared.DEBUG;
@@ -34,8 +34,22 @@
 import android.view.Menu;
 import android.view.MenuItem;
 
+import com.android.documentsui.BaseActivity;
+import com.android.documentsui.DocumentsApplication;
+import com.android.documentsui.FilesMenuManager;
+import com.android.documentsui.MenuManager;
 import com.android.documentsui.MenuManager.DirectoryDetails;
+import com.android.documentsui.Metrics;
+import com.android.documentsui.OperationDialogFragment;
 import com.android.documentsui.OperationDialogFragment.DialogType;
+import com.android.documentsui.PairedTask;
+import com.android.documentsui.ProviderExecutor;
+import com.android.documentsui.R;
+import com.android.documentsui.RootsCache;
+import com.android.documentsui.RootsFragment;
+import com.android.documentsui.Shared;
+import com.android.documentsui.Snackbars;
+import com.android.documentsui.State;
 import com.android.documentsui.clipping.DocumentClipper;
 import com.android.documentsui.dirlist.AnimationView;
 import com.android.documentsui.dirlist.DirectoryFragment;
@@ -56,7 +70,7 @@
 /**
  * Standalone file management activity.
  */
-public class FilesActivity extends BaseActivity {
+public class ManageActivity extends BaseActivity {
 
     public static final String TAG = "FilesActivity";
 
@@ -70,7 +84,7 @@
     private FilesMenuManager mMenuManager;
     private DirectoryDetails mDetails;
 
-    public FilesActivity() {
+    public ManageActivity() {
         super(R.layout.files_activity, TAG);
     }
 
@@ -150,7 +164,7 @@
     }
 
     @Override
-    void includeState(State state) {
+    public void includeState(State state) {
         final Intent intent = getIntent();
 
         state.action = State.ACTION_BROWSE;
@@ -261,7 +275,7 @@
     }
 
     @Override
-    void refreshDirectory(int anim) {
+    public void refreshDirectory(int anim) {
         final FragmentManager fm = getFragmentManager();
         final RootInfo root = getCurrentRoot();
         final DocumentInfo cwd = getCurrentDirectory();
@@ -320,7 +334,7 @@
     }
 
     @Override
-    void onDirectoryCreated(DocumentInfo doc) {
+    public void onDirectoryCreated(DocumentInfo doc) {
         assert(doc.isDirectory());
         getDirectoryFragment().getFocusManager().onDirectoryCreated(doc.documentId);
     }
@@ -416,7 +430,7 @@
     // do it if user already hit back recently and we recently
     // did some fiddling.
     @Override
-    boolean onBeforePopDir() {
+    protected boolean onBeforePopDir() {
         int size = mState.stack.size();
 
         if (mDrawer.isPresent()
@@ -446,7 +460,7 @@
     }
 
     @Override
-    void onTaskFinished(Uri... uris) {
+    public void onTaskFinished(Uri... uris) {
         if (DEBUG) Log.d(TAG, "onFinished() " + Arrays.toString(uris));
 
         final Intent intent = new Intent();
@@ -489,10 +503,10 @@
      * to know which root to select. Also, the stack doesn't contain intermediate directories.
      * It's primarly used for opening ZIP archives from Downloads app.
      */
-    private static final class OpenUriForViewTask extends PairedTask<FilesActivity, Uri, Void> {
+    private static final class OpenUriForViewTask extends PairedTask<ManageActivity, Uri, Void> {
 
         private final State mState;
-        public OpenUriForViewTask(FilesActivity activity) {
+        public OpenUriForViewTask(ManageActivity activity) {
             super(activity);
             mState = activity.mState;
         }
diff --git a/src/com/android/documentsui/QuickViewIntentBuilder.java b/src/com/android/documentsui/manager/QuickViewIntentBuilder.java
similarity index 98%
rename from src/com/android/documentsui/QuickViewIntentBuilder.java
rename to src/com/android/documentsui/manager/QuickViewIntentBuilder.java
index b8d2247..a74e709 100644
--- a/src/com/android/documentsui/QuickViewIntentBuilder.java
+++ b/src/com/android/documentsui/manager/QuickViewIntentBuilder.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.manager;
 
 import static com.android.documentsui.Shared.DEBUG;
 import static com.android.documentsui.Shared.MAX_DOCS_IN_INTENT;
@@ -35,6 +35,8 @@
 import android.util.Log;
 import android.util.Range;
 
+import com.android.documentsui.R;
+import com.android.documentsui.RootCursorWrapper;
 import com.android.documentsui.dirlist.Model;
 import com.android.documentsui.model.DocumentInfo;
 
diff --git a/src/com/android/documentsui/LoadLastAccessedStackTask.java b/src/com/android/documentsui/picker/LoadLastAccessedStackTask.java
similarity index 89%
rename from src/com/android/documentsui/LoadLastAccessedStackTask.java
rename to src/com/android/documentsui/picker/LoadLastAccessedStackTask.java
index 78e79c7..0d2ea31 100644
--- a/src/com/android/documentsui/LoadLastAccessedStackTask.java
+++ b/src/com/android/documentsui/picker/LoadLastAccessedStackTask.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.picker;
 
 import static com.android.documentsui.Shared.DEBUG;
 
@@ -22,7 +22,12 @@
 import android.net.Uri;
 import android.util.Log;
 
+import com.android.documentsui.DocumentsApplication;
+import com.android.documentsui.LastAccessedProvider;
 import com.android.documentsui.LastAccessedProvider.Columns;
+import com.android.documentsui.PairedTask;
+import com.android.documentsui.RootsCache;
+import com.android.documentsui.State;
 import com.android.documentsui.dirlist.AnimationView;
 import com.android.documentsui.model.DurableUtils;
 import com.android.documentsui.model.RootInfo;
@@ -40,14 +45,14 @@
  * for an app like DropBox.
  */
 final class LoadLastAccessedStackTask
-        extends PairedTask<DocumentsActivity, Void, Void> {
+        extends PairedTask<PickActivity, Void, Void> {
 
     private static final String TAG = "LoadLastAccessedStackTask";
     private volatile boolean mRestoredStack;
     private volatile boolean mExternal;
     private State mState;
 
-    public LoadLastAccessedStackTask(DocumentsActivity activity) {
+    public LoadLastAccessedStackTask(PickActivity activity) {
         super(activity);
         mState = activity.mState;
     }
diff --git a/src/com/android/documentsui/DocumentsActivity.java b/src/com/android/documentsui/picker/PickActivity.java
similarity index 91%
rename from src/com/android/documentsui/DocumentsActivity.java
rename to src/com/android/documentsui/picker/PickActivity.java
index 555fbde..810920d 100644
--- a/src/com/android/documentsui/DocumentsActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.picker;
 
 import static com.android.documentsui.Shared.DEBUG;
 import static com.android.documentsui.State.ACTION_CREATE;
@@ -41,8 +41,21 @@
 import android.util.Log;
 import android.view.Menu;
 
-import com.android.documentsui.MenuManager.DirectoryDetails;
+import com.android.documentsui.BaseActivity;
+import com.android.documentsui.DocumentsApplication;
+import com.android.documentsui.DocumentsMenuManager;
+import com.android.documentsui.LastAccessedProvider;
 import com.android.documentsui.LastAccessedProvider.Columns;
+import com.android.documentsui.MenuManager;
+import com.android.documentsui.MenuManager.DirectoryDetails;
+import com.android.documentsui.MimePredicate;
+import com.android.documentsui.PairedTask;
+import com.android.documentsui.PickFragment;
+import com.android.documentsui.R;
+import com.android.documentsui.RootsFragment;
+import com.android.documentsui.Shared;
+import com.android.documentsui.Snackbars;
+import com.android.documentsui.State;
 import com.android.documentsui.dirlist.DirectoryFragment;
 import com.android.documentsui.dirlist.FragmentTuner;
 import com.android.documentsui.dirlist.FragmentTuner.DocumentsTuner;
@@ -54,13 +67,13 @@
 import java.util.Arrays;
 import java.util.List;
 
-public class DocumentsActivity extends BaseActivity {
+public class PickActivity extends BaseActivity {
     private static final int CODE_FORWARD = 42;
     private static final String TAG = "DocumentsActivity";
     private DocumentsMenuManager mMenuManager;
     private DirectoryDetails mDetails;
 
-    public DocumentsActivity() {
+    public PickActivity() {
         super(R.layout.documents_activity, TAG);
     }
 
@@ -114,7 +127,7 @@
     }
 
     @Override
-    void includeState(State state) {
+    protected void includeState(State state) {
         final Intent intent = getIntent();
         final String action = intent.getAction();
         if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
@@ -224,7 +237,7 @@
     }
 
     @Override
-    void refreshDirectory(int anim) {
+    protected void refreshDirectory(int anim) {
         final FragmentManager fm = getFragmentManager();
         final RootInfo root = getCurrentRoot();
         final DocumentInfo cwd = getCurrentDirectory();
@@ -273,7 +286,15 @@
     }
 
     @Override
-    void onDirectoryCreated(DocumentInfo doc) {
+    public void setPending(boolean pending) {
+        final SaveFragment save = SaveFragment.get(getFragmentManager());
+        if (save != null) {
+            save.setPending(pending);
+        }
+    }
+
+    @Override
+    protected void onDirectoryCreated(DocumentInfo doc) {
         assert(doc.isDirectory());
         openContainerDocument(doc);
     }
@@ -331,7 +352,7 @@
     }
 
     @Override
-    void onTaskFinished(Uri... uris) {
+    protected void onTaskFinished(Uri... uris) {
         if (DEBUG) Log.d(TAG, "onFinished() " + Arrays.toString(uris));
 
         final Intent intent = new Intent();
@@ -369,8 +390,8 @@
     }
 
 
-    public static DocumentsActivity get(Fragment fragment) {
-        return (DocumentsActivity) fragment.getActivity();
+    public static PickActivity get(Fragment fragment) {
+        return (PickActivity) fragment.getActivity();
     }
 
     @Override
@@ -390,10 +411,10 @@
         return mDetails;
     }
 
-    private static final class PickFinishTask extends PairedTask<DocumentsActivity, Void, Void> {
+    private static final class PickFinishTask extends PairedTask<PickActivity, Void, Void> {
         private final Uri mUri;
 
-        public PickFinishTask(DocumentsActivity activity, Uri uri) {
+        public PickFinishTask(PickActivity activity, Uri uri) {
             super(activity);
             mUri = uri;
         }
@@ -410,10 +431,10 @@
         }
     }
 
-    private static final class ExistingFinishTask extends PairedTask<DocumentsActivity, Void, Void> {
+    private static final class ExistingFinishTask extends PairedTask<PickActivity, Void, Void> {
         private final Uri[] mUris;
 
-        public ExistingFinishTask(DocumentsActivity activity, Uri... uris) {
+        public ExistingFinishTask(PickActivity activity, Uri... uris) {
             super(activity);
             mUris = uris;
         }
@@ -433,11 +454,11 @@
     /**
      * Task that creates a new document in the background.
      */
-    private static final class CreateFinishTask extends PairedTask<DocumentsActivity, Void, Uri> {
+    private static final class CreateFinishTask extends PairedTask<PickActivity, Void, Uri> {
         private final String mMimeType;
         private final String mDisplayName;
 
-        public CreateFinishTask(DocumentsActivity activity, String mimeType, String displayName) {
+        public CreateFinishTask(PickActivity activity, String mimeType, String displayName) {
             super(activity);
             mMimeType = mimeType;
             mDisplayName = displayName;
diff --git a/src/com/android/documentsui/SaveFragment.java b/src/com/android/documentsui/picker/SaveFragment.java
similarity index 95%
rename from src/com/android/documentsui/SaveFragment.java
rename to src/com/android/documentsui/picker/SaveFragment.java
index a37590d..a8f2f88 100644
--- a/src/com/android/documentsui/SaveFragment.java
+++ b/src/com/android/documentsui/picker/SaveFragment.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.picker;
 
 import android.app.Fragment;
 import android.app.FragmentManager;
@@ -33,12 +33,14 @@
 import android.widget.ImageView;
 import android.widget.ProgressBar;
 
+import com.android.documentsui.IconUtils;
+import com.android.documentsui.R;
 import com.android.documentsui.model.DocumentInfo;
 
 /**
  * Display document title editor and save button.
  */
-public class SaveFragment extends Fragment {
+class SaveFragment extends Fragment {
     public static final String TAG = "SaveFragment";
 
     private DocumentInfo mReplaceTarget;
@@ -50,7 +52,7 @@
     private static final String EXTRA_MIME_TYPE = "mime_type";
     private static final String EXTRA_DISPLAY_NAME = "display_name";
 
-    public static void show(FragmentManager fm, String mimeType, String displayName) {
+    static void show(FragmentManager fm, String mimeType, String displayName) {
         final Bundle args = new Bundle();
         args.putString(EXTRA_MIME_TYPE, mimeType);
         args.putString(EXTRA_DISPLAY_NAME, displayName);
@@ -147,7 +149,7 @@
     };
 
     private void performSave() {
-        final DocumentsActivity activity = DocumentsActivity.get(SaveFragment.this);
+        final PickActivity activity = PickActivity.get(SaveFragment.this);
         if (mReplaceTarget != null) {
             activity.onSaveRequested(mReplaceTarget);
         } else {
diff --git a/src/com/android/documentsui/services/Job.java b/src/com/android/documentsui/services/Job.java
index 14ae66e..24a95c6 100644
--- a/src/com/android/documentsui/services/Job.java
+++ b/src/com/android/documentsui/services/Job.java
@@ -41,7 +41,7 @@
 import android.util.Log;
 
 import com.android.documentsui.clipping.UrisSupplier;
-import com.android.documentsui.FilesActivity;
+import com.android.documentsui.manager.ManageActivity;
 import com.android.documentsui.Metrics;
 import com.android.documentsui.OperationDialogFragment;
 import com.android.documentsui.R;
@@ -298,7 +298,7 @@
      * Creates an intent for navigating back to the destination directory.
      */
     Intent buildNavigateIntent(String tag) {
-        Intent intent = new Intent(service, FilesActivity.class);
+        Intent intent = new Intent(service, ManageActivity.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.setAction(DocumentsContract.ACTION_BROWSE);
         intent.setData(getDataUriForIntent(tag));
diff --git a/tests/src/com/android/documentsui/FileManagementUiTest.java b/tests/src/com/android/documentsui/FileManagementUiTest.java
index 623f68a..7beeea3 100644
--- a/tests/src/com/android/documentsui/FileManagementUiTest.java
+++ b/tests/src/com/android/documentsui/FileManagementUiTest.java
@@ -25,11 +25,13 @@
 import android.test.suitebuilder.annotation.LargeTest;
 import android.view.KeyEvent;
 
+import com.android.documentsui.manager.ManageActivity;
+
 @LargeTest
-public class FileManagementUiTest extends ActivityTest<FilesActivity> {
+public class FileManagementUiTest extends ActivityTest<ManageActivity> {
 
     public FileManagementUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java b/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java
index d0ec9d7..6ad7e11 100644
--- a/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java
+++ b/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java
@@ -23,13 +23,14 @@
 import android.provider.DocumentsContract;
 import android.test.suitebuilder.annotation.LargeTest;
 
+import com.android.documentsui.manager.ManageActivity;
 import com.android.documentsui.model.RootInfo;
 
 @LargeTest
-public class FilesActivityDefaultsUiTest extends ActivityTest<FilesActivity> {
+public class FilesActivityDefaultsUiTest extends ActivityTest<ManageActivity> {
 
     public FilesActivityDefaultsUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/tests/src/com/android/documentsui/FilesActivityUiTest.java b/tests/src/com/android/documentsui/FilesActivityUiTest.java
index cdee5fc..4454e20 100644
--- a/tests/src/com/android/documentsui/FilesActivityUiTest.java
+++ b/tests/src/com/android/documentsui/FilesActivityUiTest.java
@@ -20,11 +20,13 @@
 import android.os.RemoteException;
 import android.test.suitebuilder.annotation.LargeTest;
 
+import com.android.documentsui.manager.ManageActivity;
+
 @LargeTest
-public class FilesActivityUiTest extends ActivityTest<FilesActivity> {
+public class FilesActivityUiTest extends ActivityTest<ManageActivity> {
 
     public FilesActivityUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java b/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java
index ef4a68d..5462461 100644
--- a/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java
+++ b/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java
@@ -26,12 +26,14 @@
 import android.test.suitebuilder.annotation.Suppress;
 import android.view.MotionEvent;
 
+import com.android.documentsui.manager.ManageActivity;
+
 // TODO: As of this writing all tests in this class are disabled. Please fix.
 @LargeTest
-public class IntegratedDownloadsUiTest extends ActivityTest<FilesActivity> {
+public class IntegratedDownloadsUiTest extends ActivityTest<ManageActivity> {
 
     public IntegratedDownloadsUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     // We don't really need to test the entirety of download support
diff --git a/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java b/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java
index 76e8c96..c45eaed 100644
--- a/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java
+++ b/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java
@@ -22,11 +22,13 @@
 import android.test.suitebuilder.annotation.Suppress;
 import android.view.KeyEvent;
 
+import com.android.documentsui.manager.ManageActivity;
+
 @LargeTest
-public class KeyboardNavigationUiTest extends ActivityTest<FilesActivity> {
+public class KeyboardNavigationUiTest extends ActivityTest<ManageActivity> {
 
     public KeyboardNavigationUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/tests/src/com/android/documentsui/RenameDocumentUiTest.java b/tests/src/com/android/documentsui/RenameDocumentUiTest.java
index e7ac293..c4517b2 100644
--- a/tests/src/com/android/documentsui/RenameDocumentUiTest.java
+++ b/tests/src/com/android/documentsui/RenameDocumentUiTest.java
@@ -19,13 +19,15 @@
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.test.suitebuilder.annotation.LargeTest;
 
+import com.android.documentsui.manager.ManageActivity;
+
 @LargeTest
-public class RenameDocumentUiTest extends ActivityTest<FilesActivity> {
+public class RenameDocumentUiTest extends ActivityTest<ManageActivity> {
 
     private final String newName = "kitties.log";
 
     public RenameDocumentUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/tests/src/com/android/documentsui/RootsUiTest.java b/tests/src/com/android/documentsui/RootsUiTest.java
index 4edfd8a..98691db 100644
--- a/tests/src/com/android/documentsui/RootsUiTest.java
+++ b/tests/src/com/android/documentsui/RootsUiTest.java
@@ -22,13 +22,15 @@
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.Suppress;
 
+import com.android.documentsui.manager.ManageActivity;
+
 @LargeTest
-public class RootsUiTest extends ActivityTest<FilesActivity> {
+public class RootsUiTest extends ActivityTest<ManageActivity> {
 
     private static final String TAG = "RootUiTest";
 
     public RootsUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
@@ -53,5 +55,4 @@
         bots.roots.openRoot(ROOT_1_ID);
         bots.main.assertInActionMode(false);
     }
-
 }
diff --git a/tests/src/com/android/documentsui/SearchViewUiTest.java b/tests/src/com/android/documentsui/SearchViewUiTest.java
index 01c6e1e..39c4383 100644
--- a/tests/src/com/android/documentsui/SearchViewUiTest.java
+++ b/tests/src/com/android/documentsui/SearchViewUiTest.java
@@ -23,11 +23,13 @@
 import android.support.v7.recyclerview.R;
 import android.test.suitebuilder.annotation.LargeTest;
 
+import com.android.documentsui.manager.ManageActivity;
+
 @LargeTest
-public class SearchViewUiTest extends ActivityTest<FilesActivity> {
+public class SearchViewUiTest extends ActivityTest<ManageActivity> {
 
     public SearchViewUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override
diff --git a/tests/src/com/android/documentsui/SortDocumentUiTest.java b/tests/src/com/android/documentsui/SortDocumentUiTest.java
index ac4fa4c..a202925 100644
--- a/tests/src/com/android/documentsui/SortDocumentUiTest.java
+++ b/tests/src/com/android/documentsui/SortDocumentUiTest.java
@@ -19,11 +19,12 @@
 import android.net.Uri;
 import android.support.test.filters.LargeTest;
 
+import com.android.documentsui.manager.ManageActivity;
 import com.android.documentsui.sorting.SortDimension;
 import com.android.documentsui.sorting.SortModel;
 
 @LargeTest
-public class SortDocumentUiTest extends ActivityTest<FilesActivity> {
+public class SortDocumentUiTest extends ActivityTest<ManageActivity> {
 
     private static final String DIR_1 = "folder_1";
     private static final String DIR_2 = "dir_2";
@@ -47,7 +48,7 @@
     private static final String[] FILES_IN_MODIFIED_DESC = reverse(FILES);
 
     public SortDocumentUiTest() {
-        super(FilesActivity.class);
+        super(ManageActivity.class);
     }
 
     @Override