DocumentsUI tablet support.

Shows as a faux dialog on larger tablets, since the normal dialog
themes from framework don't support action bars.  Instead, this hacks
itself to look like a dialog with an InsetDrawable.  Detects touches
in dim area to dismiss dialog.

Show all action bar icons on tablets, and roots panel is always
visible with a different shadow. Show settings in dialog. Allow mode
switches in recents.

Bug: 10329832
Change-Id: Id02982ce7b0d4694962d32f8d5286fdfcc207208
This commit is contained in:
Jeff Sharkey
2013-09-12 16:25:02 -07:00
parent 16dae5997b
commit 88f322c311
15 changed files with 451 additions and 93 deletions

View File

@@ -11,7 +11,7 @@
<!-- TODO: allow rotation when state saving is in better shape -->
<activity
android:name=".DocumentsActivity"
android:theme="@android:style/Theme.Holo.Light">
android:theme="@style/Theme">
<intent-filter android:priority="100">
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<category android:name="android.intent.category.DEFAULT" />
@@ -39,8 +39,8 @@
<activity
android:name=".SettingsActivity"
android:title="@string/menu_settings"
android:theme="@android:style/Theme.Holo.Light"
android:label="@string/menu_settings"
android:theme="@android:style/Theme.Holo.Light.DialogWhenLarge"
android:exported="false" />
<provider

View File

@@ -18,5 +18,5 @@
<item android:state_pressed="true" android:drawable="@color/item_root_activated" />
<item android:state_activated="true" android:drawable="@color/item_root_activated" />
<item android:state_focused="true" android:drawable="@color/item_root_activated" />
<item android:drawable="@android:color/white" />
<item android:drawable="@android:color/transparent" />
</selector>

View File

@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/item_background"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingTop="8dip"
android:paddingBottom="8dip"
android:orientation="horizontal">
<FrameLayout
android:id="@android:id/icon"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginStart="12dp"
android:layout_marginEnd="20dp"
android:layout_gravity="center_vertical">
<ImageView
android:id="@+id/icon_mime"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerInside"
android:contentDescription="@null" />
<ImageView
android:id="@+id/icon_thumb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:contentDescription="@null" />
</FrameLayout>
<LinearLayout
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@android:id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_marginEnd="12dp"
android:singleLine="true"
android:ellipsize="marquee"
android:textAlignment="viewStart"
style="@style/TextAppearance.Medium" />
<ImageView
android:id="@android:id/icon1"
android:layout_width="@dimen/root_icon_size"
android:layout_height="@dimen/root_icon_size"
android:layout_marginEnd="8dp"
android:scaleType="centerInside"
android:contentDescription="@null" />
<TextView
android:id="@android:id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.25"
android:layout_marginEnd="12dp"
android:singleLine="true"
android:ellipsize="marquee"
android:textAlignment="viewStart"
style="@style/TextAppearance.Small" />
<TextView
android:id="@+id/size"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.125"
android:layout_marginEnd="12dp"
android:minWidth="70dp"
android:singleLine="true"
android:ellipsize="marquee"
android:textAlignment="viewEnd"
style="@style/TextAppearance.Small" />
<TextView
android:id="@+id/date"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.125"
android:layout_marginEnd="12dp"
android:minWidth="70dp"
android:singleLine="true"
android:ellipsize="marquee"
android:textAlignment="viewEnd"
style="@style/TextAppearance.Small" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/dialog_roots">
<FrameLayout
android:id="@+id/container_roots"
android:layout_width="250dp"
android:layout_height="match_parent" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:scaleType="fitXY"
android:src="@drawable/ic_drawer_shadow_tablet" />
</FrameLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container_directory"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/container_save"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

View File

@@ -121,18 +121,6 @@
android:textAlignment="viewStart"
style="@style/TextAppearance.Small" />
<TextView
android:id="@android:id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:singleLine="true"
android:ellipsize="marquee"
android:textAlignment="viewStart"
style="@style/TextAppearance.Small" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<bool name="always_show_summary">true</bool>
</resources>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<bool name="show_as_dialog">true</bool>
<item type="dimen" name="dialog_width">85%</item>
<item type="dimen" name="dialog_height">90%</item>
</resources>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme" parent="@android:style/Theme.Holo.Light">
<item name="android:windowBackground">@*android:drawable/dialog_full_holo_light</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
</style>
</resources>

View File

@@ -19,4 +19,7 @@
<dimen name="root_icon_size">24dp</dimen>
<dimen name="grid_width">180dp</dimen>
<dimen name="grid_height">180dp</dimen>
<bool name="show_as_dialog">false</bool>
<bool name="always_show_summary">false</bool>
</resources>

View File

@@ -14,7 +14,7 @@
limitations under the License.
-->
<resources>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="TextAppearance" />
<style name="TextAppearance.Medium">
@@ -26,4 +26,8 @@
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
<item name="android:textColor">?android:attr/textColorTertiary</item>
</style>
<!-- Normally just a redirection, but this is used to make ourselves a
dialog on large tablets -->
<style name="Theme" parent="@android:style/Theme.Holo.Light" />
</resources>

View File

@@ -228,7 +228,9 @@ public class DirectoryFragment extends Fragment {
// Push latest state up to UI
// TODO: if mode change was racing with us, don't overwrite it
state.derivedMode = result.mode;
if (result.mode != MODE_UNKNOWN) {
state.derivedMode = result.mode;
}
state.derivedSortOrder = result.sortOrder;
((DocumentsActivity) context).onStateChanged();
@@ -254,8 +256,8 @@ public class DirectoryFragment extends Fragment {
}
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
updateDisplayState();
}
@@ -272,18 +274,20 @@ public class DirectoryFragment extends Fragment {
final RootInfo root = getArguments().getParcelable(EXTRA_ROOT);
final DocumentInfo doc = getArguments().getParcelable(EXTRA_DOC);
final Uri stateUri = RecentsProvider.buildState(
root.authority, root.rootId, doc.documentId);
final ContentValues values = new ContentValues();
values.put(StateColumns.MODE, state.userMode);
if (root != null) {
final Uri stateUri = RecentsProvider.buildState(
root.authority, root.rootId, doc.documentId);
final ContentValues values = new ContentValues();
values.put(StateColumns.MODE, state.userMode);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
resolver.insert(stateUri, values);
return null;
}
}.execute();
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
resolver.insert(stateUri, values);
return null;
}
}.execute();
}
// Mode change is just visual change; no need to kick loader, and
// deliver change event immediately.
@@ -733,23 +737,35 @@ public class DirectoryFragment extends Fragment {
icon1.setVisibility(View.VISIBLE);
icon1.setImageDrawable(iconDrawable);
if (iconDrawable != null && roots.isIconUnique(root)) {
// No summary needed if icon speaks for itself
summary.setVisibility(View.INVISIBLE);
} else {
summary.setText(root.getDirectoryString());
summary.setVisibility(View.VISIBLE);
summary.setTextAlignment(TextView.TEXT_ALIGNMENT_TEXT_END);
hasLine2 = true;
if (summary != null) {
final boolean alwaysShowSummary = getResources()
.getBoolean(R.bool.always_show_summary);
if (alwaysShowSummary) {
summary.setText(root.getDirectoryString());
summary.setVisibility(View.VISIBLE);
hasLine2 = true;
} else {
if (iconDrawable != null && roots.isIconUnique(root)) {
// No summary needed if icon speaks for itself
summary.setVisibility(View.INVISIBLE);
} else {
summary.setText(root.getDirectoryString());
summary.setVisibility(View.VISIBLE);
summary.setTextAlignment(TextView.TEXT_ALIGNMENT_TEXT_END);
hasLine2 = true;
}
}
}
} else {
icon1.setVisibility(View.GONE);
if (docSummary != null) {
summary.setText(docSummary);
summary.setVisibility(View.VISIBLE);
hasLine2 = true;
} else {
summary.setVisibility(View.INVISIBLE);
if (summary != null) {
if (docSummary != null) {
summary.setText(docSummary);
summary.setVisibility(View.VISIBLE);
hasLine2 = true;
} else {
summary.setVisibility(View.INVISIBLE);
}
}
}
@@ -772,7 +788,9 @@ public class DirectoryFragment extends Fragment {
size.setVisibility(View.GONE);
}
line2.setVisibility(hasLine2 ? View.VISIBLE : View.GONE);
if (line2 != null) {
line2.setVisibility(hasLine2 ? View.VISIBLE : View.GONE);
}
final boolean enabled = Document.MIME_TYPE_DIR.equals(docMimeType)
|| MimePredicate.mimeMatches(state.acceptMimes, docMimeType);

View File

@@ -22,7 +22,6 @@ import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE;
import static com.android.documentsui.DocumentsActivity.State.ACTION_OPEN;
import static com.android.documentsui.DocumentsActivity.State.MODE_GRID;
import static com.android.documentsui.DocumentsActivity.State.MODE_LIST;
import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
@@ -36,8 +35,12 @@ import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
@@ -51,19 +54,20 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnActionExpandListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.SearchView;
import android.widget.SearchView.OnCloseListener;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
import android.widget.Toast;
import com.android.documentsui.RecentsProvider.RecentColumns;
import com.android.documentsui.RecentsProvider.ResumeColumns;
import com.android.documentsui.RecentsProvider.StateColumns;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.DurableUtils;
@@ -79,15 +83,18 @@ import java.util.List;
public class DocumentsActivity extends Activity {
public static final String TAG = "Documents";
private SearchView mSearchView;
private View mRootsContainer;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private static final String EXTRA_STATE = "state";
private boolean mShowAsDialog;
private SearchView mSearchView;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private View mRootsContainer;
private boolean mIgnoreNextNavigation;
private boolean mIgnoreNextClose;
private boolean mIgnoreNextCollapse;
private RootsCache mRoots;
@@ -102,15 +109,60 @@ public class DocumentsActivity extends Activity {
setResult(Activity.RESULT_CANCELED);
setContentView(R.layout.activity);
mRootsContainer = findViewById(R.id.container_roots);
final Resources res = getResources();
mShowAsDialog = res.getBoolean(R.bool.show_as_dialog);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
if (mShowAsDialog) {
// backgroundDimAmount from theme isn't applied; do it manually
final WindowManager.LayoutParams a = getWindow().getAttributes();
a.dimAmount = 0.6f;
getWindow().setAttributes(a);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().setFlags(~0, WindowManager.LayoutParams.FLAG_DIM_BEHIND);
mDrawerLayout.setDrawerListener(mDrawerListener);
mDrawerLayout.setDrawerShadow(R.drawable.ic_drawer_shadow, GravityCompat.START);
// Inset ourselves to look like a dialog
final Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
final int width = (int) res.getFraction(R.dimen.dialog_width, size.x, size.x);
final int height = (int) res.getFraction(R.dimen.dialog_height, size.y, size.y);
final int insetX = (size.x - width) / 2;
final int insetY = (size.y - height) / 2;
final Drawable before = getWindow().getDecorView().getBackground();
final Drawable after = new InsetDrawable(before, insetX, insetY, insetX, insetY);
getWindow().getDecorView().setBackground(after);
// Dismiss when touch down in the dimmed inset area
getWindow().getDecorView().setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
final float x = event.getX();
final float y = event.getY();
if (x < insetX || x > v.getWidth() - insetX || y < insetY
|| y > v.getHeight() - insetY) {
finish();
return true;
}
}
return false;
}
});
} else {
// Non-dialog means we have a drawer
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
mDrawerLayout.setDrawerListener(mDrawerListener);
mDrawerLayout.setDrawerShadow(R.drawable.ic_drawer_shadow, GravityCompat.START);
mRootsContainer = findViewById(R.id.container_roots);
}
if (icicle != null) {
mState = icicle.getParcelable(EXTRA_STATE);
@@ -118,8 +170,13 @@ public class DocumentsActivity extends Activity {
buildDefaultState();
}
// Hide roots when we're managing a specific root
if (mState.action == ACTION_MANAGE) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
if (mShowAsDialog) {
findViewById(R.id.dialog_roots).setVisibility(View.GONE);
} else {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}
if (mState.action == ACTION_CREATE) {
@@ -210,14 +267,14 @@ public class DocumentsActivity extends Activity {
// Only open drawer when showing recents
if (mState.stack.isRecents()) {
mDrawerLayout.openDrawer(mRootsContainer);
setRootsDrawerOpen(true);
}
}
}
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
if (mState.action == ACTION_MANAGE) {
mState.showSize = true;
@@ -255,7 +312,27 @@ public class DocumentsActivity extends Activity {
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
if (mDrawerToggle != null) {
mDrawerToggle.syncState();
}
}
public void setRootsDrawerOpen(boolean open) {
if (!mShowAsDialog) {
if (open) {
mDrawerLayout.openDrawer(mRootsContainer);
} else {
mDrawerLayout.closeDrawer(mRootsContainer);
}
}
}
private boolean isRootsDrawerOpen() {
if (mShowAsDialog) {
return false;
} else {
return mDrawerLayout.isDrawerOpen(mRootsContainer);
}
}
public void updateActionBar() {
@@ -263,15 +340,13 @@ public class DocumentsActivity extends Activity {
actionBar.setDisplayShowHomeEnabled(true);
if (mState.action == ACTION_MANAGE) {
actionBar.setDisplayHomeAsUpEnabled(false);
mDrawerToggle.setDrawerIndicatorEnabled(false);
} else {
actionBar.setDisplayHomeAsUpEnabled(true);
mDrawerToggle.setDrawerIndicatorEnabled(true);
final boolean showIndicator = !mShowAsDialog && (mState.action != ACTION_MANAGE);
actionBar.setDisplayHomeAsUpEnabled(showIndicator);
if (mDrawerToggle != null) {
mDrawerToggle.setDrawerIndicatorEnabled(showIndicator);
}
if (mDrawerLayout.isDrawerOpen(mRootsContainer)) {
if (isRootsDrawerOpen()) {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setIcon(new ColorDrawable());
@@ -302,12 +377,20 @@ public class DocumentsActivity extends Activity {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity, menu);
// Actions are always visible when showing as dialog
if (mShowAsDialog) {
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
}
final MenuItem searchMenu = menu.findItem(R.id.menu_search);
mSearchView = (SearchView) searchMenu.getActionView();
mSearchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
mState.currentSearch = query;
mSearchView.clearFocus();
onCurrentDirectoryChanged();
return true;
}
@@ -337,6 +420,20 @@ public class DocumentsActivity extends Activity {
}
});
mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
if (mIgnoreNextClose) {
mIgnoreNextClose = false;
return false;
}
mState.currentSearch = null;
onCurrentDirectoryChanged();
return false;
}
});
return true;
}
@@ -356,7 +453,7 @@ public class DocumentsActivity extends Activity {
final MenuItem settings = menu.findItem(R.id.menu_settings);
// Open drawer means we hide most actions
if (mDrawerLayout.isDrawerOpen(mRootsContainer)) {
if (isRootsDrawerOpen()) {
createDir.setVisible(false);
search.setVisible(false);
sort.setVisible(false);
@@ -367,23 +464,24 @@ public class DocumentsActivity extends Activity {
return true;
}
if (cwd != null) {
sort.setVisible(true);
grid.setVisible(mState.derivedMode != MODE_GRID);
list.setVisible(mState.derivedMode != MODE_LIST);
} else {
sort.setVisible(false);
grid.setVisible(false);
list.setVisible(false);
}
sort.setVisible(cwd != null);
grid.setVisible(mState.derivedMode != MODE_GRID);
list.setVisible(mState.derivedMode != MODE_LIST);
if (mState.currentSearch != null) {
// Search uses backend ranking; no sorting
sort.setVisible(false);
search.expandActionView();
mSearchView.setIconified(false);
mSearchView.clearFocus();
mSearchView.setQuery(mState.currentSearch, false);
} else {
mIgnoreNextClose = true;
mSearchView.setIconified(true);
mSearchView.clearFocus();
mIgnoreNextCollapse = true;
search.collapseActionView();
}
@@ -418,7 +516,7 @@ public class DocumentsActivity extends Activity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
@@ -488,7 +586,7 @@ public class DocumentsActivity extends Activity {
if (size > 1) {
mState.stack.pop();
onCurrentDirectoryChanged();
} else if (size == 1 && !mDrawerLayout.isDrawerOpen(mRootsContainer)) {
} else if (size == 1 && !isRootsDrawerOpen()) {
// TODO: open root drawer once we can capture back key
super.onBackPressed();
} else {
@@ -614,6 +712,12 @@ public class DocumentsActivity extends Activity {
RecentsCreateFragment.show(fm);
} else {
DirectoryFragment.showRecentsOpen(fm);
// Start recents in relevant mode
final boolean acceptImages = MimePredicate.mimeMatches(
"image/*", mState.acceptMimes);
mState.userMode = acceptImages ? MODE_GRID : MODE_LIST;
mState.derivedMode = mState.userMode;
}
} else {
if (mState.currentSearch != null) {
@@ -666,7 +770,7 @@ public class DocumentsActivity extends Activity {
}
if (closeDrawer) {
mDrawerLayout.closeDrawers();
setRootsDrawerOpen(false);
}
}

View File

@@ -17,8 +17,6 @@
package com.android.documentsui;
import static com.android.documentsui.DocumentsActivity.TAG;
import static com.android.documentsui.DocumentsActivity.State.MODE_GRID;
import static com.android.documentsui.DocumentsActivity.State.MODE_LIST;
import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
import android.content.AsyncTaskLoader;
@@ -194,9 +192,6 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
}
final DirectoryResult result = new DirectoryResult();
final boolean acceptImages = MimePredicate.mimeMatches("image/*", mAcceptMimes);
result.mode = acceptImages ? MODE_GRID : MODE_LIST;
result.sortOrder = SORT_ORDER_LAST_MODIFIED;
if (cursors.size() > 0) {

View File

@@ -86,8 +86,8 @@ public class RootsFragment extends Fragment {
}
@Override
public void onStart() {
super.onStart();
public void onResume() {
super.onResume();
updateRootsAdapter();
}

View File

@@ -16,6 +16,7 @@
package com.android.documentsui;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
@@ -39,8 +40,14 @@ public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager()
.beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
final ActionBar bar = getActionBar();
if (bar != null) {
bar.setDisplayShowHomeEnabled(false);
}
}
public static class SettingsFragment extends PreferenceFragment {