1a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei/*
2a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * Copyright (C) 2013 The Android Open Source Project
3a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei *
4a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * Licensed under the Apache License, Version 2.0 (the "License");
5a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * you may not use this file except in compliance with the License.
6a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * You may obtain a copy of the License at
7a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei *
8a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei *      http://www.apache.org/licenses/LICENSE-2.0
9a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei *
10a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * Unless required by applicable law or agreed to in writing, software
11a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * distributed under the License is distributed on an "AS IS" BASIS,
12a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * See the License for the specific language governing permissions and
14a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * limitations under the License.
15a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei */
16a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Weipackage com.android.mail.bitmap;
17a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
18a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Weiimport android.text.TextUtils;
19a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
202b806edc62eb8e83c77edc471fda4652281a15c4James Lemieuximport com.android.bitmap.RequestKey;
21c7849b23a73d699b5e7f199f0a3afce5b9dee7a6Martin Hibdonimport com.android.mail.bitmap.ContactResolver.ContactDrawableInterface;
22a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
23a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Weiimport java.io.ByteArrayInputStream;
24a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Weiimport java.io.IOException;
25a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Weiimport java.io.InputStream;
26a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
27a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei/**
28a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * A request object for contact images. ContactRequests have a destination because multiple
29a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei * ContactRequests can share the same decoded data.
30a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei */
312b806edc62eb8e83c77edc471fda4652281a15c4James Lemieuxpublic class ContactRequest implements RequestKey {
32a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
33a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    private final String mName;
34a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    private final String mEmail;
35a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
36a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public byte[] bytes;
37a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
38a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public ContactRequest(final String name, final String email) {
39a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        mName = name;
40a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        mEmail = normalizeEmail(email);
41a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
42a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
43a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    private String normalizeEmail(final String email) {
44a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        if (TextUtils.isEmpty(email)) {
45a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            throw new IllegalArgumentException("Email must not be empty.");
46a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
47a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        // todo: b/10258788
48a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return email;
49a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
50a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
51a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    @Override
52a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public boolean equals(final Object o) {
53a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        if (this == o) {
54a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return true;
55a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
56a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        if (o == null || getClass() != o.getClass()) {
57a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return false;
58a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
59a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
60a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        final ContactRequest that = (ContactRequest) o;
61a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
62a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        // Only count email, so we can pull results out of the cache that are from other contact
63a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        // requests.
64a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        //noinspection RedundantIfStatement
65a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        if (mEmail != null ? !mEmail.equals(that.mEmail) : that.mEmail != null) {
66a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return false;
67a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
68a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
69a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return true;
70a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
71a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
72a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    @Override
73a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public int hashCode() {
74a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        // Only count email, so we can pull results out of the cache that are from other contact
75a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        // requests.
76a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return mEmail != null ? mEmail.hashCode() : 0;
77a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
78a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
79a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    @Override
80a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public String toString() {
81a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return "[" + super.toString() + " mName=" + mName + " mEmail=" + mEmail + "]";
82a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
83a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
84a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    @Override
852b806edc62eb8e83c77edc471fda4652281a15c4James Lemieux    public Cancelable createFileDescriptorFactoryAsync(RequestKey key, Callback callback) {
86a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return null;
87a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
88a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
89a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    @Override
90a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public InputStream createInputStream() throws IOException {
91a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return new ByteArrayInputStream(bytes);
92a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
93a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
94a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    @Override
95a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public boolean hasOrientationExif() throws IOException {
96a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return false;
97a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
98a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
99a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public String getEmail() {
100a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return mEmail;
101a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
102a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
103a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public String getDisplayName() {
104a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        return !TextUtils.isEmpty(mName) ? mName : mEmail;
105a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
106a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
107a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    /**
108a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei     * This ContactRequest wrapper provides implementations of equals() and hashcode() that
109a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei     * include the destination. We need to put multiple ContactRequests in a set,
110a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei     * but its implementations of equals() and hashcode() don't include the destination.
111a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei     */
112a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    public static class ContactRequestHolder {
113a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
114a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public final ContactRequest contactRequest;
115c7849b23a73d699b5e7f199f0a3afce5b9dee7a6Martin Hibdon        public final ContactDrawableInterface destination;
116a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
117a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public ContactRequestHolder(final ContactRequest contactRequest,
118c7849b23a73d699b5e7f199f0a3afce5b9dee7a6Martin Hibdon                final ContactDrawableInterface destination) {
119a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            this.contactRequest = contactRequest;
120a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            this.destination = destination;
121a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
122a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
123a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        @Override
124a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public boolean equals(final Object o) {
125a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            if (this == o) {
126a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei                return true;
127a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            }
128a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            if (o == null || getClass() != o.getClass()) {
129a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei                return false;
130a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            }
131a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
132a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            final ContactRequestHolder that = (ContactRequestHolder) o;
133a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
134a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            if (contactRequest != null ? !contactRequest.equals(that.contactRequest)
135a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei                    : that.contactRequest != null) {
136a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei                return false;
137a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            }
138a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            //noinspection RedundantIfStatement
139a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            if (destination != null ? !destination.equals(that.destination)
140a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei                    : that.destination != null) {
141a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei                return false;
142a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            }
143a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
144a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return true;
145a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
146a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
147a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        @Override
148a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public int hashCode() {
149a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            int result = contactRequest != null ? contactRequest.hashCode() : 0;
150a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            result = 31 * result + (destination != null ? destination.hashCode() : 0);
151a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return result;
152a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
153a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
154a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        @Override
155a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public String toString() {
156a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return contactRequest.toString();
157a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
158a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
159a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public String getEmail() {
160a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return contactRequest.getEmail();
161a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
162a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei
163a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        public String getDisplayName() {
164a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei            return contactRequest.getDisplayName();
165a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei        }
166a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei    }
167a8301e2eb5a083a73f58331279c86e8ec7b11a48Mark Wei}
168