Tag.java revision be372d6462605010910e771cef15d5adccd0a59e
1590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly/* 2590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * Copyright (C) 2010 The Android Open Source Project 3590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * 4590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 5590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * you may not use this file except in compliance with the License. 6590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * You may obtain a copy of the License at 7590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * 8590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 9590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * 10590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * Unless required by applicable law or agreed to in writing, software 11590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 12590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * See the License for the specific language governing permissions and 14590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * limitations under the License. 15590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 16590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 17590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellypackage android.nfc; 18590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 196be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.IsoDep; 206be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.MifareClassic; 212fe24e3e14cce791e89c93ddc23e28af5c2c90ccJan Brandsimport android.nfc.technology.MifareUltralight; 226be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.NfcV; 236be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.Ndef; 245289b91c885158094988a9a7b51b3139565eb639Martijn Coenenimport android.nfc.technology.NdefFormatable; 256be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.NfcA; 266be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.NfcB; 276be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.NfcF; 286be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.technology.TagTechnology; 296be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.os.Bundle; 30590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.os.Parcel; 31590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellyimport android.os.Parcelable; 326be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.os.RemoteException; 336be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 346be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport java.util.Arrays; 35590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 36590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly/** 37c9f7890a203a013646650a695157277df81b6a17Scott Main * Represents a (generic) discovered tag. 38590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * <p> 39590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * A tag is a passive NFC element, such as NFC Forum Tag's, Mifare class Tags, 40590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * Sony Felica Tags. 41590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * <p> 42590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * Tag's have a type and usually have a UID. 43590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * <p> 44c9f7890a203a013646650a695157277df81b6a17Scott Main * {@link Tag} objects are passed to applications via the {@link NfcAdapter#EXTRA_TAG} extra 45c9f7890a203a013646650a695157277df81b6a17Scott Main * in {@link NfcAdapter#ACTION_TAG_DISCOVERED} intents. A {@link Tag} object is immutable 46c9f7890a203a013646650a695157277df81b6a17Scott Main * and represents the state of the tag at the time of discovery. It can be 476be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * directly queried for its UID and Type, or used to create a {@link TagTechnology} 48be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * (with {@link Tag#getTechnology}). 49590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * <p> 506be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * A {@link Tag} can be used to create a {@link TagTechnology} only while the tag is in 51c9f7890a203a013646650a695157277df81b6a17Scott Main * range. If it is removed and then returned to range, then the most recent 52c9f7890a203a013646650a695157277df81b6a17Scott Main * {@link Tag} object (in {@link NfcAdapter#ACTION_TAG_DISCOVERED}) should be used to create a 536be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * {@link TagTechnology}. 5407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * <p>This is an immutable data class. All properties are set at Tag discovery 5507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * time and calls on this class will retrieve those read-only properties, and 5607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * not cause any further RF activity or block. Note however that arrays passed to and 5707f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * returned by this class are *not* cloned, so be careful not to modify them. 58590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 59590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pellypublic class Tag implements Parcelable { 6007f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly /*package*/ final byte[] mId; 616be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton /*package*/ final int[] mTechList; 626be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton /*package*/ final Bundle[] mTechExtras; 6307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly /*package*/ final int mServiceHandle; // for use by NFC service, 0 indicates a mock 64a926540d5455a973dd8ca19c00c108620d9c68c2Sylvain Fonteneau 654049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen /*package*/ int mConnectedTechnology; 664049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen 67590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 6807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * Hidden constructor to be used by NFC service and internal classes. 69590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * @hide 70590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 716be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton public Tag(byte[] id, int[] techList, Bundle[] techListExtras, int serviceHandle) { 726be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton if (techList == null) { 7307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly throw new IllegalArgumentException("rawTargets cannot be null"); 7407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 7507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly mId = id; 766be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton mTechList = Arrays.copyOf(techList, techList.length); 776be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton // Ensure mTechExtras is as long as mTechList 786be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton mTechExtras = Arrays.copyOf(techListExtras, techList.length); 7907f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly mServiceHandle = serviceHandle; 804049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen 814049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen mConnectedTechnology = -1; 8207f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 8307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly 8407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly /** 8507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * Construct a mock Tag. 8607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * <p>This is an application constructed tag, so NfcAdapter methods on this 876be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Tag such as {@link #getTechnology} may fail with 8807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * {@link IllegalArgumentException} since it does not represent a physical Tag. 8907f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * <p>This constructor might be useful for mock testing. 9007f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * @param id The tag identifier, can be null 916be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * @param techList must not be null 9207f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * @return freshly constructed tag 9307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly */ 946be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton public static Tag createMockTag(byte[] id, int[] techList, Bundle[] techListExtras) { 9507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly // set serviceHandle to 0 to indicate mock tag 966be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new Tag(id, techList, techListExtras, 0); 97590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 98590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 99590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 100590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * For use by NfcService only. 101590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * @hide 102590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 10307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly public int getServiceHandle() { 10407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly return mServiceHandle; 105590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 106590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 107590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 10807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * Get the Tag Identifier (if it has one). 10907f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * <p>Tag ID is usually a serial number for the tag. 110590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly * 11107f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly * @return ID, or null if it does not exist 11207f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly */ 11307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly public byte[] getId() { 11407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly return mId; 11507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 11607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly 11707f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly /** 1186be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Returns technologies present in the tag that this implementation understands, 1196be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * or a zero length array if there are no supported technologies on this tag. 120c1576ad627d3d2b2d3c0764c605ebbf3ddc24401Jeff Hamilton * 121c1576ad627d3d2b2d3c0764c605ebbf3ddc24401Jeff Hamilton * The elements of the list are guaranteed be one of the constants defined in 122c1576ad627d3d2b2d3c0764c605ebbf3ddc24401Jeff Hamilton * {@link TagTechnology}. 123c1576ad627d3d2b2d3c0764c605ebbf3ddc24401Jeff Hamilton * 124c1576ad627d3d2b2d3c0764c605ebbf3ddc24401Jeff Hamilton * The ordering of the returned array is undefined and should not be relied upon. 125590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 1266be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton public int[] getTechnologyList() { 1276be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return Arrays.copyOf(mTechList, mTechList.length); 128590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 129590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 130590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly /** 1316be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Returns the technology, or null if not present 132590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly */ 13350b4d8f643f31b37e9872f562fb869059cf79c8aNick Pelly public TagTechnology getTechnology(NfcAdapter adapter, int tech) { 1341253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen int pos = -1; 1351253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen for (int idx = 0; idx < mTechList.length; idx++) { 1361253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen if (mTechList[idx] == tech) { 1371253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen pos = idx; 1381253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen break; 1391253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen } 1401253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen } 1416be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton if (pos < 0) { 1426be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return null; 1436be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1446be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 1456be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton Bundle extras = mTechExtras[pos]; 1466be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton try { 1476be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton switch (tech) { 1486be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton case TagTechnology.NFC_A: { 1496be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new NfcA(adapter, this, extras); 1506be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1516be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton case TagTechnology.NFC_B: { 1526be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new NfcB(adapter, this, extras); 1536be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1546be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton case TagTechnology.ISO_DEP: { 1556be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new IsoDep(adapter, this, extras); 1566be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1576be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton case TagTechnology.NFC_V: { 1586be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new NfcV(adapter, this, extras); 1596be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 16072df4ea8300ad345eb256cf43d8dae35eef39ba2Martijn Coenen case TagTechnology.NDEF: { 1616be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new Ndef(adapter, this, tech, extras); 1626be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1635289b91c885158094988a9a7b51b3139565eb639Martijn Coenen case TagTechnology.NDEF_FORMATABLE: { 1645289b91c885158094988a9a7b51b3139565eb639Martijn Coenen return new NdefFormatable(adapter, this, tech, extras); 1655289b91c885158094988a9a7b51b3139565eb639Martijn Coenen } 1666be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton case TagTechnology.NFC_F: { 1676be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new NfcF(adapter, this, extras); 1686be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1696be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton case TagTechnology.MIFARE_CLASSIC: { 1706be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new MifareClassic(adapter, this, extras); 1716be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1722fe24e3e14cce791e89c93ddc23e28af5c2c90ccJan Brands case TagTechnology.MIFARE_ULTRALIGHT: { 1732fe24e3e14cce791e89c93ddc23e28af5c2c90ccJan Brands return new MifareUltralight(adapter, this, extras); 1742fe24e3e14cce791e89c93ddc23e28af5c2c90ccJan Brands } 1756be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 1766be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton default: { 1776be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton throw new UnsupportedOperationException("Tech " + tech + " not supported"); 1786be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1796be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 1806be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } catch (RemoteException e) { 1816be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return null; 1826be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 18307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 18407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly 18507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly @Override 18607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly public String toString() { 18707f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly StringBuilder sb = new StringBuilder("TAG ") 18807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly .append("uid = ") 18907f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly .append(mId) 1906be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton .append(" Tech ["); 1916be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton for (int i : mTechList) { 1926be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton sb.append(i) 19307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly .append(", "); 19407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 19507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly return sb.toString(); 19607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 19707f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly 19807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly /*package*/ static byte[] readBytesWithNull(Parcel in) { 19907f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly int len = in.readInt(); 20007f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly byte[] result = null; 201e2e4ea9ea8f5724403e6267d193a740dc7c78785Sylvain Fonteneau if (len >= 0) { 20207f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly result = new byte[len]; 20307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly in.readByteArray(result); 204590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 20507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly return result; 20607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 20707f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly 20807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly /*package*/ static void writeBytesWithNull(Parcel out, byte[] b) { 20907f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly if (b == null) { 21007f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly out.writeInt(-1); 21107f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly return; 21207f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly } 21307f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly out.writeInt(b.length); 21407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly out.writeByteArray(b); 215590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 216590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 217590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly @Override 218590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public int describeContents() { 219590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly return 0; 220590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 221590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 222590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly @Override 223590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public void writeToParcel(Parcel dest, int flags) { 22407f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly writeBytesWithNull(dest, mId); 2256be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton dest.writeInt(mTechList.length); 2266be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton dest.writeIntArray(mTechList); 2276be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton dest.writeTypedArray(mTechExtras, 0); 22807f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly dest.writeInt(mServiceHandle); 229590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 230590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly 231590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public static final Parcelable.Creator<Tag> CREATOR = 232590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly new Parcelable.Creator<Tag>() { 2336be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton @Override 234590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public Tag createFromParcel(Parcel in) { 23507f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly // Tag fields 23607f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly byte[] id = Tag.readBytesWithNull(in); 2376be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton int[] techList = new int[in.readInt()]; 2386be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton in.readIntArray(techList); 2396be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton Bundle[] techExtras = in.createTypedArray(Bundle.CREATOR); 24007f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly int serviceHandle = in.readInt(); 24107f3bee2db8b6e93ebbf7222676bd9f468e85569Nick Pelly 2426be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton return new Tag(id, techList, techExtras, serviceHandle); 243590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 2446be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 2456be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton @Override 246590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly public Tag[] newArray(int size) { 247590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly return new Tag[size]; 248590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly } 249590b73bc5b8e5f7b59bff1d9264a52388a5162e6Nick Pelly }; 2504049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen 251be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton /** 252be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * For internal use only. 253be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * 2544049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen * @hide 2554049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen */ 2564049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen public synchronized void setConnectedTechnology(int technology) { 2574049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen if (mConnectedTechnology == -1) { 2584049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen mConnectedTechnology = technology; 2594049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen } else { 2604049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen throw new IllegalStateException("Close other technology first!"); 2614049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen } 2624049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen } 2634049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen 264be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton /** 265be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * For internal use only. 266be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * 2674049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen * @hide 2684049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen */ 2694049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen public int getConnectedTechnology() { 2704049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen return mConnectedTechnology; 2714049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen } 2724049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen 273be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton /** 274be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * For internal use only. 275be372d6462605010910e771cef15d5adccd0a59eJeff Hamilton * 2764049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen * @hide 2774049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen */ 2784049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen public void setTechnologyDisconnected() { 2794049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen mConnectedTechnology = -1; 2804049f9d00a86f848d42d2429068496b31a6795adMartijn Coenen } 2811253ebc74a8453a88dc47a2b698145098d201681Martijn Coenen} 282