package com.duguang.baseanimation.ui.gesturepassword.homekey;
import java.util.HashMap;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.duguang.baseanimation.R;
import com.duguang.baseanimation.common.Constants;
import com.duguang.baseanimation.ui.gesturepassword.homekey.LocusPassWordView.OnCompareListener;
import com.duguang.baseanimation.ui.gesturepassword.homekey.LocusPassWordView.OnCompleteListener;
import com.duguang.baseanimation.ui.gesturepassword.homekey.LocusPassWordView.onCheckListener;
import com.duguang.baseanimation.utils.Logger;
import com.duguang.baseanimation.utils.SharedPreferenceUtil;
import com.duguang.baseanimation.utils.SlideToggle;
import com.duguang.baseanimation.utils.SlideToggle.OnSwitchStateListener;
public class GesturePasswordDemoActivity extends GestureParentActivity {
private SlideToggle toggle;
private GridView gridview;
/**
* 九宫格显示布局,文本框提示布局,九宫格设置布局的总体
*/
private LinearLayout llPassword;
private TextView tvShow;
private LocusPassWordView locusPasswordView;
private GridAdapter adapter;
private SharedPreferences sp;
/**
* 九宫格显示布局,0为灰色,1为亮色
*/
private String[] gridLists = { "0", "0", "0", "0", "0", "0", "0", "0", "0" };
/**
* defaultPassword-原始密码,resultPassword-新密码 忘记手势密码吗?
* 如果没有设置成功(点返回键时),设置原密码为最终密码,否则设置新密码为最终密码
*/
private String defaultPassword = "", resultPassword = "";
/**
* 手势密码的开关状态
*/
private boolean stateFlag = true;
/**
* 判断是否是忘记密码后清空手势密码,保存手势密码的
*/
private boolean cleared = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gesture_password_demo);
sp = getSharedPreferences("config", MODE_PRIVATE);
initViews();
init();
setEventListener();
}
private void initViews() {
toggle = (SlideToggle) findViewById(R.id.toggle);
gridview = (GridView) findViewById(R.id.gridview);
llPassword = (LinearLayout) findViewById(R.id.ll_password);
tvShow = (TextView) findViewById(R.id.tv_show);
locusPasswordView = (LocusPassWordView) findViewById(R.id.locus_password_view);
}
public void init() {
toggle.setImageResIDs(R.drawable.open_toggle_bg,
R.drawable.clost_toggle_bg, R.drawable.del_btn);
stateFlag = sp.getBoolean("state", true);
stateFlag = SharedPreferenceUtil.getBooleanValueFromSP(this,
Constants.GSNAMEINSHARED, "state");
if (!stateFlag) {// 忘记密码,登录后,即使为开启状态也要改为关闭状态
Logger.d("Logger", "flag为假 " + stateFlag);
llPassword.setVisibility(View.GONE);
toggle.setSwitchState(false);
} else {
Logger.d("Logger", "flag为真 " + stateFlag);
llPassword.setVisibility(View.VISIBLE);
toggle.setSwitchState(true);
if (!"".equals(defaultPassword)) {
tvShow.setText(R.string.setDefaultPassword);
} else {
tvShow.setText(R.string.setpassword);
}
}
defaultPassword = SharedPreferenceUtil.getStringValueFromSP(this,
Constants.GPNAMEINSHARED, "password");
SharedPreferenceUtil.setBooleanDataIntoSP(this,Constants.GPNAMEINSHARED,
"cleared", false);
// 原始密码为空,直接输入新密码,否则判断原始密码是否正确,点击home键再次进来时,接着上次的运行,特殊情况除外
if ("".equals(defaultPassword)) {
locusPasswordView.setFirst(false);
locusPasswordView.setSecond(true);
} else {
locusPasswordView.setFirst(true);
}
adapter = new GridAdapter(this, gridLists);
gridview.setAdapter(adapter);
}
/**
* 将手势密码的开关状态判断,由onCreate移到onResume,在极端情况下:
* 当前页面是修改手势密码且开关状态为打开状态,点击home键,再次进入该系统却忘记密码,重新登陆后手势密码清空,将开关状态更改为关闭状态
* modified by liuweina,2013/10/14
*/
@Override
protected void onResume() {
super.onResume();
cleared = SharedPreferenceUtil.getBooleanValueFromSP(this,
Constants.GPNAMEINSHARED, "cleared");
Logger.d("onResume-----", "defaultPassword");
if (cleared) {// 从手势密码界面,点击home,忘记密码再次进入时,更改其状态为关闭状态
llPassword.setVisibility(View.GONE);
toggle.setSwitchState(false);
// 手势密码清空,下面开关的状态改变时,影响判断
defaultPassword = SharedPreferenceUtil.getStringValueFromSP(this,
Constants.GPNAMEINSHARED, "password");
// 进入该页面,更改手势密码状态为false,区分开刚设置还是以前设置过忘记密码进来的情况
SharedPreferenceUtil.setBooleanDataIntoSP(this,Constants.GPNAMEINSHARED,
"cleared", false);
}
}
public void setEventListener() {
toggle.setOnSwitchStateListener(onSwitchListener);
locusPasswordView.setOnCompareListener(lpwvOnCompareListener);
locusPasswordView.setOnCheckListener(lpwvOnCheckListener);
locusPasswordView.setOnCompleteListener(lpwvOnCompleteListener);
}
private OnSwitchStateListener onSwitchListener = new OnSwitchStateListener() {
@Override
public void onSwitch(boolean state) {
if (state) {// 打开手势密码,更新开关状态值为true,开关改变值也为true,
llPassword.setVisibility(View.VISIBLE);
SharedPreferenceUtil.setBooleanDataIntoSP(GesturePasswordDemoActivity.this,
Constants.GPNAMEINSHARED, "state", true);
// 如果已经设置了部分手势密码,恢复为初始状态
refreshPassStr();
// 原始密码为空,直接输入新密码,否则判断原始密码是否正确
if ("".equals(defaultPassword)) {
locusPasswordView.setFirst(false);
locusPasswordView.setSecond(true);
tvShow.setText(R.string.setpassword);
} else {
locusPasswordView.setFirst(true);
tvShow.setText(R.string.setDefaultPassword);
}
adapter.notifyDataSetChanged();
gridview.invalidate();
} else {
llPassword.setVisibility(View.INVISIBLE);
SharedPreferenceUtil.setBooleanDataIntoSP(GesturePasswordDemoActivity.this,
Constants.GSNAMEINSHARED, "state", false);
}
}
};
/**
* 将显示密码归为全0
*
* @param passStr
*/
private void refreshPassStr() {
for (int i = 0; i < 9; i++) {
gridLists[i] = "0";
}
}
/**
* 原始密码不为空时,输入原始密码后,比较原始密码输入正确与否 modified by liuweina,2013/10/14
*/
private OnCompareListener lpwvOnCompareListener = new OnCompareListener() {
@Override
public void onCompare(String password) {
Logger.e("compare", password);
if (password.contains(",")) {// password为本次输入的手势密码值
refreshPassStr();
String[] passStr = password.split(",");
for (int i = 0; i < passStr.length; i++) {
gridLists[Integer.parseInt(passStr[i])] = "1";
}
adapter.notifyDataSetChanged();
gridview.postInvalidate();
if (locusPasswordView.verifyPassword(password)) {// 输入原始密码正确
defaultPassword = password;
tvShow.setText(R.string.newPasswordInput);
// 修改判断条件,下一步可输入新密码
locusPasswordView.setFirst(false);
locusPasswordView.setSecond(true);
} else {
tvShow.setText(R.string.originalPasswordInputError);
}
}
}
};
/**
* 第一次输入新密码后,更新上方的小显示框
*/
private onCheckListener lpwvOnCheckListener = new onCheckListener() {
@Override
public void onCheck(String password) {
Logger.e("check", password);
if (password.contains(",")) {
refreshPassStr();
String[] passStr = password.split(",");
for (int i = 0; i < passStr.length; i++) {
gridLists[Integer.parseInt(passStr[i])] = "1";
}
gridview.postInvalidate();
adapter.notifyDataSetChanged();
tvShow.setText(R.string.newPasswordInputAgain);
// 第一次输入新密码后,更改状态为判断两次新密码是否正确
locusPasswordView.setFirst(false);
locusPasswordView.setSecond(false);
locusPasswordView.setThird(true);
}
}
};
/**
* 第二次输入新密码后,比较两次密码是否一致
*/
private OnCompleteListener lpwvOnCompleteListener = new OnCompleteListener() {
@Override
public void onComplete(String firstPassword, String secondPassword) {
Logger.e("complete", firstPassword + ", " + secondPassword);
if (firstPassword.equals(secondPassword)) {
resultPassword = secondPassword;
HashMap<String, Object> keyValueMap = new HashMap<String, Object>();
keyValueMap.put("password", secondPassword);
keyValueMap.put("cleared", false);
SharedPreferenceUtil.setDataIntoSP(GesturePasswordDemoActivity.this,Constants.GPNAMEINSHARED,
keyValueMap);
GesturePasswordDemoActivity.this.finish();
} else {
tvShow.setText(R.string.newPasswordInputError);
}
}
};
/**
* 点击页面左上角的“返回”按钮
*/
private OnClickListener backOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
Logger.e("back", "defaultPass = " + defaultPassword
+ ", newPass = " + resultPassword);
// 点返回按钮,先判断手势密码是否为空,若为空,保持开关状态为关;否则,开关状态不变
if ("".equals(defaultPassword)) {// 初始密码为空,手势密码未设置成功过,保持关闭状态
SharedPreferenceUtil.setBooleanDataIntoSP(GesturePasswordDemoActivity.this,
Constants.GSNAMEINSHARED, "state", false);
}
finish();
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Logger.e(
"onKeyDown",
"defaultPass = "
+ defaultPassword
+ ", newPass = "
+ resultPassword
+ ", state = "
+ SharedPreferenceUtil.getBooleanValueFromSP(this,
Constants.GSNAMEINSHARED, "state"));
// 点返回键,先判断手势密码是否为空,若为空,保持开关状态为关;否则,开关状态不变
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ("".equals(defaultPassword)) {// 初始密码为空,手势密码未设置成功过,保持关闭状态
SharedPreferenceUtil.setBooleanDataIntoSP(this,
Constants.GSNAMEINSHARED, "state", false);
}
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}