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