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:
Ben Kwa
2015-12-22 14:03:30 -08:00
parent d839149843
commit f8a51f6fcb
8 changed files with 187 additions and 49 deletions

View 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>

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}
/**

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}