diff options
author | Jeff Sharkey <jsharkey@android.com> | 2013-09-04 04:34:17 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-04 04:34:18 +0000 |
commit | 5b3f4aa84fe3f97075f4ed0763c9ee8a3dd2065d (patch) | |
tree | fa65dc79b64cc5e19df6cb6776e21a2432a9fa87 /packages/DocumentsUI | |
parent | 100558ec646f729fd59ad7cec161febb8d09dac3 (diff) | |
parent | 954be0232655d316bc5decbbd35579af902c75c2 (diff) | |
download | frameworks_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')
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(); |