summaryrefslogtreecommitdiffstats
path: root/packages/DocumentsUI
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-09-12 16:25:02 -0700
committerJeff Sharkey <jsharkey@android.com>2013-09-12 16:39:50 -0700
commit88f322c3115e85bb96fb46f9192b5daecd472c64 (patch)
treeec11ce7f6eeeb706df63f675ff3537adf2898751 /packages/DocumentsUI
parent16dae5997bb0ff7f03d5a0ccfdc4be94aa35ba51 (diff)
downloadframeworks_base-88f322c3115e85bb96fb46f9192b5daecd472c64.zip
frameworks_base-88f322c3115e85bb96fb46f9192b5daecd472c64.tar.gz
frameworks_base-88f322c3115e85bb96fb46f9192b5daecd472c64.tar.bz2
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
Diffstat (limited to 'packages/DocumentsUI')
-rw-r--r--packages/DocumentsUI/AndroidManifest.xml6
-rw-r--r--packages/DocumentsUI/res/drawable/item_root.xml2
-rw-r--r--packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml115
-rw-r--r--packages/DocumentsUI/res/layout-sw720dp/activity.xml60
-rw-r--r--packages/DocumentsUI/res/layout/item_doc_grid.xml12
-rw-r--r--packages/DocumentsUI/res/values-sw720dp-land/dimens.xml19
-rw-r--r--packages/DocumentsUI/res/values-sw720dp/dimens.xml22
-rw-r--r--packages/DocumentsUI/res/values-sw720dp/styles.xml23
-rw-r--r--packages/DocumentsUI/res/values/dimens.xml3
-rw-r--r--packages/DocumentsUI/res/values/styles.xml6
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java78
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java178
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java5
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java4
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/SettingsActivity.java7
15 files changed, 449 insertions, 91 deletions
diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml
index 4c91bd3..1ef7bff 100644
--- a/packages/DocumentsUI/AndroidManifest.xml
+++ b/packages/DocumentsUI/AndroidManifest.xml
@@ -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
diff --git a/packages/DocumentsUI/res/drawable/item_root.xml b/packages/DocumentsUI/res/drawable/item_root.xml
index 183d273..6f201cc 100644
--- a/packages/DocumentsUI/res/drawable/item_root.xml
+++ b/packages/DocumentsUI/res/drawable/item_root.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
new file mode 100644
index 0000000..3bea166
--- /dev/null
+++ b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/layout-sw720dp/activity.xml b/packages/DocumentsUI/res/layout-sw720dp/activity.xml
new file mode 100644
index 0000000..584a44d
--- /dev/null
+++ b/packages/DocumentsUI/res/layout-sw720dp/activity.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml
index eea90b5..3cfae64 100644
--- a/packages/DocumentsUI/res/layout/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml b/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml
new file mode 100644
index 0000000..961608c
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/values-sw720dp/dimens.xml b/packages/DocumentsUI/res/values-sw720dp/dimens.xml
new file mode 100644
index 0000000..3be243a
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sw720dp/dimens.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/values-sw720dp/styles.xml b/packages/DocumentsUI/res/values-sw720dp/styles.xml
new file mode 100644
index 0000000..4ff1c60
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sw720dp/styles.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/values/dimens.xml b/packages/DocumentsUI/res/values/dimens.xml
index e5b5b4e..25b0f84 100644
--- a/packages/DocumentsUI/res/values/dimens.xml
+++ b/packages/DocumentsUI/res/values/dimens.xml
@@ -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>
diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml
index 59fbd6f..945e7ae 100644
--- a/packages/DocumentsUI/res/values/styles.xml
+++ b/packages/DocumentsUI/res/values/styles.xml
@@ -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>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index ba5a511..b2981db 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -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);
-
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- resolver.insert(stateUri, values);
- return null;
- }
- }.execute();
+ 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();
+ }
// 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);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index e89d388..eb51fb5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -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 static final String EXTRA_STATE = "state";
+
+ private boolean mShowAsDialog;
+
private SearchView mSearchView;
- private View mRootsContainer;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
-
- private static final String EXTRA_STATE = "state";
+ 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);
+
+ if (mShowAsDialog) {
+ // backgroundDimAmount from theme isn't applied; do it manually
+ final WindowManager.LayoutParams a = getWindow().getAttributes();
+ a.dimAmount = 0.6f;
+ getWindow().setAttributes(a);
+
+ getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
+ getWindow().setFlags(~0, WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+
+ // 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);
- mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+ R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
- 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);
- 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);
}
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
index 57442a0..a7173b6 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
@@ -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) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
index f3a21c6..54dcf1c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
@@ -86,8 +86,8 @@ public class RootsFragment extends Fragment {
}
@Override
- public void onStart() {
- super.onStart();
+ public void onResume() {
+ super.onResume();
updateRootsAdapter();
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SettingsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/SettingsActivity.java
index ceeaaae..a85f6a9 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/SettingsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/SettingsActivity.java
@@ -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 {