| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.phone; |
| |
| import android.content.Context; |
| import android.os.AsyncResult; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.text.Editable; |
| import android.text.Spannable; |
| import android.text.TextUtils; |
| import android.text.TextWatcher; |
| import android.text.method.DialerKeyListener; |
| import android.util.Log; |
| import android.view.KeyEvent; |
| import android.view.View; |
| import android.widget.Button; |
| import android.widget.EditText; |
| import android.widget.LinearLayout; |
| import android.widget.TextView; |
| |
| import com.android.internal.telephony.Phone; |
| |
| /** |
| * "SIM network unlock" PIN entry screen. |
| * |
| * @see PhoneGlobals.EVENT_SIM_NETWORK_LOCKED |
| * |
| * TODO: This UI should be part of the lock screen, not the |
| * phone app (see bug 1804111). |
| */ |
| public class IccNetworkDepersonalizationPanel extends IccPanel { |
| |
| //debug constants |
| private static final boolean DBG = false; |
| |
| //events |
| private static final int EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT = 100; |
| |
| private Phone mPhone; |
| |
| //UI elements |
| private EditText mPinEntry; |
| private LinearLayout mEntryPanel; |
| private LinearLayout mStatusPanel; |
| private TextView mStatusText; |
| |
| private Button mUnlockButton; |
| private Button mDismissButton; |
| |
| //private textwatcher to control text entry. |
| private TextWatcher mPinEntryWatcher = new TextWatcher() { |
| public void beforeTextChanged(CharSequence buffer, int start, int olen, int nlen) { |
| } |
| |
| public void onTextChanged(CharSequence buffer, int start, int olen, int nlen) { |
| } |
| |
| public void afterTextChanged(Editable buffer) { |
| if (SpecialCharSequenceMgr.handleChars( |
| getContext(), buffer.toString())) { |
| mPinEntry.getText().clear(); |
| } |
| } |
| }; |
| |
| //handler for unlock function results |
| private Handler mHandler = new Handler() { |
| public void handleMessage(Message msg) { |
| if (msg.what == EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT) { |
| AsyncResult res = (AsyncResult) msg.obj; |
| if (res.exception != null) { |
| if (DBG) log("network depersonalization request failure."); |
| indicateError(); |
| postDelayed(new Runnable() { |
| public void run() { |
| hideAlert(); |
| mPinEntry.getText().clear(); |
| mPinEntry.requestFocus(); |
| } |
| }, 3000); |
| } else { |
| if (DBG) log("network depersonalization success."); |
| indicateSuccess(); |
| postDelayed(new Runnable() { |
| public void run() { |
| dismiss(); |
| } |
| }, 3000); |
| } |
| } |
| } |
| }; |
| |
| //constructor |
| public IccNetworkDepersonalizationPanel(Context context) { |
| super(context); |
| } |
| |
| @Override |
| protected void onCreate(Bundle icicle) { |
| super.onCreate(icicle); |
| setContentView(R.layout.sim_ndp); |
| |
| // PIN entry text field |
| mPinEntry = (EditText) findViewById(R.id.pin_entry); |
| mPinEntry.setKeyListener(DialerKeyListener.getInstance()); |
| mPinEntry.setOnClickListener(mUnlockListener); |
| |
| // Attach the textwatcher |
| CharSequence text = mPinEntry.getText(); |
| Spannable span = (Spannable) text; |
| span.setSpan(mPinEntryWatcher, 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); |
| |
| mEntryPanel = (LinearLayout) findViewById(R.id.entry_panel); |
| |
| mUnlockButton = (Button) findViewById(R.id.ndp_unlock); |
| mUnlockButton.setOnClickListener(mUnlockListener); |
| |
| // The "Dismiss" button is present in some (but not all) products, |
| // based on the "sim_network_unlock_allow_dismiss" resource. |
| mDismissButton = (Button) findViewById(R.id.ndp_dismiss); |
| if (getContext().getResources().getBoolean(R.bool.sim_network_unlock_allow_dismiss)) { |
| if (DBG) log("Enabling 'Dismiss' button..."); |
| mDismissButton.setVisibility(View.VISIBLE); |
| mDismissButton.setOnClickListener(mDismissListener); |
| } else { |
| if (DBG) log("Removing 'Dismiss' button..."); |
| mDismissButton.setVisibility(View.GONE); |
| } |
| |
| //status panel is used since we're having problems with the alert dialog. |
| mStatusPanel = (LinearLayout) findViewById(R.id.status_panel); |
| mStatusText = (TextView) findViewById(R.id.status_text); |
| |
| mPhone = PhoneGlobals.getPhone(); |
| } |
| |
| @Override |
| protected void onStart() { |
| super.onStart(); |
| } |
| |
| //Mirrors IccPinUnlockPanel.onKeyDown(). |
| public boolean onKeyDown(int keyCode, KeyEvent event) { |
| if (keyCode == KeyEvent.KEYCODE_BACK) { |
| return true; |
| } |
| |
| return super.onKeyDown(keyCode, event); |
| } |
| |
| View.OnClickListener mUnlockListener = new View.OnClickListener() { |
| public void onClick(View v) { |
| String pin = mPinEntry.getText().toString(); |
| |
| if (TextUtils.isEmpty(pin)) { |
| return; |
| } |
| |
| if (DBG) log("requesting network depersonalization with code " + pin); |
| mPhone.getIccCard().supplyNetworkDepersonalization(pin, |
| Message.obtain(mHandler, EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT)); |
| indicateBusy(); |
| } |
| }; |
| |
| private void indicateBusy() { |
| mStatusText.setText(R.string.requesting_unlock); |
| mEntryPanel.setVisibility(View.GONE); |
| mStatusPanel.setVisibility(View.VISIBLE); |
| } |
| |
| private void indicateError() { |
| mStatusText.setText(R.string.unlock_failed); |
| mEntryPanel.setVisibility(View.GONE); |
| mStatusPanel.setVisibility(View.VISIBLE); |
| } |
| |
| private void indicateSuccess() { |
| mStatusText.setText(R.string.unlock_success); |
| mEntryPanel.setVisibility(View.GONE); |
| mStatusPanel.setVisibility(View.VISIBLE); |
| } |
| |
| private void hideAlert() { |
| mEntryPanel.setVisibility(View.VISIBLE); |
| mStatusPanel.setVisibility(View.GONE); |
| } |
| |
| View.OnClickListener mDismissListener = new View.OnClickListener() { |
| public void onClick(View v) { |
| if (DBG) log("mDismissListener: skipping depersonalization..."); |
| dismiss(); |
| } |
| }; |
| |
| private void log(String msg) { |
| Log.v(TAG, "[IccNetworkDepersonalizationPanel] " + msg); |
| } |
| } |