SmartPoster.java revision 7949534630e1b14cf73a6ad3c0606ec5be2c480c
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; 217949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.google.common.base.Preconditions; 227949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.google.common.collect.Iterables; 237949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 247949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.app.Activity; 257949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.FormatException; 267949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.NdefMessage; 277949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.NdefRecord; 287949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.LayoutInflater; 297949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.View; 307949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.ViewGroup; 317949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.ViewGroup.LayoutParams; 327949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.widget.LinearLayout; 337949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.widget.TextView; 347949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 357949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport java.util.Arrays; 367949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport java.util.NoSuchElementException; 377949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 387949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport javax.annotation.Nullable; 397949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 407949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton/** 417949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * A representation of an NFC Forum "Smart Poster". 427949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 437949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonpublic class SmartPoster implements ParsedNdefRecord { 447949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 457949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton /** 467949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * NFC Forum Smart Poster Record Type Definition section 3.2.1. 477949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 487949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * "The Title record for the service (there can be many of these in 497949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * different languages, but a language MUST NOT be repeated). 507949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * This record is optional." 517949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 527949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 537949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton private final TextRecord mTitleRecord; 547949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 557949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton /** 567949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * NFC Forum Smart Poster Record Type Definition section 3.2.1. 577949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * 587949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * "The URI record. This is the core of the Smart Poster, and all other 597949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * records are just metadata about this record. There MUST be one URI 607949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * record and there MUST NOT be more than one." 617949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 627949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton private final UriRecord mUriRecord; 637949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 647949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton private SmartPoster(UriRecord uri, @Nullable TextRecord title) { 657949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton mUriRecord = Preconditions.checkNotNull(uri); 667949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton mTitleRecord = title; 677949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 687949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 697949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public UriRecord getUriRecord() { 707949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return mUriRecord; 717949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 727949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 737949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton /** 747949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * Returns the title of the smart poster. This may be {@code null}. 757949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */ 767949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public TextRecord getTitle() { 777949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return mTitleRecord; 787949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 797949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 807949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public static SmartPoster parse(NdefRecord record) { 817949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton Preconditions.checkArgument(record.getTnf() == NdefRecord.TNF_WELL_KNOWN); 827949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton Preconditions.checkArgument(Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER)); 837949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton try { 847949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton NdefMessage subRecords = new NdefMessage(record.getPayload()); 857949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 867949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton Iterable<ParsedNdefRecord> records = NdefMessageParser.getRecords(subRecords); 877949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 887949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton UriRecord uri = Iterables.getOnlyElement(Iterables.filter(records, UriRecord.class)); 897949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton Iterable<TextRecord> textFields = Iterables.filter(records, TextRecord.class); 907949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 917949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton TextRecord title = null; 927949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton if (!Iterables.isEmpty(textFields)) { 937949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton title = Iterables.get(textFields, 0); 947949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 957949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 967949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return new SmartPoster(uri, title); 977949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } catch (FormatException e) { 987949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton throw new IllegalArgumentException(e); 997949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } catch (NoSuchElementException e) { 1007949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton throw new IllegalArgumentException(e); 1017949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1027949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1037949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1047949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public static boolean isPoster(NdefRecord record) { 1057949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton try { 1067949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton parse(record); 1077949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return true; 1087949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } catch (IllegalArgumentException e) { 1097949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return false; 1107949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1117949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1127949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1137949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton @Override 1147949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public String getRecordType() { 1157949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return "SmartPoster"; 1167949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1177949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1187949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton @Override 1197949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton public View getView(Activity activity, LayoutInflater inflater, ViewGroup parent) { 1207949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton if (mTitleRecord != null) { 1217949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton // Build a container to hold the title and the URI 1227949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton LinearLayout container = new LinearLayout(activity); 1237949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton container.setOrientation(LinearLayout.VERTICAL); 1247949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton container.setLayoutParams(new LayoutParams( 1257949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 1267949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton 1277949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton container.addView(mTitleRecord.getView(activity, inflater, container)); 1287949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton inflater.inflate(R.layout.tag_divider, container); 1297949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton container.addView(mUriRecord.getView(activity, inflater, container)); 1307949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return container; 1317949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } else { 1327949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton // Just a URI, return a view for it directly 1337949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton return mUriRecord.getView(activity, inflater, parent); 1347949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1357949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton } 1367949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton} 137