1/*
2 * Copyright (C) 2011 The Android Open Source Project
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 */
16
17package com.android.ex.chips;
18
19import android.net.Uri;
20import android.provider.ContactsContract.CommonDataKinds.Email;
21
22/**
23 * Represents one entry inside recipient auto-complete list.
24 */
25public class RecipientEntry {
26    /* package */ static final int INVALID_CONTACT = -1;
27    /**
28     * A GENERATED_CONTACT is one that was created based entirely on
29     * information passed in to the RecipientEntry from an external source
30     * that is not a real contact.
31     */
32    /* package */ static final int GENERATED_CONTACT = -2;
33
34    /** Used when {@link #mDestinationType} is invalid and thus shouldn't be used for display. */
35    /* package */ static final int INVALID_DESTINATION_TYPE = -1;
36
37    public static final int ENTRY_TYPE_PERSON = 0;
38    public static final int ENTRY_TYPE_WAITING_FOR_DIRECTORY_SEARCH = 1;
39
40    public static final int ENTRY_TYPE_SIZE = 2;
41
42    public static final RecipientEntry WAITING_FOR_DIRECTORY_SEARCH =
43            new RecipientEntry(ENTRY_TYPE_WAITING_FOR_DIRECTORY_SEARCH);
44
45    private final int mEntryType;
46
47    /**
48     * True when this entry is the first entry in a group, which should have a photo and display
49     * name, while the second or later entries won't.
50     */
51    private boolean mIsFirstLevel;
52    private final String mDisplayName;
53    /** Destination for this contact entry. Would be an email address or a phone number. */
54    private final String mDestination;
55    /** Type of the destination like {@link Email#TYPE_HOME} */
56    private final int mDestinationType;
57    /**
58     * Label of the destination which will be used when type was {@link Email#TYPE_CUSTOM}.
59     * Can be null when {@link #mDestinationType} is {@link #INVALID_DESTINATION_TYPE}.
60     */
61    private final String mDestinationLabel;
62    /** ID for the person */
63    private final long mContactId;
64    /** ID for the destination */
65    private final long mDataId;
66    private final boolean mIsDivider;
67
68    private final Uri mPhotoThumbnailUri;
69
70    /**
71     * This can be updated after this object being constructed, when the photo is fetched
72     * from remote directories.
73     */
74    private byte[] mPhotoBytes;
75
76    private RecipientEntry(int entryType) {
77        mEntryType = entryType;
78        mDisplayName = null;
79        mDestination = null;
80        mDestinationType = INVALID_DESTINATION_TYPE;
81        mDestinationLabel = null;
82        mContactId = -1;
83        mDataId = -1;
84        mPhotoThumbnailUri = null;
85        mPhotoBytes = null;
86        mIsDivider = true;
87    }
88
89    private RecipientEntry(
90            int entryType, String displayName,
91            String destination, int destinationType, String destinationLabel,
92            long contactId, long dataId, Uri photoThumbnailUri, boolean isFirstLevel) {
93        mEntryType = entryType;
94        mIsFirstLevel = isFirstLevel;
95        mDisplayName = displayName;
96        mDestination = destination;
97        mDestinationType = destinationType;
98        mDestinationLabel = destinationLabel;
99        mContactId = contactId;
100        mDataId = dataId;
101        mPhotoThumbnailUri = photoThumbnailUri;
102        mPhotoBytes = null;
103        mIsDivider = false;
104    }
105
106    /**
107     * Determine if this was a RecipientEntry created from recipient info or
108     * an entry from contacts.
109     */
110    public static boolean isCreatedRecipient(long id) {
111        return id == RecipientEntry.INVALID_CONTACT || id == RecipientEntry.GENERATED_CONTACT;
112    }
113
114    /**
115     * Construct a RecipientEntry from just an address that has been entered.
116     * This address has not been resolved to a contact and therefore does not
117     * have a contact id or photo.
118     */
119    public static RecipientEntry constructFakeEntry(String address) {
120        return new RecipientEntry(ENTRY_TYPE_PERSON, address, address,
121                INVALID_DESTINATION_TYPE, null,
122                INVALID_CONTACT, INVALID_CONTACT, null, true);
123    }
124
125    /**
126     * Construct a RecipientEntry from just an address that has been entered
127     * with both an associated display name. This address has not been resolved
128     * to a contact and therefore does not have a contact id or photo.
129     */
130    public static RecipientEntry constructGeneratedEntry(String display, String address) {
131        return new RecipientEntry(ENTRY_TYPE_PERSON, display,
132                address, INVALID_DESTINATION_TYPE, null,
133                GENERATED_CONTACT, GENERATED_CONTACT, null, true);
134    }
135
136    public static RecipientEntry constructTopLevelEntry(
137            String displayName, String destination, int destinationType, String destinationLabel,
138            long contactId, long dataId, Uri photoThumbnailUri) {
139        return new RecipientEntry(ENTRY_TYPE_PERSON, displayName,
140                destination, destinationType, destinationLabel,
141                contactId, dataId,
142                photoThumbnailUri, true);
143    }
144
145    public static RecipientEntry constructTopLevelEntry(
146            String displayName, String destination, int destinationType, String destinationLabel,
147            long contactId, long dataId,
148            String thumbnailUriAsString) {
149        return new RecipientEntry(
150                ENTRY_TYPE_PERSON, displayName,
151                destination, destinationType, destinationLabel,
152                contactId, dataId,
153                (thumbnailUriAsString != null ? Uri.parse(thumbnailUriAsString) : null), true);
154    }
155
156    public static RecipientEntry constructSecondLevelEntry(
157            String displayName, String destination, int destinationType, String destinationLabel,
158            long contactId, long dataId, String thumbnailUriAsString) {
159        return new RecipientEntry(
160                ENTRY_TYPE_PERSON, displayName,
161                destination, destinationType, destinationLabel,
162                contactId, dataId,
163                (thumbnailUriAsString != null ? Uri.parse(thumbnailUriAsString) : null), false);
164    }
165
166    public int getEntryType() {
167        return mEntryType;
168    }
169
170    public String getDisplayName() {
171        return mDisplayName;
172    }
173
174    public String getDestination() {
175        return mDestination;
176    }
177
178    public int getDestinationType() {
179        return mDestinationType;
180    }
181
182    public String getDestinationLabel() {
183        return mDestinationLabel;
184    }
185
186    public long getContactId() {
187        return mContactId;
188    }
189
190    public long getDataId() {
191        return mDataId;
192    }
193
194    public boolean isFirstLevel() {
195        return mIsFirstLevel;
196    }
197
198    public Uri getPhotoThumbnailUri() {
199        return mPhotoThumbnailUri;
200    }
201
202    /** This can be called outside main Looper thread. */
203    public synchronized void setPhotoBytes(byte[] photoBytes) {
204        mPhotoBytes = photoBytes;
205    }
206
207    /** This can be called outside main Looper thread. */
208    public synchronized byte[] getPhotoBytes() {
209        return mPhotoBytes;
210    }
211
212    public boolean isSeparator() {
213        return mIsDivider;
214    }
215
216    public boolean isSelectable() {
217        return mEntryType == ENTRY_TYPE_PERSON;
218    }
219}