diff --git a/samples/AndroidBeamDemo/Android.mk b/samples/AndroidBeamDemo/Android.mk index 7b36dd999..f125f0f6c 100644 --- a/samples/AndroidBeamDemo/Android.mk +++ b/samples/AndroidBeamDemo/Android.mk @@ -10,6 +10,4 @@ LOCAL_PACKAGE_NAME := AndroidBeamDemo LOCAL_SDK_VERSION := current -LOCAL_PROGUARD_FLAG_FILES := proguard.flags - include $(BUILD_PACKAGE) diff --git a/samples/AndroidBeamDemo/res/drawable-hdpi/ic_menu_preferences.png b/samples/AndroidBeamDemo/res/drawable-hdpi/ic_menu_preferences.png new file mode 100644 index 000000000..5321f8285 Binary files /dev/null and b/samples/AndroidBeamDemo/res/drawable-hdpi/ic_menu_preferences.png differ diff --git a/samples/AndroidBeamDemo/res/drawable-mdpi/ic_menu_preferences.png b/samples/AndroidBeamDemo/res/drawable-mdpi/ic_menu_preferences.png new file mode 100644 index 000000000..ccc50e66e Binary files /dev/null and b/samples/AndroidBeamDemo/res/drawable-mdpi/ic_menu_preferences.png differ diff --git a/samples/AndroidBeamDemo/res/drawable-xhdpi/ic_menu_preferences.png b/samples/AndroidBeamDemo/res/drawable-xhdpi/ic_menu_preferences.png new file mode 100644 index 000000000..02cfbad0b Binary files /dev/null and b/samples/AndroidBeamDemo/res/drawable-xhdpi/ic_menu_preferences.png differ diff --git a/samples/AndroidBeamDemo/res/layout/main.xml b/samples/AndroidBeamDemo/res/layout/main.xml index dce616998..eacb68e9f 100644 --- a/samples/AndroidBeamDemo/res/layout/main.xml +++ b/samples/AndroidBeamDemo/res/layout/main.xml @@ -21,4 +21,7 @@ android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" + android:text="@string/info" + android:padding="10dp" + android:textSize="18sp" /> diff --git a/samples/AndroidBeamDemo/res/menu/options.xml b/samples/AndroidBeamDemo/res/menu/options.xml new file mode 100644 index 000000000..8012d8e62 --- /dev/null +++ b/samples/AndroidBeamDemo/res/menu/options.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/samples/AndroidBeamDemo/res/values/strings.xml b/samples/AndroidBeamDemo/res/values/strings.xml index ff4492fe5..68ed73f19 100644 --- a/samples/AndroidBeamDemo/res/values/strings.xml +++ b/samples/AndroidBeamDemo/res/values/strings.xml @@ -1,4 +1,9 @@ Beam + Ensure that Android Beam is enabled by turning it on in + the system Settings (select the setting icon above), then place this device up + against another Android device that supports Android Beam to send a + message. + Android Beam settings diff --git a/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java b/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java index 17ec3256f..0cc5f899f 100644 --- a/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java +++ b/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java @@ -22,38 +22,57 @@ import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateNdefMessageCallback; +import android.nfc.NfcAdapter.OnNdefPushCompleteCallback; import android.nfc.NfcEvent; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.os.Parcelable; +import android.provider.Settings; +import android.text.format.Time; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; + import java.nio.charset.Charset; -public class Beam extends Activity implements CreateNdefMessageCallback { +public class Beam extends Activity implements CreateNdefMessageCallback, + OnNdefPushCompleteCallback { NfcAdapter mNfcAdapter; - TextView textView; + TextView mInfoText; + private static final int MESSAGE_SENT = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); - TextView textView = (TextView) findViewById(R.id.textView); + + mInfoText = (TextView) findViewById(R.id.textView); // Check for available NFC Adapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { - Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show(); - finish(); - return; + mInfoText = (TextView) findViewById(R.id.textView); + mInfoText.setText("NFC is not available on this device."); } - // Register callback + // Register callback to set NDEF message mNfcAdapter.setNdefPushMessageCallback(this, this); + // Register callback to listen for message-sent success + mNfcAdapter.setOnNdefPushCompleteCallback(this, this); } + + /** + * Implementation for the CreateNdefMessageCallback interface + */ @Override public NdefMessage createNdefMessage(NfcEvent event) { - String text = ("Beam me up, Android!\n\n" + - "Beam Time: " + System.currentTimeMillis()); + Time time = new Time(); + time.setToNow(); + String text = ("Beam me up!\n\n" + + "Beam Time: " + time.format("%H:%M:%S")); NdefMessage msg = new NdefMessage( new NdefRecord[] { createMimeRecord( "application/com.example.android.beam", text.getBytes()) @@ -70,6 +89,28 @@ public class Beam extends Activity implements CreateNdefMessageCallback { return msg; } + /** + * Implementation for the OnNdefPushCompleteCallback interface + */ + @Override + public void onNdefPushComplete(NfcEvent arg0) { + // A handler is needed to send messages to the activity when this + // callback occurs, because it happens from a binder thread + mHandler.obtainMessage(MESSAGE_SENT).sendToTarget(); + } + + /** This handler receives a message from onNdefPushComplete */ + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_SENT: + Toast.makeText(getApplicationContext(), "Message sent!", Toast.LENGTH_LONG).show(); + break; + } + } + }; + @Override public void onResume() { super.onResume(); @@ -89,13 +130,12 @@ public class Beam extends Activity implements CreateNdefMessageCallback { * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { - textView = (TextView) findViewById(R.id.textView); Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present - textView.setText(new String(msg.getRecords()[0].getPayload())); + mInfoText.setText(new String(msg.getRecords()[0].getPayload())); } /** @@ -109,4 +149,27 @@ public class Beam extends Activity implements CreateNdefMessageCallback { NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload); return mimeRecord; } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // If NFC is not available, we won't be needing this menu + if (mNfcAdapter == null) { + return super.onCreateOptionsMenu(menu); + } + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.options, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_settings: + Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS); + startActivity(intent); + return true; + default: + return super.onOptionsItemSelected(item); + } + } }