Index: device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java |
diff --git a/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java b/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a7adab7047e2b3b879f0a905dbd9050c965f2433 |
--- /dev/null |
+++ b/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java |
@@ -0,0 +1,130 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.device.nfc; |
+ |
+import android.nfc.FormatException; |
+import android.nfc.NdefMessage; |
+import android.nfc.Tag; |
+import android.nfc.TagLostException; |
+import android.nfc.tech.Ndef; |
+import android.nfc.tech.NdefFormatable; |
+import android.nfc.tech.TagTechnology; |
+ |
+import java.io.IOException; |
+ |
+/** |
+ * Utility class that provides I/O operations for NFC tags. |
+ */ |
+public final class NfcTagHandler { |
+ private final TagTechnology mTech; |
+ private final TagTechnologyHandler mTechHandler; |
+ private boolean mWasConnected; |
+ |
+ /** |
+ * Factory method that creates NfcTagHandler for a given NFC Tag. |
+ * |
+ * @param tag @see android.nfc.Tag |
+ * @return NfcTagHandler or null when unsupported Tag is provided. |
+ */ |
+ public static NfcTagHandler create(Tag tag) { |
+ if (tag == null) return null; |
+ |
+ Ndef ndef = Ndef.get(tag); |
+ if (ndef != null) return new NfcTagHandler(ndef, new NdefHandler(ndef)); |
+ |
+ NdefFormatable formattable = NdefFormatable.get(tag); |
+ if (formattable != null) { |
+ return new NfcTagHandler(formattable, new NdefFormattableHandler(formattable)); |
+ } |
+ |
+ return null; |
+ } |
+ |
+ /** |
+ * NdefFormatable and Ndef interfaces have different signatures for operating with NFC tags. |
+ * This interface provides generic methods. |
+ */ |
+ private interface TagTechnologyHandler { |
+ public void write(NdefMessage message) |
+ throws IOException, TagLostException, FormatException; |
+ // TODO(crbug.com/625589): add read method for nfc.watch. |
+ } |
+ |
+ /** |
+ * Implementation of TagTechnologyHandler that uses Ndef tag technology. |
+ * @see android.nfc.tech.Ndef |
+ */ |
+ private static class NdefHandler implements TagTechnologyHandler { |
+ private final Ndef mNdef; |
+ |
+ NdefHandler(Ndef ndef) { |
+ mNdef = ndef; |
+ } |
+ |
+ public void write(NdefMessage message) |
+ throws IOException, TagLostException, FormatException { |
+ mNdef.writeNdefMessage(message); |
+ } |
+ } |
+ |
+ /** |
+ * Implementation of TagTechnologyHandler that uses NdefFormatable tag technology. |
+ * @see android.nfc.tech.NdefFormatable |
+ */ |
+ private static class NdefFormattableHandler implements TagTechnologyHandler { |
+ private final NdefFormatable mNdefFormattable; |
+ |
+ NdefFormattableHandler(NdefFormatable ndefFormattable) { |
+ mNdefFormattable = ndefFormattable; |
+ } |
+ |
+ public void write(NdefMessage message) |
+ throws IOException, TagLostException, FormatException { |
+ mNdefFormattable.format(message); |
+ } |
+ } |
+ |
+ private NfcTagHandler(TagTechnology tech, TagTechnologyHandler handler) { |
+ mTech = tech; |
+ mTechHandler = handler; |
+ } |
+ |
+ /** |
+ * Connects to NFC tag. |
+ */ |
+ public void connect() throws IOException, TagLostException { |
+ if (!mTech.isConnected()) { |
+ mTech.connect(); |
+ mWasConnected = true; |
+ } |
+ } |
+ |
+ /** |
+ * Closes connection. |
+ */ |
+ public void close() throws IOException { |
+ mTech.close(); |
+ } |
+ |
+ /** |
+ * Writes NdefMessage to NFC tag. |
+ */ |
+ public void write(NdefMessage message) throws IOException, TagLostException, FormatException { |
+ mTechHandler.write(message); |
+ } |
+ |
+ /** |
+ * If tag was previously connected and subsequent connection to the same tag fails, consider |
+ * tag to be out of range. |
+ */ |
+ public boolean isTagOutOfRange() { |
+ try { |
+ connect(); |
+ } catch (IOException e) { |
+ return mWasConnected; |
+ } |
+ return false; |
+ } |
+} |