Update grid items to look more like the mocks.
- Create a new layout for directory items, which have a different layout (no thumbnail, size or mod_date). - Add drop shadows. Also refactor a few things in the DocumentHolder and child classes to make things more efficient and cleaner. BUG=24326989,26229570 Change-Id: I05df52b071667190d4c4c671f50d25498383cdaa
This commit is contained in:
62
packages/DocumentsUI/res/layout/item_dir_grid.xml
Normal file
62
packages/DocumentsUI/res/layout/item_dir_grid.xml
Normal file
@@ -0,0 +1,62 @@
|
||||
<?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="match_parent"
|
||||
android:layout_margin="@dimen/grid_item_margin"
|
||||
android:background="@color/item_doc_background"
|
||||
android:elevation="5dp"
|
||||
android:focusable="true">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="16dp"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingRight="12dp">
|
||||
|
||||
<ImageView
|
||||
android:src="@drawable/ic_doc_folder"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:scaleType="centerInside"
|
||||
android:contentDescription="@null"/>
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="middle"
|
||||
android:textAlignment="viewStart"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
|
||||
android:textColor="@*android:color/primary_text_default_material_light" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- An overlay that draws the item border when it is focused. -->
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:contentDescription="@null"
|
||||
android:background="@drawable/item_doc_grid_border"
|
||||
android:duplicateParentState="true" />
|
||||
|
||||
</FrameLayout>
|
||||
@@ -19,6 +19,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/grid_item_margin"
|
||||
android:background="@color/item_doc_background"
|
||||
android:elevation="5dp"
|
||||
android:focusable="true">
|
||||
|
||||
<!-- Main item thumbnail. Comprised of two overlapping images, the
|
||||
|
||||
@@ -964,7 +964,16 @@ public class DirectoryFragment extends Fragment {
|
||||
final State state = getDisplayState();
|
||||
switch (state.derivedMode) {
|
||||
case MODE_GRID:
|
||||
holder = new GridDocumentHolder(getContext(), parent, mIconHelper, viewType);
|
||||
switch (viewType) {
|
||||
case ITEM_TYPE_DIRECTORY:
|
||||
holder = new GridDirectoryHolder(getContext(), parent);
|
||||
break;
|
||||
case ITEM_TYPE_DOCUMENT:
|
||||
holder = new GridDocumentHolder(getContext(), parent, mIconHelper);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unsupported layout type.");
|
||||
}
|
||||
break;
|
||||
case MODE_LIST:
|
||||
holder = new ListDocumentHolder(getContext(), parent, mIconHelper);
|
||||
@@ -1031,7 +1040,10 @@ public class DirectoryFragment extends Fragment {
|
||||
@Override
|
||||
public void onModelUpdate(Model model) {
|
||||
mModelIds = Lists.newArrayList(model.getModelIds());
|
||||
mDividerPosition = 0;
|
||||
// Start the divider at the end. That way if the code below encounters no documents
|
||||
// (i.e. in a directory containing only directories), the divider is placed at the end
|
||||
// of the list, as expected.
|
||||
mDividerPosition = mModelIds.size();
|
||||
|
||||
// Walk down the list of IDs till we encounter something that's not a directory, and
|
||||
// insert a whitespace element - this introduces a visual break in the grid between
|
||||
|
||||
@@ -40,16 +40,15 @@ public abstract class DocumentHolder
|
||||
final int mDefaultItemColor;
|
||||
final boolean mAlwaysShowSummary;
|
||||
final Context mContext;
|
||||
final IconHelper mIconHelper;
|
||||
|
||||
private ListDocumentHolder.ClickListener mClickListener;
|
||||
private View.OnKeyListener mKeyListener;
|
||||
|
||||
public DocumentHolder(Context context, ViewGroup parent, int layout, IconHelper iconHelper) {
|
||||
this(context, inflateLayout(context, parent, layout), iconHelper);
|
||||
public DocumentHolder(Context context, ViewGroup parent, int layout) {
|
||||
this(context, inflateLayout(context, parent, layout));
|
||||
}
|
||||
|
||||
public DocumentHolder(Context context, View item, IconHelper iconHelper) {
|
||||
public DocumentHolder(Context context, View item) {
|
||||
super(item);
|
||||
|
||||
itemView.setOnKeyListener(this);
|
||||
@@ -59,8 +58,6 @@ public abstract class DocumentHolder
|
||||
mDefaultItemColor = context.getColor(R.color.item_doc_background);
|
||||
mSelectedItemColor = context.getColor(R.color.item_doc_background_selected);
|
||||
mAlwaysShowSummary = context.getResources().getBoolean(R.bool.always_show_summary);
|
||||
|
||||
mIconHelper = iconHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,7 +24,7 @@ import com.android.documentsui.State;
|
||||
|
||||
final class EmptyDocumentHolder extends DocumentHolder {
|
||||
public EmptyDocumentHolder(Context context) {
|
||||
super(context, new View(context), null);
|
||||
super(context, new View(context));
|
||||
itemView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2015 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.
|
||||
*/
|
||||
|
||||
package com.android.documentsui.dirlist;
|
||||
|
||||
import static com.android.documentsui.model.DocumentInfo.getCursorString;
|
||||
import static com.android.internal.util.Preconditions.checkNotNull;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.provider.DocumentsContract.Document;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.documentsui.R;
|
||||
import com.android.documentsui.State;
|
||||
|
||||
final class GridDirectoryHolder extends DocumentHolder {
|
||||
final TextView mTitle;
|
||||
public GridDirectoryHolder(Context context, ViewGroup parent) {
|
||||
super(context, parent, R.layout.item_dir_grid);
|
||||
|
||||
mTitle = (TextView) itemView.findViewById(android.R.id.title);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bind this view to the given document for display.
|
||||
* @param cursor Pointing to the item to be bound.
|
||||
* @param modelId The model ID of the item.
|
||||
* @param state Current display state.
|
||||
*/
|
||||
public void bind(Cursor cursor, String modelId, State state) {
|
||||
checkNotNull(cursor, "Cursor cannot be null.");
|
||||
|
||||
this.modelId = modelId;
|
||||
|
||||
final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
|
||||
mTitle.setText(docDisplayName);
|
||||
}
|
||||
}
|
||||
@@ -40,9 +40,22 @@ import com.android.documentsui.State;
|
||||
final class GridDocumentHolder extends DocumentHolder {
|
||||
private static boolean mHideTitles;
|
||||
|
||||
public GridDocumentHolder(
|
||||
Context context, ViewGroup parent, IconHelper thumbnailLoader, int viewType) {
|
||||
super(context, parent, R.layout.item_doc_grid, thumbnailLoader);
|
||||
final TextView mTitle;
|
||||
final TextView mDate;
|
||||
final TextView mSize;
|
||||
final ImageView mIconMime;
|
||||
final ImageView mIconThumb;
|
||||
final IconHelper mIconHelper;
|
||||
|
||||
public GridDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper) {
|
||||
super(context, parent, R.layout.item_doc_grid);
|
||||
|
||||
mTitle = (TextView) itemView.findViewById(android.R.id.title);
|
||||
mDate = (TextView) itemView.findViewById(R.id.date);
|
||||
mSize = (TextView) itemView.findViewById(R.id.size);
|
||||
mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime);
|
||||
mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
|
||||
mIconHelper = iconHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -65,40 +78,34 @@ final class GridDocumentHolder extends DocumentHolder {
|
||||
final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
|
||||
final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE);
|
||||
|
||||
final TextView title = (TextView) itemView.findViewById(android.R.id.title);
|
||||
final TextView date = (TextView) itemView.findViewById(R.id.date);
|
||||
final TextView size = (TextView) itemView.findViewById(R.id.size);
|
||||
final ImageView iconMime = (ImageView) itemView.findViewById(R.id.icon_mime);
|
||||
final ImageView iconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
|
||||
mIconHelper.stopLoading(mIconThumb);
|
||||
|
||||
mIconHelper.stopLoading(iconThumb);
|
||||
|
||||
iconMime.animate().cancel();
|
||||
iconMime.setAlpha(1f);
|
||||
iconThumb.animate().cancel();
|
||||
iconThumb.setAlpha(0f);
|
||||
mIconMime.animate().cancel();
|
||||
mIconMime.setAlpha(1f);
|
||||
mIconThumb.animate().cancel();
|
||||
mIconThumb.setAlpha(0f);
|
||||
|
||||
final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId);
|
||||
mIconHelper.loadThumbnail(uri, docMimeType, docFlags, docIcon, iconThumb, iconMime);
|
||||
mIconHelper.loadThumbnail(uri, docMimeType, docFlags, docIcon, mIconThumb, mIconMime);
|
||||
|
||||
if (mHideTitles) {
|
||||
title.setVisibility(View.GONE);
|
||||
mTitle.setVisibility(View.GONE);
|
||||
} else {
|
||||
title.setText(docDisplayName);
|
||||
title.setVisibility(View.VISIBLE);
|
||||
mTitle.setText(docDisplayName);
|
||||
mTitle.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
if (docLastModified == -1) {
|
||||
date.setText(null);
|
||||
mDate.setText(null);
|
||||
} else {
|
||||
date.setText(Shared.formatTime(mContext, docLastModified));
|
||||
mDate.setText(Shared.formatTime(mContext, docLastModified));
|
||||
}
|
||||
|
||||
if (!state.showSize || Document.MIME_TYPE_DIR.equals(docMimeType) || docSize == -1) {
|
||||
size.setVisibility(View.GONE);
|
||||
mSize.setVisibility(View.GONE);
|
||||
} else {
|
||||
size.setVisibility(View.VISIBLE);
|
||||
size.setText(Formatter.formatFileSize(mContext, docSize));
|
||||
mSize.setVisibility(View.VISIBLE);
|
||||
mSize.setText(Formatter.formatFileSize(mContext, docSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,16 +38,27 @@ import com.android.documentsui.Shared;
|
||||
import com.android.documentsui.State;
|
||||
|
||||
final class ListDocumentHolder extends DocumentHolder {
|
||||
final TextView mTitle;
|
||||
final TextView mSummary;
|
||||
final TextView mDate;
|
||||
final TextView mSize;
|
||||
final ImageView mIconMime;
|
||||
final ImageView mIconThumb;
|
||||
final ImageView mIcon1;
|
||||
final IconHelper mIconHelper;
|
||||
|
||||
public ListDocumentHolder(Context context, ViewGroup parent, IconHelper thumbnailLoader) {
|
||||
super(context, parent, R.layout.item_doc_list, thumbnailLoader);
|
||||
public ListDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper) {
|
||||
super(context, parent, R.layout.item_doc_list);
|
||||
|
||||
mTitle = (TextView) itemView.findViewById(android.R.id.title);
|
||||
mSummary = (TextView) itemView.findViewById(android.R.id.summary);
|
||||
mDate = (TextView) itemView.findViewById(R.id.date);
|
||||
mSize = (TextView) itemView.findViewById(R.id.size);
|
||||
mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime);
|
||||
mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb);
|
||||
mIcon1 = (ImageView) itemView.findViewById(android.R.id.icon1);
|
||||
|
||||
mIconHelper = iconHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,11 +83,6 @@ final class ListDocumentHolder extends DocumentHolder {
|
||||
final String docSummary = getCursorString(cursor, Document.COLUMN_SUMMARY);
|
||||
final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE);
|
||||
|
||||
final TextView title = (TextView) itemView.findViewById(android.R.id.title);
|
||||
final TextView summary = (TextView) itemView.findViewById(android.R.id.summary);
|
||||
final TextView date = (TextView) itemView.findViewById(R.id.date);
|
||||
final TextView size = (TextView) itemView.findViewById(R.id.size);
|
||||
|
||||
mIconHelper.stopLoading(mIconThumb);
|
||||
|
||||
mIconMime.animate().cancel();
|
||||
@@ -85,27 +91,27 @@ final class ListDocumentHolder extends DocumentHolder {
|
||||
final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId);
|
||||
mIconHelper.loadThumbnail(uri, docMimeType, docFlags, docIcon, mIconThumb, mIconMime);
|
||||
|
||||
title.setText(docDisplayName);
|
||||
title.setVisibility(View.VISIBLE);
|
||||
mTitle.setText(docDisplayName);
|
||||
mTitle.setVisibility(View.VISIBLE);
|
||||
|
||||
if (docSummary != null) {
|
||||
summary.setText(docSummary);
|
||||
summary.setVisibility(View.VISIBLE);
|
||||
mSummary.setText(docSummary);
|
||||
mSummary.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
summary.setVisibility(View.INVISIBLE);
|
||||
mSummary.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
if (docLastModified == -1) {
|
||||
date.setText(null);
|
||||
mDate.setText(null);
|
||||
} else {
|
||||
date.setText(Shared.formatTime(mContext, docLastModified));
|
||||
mDate.setText(Shared.formatTime(mContext, docLastModified));
|
||||
}
|
||||
|
||||
if (!state.showSize || Document.MIME_TYPE_DIR.equals(docMimeType) || docSize == -1) {
|
||||
size.setVisibility(View.GONE);
|
||||
mSize.setVisibility(View.GONE);
|
||||
} else {
|
||||
size.setVisibility(View.VISIBLE);
|
||||
size.setText(Formatter.formatFileSize(mContext, docSize));
|
||||
mSize.setVisibility(View.VISIBLE);
|
||||
mSize.setText(Formatter.formatFileSize(mContext, docSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user