17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/*
27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2006 The Android Open Source Project
37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License.
67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at
77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software
117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and
147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License.
157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone;
187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.Activity;
207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult;
217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle;
227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler;
237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message;
247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils;
257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.method.DigitsKeyListener;
267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log;
277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View;
287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.EditText;
297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.LinearLayout;
307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView;
317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandException;
337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone;
347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/**
367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * UI to enable/disable the ICC PIN.
377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class EnableIccPinScreen extends Activity {
397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String LOG_TAG = PhoneGlobals.LOG_TAG;
407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int ENABLE_ICC_PIN_COMPLETE = 100;
427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final boolean DBG = false;
437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private LinearLayout mPinFieldContainer;
457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private EditText mPinField;
467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private TextView mStatusField;
477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private boolean mEnable;
487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Phone mPhone;
497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Handler mHandler = new Handler() {
517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        public void handleMessage(Message msg) {
527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            switch (msg.what) {
537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                case ENABLE_ICC_PIN_COMPLETE:
547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    AsyncResult ar = (AsyncResult) msg.obj;
557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    handleResult(ar);
567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    break;
577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return;
607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    };
627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onCreate(Bundle icicle) {
657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreate(icicle);
667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setContentView(R.layout.enable_sim_pin_screen);
687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setupView();
697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPhone = PhoneGlobals.getPhone();
717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mEnable = !mPhone.getIccCard().getIccLockEnabled();
727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        int id = mEnable ? R.string.enable_sim_pin : R.string.disable_sim_pin;
747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setTitle(getResources().getText(id));
757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void setupView() {
787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPinField = (EditText) findViewById(R.id.pin);
797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPinField.setKeyListener(DigitsKeyListener.getInstance());
807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPinField.setMovementMethod(null);
817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPinField.setOnClickListener(mClicked);
827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPinFieldContainer = (LinearLayout) findViewById(R.id.pinc);
847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mStatusField = (TextView) findViewById(R.id.status);
857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void showStatus(CharSequence statusMsg) {
887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (statusMsg != null) {
897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mStatusField.setText(statusMsg);
907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mStatusField.setVisibility(View.VISIBLE);
917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mPinFieldContainer.setVisibility(View.GONE);
927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } else {
937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mPinFieldContainer.setVisibility(View.VISIBLE);
947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mStatusField.setVisibility(View.GONE);
957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private String getPin() {
997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return mPinField.getText().toString();
1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void enableIccPin() {
1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Message callback = Message.obtain(mHandler, ENABLE_ICC_PIN_COMPLETE);
1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) log("enableIccPin:");
1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPhone.getIccCard().setIccLockEnabled(mEnable, getPin(), callback);
1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) log("enableIccPin: please wait...");
1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void handleResult(AsyncResult ar) {
1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (ar.exception == null) {
1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("handleResult: success!");
1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            showStatus(getResources().getText(
1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mEnable ? R.string.enable_pin_ok : R.string.disable_pin_ok));
1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } else if (ar.exception instanceof CommandException
1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                /* && ((CommandException)ar.exception).getCommandError() ==
1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    CommandException.Error.GENERIC_FAILURE */ ) {
1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("handleResult: failed!");
1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            showStatus(getResources().getText(
1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    R.string.pin_failed));
1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mHandler.postDelayed(new Runnable() {
1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                finish();
1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }, 3000);
1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private View.OnClickListener mClicked = new View.OnClickListener() {
1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        public void onClick(View v) {
1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (TextUtils.isEmpty(mPinField.getText())) {
1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return;
1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            showStatus(getResources().getText(
1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    R.string.enable_in_progress));
1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            enableIccPin();
1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    };
1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void log(String msg) {
1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Log.d(LOG_TAG, "[EnableIccPin] " + msg);
1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon}
146