OSDN Git Service

Final final final Gingerbread MR API changes.
authorNick Pelly <npelly@google.com>
Tue, 1 Feb 2011 07:27:37 +0000 (23:27 -0800)
committerNick Pelly <npelly@google.com>
Tue, 1 Feb 2011 17:20:45 +0000 (09:20 -0800)
This is it. I promise.

ACTION_TECHNOLOGY_DISCOVERED -> ACTION_TECH_DISCOVERED
    This was missed in our technology->tech rename.

Hide TagTechnology.reconnect()
    This is used to reset any per-connection state in a tag, by reconnecting
    to it. The first problem is that it belongs on Tag, not TagTechnology. The
    second problem is that it may become redundant once we add Tag.rediscover()
    which will also reconnect to the tag, and will also return a new Tag with
    newly created technologies enumerated. And the third and most significant
    problem is that you can already achieve the same result by just calling
    close() followed by connect().

Hide Tag.createMockTag()
    This API cannot be used reliably. First it requires using int[] for the
    technology list, but those int constants are now hidden. Second it requires
    knowledge of the extras parcel used to fill technology specific data - also
    not public.

Introduce TagTechnology.isConnected()
    Every child class already impelmented this, and given that connect() and
    close() are defined on the interface, then isConnected() should be there
    too.

Modify Ndef.getType to return a string (not int)
    Allows more flexibility in adding new NDEF types. Current public strings are
    org.nfcforum.ndef.type1
    org.nfcforum.ndef.type2
    org.nfcforum.ndef.type3
    org.nfcforum.ndef.type4
    com.nxp.ndef.mifareclassic

Add NdefFormatable.formatReadOnly()
    This allows you to make the tag read-only at the same time as performing
    format and write. It is important because we currently don't have any
    public API to re-enumerate a tag technology list after making a tag
    NDEF compatible, so you can't perform the format as a seperate step
    without physically removing the tag from field and returning it.

Modify Readonly -> ReadOnly

Make Tag class final

Change-Id: Icf306aeb37b936ca3007e4868e99b6baceac4aff

api/10.xml
api/current.xml
core/java/android/nfc/NfcAdapter.java
core/java/android/nfc/Tag.java
core/java/android/nfc/tech/BasicTagTechnology.java
core/java/android/nfc/tech/Ndef.java
core/java/android/nfc/tech/NdefFormatable.java
core/java/android/nfc/tech/TagTechnology.java

index ad54650..e10b357 100644 (file)
  visibility="public"
 >
 </field>
-<field name="ACTION_TECHNOLOGY_DISCOVERED"
+<field name="ACTION_TECH_DISCOVERED"
  type="java.lang.String"
  transient="false"
  volatile="false"
  extends="java.lang.Object"
  abstract="false"
  static="false"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
 <implements name="android.os.Parcelable">
 </implements>
-<method name="createMockTag"
- return="android.nfc.Tag"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="id" type="byte[]">
-</parameter>
-<parameter name="techList" type="int[]">
-</parameter>
-<parameter name="techListExtras" type="android.os.Bundle[]">
-</parameter>
-</method>
 <method name="describeContents"
  return="int"
  abstract="false"
  visibility="public"
 >
 </method>
-<method name="reconnect"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="IOException" type="java.io.IOException">
-</exception>
-</method>
 </class>
 <class name="IsoDep"
  extends="android.nfc.tech.BasicTagTechnology"
  deprecated="not deprecated"
  visibility="public"
 >
-<method name="canMakeReadonly"
+<method name="canMakeReadOnly"
  return="boolean"
  abstract="false"
  native="false"
 </exception>
 </method>
 <method name="getType"
- return="int"
+ return="java.lang.String"
  abstract="false"
  native="false"
  synchronized="false"
  visibility="public"
 >
 </method>
-<method name="makeReadonly"
+<method name="makeReadOnly"
  return="boolean"
  abstract="false"
  native="false"
 </exception>
 </method>
 <field name="MIFARE_CLASSIC"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="101"
+ value="&quot;com.nxp.ndef.mifareclassic&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_1"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="1"
+ value="&quot;org.nfcforum.ndef.type1&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_2"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="2"
+ value="&quot;org.nfcforum.ndef.type2&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_3"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="3"
+ value="&quot;org.nfcforum.ndef.type3&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_4"
- type="int"
- transient="false"
- volatile="false"
- value="4"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="OTHER"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="-1"
+ value="&quot;org.nfcforum.ndef.type4&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 <exception name="IOException" type="java.io.IOException">
 </exception>
 </method>
+<method name="formatReadOnly"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="firstMessage" type="android.nfc.NdefMessage">
+</parameter>
+<exception name="FormatException" type="android.nfc.FormatException">
+</exception>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
 <method name="get"
  return="android.nfc.tech.NdefFormatable"
  abstract="false"
  visibility="public"
 >
 </method>
-<method name="reconnect"
- return="void"
+<method name="isConnected"
+ return="boolean"
  abstract="true"
  native="false"
  synchronized="false"
  deprecated="not deprecated"
  visibility="public"
 >
-<exception name="IOException" type="java.io.IOException">
-</exception>
 </method>
 </interface>
 </package>
index ad54650..e10b357 100644 (file)
  visibility="public"
 >
 </field>
-<field name="ACTION_TECHNOLOGY_DISCOVERED"
+<field name="ACTION_TECH_DISCOVERED"
  type="java.lang.String"
  transient="false"
  volatile="false"
  extends="java.lang.Object"
  abstract="false"
  static="false"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
 <implements name="android.os.Parcelable">
 </implements>
-<method name="createMockTag"
- return="android.nfc.Tag"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="id" type="byte[]">
-</parameter>
-<parameter name="techList" type="int[]">
-</parameter>
-<parameter name="techListExtras" type="android.os.Bundle[]">
-</parameter>
-</method>
 <method name="describeContents"
  return="int"
  abstract="false"
  visibility="public"
 >
 </method>
-<method name="reconnect"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="IOException" type="java.io.IOException">
-</exception>
-</method>
 </class>
 <class name="IsoDep"
  extends="android.nfc.tech.BasicTagTechnology"
  deprecated="not deprecated"
  visibility="public"
 >
-<method name="canMakeReadonly"
+<method name="canMakeReadOnly"
  return="boolean"
  abstract="false"
  native="false"
 </exception>
 </method>
 <method name="getType"
- return="int"
+ return="java.lang.String"
  abstract="false"
  native="false"
  synchronized="false"
  visibility="public"
 >
 </method>
-<method name="makeReadonly"
+<method name="makeReadOnly"
  return="boolean"
  abstract="false"
  native="false"
 </exception>
 </method>
 <field name="MIFARE_CLASSIC"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="101"
+ value="&quot;com.nxp.ndef.mifareclassic&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_1"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="1"
+ value="&quot;org.nfcforum.ndef.type1&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_2"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="2"
+ value="&quot;org.nfcforum.ndef.type2&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_3"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="3"
+ value="&quot;org.nfcforum.ndef.type3&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 >
 </field>
 <field name="NFC_FORUM_TYPE_4"
- type="int"
- transient="false"
- volatile="false"
- value="4"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="OTHER"
- type="int"
+ type="java.lang.String"
  transient="false"
  volatile="false"
- value="-1"
+ value="&quot;org.nfcforum.ndef.type4&quot;"
  static="true"
  final="true"
  deprecated="not deprecated"
 <exception name="IOException" type="java.io.IOException">
 </exception>
 </method>
+<method name="formatReadOnly"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="firstMessage" type="android.nfc.NdefMessage">
+</parameter>
+<exception name="FormatException" type="android.nfc.FormatException">
+</exception>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
 <method name="get"
  return="android.nfc.tech.NdefFormatable"
  abstract="false"
  visibility="public"
 >
 </method>
-<method name="reconnect"
- return="void"
+<method name="isConnected"
+ return="boolean"
  abstract="true"
  native="false"
  synchronized="false"
  deprecated="not deprecated"
  visibility="public"
 >
-<exception name="IOException" type="java.io.IOException">
-</exception>
 </method>
 </interface>
 </package>
index 4808032..d30a0c6 100644 (file)
@@ -44,10 +44,10 @@ public final class NfcAdapter {
     /**
      * Intent to start an activity when a tag with NDEF payload is discovered.
      * If the tag has and NDEF payload this intent is started before
-     * {@link #ACTION_TECHNOLOGY_DISCOVERED}.
+     * {@link #ACTION_TECH_DISCOVERED}.
      *
      * If any activities respond to this intent neither
-     * {@link #ACTION_TECHNOLOGY_DISCOVERED} or {@link #ACTION_TAG_DISCOVERED} will be started.
+     * {@link #ACTION_TECH_DISCOVERED} or {@link #ACTION_TAG_DISCOVERED} will be started.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED";
@@ -63,7 +63,7 @@ public final class NfcAdapter {
      * If any activities respond to this intent {@link #ACTION_TAG_DISCOVERED} will not be started.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_TECHNOLOGY_DISCOVERED = "android.nfc.action.TECH_DISCOVERED";
+    public static final String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED";
 
     /**
      * Intent to start an activity when a tag is discovered.
index aae75c9..45a3447 100644 (file)
@@ -55,7 +55,7 @@ import java.util.Arrays;
  * not cause any further RF activity or block. Note however that arrays passed to and
  * returned by this class are *not* cloned, so be careful not to modify them.
  */
-public class Tag implements Parcelable {
+public final class Tag implements Parcelable {
     /*package*/ final byte[] mId;
     /*package*/ final int[] mTechList;
     /*package*/ final String[] mTechStringList;
@@ -93,6 +93,7 @@ public class Tag implements Parcelable {
      * @param id The tag identifier, can be null
      * @param techList must not be null
      * @return freshly constructed tag
+     * @hide
      */
     public static Tag createMockTag(byte[] id, int[] techList, Bundle[] techListExtras) {
         // set serviceHandle to 0 to indicate mock tag
index 32a850d..7ec807a 100644 (file)
@@ -53,15 +53,7 @@ import java.io.IOException;
        }
     }
 
-    /**
-     * Helper to indicate if {@link #connect} has succeeded.
-     * <p>
-     * Does not cause RF activity, and does not block.
-     * @return true if {@link #connect} has completed successfully and the {@link Tag} is believed
-     * to be within range. Applications must still handle {@link java.io.IOException}
-     * while using methods that require a connection in case the connection is lost after this
-     * method returns.
-     */
+    @Override
     public boolean isConnected() {
         if (!mIsConnected) {
             return false;
@@ -94,6 +86,7 @@ import java.io.IOException;
         }
     }
 
+    /** @hide */
     @Override
     public void reconnect() throws IOException {
         if (!mIsConnected) {
index c6804f9..39ff282 100644 (file)
@@ -61,12 +61,31 @@ public final class Ndef extends BasicTagTechnology {
     /** @hide */
     public static final String EXTRA_NDEF_TYPE = "ndeftype";
 
-    public static final int OTHER = -1;
-    public static final int NFC_FORUM_TYPE_1 = 1;
-    public static final int NFC_FORUM_TYPE_2 = 2;
-    public static final int NFC_FORUM_TYPE_3 = 3;
-    public static final int NFC_FORUM_TYPE_4 = 4;
-    public static final int MIFARE_CLASSIC = 101;
+    /** @hide */
+    public static final int TYPE_OTHER = -1;
+    /** @hide */
+    public static final int TYPE_1 = 1;
+    /** @hide */
+    public static final int TYPE_2 = 2;
+    /** @hide */
+    public static final int TYPE_3 = 3;
+    /** @hide */
+    public static final int TYPE_4 = 4;
+    /** @hide */
+    public static final int TYPE_MIFARE_CLASSIC = 101;
+
+    /** @hide */
+    public static final String UNKNOWN = "android.ndef.unknown";
+
+    public static final String NFC_FORUM_TYPE_1 = "org.nfcforum.ndef.type1";
+
+    public static final String NFC_FORUM_TYPE_2 = "org.nfcforum.ndef.type2";
+
+    public static final String NFC_FORUM_TYPE_3 = "org.nfcforum.ndef.type3";
+
+    public static final String NFC_FORUM_TYPE_4 = "org.nfcforum.ndef.type4";
+
+    public static final String MIFARE_CLASSIC = "com.nxp.ndef.mifareclassic";
 
     private final int mMaxNdefSize;
     private final int mCardState;
@@ -118,18 +137,27 @@ public final class Ndef extends BasicTagTechnology {
      * Get NDEF tag type.
      * <p>Returns one of {@link #NFC_FORUM_TYPE_1}, {@link #NFC_FORUM_TYPE_2},
      * {@link #NFC_FORUM_TYPE_3}, {@link #NFC_FORUM_TYPE_4},
-     * {@link #MIFARE_CLASSIC} or {@link #OTHER}.
-     * <p>Platforms of this API revision will always return one of the above
-     * values. Platforms at future API revisions may return other values, which
-     * can be treated as {@link #OTHER} by applications targeting this API.
+     * {@link #MIFARE_CLASSIC} or another NDEF tag type that is not yet in the
+     * Android API.
      * <p>Android devices with NFC support must always correctly enumerate
      * NFC Forum tag types, and may optionally enumerate
      * {@link #MIFARE_CLASSIC} since it requires proprietary technology.
-     * Devices that cannot enumerate {@link #MIFARE_CLASSIC} will use
-     * {@link #OTHER} instead.
      */
-    public int getType() {
-        return mNdefType;
+    public String getType() {
+        switch (mNdefType) {
+            case TYPE_1:
+                return NFC_FORUM_TYPE_1;
+            case TYPE_2:
+                return NFC_FORUM_TYPE_2;
+            case TYPE_3:
+                return NFC_FORUM_TYPE_3;
+            case TYPE_4:
+                return NFC_FORUM_TYPE_4;
+            case TYPE_MIFARE_CLASSIC:
+                return MIFARE_CLASSIC;
+            default:
+                return UNKNOWN;
+        }
     }
 
     /**
@@ -217,10 +245,10 @@ public final class Ndef extends BasicTagTechnology {
 
     /**
      * Indicates whether a tag can be made read-only with
-     * {@link #makeReadonly()}
+     * {@link #makeReadOnly()}
      */
-    public boolean canMakeReadonly() {
-        if (mNdefType == NFC_FORUM_TYPE_1 || mNdefType == NFC_FORUM_TYPE_2) {
+    public boolean canMakeReadOnly() {
+        if (mNdefType == TYPE_1 || mNdefType == TYPE_2) {
             return true;
         } else {
             return false;
@@ -234,7 +262,7 @@ public final class Ndef extends BasicTagTechnology {
      * This is a one-way process and can not be reverted!
      * @throws IOException
      */
-    public boolean makeReadonly() throws IOException {
+    public boolean makeReadOnly() throws IOException {
         checkConnected();
 
         try {
index 2919c43..e2828b5 100644 (file)
@@ -65,8 +65,25 @@ public final class NdefFormatable extends BasicTagTechnology {
     /**
      * Formats a tag as NDEF, if possible. You may supply a first
      * NdefMessage to be written on the tag.
+     * <p>Either all steps succeed, or an IOException is thrown if any one step
+     * fails.
      */
     public void format(NdefMessage firstMessage) throws IOException, FormatException {
+        format(firstMessage, false);
+    }
+
+    /**
+     * Formats a tag as NDEF, if possible. You may supply a first
+     * NdefMessage to be written on the tag.
+     * <p>Either all steps succeed, or an IOException is thrown if any one step
+     * fails.
+     */
+    public void formatReadOnly(NdefMessage firstMessage) throws IOException, FormatException {
+        format(firstMessage, true);
+    }
+
+    /*package*/ void format(NdefMessage firstMessage, boolean makeReadOnly) throws IOException,
+            FormatException {
         checkConnected();
 
         try {
@@ -101,6 +118,21 @@ public final class NdefFormatable extends BasicTagTechnology {
             } else {
                 throw new IOException();
             }
+            // optionally make read-only
+            if (makeReadOnly) {
+                errorCode = tagService.ndefMakeReadOnly(serviceHandle);
+                switch (errorCode) {
+                    case ErrorCodes.SUCCESS:
+                        break;
+                    case ErrorCodes.ERROR_IO:
+                        throw new IOException();
+                    case ErrorCodes.ERROR_INVALID_PARAM:
+                        throw new IOException();
+                    default:
+                        // Should not happen
+                        throw new IOException();
+                }
+            }
         } catch (RemoteException e) {
             Log.e(TAG, "NFC service dead", e);
         }
index c8ccdcf..50df865 100644 (file)
@@ -121,6 +121,7 @@ public interface TagTechnology extends Closeable {
      * @see #connect()
      * @see #close()
      * @throws IOException
+     * @hide
      */
     public void reconnect() throws IOException;
 
@@ -137,4 +138,15 @@ public interface TagTechnology extends Closeable {
      * @see #reconnect()
      */
     public void close() throws IOException;
+
+    /**
+     * Helper to indicate if {@link #connect} has succeeded.
+     * <p>
+     * Does not cause RF activity, and does not block.
+     * @return true if {@link #connect} has completed successfully and the {@link Tag} is believed
+     * to be within range. Applications must still handle {@link java.io.IOException}
+     * while using methods that require a connection in case the connection is lost after this
+     * method returns.
+     */
+    public boolean isConnected();
 }