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;
187949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
197949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.android.apps.tag.message.NdefMessageParser;
207949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.android.apps.tag.message.ParsedNdefMessage;
217949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport com.android.apps.tag.record.ParsedNdefRecord;
227949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
237949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.app.Activity;
247949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.content.Intent;
257949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.NdefMessage;
267949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.nfc.NfcAdapter;
277949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.os.Bundle;
28a29dc1ba19e86ae23f8789bbb8fce6b57130c561Jeff Hamiltonimport android.os.Parcelable;
297949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.util.Log;
307949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.LayoutInflater;
317949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.View;
327949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.view.View.OnClickListener;
337949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamiltonimport android.widget.LinearLayout;
3459395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamiltonimport android.widget.TextView;
357949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
3640d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parksimport java.util.List;
379330d7c4ca64eb6b317f194f5c23ed33f077a944Ben Komalo
387949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton/**
397949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton * An {@link Activity} which handles a broadcast of a new tag that the device just discovered.
407949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton */
4152baa667d419c122860e5436bf7f66dc169aaacaJeff Hamiltonpublic class TagViewer extends Activity implements OnClickListener {
427d7438754bd995dcd0d9e4fd4810d3f2bb20605fJeff Hamilton    static final String TAG = "TagViewer";
437949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
440215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    LinearLayout mTagContent;
457949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
467949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton    @Override
477949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton    protected void onCreate(Bundle savedInstanceState) {
487949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton        super.onCreate(savedInstanceState);
497949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
507949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton        setContentView(R.layout.tag_viewer);
517949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
520215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        mTagContent = (LinearLayout) findViewById(R.id.list);
537949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
540215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        resolveIntent(getIntent());
550215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    }
560215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton
570215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    void resolveIntent(Intent intent) {
580215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        // Parse the intent
590215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        String action = intent.getAction();
6080e02347d3417389fc8b18d06b7172023f0d203eJeff Hamilton        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
6142d7414fd42591c16a12525c08993c263ca13784Nick Pelly                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
62a29dc1ba19e86ae23f8789bbb8fce6b57130c561Jeff Hamilton            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
6359395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            NdefMessage msg = null;
64f38cc72626f196d664607011b3a66a6e07379929Jason parks            if (rawMsgs != null && rawMsgs.length > 0) {
6559395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                msg = (NdefMessage) rawMsgs[0];
66a29dc1ba19e86ae23f8789bbb8fce6b57130c561Jeff Hamilton            }
6759395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton
6859395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            buildTagViews(msg);
690215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        } else {
700215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton            Log.e(TAG, "Unknown intent " + intent);
717949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton            finish();
727949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton            return;
737949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton        }
747949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton    }
757949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
767d7438754bd995dcd0d9e4fd4810d3f2bb20605fJeff Hamilton    void buildTagViews(NdefMessage msg) {
770215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        LayoutInflater inflater = LayoutInflater.from(this);
780215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        LinearLayout content = mTagContent;
790215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton
800215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        // Clear out any old views in the content area, for example if you scan two tags in a row.
810215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        content.removeAllViews();
827949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
837949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton        // Build views for all of the sub records
8459395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton        if (msg == null) {
8559395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            TextView empty = (TextView) inflater.inflate(R.layout.tag_text, content, false);
8659395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            empty.setText(R.string.tag_empty);
8759395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            content.addView(empty);
8859395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton        } else {
8959395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            // Parse the first message in the list
9059395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            //TODO figure out what to do when/if we support multiple messages per tag
9159395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            ParsedNdefMessage parsedMsg = NdefMessageParser.parse(msg);
9259395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton
9359395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            List<ParsedNdefRecord> records = parsedMsg.getRecords();
9459395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            final int size = records.size();
9559395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            if (size == 0) {
9659395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                TextView empty = (TextView) inflater.inflate(R.layout.tag_text, content, false);
9759395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                empty.setText(R.string.tag_empty);
9859395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                content.addView(empty);
9959395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            } else {
10059395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                for (int i = 0; i < size; i++) {
10159395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                    ParsedNdefRecord record = records.get(i);
10259395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                    content.addView(record.getView(this, inflater, content, i));
10359395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                    inflater.inflate(R.layout.tag_divider, content, true);
10459395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton                }
10559395354a8a09752dae68f2fef44d6ad011c38dbJeff Hamilton            }
1067949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton        }
1077949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton    }
1087949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton
1097949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton    @Override
1100215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    public void onNewIntent(Intent intent) {
11140d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks        setIntent(intent);
1120215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton        resolveIntent(intent);
1130215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    }
1140215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton
1150215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    @Override
1167949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton    public void onClick(View view) {
1177d7438754bd995dcd0d9e4fd4810d3f2bb20605fJeff Hamilton        finish();
1180215c98773bad1b532c97b1f875aa2f0ef201bf8Jeff Hamilton    }
1197949534630e1b14cf73a6ad3c0606ec5be2c480cJeff Hamilton}
120