1 /*
2  * Copyright (C) 2018 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.precall.impl;
18 
19 import android.content.Context;
20 import android.net.Uri;
21 import android.support.annotation.MainThread;
22 import android.telecom.PhoneAccount;
23 import com.android.dialer.callintent.CallIntentBuilder;
24 import com.android.dialer.precall.PreCallAction;
25 import com.android.dialer.precall.PreCallCoordinator;
26 import com.google.common.base.Optional;
27 import com.google.common.collect.ImmutableList;
28 
29 /**
30  * Fix common malformed number before it is dialed. Rewrite the number to the first handler that can
31  * handle it
32  */
33 public class MalformedNumberRectifier implements PreCallAction {
34 
35   /** Handler for individual rules. */
36   public interface MalformedNumberHandler {
37 
38     /** @return the number to be corrected to. */
39     @MainThread
handle(Context context, String number)40     Optional<String> handle(Context context, String number);
41   }
42 
43   private final ImmutableList<MalformedNumberHandler> handlers;
44 
MalformedNumberRectifier(ImmutableList<MalformedNumberHandler> handlers)45   MalformedNumberRectifier(ImmutableList<MalformedNumberHandler> handlers) {
46     this.handlers = handlers;
47   }
48 
49   @Override
requiresUi(Context context, CallIntentBuilder builder)50   public boolean requiresUi(Context context, CallIntentBuilder builder) {
51     return false;
52   }
53 
54   @Override
runWithoutUi(Context context, CallIntentBuilder builder)55   public void runWithoutUi(Context context, CallIntentBuilder builder) {
56     if (!PhoneAccount.SCHEME_TEL.equals(builder.getUri().getScheme())) {
57       return;
58     }
59     String number = builder.getUri().getSchemeSpecificPart();
60 
61     for (MalformedNumberHandler handler : handlers) {
62       Optional<String> result = handler.handle(context, number);
63       if (result.isPresent()) {
64         builder.setUri(Uri.fromParts(PhoneAccount.SCHEME_TEL, result.get(), null));
65         return;
66       }
67     }
68   }
69 
70   @Override
runWithUi(PreCallCoordinator coordinator)71   public void runWithUi(PreCallCoordinator coordinator) {
72     runWithoutUi(coordinator.getActivity(), coordinator.getBuilder());
73   }
74 
75   @Override
onDiscard()76   public void onDiscard() {}
77 }
78