summaryrefslogtreecommitdiffstats
path: root/packages/DocumentsUI
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-09-04 04:34:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-04 04:34:18 +0000
commit5b3f4aa84fe3f97075f4ed0763c9ee8a3dd2065d (patch)
treefa65dc79b64cc5e19df6cb6776e21a2432a9fa87 /packages/DocumentsUI
parent100558ec646f729fd59ad7cec161febb8d09dac3 (diff)
parent954be0232655d316bc5decbbd35579af902c75c2 (diff)
downloadframeworks_base-5b3f4aa84fe3f97075f4ed0763c9ee8a3dd2065d.zip
frameworks_base-5b3f4aa84fe3f97075f4ed0763c9ee8a3dd2065d.tar.gz
frameworks_base-5b3f4aa84fe3f97075f4ed0763c9ee8a3dd2065d.tar.bz2
Merge "Show loading, error, and info messages as footers." into klp-dev
Diffstat (limited to 'packages/DocumentsUI')
-rw-r--r--packages/DocumentsUI/res/layout/item_loading.xml34
-rw-r--r--packages/DocumentsUI/res/layout/item_message_grid.xml59
-rw-r--r--packages/DocumentsUI/res/layout/item_message_list.xml47
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java108
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java3
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java7
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java6
7 files changed, 259 insertions, 5 deletions
diff --git a/packages/DocumentsUI/res/layout/item_loading.xml b/packages/DocumentsUI/res/layout/item_loading.xml
new file mode 100644
index 0000000..7da71e3
--- /dev/null
+++ b/packages/DocumentsUI/res/layout/item_loading.xml
@@ -0,0 +1,34 @@
+<?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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:paddingTop="8dip"
+ android:paddingBottom="8dip"
+ android:orientation="horizontal">
+
+ <ProgressBar
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:indeterminate="true"
+ style="?android:attr/progressBarStyle" />
+
+</FrameLayout>
diff --git a/packages/DocumentsUI/res/layout/item_message_grid.xml b/packages/DocumentsUI/res/layout/item_message_grid.xml
new file mode 100644
index 0000000..941340e
--- /dev/null
+++ b/packages/DocumentsUI/res/layout/item_message_grid.xml
@@ -0,0 +1,59 @@
+<?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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="180dip"
+ android:paddingBottom="?android:attr/listPreferredItemPaddingEnd"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/chip"
+ android:foreground="@drawable/item_background"
+ android:duplicateParentState="true">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingBottom="6dp"
+ android:orientation="vertical"
+ android:gravity="center">
+
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@null" />
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:paddingTop="6dp"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textAlignment="viewStart" />
+
+ </LinearLayout>
+
+ </FrameLayout>
+
+</FrameLayout>
diff --git a/packages/DocumentsUI/res/layout/item_message_list.xml b/packages/DocumentsUI/res/layout/item_message_list.xml
new file mode 100644
index 0000000..dda3c80
--- /dev/null
+++ b/packages/DocumentsUI/res/layout/item_message_list.xml
@@ -0,0 +1,47 @@
+<?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">
+
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:layout_marginEnd="8dip"
+ android:layout_gravity="center_vertical"
+ android:scaleType="centerInside"
+ android:contentDescription="@null" />
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAlignment="viewStart" />
+
+</LinearLayout>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 1220137..33d7d6af 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -412,11 +412,83 @@ public class DirectoryFragment extends Fragment {
return ((DocumentsActivity) fragment.getActivity()).getDisplayState();
}
+ private interface Footer {
+ public View getView(View convertView, ViewGroup parent);
+ }
+
+ private static class LoadingFooter implements Footer {
+ @Override
+ public View getView(View convertView, ViewGroup parent) {
+ final Context context = parent.getContext();
+ if (convertView == null) {
+ final LayoutInflater inflater = LayoutInflater.from(context);
+ convertView = inflater.inflate(R.layout.item_loading, parent, false);
+ }
+ return convertView;
+ }
+ }
+
+ private class MessageFooter implements Footer {
+ private final int mIcon;
+ private final String mMessage;
+
+ public MessageFooter(int icon, String message) {
+ mIcon = icon;
+ mMessage = message;
+ }
+
+ @Override
+ public View getView(View convertView, ViewGroup parent) {
+ final Context context = parent.getContext();
+ final State state = getDisplayState(DirectoryFragment.this);
+
+ if (convertView == null) {
+ final LayoutInflater inflater = LayoutInflater.from(context);
+ if (state.mode == MODE_LIST) {
+ convertView = inflater.inflate(R.layout.item_message_list, parent, false);
+ } else if (state.mode == MODE_GRID) {
+ convertView = inflater.inflate(R.layout.item_message_grid, parent, false);
+ } else {
+ throw new IllegalStateException();
+ }
+ }
+
+ final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon);
+ final TextView title = (TextView) convertView.findViewById(android.R.id.title);
+ icon.setImageResource(mIcon);
+ title.setText(mMessage);
+ return convertView;
+ }
+ }
+
private class DocumentsAdapter extends BaseAdapter {
private Cursor mCursor;
+ private int mCursorCount;
+
+ private List<Footer> mFooters = Lists.newArrayList();
public void swapCursor(Cursor cursor) {
mCursor = cursor;
+ mCursorCount = cursor != null ? cursor.getCount() : 0;
+
+ mFooters.clear();
+
+ final Bundle extras = cursor != null ? cursor.getExtras() : null;
+ if (extras != null) {
+ final String info = extras.getString(DocumentsContract.EXTRA_INFO);
+ if (info != null) {
+ mFooters.add(new MessageFooter(
+ com.android.internal.R.drawable.ic_menu_info_details, info));
+ }
+ final String error = extras.getString(DocumentsContract.EXTRA_ERROR);
+ if (error != null) {
+ mFooters.add(new MessageFooter(
+ com.android.internal.R.drawable.ic_dialog_alert, error));
+ }
+ if (extras.getBoolean(DocumentsContract.EXTRA_LOADING, false)) {
+ mFooters.add(new LoadingFooter());
+ }
+ }
if (isEmpty()) {
mEmptyView.setVisibility(View.VISIBLE);
@@ -429,6 +501,15 @@ public class DirectoryFragment extends Fragment {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
+ if (position < mCursorCount) {
+ return getDocumentView(position, convertView, parent);
+ } else {
+ position -= mCursorCount;
+ return mFooters.get(position).getView(convertView, parent);
+ }
+ }
+
+ private View getDocumentView(int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
final State state = getDisplayState(DirectoryFragment.this);
@@ -535,21 +616,42 @@ public class DirectoryFragment extends Fragment {
@Override
public int getCount() {
- return mCursor != null ? mCursor.getCount() : 0;
+ return mCursorCount + mFooters.size();
}
@Override
public Cursor getItem(int position) {
- if (mCursor != null) {
+ if (position < mCursorCount) {
mCursor.moveToPosition(position);
+ return mCursor;
+ } else {
+ return null;
}
- return mCursor;
}
@Override
public long getItemId(int position) {
return position;
}
+
+ @Override
+ public int getItemViewType(int position) {
+ if (position < mCursorCount) {
+ return 0;
+ } else {
+ return IGNORE_ITEM_VIEW_TYPE;
+ }
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return position < mCursorCount;
+ }
}
private static class ThumbnailAsyncTask extends AsyncTask<Uri, Void, Bitmap> {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
index 3f016b5..6ea57d7 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
@@ -77,11 +77,12 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
.getContentResolver().acquireUnstableContentProviderClient(authority);
final Cursor cursor = result.client.query(
mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal);
+ cursor.registerContentObserver(mObserver);
+
final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1);
final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder);
result.cursor = sorted;
- result.cursor.registerContentObserver(mObserver);
} catch (Exception e) {
result.exception = e;
ContentProviderClient.closeQuietly(result.client);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
index d0e5ff6..0b58218 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
@@ -18,6 +18,7 @@ package com.android.documentsui;
import android.database.AbstractCursor;
import android.database.Cursor;
+import android.os.Bundle;
/**
* Cursor wrapper that adds columns to identify which root a document came from.
@@ -63,6 +64,11 @@ public class RootCursorWrapper extends AbstractCursor {
}
@Override
+ public Bundle getExtras() {
+ return mCursor.getExtras();
+ }
+
+ @Override
public void close() {
super.close();
mCursor.close();
@@ -128,5 +134,4 @@ public class RootCursorWrapper extends AbstractCursor {
public boolean isNull(int column) {
return mCursor.isNull(column);
}
-
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
index b434a35..19ad2e2 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
@@ -22,6 +22,7 @@ import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE;
import android.database.AbstractCursor;
import android.database.Cursor;
+import android.os.Bundle;
import android.provider.DocumentsContract.Document;
/**
@@ -96,6 +97,11 @@ public class SortingCursorWrapper extends AbstractCursor {
}
@Override
+ public Bundle getExtras() {
+ return mCursor.getExtras();
+ }
+
+ @Override
public void close() {
super.close();
mCursor.close();