17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2010 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone.tests; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.Activity; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ActivityNotFoundException; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.RemoteException; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.ServiceManager; 264d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccount; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.telephony.PhoneNumberUtils; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.Button; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.EditText; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.Toast; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.ITelephony; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Test activity that mimics the behavior of 3rd party apps firing off 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * CALL and DIAL intents. 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class CallDialTest extends Activity implements View.OnClickListener { 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "CallDialTest"; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // UI elements 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private TextView mLabel; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private EditText mNumber; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onCreate(Bundle savedInstanceState) { 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = getIntent(); 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onCreate: intent = " + intent); 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Construct our basic UI: 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(savedInstanceState); 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setContentView(R.layout.call_dial_test); 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mLabel = (TextView) findViewById(R.id.label1); 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNumber = (EditText) findViewById(R.id.number); 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNumber.setText("6505551234"); // Preload it with something useful 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ((Button) findViewById(R.id.callButton)).setOnClickListener(this); 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ((Button) findViewById(R.id.dialButton)).setOnClickListener(this); 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ((Button) findViewById(R.id.itelephonyCallButton)).setOnClickListener(this); 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ((Button) findViewById(R.id.itelephonyDialButton)).setOnClickListener(this); 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onResume() { 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onResume()..."); 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onResume(); 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onPause() { 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onPause()..."); 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onPause(); 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // View.OnClickListener implementation 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(View view) { 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int id = view.getId(); 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onClick(View " + view + ", id " + id + ")..."); 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (id) { 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.callButton: 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onClick: CALL..."); 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon fireIntent(Intent.ACTION_CALL); 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.dialButton: 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onClick: DIAL..."); 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon fireIntent(Intent.ACTION_DIAL); 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.itelephonyCallButton: 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onClick: ITelephony.call()..."); 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon doITelephonyCall(); 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case R.id.itelephonyDialButton: 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("onClick: ITelephony.dial()..."); 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon doITelephonyDial(); 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.wtf(LOG_TAG, "onClick: unexpected View: " + view); 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void fireIntent(String action) { 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("fireIntent(action = '" + action + "')..."); 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Get a phone number or SIP address from the EditText widget 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String number = mNumber.getText().toString(); 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("==> number: '" + number + "'"); 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Based on the number, fire off a CALL or DIAL intent: 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - if it's a fully qualified URI (with scheme), use it directly 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - if it looks like a SIP address, prepend sip: 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - if it's just a number, prepend tel: automatically 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // - if it's blank, fire off a blank CALL or DIAL intent 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Uri uri = null; 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TextUtils.isEmpty(number)) { 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (number.contains(":")) { 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon uri = Uri.parse(number); 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (PhoneNumberUtils.isUriNumber(number)) { 128137458b4bf3516941483e59c123c22cbee27ed43Jay Shrauner uri = Uri.fromParts(PhoneAccount.SCHEME_SIP, number, null); 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 130137458b4bf3516941483e59c123c22cbee27ed43Jay Shrauner uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null); 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("==> uri: " + uri); 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(action, uri); 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("==> intent: " + intent); 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startActivity(intent); 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Toast.makeText(this, "Starting activity...", Toast.LENGTH_SHORT).show(); 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (ActivityNotFoundException e) { 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "testCall: ActivityNotFoundException for intent: " + intent); 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show(); 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "testCall: Unexpected exception from startActivity(): " + e); 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show(); 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void doITelephonyCall() { 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("doITelephonyCall()..."); 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Get a phone number from the EditText widget 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String number = mNumber.getText().toString(); 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("==> number: '" + number + "'"); 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("- phone: " + phone); 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("- calling call()..."); 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phone.call(getPackageName(), number); 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log(" Done."); 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (RemoteException ex) { 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "RemoteException!", ex); 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void doITelephonyDial() { 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("doITelephonyDial()..."); 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Get a phone number from the EditText widget 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String number = mNumber.getText().toString(); 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("==> number: '" + number + "'"); 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("- phone: " + phone); 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("- calling dial()..."); 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phone.dial(number); 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log(" Done."); 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (RemoteException ex) { 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "RemoteException!", ex); 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void log(String msg) { 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, msg); 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 190