| package com.android.phone; |
| |
| import static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR; |
| import com.android.internal.telephony.CommandException; |
| import com.android.internal.telephony.CommandsInterface; |
| import com.android.internal.telephony.Phone; |
| |
| import android.content.Context; |
| import android.os.AsyncResult; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.os.Parcelable; |
| import android.preference.ListPreference; |
| import android.util.AttributeSet; |
| import android.util.Log; |
| |
| /** |
| * {@link ListPreference} for CLIR (Calling Line Identification Restriction). |
| * Right now this is used for "Caller ID" setting. |
| */ |
| public class CLIRListPreference extends ListPreference { |
| private static final String LOG_TAG = "CLIRListPreference"; |
| private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); |
| |
| private final MyHandler mHandler = new MyHandler(); |
| private Phone mPhone; |
| private TimeConsumingPreferenceListener mTcpListener; |
| |
| int clirArray[]; |
| |
| public CLIRListPreference(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| } |
| |
| public CLIRListPreference(Context context) { |
| this(context, null); |
| } |
| |
| @Override |
| protected void onDialogClosed(boolean positiveResult) { |
| super.onDialogClosed(positiveResult); |
| |
| mPhone.setOutgoingCallerIdDisplay(findIndexOfValue(getValue()), |
| mHandler.obtainMessage(MyHandler.MESSAGE_SET_CLIR)); |
| if (mTcpListener != null) { |
| mTcpListener.onStarted(this, false); |
| } |
| } |
| |
| /* package */ void init( |
| TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) { |
| mPhone = phone; |
| mTcpListener = listener; |
| if (!skipReading) { |
| mPhone.getOutgoingCallerIdDisplay(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CLIR, |
| MyHandler.MESSAGE_GET_CLIR, MyHandler.MESSAGE_GET_CLIR)); |
| if (mTcpListener != null) { |
| mTcpListener.onStarted(this, true); |
| } |
| } |
| } |
| |
| /* package */ void handleGetCLIRResult(int tmpClirArray[]) { |
| clirArray = tmpClirArray; |
| final boolean enabled = |
| tmpClirArray[1] == 1 || tmpClirArray[1] == 3 || tmpClirArray[1] == 4; |
| setEnabled(enabled); |
| |
| // set the value of the preference based upon the clirArgs. |
| int value = CommandsInterface.CLIR_DEFAULT; |
| switch (tmpClirArray[1]) { |
| case 1: // Permanently provisioned |
| case 3: // Temporary presentation disallowed |
| case 4: // Temporary presentation allowed |
| switch (tmpClirArray[0]) { |
| case 1: // CLIR invoked |
| value = CommandsInterface.CLIR_INVOCATION; |
| break; |
| case 2: // CLIR suppressed |
| value = CommandsInterface.CLIR_SUPPRESSION; |
| break; |
| case 0: // Network default |
| default: |
| value = CommandsInterface.CLIR_DEFAULT; |
| break; |
| } |
| break; |
| case 0: // Not Provisioned |
| case 2: // Unknown (network error, etc) |
| default: |
| value = CommandsInterface.CLIR_DEFAULT; |
| break; |
| } |
| setValueIndex(value); |
| |
| // set the string summary to reflect the value |
| int summary = R.string.sum_default_caller_id; |
| switch (value) { |
| case CommandsInterface.CLIR_SUPPRESSION: |
| summary = R.string.sum_show_caller_id; |
| break; |
| case CommandsInterface.CLIR_INVOCATION: |
| summary = R.string.sum_hide_caller_id; |
| break; |
| case CommandsInterface.CLIR_DEFAULT: |
| summary = R.string.sum_default_caller_id; |
| break; |
| } |
| setSummary(summary); |
| } |
| |
| private class MyHandler extends Handler { |
| static final int MESSAGE_GET_CLIR = 0; |
| static final int MESSAGE_SET_CLIR = 1; |
| |
| @Override |
| public void handleMessage(Message msg) { |
| switch (msg.what) { |
| case MESSAGE_GET_CLIR: |
| handleGetCLIRResponse(msg); |
| break; |
| case MESSAGE_SET_CLIR: |
| handleSetCLIRResponse(msg); |
| break; |
| } |
| } |
| |
| private void handleGetCLIRResponse(Message msg) { |
| AsyncResult ar = (AsyncResult) msg.obj; |
| |
| if (msg.arg2 == MESSAGE_SET_CLIR) { |
| mTcpListener.onFinished(CLIRListPreference.this, false); |
| } else { |
| mTcpListener.onFinished(CLIRListPreference.this, true); |
| } |
| clirArray = null; |
| if (ar.exception != null) { |
| if (DBG) Log.d(LOG_TAG, "handleGetCLIRResponse: ar.exception="+ar.exception); |
| mTcpListener.onException(CLIRListPreference.this, (CommandException) ar.exception); |
| } else if (ar.userObj instanceof Throwable) { |
| mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR); |
| } else { |
| int clirArray[] = (int[]) ar.result; |
| if (clirArray.length != 2) { |
| mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR); |
| } else { |
| if (DBG) { |
| Log.d(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried," |
| + " clirArray[0]=" + clirArray[0] |
| + ", clirArray[1]=" + clirArray[1]); |
| } |
| handleGetCLIRResult(clirArray); |
| } |
| } |
| } |
| |
| private void handleSetCLIRResponse(Message msg) { |
| AsyncResult ar = (AsyncResult) msg.obj; |
| |
| if (ar.exception != null) { |
| if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: ar.exception="+ar.exception); |
| //setEnabled(false); |
| } |
| if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: re get"); |
| |
| mPhone.getOutgoingCallerIdDisplay(obtainMessage(MESSAGE_GET_CLIR, |
| MESSAGE_SET_CLIR, MESSAGE_SET_CLIR, ar.exception)); |
| } |
| } |
| } |