summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steve McKay <smckay@google.com> 2015-09-16 15:07:31 -0700
committer Steve McKay <smckay@google.com> 2015-09-23 12:25:13 -0700
commit83df8c072ddd01a5adc11da0869103c4645e6d76 (patch)
tree8815d0d8c9412976810bdd772587e7c6ad5f0a3e
parentbf5d95da0d3e4a90fd9b4f705ed697714b28f0a8 (diff)
Merge BROWSE and BROWSE_ALL actions.
Open Files app when exploring from settings. Force visibility of file size in this mode. Don't hide empty media providers. Bug: 24136618, 24140864 Change-Id: I6f238586725f9b6255812e3082bb8d8655219a7d
-rw-r--r--core/java/android/os/storage/VolumeInfo.java2
-rw-r--r--core/java/android/provider/DocumentsContract.java5
-rw-r--r--packages/DocumentsUI/AndroidManifest.xml10
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java52
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java25
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java69
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java55
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java2
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RootsCache.java29
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/Shared.java2
10 files changed, 105 insertions, 146 deletions
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index 688859479713..c368e5a24a1b 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -438,6 +438,8 @@ public class VolumeInfo implements Parcelable {
final Intent intent = new Intent(DocumentsContract.ACTION_BROWSE_DOCUMENT_ROOT);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(uri);
+ intent.putExtra(DocumentsContract.EXTRA_SHOW_FILESIZE, true);
+ intent.putExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, true);
return intent;
}
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 59609f94546a..1a83cd567dc0 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -93,6 +93,9 @@ public final class DocumentsContract {
public static final String EXTRA_SHOW_ADVANCED = "android.content.extra.SHOW_ADVANCED";
/** {@hide} */
+ public static final String EXTRA_SHOW_FILESIZE = "android.content.extra.SHOW_FILESIZE";
+
+ /** {@hide} */
public static final String EXTRA_TARGET_URI = "android.content.extra.TARGET_URI";
/**
@@ -266,7 +269,7 @@ public final class DocumentsContract {
* writability of a document may change over time, for example due to
* remote access changes. This flag indicates that a document client can
* expect {@link ContentResolver#openOutputStream(Uri)} to succeed.
- *
+ *
* @see #COLUMN_FLAGS
*/
public static final int FLAG_SUPPORTS_WRITE = 1 << 1;
diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml
index 97bc8fd4d1f4..ac6f950a0a82 100644
--- a/packages/DocumentsUI/AndroidManifest.xml
+++ b/packages/DocumentsUI/AndroidManifest.xml
@@ -35,11 +35,6 @@
<action android:name="android.intent.action.OPEN_DOCUMENT_TREE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
- <intent-filter>
- <action android:name="android.provider.action.BROWSE_DOCUMENT_ROOT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.document/root" />
- </intent-filter>
</activity>
<activity
@@ -63,6 +58,11 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
+ <intent-filter>
+ <action android:name="android.provider.action.BROWSE_DOCUMENT_ROOT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.document/root" />
+ </intent-filter>
</activity>
<provider
diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
index 4d0a7eb67483..1585908e5639 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
@@ -16,13 +16,6 @@
package com.android.documentsui;
-import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE;
-import static com.android.documentsui.BaseActivity.State.ACTION_CREATE;
-import static com.android.documentsui.BaseActivity.State.ACTION_GET_CONTENT;
-import static com.android.documentsui.BaseActivity.State.ACTION_MANAGE;
-import static com.android.documentsui.BaseActivity.State.ACTION_OPEN;
-import static com.android.documentsui.BaseActivity.State.ACTION_OPEN_COPY_DESTINATION;
-import static com.android.documentsui.BaseActivity.State.ACTION_OPEN_TREE;
import static com.android.documentsui.DirectoryFragment.ANIM_DOWN;
import static com.android.documentsui.DirectoryFragment.ANIM_NONE;
import static com.android.documentsui.DirectoryFragment.ANIM_SIDE;
@@ -125,22 +118,6 @@ abstract class BaseActivity extends Activity {
}
@Override
- public void onResume() {
- super.onResume();
-
- final State state = getDisplayState();
- final RootInfo root = getCurrentRoot();
-
- // If we're browsing a specific root, and that root went away, then we
- // have no reason to hang around
- if (state.action == State.ACTION_BROWSE && root != null) {
- if (mRoots.getRootBlocking(root.authority, root.rootId) == null) {
- finish();
- }
- }
- }
-
- @Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean showMenu = super.onCreateOptionsMenu(menu);
@@ -178,8 +155,10 @@ abstract class BaseActivity extends Activity {
State state = getDisplayState();
sortSize.setVisible(state.showSize); // Only sort by size when visible
+ fileSize.setVisible(!state.showSize);
grid.setVisible(state.derivedMode != State.MODE_GRID);
list.setVisible(state.derivedMode != State.MODE_LIST);
+ advanced.setVisible(!mState.showAdvanced);
settings.setVisible((root.flags & Root.FLAG_HAS_SETTINGS) != 0);
return shown;
@@ -189,13 +168,17 @@ abstract class BaseActivity extends Activity {
State state = new State();
final Intent intent = getIntent();
- final String action = intent.getAction();
state.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
+
+ state.forceSize = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_FILESIZE, false);
+ state.showSize = state.forceSize || LocalPreferences.getDisplayFileSize(this);
+
state.forceAdvanced = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false);
- state.showAdvanced = state.forceAdvanced ||
- LocalPreferences.getDisplayAdvancedDevices(this);
+ state.showAdvanced = state.forceAdvanced
+ || LocalPreferences.getDisplayAdvancedDevices(this);
+ state.initAcceptMimes(intent);
state.excludedAuthorities = getExcludedAuthorities();
return state;
@@ -219,7 +202,7 @@ abstract class BaseActivity extends Activity {
if (mRoots.isRecentsRoot(root)) {
onCurrentDirectoryChanged(ANIM_SIDE);
} else {
- new PickRootTask(root).executeOnExecutor(getCurrentExecutor());
+ new PickRootTask(root).executeOnExecutor(getExecutorForCurrentDirectory());
}
}
@@ -399,6 +382,7 @@ abstract class BaseActivity extends Activity {
public int derivedSortOrder = SORT_ORDER_DISPLAY_NAME;
public boolean allowMultiple;
+ public boolean forceSize ;
public boolean showSize;
public boolean localOnly ;
public boolean forceAdvanced ;
@@ -429,7 +413,6 @@ abstract class BaseActivity extends Activity {
public static final int ACTION_OPEN_TREE = 4;
public static final int ACTION_MANAGE = 5;
public static final int ACTION_BROWSE = 6;
- public static final int ACTION_BROWSE_ALL = 7;
public static final int ACTION_OPEN_COPY_DESTINATION = 8;
public static final int MODE_UNKNOWN = 0;
@@ -441,6 +424,15 @@ abstract class BaseActivity extends Activity {
public static final int SORT_ORDER_LAST_MODIFIED = 2;
public static final int SORT_ORDER_SIZE = 3;
+ public void initAcceptMimes(Intent intent) {
+ if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
+ acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
+ } else {
+ String glob = intent.getType();
+ acceptMimes = new String[] { glob != null ? glob : "*/*" };
+ }
+ }
+
@Override
public int describeContents() {
return 0;
@@ -453,6 +445,7 @@ abstract class BaseActivity extends Activity {
out.writeStringArray(acceptMimes);
out.writeInt(userSortOrder);
out.writeInt(allowMultiple ? 1 : 0);
+ out.writeInt(forceSize ? 1 : 0);
out.writeInt(showSize ? 1 : 0);
out.writeInt(localOnly ? 1 : 0);
out.writeInt(forceAdvanced ? 1 : 0);
@@ -475,6 +468,7 @@ abstract class BaseActivity extends Activity {
state.acceptMimes = in.readStringArray();
state.userSortOrder = in.readInt();
state.allowMultiple = in.readInt() != 0;
+ state.forceSize = in.readInt() != 0;
state.showSize = in.readInt() != 0;
state.localOnly = in.readInt() != 0;
state.forceAdvanced = in.readInt() != 0;
@@ -562,7 +556,7 @@ abstract class BaseActivity extends Activity {
return getDisplayState().stack.peek();
}
- public Executor getCurrentExecutor() {
+ public Executor getExecutorForCurrentDirectory() {
final DocumentInfo cwd = getCurrentDirectory();
if (cwd != null && cwd.authority != null) {
return ProviderExecutor.forAuthority(cwd.authority);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 1a17b6c63997..ea8ecf54f31c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -17,7 +17,6 @@
package com.android.documentsui;
import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE;
-import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE_ALL;
import static com.android.documentsui.BaseActivity.State.ACTION_CREATE;
import static com.android.documentsui.BaseActivity.State.ACTION_MANAGE;
import static com.android.documentsui.BaseActivity.State.MODE_GRID;
@@ -101,7 +100,6 @@ import com.android.documentsui.RecentsProvider.StateColumns;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.RootInfo;
-import com.android.internal.util.Preconditions;
import com.google.common.collect.Lists;
@@ -1554,9 +1552,9 @@ public class DirectoryFragment extends Fragment {
}
private FragmentTuner pickFragmentTuner(final State state) {
- return state.action == ACTION_BROWSE_ALL
+ return state.action == ACTION_BROWSE
? new FilesTuner()
- : new DefaultTuner(state);
+ : new DefaultTuner(state.action);
}
/**
@@ -1593,15 +1591,14 @@ public class DirectoryFragment extends Fragment {
*/
private static final class DefaultTuner implements FragmentTuner {
- private final State mState;
+ private final boolean mManaging;
- public DefaultTuner(State state) {
- mState = state;
+ public DefaultTuner(int action) {
+ mManaging = (action == ACTION_MANAGE);
}
@Override
public void updateActionMenu(Menu menu, int dirType, boolean canDelete) {
- Preconditions.checkState(mState.action != ACTION_BROWSE_ALL);
final MenuItem open = menu.findItem(R.id.menu_open);
final MenuItem share = menu.findItem(R.id.menu_share);
@@ -1610,14 +1607,11 @@ public class DirectoryFragment extends Fragment {
final MenuItem moveTo = menu.findItem(R.id.menu_move_to);
final MenuItem copyToClipboard = menu.findItem(R.id.menu_copy_to_clipboard);
- final boolean manageOrBrowse = (mState.action == ACTION_MANAGE
- || mState.action == ACTION_BROWSE);
-
- open.setVisible(!manageOrBrowse);
- share.setVisible(manageOrBrowse);
- delete.setVisible(manageOrBrowse && canDelete);
+ open.setVisible(!mManaging);
+ share.setVisible(mManaging);
+ delete.setVisible(mManaging && canDelete);
// Disable copying from the Recents view.
- copyTo.setVisible(manageOrBrowse && dirType != TYPE_RECENT_OPEN);
+ copyTo.setVisible(mManaging && dirType != TYPE_RECENT_OPEN);
moveTo.setVisible(SystemProperties.getBoolean("debug.documentsui.enable_move", false));
// Only shown in files mode.
@@ -1634,6 +1628,7 @@ public class DirectoryFragment extends Fragment {
private static final class FilesTuner implements FragmentTuner {
@Override
public void updateActionMenu(Menu menu, int dirType, boolean canDelete) {
+
menu.findItem(R.id.menu_share).setVisible(true);
menu.findItem(R.id.menu_delete).setVisible(canDelete);
menu.findItem(R.id.menu_copy_to_clipboard).setVisible(true);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 8b2b4f2dc6ae..dbfcf407e6bd 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -16,7 +16,6 @@
package com.android.documentsui;
-import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE;
import static com.android.documentsui.BaseActivity.State.ACTION_CREATE;
import static com.android.documentsui.BaseActivity.State.ACTION_GET_CONTENT;
import static com.android.documentsui.BaseActivity.State.ACTION_OPEN;
@@ -28,7 +27,6 @@ import static com.android.documentsui.DirectoryFragment.ANIM_NONE;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
-import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ComponentName;
import android.content.ContentProviderClient;
@@ -44,7 +42,6 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.Root;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -87,7 +84,7 @@ public class DocumentsActivity extends BaseActivity {
super.onCreate(icicle);
final Resources res = getResources();
- mShowAsDialog = res.getBoolean(R.bool.show_as_dialog) && mState.action != ACTION_BROWSE;
+ mShowAsDialog = res.getBoolean(R.bool.show_as_dialog);
if (!mShowAsDialog) {
setTheme(R.style.DocumentsNonDialogTheme);
@@ -123,14 +120,6 @@ public class DocumentsActivity extends BaseActivity {
setActionBar(mToolbar);
- // Hide roots when we're managing a specific root
- if (mState.action == ACTION_BROWSE) {
- mDrawer.lockClosed();
- if (mShowAsDialog) {
- findViewById(R.id.container_roots).setVisibility(View.GONE);
- }
- }
-
if (mState.action == ACTION_CREATE) {
final String mimeType = getIntent().getType();
final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
@@ -156,12 +145,7 @@ public class DocumentsActivity extends BaseActivity {
// In this case, we set the activity title in AsyncTask.onPostExecute(). To prevent
// talkback from reading aloud the default title, we clear it here.
setTitle("");
- if (mState.action == ACTION_BROWSE) {
- final Uri rootUri = getIntent().getData();
- new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor());
- } else {
- new RestoreStackTask().execute();
- }
+ new RestoreStackTask().execute();
} else {
onCurrentDirectoryChanged(ANIM_NONE);
}
@@ -181,8 +165,6 @@ public class DocumentsActivity extends BaseActivity {
state.action = ACTION_GET_CONTENT;
} else if (Intent.ACTION_OPEN_DOCUMENT_TREE.equals(action)) {
state.action = ACTION_OPEN_TREE;
- } else if (DocumentsContract.ACTION_BROWSE_DOCUMENT_ROOT.equals(action)) {
- state.action = ACTION_BROWSE;
} else if (DocumentsIntent.ACTION_OPEN_COPY_DESTINATION.equals(action)) {
state.action = ACTION_OPEN_COPY_DESTINATION;
}
@@ -192,20 +174,6 @@ public class DocumentsActivity extends BaseActivity {
Intent.EXTRA_ALLOW_MULTIPLE, false);
}
- if (state.action == ACTION_BROWSE) {
- state.acceptMimes = new String[] { "*/*" };
- state.allowMultiple = true;
- } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
- state.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
- } else {
- state.acceptMimes = new String[] { intent.getType() };
- }
-
- if (state.action == ACTION_BROWSE) {
- state.showSize = true;
- } else {
- state.showSize = LocalPreferences.getDisplayFileSize(this);
- }
if (state.action == ACTION_OPEN_COPY_DESTINATION) {
state.directoryCopy = intent.getBooleanExtra(
BaseActivity.DocumentsIntent.EXTRA_DIRECTORY_COPY, false);
@@ -357,11 +325,7 @@ public class DocumentsActivity extends BaseActivity {
final MenuItem fileSize = menu.findItem(R.id.menu_file_size);
final MenuItem settings = menu.findItem(R.id.menu_settings);
- // File size is locked visible for browse because that is the action triggered by Settings,
- // where the user is trying to find large files to clean up.
- // TODO: instead of setting this according to the action, use a local preference, but
- // provide a @hide extra to let callers like Settings force-enable size visibility.
- boolean fileSizeVisible = mState.action != ACTION_BROWSE;
+ boolean fileSizeVisible = mState.showSize && !mState.forceSize;
if (mState.action == ACTION_CREATE
|| mState.action == ACTION_OPEN_TREE
|| mState.action == ACTION_OPEN_COPY_DESTINATION) {
@@ -383,11 +347,9 @@ public class DocumentsActivity extends BaseActivity {
createDir.setVisible(false);
}
- advanced.setVisible(mState.action != ACTION_BROWSE && !mState.forceAdvanced);
+ advanced.setVisible(!mState.forceAdvanced);
fileSize.setVisible(fileSizeVisible);
-
- settings.setVisible(mState.action == ACTION_BROWSE
- && (root.flags & Root.FLAG_HAS_SETTINGS) != 0);
+ settings.setVisible(false);
return true;
}
@@ -446,11 +408,11 @@ public class DocumentsActivity extends BaseActivity {
}
void onSaveRequested(DocumentInfo replaceTarget) {
- new ExistingFinishTask(replaceTarget.derivedUri).executeOnExecutor(getCurrentExecutor());
+ new ExistingFinishTask(replaceTarget.derivedUri).executeOnExecutor(getExecutorForCurrentDirectory());
}
void onSaveRequested(String mimeType, String displayName) {
- new CreateFinishTask(mimeType, displayName).executeOnExecutor(getCurrentExecutor());
+ new CreateFinishTask(mimeType, displayName).executeOnExecutor(getExecutorForCurrentDirectory());
}
@Override
@@ -466,21 +428,10 @@ public class DocumentsActivity extends BaseActivity {
openDirectory(doc);
} else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
// Explicit file picked, return
- new ExistingFinishTask(doc.derivedUri).executeOnExecutor(getCurrentExecutor());
+ new ExistingFinishTask(doc.derivedUri).executeOnExecutor(getExecutorForCurrentDirectory());
} else if (mState.action == ACTION_CREATE) {
// Replace selected file
SaveFragment.get(fm).setReplaceTarget(doc);
- } else if (mState.action == ACTION_BROWSE) {
- // Go straight to viewing
- final Intent view = new Intent(Intent.ACTION_VIEW);
- view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- view.setData(doc.derivedUri);
-
- try {
- startActivity(view);
- } catch (ActivityNotFoundException ex) {
- Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show();
- }
}
}
@@ -492,7 +443,7 @@ public class DocumentsActivity extends BaseActivity {
for (int i = 0; i < size; i++) {
uris[i] = docs.get(i).derivedUri;
}
- new ExistingFinishTask(uris).executeOnExecutor(getCurrentExecutor());
+ new ExistingFinishTask(uris).executeOnExecutor(getExecutorForCurrentDirectory());
}
}
@@ -507,7 +458,7 @@ public class DocumentsActivity extends BaseActivity {
// Should not be reached.
throw new IllegalStateException("Invalid mState.action.");
}
- new PickFinishTask(result).executeOnExecutor(getCurrentExecutor());
+ new PickFinishTask(result).executeOnExecutor(getExecutorForCurrentDirectory());
}
@Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
index c1362c87e620..7e9531b777fa 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
@@ -16,8 +16,9 @@
package com.android.documentsui;
-import static com.android.documentsui.DirectoryFragment.ANIM_DOWN;
import static com.android.documentsui.DirectoryFragment.ANIM_NONE;
+import static com.android.documentsui.Shared.DEBUG;
+import static com.android.internal.util.Preconditions.checkArgument;
import android.app.Activity;
import android.app.FragmentManager;
@@ -25,11 +26,9 @@ import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.ContentValues;
-import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.provider.DocumentsContract;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.KeyEvent;
@@ -46,7 +45,6 @@ import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.DurableUtils;
import com.android.documentsui.model.RootInfo;
-import com.android.internal.util.Preconditions;
import java.util.ArrayList;
import java.util.Arrays;
@@ -58,7 +56,6 @@ import java.util.List;
public class FilesActivity extends BaseActivity {
public static final String TAG = "FilesActivity";
- static final boolean DEBUG = false;
private Toolbar mToolbar;
private Spinner mToolbarStack;
@@ -74,8 +71,6 @@ public class FilesActivity extends BaseActivity {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- final Context context = this;
-
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mStackAdapter = new StackAdapter();
@@ -90,7 +85,16 @@ public class FilesActivity extends BaseActivity {
RootsFragment.show(getFragmentManager(), null);
if (!mState.restored) {
- new RestoreStackTask().execute();
+ Uri rootUri = getIntent().getData();
+
+ // If we've got a specific root to display, restore that root using a dedicated
+ // authority. That way a misbehaving provider won't result in an ANR.
+ if (rootUri != null) {
+ new RestoreRootTask(rootUri).executeOnExecutor(
+ ProviderExecutor.forAuthority(rootUri.getAuthority()));
+ } else {
+ new RestoreStackTask().execute();
+ }
// Show a failure dialog if there was a failed operation.
final Intent intent = getIntent();
@@ -115,22 +119,16 @@ public class FilesActivity extends BaseActivity {
final Intent intent = getIntent();
- state.action = State.ACTION_BROWSE_ALL;
- state.acceptMimes = new String[] { intent.getType() };
+ state.action = State.ACTION_BROWSE;
state.allowMultiple = true;
- // These options are specific to the DocumentsActivity.
- Preconditions.checkArgument(
- !intent.hasExtra(Intent.EXTRA_LOCAL_ONLY));
- Preconditions.checkArgument(
- !intent.hasExtra(DocumentsContract.EXTRA_SHOW_ADVANCED));
-
- state.showAdvanced = LocalPreferences.getDisplayAdvancedDevices(this);
- state.showSize = LocalPreferences.getDisplayFileSize(this);
+ // Options specific to the DocumentsActivity.
+ checkArgument(!intent.hasExtra(Intent.EXTRA_LOCAL_ONLY));
final DocumentStack stack = intent.getParcelableExtra(CopyService.EXTRA_STACK);
- if (stack != null)
+ if (stack != null) {
state.stack = stack;
+ }
return state;
}
@@ -142,6 +140,21 @@ public class FilesActivity extends BaseActivity {
}
@Override
+ public void onResume() {
+ super.onResume();
+
+ final RootInfo root = getCurrentRoot();
+
+ // If we're browsing a specific root, and that root went away, then we
+ // have no reason to hang around.
+ // TODO: Rather than just disappearing, maybe we should inform
+ // the user what has happened, let them close us. Less surprising.
+ if (mRoots.getRootBlocking(root.authority, root.rootId) == null) {
+ finish();
+ }
+ }
+
+ @Override
public void updateActionBar() {
final RootInfo root = getCurrentRoot();
@@ -194,12 +207,8 @@ public class FilesActivity extends BaseActivity {
public boolean onPrepareOptionsMenu(Menu menu) {
boolean shown = super.onPrepareOptionsMenu(menu);
- menu.findItem(R.id.menu_file_size).setVisible(true);
- menu.findItem(R.id.menu_advanced).setVisible(true);
-
final MenuItem pasteFromCb = menu.findItem(R.id.menu_paste_from_clipboard);
final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
- final MenuItem settings = menu.findItem(R.id.menu_settings);
boolean canCreateDir = canCreateDirectory();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java b/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java
index 798992b470e3..f5b1d8e67dd4 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/ManageRootActivity.java
@@ -87,7 +87,7 @@ public class ManageRootActivity extends BaseActivity {
// talkback from reading aloud the default title, we clear it here.
setTitle("");
final Uri rootUri = getIntent().getData();
- new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor());
+ new RestoreRootTask(rootUri).executeOnExecutor(getExecutorForCurrentDirectory());
} else {
onCurrentDirectoryChanged(ANIM_NONE);
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index 05f7d8dd11e3..cb46bca741a1 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -17,6 +17,7 @@
package com.android.documentsui;
import static com.android.documentsui.Shared.TAG;
+import static com.android.documentsui.Shared.DEBUG;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
@@ -58,8 +59,6 @@ import java.util.concurrent.TimeUnit;
* Cache of known storage backends and their roots.
*/
public class RootsCache {
- private static final boolean LOGD = false;
-
public static final Uri sNotificationUri = Uri.parse(
"content://com.android.documentsui.roots/");
@@ -91,7 +90,7 @@ public class RootsCache {
@Override
public void onChange(boolean selfChange, Uri uri) {
- if (LOGD) Log.d(TAG, "Updating roots due to change at " + uri);
+ if (DEBUG) Log.d(TAG, "Updating roots due to change at " + uri);
updateAuthorityAsync(uri.getAuthority());
}
}
@@ -148,7 +147,7 @@ public class RootsCache {
final ContentResolver resolver = mContext.getContentResolver();
synchronized (mLock) {
for (String authority : mStoppedAuthorities) {
- if (LOGD) Log.d(TAG, "Loading stopped authority " + authority);
+ if (DEBUG) Log.d(TAG, "Loading stopped authority " + authority);
mRoots.putAll(authority, loadRootsForAuthority(resolver, authority));
}
mStoppedAuthorities.clear();
@@ -199,7 +198,8 @@ public class RootsCache {
}
final long delta = SystemClock.elapsedRealtime() - start;
- Log.d(TAG, "Update found " + mTaskRoots.size() + " roots in " + delta + "ms");
+ if (DEBUG)
+ Log.d(TAG, "Update found " + mTaskRoots.size() + " roots in " + delta + "ms");
synchronized (mLock) {
mRoots = mTaskRoots;
mStoppedAuthorities = mTaskStoppedAuthorities;
@@ -213,7 +213,7 @@ public class RootsCache {
// Ignore stopped packages for now; we might query them
// later during UI interaction.
if ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) {
- if (LOGD) Log.d(TAG, "Ignoring stopped authority " + info.authority);
+ if (DEBUG) Log.d(TAG, "Ignoring stopped authority " + info.authority);
mTaskStoppedAuthorities.add(info.authority);
return;
}
@@ -223,7 +223,7 @@ public class RootsCache {
if (mFilterPackage != null && !mFilterPackage.equals(info.packageName)) {
synchronized (mLock) {
if (mTaskRoots.putAll(info.authority, mRoots.get(info.authority))) {
- if (LOGD) Log.d(TAG, "Used cached roots for " + info.authority);
+ if (DEBUG) Log.d(TAG, "Used cached roots for " + info.authority);
cacheHit = true;
}
}
@@ -241,7 +241,7 @@ public class RootsCache {
* Bring up requested provider and query for all active roots.
*/
private Collection<RootInfo> loadRootsForAuthority(ContentResolver resolver, String authority) {
- if (LOGD) Log.d(TAG, "Loading roots for " + authority);
+ if (DEBUG) Log.d(TAG, "Loading roots for " + authority);
synchronized (mObservedAuthorities) {
if (mObservedAuthorities.add(authority)) {
@@ -370,10 +370,15 @@ public class RootsCache {
// Exclude downloads roots that don't support directory creation
// TODO: Add flag to check the root supports directory creation or not.
if (state.directoryCopy && root.isDownloads()) continue;
- // Only show empty roots when creating
- if ((state.action != State.ACTION_CREATE ||
+
+ // Only show empty roots when creating, or in browse mode.
+ if (empty && (state.action != State.ACTION_BROWSE ||
+ state.action != State.ACTION_CREATE ||
state.action != State.ACTION_OPEN_TREE ||
- state.action != State.ACTION_OPEN_COPY_DESTINATION) && empty) continue;
+ state.action != State.ACTION_OPEN_COPY_DESTINATION)) {
+ if (DEBUG) Log.i(TAG, "Skipping empty root: " + root);
+ continue;
+ }
// Only include roots that serve requested content
final boolean overlap =
@@ -385,7 +390,7 @@ public class RootsCache {
// Exclude roots from the calling package.
if (state.excludedAuthorities.contains(root.authority)) {
- if (LOGD) Log.d(TAG, "Excluding root " + root.authority + " from calling package.");
+ if (DEBUG) Log.d(TAG, "Excluding root " + root.authority + " from calling package.");
continue;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java
index 0c1ebc16f1df..9c884d4ef8c6 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/Shared.java
@@ -22,7 +22,7 @@ import android.content.Context;
* @hide
*/
public final class Shared {
- public static final boolean DEBUG = false;
+ public static final boolean DEBUG = true;
public static final String TAG = "Documents";
/**