blob: aa582a18bbda6e19f072b6a1daca502a4a560efc [file] [log] [blame]
/*
* 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);
}
}