• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.annotation.TargetApi;
20 import android.content.Context;
21 import android.os.Build;
22 import android.os.Bundle;
23 import android.telecom.PhoneAccount;
24 import android.telephony.SubscriptionInfo;
25 import android.telephony.TelephonyManager;
26 import com.android.dialer.assisteddialing.AssistedDialingMediator;
27 import com.android.dialer.assisteddialing.ConcreteCreator;
28 import com.android.dialer.assisteddialing.TransformationInfo;
29 import com.android.dialer.callintent.CallIntentBuilder;
30 import com.android.dialer.common.Assert;
31 import com.android.dialer.common.LogUtil;
32 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
33 import com.android.dialer.configprovider.ConfigProvider;
34 import com.android.dialer.configprovider.ConfigProviderBindings;
35 import com.android.dialer.precall.PreCallAction;
36 import com.android.dialer.precall.PreCallCoordinator;
37 import com.android.dialer.telecom.TelecomUtil;
38 import com.android.dialer.util.CallUtil;
39 import java.util.Optional;
40 
41 /** Rewrites the call URI with country code. */
42 public class AssistedDialAction implements PreCallAction {
43 
44   @Override
requiresUi(Context context, CallIntentBuilder builder)45   public boolean requiresUi(Context context, CallIntentBuilder builder) {
46     return false;
47   }
48 
49   @SuppressWarnings("AndroidApiChecker") // Use of optional
50   @TargetApi(Build.VERSION_CODES.N)
51   @Override
runWithoutUi(Context context, CallIntentBuilder builder)52   public void runWithoutUi(Context context, CallIntentBuilder builder) {
53     if (!builder.isAssistedDialAllowed()) {
54       return;
55     }
56 
57     AssistedDialingMediator assistedDialingMediator =
58         ConcreteCreator.createNewAssistedDialingMediator(
59             getAssistedDialingTelephonyManager(context, builder), context);
60 
61     // Checks the platform is N+ and meets other pre-flight checks.
62     if (!assistedDialingMediator.isPlatformEligible()) {
63       return;
64     }
65     String phoneNumber =
66         builder.getUri().getScheme().equals(PhoneAccount.SCHEME_TEL)
67             ? builder.getUri().getSchemeSpecificPart()
68             : "";
69     Optional<TransformationInfo> transformedNumber =
70         assistedDialingMediator.attemptAssistedDial(phoneNumber);
71     if (transformedNumber.isPresent()) {
72       builder.getOutgoingCallExtras().putBoolean(TelephonyManagerCompat.USE_ASSISTED_DIALING, true);
73       Bundle assistedDialingExtras = transformedNumber.get().toBundle();
74       builder
75           .getOutgoingCallExtras()
76           .putBundle(TelephonyManagerCompat.ASSISTED_DIALING_EXTRAS, assistedDialingExtras);
77       builder.setUri(
78           CallUtil.getCallUri(Assert.isNotNull(transformedNumber.get().transformedNumber())));
79       LogUtil.i("AssistedDialAction.runWithoutUi", "assisted dialing was used.");
80     }
81   }
82 
83   /**
84    * A convenience method to return the proper TelephonyManager in possible multi-sim environments.
85    */
86   @SuppressWarnings("AndroidApiChecker") // Use of createForSubscriptionId
87   @TargetApi(Build.VERSION_CODES.N)
getAssistedDialingTelephonyManager( Context context, CallIntentBuilder builder)88   private TelephonyManager getAssistedDialingTelephonyManager(
89       Context context, CallIntentBuilder builder) {
90 
91     ConfigProvider configProvider = ConfigProviderBindings.get(context);
92     TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
93     // None of this will be required in the framework because the PhoneAccountHandle
94     // is already mapped to the request in the TelecomConnection.
95     if (builder.getPhoneAccountHandle() == null) {
96       return telephonyManager;
97     }
98 
99     if (!configProvider.getBoolean("assisted_dialing_dual_sim_enabled", false)) {
100       return telephonyManager;
101     }
102 
103     com.google.common.base.Optional<SubscriptionInfo> subscriptionInfo =
104         TelecomUtil.getSubscriptionInfo(context, builder.getPhoneAccountHandle());
105     if (!subscriptionInfo.isPresent()) {
106       LogUtil.i(
107           "AssistedDialAction.getAssistedDialingTelephonyManager", "subcriptionInfo was absent.");
108       return telephonyManager;
109     }
110     TelephonyManager pinnedtelephonyManager =
111         telephonyManager.createForSubscriptionId(subscriptionInfo.get().getSubscriptionId());
112     if (pinnedtelephonyManager == null) {
113       LogUtil.i(
114           "AssistedDialAction.getAssistedDialingTelephonyManager",
115           "createForSubscriptionId pinnedtelephonyManager was null.");
116       return telephonyManager;
117     }
118     LogUtil.i(
119         "AssistedDialAction.getAssistedDialingTelephonyManager",
120         "createForPhoneAccountHandle using pinnedtelephonyManager from subscription id.");
121     return pinnedtelephonyManager;
122   }
123 
124   @Override
runWithUi(PreCallCoordinator coordinator)125   public void runWithUi(PreCallCoordinator coordinator) {
126     runWithoutUi(coordinator.getActivity(), coordinator.getBuilder());
127   }
128 
129   @Override
onDiscard()130   public void onDiscard() {}
131 }
132