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.simulator.impl; 18 19 import android.content.ComponentName; 20 import android.content.Context; 21 import android.net.Uri; 22 import android.telecom.Connection; 23 import android.telecom.ConnectionRequest; 24 import android.telecom.ConnectionService; 25 import android.telecom.PhoneAccount; 26 import android.telecom.PhoneAccountHandle; 27 import android.telecom.TelecomManager; 28 import android.telephony.TelephonyManager; 29 import com.android.dialer.common.LogUtil; 30 import java.util.ArrayList; 31 import java.util.List; 32 33 /** Simple connection provider to create an incoming call. This is useful for emulators. */ 34 public final class SimulatorConnectionService extends ConnectionService { 35 36 private static final String PHONE_ACCOUNT_ID = "SIMULATOR_ACCOUNT_ID"; 37 register(Context context)38 public static void register(Context context) { 39 LogUtil.enterBlock("SimulatorConnectionService.register"); 40 context.getSystemService(TelecomManager.class).registerPhoneAccount(buildPhoneAccount(context)); 41 } 42 buildPhoneAccount(Context context)43 private static PhoneAccount buildPhoneAccount(Context context) { 44 PhoneAccount.Builder builder = 45 new PhoneAccount.Builder( 46 getConnectionServiceHandle(context), "Simulator connection service"); 47 List<String> uriSchemes = new ArrayList<>(); 48 uriSchemes.add(PhoneAccount.SCHEME_TEL); 49 50 return builder 51 .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER) 52 .setShortDescription("Simulator Connection Service") 53 .setSupportedUriSchemes(uriSchemes) 54 .build(); 55 } 56 getConnectionServiceHandle(Context context)57 public static PhoneAccountHandle getConnectionServiceHandle(Context context) { 58 return new PhoneAccountHandle( 59 new ComponentName(context, SimulatorConnectionService.class), PHONE_ACCOUNT_ID); 60 } 61 getPhoneNumber(ConnectionRequest request)62 private static Uri getPhoneNumber(ConnectionRequest request) { 63 String phoneNumber = request.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 64 return Uri.fromParts(PhoneAccount.SCHEME_TEL, phoneNumber, null); 65 } 66 67 @Override onCreateOutgoingConnection( PhoneAccountHandle phoneAccount, ConnectionRequest request)68 public Connection onCreateOutgoingConnection( 69 PhoneAccountHandle phoneAccount, ConnectionRequest request) { 70 LogUtil.i( 71 "SimulatorConnectionService.onCreateOutgoingConnection", 72 "outgoing calls not supported yet"); 73 return null; 74 } 75 76 @Override onCreateIncomingConnection( PhoneAccountHandle phoneAccount, ConnectionRequest request)77 public Connection onCreateIncomingConnection( 78 PhoneAccountHandle phoneAccount, ConnectionRequest request) { 79 LogUtil.enterBlock("SimulatorConnectionService.onCreateIncomingConnection"); 80 SimulatorConnection connection = new SimulatorConnection(); 81 connection.setRinging(); 82 connection.setAddress(getPhoneNumber(request), TelecomManager.PRESENTATION_ALLOWED); 83 connection.setConnectionCapabilities( 84 Connection.CAPABILITY_MUTE | Connection.CAPABILITY_SUPPORT_HOLD); 85 return connection; 86 } 87 } 88