1/*******************************************************************************
2 *      Copyright (C) 2012 Google Inc.
3 *      Licensed to The Android Open Source Project.
4 *
5 *      Licensed under the Apache License, Version 2.0 (the "License");
6 *      you may not use this file except in compliance with the License.
7 *      You may obtain a copy of the License at
8 *
9 *           http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *      Unless required by applicable law or agreed to in writing, software
12 *      distributed under the License is distributed on an "AS IS" BASIS,
13 *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *      See the License for the specific language governing permissions and
15 *      limitations under the License.
16 *******************************************************************************/
17
18package com.android.mail.ui;
19
20import android.content.Context;
21import android.database.Cursor;
22import android.text.Spannable;
23import android.text.SpannableStringBuilder;
24import android.text.TextUtils;
25import android.text.style.ForegroundColorSpan;
26import android.view.View;
27import android.view.ViewGroup;
28import android.widget.CompoundButton;
29import android.widget.TextView;
30
31import com.android.mail.R;
32import com.android.mail.providers.Folder;
33import com.google.common.annotations.VisibleForTesting;
34
35import java.util.Set;
36
37public class HierarchicalFolderSelectorAdapter extends FolderSelectorAdapter {
38
39    private Context mContext;
40
41    @VisibleForTesting
42    public HierarchicalFolderSelectorAdapter(Context context, Cursor folders,
43            Set<String> initiallySelected, int layout) {
44        super(context, folders, initiallySelected, layout);
45        mContext = context;
46    }
47
48    public HierarchicalFolderSelectorAdapter(Context context, Cursor folders,
49            int layout, Folder excludedFolder) {
50        super(context, folders, layout, excludedFolder);
51        mContext = context;
52    }
53
54    @Override
55    public View getView(int position, View convertView, ViewGroup parent) {
56        final View view = super.getView(position, convertView, parent);
57        final FolderRow row = (FolderRow) getItem(position);
58        final Folder folder = row.getFolder();
59        final CompoundButton checkBox = (CompoundButton) view.findViewById(R.id.checkbox);
60        final TextView display = (TextView) view.findViewById(R.id.folder_name);
61        final CharSequence displayText = TextUtils.isEmpty(row.mPathName) ? folder.name
62                : truncateHierarchy(row.mPathName);
63        if (checkBox != null) {
64            checkBox.setText(TextUtils.isEmpty(row.mPathName) ? folder.name
65                : truncateHierarchy(row.mPathName), TextView.BufferType.SPANNABLE);
66        } else {
67            display.setText(displayText, TextView.BufferType.SPANNABLE);
68        }
69        return view;
70    }
71
72    /**
73     * Truncation of a hierarchy works as follows:
74     * 1) If there is just a folder name, return that.
75     * 2) If there is a single parent and a folder name, return parent/folder.
76     * 3) If there is > 1 but < 3 ancestors, return ancestor/ancestor2/folder
77     * 4) If there are > 3 ancestors, return the top most ancestor, and direct parent
78     * of the folder, and the folder: ancestor/.../directParent/folder
79     */
80    @VisibleForTesting
81    protected SpannableStringBuilder truncateHierarchy(String hierarchy) {
82        if (TextUtils.isEmpty(hierarchy)) {
83            return null;
84        }
85        final String[] splitHierarchy = hierarchy.split("/");
86        // We want to keep the last part of the hierachy, as that is the name of
87        // the folder.
88        final String folderName;
89        final String topParentName;
90        final String directParentName;
91        final SpannableStringBuilder display = new SpannableStringBuilder();
92        if (splitHierarchy != null && splitHierarchy.length > 0) {
93            final int length = splitHierarchy.length;
94            if (length > 2) {
95                topParentName = splitHierarchy[0];
96                directParentName = splitHierarchy[length - 2];
97                folderName = splitHierarchy[length - 1];
98            } else if (length > 1) {
99                topParentName = splitHierarchy[0];
100                directParentName = null;
101                folderName = splitHierarchy[length - 1];
102            } else {
103                topParentName = null;
104                directParentName = null;
105                folderName = splitHierarchy[0];
106            }
107            if (!TextUtils.isEmpty(directParentName)) {
108                final int formatString;
109                if (length > 3) {
110                    formatString = R.string.hierarchical_folder_parent_top_ellip;
111                } else {
112                    formatString = R.string.hierarchical_folder_parent_top;
113                }
114                display.append(mContext.getResources().getString(formatString, topParentName,
115                        directParentName));
116            } else if (!TextUtils.isEmpty(topParentName)) {
117                display.append(mContext.getResources().getString(R.string.hierarchical_folder_top,
118                        topParentName));
119            }
120
121            // If there is nothing appended to display, don't try to setSpan.
122            if (display.length() > 0) {
123                display.setSpan(new ForegroundColorSpan(R.color.hierarchical_folder_parent_color),
124                        0, display.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
125            }
126            display.append(folderName);
127        }
128        return display;
129    }
130}
131