Project: android_packages_apps_Tag
/*
 * Copyright (C) 2010 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 com.android.apps.tagcanon; 
 
import com.android.apps.tag.MockNdefMessages; 
import com.google.common.base.Preconditions; 
import com.google.common.primitives.Bytes; 
 
import android.app.ListActivity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.nfc.NdefMessage; 
import android.nfc.NdefRecord; 
import android.nfc.NfcAdapter; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.charset.Charsets; 
import java.util.Locale; 
 
/**
 * A test activity that launches tags as if they had been scanned. 
 */
 
public class TagCanon extends ListActivity { 
    static final String TAG = "TagCanon"
    static final byte[] UID = new byte[] { 0x050x000x030x08 }; 
 
    ArrayAdapter<TagDescription> mAdapter; 
 
    public static NdefRecord newTextRecord(String text, Locale locale, boolean encodeInUtf8) { 
        Preconditions.checkNotNull(text); 
        Preconditions.checkNotNull(locale); 
 
        byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII); 
 
        Charset utfEncoding = encodeInUtf8 ? Charsets.UTF_8 : Charset.forName("UTF-16"); 
        byte[] textBytes = text.getBytes(utfEncoding); 
 
        int utfBit = encodeInUtf8 ? 0 : (1 << 7); 
        char status = (char) (utfBit + langBytes.length); 
 
        byte[] data = Bytes.concat( 
           new byte[] { (byte) status }, 
           langBytes, 
           textBytes 
        ); 
 
        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); 
    } 
 
    public static NdefRecord newMimeRecord(String type, byte[] data) { 
        Preconditions.checkNotNull(type); 
        Preconditions.checkNotNull(data); 
 
        byte[] typeBytes = type.getBytes(Charsets.US_ASCII); 
 
        return new NdefRecord(NdefRecord.TNF_MIME_MEDIA, typeBytes, new byte[0], data); 
    } 
 
    final NdefMessage[] buildImageMessages() { 
        Resources res = getResources(); 
        Drawable drawable = res.getDrawable(R.drawable.ic_launcher_nfc); 
        Bitmap photo = ((BitmapDrawable) drawable).getBitmap(); 
        final int size = photo.getWidth() * photo.getHeight() * 4
        final ByteArrayOutputStream out = new ByteArrayOutputStream(size); 
 
        try { 
            photo.compress(Bitmap.CompressFormat.PNG, 100, out); 
            out.flush(); 
            byte[] payload = out.toByteArray(); 
            out.close(); 
 
            NdefRecord text = newTextRecord("There's an image below this text!", Locale.US, true); 
            NdefRecord image = newMimeRecord("image/png", payload); 
            NdefMessage[] msgs = new NdefMessage[] {  
                    new NdefMessage(new NdefRecord[] { text, image }) }; 
 
            return msgs; 
        } catch (IOException e) { 
            throw new RuntimeException("Failed to compress image", e); 
        } 
    } 
 
    static final class TagDescription { 
        public String title; 
        NdefMessage[] msgs; 
 
        public TagDescription(String title, byte[] bytes) { 
            this.title = title; 
            try { 
                msgs = new NdefMessage[] { new NdefMessage(bytes) }; 
            } catch (Exception e) { 
                throw new RuntimeException("Failed to create tag description", e); 
            } 
        } 
 
        public TagDescription(String title, NdefMessage[] msgs) { 
            this.title = title; 
            this.msgs = msgs; 
        } 
 
        @Override 
        public String toString() { 
            return title; 
        } 
    } 
 
    @Override 
    public void onCreate(Bundle savedState) { 
        super.onCreate(savedState); 
        ArrayAdapter<TagDescription> adapter = new ArrayAdapter<TagDescription>(this
                android.R.layout.simple_list_item_1, android.R.id.text1); 
        adapter.add(new TagDescription("Image", buildImageMessages())); 
        adapter.add(new TagDescription("Real NFC message", MockNdefMessages.REAL_NFC_MSG)); 
        adapter.add(new TagDescription("Call Google", MockNdefMessages.CALL_GOOGLE)); 
        adapter.add(new TagDescription("English text", MockNdefMessages.ENGLISH_PLAIN_TEXT)); 
        adapter.add(new TagDescription("Send text message", MockNdefMessages.SEND_TEXT_MESSAGE)); 
        adapter.add(new TagDescription("SmartPoster URL & text", MockNdefMessages.SMART_POSTER_URL_AND_TEXT)); 
        adapter.add(new TagDescription("SmartPoster URL", MockNdefMessages.SMART_POSTER_URL_NO_TEXT)); 
        adapter.add(new TagDescription("VCARD", MockNdefMessages.VCARD)); 
        adapter.add(new TagDescription("URI", MockNdefMessages.URI)); 
        setListAdapter(adapter); 
        mAdapter = adapter; 
    } 
 
    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
        TagDescription description = mAdapter.getItem(position); 
        Intent intent = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED); 
        intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, description.msgs); 
        startActivity(intent); 
    } 
}