17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandException; 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR; 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult; 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message; 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.CheckBoxPreference; 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.AttributeSet; 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class CallWaitingCheckBoxPreference extends CheckBoxPreference { 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "CallWaitingCheckBoxPreference"; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final MyHandler mHandler = new MyHandler(); 232b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee private Phone mPhone; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private TimeConsumingPreferenceListener mTcpListener; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CallWaitingCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) { 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super(context, attrs, defStyle); 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CallWaitingCheckBoxPreference(Context context, AttributeSet attrs) { 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon this(context, attrs, com.android.internal.R.attr.checkBoxPreferenceStyle); 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CallWaitingCheckBoxPreference(Context context) { 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon this(context, null); 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 382b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee /* package */ void init( 392b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) { 402b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mPhone = phone; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener = listener; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!skipReading) { 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone.getCallWaiting(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CALL_WAITING, 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MyHandler.MESSAGE_GET_CALL_WAITING, MyHandler.MESSAGE_GET_CALL_WAITING)); 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mTcpListener != null) { 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener.onStarted(this, true); 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onClick() { 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onClick(); 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone.setCallWaiting(isChecked(), 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mHandler.obtainMessage(MyHandler.MESSAGE_SET_CALL_WAITING)); 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mTcpListener != null) { 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener.onStarted(this, false); 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class MyHandler extends Handler { 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final int MESSAGE_GET_CALL_WAITING = 0; 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final int MESSAGE_SET_CALL_WAITING = 1; 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MESSAGE_GET_CALL_WAITING: 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleGetCallWaitingResponse(msg); 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MESSAGE_SET_CALL_WAITING: 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleSetCallWaitingResponse(msg); 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleGetCallWaitingResponse(Message msg) { 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mTcpListener != null) { 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (msg.arg2 == MESSAGE_SET_CALL_WAITING) { 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener.onFinished(CallWaitingCheckBoxPreference.this, false); 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener.onFinished(CallWaitingCheckBoxPreference.this, true); 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 902333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee if (ar.exception instanceof CommandException) { 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) { 922333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee Log.d(LOG_TAG, "handleGetCallWaitingResponse: CommandException=" + 932333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee ar.exception); 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mTcpListener != null) { 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener.onException(CallWaitingCheckBoxPreference.this, 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (CommandException)ar.exception); 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 992333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee } else if (ar.userObj instanceof Throwable || ar.exception != null) { 1002333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee // Still an error case but just not a CommandException. 1012333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee if (DBG) { 1022333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee Log.d(LOG_TAG, "handleGetCallWaitingResponse: Exception" + ar.exception); 1032333fc1b0666a9102bd8dc63eb6e073dcb98a1f9Anthony Lee } 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mTcpListener != null) { 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTcpListener.onError(CallWaitingCheckBoxPreference.this, RESPONSE_ERROR); 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) { 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "handleGetCallWaitingResponse: CW state successfully queried."); 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int[] cwArray = (int[])ar.result; 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // If cwArray[0] is = 1, then cwArray[1] must follow, 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // with the TS 27.007 service class bit vector of services 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // for which call waiting is enabled. 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setChecked(((cwArray[0] == 1) && ((cwArray[1] & 0x01) == 0x01))); 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (ArrayIndexOutOfBoundsException e) { 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "handleGetCallWaitingResponse: improper result: err =" 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + e.getMessage()); 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleSetCallWaitingResponse(Message msg) { 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception != null) { 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) { 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "handleSetCallWaitingResponse: ar.exception=" + ar.exception); 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //setEnabled(false); 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: re get"); 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone.getCallWaiting(obtainMessage(MESSAGE_GET_CALL_WAITING, 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MESSAGE_SET_CALL_WAITING, MESSAGE_SET_CALL_WAITING, ar.exception)); 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 140