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