Loading packages/DocumentsUI/res/layout/item_loading.xml 0 → 100644 +34 −0 Original line number Diff line number Diff line <?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> packages/DocumentsUI/res/layout/item_message_grid.xml 0 → 100644 +59 −0 Original line number Diff line number Diff line <?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> packages/DocumentsUI/res/layout/item_message_list.xml 0 → 100644 +47 −0 Original line number Diff line number Diff line <?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> packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +105 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading Loading @@ -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; } } @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> { Loading packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
packages/DocumentsUI/res/layout/item_loading.xml 0 → 100644 +34 −0 Original line number Diff line number Diff line <?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>
packages/DocumentsUI/res/layout/item_message_grid.xml 0 → 100644 +59 −0 Original line number Diff line number Diff line <?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>
packages/DocumentsUI/res/layout/item_message_list.xml 0 → 100644 +47 −0 Original line number Diff line number Diff line <?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>
packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +105 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading Loading @@ -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; } } @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> { Loading
packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading