1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2015 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License.
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.app.contactinfo;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.IntDef;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.text.TextUtils;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.phonenumbercache.ContactInfo;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.lang.annotation.Retention;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.lang.annotation.RetentionPolicy;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Objects;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.concurrent.atomic.AtomicLong;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** A request for contact details for the given number, used by the ContactInfoCache. */
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic final class ContactInfoRequest implements Comparable<ContactInfoRequest> {
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final AtomicLong NEXT_SEQUENCE_NUMBER = new AtomicLong(0);
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private final long sequenceNumber;
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** The number to look-up. */
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public final String number;
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** The country in which a call to or from this number was placed or received. */
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public final String countryIso;
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** The cached contact information stored in the call log. */
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public final ContactInfo callLogInfo;
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** Is the request a remote lookup. Remote requests are treated as lower priority. */
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @TYPE public final int type;
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** Specifies the type of the request is. */
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @IntDef(
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    value = {
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      TYPE_LOCAL,
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      TYPE_LOCAL_AND_REMOTE,
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      TYPE_REMOTE,
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  )
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Retention(RetentionPolicy.SOURCE)
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public @interface TYPE {}
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static final int TYPE_LOCAL = 0;
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** If cannot find the contact locally, do remote lookup later. */
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static final int TYPE_LOCAL_AND_REMOTE = 1;
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static final int TYPE_REMOTE = 2;
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public ContactInfoRequest(
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      String number, String countryIso, ContactInfo callLogInfo, @TYPE int type) {
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.sequenceNumber = NEXT_SEQUENCE_NUMBER.getAndIncrement();
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.number = number;
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.countryIso = countryIso;
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.callLogInfo = callLogInfo;
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.type = type;
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean equals(Object obj) {
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (this == obj) {
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return true;
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (obj == null) {
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!(obj instanceof ContactInfoRequest)) {
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    ContactInfoRequest other = (ContactInfoRequest) obj;
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!TextUtils.equals(number, other.number)) {
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!TextUtils.equals(countryIso, other.countryIso)) {
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!Objects.equals(callLogInfo, other.callLogInfo)) {
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (type != other.type) {
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return false;
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return true;
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isLocalRequest() {
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return type == TYPE_LOCAL || type == TYPE_LOCAL_AND_REMOTE;
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int hashCode() {
107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return Objects.hash(sequenceNumber, number, countryIso, callLogInfo, type);
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int compareTo(ContactInfoRequest other) {
112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // Local query always comes first.
113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (isLocalRequest() && !other.isLocalRequest()) {
114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return -1;
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (!isLocalRequest() && other.isLocalRequest()) {
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return 1;
118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // First come first served.
120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return sequenceNumber < other.sequenceNumber ? -1 : 1;
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
123