17949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton/* 27949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * Copyright (C) 2010 The Android Open Source Project 37949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 47949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 57949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * you may not use this file except in compliance with the License. 67949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * You may obtain a copy of the License at 77949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 87949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 97949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 107949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * Unless required by applicable law or agreed to in writing, software 117949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 127949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * See the License for the specific language governing permissions and 147949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * limitations under the License. 157949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 167949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 177949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonpackage com.android.apps.tag.record; 187949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 197949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.android.apps.tag.R; 207949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.android.apps.tag.message.NdefMessageParser; 215e3610757da1efad5b85ed7042713427010eafc1Nick Kralevichimport com.google.common.base.Charsets; 227949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.google.common.base.Preconditions; 235e3610757da1efad5b85ed7042713427010eafc1Nick Kralevichimport com.google.common.collect.ImmutableMap; 247949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.google.common.collect.Iterables; 257949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 267949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.app.Activity; 27a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parksimport android.content.Context; 287949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.FormatException; 297949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.NdefMessage; 307949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.NdefRecord; 317949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.LayoutInflater; 327949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.View; 337949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.ViewGroup; 347949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.ViewGroup.LayoutParams; 357949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.widget.LinearLayout; 367949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 377949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport java.util.Arrays; 38a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parksimport java.util.Locale; 397949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport java.util.NoSuchElementException; 407949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 417949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport javax.annotation.Nullable; 427949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 437949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton/** 447949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * A representation of an NFC Forum "Smart Poster". 457949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 4640d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parkspublic class SmartPoster extends ParsedNdefRecord { 477949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 487949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton /** 497949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * NFC Forum Smart Poster Record Type Definition section 3.2.1. 507949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 517949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * "The Title record for the service (there can be many of these in 527949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * different languages, but a language MUST NOT be repeated). 537949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * This record is optional." 547949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 557949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 567949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton private final TextRecord mTitleRecord; 577949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 587949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton /** 597949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * NFC Forum Smart Poster Record Type Definition section 3.2.1. 607949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 617949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * "The URI record. This is the core of the Smart Poster, and all other 627949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * records are just metadata about this record. There MUST be one URI 637949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * record and there MUST NOT be more than one." 647949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 657949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton private final UriRecord mUriRecord; 667949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 675e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich /** 685e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * NFC Forum Smart Poster Record Type Definition section 3.2.1. 695e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * 705e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * "The Icon record. A Smart Poster may include an icon by including one 715e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * or many MIME-typed image records within the Smart Poster. If the 725e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * device supports images, it SHOULD select and display one of these, 735e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * depending on the device capabilities. The device SHOULD display only 745e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * one. The Icon record is optional." 755e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich */ 765e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private final ImageRecord mImageRecord; 775e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 785e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich /** 795e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * NFC Forum Smart Poster Record Type Definition section 3.2.1. 805e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * 815e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * "The Action record. This record describes how the service should be 825e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * treated. For example, the action may indicate that the device should 835e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * save the URI as a bookmark or open a browser. The Action record is 845e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * optional. If it does not exist, the device may decide what to do with 855e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * the service. If the action record exists, it should be treated as 865e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * a strong suggestion; the UI designer may ignore it, but doing so 875e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * will induce a different user experience from device to device." 885e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich */ 895e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private final RecommendedAction mAction; 905e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 915e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich /** 925e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * NFC Forum Smart Poster Record Type Definition section 3.2.1. 935e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * 945e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * "The Type record. If the URI references an external entity (e.g., via 955e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * a URL), the Type record may be used to declare the MIME type of the 965e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * entity. This can be used to tell the mobile device what kind of an 975e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * object it can expect before it opens the connection. The Type record 985e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * is optional." 995e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich */ 1005e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private final String mType; 1015e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 1025e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 1035e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private SmartPoster(UriRecord uri, @Nullable TextRecord title, 1045e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich @Nullable ImageRecord image, RecommendedAction action, 1055e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich @Nullable String type) { 1067949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton mUriRecord = Preconditions.checkNotNull(uri); 1077949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton mTitleRecord = title; 1085e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich mImageRecord = image; 1095e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich mAction = Preconditions.checkNotNull(action); 1105e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich mType = type; 1117949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1127949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1137949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public UriRecord getUriRecord() { 1147949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return mUriRecord; 1157949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1167949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1177949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton /** 1187949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * Returns the title of the smart poster. This may be {@code null}. 1197949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 1207949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public TextRecord getTitle() { 1217949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return mTitleRecord; 1227949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1237949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1247949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public static SmartPoster parse(NdefRecord record) { 1257949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN); 1267949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER)); 1277949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton try { 1287949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton NdefMessage subRecords = new NdefMessage(record.getPayload()); 1295e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return parse(subRecords.getRecords()); 1305e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } catch (FormatException e) { 1315e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich throw new IllegalArgumentException(e); 1325e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 1335e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 1347949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1355e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich public static SmartPoster parse(NdefRecord[] recordsRaw) { 1365e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich try { 1375e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich Iterable<ParsedNdefRecord> records = NdefMessageParser.getRecords(recordsRaw); 1387949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton UriRecord uri = Iterables.getOnlyElement(Iterables.filter(records, UriRecord.class)); 1395e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich TextRecord title = getFirstIfExists(records, TextRecord.class); 1405e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich ImageRecord image = getFirstIfExists(records, ImageRecord.class); 1415e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich RecommendedAction action = parseRecommendedAction(recordsRaw); 1425e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich String type = parseType(recordsRaw); 1437949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1445e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return new SmartPoster(uri, title, image, action, type); 1457949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } catch (NoSuchElementException e) { 1467949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton throw new IllegalArgumentException(e); 1477949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1487949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1497949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1507949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public static boolean isPoster(NdefRecord record) { 1517949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton try { 1527949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton parse(record); 1537949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return true; 1547949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } catch (IllegalArgumentException e) { 1557949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return false; 1567949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1577949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1587949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1597949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton @Override 16040d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks public View getView(Activity activity, LayoutInflater inflater, ViewGroup parent, int offset) { 1617949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton if (mTitleRecord != null) { 1627949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton // Build a container to hold the title and the URI 1637949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton LinearLayout container = new LinearLayout(activity); 1647949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton container.setOrientation(LinearLayout.VERTICAL); 1657949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton container.setLayoutParams(new LayoutParams( 1667949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 1677949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 16840d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks container.addView(mTitleRecord.getView(activity, inflater, container, offset)); 1697949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton inflater.inflate(R.layout.tag_divider, container); 17040d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks container.addView(mUriRecord.getView(activity, inflater, container, offset)); 1717949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return container; 1727949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } else { 1737949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton // Just a URI, return a view for it directly 17440d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks return mUriRecord.getView(activity, inflater, parent, offset); 1757949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1767949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1775e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 178a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks @Override 179a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks public String getSnippet(Context context, Locale locale) { 180a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks if (mTitleRecord != null) { 181a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks return mTitleRecord.getText(); 182a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks } 183a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks 184a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks return mUriRecord.getPrettyUriString(context); 185a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks } 186a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks 187a6855221fb6e5c6c19d31283a18ced44cccdf442Jason parks 1885e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich /** 1895e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * Returns the first element of {@code elements} which is an instance 1905e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich * of {@code type}, or {@code null} if no such element exists. 1915e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich */ 1925e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static <T> T getFirstIfExists(Iterable<?> elements, Class<T> type) { 1935e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich Iterable<T> filtered = Iterables.filter(elements, type); 1945e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich T instance = null; 1955e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich if (!Iterables.isEmpty(filtered)) { 1965e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich instance = Iterables.get(filtered, 0); 1975e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 1985e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return instance; 1995e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2005e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2015e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private enum RecommendedAction { 2025e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich UNKNOWN((byte) -1), DO_ACTION((byte) 0), 2035e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich SAVE_FOR_LATER((byte) 1), OPEN_FOR_EDITING((byte) 2); 2045e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2055e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static final ImmutableMap<Byte, RecommendedAction> LOOKUP; 2065e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich static { 2075e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich ImmutableMap.Builder<Byte, RecommendedAction> builder = ImmutableMap.builder(); 2085e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich for (RecommendedAction action : RecommendedAction.values()) { 2095e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich builder.put(action.getByte(), action); 2105e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2115e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich LOOKUP = builder.build(); 2125e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2135e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2145e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private final byte mAction; 2155e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2165e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private RecommendedAction(byte val) { 2175e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich this.mAction = val; 2185e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2195e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private byte getByte() { 2205e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return mAction; 2215e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2225e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2235e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2245e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static NdefRecord getByType(byte[] type, NdefRecord[] records) { 2255e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich for (NdefRecord record : records) { 2265e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich if (Arrays.equals(type, record.getType())) { 2275e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return record; 2285e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2295e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2305e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return null; 2315e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2325e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2335e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static final byte[] ACTION_RECORD_TYPE = new byte[] { 'a', 'c', 't' }; 2345e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2355e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static RecommendedAction parseRecommendedAction(NdefRecord[] records) { 2365e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich NdefRecord record = getByType(ACTION_RECORD_TYPE, records); 2375e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich if (record == null) { 2385e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return RecommendedAction.UNKNOWN; 2395e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2405e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich byte action = record.getPayload()[0]; 2415e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich if (RecommendedAction.LOOKUP.containsKey(action)) { 2425e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return RecommendedAction.LOOKUP.get(action); 2435e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2445e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return RecommendedAction.UNKNOWN; 2455e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2465e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2475e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static final byte[] TYPE_TYPE = new byte[] { 't' }; 2485e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich 2495e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich private static String parseType(NdefRecord[] records) { 2505e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich NdefRecord type = getByType(TYPE_TYPE, records); 2515e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich if (type == null) { 2525e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return null; 2535e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2545e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich return new String(type.getPayload(), Charsets.UTF_8); 2555e3610757da1efad5b85ed7042713427010eafc1Nick Kralevich } 2567949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton} 257