1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.cts.verifier.nfc; 18 19 import com.android.cts.verifier.PassFailButtons; 20 import com.android.cts.verifier.R; 21 import com.android.cts.verifier.nfc.tech.NfcUtils; 22 23 import android.app.AlertDialog; 24 import android.app.Dialog; 25 import android.app.PendingIntent; 26 import android.content.Intent; 27 import android.nfc.NdefMessage; 28 import android.nfc.NfcAdapter; 29 import android.nfc.NfcManager; 30 import android.os.Bundle; 31 import android.os.Parcelable; 32 import android.widget.TextView; 33 34 /** 35 * Test activity that waits to receive a particular NDEF Push message from another NFC device. 36 */ 37 public class NdefPushReceiverActivity extends PassFailButtons.Activity { 38 39 private static final int NFC_NOT_ENABLED_DIALOG_ID = 1; 40 41 private static final int RESULT_DIALOG_ID = 2; 42 43 private static final String IS_MATCH_ARG = "isMatch"; 44 45 private NfcAdapter mNfcAdapter; 46 47 private PendingIntent mPendingIntent; 48 49 @Override onCreate(Bundle savedInstanceState)50 protected void onCreate(Bundle savedInstanceState) { 51 super.onCreate(savedInstanceState); 52 setContentView(R.layout.pass_fail_text); 53 setInfoResources(R.string.nfc_ndef_push_receiver, R.string.nfc_ndef_push_receiver_info, 0); 54 setPassFailButtonClickListeners(); 55 getPassButton().setEnabled(false); 56 57 TextView text = (TextView) findViewById(R.id.text); 58 text.setText(R.string.nfc_ndef_push_receiver_instructions); 59 60 NfcManager nfcManager = (NfcManager) getSystemService(NFC_SERVICE); 61 mNfcAdapter = nfcManager.getDefaultAdapter(); 62 mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()) 63 .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 64 } 65 66 @Override onResume()67 protected void onResume() { 68 super.onResume(); 69 70 if (!mNfcAdapter.isEnabled()) { 71 showDialog(NFC_NOT_ENABLED_DIALOG_ID); 72 } 73 74 /* Only the sender requires mNfcAdapter.isNdefPushEnabled == true, 75 * so no need to check it here in the receiver. */ 76 77 mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); 78 } 79 80 @Override onPause()81 protected void onPause() { 82 super.onPause(); 83 mNfcAdapter.disableForegroundDispatch(this); 84 } 85 86 @Override onNewIntent(Intent intent)87 protected void onNewIntent(Intent intent) { 88 super.onNewIntent(intent); 89 90 NdefMessage[] messages = getNdefMessages(intent); 91 boolean isMatch = messages != null 92 && messages.length > 0 93 && NfcUtils.areMessagesEqual(messages[0], NdefPushSenderActivity.TEST_MESSAGE); 94 95 getPassButton().setEnabled(isMatch); 96 97 Bundle args = new Bundle(); 98 args.putBoolean(IS_MATCH_ARG, isMatch); 99 showDialog(RESULT_DIALOG_ID, args); 100 } 101 getNdefMessages(Intent intent)102 private NdefMessage[] getNdefMessages(Intent intent) { 103 Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 104 if (rawMessages != null) { 105 NdefMessage[] messages = new NdefMessage[rawMessages.length]; 106 for (int i = 0; i < messages.length; i++) { 107 messages[i] = (NdefMessage) rawMessages[i]; 108 } 109 return messages; 110 } else { 111 return null; 112 } 113 } 114 115 @Override onCreateDialog(int id, Bundle args)116 public Dialog onCreateDialog(int id, Bundle args) { 117 switch (id) { 118 case NFC_NOT_ENABLED_DIALOG_ID: 119 return NfcDialogs.createNotEnabledDialog(this); 120 121 case RESULT_DIALOG_ID: 122 // Set placeholder titles and messages for now. Final titles and messages will 123 // be set in onPrepareDialog. 124 return new AlertDialog.Builder(this) 125 .setIcon(android.R.drawable.ic_dialog_info) 126 .setTitle(R.string.result_failure) 127 .setMessage("") 128 .setPositiveButton(android.R.string.ok, null) 129 .show(); 130 131 default: 132 return super.onCreateDialog(id, args); 133 } 134 } 135 136 @Override onPrepareDialog(int id, Dialog dialog, Bundle args)137 protected void onPrepareDialog(int id, Dialog dialog, Bundle args) { 138 switch (id) { 139 case RESULT_DIALOG_ID: 140 boolean isMatch = args.getBoolean(IS_MATCH_ARG); 141 AlertDialog alert = (AlertDialog) dialog; 142 alert.setTitle(isMatch 143 ? R.string.result_success 144 : R.string.result_failure); 145 alert.setMessage(isMatch 146 ? getString(R.string.nfc_ndef_push_receive_success) 147 : getString(R.string.nfc_ndef_push_receive_failure)); 148 break; 149 150 default: 151 super.onPrepareDialog(id, dialog, args); 152 break; 153 } 154 } 155 } 156