package com.android.activity;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.Resources.Theme;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.preference.SwitchPreference;
import android.text.InputFilter;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import com.android.aidl.IFingerprintManager;
import com.android.fingerprintcallbackdemo.R;
import com.android.service.FingerprintManager;
import com.android.service.KeyguardFingerprintService;
import java.util.ArrayList;
import java.util.List;
import com.android.aidl.*;
import ma.release.FingerprintEntity;
import java.io.File;
import java.io.IOException;
public class FingerprintMainActivity extends Activity {
private String TAG = "fenghaitao";
private List<Finger> mFingers ;
private ListView fingerListView;
private FingerAdapter mAdapter;
private TextView addFingerTv;
private ImageButton resetVolt;
private Switch mLockSwitch;
private static final int REQUEST_CODE_SET_KEYGUARD = 5;
int[] dat = {0, 0, 0, 0, 0};
private IFingerprintManager mFingerprintManager;
private List<FingerprintEntity> mFingerprintEntityList = new ArrayList<FingerprintEntity>();
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mFingerprintManager = IFingerprintManager.Stub.asInterface(service);
Log.i(TAG, "=====FingerprintManager on service Connected===");
if(mFingerprintManager != null){
try {
mFingerprintManager.setOnAuthenticateListen(new AuthenticateListen());
mFingerprintManager.authenticate();
} catch (RemoteException e) {
e.printStackTrace();
}
updateFingerprintData();
mAdapter = new FingerAdapter();
fingerListView.setAdapter(mAdapter);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.finger_main);
creatFile();
fingerListView = (ListView)findViewById(R.id.lv_finger);
addFingerTv = (TextView)findViewById(R.id.add_finger_tv);
mLockSwitch = (Switch) findViewById(R.id.fingerlock_switch);
Intent intent = new Intent();
intent.setClass(getApplicationContext(), FingerprintManager.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
boolean hasLock = (Util.readXML(getApplicationContext(), "lock", 0) == 1) ? true : false;
mLockSwitch.setChecked(hasLock);
mLockSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d(TAG, "----------------------------Lock switch----isCheck-"+isChecked);
onFingerUnlockClick(isChecked);
}
});
addFingerTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(getApplicationContext(), EnrollActivty.class);
startActivityForResult(intent, 0);
}
});
fingerListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(TAG, "=====select listview position="+position+" === id = "+mFingerprintEntityList.get(position).getId());
showRenameDeleteDialog(mFingerprintEntityList.get(position));
}
});
}
public void creatFile(){
File file = new File("/data/system/ma_fingerprint");
if(!file.exists()){
file.mkdirs();
}
Process p;
int status;
try {
p=Runtime.getRuntime().exec("chmod 777 "+file);
status = p.waitFor();
if(status == 0){
Log.d("fht"," 创建成功");
}else{
Log.d("fht","创建失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void fingersFlush(){
updateFingerprintData();
mAdapter.notifyDataSetChanged();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "=======onActivity Result=========");
fingersFlush();
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if (mFingerprintManager != null) {
try {
mFingerprintManager.authenticate();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
class AuthenticateListen extends IAuthenticateCallback.Stub{
@Override
public void onNoMatch() throws RemoteException {
}
@Override
public void onIdentified(int fid) throws RemoteException {
}
@Override
public void onCaptureFailed(int reason) throws RemoteException {
}
@Override
public void onFingerRemoved() throws RemoteException {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "=======finger main activity ===destroy=");
try {
mFingerprintManager.stopAuthenticate();
} catch (RemoteException e) {
e.printStackTrace();
}
unbindService(connection);
}
/**
* 开启或关闭“指纹解锁功能”,该功能是否开启,记录在sharedpreference的“lock”属性中。
*/
private void onFingerUnlockClick(boolean isChecked) {
boolean hasPassword = Util.hasPassword(this);
if (!hasPassword) {
Util.writeXML(getApplicationContext(), "lock", 0);
Intent intent = new Intent();
intent.setAction("android.app.action.SET_NEW_PASSWORD");
intent.setPackage("com.android.settings");
intent.putExtra("fp_show_description", true);
startActivityForResult(intent, REQUEST_CODE_SET_KEYGUARD);
} else {
if(!isChecked) {
Util.writeXML(getApplicationContext(), "lock", 0);
} else {
Util.writeXML(getApplicationContext(), "lock", 1);
}
}
}
/**
* show dialog for rename or delete one fingerprint record
*
* @param entity
* contains fingerprint record information
*/
private void showRenameDeleteDialog(final FingerprintEntity fingerprintEntity) {
AlertDialog.Builder itemsBuilder = new AlertDialog.Builder(this);
itemsBuilder.setItems(
new String[] { getResources().getString(R.string.ma_set_finger_dlg_rename),
getResources().getString(R.string.ma_set_finger_dlg_delete) },
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
showRenameDialog(fingerprintEntity);
} else {
deleteFingerprintRecord(fingerprintEntity);
}
}
});
itemsBuilder.create().show();
}
/**
* delete one fingerprint record
*
* @param entity
* contains fingerprint record information
*/
private void deleteFingerprintRecord(FingerprintEntity fingerprintEntity) {
int fid = fingerprintEntity.getId();
int ret = 0;
try{
ret = mFingerprintManager.remove(fid);
}catch(RemoteException e){
}
Log.d(TAG,"deleteFingerprintRecord, fid=" + fid + " ,ret=" + ret);
if (ret == 0) {
String name = Util.readXML(this, fid+"", "");
Util.removeXML(this, fid + "");
if(Util.containsXML(this, name)) {
Util.writeXML(this, name, false);
}
}
fingersFlush();
}
private void showRenameDialog(final FingerprintEntity fingerprintEntity) {
final EditText nameEt = new EditText(this);
nameEt.setSingleLine(true);
nameEt.setFilters(new InputFilter[] { new InputFilter.LengthFilter(10) });
AlertDialog.Builder renameBuilder = new AlertDialog.Builder(this);
renameBuilder.setTitle(getResources().getString(R.string.ma_set_finger_dlg_rename));
renameBuilder.setView(nameEt);
renameBuilder.setNegativeButton(getResources().getString(R.string.ma_set_finger_dlg_cancel), null);
renameBuilder.setPositiveButton(getResources().getString(R.string.ma_set_finger_dlg_confirm),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
renameFingerprintRecord(fingerprintEntity, nameEt);
}
});
renameBuilder.create().show();
}
private void renameFingerprintRecord(FingerprintEntity entity, final EditText nameEt) {
String newName = nameEt.getText().toString().trim();
if (Util.isChinese(newName)) {
if (newName.length() > Util.maxCLength) {
newName = newName.substring(0, Util.maxCLength - 1);
}
} else {
if (newName.length() > Util.maxELength) {
newName = newName.substring(0, Util.maxELength - 1);
}
}
if (TextUtils.isEmpty(newName)) {
} else {
String fid = entity.getId() + "";
String oldName = Util.readXML(this, fid+"", "");
if(Util.containsXML(this, oldName)) {
Util.writeXML(this, oldName, false);
}
Util.writeXML(getApplicationContext(), fid, newName);
fingersFlush();
}
}
/**
* 更新指纹数据
*
* @return 更新完后的最新数据
*/
public List<FingerprintEntity> updateFingerprintData() {
try {
mFingerprintManager.enumerate(dat, 5);
} catch (RemoteException e) {
}
List<FingerprintEntity> tmp = new ArrayList<FingerprintEntity>();
for (int i = 0; i < 5; i++) {
if ((dat[i] & 0xff) == 0) {
continue;
}
tmp.add(generateFingerprintEntity(dat[i]));
}
mFingerprintEntityList = tmp;
return mFingerprintEntityList;
}
private FingerprintEntity generateFingerprintEntity(int b) {
FingerprintEntity entity = new FingerprintEntity();
int id = b;
entity.setId(id);
entity.setImgRes(R.drawable.ic_ma_touch_id);
String name = Util.readXML(this, id + "", "");
if (TextUtils.isEmpty(name)) {
String defaultName = getDefaultName();
entity.setName(defaultName);
Util.writeXML(this, id + "", defaultName);
Util.writeXML(this, defaultName, true); // 名字被使用,标记true
} else {
entity.setName(name);
}
return entity;
}
private String getDefaultName() {
String defaultName = "";
for (int i = 1; i <= 5; i++) {
String key = "指纹" + i;
boolean used = Util.readXML(this, key, false); // 该名字是否已经被使用
if (!used) {
defaultName = key;
break;
}
}
return defaultName;
}
private boolean hasName(int id) {
String value = Util.readXML(this, id + "", "");
if (TextUtils.isEmpty(value)) {
return false;
} else {
return true;
}
}
public class FingerAdapter extends BaseAdapter {
@Override
public int getCount() {
return mFingerprintEntityList.size();
}
@Override
public Object getItem(int position) {
return mFingerprintEntityList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holde holde;
if(convertView == null){
holde = new Holde();
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.finger_item, null);
holde.fingerItemView = (TextView)convertView.findViewById(R.id.finger_item_tv);
convertView.setTag(holde);
}else{
holde = (Holde)convertView.getTag();
}
holde.fingerItemView.setText(mFingerprintEntityList.get(position).getName());
return convertView;
}
class Holde{
TextView fingerItemView;
}
}
}