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 17 package com.android.dialer.phonenumbercache; 18 19 import android.net.Uri; 20 import android.support.annotation.NonNull; 21 import android.text.TextUtils; 22 import com.android.contacts.common.ContactsUtils.UserType; 23 import com.android.dialer.logging.ContactSource; 24 import com.android.dialer.util.UriUtils; 25 26 /** Information for a contact as needed by the Call Log. */ 27 public class ContactInfo { 28 29 public static final ContactInfo EMPTY = new ContactInfo(); 30 public Uri lookupUri; 31 /** 32 * Contact lookup key. Note this may be a lookup key for a corp contact, in which case "lookup by 33 * lookup key" doesn't work on the personal profile. 34 */ 35 public String lookupKey; 36 37 public String name; 38 public String nameAlternative; 39 public int type; 40 public String label; 41 public String number; 42 public String formattedNumber; 43 public String geoDescription; 44 /* 45 * ContactInfo.normalizedNumber is a column value returned by PhoneLookup query. By definition, 46 * it's E164 representation. 47 * http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookupColumns. 48 * html#NORMALIZED_NUMBER. 49 * 50 * The fallback value, when PhoneLookup fails or else, should be either null or 51 * PhoneNumberUtils.formatNumberToE164. 52 */ 53 public String normalizedNumber; 54 /** The photo for the contact, if available. */ 55 public long photoId; 56 /** The high-res photo for the contact, if available. */ 57 public Uri photoUri; 58 59 public boolean isBadData; 60 public String objectId; 61 public @UserType long userType; 62 public @NonNull ContactSource.Type sourceType = ContactSource.Type.UNKNOWN_SOURCE_TYPE; 63 /** 64 * True if local contact exists. This is only used for Cequint Caller ID so it won't overwrite 65 * photo if local contact exists. 66 */ 67 public boolean contactExists; 68 69 /** @see android.provider.ContactsContract.CommonDataKinds.Phone#CARRIER_PRESENCE */ 70 public int carrierPresence; 71 72 @Override hashCode()73 public int hashCode() { 74 // Uses only name and contactUri to determine hashcode. 75 // This should be sufficient to have a reasonable distribution of hash codes. 76 // Moreover, there should be no two people with the same lookupUri. 77 final int prime = 31; 78 int result = 1; 79 result = prime * result + ((lookupUri == null) ? 0 : lookupUri.hashCode()); 80 result = prime * result + ((name == null) ? 0 : name.hashCode()); 81 return result; 82 } 83 84 @Override equals(Object obj)85 public boolean equals(Object obj) { 86 if (this == obj) { 87 return true; 88 } 89 if (obj == null) { 90 return false; 91 } 92 if (getClass() != obj.getClass()) { 93 return false; 94 } 95 ContactInfo other = (ContactInfo) obj; 96 if (!UriUtils.areEqual(lookupUri, other.lookupUri)) { 97 return false; 98 } 99 if (!TextUtils.equals(name, other.name)) { 100 return false; 101 } 102 if (!TextUtils.equals(nameAlternative, other.nameAlternative)) { 103 return false; 104 } 105 if (type != other.type) { 106 return false; 107 } 108 if (!TextUtils.equals(label, other.label)) { 109 return false; 110 } 111 if (!TextUtils.equals(number, other.number)) { 112 return false; 113 } 114 if (!TextUtils.equals(formattedNumber, other.formattedNumber)) { 115 return false; 116 } 117 if (!TextUtils.equals(normalizedNumber, other.normalizedNumber)) { 118 return false; 119 } 120 if (photoId != other.photoId) { 121 return false; 122 } 123 if (!UriUtils.areEqual(photoUri, other.photoUri)) { 124 return false; 125 } 126 if (!TextUtils.equals(objectId, other.objectId)) { 127 return false; 128 } 129 if (userType != other.userType) { 130 return false; 131 } 132 if (carrierPresence != other.carrierPresence) { 133 return false; 134 } 135 if (!TextUtils.equals(geoDescription, other.geoDescription)) { 136 return false; 137 } 138 return true; 139 } 140 141 @Override toString()142 public String toString() { 143 return "ContactInfo{" 144 + "lookupUri=" 145 + lookupUri 146 + ", name='" 147 + name 148 + '\'' 149 + ", nameAlternative='" 150 + nameAlternative 151 + '\'' 152 + ", type=" 153 + type 154 + ", label='" 155 + label 156 + '\'' 157 + ", number='" 158 + number 159 + '\'' 160 + ", formattedNumber='" 161 + formattedNumber 162 + '\'' 163 + ", normalizedNumber='" 164 + normalizedNumber 165 + '\'' 166 + ", photoId=" 167 + photoId 168 + ", photoUri=" 169 + photoUri 170 + ", objectId='" 171 + objectId 172 + '\'' 173 + ", userType=" 174 + userType 175 + ", carrierPresence=" 176 + carrierPresence 177 + ", geoDescription=" 178 + geoDescription 179 + '}'; 180 } 181 } 182