blob: 939caf0b9b71ca0a5a095084ff37d7c954597969 [file] [log] [blame]
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));
}
}
}