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