NdefFormatable.java revision e3f6336bcffc250da90ec864bccfa73ad1d016b9
139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen/*
239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Copyright (C) 2010 The Android Open Source Project
339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen *
439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License");
539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * you may not use this file except in compliance with the License.
639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * You may obtain a copy of the License at
739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen *
839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen *      http://www.apache.org/licenses/LICENSE-2.0
939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen *
1039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Unless required by applicable law or agreed to in writing, software
1139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS,
1239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * See the License for the specific language governing permissions and
1439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * limitations under the License.
1539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */
1639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen
1739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenpackage android.nfc.technology;
1839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen
1939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.ErrorCodes;
2039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.FormatException;
2139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.NdefMessage;
2239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.NfcAdapter;
2339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.nfc.Tag;
2439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.os.Bundle;
2539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport android.os.RemoteException;
2639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen
2739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenimport java.io.IOException;
2839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen
2939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen/**
3039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * An interface to a {@link Tag} allowing to format the tag as NDEF.
3139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen *
3239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * <p>You can acquire this kind of interface with {@link Tag#getTechnology(int)}.
3339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen *
3439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * <p class="note"><strong>Note:</strong>
3539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * Use of this class requires the {@link android.Manifest.permission#NFC}
3639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen * permission.
3739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen */
3839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenenpublic final class NdefFormatable extends BasicTagTechnology {
3939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    /**
4039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     * Internal constructor, to be used by NfcAdapter
4139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     * @hide
4239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     */
4339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    public NdefFormatable(NfcAdapter adapter, Tag tag, int tech, Bundle extras) throws RemoteException {
4439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen        super(adapter, tag, tech);
4539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    }
4639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen
4739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    /**
4839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     * Returns whether a tag can be formatted with {@link
4939f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     * NdefFormatable#format(NdefMessage)}
5039f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     */
5139f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    public boolean canBeFormatted() throws IOException {
5239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen      throw new UnsupportedOperationException();
5339f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    }
5439f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen
5539f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    /**
5639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     * Formats a tag as NDEF, if possible. You may supply a first
5739f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     * NdefMessage to be written on the tag.
5839f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen     */
595289b91c885158094988a9a7b51b3139565eb639Martijn Coenen    public void format(NdefMessage firstMessage) throws IOException, FormatException {
605289b91c885158094988a9a7b51b3139565eb639Martijn Coenen        try {
615289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            byte[] DEFAULT_KEY = {(byte)0xFF,(byte)0xFF,(byte)0xFF,
625289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                                  (byte)0xFF,(byte)0xFF,(byte)0xFF};
635289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            int serviceHandle = mTag.getServiceHandle();
645289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            int errorCode = mTagService.formatNdef(serviceHandle, DEFAULT_KEY);
655289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            switch (errorCode) {
665289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                case ErrorCodes.SUCCESS:
675289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                    break;
685289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                case ErrorCodes.ERROR_IO:
695289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                    throw new IOException();
705289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                case ErrorCodes.ERROR_INVALID_PARAM:
715289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                    throw new FormatException();
725289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                default:
735289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                    // Should not happen
745289b91c885158094988a9a7b51b3139565eb639Martijn Coenen                    throw new IOException();
755289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            }
76e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen            // Now check and see if the format worked
77e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen            if (mTagService.isNdef(serviceHandle)) {
78e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                errorCode = mTagService.ndefWrite(serviceHandle, firstMessage);
79e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                switch (errorCode) {
80e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                    case ErrorCodes.SUCCESS:
81e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                        break;
82e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                    case ErrorCodes.ERROR_IO:
83e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                        throw new IOException();
84e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                    case ErrorCodes.ERROR_INVALID_PARAM:
85e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                        throw new FormatException();
86e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                    default:
87e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                        // Should not happen
88e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                        throw new IOException();
89e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                }
90e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen            } else {
91e3f6336bcffc250da90ec864bccfa73ad1d016b9Martijn Coenen                throw new IOException();
925289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            }
935289b91c885158094988a9a7b51b3139565eb639Martijn Coenen        } catch (RemoteException e) {
945289b91c885158094988a9a7b51b3139565eb639Martijn Coenen            attemptDeadServiceRecovery(e);
955289b91c885158094988a9a7b51b3139565eb639Martijn Coenen        }
9639f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen    }
97fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen
98fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen    @Override
99fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen    public byte[] transceive(byte[] data) {
100fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen        throw new UnsupportedOperationException();
101fc5a3b6cfb85679e82a39730c7154b55b0711a0cMartijn Coenen    }
10239f91ed5290e8b27c795f8aec181a6dd4431d317Martijn Coenen}
103