1/**
2 * Copyright (c) 2012, Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.mail.ui;
17
18import android.content.Context;
19import android.graphics.Color;
20import android.graphics.drawable.ShapeDrawable;
21import android.graphics.drawable.shapes.RoundRectShape;
22import android.graphics.drawable.shapes.Shape;
23import android.util.AttributeSet;
24import android.view.View;
25import android.widget.ImageView;
26import android.widget.LinearLayout;
27import android.widget.TextView;
28
29import com.android.mail.R;
30import com.android.mail.providers.Folder;
31import com.android.mail.utils.FolderUri;
32import com.android.mail.utils.LogTag;
33import com.android.mail.utils.LogUtils;
34import com.android.mail.utils.Utils;
35
36/**
37 * The view for each folder in the folder list.
38 */
39public class FolderItemView extends LinearLayout {
40    private final String LOG_TAG = LogTag.getLogTag();
41
42    private static float[] sUnseenCornerRadii;
43
44    private Folder mFolder;
45    private TextView mFolderTextView;
46    private TextView mUnreadCountTextView;
47    private TextView mUnseenCountTextView;
48
49    public FolderItemView(Context context) {
50        super(context);
51
52        loadResources(context);
53    }
54
55    public FolderItemView(Context context, AttributeSet attrs) {
56        super(context, attrs);
57
58        loadResources(context);
59    }
60
61    public FolderItemView(Context context, AttributeSet attrs, int defStyle) {
62        super(context, attrs, defStyle);
63
64        loadResources(context);
65    }
66
67    private void loadResources(Context context) {
68        if (sUnseenCornerRadii == null) {
69            final float cornerRadius =
70                    context.getResources().getDimension(R.dimen.folder_rounded_corner_radius);
71            sUnseenCornerRadii = new float[] {
72                    cornerRadius, cornerRadius, // top left
73                    cornerRadius, cornerRadius, // top right
74                    cornerRadius, cornerRadius, // bottom right
75                    cornerRadius, cornerRadius  // bottom left
76            };
77        }
78    }
79
80    @Override
81    protected void onFinishInflate() {
82        super.onFinishInflate();
83
84        mFolderTextView = (TextView)findViewById(R.id.name);
85        mUnreadCountTextView = (TextView)findViewById(R.id.unread);
86        mUnseenCountTextView = (TextView)findViewById(R.id.unseen);
87    }
88
89    /**
90     * Returns true if the two folders lead to identical {@link FolderItemView} objects.
91     * @param a
92     * @param b
93     * @return true if the two folders would still lead to the same {@link FolderItemView}.
94     */
95    public static boolean areSameViews(final Folder a, final Folder b) {
96        if (a == null) {
97            return b == null;
98        }
99        if (b == null) {
100            // a is not null because it would have returned above.
101            return false;
102        }
103        return (a == b || (a.folderUri.equals(b.folderUri)
104                && a.name.equals(b.name)
105                && a.hasChildren == b.hasChildren
106                && a.unseenCount == b.unseenCount
107                && a.unreadCount == b.unreadCount));
108    }
109
110    public void bind(final Folder folder, final FolderUri parentUri) {
111        mFolder = folder;
112
113        mFolderTextView.setText(folder.name);
114
115        if (parentUri != null) {
116            final boolean isParent = folder.folderUri.equals(parentUri);
117
118            // If child folder, make spacer view visible, otherwise hide it away
119            findViewById(R.id.nested_folder_space).setVisibility(
120                    isParent ? View.GONE : View.VISIBLE);
121        }
122
123        if (mFolder.isInbox() && mFolder.unseenCount > 0) {
124            mUnreadCountTextView.setVisibility(View.GONE);
125            setUnseenCount(mFolder.getBackgroundColor(Color.BLACK), mFolder.unseenCount);
126        } else {
127            mUnseenCountTextView.setVisibility(View.GONE);
128            setUnreadCount(Utils.getFolderUnreadDisplayCount(mFolder));
129        }
130    }
131
132    /**
133     * Sets the icon, if any.
134     */
135    public void setIcon(final Folder folder) {
136        final ImageView folderIconView = (ImageView) findViewById(R.id.folder_icon);
137        Folder.setIcon(folder, folderIconView);
138    }
139
140    /**
141     * Sets the unread count, taking care to hide/show the textview if the count is zero/non-zero.
142     */
143    private void setUnreadCount(int count) {
144        mUnreadCountTextView.setVisibility(count > 0 ? View.VISIBLE : View.GONE);
145        if (count > 0) {
146            mUnreadCountTextView.setText(Utils.getUnreadCountString(getContext(), count));
147        }
148    }
149
150    /**
151     * Sets the unseen count, taking care to hide/show the textview if the count is zero/non-zero.
152     */
153    private void setUnseenCount(final int color, final int count) {
154        mUnseenCountTextView.setVisibility(count > 0 ? View.VISIBLE : View.GONE);
155        if (count > 0) {
156            final Shape shape = new RoundRectShape(sUnseenCornerRadii, null, null);
157            final ShapeDrawable drawable = new ShapeDrawable(shape);
158            drawable.getPaint().setColor(color);
159            mUnseenCountTextView.setBackgroundDrawable(drawable);
160            mUnseenCountTextView.setText(Utils.getUnseenCountString(getContext(), count));
161        }
162    }
163
164    /**
165     * Used if we detect a problem with the unread count and want to force an override.
166     * @param count
167     */
168    public final void overrideUnreadCount(int count) {
169        LogUtils.e(LOG_TAG, "FLF->FolderItem.getFolderView: unread count mismatch found (%s vs %d)",
170                mUnreadCountTextView.getText(), count);
171        setUnreadCount(count);
172    }
173
174}
175