AI 144185: Integrate cdma into the main code base.
[android/platform/packages/apps/Phone.git] / src / com / android / phone / IccNetworkDepersonalizationPanel.java
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.phone;
18
19 import android.content.Context;
20 import android.os.AsyncResult;
21 import android.os.Bundle;
22 import android.os.Handler;
23 import android.os.Message;
24 import android.text.Editable;
25 import android.text.Spannable;
26 import android.text.TextUtils;
27 import android.text.TextWatcher;
28 import android.text.method.DialerKeyListener;
29 import android.util.Log;
30 import android.view.KeyEvent;
31 import android.view.View;
32 import android.widget.Button;
33 import android.widget.EditText;
34 import android.widget.LinearLayout;
35 import android.widget.TextView;
36
37 import com.android.internal.telephony.Phone;
38 import com.android.internal.telephony.PhoneFactory;
39
40 public class IccNetworkDepersonalizationPanel extends IccPanel{
41
42     //debug constants
43     private static final boolean DBG = false;
44
45     //events
46     private static final int EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT = 100;
47
48     private Phone mPhone;
49
50     //UI elements
51     private EditText     mPinEntry;
52     private LinearLayout mEntryPanel;
53     private LinearLayout mStatusPanel;
54     private TextView     mStatusText;
55
56     private Button       mUnlockButton;
57     private Button       mDismissButton;
58
59     //private textwatcher to control text entry.
60     private TextWatcher mPinEntryWatcher = new TextWatcher() {
61         public void beforeTextChanged(CharSequence buffer, int start, int olen, int nlen) {
62         }
63
64         public void onTextChanged(CharSequence buffer, int start, int olen, int nlen) {
65         }
66
67         public void afterTextChanged(Editable buffer) {
68             if (SpecialCharSequenceMgr.handleChars(
69                     getContext(), buffer.toString(), true)) {
70                 mPinEntry.getText().clear();
71             }
72         }
73     };
74
75     //handler for unlock function results
76     private Handler mHandler = new Handler() {
77         public void handleMessage(Message msg) {
78             if (msg.what == EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT) {
79                 AsyncResult res = (AsyncResult) msg.obj;
80                 if (res.exception != null) {
81                     if (DBG) log("network depersonalization request failure.");
82                     indicateError();
83                     postDelayed(new Runnable() {
84                                     public void run() {
85                                         hideAlert();
86                                         mPinEntry.getText().clear();
87                                         mPinEntry.requestFocus();
88                                     }
89                                 }, 3000);
90                 } else {
91                     if (DBG) log("network depersonalization success.");
92                     indicateSuccess();
93                     postDelayed(new Runnable() {
94                                     public void run() {
95                                         dismiss();
96                                     }
97                                 }, 3000);
98                 }
99             }
100         }
101     };
102
103     //constructor
104     public IccNetworkDepersonalizationPanel(Context context) {
105         super(context);
106     }
107
108     @Override
109     protected void onCreate(Bundle icicle) {
110         super.onCreate(icicle);
111         setContentView(R.layout.sim_ndp);
112
113         //set up pin entry text field
114         mPinEntry = (EditText) findViewById(R.id.pin_entry);
115         mPinEntry.setKeyListener(DialerKeyListener.getInstance());
116         mPinEntry.setMovementMethod(null);
117         mPinEntry.setOnClickListener(mUnlockListener);
118
119         //attach the textwatcher
120         CharSequence text = mPinEntry.getText();
121         Spannable span = (Spannable) text;
122         span.setSpan(mPinEntryWatcher, 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
123
124         mEntryPanel = (LinearLayout) findViewById(R.id.entry_panel);
125
126         mUnlockButton = (Button) findViewById(R.id.ndp_unlock);
127         mUnlockButton.setOnClickListener(mUnlockListener);
128
129         mDismissButton = (Button) findViewById(R.id.ndp_dismiss);
130         mDismissButton.setOnClickListener(mDismissListener);
131
132         //status panel is used since we're having problems with the alert dialog.
133         mStatusPanel = (LinearLayout) findViewById(R.id.status_panel);
134         mStatusText = (TextView) findViewById(R.id.status_text);
135
136         mPhone = PhoneFactory.getDefaultPhone();
137     }
138
139     @Override
140     protected void onStart() {
141         super.onStart();
142     }
143
144     //Mirrors IccPinUnlockPanel.onKeyDown().
145     public boolean onKeyDown(int keyCode, KeyEvent event) {
146         if (keyCode == KeyEvent.KEYCODE_BACK) {
147             return true;
148         }
149
150         return super.onKeyDown(keyCode, event);
151     }
152
153     View.OnClickListener mUnlockListener = new View.OnClickListener() {
154         public void onClick(View v) {
155             String pin = mPinEntry.getText().toString();
156
157             if (TextUtils.isEmpty(pin)) {
158                 return;
159             }
160             
161             if (DBG) log("requesting network depersonalization with code " + pin);
162             mPhone.getIccCard().supplyNetworkDepersonalization(pin, 
163                     Message.obtain(mHandler, EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT));
164             indicateBusy();
165         }
166     };
167
168     private void indicateBusy() {
169         mStatusText.setText(R.string.requesting_unlock);
170         mEntryPanel.setVisibility(View.GONE);
171         mStatusPanel.setVisibility(View.VISIBLE);
172     }
173
174     private void indicateError() {
175         mStatusText.setText(R.string.unlock_failed);
176         mEntryPanel.setVisibility(View.GONE);
177         mStatusPanel.setVisibility(View.VISIBLE);
178     }
179
180     private void indicateSuccess() {
181         mStatusText.setText(R.string.unlock_success);
182         mEntryPanel.setVisibility(View.GONE);
183         mStatusPanel.setVisibility(View.VISIBLE);
184     }
185
186     private void hideAlert() {
187         mEntryPanel.setVisibility(View.VISIBLE);
188         mStatusPanel.setVisibility(View.GONE);
189     }
190
191     View.OnClickListener mDismissListener = new View.OnClickListener() {
192         public void onClick(View v) {
193             if (DBG) log("network depersonalization skipped.");
194             dismiss();
195         }
196     };
197
198     private void log(String msg) {
199         Log.v(TAG, "[IccNetworkUnlock] " + msg);
200     }
201 }