am 8ecfad36: am 6b53a8a7: am 9fef5fbc: NFC Unlock api changes

* commit '8ecfad3616258c191c23ff1048b7965c0bb03a06':
  NFC Unlock api changes
This commit is contained in:
Andres Morales
2014-07-30 21:30:24 +00:00
committed by Android Git Automerger
5 changed files with 104 additions and 3 deletions

View File

@@ -186,6 +186,7 @@ LOCAL_SRC_FILES += \
core/java/android/nfc/INfcTag.aidl \
core/java/android/nfc/INfcCardEmulation.aidl \
core/java/android/nfc/INfcLockscreenDispatch.aidl \
core/java/android/nfc/INfcUnlockHandler.aidl \
core/java/android/os/IBatteryPropertiesListener.aidl \
core/java/android/os/IBatteryPropertiesRegistrar.aidl \
core/java/android/os/ICancellationSignal.aidl \

View File

@@ -27,6 +27,7 @@ import android.nfc.INfcAdapterExtras;
import android.nfc.INfcTag;
import android.nfc.INfcCardEmulation;
import android.nfc.INfcLockscreenDispatch;
import android.nfc.INfcUnlockHandler;
import android.os.Bundle;
/**
@@ -57,4 +58,6 @@ interface INfcAdapter
void setP2pModes(int initatorModes, int targetModes);
void registerLockscreenDispatch(INfcLockscreenDispatch lockscreenDispatch, in int[] techList);
void addNfcUnlockHandler(INfcUnlockHandler unlockHandler, in int[] techList);
void removeNfcUnlockHandler(IBinder b);
}

View File

@@ -0,0 +1,12 @@
package android.nfc;
import android.nfc.Tag;
/**
* @hide
*/
interface INfcUnlockHandler {
boolean onUnlockAttempted(in Tag tag);
}

View File

@@ -30,7 +30,6 @@ import android.content.IntentFilter;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.nfc.BeamShareData;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.Ndef;
import android.nfc.tech.NfcA;
@@ -312,6 +311,8 @@ public final class NfcAdapter {
final NfcActivityManager mNfcActivityManager;
final Context mContext;
final HashMap<NfcUnlockHandler, IBinder> mNfcUnlockHandlers;
final Object mLock;
/**
* A callback to be invoked when the system finds a tag while the foreground activity is
@@ -393,6 +394,22 @@ public final class NfcAdapter {
}
/**
* A callback to be invoked when an application has registered as a
* handler to unlock the device given an NFC tag at the lockscreen.
* @hide
*/
@SystemApi
public interface NfcUnlockHandler {
/**
* Called at the lock screen to attempt to unlock the device with the given tag.
* @param tag the detected tag, to be used to unlock the device
* @return true if the device was successfully unlocked
*/
public boolean onUnlockAttempted(Tag tag);
}
/**
* Helper to check if this device has FEATURE_NFC, but without using
* a context.
@@ -525,6 +542,8 @@ public final class NfcAdapter {
NfcAdapter(Context context) {
mContext = context;
mNfcActivityManager = new NfcActivityManager(this);
mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, IBinder>();
mLock = new Object();
}
/**
@@ -1457,7 +1476,7 @@ public final class NfcAdapter {
public boolean onTagDetected(Tag tag) throws RemoteException {
return lockscreenDispatch.onTagDetected(tag);
}
}, Tag.techListFromStrings(techList));
}, Tag.getTechCodesFromStrings(techList));
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
return false;
@@ -1469,6 +1488,72 @@ public final class NfcAdapter {
return true;
}
/**
* Registers a new NFC unlock handler with the NFC service.
*
* <p />NFC unlock handlers are intended to unlock the keyguard in the presence of a trusted
* NFC device. The handler should return true if it successfully authenticates the user and
* unlocks the keyguard.
*
* <p /> The parameter {@code tagTechnologies} determines which Tag technologies will be polled for
* at the lockscreen. Polling for less tag technologies reduces latency, and so it is
* strongly recommended to only provide the Tag technologies that the handler is expected to
* receive.
*
* @hide
*/
@SystemApi
public boolean addNfcUnlockHandler(final NfcUnlockHandler unlockHandler,
String[] tagTechnologies) {
try {
INfcUnlockHandler.Stub iHandler = new INfcUnlockHandler.Stub() {
@Override
public boolean onUnlockAttempted(Tag tag) throws RemoteException {
return unlockHandler.onUnlockAttempted(tag);
}
};
synchronized (mLock) {
if (mNfcUnlockHandlers.containsKey(unlockHandler)) {
return true;
}
sService.addNfcUnlockHandler(iHandler, Tag.getTechCodesFromStrings(tagTechnologies));
mNfcUnlockHandlers.put(unlockHandler, iHandler.asBinder());
}
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
return false;
} catch (IllegalArgumentException e) {
Log.e(TAG, "Unable to register LockscreenDispatch", e);
return false;
}
return true;
}
/**
* Removes a previously registered unlock handler. Also removes the tag technologies
* associated with the removed unlock handler.
*
* @hide
*/
@SystemApi
public boolean removeNfcUnlockHandler(NfcUnlockHandler unlockHandler) {
try {
synchronized (mLock) {
if (mNfcUnlockHandlers.containsKey(unlockHandler)) {
sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler));
mNfcUnlockHandlers.remove(unlockHandler);
}
return true;
}
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
return false;
}
}
/**
* @hide
*/

View File

@@ -196,7 +196,7 @@ public final class Tag implements Parcelable {
return strings;
}
static int[] techListFromStrings(String[] techStringList) throws IllegalArgumentException {
static int[] getTechCodesFromStrings(String[] techStringList) throws IllegalArgumentException {
if (techStringList == null) {
throw new IllegalArgumentException("List cannot be null");
}