diff options
author | Jeff Hamilton <jham@android.com> | 2010-10-19 14:53:34 -0500 |
---|---|---|
committer | Jeff Hamilton <jham@android.com> | 2010-10-19 16:10:54 -0500 |
commit | 22c803adaa028bbb7d8d1f9a1f4134de5b2f3c17 (patch) | |
tree | f5982717f67e612aeda3bbf53e5f0892a1fbe4df /canon | |
parent | 8dd68417526785dd82f054bcf3f4763e19d35142 (diff) | |
download | android_packages_apps_Tag-22c803adaa028bbb7d8d1f9a1f4134de5b2f3c17.tar.gz android_packages_apps_Tag-22c803adaa028bbb7d8d1f9a1f4134de5b2f3c17.tar.bz2 android_packages_apps_Tag-22c803adaa028bbb7d8d1f9a1f4134de5b2f3c17.zip |
Create the tag canon. It fires tags.
Change-Id: I52a256a2f71e797c9a7f3d26cdd9388f21427474
Diffstat (limited to 'canon')
-rw-r--r-- | canon/Android.mk | 13 | ||||
-rw-r--r-- | canon/AndroidManifest.xml | 30 | ||||
-rw-r--r-- | canon/res/drawable-hdpi/ic_launcher_nfc.png | bin | 0 -> 4865 bytes | |||
-rw-r--r-- | canon/res/drawable-mdpi/ic_launcher_nfc.png | bin | 0 -> 2789 bytes | |||
-rw-r--r-- | canon/src/com/android/apps/tagcanon/TagCanon.java | 161 |
5 files changed, 204 insertions, 0 deletions
diff --git a/canon/Android.mk b/canon/Android.mk new file mode 100644 index 0000000..ea15614 --- /dev/null +++ b/canon/Android.mk @@ -0,0 +1,13 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-subdir-java-files) \ + ../tests/src/com/android/apps/tag/MockNdefMessages.java \ + +LOCAL_STATIC_JAVA_LIBRARIES := guava + +LOCAL_PACKAGE_NAME := TagCanon + +LOCAL_MODULE_TAGS := tests + +include $(BUILD_PACKAGE) diff --git a/canon/AndroidManifest.xml b/canon/AndroidManifest.xml new file mode 100644 index 0000000..2b7bcab --- /dev/null +++ b/canon/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.apps.tagcanon"> + + <application> + <activity android:name="TagCanon" + android:label="Tag Canon" + > + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/canon/res/drawable-hdpi/ic_launcher_nfc.png b/canon/res/drawable-hdpi/ic_launcher_nfc.png Binary files differnew file mode 100644 index 0000000..9b076ab --- /dev/null +++ b/canon/res/drawable-hdpi/ic_launcher_nfc.png diff --git a/canon/res/drawable-mdpi/ic_launcher_nfc.png b/canon/res/drawable-mdpi/ic_launcher_nfc.png Binary files differnew file mode 100644 index 0000000..525f5b5 --- /dev/null +++ b/canon/res/drawable-mdpi/ic_launcher_nfc.png diff --git a/canon/src/com/android/apps/tagcanon/TagCanon.java b/canon/src/com/android/apps/tagcanon/TagCanon.java new file mode 100644 index 0000000..a636dbe --- /dev/null +++ b/canon/src/com/android/apps/tagcanon/TagCanon.java @@ -0,0 +1,161 @@ +/* + * 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.NdefTag; +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[] { 0x05, 0x00, 0x03, 0x08 }; + + 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; + public NdefTag tag; + + public TagDescription(String title, byte[] bytes) { + this.title = title; + try { + NdefMessage[] msgs = new NdefMessage[] { new NdefMessage(bytes) }; + this.tag = new NdefTag(NdefTag.TARGET_TYPE_4, UID, 0, msgs); + } catch (Exception e) { + throw new RuntimeException("Failed to create tag description", e); + } + } + + public TagDescription(String title, NdefMessage[] msgs) { + this.title = title; + try { + this.tag = new NdefTag(NdefTag.TARGET_TYPE_4, UID, 0, msgs); + } catch (Exception e) { + throw new RuntimeException("Failed to create tag description", e); + } + } + + @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_NDEF_TAG_DISCOVERED); + intent.putExtra(NfcAdapter.EXTRA_TAG, description.tag); + startActivity(intent); + } +} |