diff --git a/apps/Tag/.gitignore b/apps/Tag/.gitignore deleted file mode 100644 index 783cd5baa..000000000 --- a/apps/Tag/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.swp - diff --git a/apps/Tag/Android.mk b/apps/Tag/Android.mk deleted file mode 100644 index 688f2857c..000000000 --- a/apps/Tag/Android.mk +++ /dev/null @@ -1,20 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_STATIC_JAVA_LIBRARIES := guava - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := TagApp - -# LOCAL_SDK_VERSION := current - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) - -# Use the following include to make our test apk. -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/apps/Tag/AndroidManifest.xml b/apps/Tag/AndroidManifest.xml deleted file mode 100644 index ba01fff2b..000000000 --- a/apps/Tag/AndroidManifest.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/Tag/res/drawable-hdpi/ic_launcher_nfc.png b/apps/Tag/res/drawable-hdpi/ic_launcher_nfc.png deleted file mode 100644 index 9b076abf2..000000000 Binary files a/apps/Tag/res/drawable-hdpi/ic_launcher_nfc.png and /dev/null differ diff --git a/apps/Tag/res/drawable-hdpi/ic_menu_desk_clock.png b/apps/Tag/res/drawable-hdpi/ic_menu_desk_clock.png deleted file mode 100644 index 0a82ad669..000000000 Binary files a/apps/Tag/res/drawable-hdpi/ic_menu_desk_clock.png and /dev/null differ diff --git a/apps/Tag/res/drawable-hdpi/ic_menu_tag.png b/apps/Tag/res/drawable-hdpi/ic_menu_tag.png deleted file mode 100644 index c4d820eff..000000000 Binary files a/apps/Tag/res/drawable-hdpi/ic_menu_tag.png and /dev/null differ diff --git a/apps/Tag/res/drawable-mdpi/ic_launcher_nfc.png b/apps/Tag/res/drawable-mdpi/ic_launcher_nfc.png deleted file mode 100644 index 525f5b500..000000000 Binary files a/apps/Tag/res/drawable-mdpi/ic_launcher_nfc.png and /dev/null differ diff --git a/apps/Tag/res/drawable-mdpi/ic_menu_desk_clock.png b/apps/Tag/res/drawable-mdpi/ic_menu_desk_clock.png deleted file mode 100644 index e4fa67196..000000000 Binary files a/apps/Tag/res/drawable-mdpi/ic_menu_desk_clock.png and /dev/null differ diff --git a/apps/Tag/res/drawable-mdpi/ic_menu_tag.png b/apps/Tag/res/drawable-mdpi/ic_menu_tag.png deleted file mode 100644 index e0b3eb73d..000000000 Binary files a/apps/Tag/res/drawable-mdpi/ic_menu_tag.png and /dev/null differ diff --git a/apps/Tag/res/layout/main.xml b/apps/Tag/res/layout/main.xml deleted file mode 100644 index 50b2324de..000000000 --- a/apps/Tag/res/layout/main.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/Tag/res/layout/tag_divider.xml b/apps/Tag/res/layout/tag_divider.xml deleted file mode 100644 index b6b1b7cd4..000000000 --- a/apps/Tag/res/layout/tag_divider.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/Tag/res/layout/tag_list_item.xml b/apps/Tag/res/layout/tag_list_item.xml deleted file mode 100644 index cc984f545..000000000 --- a/apps/Tag/res/layout/tag_list_item.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - diff --git a/apps/Tag/res/layout/tag_text.xml b/apps/Tag/res/layout/tag_text.xml deleted file mode 100644 index 903865055..000000000 --- a/apps/Tag/res/layout/tag_text.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/Tag/res/layout/tag_viewer_list.xml b/apps/Tag/res/layout/tag_viewer_list.xml deleted file mode 100644 index 3d322d539..000000000 --- a/apps/Tag/res/layout/tag_viewer_list.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/apps/Tag/res/menu/mailbox_menu.xml b/apps/Tag/res/menu/mailbox_menu.xml deleted file mode 100644 index 8bb8d7b4d..000000000 --- a/apps/Tag/res/menu/mailbox_menu.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/apps/Tag/res/values/strings.xml b/apps/Tag/res/values/strings.xml deleted file mode 100644 index 9b736784e..000000000 --- a/apps/Tag/res/values/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Hello, World! - help and info - Saved - - - Recent - - - Saved - - diff --git a/apps/Tag/src/com/android/apps/tag/MockNdefMessages.java b/apps/Tag/src/com/android/apps/tag/MockNdefMessages.java deleted file mode 100644 index 3acdc5c64..000000000 --- a/apps/Tag/src/com/android/apps/tag/MockNdefMessages.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * 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.tag; - -/** - * Tags that we've seen in the field, for testing purposes. - */ -public class MockNdefMessages { - - /** - * A real NFC tag containing an NFC "smart poster". This smart poster - * consists of the text "NFC Forum Type 4 Tag" in english combined with - * the URL "http://www.nxp.com/nfc" - */ - public static final byte[] REAL_NFC_MSG = new byte[] { - (byte) 0xd1, // MB=1 ME=1 CF=0 SR=1 IL=0 TNF=001 - (byte) 0x02, // Type Length = 2 - (byte) 0x2b, // Payload Length = 43 - (byte) 0x53, (byte) 0x70, // Type = {'S', 'p'} (smart poster) - - // begin smart poster payload - // begin smart poster record #1 - (byte) 0x91, // MB=1 ME=0 CF=0 SR=1 IL=0 TNF=001 - (byte) 0x01, // Type Length = 1 - (byte) 0x17, // Payload Length = 23 - (byte) 0x54, // Type = {'T'} (Text data) - (byte) 0x02, // UTF-8 encoding, language code length = 2 - (byte) 0x65, (byte) 0x6e, // language = {'e', 'n'} (english) - - // Begin text data within smart poster record #1 - (byte) 0x4e, // 'N' - (byte) 0x46, // 'F' - (byte) 0x43, // 'C' - (byte) 0x20, // ' ' - (byte) 0x46, // 'F' - (byte) 0x6f, // 'o' - (byte) 0x72, // 'r' - (byte) 0x75, // 'u' - (byte) 0x6d, // 'm' - (byte) 0x20, // ' ' - (byte) 0x54, // 'T' - (byte) 0x79, // 'y' - (byte) 0x70, // 'p' - (byte) 0x65, // 'e' - (byte) 0x20, // ' ' - (byte) 0x34, // '4' - (byte) 0x20, // ' ' - (byte) 0x54, // 'T' - (byte) 0x61, // 'a' - (byte) 0x67, // 'g' - // end Text data within smart poster record #1 - // end smart poster record #1 - - // begin smart poster record #2 - (byte) 0x51, // MB=0 ME=1 CF=0 SR=1 IL=0 TNF=001 - (byte) 0x01, // Type Length = 1 - (byte) 0x0c, // Payload Length = 12 - (byte) 0x55, // Type = { 'U' } (URI) - - // begin URI data within smart poster record #2 - (byte) 0x01, // URI Prefix = 1 ("http://www.") - (byte) 0x6e, // 'n' - (byte) 0x78, // 'x' - (byte) 0x70, // 'p' - (byte) 0x2e, // '.' - (byte) 0x63, // 'c' - (byte) 0x6f, // 'o' - (byte) 0x6d, // 'm' - (byte) 0x2f, // '/' - (byte) 0x6e, // 'n' - (byte) 0x66, // 'f' - (byte) 0x63 // 'c' - // end URI data within smart poster record #2 - // end smart poster record #2 - // end smart poster payload - }; - - - /** - * A Smart Poster containing a URL and no text. This message was created - * using the NXP reference phone. - */ - private static final byte[] SMART_POSTER_URL_NO_TEXT = new byte[] { - (byte) 0xd1, (byte) 0x02, (byte) 0x0f, (byte) 0x53, (byte) 0x70, (byte) 0xd1, - (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67, (byte) 0x6f, - (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, - (byte) 0x6f, (byte) 0x6d - }; - - /** - * A plain text tag in english. Generated using the NXP evaluation tool. - */ - private static final byte[] ENGLISH_PLAIN_TEXT = new byte[] { - (byte) 0xd1, (byte) 0x01, (byte) 0x1c, (byte) 0x54, (byte) 0x02, (byte) 0x65, - (byte) 0x6e, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x20, - (byte) 0x72, (byte) 0x61, (byte) 0x6e, (byte) 0x64, (byte) 0x6f, (byte) 0x6d, - (byte) 0x20, (byte) 0x65, (byte) 0x6e, (byte) 0x67, (byte) 0x6c, (byte) 0x69, - (byte) 0x73, (byte) 0x68, (byte) 0x20, (byte) 0x74, (byte) 0x65, (byte) 0x78, - (byte) 0x74, (byte) 0x2e - }; - - /** - * Smart Poster containing a URL and Text. Generated using the NXP - * evaluation tool. - */ - private static final byte[] SMART_POSTER_URL_AND_TEXT = new byte[] { - (byte) 0xd1, (byte) 0x02, (byte) 0x1c, (byte) 0x53, (byte) 0x70, (byte) 0x91, - (byte) 0x01, (byte) 0x09, (byte) 0x54, (byte) 0x02, (byte) 0x65, (byte) 0x6e, - (byte) 0x47, (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, - (byte) 0x51, (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67, - (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, - (byte) 0x63, (byte) 0x6f, (byte) 0x6d - }; - - /** - * A plain URI. Generated using the NXP evaluation tool. - */ - private static final byte[] URI = new byte[] { - (byte) 0xd1, (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67, - (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, - (byte) 0x63, (byte) 0x6f, (byte) 0x6d - }; - - /** - * A vcard. Generated using the NXP evaluation tool. - */ - private static final byte[] VCARD = new byte[] { - (byte) 0xc2, (byte) 0x0c, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x05, - (byte) 0x74, (byte) 0x65, (byte) 0x78, (byte) 0x74, (byte) 0x2f, (byte) 0x78, - (byte) 0x2d, (byte) 0x76, (byte) 0x43, (byte) 0x61, (byte) 0x72, (byte) 0x64, - (byte) 0x42, (byte) 0x45, (byte) 0x47, (byte) 0x49, (byte) 0x4e, (byte) 0x3a, - (byte) 0x56, (byte) 0x43, (byte) 0x41, (byte) 0x52, (byte) 0x44, (byte) 0x0d, - (byte) 0x0a, (byte) 0x56, (byte) 0x45, (byte) 0x52, (byte) 0x53, (byte) 0x49, - (byte) 0x4f, (byte) 0x4e, (byte) 0x3a, (byte) 0x33, (byte) 0x2e, (byte) 0x30, - (byte) 0x0d, (byte) 0x0a, (byte) 0x46, (byte) 0x4e, (byte) 0x3a, (byte) 0x4a, - (byte) 0x6f, (byte) 0x65, (byte) 0x20, (byte) 0x47, (byte) 0x6f, (byte) 0x6f, - (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x20, (byte) 0x45, (byte) 0x6d, - (byte) 0x70, (byte) 0x6c, (byte) 0x6f, (byte) 0x79, (byte) 0x65, (byte) 0x65, - (byte) 0x0d, (byte) 0x0a, (byte) 0x41, (byte) 0x44, (byte) 0x52, (byte) 0x3b, - (byte) 0x54, (byte) 0x59, (byte) 0x50, (byte) 0x45, (byte) 0x3d, (byte) 0x57, - (byte) 0x4f, (byte) 0x52, (byte) 0x4b, (byte) 0x3a, (byte) 0x3b, (byte) 0x3b, - (byte) 0x31, (byte) 0x36, (byte) 0x30, (byte) 0x30, (byte) 0x20, (byte) 0x41, - (byte) 0x6d, (byte) 0x70, (byte) 0x68, (byte) 0x69, (byte) 0x74, (byte) 0x68, - (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x72, (byte) 0x65, (byte) 0x20, - (byte) 0x50, (byte) 0x61, (byte) 0x72, (byte) 0x6b, (byte) 0x77, (byte) 0x61, - (byte) 0x79, (byte) 0x3b, (byte) 0x39, (byte) 0x34, (byte) 0x30, (byte) 0x34, - (byte) 0x33, (byte) 0x20, (byte) 0x4d, (byte) 0x6f, (byte) 0x75, (byte) 0x6e, - (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e, (byte) 0x20, (byte) 0x56, - (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x0d, (byte) 0x0a, (byte) 0x54, - (byte) 0x45, (byte) 0x4c, (byte) 0x3b, (byte) 0x54, (byte) 0x59, (byte) 0x50, - (byte) 0x45, (byte) 0x3d, (byte) 0x50, (byte) 0x52, (byte) 0x45, (byte) 0x46, - (byte) 0x2c, (byte) 0x57, (byte) 0x4f, (byte) 0x52, (byte) 0x4b, (byte) 0x3a, - (byte) 0x36, (byte) 0x35, (byte) 0x30, (byte) 0x2d, (byte) 0x32, (byte) 0x35, - (byte) 0x33, (byte) 0x2d, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, - (byte) 0x0d, (byte) 0x0a, (byte) 0x45, (byte) 0x4d, (byte) 0x41, (byte) 0x49, - (byte) 0x4c, (byte) 0x3b, (byte) 0x54, (byte) 0x59, (byte) 0x50, (byte) 0x45, - (byte) 0x3d, (byte) 0x49, (byte) 0x4e, (byte) 0x54, (byte) 0x45, (byte) 0x52, - (byte) 0x4e, (byte) 0x45, (byte) 0x54, (byte) 0x3a, (byte) 0x73, (byte) 0x75, - (byte) 0x70, (byte) 0x70, (byte) 0x6f, (byte) 0x72, (byte) 0x74, (byte) 0x40, - (byte) 0x67, (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, - (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x0d, (byte) 0x0a, - (byte) 0x54, (byte) 0x49, (byte) 0x54, (byte) 0x4c, (byte) 0x45, (byte) 0x3a, - (byte) 0x53, (byte) 0x6f, (byte) 0x66, (byte) 0x74, (byte) 0x77, (byte) 0x61, - (byte) 0x72, (byte) 0x65, (byte) 0x20, (byte) 0x45, (byte) 0x6e, (byte) 0x67, - (byte) 0x69, (byte) 0x6e, (byte) 0x65, (byte) 0x65, (byte) 0x72, (byte) 0x0d, - (byte) 0x0a, (byte) 0x4f, (byte) 0x52, (byte) 0x47, (byte) 0x3a, (byte) 0x47, - (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x0d, - (byte) 0x0a, (byte) 0x55, (byte) 0x52, (byte) 0x4c, (byte) 0x3a, (byte) 0x68, - (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, - (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x67, (byte) 0x6f, - (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, - (byte) 0x6f, (byte) 0x6d, (byte) 0x0d, (byte) 0x0a, (byte) 0x45, (byte) 0x4e, - (byte) 0x44, (byte) 0x3a, (byte) 0x56, (byte) 0x43, (byte) 0x41, (byte) 0x52, - (byte) 0x44, (byte) 0x0d, (byte) 0x0a - }; - - /** - * Send the text message "hello world" to a phone number. This was generated using - * the NXP reference phone. - */ - private static final byte[] SEND_TEXT_MESSAGE = new byte[] { - (byte) 0xd1, (byte) 0x02, (byte) 0x25, (byte) 0x53, (byte) 0x70, (byte) 0xd1, - (byte) 0x01, (byte) 0x21, (byte) 0x55, (byte) 0x00, (byte) 0x73, (byte) 0x6d, - (byte) 0x73, (byte) 0x3a, (byte) 0x31, (byte) 0x36, (byte) 0x35, (byte) 0x30, - (byte) 0x32, (byte) 0x35, (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x30, - (byte) 0x30, (byte) 0x3f, (byte) 0x62, (byte) 0x6f, (byte) 0x64, (byte) 0x79, - (byte) 0x3d, (byte) 0x48, (byte) 0x65, (byte) 0x6c, (byte) 0x6c, (byte) 0x6f, - (byte) 0x20, (byte) 0x77, (byte) 0x6f, (byte) 0x72, (byte) 0x6c, (byte) 0x64 - }; - - /** - * Call Google. Generated using the NXP reference phone. - */ - private static final byte[] CALL_GOOGLE = new byte[] { - (byte) 0xd1, (byte) 0x02, (byte) 0x10, (byte) 0x53, (byte) 0x70, (byte) 0xd1, - (byte) 0x01, (byte) 0x0c, (byte) 0x55, (byte) 0x05, (byte) 0x31, (byte) 0x36, - (byte) 0x35, (byte) 0x30, (byte) 0x32, (byte) 0x35, (byte) 0x33, (byte) 0x30, - (byte) 0x30, (byte) 0x30, (byte) 0x30 - }; - - /** - * All the real ndef messages we've seen in the field. - */ - public static final byte[][] ALL_MOCK_MESSAGES = new byte[][] { - REAL_NFC_MSG, SMART_POSTER_URL_NO_TEXT, ENGLISH_PLAIN_TEXT, - SMART_POSTER_URL_AND_TEXT, URI, VCARD, SEND_TEXT_MESSAGE, - CALL_GOOGLE - }; - -} diff --git a/apps/Tag/src/com/android/apps/tag/NdefUtil.java b/apps/Tag/src/com/android/apps/tag/NdefUtil.java deleted file mode 100644 index 55d52f37b..000000000 --- a/apps/Tag/src/com/android/apps/tag/NdefUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.tag; - -import android.net.Uri; -import android.nfc.NdefRecord; - -import com.google.common.primitives.Bytes; - -import java.nio.charset.Charsets; - -/** - * Utilities for dealing with conversions to and from NdefRecords. - * - * TODO: Possibly move this class into core Android. - */ -public class NdefUtil { - private static final byte[] EMPTY = new byte[0]; - - /** - * Create a new {@link NdefRecord} containing the supplied {@link Uri}. - */ - public static NdefRecord toUriRecord(Uri uri) { - byte[] uriBytes = uri.toString().getBytes(Charsets.UTF_8); - - /* - * We prepend 0x00 to the bytes of the URI to indicate that this - * is the entire URI, and we are not taking advantage of the - * URI shortening rules in the NFC Forum URI spec section 3.2.2. - * This produces a NdefRecord which is slightly larger than - * necessary. - * - * In the future, we should use the URI shortening rules in 3.2.2 - * to create a smaller NdefRecord. - */ - byte[] payload = Bytes.concat(new byte[] { 0x00 }, uriBytes); - - return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, - NdefRecord.RTD_URI, EMPTY, payload); - } -} diff --git a/apps/Tag/src/com/android/apps/tag/TagAdapter.java b/apps/Tag/src/com/android/apps/tag/TagAdapter.java deleted file mode 100644 index 44757c455..000000000 --- a/apps/Tag/src/com/android/apps/tag/TagAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.tag; - -import android.content.Context; -import android.database.Cursor; -import android.nfc.FormatException; -import android.nfc.NdefMessage; -import android.text.format.DateUtils; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Adapter; -import android.widget.CursorAdapter; -import android.widget.TextView; - -import com.android.apps.tag.TagDBHelper.NdefMessagesTable; -import com.android.apps.tag.message.NdefMessageParser; -import com.android.apps.tag.message.ParsedNdefMessage; - -import java.util.Locale; - -/** - * A custom {@link Adapter} that renders tag entries for a list. - */ -public class TagAdapter extends CursorAdapter { - - private final LayoutInflater mInflater; - - public TagAdapter(Context context) { - super(context, null, false); - mInflater = LayoutInflater.from(context); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - TextView mainLine = (TextView) view.findViewById(R.id.title); - TextView dateLine = (TextView) view.findViewById(R.id.date); - - NdefMessage msg = null; - try { - msg = new NdefMessage(cursor.getBlob(cursor.getColumnIndex(NdefMessagesTable.BYTES))); - } catch (FormatException e) { - Log.e("foo", "poorly formatted message", e); - } - - if (msg == null) { - mainLine.setText("Invalid tag"); - } else { - ParsedNdefMessage parsedMsg = NdefMessageParser.parse(msg); - mainLine.setText(parsedMsg.getSnippet(Locale.getDefault())); - } - dateLine.setText(DateUtils.getRelativeTimeSpanString( - context, cursor.getLong(cursor.getColumnIndex(NdefMessagesTable.DATE)))); - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return mInflater.inflate(R.layout.tag_list_item, null); - } -} diff --git a/apps/Tag/src/com/android/apps/tag/TagBrowserActivity.java b/apps/Tag/src/com/android/apps/tag/TagBrowserActivity.java deleted file mode 100644 index 38d3bfab8..000000000 --- a/apps/Tag/src/com/android/apps/tag/TagBrowserActivity.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.tag; - -import android.app.Activity; -import android.app.TabActivity; -import android.content.Intent; -import android.content.res.Resources; -import android.os.Bundle; -import android.widget.TabHost; - -/** - * A browsing {@link Activity} that displays the saved tags in categories under tabs. - */ -public class TagBrowserActivity extends TabActivity { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.main); - - Resources res = getResources(); - TabHost tabHost = getTabHost(); - - TabHost.TabSpec spec1 = tabHost.newTabSpec("saved") - .setIndicator(getText(R.string.tab_saved), res.getDrawable(R.drawable.ic_menu_tag)) - .setContent(new Intent().setClass(this, TagList.class) - .putExtra(TagList.EXTRA_SHOW_SAVED_ONLY, true)); - tabHost.addTab(spec1); - - TabHost.TabSpec spec2 = tabHost.newTabSpec("recent") - .setIndicator(getText(R.string.tab_recent), res.getDrawable(R.drawable.ic_menu_desk_clock)) - .setContent(new Intent().setClass(this, TagList.class)); - tabHost.addTab(spec2); - } -} - diff --git a/apps/Tag/src/com/android/apps/tag/TagDBHelper.java b/apps/Tag/src/com/android/apps/tag/TagDBHelper.java deleted file mode 100644 index dd11d9431..000000000 --- a/apps/Tag/src/com/android/apps/tag/TagDBHelper.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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.tag; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteStatement; -import android.net.Uri; -import android.nfc.FormatException; -import android.nfc.NdefMessage; -import android.nfc.NdefRecord; - -import com.google.common.annotations.VisibleForTesting; - -/** - * Database utilities for the saved tags. - */ -public class TagDBHelper extends SQLiteOpenHelper { - - private static final String DATABASE_NAME = "tags.db"; - private static final int DATABASE_VERSION = 3; - - public interface NdefMessagesTable { - public static final String TABLE_NAME = "nedf_msg"; - - public static final String _ID = "_id"; - public static final String TITLE = "title"; - public static final String BYTES = "bytes"; - public static final String DATE = "date"; - public static final String SAVED = "saved"; - } - - private static TagDBHelper sInstance; - - public static synchronized TagDBHelper getInstance(Context context) { - if (sInstance == null) { - sInstance = new TagDBHelper(context.getApplicationContext()); - } - return sInstance; - } - - private TagDBHelper(Context context) { - this(context, DATABASE_NAME); - } - - @VisibleForTesting - TagDBHelper(Context context, String dbFile) { - super(context, dbFile, null, DATABASE_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL("CREATE TABLE " + NdefMessagesTable.TABLE_NAME + " (" + - NdefMessagesTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + - NdefMessagesTable.TITLE + " TEXT NOT NULL DEFAULT ''," + - NdefMessagesTable.BYTES + " BLOB NOT NULL, " + - NdefMessagesTable.DATE + " INTEGER NOT NULL, " + - NdefMessagesTable.SAVED + " INTEGER NOT NULL DEFAULT 0" + // boolean - ");"); - - db.execSQL("CREATE INDEX msgIndex ON " + NdefMessagesTable.TABLE_NAME + " (" + - NdefMessagesTable.DATE + " DESC, " + - NdefMessagesTable.SAVED + " ASC" + - ")"); - - addTestData(db); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - // Drop everything and recreate it for now - db.execSQL("DROP TABLE IF EXISTS " + NdefMessagesTable.TABLE_NAME); - onCreate(db); - } - - private void addTestData(SQLiteDatabase db) { - // A fake message containing 1 URL - NdefMessage msg1 = new NdefMessage(new NdefRecord[] { - NdefUtil.toUriRecord(Uri.parse("http://www.google.com")) - }); - - // A fake message containing 2 URLs - NdefMessage msg2 = new NdefMessage(new NdefRecord[] { - NdefUtil.toUriRecord(Uri.parse("http://www.youtube.com")), - NdefUtil.toUriRecord(Uri.parse("http://www.android.com")) - }); - - insertNdefMessage(db, msg1, false); - insertNdefMessage(db, msg2, true); - - try { - // insert some real messages we found in the field. - for (byte[] msg : MockNdefMessages.ALL_MOCK_MESSAGES) { - NdefMessage msg3 = new NdefMessage(msg); - insertNdefMessage(db, msg3, false); - } - } catch (FormatException e) { - throw new RuntimeException(e); - } - } - - public void insertNdefMessage(SQLiteDatabase db, NdefMessage msg, boolean isSaved) { - SQLiteStatement stmt = null; - try { - stmt = db.compileStatement("INSERT INTO " + NdefMessagesTable.TABLE_NAME + - "(" + NdefMessagesTable.BYTES + ", " + NdefMessagesTable.DATE + ", " + - NdefMessagesTable.SAVED + ") values (?, ?, ?)"); - stmt.bindBlob(1, msg.toByteArray()); - stmt.bindLong(2, System.currentTimeMillis()); - stmt.bindLong(3, isSaved ? 1 : 0); - stmt.executeInsert(); - } finally { - if (stmt != null) stmt.close(); - } - } -} diff --git a/apps/Tag/src/com/android/apps/tag/TagList.java b/apps/Tag/src/com/android/apps/tag/TagList.java deleted file mode 100644 index 7d09baed1..000000000 --- a/apps/Tag/src/com/android/apps/tag/TagList.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * 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.tag; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.ListActivity; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.nfc.FormatException; -import android.nfc.NdefMessage; -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.Log; -import android.view.Menu; -import android.view.View; -import android.widget.ListView; - -import com.android.apps.tag.TagDBHelper.NdefMessagesTable; - -/** - * An {@link Activity} that displays a flat list of tags that can be "opened". - */ -public class TagList extends ListActivity implements DialogInterface.OnClickListener { - static final String TAG = "TagList"; - - static final String EXTRA_SHOW_SAVED_ONLY = "show_saved_only"; - - SQLiteDatabase mDatabase; - TagAdapter mAdapter; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - boolean showSavedOnly = getIntent().getBooleanExtra(EXTRA_SHOW_SAVED_ONLY, false); - mDatabase = TagDBHelper.getInstance(this).getReadableDatabase(); - String selection = showSavedOnly ? NdefMessagesTable.SAVED + "=1" : null; - - new TagLoaderTask().execute(selection); - mAdapter = new TagAdapter(this); - setListAdapter(mAdapter); - registerForContextMenu(getListView()); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - menu.add("hello world"); - return true; - } - - @Override - protected Dialog onCreateDialog(int id, Bundle args) { - String[] stuff = new String[] { "a", "b" }; - return new AlertDialog.Builder(this) - .setTitle("blah") - .setItems(stuff, this) - .setPositiveButton("Delete", null) - .setNegativeButton("Cancel", null) - .create(); - } - - @Override - protected void onDestroy() { - if (mAdapter != null) { - mAdapter.changeCursor(null); - } - super.onDestroy(); - } - - @Override - protected void onListItemClick(ListView l, View v, int position, long id) { - Cursor cursor = mAdapter.getCursor(); - cursor.moveToPosition(position); - byte[] tagBytes = cursor.getBlob(cursor.getColumnIndexOrThrow(NdefMessagesTable.BYTES)); - try { - NdefMessage msg = new NdefMessage(tagBytes); - Intent intent = new Intent(this, TagViewer.class); - intent.putExtra(TagViewer.EXTRA_MESSAGE, msg); - intent.putExtra(TagViewer.EXTRA_TAG_DB_ID, id); - startActivity(intent); - } catch (FormatException e) { - Log.e(TAG, "bad format for tag " + id + ": " + tagBytes, e); - return; - } - } - - @Override - public void onClick(DialogInterface dialog, int which) { - } - - final class TagLoaderTask extends AsyncTask { - @Override - public Cursor doInBackground(String... args) { - String selection = args[0]; - Cursor cursor = mDatabase.query( - NdefMessagesTable.TABLE_NAME, - new String[] { - NdefMessagesTable._ID, - NdefMessagesTable.BYTES, - NdefMessagesTable.DATE, - NdefMessagesTable.TITLE }, - selection, - null, null, null, null); - cursor.getCount(); - return cursor; - } - - @Override - protected void onPostExecute(Cursor cursor) { - mAdapter.changeCursor(cursor); - } - } -} diff --git a/apps/Tag/src/com/android/apps/tag/TagViewer.java b/apps/Tag/src/com/android/apps/tag/TagViewer.java deleted file mode 100644 index a1d890020..000000000 --- a/apps/Tag/src/com/android/apps/tag/TagViewer.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.tag; - -import android.app.Activity; -import android.content.Intent; -import android.database.sqlite.SQLiteDatabase; -import android.graphics.Color; -import android.nfc.NdefMessage; -import android.nfc.NdefTag; -import android.nfc.NfcAdapter; -import android.os.AsyncTask; -import android.util.Log; -import android.view.ContextThemeWrapper; -import android.view.LayoutInflater; -import android.view.WindowManager; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.android.apps.tag.message.NdefMessageParser; -import com.android.apps.tag.message.ParsedNdefMessage; - -import java.util.Locale; - -/** - * An {@link Activity} which handles a broadcast of a new tag that the device just discovered. - */ -public class TagViewer extends Activity { - static final String TAG = "SaveTag"; - static final String EXTRA_TAG_DB_ID = "db_id"; - static final String EXTRA_MESSAGE = "msg"; - - long mTagDatabaseId; - - @Override - protected void onStart() { - super.onStart(); - - getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD - | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON - | WindowManager.LayoutParams.FLAG_DIM_BEHIND - ); - - Intent intent = getIntent(); - NdefMessage[] msgs = null; - NdefTag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - if (tag == null) { - // Maybe it came from the database? - mTagDatabaseId = intent.getLongExtra(EXTRA_TAG_DB_ID, -1); - NdefMessage msg = intent.getParcelableExtra(EXTRA_MESSAGE); - if (msg != null) { - msgs = new NdefMessage[] { msg }; - } - } else { - msgs = tag.getNdefMessages(); - // TODO use a service to avoid the process getting reaped during saving - new SaveTagTask().execute(msgs); - } - - if (msgs == null || msgs.length == 0) { - Log.e(TAG, "No NDEF messages"); - finish(); - return; - } - - - LayoutInflater inflater = LayoutInflater.from( - new ContextThemeWrapper(this, android.R.style.Theme_Light)); - LinearLayout list = (LinearLayout) inflater.inflate(R.layout.tag_viewer_list, null, false); - // TODO figure out why the background isn't white, the CTW should force that... - list.setBackgroundColor(Color.WHITE); - setContentView(list); - buildTagViews(list, inflater, msgs); - } - - private void buildTagViews(LinearLayout list, LayoutInflater inflater, NdefMessage[] msgs) { - // The body of the dialog should use the light theme - - // Build the views from the logical records in the messages - for (NdefMessage msg : msgs) { - ParsedNdefMessage parsedMsg = NdefMessageParser.parse(msg); - TextView text = (TextView) inflater.inflate(R.layout.tag_text, list, false); - text.setText(parsedMsg.getSnippet(Locale.getDefault())); - list.addView(text); - } - } - - final class SaveTagTask extends AsyncTask { - @Override - public Void doInBackground(NdefMessage... msgs) { - TagDBHelper helper = TagDBHelper.getInstance(TagViewer.this); - SQLiteDatabase db = helper.getWritableDatabase(); - db.beginTransaction(); - try { - for (NdefMessage msg : msgs) { - helper.insertNdefMessage(db, msg, false); - } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - return null; - } - } -} diff --git a/apps/Tag/src/com/android/apps/tag/message/EmptyMessage.java b/apps/Tag/src/com/android/apps/tag/message/EmptyMessage.java deleted file mode 100644 index 48f9e9f85..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/EmptyMessage.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.tag.message; - -import java.util.Locale; - -/** - * A parsed message containing no elements. - */ -class EmptyMessage implements ParsedNdefMessage { - - /* package private */ EmptyMessage() { } - - @Override - public String getSnippet(Locale locale) { - return "Empty Tag"; // TODO: localize - } - - @Override - public boolean isStarred() { - return false; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/message/NdefMessageParser.java b/apps/Tag/src/com/android/apps/tag/message/NdefMessageParser.java deleted file mode 100644 index 1823f9847..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/NdefMessageParser.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.tag.message; - -import android.nfc.NdefMessage; -import android.nfc.NdefRecord; - -import com.android.apps.tag.record.ParsedNdefRecord; -import com.android.apps.tag.record.SmartPoster; -import com.android.apps.tag.record.TextRecord; -import com.android.apps.tag.record.UriRecord; - -import java.util.ArrayList; -import java.util.List; - -/** - * Utility class for creating {@link ParsedNdefMessage}s. - */ -public class NdefMessageParser { - - // Utility class - private NdefMessageParser() { } - - /** Parse an NdefMessage */ - public static ParsedNdefMessage parse(NdefMessage message) { - List elements = getRecords(message); - - if (elements.isEmpty()) { - return new EmptyMessage(); - } - - ParsedNdefRecord first = elements.get(0); - - if (elements.size() == 1) { - if (first instanceof SmartPoster) { - return new SmartPosterMessage((SmartPoster) first); - } - if (first instanceof TextRecord) { - return new TextMessage((TextRecord) first); - } - if (first instanceof UriRecord) { - return new UriMessage((UriRecord) first); - } - } - - return new UnknownMessage(elements); - } - - public static List getRecords(NdefMessage message) { - List elements = new ArrayList(); - for (NdefRecord record : message.getRecords()) { - if (UriRecord.isUri(record)) { - elements.add(UriRecord.parse(record)); - } else if (TextRecord.isText(record)) { - elements.add(TextRecord.parse(record)); - } else if (SmartPoster.isPoster(record)) { - elements.add(SmartPoster.parse(record)); - } - } - return elements; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/message/ParsedNdefMessage.java b/apps/Tag/src/com/android/apps/tag/message/ParsedNdefMessage.java deleted file mode 100644 index 427aae4c9..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/ParsedNdefMessage.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.tag.message; - -import java.util.Locale; - -/** - * A parsed version of an {@link android.nfc.NdefMessage} - */ -public interface ParsedNdefMessage { - - /** - * Returns the snippet information associated with the NdefMessage - * most appropriate for the given {@code locale}. - */ - public String getSnippet(Locale locale); - - // TODO: Determine if this is the best place for holding whether - // the user has starred this parsed message. - public boolean isStarred(); -} diff --git a/apps/Tag/src/com/android/apps/tag/message/SmartPosterMessage.java b/apps/Tag/src/com/android/apps/tag/message/SmartPosterMessage.java deleted file mode 100644 index 28cd7b3c1..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/SmartPosterMessage.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.tag.message; - -import com.android.apps.tag.record.SmartPoster; -import com.android.apps.tag.record.TextRecord; -import com.google.common.base.Preconditions; - -import java.util.Locale; - -/** - * A message consisting of one {@link SmartPoster} object. - */ -class SmartPosterMessage implements ParsedNdefMessage { - private final SmartPoster mPoster; - - SmartPosterMessage(SmartPoster poster) { - mPoster = Preconditions.checkNotNull(poster); - } - - @Override - public String getSnippet(Locale locale) { - TextRecord title = mPoster.getTitle(); - if (title == null) { - return mPoster.getUriRecord().getUri().toString(); - } - return title.getText(); - } - - @Override - public boolean isStarred() { - return false; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/message/TextMessage.java b/apps/Tag/src/com/android/apps/tag/message/TextMessage.java deleted file mode 100644 index 3494331cf..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/TextMessage.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.tag.message; - -import com.android.apps.tag.record.TextRecord; -import com.google.common.base.Preconditions; - -import java.util.Locale; - -/** - * A message containing one text element - */ -class TextMessage implements ParsedNdefMessage { - private final TextRecord mRecord; - - TextMessage(TextRecord record) { - mRecord = Preconditions.checkNotNull(record); - } - - @Override - public String getSnippet(Locale locale) { - return mRecord.getText(); - } - - @Override - public boolean isStarred() { - return false; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/message/UnknownMessage.java b/apps/Tag/src/com/android/apps/tag/message/UnknownMessage.java deleted file mode 100644 index a30445fc3..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/UnknownMessage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.tag.message; - -import com.android.apps.tag.record.ParsedNdefRecord; -import com.google.common.collect.ImmutableList; - -import java.util.Locale; - -/** - * The catchall parsed message format for when nothing else better applies. - */ -class UnknownMessage implements ParsedNdefMessage { - - private final ImmutableList mRecords; - - UnknownMessage(Iterable records) { - mRecords = ImmutableList.copyOf(records); - } - - @Override - public String getSnippet(Locale locale) { - // TODO: localize - return "Unknown record type with " + mRecords.size() + " elements."; - } - - @Override - public boolean isStarred() { - return false; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/message/UriMessage.java b/apps/Tag/src/com/android/apps/tag/message/UriMessage.java deleted file mode 100644 index 85bfa41f1..000000000 --- a/apps/Tag/src/com/android/apps/tag/message/UriMessage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.tag.message; - -import com.android.apps.tag.record.UriRecord; -import com.google.common.base.Preconditions; - -import java.util.Locale; - -/** - * A {@link ParsedNdefMessage} consisting of one {@link UriRecord}. - */ -class UriMessage implements ParsedNdefMessage { - - private final UriRecord mRecord; - - UriMessage(UriRecord record) { - mRecord = Preconditions.checkNotNull(record); - } - - @Override - public String getSnippet(Locale locale) { - // URIs cannot be localized - return mRecord.getUri().toString(); - } - - @Override - public boolean isStarred() { - return false; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/record/ParsedNdefRecord.java b/apps/Tag/src/com/android/apps/tag/record/ParsedNdefRecord.java deleted file mode 100644 index 8de4a3f23..000000000 --- a/apps/Tag/src/com/android/apps/tag/record/ParsedNdefRecord.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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.tag.record; - -/** - * TODO: come up with a better name. - */ -public interface ParsedNdefRecord { - - // Just a placeholder for now. Probably not needed nor desired. - public String getRecordType(); -} diff --git a/apps/Tag/src/com/android/apps/tag/record/SmartPoster.java b/apps/Tag/src/com/android/apps/tag/record/SmartPoster.java deleted file mode 100644 index 935b23498..000000000 --- a/apps/Tag/src/com/android/apps/tag/record/SmartPoster.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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.tag.record; - -import android.nfc.FormatException; -import android.nfc.NdefMessage; -import android.nfc.NdefRecord; - -import com.android.apps.tag.message.NdefMessageParser; -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; - -import java.util.Arrays; -import java.util.NoSuchElementException; -import javax.annotation.Nullable; - -/** - * A representation of an NFC Forum "Smart Poster". - */ -public class SmartPoster implements ParsedNdefRecord { - - /** - * NFC Forum Smart Poster Record Type Definition section 3.2.1. - * - * "The Title record for the service (there can be many of these in - * different languages, but a language MUST NOT be repeated). - * This record is optional." - - */ - private final TextRecord mTitleRecord; - - /** - * NFC Forum Smart Poster Record Type Definition section 3.2.1. - * - * "The URI record. This is the core of the Smart Poster, and all other - * records are just metadata about this record. There MUST be one URI - * record and there MUST NOT be more than one." - */ - private final UriRecord mUriRecord; - - private SmartPoster(UriRecord uri, @Nullable TextRecord title) { - mUriRecord = Preconditions.checkNotNull(uri); - mTitleRecord = title; - } - - public UriRecord getUriRecord() { - return mUriRecord; - } - - /** - * Returns the title of the smart poster. This may be {@code null}. - */ - public TextRecord getTitle() { - return mTitleRecord; - } - - public static SmartPoster parse(NdefRecord record) { - Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN); - Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER)); - try { - NdefMessage subRecords = new NdefMessage(record.getPayload()); - - Iterable records = NdefMessageParser.getRecords(subRecords); - - UriRecord uri = Iterables.getOnlyElement(Iterables.filter(records, UriRecord.class)); - Iterable textFields = Iterables.filter(records, TextRecord.class); - - TextRecord title = null; - if (!Iterables.isEmpty(textFields)) { - title = Iterables.get(textFields, 0); - } - - return new SmartPoster(uri, title); - } catch (FormatException e) { - throw new IllegalArgumentException(e); - } catch (NoSuchElementException e) { - throw new IllegalArgumentException(e); - } - } - - public static boolean isPoster(NdefRecord record) { - try { - parse(record); - return true; - } catch (IllegalArgumentException e) { - return false; - } - } - - @Override - public String getRecordType() { - return "SmartPoster"; - } -} diff --git a/apps/Tag/src/com/android/apps/tag/record/TextRecord.java b/apps/Tag/src/com/android/apps/tag/record/TextRecord.java deleted file mode 100644 index 716e5afb7..000000000 --- a/apps/Tag/src/com/android/apps/tag/record/TextRecord.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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.tag.record; - -import android.nfc.NdefRecord; - -import com.google.common.base.Preconditions; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; - -/** - * An NFC Text Record - */ -public class TextRecord implements ParsedNdefRecord { - - /** ISO/IANA language code */ - private final String mLanguageCode; - private final String mText; - - private TextRecord(String languageCode, String text) { - mLanguageCode = Preconditions.checkNotNull(languageCode); - mText = Preconditions.checkNotNull(text); - } - - @Override - public String getRecordType() { - return "Text"; - } - - public String getText() { - return mText; - } - - /** - * Returns the ISO/IANA language code associated with this text element. - * - * TODO: this should return a {@link java.util.Locale} - */ - public String getLanguageCode() { - return mLanguageCode; - } - - // TODO: deal with text fields which span multiple NdefRecords - public static TextRecord parse(NdefRecord record) { - Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN); - Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)); - try { - - byte[] payload = record.getPayload(); - - /* - * payload[0] contains the "Status Byte Encodings" field, per - * the NFC Forum "Text Record Type Definition" section 3.2.1. - * - * bit7 is the Text Encoding Field. - * - * if (Bit_7 == 0): The text is encoded in UTF-8 - * if (Bit_7 == 1): The text is encoded in UTF16 - * - * Bit_6 is reserved for future use and must be set to zero. - * - * Bits 5 to 0 are the length of the IANA language code. - */ - - String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16"; - int languageCodeLength = payload[0] & 0077; - - String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); - String text = new String(payload, - languageCodeLength + 1, - payload.length - languageCodeLength - 1, - textEncoding); - return new TextRecord(languageCode, text); - - } catch (UnsupportedEncodingException e) { - // should never happen unless we get a malformed tag. - throw new IllegalArgumentException(e); - } - } - - public static boolean isText(NdefRecord record) { - try { - parse(record); - return true; - } catch (IllegalArgumentException e) { - return false; - } - } -} diff --git a/apps/Tag/src/com/android/apps/tag/record/UriRecord.java b/apps/Tag/src/com/android/apps/tag/record/UriRecord.java deleted file mode 100644 index 7d5e9bc6f..000000000 --- a/apps/Tag/src/com/android/apps/tag/record/UriRecord.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * 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.tag.record; - -import android.net.Uri; -import android.nfc.NdefRecord; - -import com.google.common.base.Preconditions; -import com.google.common.collect.BiMap; -import com.google.common.collect.ImmutableBiMap; -import com.google.common.primitives.Bytes; - -import java.nio.charset.Charsets; -import java.util.Arrays; - -/** - * A parsed record containing a Uri. - */ -public class UriRecord implements ParsedNdefRecord { - private static final byte[] EMPTY = new byte[0]; - - /** - * NFC Forum "URI Record Type Definition" - * - * This is a mapping of "URI Identifier Codes" to URI string prefixes, - * per section 3.2.2 of the NFC Forum URI Record Type Definition document. - */ - private static final BiMap URI_PREFIX_MAP = ImmutableBiMap.builder() - .put((byte) 0x00, "") - .put((byte) 0x01, "http://www.") - .put((byte) 0x02, "https://www.") - .put((byte) 0x03, "http://") - .put((byte) 0x04, "https://") - .put((byte) 0x05, "tel:") - .put((byte) 0x06, "mailto:") - .put((byte) 0x07, "ftp://anonymous:anonymous@") - .put((byte) 0x08, "ftp://ftp.") - .put((byte) 0x09, "ftps://") - .put((byte) 0x0A, "sftp://") - .put((byte) 0x0B, "smb://") - .put((byte) 0x0C, "nfs://") - .put((byte) 0x0D, "ftp://") - .put((byte) 0x0E, "dav://") - .put((byte) 0x0F, "news:") - .put((byte) 0x10, "telnet://") - .put((byte) 0x11, "imap:") - .put((byte) 0x12, "rtsp://") - .put((byte) 0x13, "urn:") - .put((byte) 0x14, "pop:") - .put((byte) 0x15, "sip:") - .put((byte) 0x16, "sips:") - .put((byte) 0x17, "tftp:") - .put((byte) 0x18, "btspp://") - .put((byte) 0x19, "btl2cap://") - .put((byte) 0x1A, "btgoep://") - .put((byte) 0x1B, "tcpobex://") - .put((byte) 0x1C, "irdaobex://") - .put((byte) 0x1D, "file://") - .put((byte) 0x1E, "urn:epc:id:") - .put((byte) 0x1F, "urn:epc:tag:") - .put((byte) 0x20, "urn:epc:pat:") - .put((byte) 0x21, "urn:epc:raw:") - .put((byte) 0x22, "urn:epc:") - .put((byte) 0x23, "urn:nfc:") - .build(); - - private final Uri mUri; - - private UriRecord(Uri uri) { - this.mUri = Preconditions.checkNotNull(uri); - } - - @Override - public String getRecordType() { - return "Uri"; - } - - public Uri getUri() { - return mUri; - } - - /** - * Convert {@link android.nfc.NdefRecord} into a {@link android.net.Uri}. - * - * TODO: This class does not handle NdefRecords where the TNF - * (Type Name Format) of the class is {@link android.nfc.NdefRecord#TNF_ABSOLUTE_URI}. - * This should be fixed. - * - * @throws IllegalArgumentException if the NdefRecord is not a - * record containing a URI. - */ - public static UriRecord parse(NdefRecord record) { - Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN); - Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_URI)); - - byte[] payload = record.getPayload(); - - /* - * payload[0] contains the URI Identifier Code, per the - * NFC Forum "URI Record Type Definition" section 3.2.2. - * - * payload[1]...payload[payload.length - 1] contains the rest of - * the URI. - */ - - String prefix = URI_PREFIX_MAP.get(payload[0]); - byte[] fullUri = Bytes.concat( - prefix.getBytes(Charsets.UTF_8), - Arrays.copyOfRange(payload, 1, payload.length)); - - return new UriRecord(Uri.parse(new String(fullUri, Charsets.UTF_8))); - } - - public static boolean isUri(NdefRecord record) { - try { - parse(record); - return true; - } catch (IllegalArgumentException e) { - return false; - } - } -} diff --git a/apps/Tag/tests/Android.mk b/apps/Tag/tests/Android.mk deleted file mode 100644 index d0a36d7c6..000000000 --- a/apps/Tag/tests/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_JAVA_LIBRARIES := android.test.runner - -LOCAL_PACKAGE_NAME := TagAppTests - -LOCAL_MODULE_TAGS := tests - -LOCAL_INSTRUMENTATION_FOR := TagApp - -include $(BUILD_PACKAGE) diff --git a/apps/Tag/tests/AndroidManifest.xml b/apps/Tag/tests/AndroidManifest.xml deleted file mode 100644 index 63ef9e3f4..000000000 --- a/apps/Tag/tests/AndroidManifest.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/Tag/tests/build.properties b/apps/Tag/tests/build.properties deleted file mode 100644 index e0c39def1..000000000 --- a/apps/Tag/tests/build.properties +++ /dev/null @@ -1 +0,0 @@ -tested.project.dir=.. diff --git a/apps/Tag/tests/src/com/android/apps/tag/NdefUtilTest.java b/apps/Tag/tests/src/com/android/apps/tag/NdefUtilTest.java deleted file mode 100644 index 297e754fc..000000000 --- a/apps/Tag/tests/src/com/android/apps/tag/NdefUtilTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.tag; - -import android.nfc.NdefRecord; -import android.test.AndroidTestCase; - -import com.android.apps.tag.record.TextRecord; -import com.google.common.primitives.Bytes; - -import java.io.UnsupportedEncodingException; - -public class NdefUtilTest extends AndroidTestCase { - public void testToText() throws UnsupportedEncodingException { - checkWord("Hello", "en-US", true); - checkWord("Hello", "en-US", false); - checkWord("abc\\u5639\\u563b", "cp1251", true); - checkWord("abc\\u5639\\u563b", "cp1251", false); - } - - private static void checkWord(String word, String encoding, boolean isUtf8) throws UnsupportedEncodingException { - String utfEncoding = isUtf8 ? "UTF-8" : "UTF-16"; - - byte[] encodingBytes = encoding.getBytes("US-ASCII"); - byte[] text = word.getBytes(utfEncoding); - - int utfBit = isUtf8 ? 0 : (1 << 7); - char status = (char) (utfBit + encodingBytes.length); - - byte[] data = Bytes.concat( - new byte[] { (byte) status }, - encodingBytes, - text - ); - - NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); - assertEquals(word, TextRecord.parse(record).getText()); - } -} diff --git a/apps/Tag/tests/src/com/android/apps/tag/SmartPosterTest.java b/apps/Tag/tests/src/com/android/apps/tag/SmartPosterTest.java deleted file mode 100644 index 9a5e644a8..000000000 --- a/apps/Tag/tests/src/com/android/apps/tag/SmartPosterTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.tag; - -import android.nfc.NdefMessage; -import android.test.AndroidTestCase; - -import com.android.apps.tag.record.SmartPoster; - -/** - * Tests for {@link SmartPoster}. - */ -public class SmartPosterTest extends AndroidTestCase { - public void testSmartPoster() throws Exception { - NdefMessage msg = new NdefMessage(MockNdefMessages.REAL_NFC_MSG); - - SmartPoster poster = SmartPoster.parse(msg.getRecords()[0]); - assertEquals("NFC Forum Type 4 Tag", poster.getTitle().getText()); - assertEquals("http://www.nxp.com/nfc", poster.getUriRecord().getUri().toString()); - } -} diff --git a/apps/Tag/tests/src/com/android/apps/tag/TagsTest.java b/apps/Tag/tests/src/com/android/apps/tag/TagsTest.java deleted file mode 100644 index 368df9195..000000000 --- a/apps/Tag/tests/src/com/android/apps/tag/TagsTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.tag; - -import android.test.ActivityInstrumentationTestCase2; - -/** - * Make sure that the main launcher activity opens up properly, which will be - * verified by {@link #testActivityTestCaseSetUpProperly}. - */ -public class TagsTest extends ActivityInstrumentationTestCase2 { - - /** - * Creates an {@link ActivityInstrumentationTestCase2} for the - * {@link TagBrowserActivity} activity. - */ - public TagsTest() { - super(TagBrowserActivity.class); - } - - /** - * Verifies that the activity under test can be launched. - */ - public void testActivityTestCaseSetUpProperly() { - assertNotNull("activity should be launched successfully", getActivity()); - } -}