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