package com.android.phone; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; public class IpDialCallDialog extends Activity { private static final String TAG = "IpDialCallDialog"; public static final String DIAL_TYPE = "dial_type"; private Dialog mIpDialingDialog = null; private CharSequence mIpSelectedNumber = ""; private String mNumber; private int mType; private Intent mIntent; private List<CharSequence> mSelector = new ArrayList<CharSequence>(); private static final String EXCLUDE_PREFIX[] = new String[] { "+86" }; private static final int PLACE_CALL = 101; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case PLACE_CALL: placeCall(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v(TAG, "onCreate: this = " + this); IpDailingUtils ipUtils = new IpDailingUtils( this.getApplicationContext()); mIntent = (Intent) getIntent().getParcelableExtra( OutgoingCallBroadcaster.EXTRA_NEW_CALL_INTENT); if (mIntent == null) { finish(); return; } Intent intent = getIntent(); mType = intent.getIntExtra(DIAL_TYPE, 0); mNumber = mIntent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); // is ipdialing if (mType == 1) { String ipNumbers = ipUtils.getAllIpNumberString(); if (!TextUtils.isEmpty(ipNumbers)) { String ipNumber[] = ipNumbers.split("\\|"); List<CharSequence> items = new ArrayList<CharSequence>(); mSelector.clear(); items.add(getResources().getString(R.string.directly_call)); mSelector.add(""); for (String num : ipNumber) { if (!TextUtils.isEmpty(num) && TextUtils.isDigitsOnly(num)) { mSelector.add(num); items.add(getResources().getString(R.string.ip_call) + " " + num); } } mIpDialingDialog = new AlertDialog.Builder(this) .setOnKeyListener(new DialogInterface.OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_CALL: case KeyEvent.KEYCODE_SEARCH: return true; } return false; } }) .setTitle(R.string.dialing_selector) .setSingleChoiceItems( items.toArray(new CharSequence[0]), 0, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which > 0 && which < mSelector.size()) { mIpSelectedNumber = mSelector .get(which); for (String prefix : EXCLUDE_PREFIX) { if (mNumber.startsWith(prefix)) { mNumber = mNumber .substring(prefix .length()); break; } } if (mNumber .startsWith(mIpSelectedNumber .toString())) { mNumber = mNumber .substring(mIpSelectedNumber .length()); } mNumber = mIpSelectedNumber + mNumber; } dialog.dismiss(); mHandler.sendEmptyMessage(PLACE_CALL); } }) .setOnCancelListener( new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { finish(); } }).create(); mIpDialingDialog.show(); } } Log.v(TAG, "onCreate: done"); } @Override protected void onDestroy() { if (mIpDialingDialog != null) { mIpDialingDialog.dismiss(); mIpDialingDialog = null; } super.onDestroy(); } void placeCall() { if (mType == 1) { Log.v(TAG, "CALL to " + mNumber + " proceeding."); mIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, mNumber); Log.v(TAG, "doReceive(): calling startActivity: " + mIntent); startActivity(mIntent); } finish(); } }