12f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian/*
22f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * Copyright (C) 2017 The Android Open Source Project
32f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian *
42f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
52f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * you may not use this file except in compliance with the License.
62f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * You may obtain a copy of the License at
72f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian *
82f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
92f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian *
102f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * Unless required by applicable law or agreed to in writing, software
112f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
122f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * See the License for the specific language governing permissions and
142f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * limitations under the License.
152f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian */
162f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
172f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianpackage com.android.dialer.phonenumberproto;
182f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
192f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.support.annotation.NonNull;
202f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.support.annotation.Nullable;
212f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport android.support.annotation.WorkerThread;
222f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.DialerInternalPhoneNumber;
232f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.DialerPhoneNumber;
242f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.DialerPhoneNumber.RawInput;
252f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.common.Assert;
262f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.common.LogUtil;
272f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.google.i18n.phonenumbers.NumberParseException;
282f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.google.i18n.phonenumbers.PhoneNumberUtil;
292f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType;
302f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
312f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian/**
322f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * Wrapper for selected methods in {@link PhoneNumberUtil} which uses the {@link DialerPhoneNumber}
332f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * lite proto instead of the {@link com.google.i18n.phonenumbers.Phonenumber.PhoneNumber} POJO.
342f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian *
352f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian * <p>All methods should be called on a worker thread.
362f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian */
372f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianpublic class DialerPhoneNumberUtil {
382f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  private final PhoneNumberUtil phoneNumberUtil;
392f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
402f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  @WorkerThread
412f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  public DialerPhoneNumberUtil(@NonNull PhoneNumberUtil phoneNumberUtil) {
422f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    Assert.isWorkerThread();
432f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    this.phoneNumberUtil = Assert.isNotNull(phoneNumberUtil);
442f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  }
452f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
462f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  /**
472f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   * Parses the provided raw phone number into a {@link DialerPhoneNumber}.
482f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   *
492f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   * @see PhoneNumberUtil#parse(String, String)
502f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   */
512f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  @WorkerThread
522f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  public DialerPhoneNumber parse(@Nullable String numberToParse, @Nullable String defaultRegion) {
532f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    Assert.isWorkerThread();
542f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
552f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    DialerPhoneNumber.Builder dialerPhoneNumber = DialerPhoneNumber.newBuilder();
562f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    RawInput.Builder rawInput = RawInput.newBuilder();
572f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    // Numbers can be null or empty for incoming "unknown" calls.
582f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    if (numberToParse != null) {
592f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      rawInput.setNumber(numberToParse);
602f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    }
612f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    if (defaultRegion != null) {
622f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      rawInput.setCountryIso(defaultRegion);
632f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    }
642f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    dialerPhoneNumber.setRawInput(rawInput.build());
652f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
662f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    try {
672f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      dialerPhoneNumber.setDialerInternalPhoneNumber(
682f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian          Converter.pojoToProto(phoneNumberUtil.parse(numberToParse, defaultRegion)));
692f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    } catch (NumberParseException e) {
702f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      LogUtil.w("DialerPhoneNumberUtil.parse", "couldn't parse phone number", e);
712f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    }
722f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    return dialerPhoneNumber.build();
732f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  }
742f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
752f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  /**
762f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   * Returns true if the two numbers were parseable by libphonenumber and are an {@link
772f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   * MatchType#EXACT_MATCH} or if they have the same raw input.
782f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   */
792f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  @WorkerThread
802f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  public boolean isExactMatch(
812f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      @NonNull DialerPhoneNumber firstNumberIn, @NonNull DialerPhoneNumber secondNumberIn) {
822f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    Assert.isWorkerThread();
832f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    if (!Assert.isNotNull(firstNumberIn).hasDialerInternalPhoneNumber()
842f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian        || !Assert.isNotNull(secondNumberIn).hasDialerInternalPhoneNumber()) {
852f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      return firstNumberIn.getRawInput().equals(secondNumberIn.getRawInput());
862f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    }
872f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    return isNumberMatch(
882f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian            firstNumberIn.getDialerInternalPhoneNumber(),
892f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian            secondNumberIn.getDialerInternalPhoneNumber())
902f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian        == MatchType.EXACT_MATCH;
912f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  }
922f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian
932f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  /**
942f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   * Compares the provided phone numbers.
952f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   *
962f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   * @see PhoneNumberUtil#isNumberMatch(com.google.i18n.phonenumbers.Phonenumber.PhoneNumber,
972f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   *     com.google.i18n.phonenumbers.Phonenumber.PhoneNumber)
982f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian   */
992f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  @WorkerThread
1002f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  private MatchType isNumberMatch(
1012f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      @NonNull DialerInternalPhoneNumber firstNumberIn,
1022f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian      @NonNull DialerInternalPhoneNumber secondNumberIn) {
1032f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    Assert.isWorkerThread();
1042f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian    return phoneNumberUtil.isNumberMatch(
1052f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian        Converter.protoToPojo(Assert.isNotNull(firstNumberIn)),
1062f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian        Converter.protoToPojo(Assert.isNotNull(secondNumberIn)));
1072f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian  }
1082f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian}
109