Update to the new APIs.
[android/platform/packages/apps/Tag.git] / canon / src / com / android / apps / tagcanon / TagCanon.java
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16
17 package com.android.apps.tagcanon;
18
19 import com.android.apps.tag.MockNdefMessages;
20 import com.google.common.base.Preconditions;
21 import com.google.common.primitives.Bytes;
22
23 import android.app.ListActivity;
24 import android.content.Intent;
25 import android.content.res.Resources;
26 import android.graphics.Bitmap;
27 import android.graphics.drawable.BitmapDrawable;
28 import android.graphics.drawable.Drawable;
29 import android.nfc.NdefMessage;
30 import android.nfc.NdefRecord;
31 import android.nfc.NdefTag;
32 import android.nfc.NfcAdapter;
33 import android.nfc.Tag;
34 import android.os.Bundle;
35 import android.view.View;
36 import android.widget.ArrayAdapter;
37 import android.widget.ListView;
38
39 import java.io.ByteArrayOutputStream;
40 import java.io.IOException;
41 import java.nio.charset.Charset;
42 import java.nio.charset.Charsets;
43 import java.util.Locale;
44
45 /**
46  * A test activity that launches tags as if they had been scanned.
47  */
48 public class TagCanon extends ListActivity {
49     static final String TAG = "TagCanon";
50     static final byte[] UID = new byte[] { 0x05, 0x00, 0x03, 0x08 };
51
52     ArrayAdapter<TagDescription> mAdapter;
53
54     public static NdefRecord newTextRecord(String text, Locale locale, boolean encodeInUtf8) {
55         Preconditions.checkNotNull(text);
56         Preconditions.checkNotNull(locale);
57
58         byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII);
59
60         Charset utfEncoding = encodeInUtf8 ? Charsets.UTF_8 : Charset.forName("UTF-16");
61         byte[] textBytes = text.getBytes(utfEncoding);
62
63         int utfBit = encodeInUtf8 ? 0 : (1 << 7);
64         char status = (char) (utfBit + langBytes.length);
65
66         byte[] data = Bytes.concat(
67            new byte[] { (byte) status },
68            langBytes,
69            textBytes
70         );
71
72         return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data);
73     }
74
75     public static NdefRecord newMimeRecord(String type, byte[] data) {
76         Preconditions.checkNotNull(type);
77         Preconditions.checkNotNull(data);
78
79         byte[] typeBytes = type.getBytes(Charsets.US_ASCII);
80
81         return new NdefRecord(NdefRecord.TNF_MIME_MEDIA, typeBytes, new byte[0], data);
82     }
83
84     final NdefMessage[] buildImageMessages() {
85         Resources res = getResources();
86         Drawable drawable = res.getDrawable(R.drawable.ic_launcher_nfc);
87         Bitmap photo = ((BitmapDrawable) drawable).getBitmap();
88         final int size = photo.getWidth() * photo.getHeight() * 4;
89         final ByteArrayOutputStream out = new ByteArrayOutputStream(size);
90
91         try {
92             photo.compress(Bitmap.CompressFormat.PNG, 100, out);
93             out.flush();
94             byte[] payload = out.toByteArray();
95             out.close();
96
97             NdefRecord text = newTextRecord("There's an image below this text!", Locale.US, true);
98             NdefRecord image = newMimeRecord("image/png", payload);
99             NdefMessage[] msgs = new NdefMessage[] { 
100                     new NdefMessage(new NdefRecord[] { text, image }) };
101
102             return msgs;
103         } catch (IOException e) {
104             throw new RuntimeException("Failed to compress image", e);
105         }
106     }
107
108     static final class TagDescription {
109         public String title;
110         public NdefTag tag;
111
112         public TagDescription(String title, byte[] bytes) {
113             this.title = title;
114             try {
115                 NdefMessage[] msgs = new NdefMessage[] { new NdefMessage(bytes) };
116                 this.tag = NdefTag.createMockNdefTag(UID, new String[] { Tag.TARGET_ISO_14443_4 },
117                         null, null, new String[] { NdefTag.TARGET_TYPE_4 },
118                         new NdefMessage[][] { msgs });
119             } catch (Exception e) {
120                 throw new RuntimeException("Failed to create tag description", e);
121             }
122         }
123
124         public TagDescription(String title, NdefMessage[] msgs) {
125             this.title = title;
126             try {
127                 this.tag = NdefTag.createMockNdefTag(UID, new String[] { Tag.TARGET_ISO_14443_4 },
128                         null, null, new String[] { NdefTag.TARGET_TYPE_4 },
129                         new NdefMessage[][] { msgs });
130             } catch (Exception e) {
131                 throw new RuntimeException("Failed to create tag description", e);
132             }
133         }
134
135         @Override
136         public String toString() {
137             return title;
138         }
139     }
140
141     @Override
142     public void onCreate(Bundle savedState) {
143         super.onCreate(savedState);
144         ArrayAdapter<TagDescription> adapter = new ArrayAdapter<TagDescription>(this,
145                 android.R.layout.simple_list_item_1, android.R.id.text1);
146         adapter.add(new TagDescription("Image", buildImageMessages()));
147         adapter.add(new TagDescription("Real NFC message", MockNdefMessages.REAL_NFC_MSG));
148         adapter.add(new TagDescription("Call Google", MockNdefMessages.CALL_GOOGLE));
149         adapter.add(new TagDescription("English text", MockNdefMessages.ENGLISH_PLAIN_TEXT));
150         adapter.add(new TagDescription("Send text message", MockNdefMessages.SEND_TEXT_MESSAGE));
151         adapter.add(new TagDescription("SmartPoster URL & text", MockNdefMessages.SMART_POSTER_URL_AND_TEXT));
152         adapter.add(new TagDescription("SmartPoster URL", MockNdefMessages.SMART_POSTER_URL_NO_TEXT));
153         adapter.add(new TagDescription("VCARD", MockNdefMessages.VCARD));
154         adapter.add(new TagDescription("URI", MockNdefMessages.URI));
155         setListAdapter(adapter);
156         mAdapter = adapter;
157     }
158
159     @Override
160     public void onListItemClick(ListView l, View v, int position, long id) {
161         TagDescription description = mAdapter.getItem(position);
162         Intent intent = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED);
163         intent.putExtra(NfcAdapter.EXTRA_TAG, description.tag);
164         intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, description.tag.getNdefMessages());
165         startActivity(intent);
166     }
167 }