• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.phone;
2 
3 import static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
4 import com.android.internal.telephony.CommandException;
5 import com.android.internal.telephony.CommandsInterface;
6 import com.android.internal.telephony.Phone;
7 
8 import android.content.Context;
9 import android.os.AsyncResult;
10 import android.os.Handler;
11 import android.os.Message;
12 import android.os.Parcelable;
13 import android.preference.ListPreference;
14 import android.util.AttributeSet;
15 import android.util.Log;
16 
17 /**
18  * {@link ListPreference} for CLIR (Calling Line Identification Restriction).
19  * Right now this is used for "Caller ID" setting.
20  */
21 public class CLIRListPreference extends ListPreference {
22     private static final String LOG_TAG = "CLIRListPreference";
23     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
24 
25     private final MyHandler mHandler = new MyHandler();
26     private Phone mPhone;
27     private TimeConsumingPreferenceListener mTcpListener;
28 
29     int clirArray[];
30 
CLIRListPreference(Context context, AttributeSet attrs)31     public CLIRListPreference(Context context, AttributeSet attrs) {
32         super(context, attrs);
33     }
34 
CLIRListPreference(Context context)35     public CLIRListPreference(Context context) {
36         this(context, null);
37     }
38 
39     @Override
onDialogClosed(boolean positiveResult)40     protected void onDialogClosed(boolean positiveResult) {
41         super.onDialogClosed(positiveResult);
42 
43         mPhone.setOutgoingCallerIdDisplay(findIndexOfValue(getValue()),
44                 mHandler.obtainMessage(MyHandler.MESSAGE_SET_CLIR));
45         if (mTcpListener != null) {
46             mTcpListener.onStarted(this, false);
47         }
48     }
49 
init( TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone)50     /* package */ void init(
51             TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
52         mPhone = phone;
53         mTcpListener = listener;
54         if (!skipReading) {
55             Log.i(LOG_TAG, "init: requesting CLIR");
56             mPhone.getOutgoingCallerIdDisplay(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CLIR,
57                     MyHandler.MESSAGE_GET_CLIR, MyHandler.MESSAGE_GET_CLIR));
58             if (mTcpListener != null) {
59                 mTcpListener.onStarted(this, true);
60             }
61         }
62     }
63 
handleGetCLIRResult(int tmpClirArray[])64     /* package */ void handleGetCLIRResult(int tmpClirArray[]) {
65         clirArray = tmpClirArray;
66         final boolean enabled =
67                 tmpClirArray[1] == 1 || tmpClirArray[1] == 3 || tmpClirArray[1] == 4;
68         setEnabled(enabled);
69 
70         // set the value of the preference based upon the clirArgs.
71         int value = CommandsInterface.CLIR_DEFAULT;
72         switch (tmpClirArray[1]) {
73             case 1: // Permanently provisioned
74             case 3: // Temporary presentation disallowed
75             case 4: // Temporary presentation allowed
76                 switch (tmpClirArray[0]) {
77                     case 1: // CLIR invoked
78                         value = CommandsInterface.CLIR_INVOCATION;
79                         break;
80                     case 2: // CLIR suppressed
81                         value = CommandsInterface.CLIR_SUPPRESSION;
82                         break;
83                     case 0: // Network default
84                     default:
85                         value = CommandsInterface.CLIR_DEFAULT;
86                         break;
87                 }
88                 break;
89             case 0: // Not Provisioned
90             case 2: // Unknown (network error, etc)
91             default:
92                 value = CommandsInterface.CLIR_DEFAULT;
93                 break;
94         }
95         setValueIndex(value);
96 
97         // set the string summary to reflect the value
98         int summary = R.string.sum_default_caller_id;
99         switch (value) {
100             case CommandsInterface.CLIR_SUPPRESSION:
101                 summary = R.string.sum_show_caller_id;
102                 break;
103             case CommandsInterface.CLIR_INVOCATION:
104                 summary = R.string.sum_hide_caller_id;
105                 break;
106             case CommandsInterface.CLIR_DEFAULT:
107                 summary = R.string.sum_default_caller_id;
108                 break;
109         }
110         setSummary(summary);
111     }
112 
113     private class MyHandler extends Handler {
114         static final int MESSAGE_GET_CLIR = 0;
115         static final int MESSAGE_SET_CLIR = 1;
116 
117         @Override
handleMessage(Message msg)118         public void handleMessage(Message msg) {
119             switch (msg.what) {
120                 case MESSAGE_GET_CLIR:
121                     handleGetCLIRResponse(msg);
122                     break;
123                 case MESSAGE_SET_CLIR:
124                     handleSetCLIRResponse(msg);
125                     break;
126             }
127         }
128 
handleGetCLIRResponse(Message msg)129         private void handleGetCLIRResponse(Message msg) {
130             AsyncResult ar = (AsyncResult) msg.obj;
131 
132             if (msg.arg2 == MESSAGE_SET_CLIR) {
133                 mTcpListener.onFinished(CLIRListPreference.this, false);
134             } else {
135                 mTcpListener.onFinished(CLIRListPreference.this, true);
136             }
137             clirArray = null;
138             if (ar.exception != null) {
139                 Log.i(LOG_TAG, "handleGetCLIRResponse: ar.exception=" + ar.exception);
140                 mTcpListener.onException(CLIRListPreference.this, (CommandException) ar.exception);
141             } else if (ar.userObj instanceof Throwable) {
142                 Log.i(LOG_TAG, "handleGetCLIRResponse: ar.throwable=" + ar.userObj);
143                 mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
144             } else {
145                 int clirArray[] = (int[]) ar.result;
146                 if (clirArray.length != 2) {
147                     mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
148                 } else {
149                     Log.i(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried,"
150                                 + " clirArray[0]=" + clirArray[0]
151                                 + ", clirArray[1]=" + clirArray[1]);
152                     handleGetCLIRResult(clirArray);
153                 }
154             }
155         }
156 
handleSetCLIRResponse(Message msg)157         private void handleSetCLIRResponse(Message msg) {
158             AsyncResult ar = (AsyncResult) msg.obj;
159 
160             if (ar.exception != null) {
161                 if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: ar.exception="+ar.exception);
162                 //setEnabled(false);
163             }
164             if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: re get");
165 
166             mPhone.getOutgoingCallerIdDisplay(obtainMessage(MESSAGE_GET_CLIR,
167                     MESSAGE_SET_CLIR, MESSAGE_SET_CLIR, ar.exception));
168         }
169     }
170 }
171