package com.android.service;
import android.annotation.SuppressLint;
import android.app.KeyguardManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Toast;
import com.android.fingerprintcallbackdemo.ScreenObserver;
import com.android.fingerprintcallbackdemo.ScreenObserver.ScreenStateListener;
import com.android.internal.policy.IKeyguardService;
import com.android.activity.Util;
import com.android.aidl.*;
public class KeyguardFingerprintService extends Service {
private String TAG = "fenghaitao";
private ScreenObserver mScreenObserver;
IKeyguardService mService = null;
private KeyguardManager keyguardMan;
private PowerManager mPowerManager;
private IFingerprintManager mFingerprintManager;
private static boolean isAlreadSetAuthticate = false;
private ServiceConnection mIFingerConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "----------KeyguardFingerprintService onServiceDisconnected----");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mFingerprintManager = IFingerprintManager.Stub.asInterface(service);
if(mFingerprintManager != null){
try {
Log.d(TAG,"---------onServiceConnected------setOnAuthenticateListen----");
mFingerprintManager.setOnAuthenticateListen(mCallback);
//mFingerprintManager.authenticate();
new ThreadRun().start();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
};
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.d(TAG,"------------------KeyguardFingerprintService onServiceDisconnected -- keyguard--");
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = IKeyguardService.Stub.asInterface(service);
Log.i("fenghaitao", "======onServiceConected==="+mService);
}
};
Handler mHandler = new Handler(){
@SuppressLint("NewApi")
public void handleMessage(Message msg) {
switch (msg.what) {
case 3:
Log.i(TAG, "------------KeyguardFingerprintService ----SERVICE 解锁==");
if (keyguardMan.isKeyguardLocked()) {
if(!mPowerManager.isInteractive()){
mPowerManager.wakeUp(SystemClock.uptimeMillis());
}
try {
mService.keyguardDone(true, true);
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
break;
default:
break;
}
};
};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, "========onBind=======");
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.i(TAG, "====-------------KeyguardFingerprintService ---OnCreate====");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.i(TAG, "========= KeyguardFingerprintService ---onStartCommand=======");
mScreenObserver = new ScreenObserver(getApplicationContext());
mScreenObserver.startObserver(screenListener);
mybindService();
Intent mFingerIntent = new Intent();
mFingerIntent.setClass(getApplicationContext(), FingerprintManager.class);
bindService(mFingerIntent, mIFingerConn, Context.BIND_AUTO_CREATE);
keyguardMan = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
return super.onStartCommand(intent, flags, startId);
}
ScreenObserver.ScreenStateListener screenListener = new ScreenStateListener() {
@Override
public void onUserPresent() {
Log.i(TAG, "===onUserPresent==");
stopAuthenticate();
}
@Override
public void onScreenOn() {
Log.i(TAG, "==onScreenOn===");
}
@Override
public void onScreenOff() {
Log.i(TAG, "===onScreenOff==");
}
};
private IAuthenticateCallback mCallback = new IAuthenticateCallback.Stub() {
@Override
public void onNoMatch() throws RemoteException {
}
@Override
public void onIdentified(int fid) throws RemoteException {
Log.i(TAG, "-------KeyguardFingerprintService--------test----");
Log.i(TAG, "-------------------------KeyguardFingerprintService -Authenticate call back onIdentified----");
Message message = new Message();
message.arg1 = fid;
message.what = 3;
mHandler.sendMessage(message);
}
@Override
public void onFingerRemoved() throws RemoteException {
}
@Override
public void onCaptureFailed(int reason) throws RemoteException {
Util.vibrate(getApplicationContext(), 200);
}
};
public void mybindService(){
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.systemui", "com.android.systemui.keyguard.KeyguardService"));
bindService(intent, connection, BIND_AUTO_CREATE);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unbindService(connection);
unbindService(mIFingerConn);
}
class ThreadRun extends Thread{
@Override
public void run() {
super.run();
boolean hasLock;
boolean isScreenOn;
boolean isSetOnAuthListen = false;
while(true){
try {
sleep(500);
} catch (Exception e) {
}
hasLock = (Util.readXML(getApplicationContext(), "lock", 0) == 1) ? true : false;
isScreenOn = mPowerManager.isScreenOn();
if(hasLock && !isSetOnAuthListen){
Log.d(TAG,"-----------KeyguardFingerprintService ---thread isSetOnAuthListen = true ");
isSetOnAuthListen = true;
try{
mFingerprintManager.setOnAuthenticateListen(mCallback);
}catch (RemoteException e){
}
}else if(!hasLock && isSetOnAuthListen){
Log.d(TAG,"-----------KeyguardFingerprintService ---thread isSetOnAuthListen = false ");
isSetOnAuthListen = false;
}
//Log.d(TAG,"---------Thread ----isScreenOn = "+isScreenOn);
//Log.d(TAG,"-----------------Locked ----"+keyguardMan.isKeyguardLocked() +" , hasLock="+hasLock);
if (!hasLock) {
continue;
}
if (keyguardMan.isKeyguardLocked()) {
// Log.d(TAG, "-----start authenticate-----");
authenticate();
} else {
// Log.d(TAG, "-----stop authenticate-----");
stopAuthenticate();
}
}
}
}
public void authenticate() {
if (!isAlreadSetAuthticate) {
isAlreadSetAuthticate = true;
try {
mFingerprintManager.authenticate();
} catch (RemoteException e) {
}
}
}
public void stopAuthenticate(){
if(isAlreadSetAuthticate){
isAlreadSetAuthticate = false;
try{
mFingerprintManager.stopAuthenticate();
}catch(RemoteException e){
}
}
}
}