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