DocumentsActivity.java revision 1feeddf518d31a7ff5d28000a631857442cd7161
19e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey/* 29e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project 39e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * 49e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 59e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * you may not use this file except in compliance with the License. 69e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * You may obtain a copy of the License at 79e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * 89e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 99e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * 109e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 119e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 129e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * See the License for the specific language governing permissions and 149e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey * limitations under the License. 159e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey */ 169e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 179e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeypackage com.android.documentsui; 189e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 19e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_DOWN; 20e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_NONE; 21e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_SIDE; 22e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport static com.android.documentsui.DirectoryFragment.ANIM_UP; 23b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.ACTION_CREATE; 24b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.ACTION_GET_CONTENT; 25b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE; 26b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.ACTION_OPEN; 27b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.MODE_GRID; 28b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.MODE_LIST; 294eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey 3054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.ActionBar; 3154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.ActionBar.OnNavigationListener; 329e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.Activity; 339fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.app.Fragment; 349e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.app.FragmentManager; 354eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkeyimport android.content.ActivityNotFoundException; 36be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ClipData; 3754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyimport android.content.ComponentName; 38be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport android.content.ContentResolver; 3920d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkeyimport android.content.ContentValues; 409e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.content.Intent; 4154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkeyimport android.content.pm.ResolveInfo; 4288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.content.res.Resources; 4354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.database.Cursor; 4488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.graphics.Point; 45bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.graphics.drawable.ColorDrawable; 4688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.graphics.drawable.Drawable; 4788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.graphics.drawable.InsetDrawable; 489e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.net.Uri; 49a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport android.os.AsyncTask; 509e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.os.Bundle; 51b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport android.os.Parcel; 52e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport android.os.Parcelable; 53a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkeyimport android.provider.DocumentsContract; 543e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkeyimport android.provider.DocumentsContract.Root; 55bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.app.ActionBarDrawerToggle; 56bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.view.GravityCompat; 57bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.widget.DrawerLayout; 58bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.support.v4.widget.DrawerLayout.DrawerListener; 599e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.util.Log; 60e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport android.util.SparseArray; 619e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.LayoutInflater; 6254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.Menu; 6354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.MenuItem; 644ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkeyimport android.view.MenuItem.OnActionExpandListener; 6588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.view.MotionEvent; 669e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.View; 6788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.view.View.OnTouchListener; 689e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeyimport android.view.ViewGroup; 6988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkeyimport android.view.WindowManager; 7054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.BaseAdapter; 7128c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkeyimport android.widget.ImageView; 72bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.widget.SearchView; 73bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkeyimport android.widget.SearchView.OnQueryTextListener; 7454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.TextView; 757e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkeyimport android.widget.Toast; 769e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 77d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.RecentsProvider.RecentColumns; 78d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.RecentsProvider.ResumeColumns; 79ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo; 80b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkeyimport com.android.documentsui.model.DocumentStack; 81b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport com.android.documentsui.model.DurableUtils; 82ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.RootInfo; 83e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkeyimport com.google.common.collect.Maps; 8420d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey 85ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkeyimport libcore.io.IoUtils; 86ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 870c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkeyimport java.io.FileNotFoundException; 88b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport java.io.IOException; 89be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport java.util.Arrays; 90a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport java.util.Collection; 915545f56f7561810187545a1817b6001dd1f9931bJeff Sharkeyimport java.util.HashMap; 92be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkeyimport java.util.List; 93be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey 949e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkeypublic class DocumentsActivity extends Activity { 95ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey public static final String TAG = "Documents"; 969e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 9788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey private static final String EXTRA_STATE = "state"; 9888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 995545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey private static final int CODE_FORWARD = 42; 1005545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey 10188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey private boolean mShowAsDialog; 10288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 103bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey private SearchView mSearchView; 104bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 105bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey private DrawerLayout mDrawerLayout; 106bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey private ActionBarDrawerToggle mDrawerToggle; 10788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey private View mRootsContainer; 1081482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey 109e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey private DirectoryContainerView mDirectoryContainer; 110e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey 111ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey private boolean mIgnoreNextNavigation; 11288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey private boolean mIgnoreNextClose; 1134ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey private boolean mIgnoreNextCollapse; 114ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 1154eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey private RootsCache mRoots; 116b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey private State mState; 11754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 1189e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey @Override 1199e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey public void onCreate(Bundle icicle) { 1209e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey super.onCreate(icicle); 1219e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 1224eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey mRoots = DocumentsApplication.getRootsCache(this); 1234eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey 124b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey setResult(Activity.RESULT_CANCELED); 125b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey setContentView(R.layout.activity); 12654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey 12788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final Resources res = getResources(); 12888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mShowAsDialog = res.getBoolean(R.bool.show_as_dialog); 12988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 13088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mShowAsDialog) { 13188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // backgroundDimAmount from theme isn't applied; do it manually 13288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final WindowManager.LayoutParams a = getWindow().getAttributes(); 13388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey a.dimAmount = 0.6f; 13488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey getWindow().setAttributes(a); 13588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 13688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 13788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey getWindow().setFlags(~0, WindowManager.LayoutParams.FLAG_DIM_BEHIND); 13888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 13988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // Inset ourselves to look like a dialog 14088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final Point size = new Point(); 14188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey getWindowManager().getDefaultDisplay().getSize(size); 14288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 14388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final int width = (int) res.getFraction(R.dimen.dialog_width, size.x, size.x); 14488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final int height = (int) res.getFraction(R.dimen.dialog_height, size.y, size.y); 14588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final int insetX = (size.x - width) / 2; 14688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final int insetY = (size.y - height) / 2; 14788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 14888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final Drawable before = getWindow().getDecorView().getBackground(); 14988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final Drawable after = new InsetDrawable(before, insetX, insetY, insetX, insetY); 15088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey getWindow().getDecorView().setBackground(after); 15188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 15288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // Dismiss when touch down in the dimmed inset area 15388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey getWindow().getDecorView().setOnTouchListener(new OnTouchListener() { 15488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey @Override 15588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey public boolean onTouch(View v, MotionEvent event) { 15688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (event.getAction() == MotionEvent.ACTION_DOWN) { 15788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final float x = event.getX(); 15888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final float y = event.getY(); 15988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (x < insetX || x > v.getWidth() - insetX || y < insetY 16088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey || y > v.getHeight() - insetY) { 16188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey finish(); 16288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey return true; 16388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 16488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 16588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey return false; 16688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 16788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey }); 16888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 16988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } else { 17088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // Non-dialog means we have a drawer 17188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 1724eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey 17388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 1741feeddf518d31a7ff5d28000a631857442cd7161Jeff Sharkey R.drawable.ic_drawer_glyph, R.string.drawer_open, R.string.drawer_close); 175be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey 17688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerLayout.setDrawerListener(mDrawerListener); 17788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerLayout.setDrawerShadow(R.drawable.ic_drawer_shadow, GravityCompat.START); 178b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 17988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mRootsContainer = findViewById(R.id.container_roots); 18088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 181b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 182e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey mDirectoryContainer = (DirectoryContainerView) findViewById(R.id.container_directory); 183e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey 184b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (icicle != null) { 185b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState = icicle.getParcelable(EXTRA_STATE); 186be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey } else { 187b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey buildDefaultState(); 18854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 18954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 19088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // Hide roots when we're managing a specific root 191b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_MANAGE) { 19288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mShowAsDialog) { 19388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey findViewById(R.id.dialog_roots).setVisibility(View.GONE); 19488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } else { 19588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 19688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 197b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 19854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 199b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_CREATE) { 20054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final String mimeType = getIntent().getType(); 20154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE); 20254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey SaveFragment.show(getFragmentManager(), mimeType, title); 20354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 204bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 205b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_GET_CONTENT) { 20654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey final Intent moreApps = new Intent(getIntent()); 20754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey moreApps.setComponent(null); 20854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey moreApps.setPackage(null); 20954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey RootsFragment.show(getFragmentManager(), moreApps); 210b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (mState.action == ACTION_OPEN || mState.action == ACTION_CREATE) { 21154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey RootsFragment.show(getFragmentManager(), null); 21254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey } 21366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey 214a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey if (!mState.restored) { 215a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey if (mState.action == ACTION_MANAGE) { 216a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey final Uri rootUri = getIntent().getData(); 217a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey new RestoreRootTask(rootUri).execute(); 218a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } else { 219a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey new RestoreStackTask().execute(); 220a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 221a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } else { 222a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey onCurrentDirectoryChanged(ANIM_NONE); 223a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 224b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 225a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey 226b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey private void buildDefaultState() { 227b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState = new State(); 22866516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey 229b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final Intent intent = getIntent(); 230b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final String action = intent.getAction(); 231b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) { 232b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.action = ACTION_OPEN; 233b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) { 234b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.action = ACTION_CREATE; 235b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (Intent.ACTION_GET_CONTENT.equals(action)) { 236b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.action = ACTION_GET_CONTENT; 237a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey } else if (DocumentsContract.ACTION_MANAGE_ROOT.equals(action)) { 238b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.action = ACTION_MANAGE; 239b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 240bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 241b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { 242b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.allowMultiple = intent.getBooleanExtra( 243b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey Intent.EXTRA_ALLOW_MULTIPLE, false); 244b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 245bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 246b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_MANAGE) { 247b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.acceptMimes = new String[] { "*/*" }; 248b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.allowMultiple = true; 249b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) { 250b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES); 251b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else { 252b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.acceptMimes = new String[] { intent.getType() }; 253b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 254bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 255b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false); 256348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey mState.showAdvanced = SettingsActivity.getDisplayAdvancedDevices(this); 257a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 258a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 259a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey private class RestoreRootTask extends AsyncTask<Void, Void, RootInfo> { 260a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey private Uri mRootUri; 261a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 262a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey public RestoreRootTask(Uri rootUri) { 263a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey mRootUri = rootUri; 264a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 265a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 266a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey @Override 267a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey protected RootInfo doInBackground(Void... params) { 268a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey final String rootId = DocumentsContract.getRootId(mRootUri); 269a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey return mRoots.getRootOneshot(mRootUri.getAuthority(), rootId); 270a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 271a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 272a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey @Override 273a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey protected void onPostExecute(RootInfo root) { 274a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey if (isDestroyed()) return; 275a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey mState.restored = true; 276a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey 277a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey if (root != null) { 278a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey onRootPicked(root, true); 279a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } else { 280a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey Log.w(TAG, "Failed to find root: " + mRootUri); 281a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey finish(); 282a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } 283a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 284a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 285a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey 286a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey private class RestoreStackTask extends AsyncTask<Void, Void, Void> { 287a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey private volatile boolean mRestoredStack; 288a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 289a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey @Override 290a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey protected Void doInBackground(Void... params) { 291a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey // Restore last stack for calling package 292a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey final String packageName = getCallingPackage(); 293a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey final Cursor cursor = getContentResolver() 294a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey .query(RecentsProvider.buildResume(packageName), null, null, null, null); 295a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey try { 296a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey if (cursor.moveToFirst()) { 297b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final byte[] rawStack = cursor.getBlob( 298d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey cursor.getColumnIndex(ResumeColumns.STACK)); 299b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey DurableUtils.readFromArray(rawStack, mState.stack); 300a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey mRestoredStack = true; 301a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } 302b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } catch (IOException e) { 303a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey Log.w(TAG, "Failed to resume", e); 304a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } finally { 305ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey IoUtils.closeQuietly(cursor); 306ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } 307ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 308ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey // If restored root isn't valid, fall back to recents 309ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final RootInfo root = getCurrentRoot(); 310a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey final Collection<RootInfo> matchingRoots = mRoots.getMatchingRootsBlocking(mState); 311ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey if (!matchingRoots.contains(root)) { 312d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey mState.stack.reset(); 313a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey mRestoredStack = false; 314dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 315a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey 316a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey return null; 317a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey } 318a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 319a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey @Override 320a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey protected void onPostExecute(Void result) { 321a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey if (isDestroyed()) return; 322a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey mState.restored = true; 323a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 324f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey // Only open drawer when not restoring stack, and when not showing 325f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey // visual content. 326a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey if (!mRestoredStack 327f6db154975ef575479ba4ab59d80bcf592288252Jeff Sharkey && !MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mState.acceptMimes)) { 32888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey setRootsDrawerOpen(true); 329ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } 330a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey 331a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey onCurrentDirectoryChanged(ANIM_NONE); 332dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 333a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } 334dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 335a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey @Override 33688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey public void onResume() { 33788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey super.onResume(); 338a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey 339b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_MANAGE) { 340b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.showSize = true; 341a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } else { 342b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.showSize = SettingsActivity.getDisplayFileSize(this); 343a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey } 344bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 345bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 346bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey private DrawerListener mDrawerListener = new DrawerListener() { 347bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 348bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public void onDrawerSlide(View drawerView, float slideOffset) { 349bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey mDrawerToggle.onDrawerSlide(drawerView, slideOffset); 350bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 351bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 352bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 353bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public void onDrawerOpened(View drawerView) { 354bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey mDrawerToggle.onDrawerOpened(drawerView); 355bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey updateActionBar(); 3564ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey invalidateOptionsMenu(); 357bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 358bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 359bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 360bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public void onDrawerClosed(View drawerView) { 361bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey mDrawerToggle.onDrawerClosed(drawerView); 362bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey updateActionBar(); 3634ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey invalidateOptionsMenu(); 364bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 365bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 366bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 367bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public void onDrawerStateChanged(int newState) { 368bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey mDrawerToggle.onDrawerStateChanged(newState); 369bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 370bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey }; 371bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 372bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 373bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey protected void onPostCreate(Bundle savedInstanceState) { 374bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey super.onPostCreate(savedInstanceState); 37588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mDrawerToggle != null) { 37688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerToggle.syncState(); 37788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 37888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 37988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 38088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey public void setRootsDrawerOpen(boolean open) { 38188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (!mShowAsDialog) { 38288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (open) { 38388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerLayout.openDrawer(mRootsContainer); 38488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } else { 38588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerLayout.closeDrawer(mRootsContainer); 38688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 38788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 38888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 38988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 39088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey private boolean isRootsDrawerOpen() { 39188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mShowAsDialog) { 39288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey return false; 39388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } else { 39488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey return mDrawerLayout.isDrawerOpen(mRootsContainer); 39588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 3969e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey } 3979e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 39854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public void updateActionBar() { 39954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final ActionBar actionBar = getActionBar(); 4009e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 401bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey actionBar.setDisplayShowHomeEnabled(true); 4029e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 40388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final boolean showIndicator = !mShowAsDialog && (mState.action != ACTION_MANAGE); 40488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey actionBar.setDisplayHomeAsUpEnabled(showIndicator); 40588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mDrawerToggle != null) { 40688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mDrawerToggle.setDrawerIndicatorEnabled(showIndicator); 407ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } 408ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 40988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (isRootsDrawerOpen()) { 41054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 411bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey actionBar.setIcon(new ColorDrawable()); 41254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 413b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { 41454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey actionBar.setTitle(R.string.title_open); 415b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (mState.action == ACTION_CREATE) { 41654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey actionBar.setTitle(R.string.title_save); 41754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 418bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } else { 419ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey final RootInfo root = getCurrentRoot(); 420aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey actionBar.setIcon(root != null ? root.loadIcon(this) : null); 421ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey 422ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey if (mState.stack.size() <= 1) { 423ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 424ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey actionBar.setTitle(root.title); 425ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey } else { 426ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey mIgnoreNextNavigation = true; 427ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 428ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey actionBar.setTitle(null); 429ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey actionBar.setListNavigationCallbacks(mStackAdapter, mStackListener); 430ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey actionBar.setSelectedNavigationItem(mStackAdapter.getCount() - 1); 431bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 4329e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey } 43354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 4349e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 43554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 43654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public boolean onCreateOptionsMenu(Menu menu) { 43754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey super.onCreateOptionsMenu(menu); 43854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey getMenuInflater().inflate(R.menu.activity, menu); 439bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 44088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // Actions are always visible when showing as dialog 44188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mShowAsDialog) { 44288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey for (int i = 0; i < menu.size(); i++) { 44388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey menu.getItem(i).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 44488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 44588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 44688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 447bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey final MenuItem searchMenu = menu.findItem(R.id.menu_search); 448bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey mSearchView = (SearchView) searchMenu.getActionView(); 449bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey mSearchView.setOnQueryTextListener(new OnQueryTextListener() { 450bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 451bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public boolean onQueryTextSubmit(String query) { 452b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.currentSearch = query; 45388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mSearchView.clearFocus(); 454e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_NONE); 455bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return true; 456bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 457bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 458bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 459bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public boolean onQueryTextChange(String newText) { 460bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return false; 461bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 462bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey }); 463bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 4644ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey searchMenu.setOnActionExpandListener(new OnActionExpandListener() { 465b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey @Override 4664ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey public boolean onMenuItemActionExpand(MenuItem item) { 4674ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey return true; 4684ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey } 4694ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey 4704ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey @Override 4714ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey public boolean onMenuItemActionCollapse(MenuItem item) { 4724ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey if (mIgnoreNextCollapse) { 4734ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey mIgnoreNextCollapse = false; 4744ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey return true; 4754ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey } 4764ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey 477b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.currentSearch = null; 478e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_NONE); 4794ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey return true; 480b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } 481b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey }); 482b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey 48388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mSearchView.setOnCloseListener(new SearchView.OnCloseListener() { 48488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey @Override 48588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey public boolean onClose() { 48688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mIgnoreNextClose) { 48788f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mIgnoreNextClose = false; 48888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey return false; 48988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 49088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 49188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mState.currentSearch = null; 492e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_NONE); 49388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey return false; 49488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } 49588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey }); 49688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 49754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey return true; 49854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 49954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 50054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 50154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public boolean onPrepareOptionsMenu(Menu menu) { 50254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey super.onPrepareOptionsMenu(menu); 50354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 5049fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final FragmentManager fm = getFragmentManager(); 5053e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey 5063e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey final RootInfo root = getCurrentRoot(); 507ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey final DocumentInfo cwd = getCurrentDirectory(); 508dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 50954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final MenuItem createDir = menu.findItem(R.id.menu_create_dir); 510bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey final MenuItem search = menu.findItem(R.id.menu_search); 511ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final MenuItem sort = menu.findItem(R.id.menu_sort); 512ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final MenuItem sortSize = menu.findItem(R.id.menu_sort_size); 513ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final MenuItem grid = menu.findItem(R.id.menu_grid); 5149fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final MenuItem list = menu.findItem(R.id.menu_list); 515a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey final MenuItem settings = menu.findItem(R.id.menu_settings); 516dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 5174ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey // Open drawer means we hide most actions 51888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (isRootsDrawerOpen()) { 5194ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey createDir.setVisible(false); 5204ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey search.setVisible(false); 5214ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey sort.setVisible(false); 5224ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey grid.setVisible(false); 5234ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey list.setVisible(false); 5244ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey mIgnoreNextCollapse = true; 5254ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey search.collapseActionView(); 5264ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey return true; 5274ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey } 5284ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey 52988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey sort.setVisible(cwd != null); 53088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey grid.setVisible(mState.derivedMode != MODE_GRID); 53188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey list.setVisible(mState.derivedMode != MODE_LIST); 5329fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 5334ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey if (mState.currentSearch != null) { 5344ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey // Search uses backend ranking; no sorting 5354ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey sort.setVisible(false); 5364ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey 5374ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey search.expandActionView(); 53888f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 53988f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mSearchView.setIconified(false); 54088f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mSearchView.clearFocus(); 5414ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey mSearchView.setQuery(mState.currentSearch, false); 5424ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey } else { 54388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mIgnoreNextClose = true; 54488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mSearchView.setIconified(true); 54588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mSearchView.clearFocus(); 54688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 5474ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey mIgnoreNextCollapse = true; 5484ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey search.collapseActionView(); 5494ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey } 5504ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey 551ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey // Only sort by size when visible 552ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey sortSize.setVisible(mState.showSize); 553ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 5549fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final boolean searchVisible; 555b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_CREATE) { 5569fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey createDir.setVisible(cwd != null && cwd.isCreateSupported()); 5579fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey searchVisible = false; 5589fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 5599fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey // No display options in recent directories 5609fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey if (cwd == null) { 5619fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey grid.setVisible(false); 5629fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey list.setVisible(false); 5639fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 5649fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 565dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey SaveFragment.get(fm).setSaveEnabled(cwd != null && cwd.isCreateSupported()); 5669fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } else { 5679fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey createDir.setVisible(false); 5683e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey 5693e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey searchVisible = root != null 5703e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey && ((root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0); 571dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 572bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 5739fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey // TODO: close any search in-progress when hiding 5749fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey search.setVisible(searchVisible); 575b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey 576b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey settings.setVisible(mState.action != ACTION_MANAGE); 577a5599ef636e37cb0b6474349936999be1afe6987Jeff Sharkey 57854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey return true; 5799e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey } 5809e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 58154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 58254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public boolean onOptionsItemSelected(MenuItem item) { 58388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) { 584bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return true; 585bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 586bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 58754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final int id = item.getItemId(); 58854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey if (id == android.R.id.home) { 589dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey onBackPressed(); 590bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return true; 59154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } else if (id == R.id.menu_create_dir) { 59220d96d8aff2193d548977e23ce5158657cac94e0Jeff Sharkey CreateDirectoryFragment.show(getFragmentManager()); 593bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return true; 594bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } else if (id == R.id.menu_search) { 595bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return false; 596ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } else if (id == R.id.menu_sort_name) { 597d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey setUserSortOrder(State.SORT_ORDER_DISPLAY_NAME); 598ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey return true; 599ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } else if (id == R.id.menu_sort_date) { 600d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey setUserSortOrder(State.SORT_ORDER_LAST_MODIFIED); 601ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey return true; 602ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } else if (id == R.id.menu_sort_size) { 603d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey setUserSortOrder(State.SORT_ORDER_SIZE); 604ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey return true; 605b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else if (id == R.id.menu_grid) { 606d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey setUserMode(State.MODE_GRID); 607b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey return true; 608b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else if (id == R.id.menu_list) { 609d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey setUserMode(State.MODE_LIST); 610b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey return true; 6119fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } else if (id == R.id.menu_settings) { 6129fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey startActivity(new Intent(this, SettingsActivity.class)); 6139fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey return true; 614b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else { 615b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey return super.onOptionsItemSelected(item); 61654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 61754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 61854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 619d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey /** 620d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Update UI to reflect internal state changes not from user. 621d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey */ 622d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public void onStateChanged() { 623d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey invalidateOptionsMenu(); 624d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey } 625d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey 626d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey /** 627d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Set state sort order based on explicit user action. 628d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey */ 629d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey private void setUserSortOrder(int sortOrder) { 630fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey mState.userSortOrder = sortOrder; 631d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey DirectoryFragment.get(getFragmentManager()).onUserSortOrderChanged(); 632d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey } 633d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey 634d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey /** 635d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey * Set state mode based on explicit user action. 636d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey */ 637d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey private void setUserMode(int mode) { 638fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey mState.userMode = mode; 639d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey DirectoryFragment.get(getFragmentManager()).onUserModeChanged(); 640d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey } 641d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey 642dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey @Override 643dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey public void onBackPressed() { 644fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey if (!mState.stackTouched) { 645fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey super.onBackPressed(); 646fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey return; 647fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey } 648fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey 649b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final int size = mState.stack.size(); 650dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey if (size > 1) { 651b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.stack.pop(); 652e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_UP); 65388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey } else if (size == 1 && !isRootsDrawerOpen()) { 654dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey // TODO: open root drawer once we can capture back key 655dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey super.onBackPressed(); 656dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } else { 657dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey super.onBackPressed(); 65854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 659dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 66054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 661b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey @Override 662b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey protected void onSaveInstanceState(Bundle state) { 663b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey super.onSaveInstanceState(state); 664b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.putParcelable(EXTRA_STATE, mState); 665b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 666b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 667b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey @Override 668b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey protected void onRestoreInstanceState(Bundle state) { 669b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey super.onRestoreInstanceState(state); 670b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey updateActionBar(); 671b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 672b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 673ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey private BaseAdapter mStackAdapter = new BaseAdapter() { 67454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 67554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public int getCount() { 676ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey return mState.stack.size(); 67754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 6789e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 67954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 680ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey public DocumentInfo getItem(int position) { 681ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey return mState.stack.get(mState.stack.size() - position - 1); 68254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 6839e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 68454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey @Override 68554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public long getItemId(int position) { 686bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return position; 6879e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey } 6889e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 6899e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey @Override 69054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public View getView(int position, View convertView, ViewGroup parent) { 69154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey if (convertView == null) { 69254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey convertView = LayoutInflater.from(parent.getContext()) 693bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey .inflate(R.layout.item_title, parent, false); 694bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 695bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 696bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey final TextView title = (TextView) convertView.findViewById(android.R.id.title); 697ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final DocumentInfo doc = getItem(position); 698bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 699ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey if (position == 0) { 700ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final RootInfo root = getCurrentRoot(); 701ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey title.setText(root.title); 702bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } else { 703ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey title.setText(doc.displayName); 704bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 705bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 70628c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey // No padding when shown in actionbar 70728c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey convertView.setPadding(0, 0, 0, 0); 708bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey return convertView; 709bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey } 710bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey 711bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey @Override 712bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey public View getDropDownView(int position, View convertView, ViewGroup parent) { 713bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey if (convertView == null) { 714bc2971d2499f5bf5534ced7296ece630ca902738Jeff Sharkey convertView = LayoutInflater.from(parent.getContext()) 71528c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey .inflate(R.layout.item_title, parent, false); 7169e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey } 7179e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 71828c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey final ImageView subdir = (ImageView) convertView.findViewById(R.id.subdir); 71928c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey final TextView title = (TextView) convertView.findViewById(android.R.id.title); 720ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final DocumentInfo doc = getItem(position); 721ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 722ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey if (position == 0) { 723ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final RootInfo root = getCurrentRoot(); 72428c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey title.setText(root.title); 72528c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey subdir.setVisibility(View.GONE); 726ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } else { 72728c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey title.setText(doc.displayName); 72828c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey subdir.setVisibility(View.VISIBLE); 729ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } 7309e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 73154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey return convertView; 7329e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey } 73354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey }; 7349e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey 735ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey private OnNavigationListener mStackListener = new OnNavigationListener() { 7369e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey @Override 73754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey public boolean onNavigationItemSelected(int itemPosition, long itemId) { 738ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey if (mIgnoreNextNavigation) { 739ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey mIgnoreNextNavigation = false; 740ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey return false; 741ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } 742ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey 743ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey while (mState.stack.size() > itemPosition + 1) { 744fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey mState.stackTouched = true; 745ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey mState.stack.pop(); 746ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } 747e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_UP); 74854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey return true; 74954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 75054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey }; 75154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 752ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public RootInfo getCurrentRoot() { 753d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey if (mState.stack.root != null) { 754d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey return mState.stack.root; 755b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else { 7564eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey return mRoots.getRecentsRoot(); 757b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } 758dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 759dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 760ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public DocumentInfo getCurrentDirectory() { 761b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return mState.stack.peek(); 762dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 763dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 764b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public State getDisplayState() { 765b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return mState; 7661482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey } 7671482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey 768e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey private void onCurrentDirectoryChanged(int anim) { 769dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey final FragmentManager fm = getFragmentManager(); 770d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey final RootInfo root = getCurrentRoot(); 771ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey final DocumentInfo cwd = getCurrentDirectory(); 7729fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 773e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey mDirectoryContainer.setDrawDisappearingFirst(anim == ANIM_DOWN); 774e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey 775b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey if (cwd == null) { 776b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey // No directory means recents 777b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_CREATE) { 778b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey RecentsCreateFragment.show(fm); 779b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else { 780e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey DirectoryFragment.showRecentsOpen(fm, anim); 78188f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey 78288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey // Start recents in relevant mode 78388f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey final boolean acceptImages = MimePredicate.mimeMatches( 78488f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey "image/*", mState.acceptMimes); 78588f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mState.userMode = acceptImages ? MODE_GRID : MODE_LIST; 78688f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey mState.derivedMode = mState.userMode; 787b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } 788b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else { 789b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.currentSearch != null) { 790b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey // Ongoing search 791e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey DirectoryFragment.showSearch(fm, root, mState.currentSearch, anim); 792b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else { 793b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey // Normal boring directory 794e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey DirectoryFragment.showNormal(fm, root, cwd, anim); 795b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } 79654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 797b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey 7989fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey // Forget any replacement target 799b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_CREATE) { 8009fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey final SaveFragment save = SaveFragment.get(fm); 8019fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey if (save != null) { 8029fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey save.setReplaceTarget(null); 8039fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 8049fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 8059fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 80628c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey final RootsFragment roots = RootsFragment.get(fm); 80728c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey if (roots != null) { 80828c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey roots.onCurrentRootChanged(); 80928c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey } 81028c05ee8931cecf4c51c470e0043d30196010c49Jeff Sharkey 811dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey updateActionBar(); 81254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey invalidateOptionsMenu(); 813dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey dumpStack(); 81454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 81554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 816b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey public void onStackPicked(DocumentStack stack) { 817b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.stack = stack; 818fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey mState.stackTouched = true; 819e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_SIDE); 820b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } 821b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey 822ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public void onRootPicked(RootInfo root, boolean closeDrawer) { 823ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey // Clear entire backstack and start in new root 824d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey mState.stack.root = root; 825b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.stack.clear(); 826fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey mState.stackTouched = true; 827b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey 828aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey if (!mRoots.isRecentsRoot(root)) { 8290c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey try { 830ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey final Uri uri = DocumentsContract.buildDocumentUri(root.authority, root.documentId); 831e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey final DocumentInfo doc = DocumentInfo.fromUri(getContentResolver(), uri); 832e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey mState.stack.push(doc); 833e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey mState.stackTouched = true; 834e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_SIDE); 8350c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey } catch (FileNotFoundException e) { 8360c2d31bfa113c2848620ac05c916802410b71da1Jeff Sharkey } 837b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } else { 838e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_SIDE); 839b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey } 84066516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey 84166516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey if (closeDrawer) { 84288f322c3115e85bb96fb46f9192b5daecd472c64Jeff Sharkey setRootsDrawerOpen(false); 84366516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey } 844ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey } 845ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey 84654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey public void onAppPicked(ResolveInfo info) { 84754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey final Intent intent = new Intent(getIntent()); 8485545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_FORWARD_RESULT); 84954ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey intent.setComponent(new ComponentName( 85054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey info.activityInfo.applicationInfo.packageName, info.activityInfo.name)); 8515545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey startActivityForResult(intent, CODE_FORWARD); 8525545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey } 8535545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey 8545545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey @Override 8555545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey protected void onActivityResult(int requestCode, int resultCode, Intent data) { 8565545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey Log.d(TAG, "onActivityResult() code=" + resultCode); 8575545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey 8585545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey // Only relay back results when not canceled; otherwise stick around to 8595545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey // let the user pick another app/backend. 8605545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey if (requestCode == CODE_FORWARD && resultCode != RESULT_CANCELED) { 8615545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey setResult(resultCode, data); 8625545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey finish(); 8635545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey } else { 8645545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey super.onActivityResult(requestCode, resultCode, data); 8655545f56f7561810187545a1817b6001dd1f9931bJeff Sharkey } 86654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey } 86754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey 868ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public void onDocumentPicked(DocumentInfo doc) { 86954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final FragmentManager fm = getFragmentManager(); 870b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey if (doc.isDirectory()) { 871b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey mState.stack.push(doc); 872fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey mState.stackTouched = true; 873e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey onCurrentDirectoryChanged(ANIM_DOWN); 874b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { 87554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey // Explicit file picked, return 876d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey onFinished(doc.derivedUri); 877b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (mState.action == ACTION_CREATE) { 8789fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey // Replace selected file 8799fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey SaveFragment.get(fm).setReplaceTarget(doc); 880b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else if (mState.action == ACTION_MANAGE) { 881a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey // First try managing the document; we expect manager to filter 882a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey // based on authority, so we don't grant. 883a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT); 884d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey manage.setData(doc.derivedUri); 885a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey 8864eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey try { 887a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey startActivity(manage); 8884eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey } catch (ActivityNotFoundException ex) { 889a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey // Fall back to viewing 890a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey final Intent view = new Intent(Intent.ACTION_VIEW); 891a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 892d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey view.setData(doc.derivedUri); 893a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey 894a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey try { 895a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey startActivity(view); 896a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey } catch (ActivityNotFoundException ex2) { 897a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); 898a61dc8e03e6e863005b3a4629ca8f3801d33d3c4Jeff Sharkey } 8994eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey } 90054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 90154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 90254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 903ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public void onDocumentsPicked(List<DocumentInfo> docs) { 904b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { 9054eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey final int size = docs.size(); 9064eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey final Uri[] uris = new Uri[size]; 9074eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey for (int i = 0; i < size; i++) { 908d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey uris[i] = docs.get(i).derivedUri; 9094eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey } 9104eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey onFinished(uris); 911be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey } 912be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey } 913be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey 914ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey public void onSaveRequested(DocumentInfo replaceTarget) { 915d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey onFinished(replaceTarget.derivedUri); 9169fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 91792d7e697a864a3e18bef4ef256bb3eb339a66b4eJeff Sharkey 9189fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey public void onSaveRequested(String mimeType, String displayName) { 919ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey final DocumentInfo cwd = getCurrentDirectory(); 920aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey 921ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey final Uri childUri = DocumentsContract.createDocument( 922d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey getContentResolver(), cwd.derivedUri, mimeType, displayName); 923ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey if (childUri != null) { 924dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey onFinished(childUri); 925ded77187ef53341765fcab8e29cda94810fc2ca5Jeff Sharkey } else { 9267e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkey Toast.makeText(this, R.string.save_error, Toast.LENGTH_SHORT).show(); 9277e258b31e70464bb6d80b8b42f0cef8e4417bd6aJeff Sharkey } 92854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 92954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 930be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey private void onFinished(Uri... uris) { 931be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey Log.d(TAG, "onFinished() " + Arrays.toString(uris)); 93254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 933dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey final ContentResolver resolver = getContentResolver(); 934dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey final ContentValues values = new ContentValues(); 935dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 936b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack); 937b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_CREATE) { 938dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey // Remember stack for last create 939dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey values.clear(); 940d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey values.put(RecentColumns.STACK, rawStack); 941d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey resolver.insert(RecentsProvider.buildRecent(), values); 942dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 943dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 944dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey // Remember location for next app launch 945dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey final String packageName = getCallingPackage(); 946dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey values.clear(); 947d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey values.put(ResumeColumns.STACK, rawStack); 948dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey resolver.insert(RecentsProvider.buildResume(packageName), values); 949dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey 95054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey final Intent intent = new Intent(); 951be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey if (uris.length == 1) { 952be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey intent.setData(uris[0]); 953be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey } else if (uris.length > 1) { 954ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey final ClipData clipData = new ClipData( 955b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey null, mState.acceptMimes, new ClipData.Item(uris[0])); 956be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey for (int i = 1; i < uris.length; i++) { 957be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey clipData.addItem(new ClipData.Item(uris[i])); 958be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey } 959be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey intent.setClipData(clipData); 960be8b12e687bd10a526b1f54c2d8a52abdad15d85Jeff Sharkey } 96154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 962b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (mState.action == ACTION_GET_CONTENT) { 96354ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 96454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey } else { 96554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 96654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 96754ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); 96854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey } 96954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 97054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey setResult(Activity.RESULT_OK, intent); 97154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey finish(); 97254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey } 97354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey 974b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static class State implements android.os.Parcelable { 9754eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey public int action; 976ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey public String[] acceptMimes; 977fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey 978fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey /** Explicit user choice */ 979fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey public int userMode = MODE_UNKNOWN; 980fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey /** Derived after loader */ 981fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey public int derivedMode = MODE_LIST; 982fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey 983fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey /** Explicit user choice */ 984fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey public int userSortOrder = SORT_ORDER_UNKNOWN; 985fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey /** Derived after loader */ 986fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey public int derivedSortOrder = SORT_ORDER_DISPLAY_NAME; 987fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey 988ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey public boolean allowMultiple = false; 989b156f4bf8cdfe475a7116b627d84a281e1a281b7Jeff Sharkey public boolean showSize = false; 99054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey public boolean localOnly = false; 991348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey public boolean showAdvanced = false; 992fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey public boolean stackTouched = false; 993a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey public boolean restored = false; 9941482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey 995b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey /** Current user navigation stack; empty implies recents. */ 996b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public DocumentStack stack = new DocumentStack(); 997b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey /** Currently active search, overriding any stack. */ 998b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public String currentSearch; 999b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 1000e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey /** Instance state for every shown directory */ 1001e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey public HashMap<String, SparseArray<Parcelable>> dirState = Maps.newHashMap(); 1002e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey 10034eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey public static final int ACTION_OPEN = 1; 10044eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey public static final int ACTION_CREATE = 2; 10054eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey public static final int ACTION_GET_CONTENT = 3; 10064eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey public static final int ACTION_MANAGE = 4; 10074eb407a832b7d6a2d62a535e5cab70b00a0bc8edJeff Sharkey 1008d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int MODE_UNKNOWN = 0; 1009d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int MODE_LIST = 1; 1010d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int MODE_GRID = 2; 10111482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey 1012d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int SORT_ORDER_UNKNOWN = 0; 1013d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int SORT_ORDER_DISPLAY_NAME = 1; 1014d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int SORT_ORDER_LAST_MODIFIED = 2; 1015d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey public static final int SORT_ORDER_SIZE = 3; 1016b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 1017b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey @Override 1018b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public int describeContents() { 1019b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return 0; 1020b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 1021b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 1022b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey @Override 1023b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public void writeToParcel(Parcel out, int flags) { 1024b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeInt(action); 1025fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey out.writeInt(userMode); 1026b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeStringArray(acceptMimes); 1027fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey out.writeInt(userSortOrder); 1028b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeInt(allowMultiple ? 1 : 0); 1029b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeInt(showSize ? 1 : 0); 1030b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeInt(localOnly ? 1 : 0); 1031348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey out.writeInt(showAdvanced ? 1 : 0); 1032fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey out.writeInt(stackTouched ? 1 : 0); 1033a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey out.writeInt(restored ? 1 : 0); 1034b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey DurableUtils.writeToParcel(out, stack); 1035b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeString(currentSearch); 1036e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey out.writeMap(dirState); 1037b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 1038b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 1039b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static final Creator<State> CREATOR = new Creator<State>() { 1040b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey @Override 1041b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public State createFromParcel(Parcel in) { 1042b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final State state = new State(); 1043b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.action = in.readInt(); 1044fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey state.userMode = in.readInt(); 1045b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.acceptMimes = in.readStringArray(); 1046fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey state.userSortOrder = in.readInt(); 1047b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.allowMultiple = in.readInt() != 0; 1048b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.showSize = in.readInt() != 0; 1049b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.localOnly = in.readInt() != 0; 1050348ad6866b91afa4d59d45df533ef88094c74d13Jeff Sharkey state.showAdvanced = in.readInt() != 0; 1051fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey state.stackTouched = in.readInt() != 0; 1052a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey state.restored = in.readInt() != 0; 1053b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey DurableUtils.readFromParcel(in, state.stack); 1054b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey state.currentSearch = in.readString(); 1055e20a3acdc2d52c7eeb76940206145b3c419394a6Jeff Sharkey in.readMap(state.dirState, null); 1056b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return state; 1057b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 1058b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 1059b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey @Override 1060b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public State[] newArray(int size) { 1061b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return new State[size]; 1062b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 1063b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey }; 10641482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey } 10651482789374fb8da3abea8f6f4f272a67205b95dbJeff Sharkey 1066dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey private void dumpStack() { 1067d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey Log.d(TAG, "Current stack: "); 1068d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey Log.d(TAG, " * " + mState.stack.root); 1069b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey for (DocumentInfo doc : mState.stack) { 1070d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey Log.d(TAG, " +-- " + doc); 1071dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 1072dc2963aecaf38bf53d6de82957412a486049c207Jeff Sharkey } 10739fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey 10749fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey public static DocumentsActivity get(Fragment fragment) { 10759fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey return (DocumentsActivity) fragment.getActivity(); 10769fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey } 10779e0036ed7d3260d79cc5f9ffd8e3bbe760699924Jeff Sharkey} 1078