diff options
author | Andres Morales <anmorales@google.com> | 2013-12-12 17:36:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-12-12 17:36:40 +0000 |
commit | ec31555d8822ad68bed6f478594d65e821b0851b (patch) | |
tree | 65cb2318f54b6b51b450f5e372ec9576bfb9ced7 /core/java | |
parent | c62cbd9c2865c0152da4dc7e06b62ba41a0a5367 (diff) | |
parent | 38a7ed05f8fed0aa81f7214d827875f9876ffbe1 (diff) | |
download | frameworks_base-ec31555d8822ad68bed6f478594d65e821b0851b.zip frameworks_base-ec31555d8822ad68bed6f478594d65e821b0851b.tar.gz frameworks_base-ec31555d8822ad68bed6f478594d65e821b0851b.tar.bz2 |
Merge "Adding INfcUnlockSettings and NfcUnlock interface class."
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/nfc/INfcAdapter.aidl | 2 | ||||
-rw-r--r-- | core/java/android/nfc/INfcUnlockSettings.aidl | 70 | ||||
-rw-r--r-- | core/java/android/nfc/NfcAdapter.java | 24 | ||||
-rw-r--r-- | core/java/android/nfc/NfcUnlock.java | 255 | ||||
-rw-r--r-- | core/java/android/provider/Settings.java | 5 |
5 files changed, 356 insertions, 0 deletions
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl index 8414738..10988c6 100644 --- a/core/java/android/nfc/INfcAdapter.aidl +++ b/core/java/android/nfc/INfcAdapter.aidl @@ -25,6 +25,7 @@ import android.nfc.IAppCallback; import android.nfc.INfcAdapterExtras; import android.nfc.INfcTag; import android.nfc.INfcCardEmulation; +import android.nfc.INfcUnlockSettings; import android.os.Bundle; /** @@ -35,6 +36,7 @@ interface INfcAdapter INfcTag getNfcTagInterface(); INfcCardEmulation getNfcCardEmulationInterface(); INfcAdapterExtras getNfcAdapterExtrasInterface(in String pkg); + INfcUnlockSettings getNfcUnlockSettingsInterface(); int getState(); boolean disable(boolean saveState); diff --git a/core/java/android/nfc/INfcUnlockSettings.aidl b/core/java/android/nfc/INfcUnlockSettings.aidl new file mode 100644 index 0000000..649eeed --- /dev/null +++ b/core/java/android/nfc/INfcUnlockSettings.aidl @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.nfc; + +import android.nfc.Tag; +import java.util.List; + +/** + * Interface to NFC unlock functionality. + * + * @hide + */ +interface INfcUnlockSettings { + + /** + * Checks the validity of the tag and attempts to unlock the screen. + * + * @return true if the screen was successfuly unlocked. + */ + boolean tryUnlock(int userId, in Tag tag); + + /** + * Registers the given tag as an unlock tag. Subsequent calls to {@code tryUnlock} + * with the same {@code tag} should succeed. + * + * @return true if the tag was successfully registered. + */ + boolean registerTag(int userId, in Tag tag); + + /** + * Deregisters the tag with the corresponding timestamp. + * Subsequent calls to {@code tryUnlock} with the same tag should fail. + * + * @return true if the tag was successfully deleted. + */ + boolean deregisterTag(int userId, long timestamp); + + /** + * Used for user-visible rendering of registered tags. + * + * @return a list of the times in millis since epoch when the registered tags were paired. + */ + long[] getTagRegistryTimes(int userId); + + /** + * Determines the state of the NFC unlock feature. + * + * @return true if NFC unlock is enabled. + */ + boolean getNfcUnlockEnabled(int userId); + + /** + * Sets the state [ON | OFF] of the NFC unlock feature. + */ + void setNfcUnlockEnabled(int userId, boolean enabled); +} diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 6743c6c..e8b7437 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -292,6 +292,7 @@ public final class NfcAdapter { static INfcAdapter sService; static INfcTag sTagService; static INfcCardEmulation sCardEmulationService; + static INfcUnlockSettings sNfcUnlockSettingsService; /** * The NfcAdapter object for each application context. @@ -432,6 +433,13 @@ public final class NfcAdapter { throw new UnsupportedOperationException(); } + try { + sNfcUnlockSettingsService = sService.getNfcUnlockSettingsInterface(); + } catch (RemoteException e) { + Log.e(TAG, "could not retrieve NFC unlock settings service"); + sNfcUnlockSettingsService = null; + } + sIsInitialized = true; } if (context == null) { @@ -549,6 +557,22 @@ public final class NfcAdapter { } /** + * Returns the binder interface to the NFC unlock service. + * + * @throws UnsupportedOperationException if the service is not available. + * @hide + */ + public INfcUnlockSettings getNfcUnlockSettingsService() throws UnsupportedOperationException { + isEnabled(); + + if (sNfcUnlockSettingsService == null) { + throw new UnsupportedOperationException("NfcUnlockSettingsService not available"); + } + + return sNfcUnlockSettingsService; + } + + /** * NFC service dead - attempt best effort recovery * @hide */ diff --git a/core/java/android/nfc/NfcUnlock.java b/core/java/android/nfc/NfcUnlock.java new file mode 100644 index 0000000..82dcd96 --- /dev/null +++ b/core/java/android/nfc/NfcUnlock.java @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.nfc; + +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.annotation.Nullable; +import android.app.ActivityManager; +import android.content.Context; +import android.os.RemoteException; +import android.os.SystemProperties; +import android.util.Log; + +import java.util.HashMap; + +/** + * Provides an interface to read and update NFC unlock settings. + * <p/> + * Allows system services (currently exclusively LockSettingsService) to + * register NFC tags to be used to unlock the device, as well as the ability + * to enable/disable the service entirely. + * + */ +public class NfcUnlock { + + /** + * Action to unlock the device. + * + * @hide + */ + public static final String ACTION_NFC_UNLOCK = "android.nfc.ACTION_NFC_UNLOCK"; + /** + * Permission to unlock the device. + * + * @hide + */ + public static final String NFC_UNLOCK_PERMISSION = "android.permission.NFC_UNLOCK"; + + /** + * Property to enable NFC Unlock + * + * @hide + */ + public static final String PROPERTY = "ro.com.android.nfc.unlock"; + + private static final String TAG = "NfcUnlock"; + private static HashMap<Context, NfcUnlock> sNfcUnlocks = new HashMap<Context, NfcUnlock>(); + + private final Context mContext; + private final boolean mEnabled; + private INfcUnlockSettings sService; + + private NfcUnlock(Context context, INfcUnlockSettings service) { + this.mContext = checkNotNull(context); + this.sService = checkNotNull(service); + this.mEnabled = getPropertyEnabled(); + } + + /** + * Returns an instance of {@link NfcUnlock}. + */ + public static synchronized NfcUnlock getInstance(NfcAdapter nfcAdapter) { + Context context = nfcAdapter.getContext(); + if (context == null) { + Log.e(TAG, "NfcAdapter context is null"); + throw new UnsupportedOperationException(); + } + + NfcUnlock manager = sNfcUnlocks.get(context); + if (manager == null) { + INfcUnlockSettings service = nfcAdapter.getNfcUnlockSettingsService(); + manager = new NfcUnlock(context, service); + sNfcUnlocks.put(context, manager); + } + + return manager; + } + + /** + * Registers the given {@code tag} as an unlock tag. + * + * @return true if the tag was successfully registered. + * @hide + */ + public boolean registerTag(Tag tag) { + enforcePropertyEnabled(); + + int currentUser = ActivityManager.getCurrentUser(); + + try { + return sService.registerTag(currentUser, tag); + } catch (RemoteException e) { + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover NfcUnlockSettingsService"); + return false; + } + + try { + return sService.registerTag(currentUser, tag); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach NfcUnlockSettingsService", ee); + return false; + } + } + } + + /** + * Deregisters the given {@code tag} as an unlock tag. + * + * @return true if the tag was successfully deregistered. + * @hide + */ + public boolean deregisterTag(long timestamp) { + enforcePropertyEnabled(); + int currentUser = ActivityManager.getCurrentUser(); + + try { + return sService.deregisterTag(currentUser, timestamp); + } catch (RemoteException e) { + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover NfcUnlockSettingsService"); + return false; + } + + try { + return sService.deregisterTag(currentUser, timestamp); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach NfcUnlockSettingsService", ee); + return false; + } + } + } + + /** + * Determines the enable state of the NFC unlock feature. + * + * @return true if NFC unlock is enabled. + */ + public boolean getNfcUnlockEnabled() { + enforcePropertyEnabled(); + int currentUser = ActivityManager.getCurrentUser(); + + try { + return sService.getNfcUnlockEnabled(currentUser); + } catch (RemoteException e) { + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover NfcUnlockSettingsService"); + return false; + } + + try { + return sService.getNfcUnlockEnabled(currentUser); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach NfcUnlockSettingsService", ee); + return false; + } + } + } + + /** + * Set the enable state of the NFC unlock feature. + * + * @return true if the setting was successfully persisted. + * @hide + */ + public boolean setNfcUnlockEnabled(boolean enabled) { + enforcePropertyEnabled(); + int currentUser = ActivityManager.getCurrentUser(); + + try { + sService.setNfcUnlockEnabled(currentUser, enabled); + return true; + } catch (RemoteException e) { + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover NfcUnlockSettingsService"); + return false; + } + + try { + sService.setNfcUnlockEnabled(currentUser, enabled); + return true; + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach NfcUnlockSettingsService", ee); + return false; + } + + } + } + + /** + * Returns a list of times (in millis since epoch) corresponding to when + * unlock tags were registered. + * + * @hide + */ + @Nullable + public long[] getTagRegistryTimes() { + enforcePropertyEnabled(); + int currentUser = ActivityManager.getCurrentUser(); + + try { + return sService.getTagRegistryTimes(currentUser); + } catch (RemoteException e) { + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover NfcUnlockSettingsService"); + return null; + } + + try { + return sService.getTagRegistryTimes(currentUser); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach NfcUnlockSettingsService", ee); + return null; + } + } + } + + /** + * @hide + */ + public static boolean getPropertyEnabled() { + return SystemProperties.get(PROPERTY).equals("ON"); + } + + private void recoverService() { + NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext); + sService = adapter.getNfcUnlockSettingsService(); + } + + + private void enforcePropertyEnabled() { + if (!mEnabled) { + throw new UnsupportedOperationException("NFC Unlock property is not enabled"); + } + } +} diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ec3819a..843a468 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3407,6 +3407,11 @@ public final class Settings { public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern"; /** + * Whether the NFC unlock feature is enabled (0 = false, 1 = true) + */ + public static final String NFC_UNLOCK_ENABLED = "nfc_unlock_enabled"; + + /** * Whether lock pattern will vibrate as user enters (0 = false, 1 = * true) * |