diff options
author | Jeff Hamilton <jham@android.com> | 2011-01-25 14:35:46 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-01-25 14:35:46 -0800 |
commit | f126ad3b6484ef62eed202f1f49cc4557c0a3848 (patch) | |
tree | 27557ba63eac8510910fbfced2cc282c2a6b411e /core/java/android/nfc | |
parent | c929677e017759047d94599faa1b80ebe278fefb (diff) | |
parent | d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0 (diff) | |
download | frameworks_base-f126ad3b6484ef62eed202f1f49cc4557c0a3848.zip frameworks_base-f126ad3b6484ef62eed202f1f49cc4557c0a3848.tar.gz frameworks_base-f126ad3b6484ef62eed202f1f49cc4557c0a3848.tar.bz2 |
Merge "Use classnames instead of ints for NFC techs." into gingerbread
Diffstat (limited to 'core/java/android/nfc')
-rw-r--r-- | core/java/android/nfc/INfcAdapter.aidl | 3 | ||||
-rw-r--r-- | core/java/android/nfc/NfcAdapter.java | 12 | ||||
-rw-r--r-- | core/java/android/nfc/Tag.java | 57 | ||||
-rw-r--r-- | core/java/android/nfc/TechListParcel.aidl | 19 | ||||
-rw-r--r-- | core/java/android/nfc/TechListParcel.java | 66 | ||||
-rw-r--r-- | core/java/android/nfc/tech/BasicTagTechnology.java | 33 | ||||
-rw-r--r-- | core/java/android/nfc/tech/Ndef.java | 2 | ||||
-rw-r--r-- | core/java/android/nfc/tech/TagTechnology.java | 6 |
8 files changed, 156 insertions, 42 deletions
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl index cfeff52..d439a48 100644 --- a/core/java/android/nfc/INfcAdapter.aidl +++ b/core/java/android/nfc/INfcAdapter.aidl @@ -21,6 +21,7 @@ import android.content.ComponentName; import android.content.IntentFilter; import android.nfc.NdefMessage; import android.nfc.Tag; +import android.nfc.TechListParcel; import android.nfc.ILlcpSocket; import android.nfc.ILlcpServiceSocket; import android.nfc.ILlcpConnectionlessSocket; @@ -48,7 +49,7 @@ interface INfcAdapter void localSet(in NdefMessage message); void openTagConnection(in Tag tag); void enableForegroundDispatch(in ComponentName activity, in PendingIntent intent, - in IntentFilter[] filters); + in IntentFilter[] filters, in TechListParcel techLists); void disableForegroundDispatch(in ComponentName activity); void enableForegroundNdefPush(in ComponentName activity, in NdefMessage msg); void disableForegroundNdefPush(in ComponentName activity); diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index f38bed9..4808032 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -27,6 +27,7 @@ import android.content.IntentFilter; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.os.IBinder; +import android.os.Parcel; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; @@ -54,7 +55,7 @@ public final class NfcAdapter { /** * Intent to started when a tag is discovered. The data URI is formated as * {@code vnd.android.nfc://tag/} with the path having a directory entry for each technology - * in the {@link Tag#getTechnologyList()} is ascending order. + * in the {@link Tag#getTechList()} is sorted ascending order. * * This intent is started after {@link #ACTION_NDEF_DISCOVERED} and before * {@link #ACTION_TAG_DISCOVERED} @@ -426,7 +427,7 @@ public final class NfcAdapter { * @throws IllegalStateException */ public void enableForegroundDispatch(Activity activity, PendingIntent intent, - IntentFilter... filters) { + IntentFilter[] filters, String[][] techLists) { if (activity == null || intent == null) { throw new NullPointerException(); } @@ -435,9 +436,14 @@ public final class NfcAdapter { "when your activity is resumed"); } try { + TechListParcel parcel = null; + if (techLists != null && techLists.length > 0) { + parcel = new TechListParcel(techLists); + } ActivityThread.currentActivityThread().registerOnActivityPausedListener(activity, mForegroundDispatchListener); - sService.enableForegroundDispatch(activity.getComponentName(), intent, filters); + sService.enableForegroundDispatch(activity.getComponentName(), intent, filters, + parcel); } catch (RemoteException e) { attemptDeadServiceRecovery(e); } diff --git a/core/java/android/nfc/Tag.java b/core/java/android/nfc/Tag.java index 946ac24..aae75c9 100644 --- a/core/java/android/nfc/Tag.java +++ b/core/java/android/nfc/Tag.java @@ -16,6 +16,15 @@ package android.nfc; +import android.nfc.tech.IsoDep; +import android.nfc.tech.MifareClassic; +import android.nfc.tech.MifareUltralight; +import android.nfc.tech.Ndef; +import android.nfc.tech.NdefFormatable; +import android.nfc.tech.NfcA; +import android.nfc.tech.NfcB; +import android.nfc.tech.NfcF; +import android.nfc.tech.NfcV; import android.nfc.tech.TagTechnology; import android.os.Bundle; import android.os.Parcel; @@ -49,6 +58,7 @@ import java.util.Arrays; public class Tag implements Parcelable { /*package*/ final byte[] mId; /*package*/ final int[] mTechList; + /*package*/ final String[] mTechStringList; /*package*/ final Bundle[] mTechExtras; /*package*/ final int mServiceHandle; // for use by NFC service, 0 indicates a mock /*package*/ final INfcTag mTagService; @@ -66,6 +76,7 @@ public class Tag implements Parcelable { } mId = id; mTechList = Arrays.copyOf(techList, techList.length); + mTechStringList = generateTechStringList(techList); // Ensure mTechExtras is as long as mTechList mTechExtras = Arrays.copyOf(techListExtras, techList.length); mServiceHandle = serviceHandle; @@ -88,6 +99,45 @@ public class Tag implements Parcelable { return new Tag(id, techList, techListExtras, 0, null); } + private String[] generateTechStringList(int[] techList) { + final int size = techList.length; + String[] strings = new String[size]; + for (int i = 0; i < size; i++) { + switch (techList[i]) { + case TagTechnology.ISO_DEP: + strings[i] = IsoDep.class.getName(); + break; + case TagTechnology.MIFARE_CLASSIC: + strings[i] = MifareClassic.class.getName(); + break; + case TagTechnology.MIFARE_ULTRALIGHT: + strings[i] = MifareUltralight.class.getName(); + break; + case TagTechnology.NDEF: + strings[i] = Ndef.class.getName(); + break; + case TagTechnology.NDEF_FORMATABLE: + strings[i] = NdefFormatable.class.getName(); + break; + case TagTechnology.NFC_A: + strings[i] = NfcA.class.getName(); + break; + case TagTechnology.NFC_B: + strings[i] = NfcB.class.getName(); + break; + case TagTechnology.NFC_F: + strings[i] = NfcF.class.getName(); + break; + case TagTechnology.NFC_V: + strings[i] = NfcV.class.getName(); + break; + default: + throw new IllegalArgumentException("Unknown tech type " + techList[i]); + } + } + return strings; + } + /** * For use by NfcService only. * @hide @@ -110,13 +160,12 @@ public class Tag implements Parcelable { * Returns technologies present in the tag that this implementation understands, * or a zero length array if there are no supported technologies on this tag. * - * The elements of the list are guaranteed be one of the constants defined in - * {@link TagTechnology}. + * The elements of the list are the names of the classes implementing the technology. * * The ordering of the returned array is undefined and should not be relied upon. */ - public int[] getTechnologyList() { - return Arrays.copyOf(mTechList, mTechList.length); + public String[] getTechList() { + return mTechStringList; } /** @hide */ diff --git a/core/java/android/nfc/TechListParcel.aidl b/core/java/android/nfc/TechListParcel.aidl new file mode 100644 index 0000000..92e646f --- /dev/null +++ b/core/java/android/nfc/TechListParcel.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2011 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; + +parcelable TechListParcel;
\ No newline at end of file diff --git a/core/java/android/nfc/TechListParcel.java b/core/java/android/nfc/TechListParcel.java new file mode 100644 index 0000000..396f0f1 --- /dev/null +++ b/core/java/android/nfc/TechListParcel.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2011 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.os.Parcel; +import android.os.Parcelable; + +/** @hide */ +public class TechListParcel implements Parcelable { + + private String[][] mTechLists; + + public TechListParcel(String[]... strings) { + mTechLists = strings; + } + + public String[][] getTechLists() { + return mTechLists; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + int count = mTechLists.length; + dest.writeInt(count); + for (int i = 0; i < count; i++) { + String[] techList = mTechLists[i]; + dest.writeStringArray(techList); + } + } + + public static final Creator<TechListParcel> CREATOR = new Creator<TechListParcel>() { + @Override + public TechListParcel createFromParcel(Parcel source) { + int count = source.readInt(); + String[][] techLists = new String[count][]; + for (int i = 0; i < count; i++) { + techLists[i] = source.readStringArray(); + } + return new TechListParcel(techLists); + } + + @Override + public TechListParcel[] newArray(int size) { + return new TechListParcel[size]; + } + }; +} diff --git a/core/java/android/nfc/tech/BasicTagTechnology.java b/core/java/android/nfc/tech/BasicTagTechnology.java index a909631..e635f21 100644 --- a/core/java/android/nfc/tech/BasicTagTechnology.java +++ b/core/java/android/nfc/tech/BasicTagTechnology.java @@ -36,28 +36,10 @@ import java.io.IOException; /*package*/ int mSelectedTechnology; BasicTagTechnology(Tag tag, int tech) throws RemoteException { - int[] techList = tag.getTechnologyList(); - int i; - - // Check target validity - for (i = 0; i < techList.length; i++) { - if (tech == techList[i]) { - break; - } - } - if (i >= techList.length) { - // Technology not found - throw new IllegalArgumentException("Technology " + tech + " not present on tag " + tag); - } - mTag = tag; mSelectedTechnology = tech; } - BasicTagTechnology(Tag tag) throws RemoteException { - this(tag, tag.getTechnologyList()[0]); - } - @Override public Tag getTag() { return mTag; @@ -65,17 +47,12 @@ import java.io.IOException; /** Internal helper to throw IllegalStateException if the technology isn't connected */ void checkConnected() { - if ((mTag.getConnectedTechnology() != getTechnologyId()) || + if ((mTag.getConnectedTechnology() != mSelectedTechnology) || (mTag.getConnectedTechnology() == -1)) { throw new IllegalStateException("Call connect() first!"); } } - @Override - public int getTechnologyId() { - return mSelectedTechnology; - } - /** * Helper to indicate if {@link #connect} has succeeded. * <p> @@ -101,11 +78,12 @@ import java.io.IOException; @Override public void connect() throws IOException { try { - int errorCode = mTag.getTagService().connect(mTag.getServiceHandle(), getTechnologyId()); + int errorCode = mTag.getTagService().connect(mTag.getServiceHandle(), + mSelectedTechnology); if (errorCode == ErrorCodes.SUCCESS) { // Store this in the tag object - mTag.setConnectedTechnology(getTechnologyId()); + mTag.setConnectedTechnology(mSelectedTechnology); mIsConnected = true; } else { throw new IOException(); @@ -158,7 +136,8 @@ import java.io.IOException; checkConnected(); try { - TransceiveResult result = mTag.getTagService().transceive(mTag.getServiceHandle(), data, raw); + TransceiveResult result = mTag.getTagService().transceive(mTag.getServiceHandle(), + data, raw); if (result == null) { throw new IOException("transceive failed"); } else { diff --git a/core/java/android/nfc/tech/Ndef.java b/core/java/android/nfc/tech/Ndef.java index 03f2184..c6804f9 100644 --- a/core/java/android/nfc/tech/Ndef.java +++ b/core/java/android/nfc/tech/Ndef.java @@ -31,7 +31,7 @@ import java.io.IOException; /** * A high-level connection to a {@link Tag} using one of the NFC type 1, 2, 3, or 4 technologies * to interact with NDEF data. MiFare Classic cards that present NDEF data may also be used - * via this class. To determine the exact technology being used call {@link #getTechnologyId()} + * via this class. To determine the exact technology being used call {@link #getType()} * * <p>You can acquire this kind of connection with {@link #get}. * diff --git a/core/java/android/nfc/tech/TagTechnology.java b/core/java/android/nfc/tech/TagTechnology.java index 1331bae..aebb3e8 100644 --- a/core/java/android/nfc/tech/TagTechnology.java +++ b/core/java/android/nfc/tech/TagTechnology.java @@ -89,12 +89,6 @@ public interface TagTechnology { public static final int MIFARE_ULTRALIGHT = 9; /** - * Returns the technology type for this tag connection. - * @hide - */ - public int getTechnologyId(); - - /** * Get the {@link Tag} object this technology came from. */ public Tag getTag(); |