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