| /** |
| * Copyright (c) 2012, Google Inc. |
| * |
| * 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.mail.ui; |
| |
| import android.content.Context; |
| import android.graphics.Color; |
| import android.graphics.drawable.ShapeDrawable; |
| import android.graphics.drawable.shapes.RoundRectShape; |
| import android.graphics.drawable.shapes.Shape; |
| import android.util.AttributeSet; |
| import android.view.View; |
| import android.widget.ImageView; |
| import android.widget.LinearLayout; |
| import android.widget.TextView; |
| |
| import com.android.mail.R; |
| import com.android.mail.providers.Folder; |
| import com.android.mail.utils.FolderUri; |
| import com.android.mail.utils.LogTag; |
| import com.android.mail.utils.LogUtils; |
| import com.android.mail.utils.Utils; |
| |
| /** |
| * The view for each folder in the folder list. |
| */ |
| public class FolderItemView extends LinearLayout { |
| private final String LOG_TAG = LogTag.getLogTag(); |
| |
| private static float[] sUnseenCornerRadii; |
| |
| private Folder mFolder; |
| private TextView mFolderTextView; |
| private TextView mUnreadCountTextView; |
| private TextView mUnseenCountTextView; |
| |
| public FolderItemView(Context context) { |
| super(context); |
| |
| loadResources(context); |
| } |
| |
| public FolderItemView(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| |
| loadResources(context); |
| } |
| |
| public FolderItemView(Context context, AttributeSet attrs, int defStyle) { |
| super(context, attrs, defStyle); |
| |
| loadResources(context); |
| } |
| |
| private void loadResources(Context context) { |
| if (sUnseenCornerRadii == null) { |
| final float cornerRadius = |
| context.getResources().getDimension(R.dimen.folder_rounded_corner_radius); |
| sUnseenCornerRadii = new float[] { |
| cornerRadius, cornerRadius, // top left |
| cornerRadius, cornerRadius, // top right |
| cornerRadius, cornerRadius, // bottom right |
| cornerRadius, cornerRadius // bottom left |
| }; |
| } |
| } |
| |
| @Override |
| protected void onFinishInflate() { |
| super.onFinishInflate(); |
| |
| mFolderTextView = (TextView)findViewById(R.id.name); |
| mUnreadCountTextView = (TextView)findViewById(R.id.unread); |
| mUnseenCountTextView = (TextView)findViewById(R.id.unseen); |
| } |
| |
| /** |
| * Returns true if the two folders lead to identical {@link FolderItemView} objects. |
| * @param a |
| * @param b |
| * @return true if the two folders would still lead to the same {@link FolderItemView}. |
| */ |
| public static boolean areSameViews(final Folder a, final Folder b) { |
| if (a == null) { |
| return b == null; |
| } |
| if (b == null) { |
| // a is not null because it would have returned above. |
| return false; |
| } |
| return (a == b || (a.folderUri.equals(b.folderUri) |
| && a.name.equals(b.name) |
| && a.hasChildren == b.hasChildren |
| && a.unseenCount == b.unseenCount |
| && a.unreadCount == b.unreadCount)); |
| } |
| |
| public void bind(final Folder folder, final FolderUri parentUri) { |
| mFolder = folder; |
| |
| mFolderTextView.setText(folder.name); |
| |
| if (parentUri != null) { |
| final boolean isParent = folder.folderUri.equals(parentUri); |
| |
| // If child folder, make spacer view visible, otherwise hide it away |
| findViewById(R.id.nested_folder_space).setVisibility( |
| isParent ? View.GONE : View.VISIBLE); |
| } |
| |
| if (mFolder.isInbox() && mFolder.unseenCount > 0) { |
| mUnreadCountTextView.setVisibility(View.GONE); |
| setUnseenCount(mFolder.getBackgroundColor(Color.BLACK), mFolder.unseenCount); |
| } else { |
| mUnseenCountTextView.setVisibility(View.GONE); |
| setUnreadCount(Utils.getFolderUnreadDisplayCount(mFolder)); |
| } |
| } |
| |
| /** |
| * Sets the icon, if any. |
| */ |
| public void setIcon(final Folder folder) { |
| final ImageView folderIconView = (ImageView) findViewById(R.id.folder_icon); |
| Folder.setIcon(folder, folderIconView); |
| } |
| |
| /** |
| * Sets the unread count, taking care to hide/show the textview if the count is zero/non-zero. |
| */ |
| private void setUnreadCount(int count) { |
| mUnreadCountTextView.setVisibility(count > 0 ? View.VISIBLE : View.GONE); |
| if (count > 0) { |
| mUnreadCountTextView.setText(Utils.getUnreadCountString(getContext(), count)); |
| } |
| } |
| |
| /** |
| * Sets the unseen count, taking care to hide/show the textview if the count is zero/non-zero. |
| */ |
| private void setUnseenCount(final int color, final int count) { |
| mUnseenCountTextView.setVisibility(count > 0 ? View.VISIBLE : View.GONE); |
| if (count > 0) { |
| final Shape shape = new RoundRectShape(sUnseenCornerRadii, null, null); |
| final ShapeDrawable drawable = new ShapeDrawable(shape); |
| drawable.getPaint().setColor(color); |
| mUnseenCountTextView.setBackgroundDrawable(drawable); |
| mUnseenCountTextView.setText(Utils.getUnseenCountString(getContext(), count)); |
| } |
| } |
| |
| /** |
| * Used if we detect a problem with the unread count and want to force an override. |
| * @param count |
| */ |
| public final void overrideUnreadCount(int count) { |
| LogUtils.e(LOG_TAG, "FLF->FolderItem.getFolderView: unread count mismatch found (%s vs %d)", |
| mUnreadCountTextView.getText(), count); |
| setUnreadCount(count); |
| } |
| |
| } |