update andriod beam demo.
add action item to go to Android Beam settings,
add help info, and add callback for on-push-complete

Change-Id: I2e0e8b9d6e66c507d62012e809ee0c01e1298f20
diff --git a/samples/AndroidBeamDemo/Android.mk b/samples/AndroidBeamDemo/Android.mk
index 7b36dd9..f125f0f 100644
--- a/samples/AndroidBeamDemo/Android.mk
+++ b/samples/AndroidBeamDemo/Android.mk
@@ -10,6 +10,4 @@
 
 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 0000000..5321f82
--- /dev/null
+++ b/samples/AndroidBeamDemo/res/drawable-hdpi/ic_menu_preferences.png
Binary files 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 0000000..ccc50e6
--- /dev/null
+++ b/samples/AndroidBeamDemo/res/drawable-mdpi/ic_menu_preferences.png
Binary files 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 0000000..02cfbad
--- /dev/null
+++ b/samples/AndroidBeamDemo/res/drawable-xhdpi/ic_menu_preferences.png
Binary files differ
diff --git a/samples/AndroidBeamDemo/res/layout/main.xml b/samples/AndroidBeamDemo/res/layout/main.xml
index dce6169..eacb68e 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 0000000..8012d8e
--- /dev/null
+++ b/samples/AndroidBeamDemo/res/menu/options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/menu_settings"
+          android:icon="@drawable/ic_menu_preferences"
+          android:showAsAction="ifRoom"
+          android:title="@string/menu_settings" />
+</menu>
\ No newline at end of file
diff --git a/samples/AndroidBeamDemo/res/values/strings.xml b/samples/AndroidBeamDemo/res/values/strings.xml
index ff4492f..68ed73f 100644
--- a/samples/AndroidBeamDemo/res/values/strings.xml
+++ b/samples/AndroidBeamDemo/res/values/strings.xml
@@ -1,4 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <string name="app_name">Beam</string>
+    <string name="info">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.</string>
+    <string name="menu_settings">Android Beam settings</string>
 </resources>
diff --git a/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java b/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.java
index 17ec325..0cc5f89 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.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 @@
         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 @@
      * 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 @@
                 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);
+        }
+    }
 }