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