From e842e956c203b322bd39c05ed5660c917b9ae443 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Fri, 14 Oct 2011 17:30:30 -0700 Subject: [PATCH] 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 --- samples/AndroidBeamDemo/Android.mk | 2 - .../res/drawable-hdpi/ic_menu_preferences.png | Bin 0 -> 1851 bytes .../res/drawable-mdpi/ic_menu_preferences.png | Bin 0 -> 1142 bytes .../drawable-xhdpi/ic_menu_preferences.png | Bin 0 -> 2507 bytes samples/AndroidBeamDemo/res/layout/main.xml | 3 + samples/AndroidBeamDemo/res/menu/options.xml | 7 ++ .../AndroidBeamDemo/res/values/strings.xml | 5 ++ .../src/com/example/android/beam/Beam.java | 85 +++++++++++++++--- 8 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 samples/AndroidBeamDemo/res/drawable-hdpi/ic_menu_preferences.png create mode 100644 samples/AndroidBeamDemo/res/drawable-mdpi/ic_menu_preferences.png create mode 100644 samples/AndroidBeamDemo/res/drawable-xhdpi/ic_menu_preferences.png create mode 100644 samples/AndroidBeamDemo/res/menu/options.xml 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 0000000000000000000000000000000000000000..5321f8285235d915ea069e52df7356f4fc464086 GIT binary patch literal 1851 zcmZ{lcRbq(6u^JBR4HxrC^1{HBE+oLNUYe35^Y0_*g=Vr-r2Q}prurew)TiorBsc& zBK94w#?hWyMKtb&pyks0@BX+y-ur&u`@HYx{qg>IX?8Yd{AVtm0RVvC9BpjRqU!hH zzGX_pm$fG^13KW8N31bocZd4=ZMN|Nu4+_E&U<8(FB+V1>i$0o?nhqcY_&3bGLUNpwN$TzRm z4@&f-2zNeJ4lrxR3LkZ-clMk{u^cWLb$vUzzvpDO|VT8)v~Pue)#P`rtComA>u^5 z-hU6;%P;BF#6KI&I&-_P`}k}shE1NZOJSE{9aPTd@?8Q>@U2~;3!_s>XNY=0`s;DC zf5TK?E?~$;w8%8kO9Zl|Cr5WmdH~V}_5_mFNrASUJ1O6BfkuTQIEYRjD`v6)SSNDT zBj#cbH&r1JmXXr2Q&a)(EGi(?rtuo0`tCWNcxTo8Ehy!IcFpmjNCpHdf7pt~@cK>B zu(@omJ8`j9VxYC!IJfzdj8yK@|zslb0%qbk*0tTh}#Xqsm znn;0)t~A&rF&;~T_15dX=;qA^Id+X}nlFZhvjJCGr!_Zha-CgJ2{UpiHi1u`n|)+? zYkJeV0)Fq7Na|!`ORV?}Y{uY2%5W#FZDz1!e3q317}9U@OT2`t0ONuZp(Gyawi1bFI9@MKDHo&=Wl>-rLeU7Vi8dKyk6s=&Az6 zkFKbCq2F^oA1q{&hNX|UptG0HCLkMJW`dRH))#oIrD=JA0UE-0OG)(7(qZ@ZIh+=( z<|lo6^ddAb!s?Bn64>B?Fxgel##z3BD9tu=s4~kl*A~G&PUh&E|FPm%*Vio`kvKk4 zMc9)4@!-)BBP(xxk(#(iul2$-&bjV&g>i8}TA_>`)o|qcvP!6Um`%fm-ldcsbLA%lsP@5(24;c%|!PX6xjrmgtyfs2}#p?L1_%n`qlF*uJWaul%2aZG%9P zi1PEsxFf-sdY`hQeV-+X<)G8TD1+Iu?XEjL4spHnw+<(tw!i|BfS^^Xf5V)!*`N%i zt#YJu21(`W4ZA25H$36dP3G%a;TOWl-WFf}@(bB`g}Ql=V)fuy;k6W#$geSs{*YPy z1>L=>(WK1mbeD?1&Kd&DO>B%QC|trnDzi)4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ccc50e66ee7e9812e4117d18150ad3cd575cb48d GIT binary patch literal 1142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~H|ou`Xqh{y4#A+b4=LnZ3&eXfmvd8^knnmajp zwXv%2Nuv!d=N4S^G~w2`$g{&h$54r-*Ui`9qDv3cL<{4K6^-{K_8PR!R#iK^Q({G) z!L*$(I9wux6IVwr+;R5S)vb5G&z(1&d$+v8g_m5ZK1x5#bzk0^`0urxR$=whB zJz=ekXUqn_WlG66Kc_ZlMs8td7HiyS_vg#>cTp#OSPTSxCD*Rpx41*}?Exi&Q?Iwx zJzQt%yQ#C|%_LQ(tesQm94ZOqHk-jzX|gXOTwgaaxufsNc6BeKNXA1Vla8`@FjZ!3 zS$4C*mBnSHec!<~Mai2!JUPd-!QGhEm(ORn|OR!_DA53IQaBy*Ck zHMh%i%C6iIUzqqvvW-)t?NF?hLc`6M2D4WkersyYvN=gBhP`A}+LNh_krBFu(V0y7 zLJ{io?Y9_5-CnfUtT_MA6r~^qhTe$xuBrPc9E*8*wAz8Gi}7J-|GTW5@@o%_D-&!A zg{Dh?oAYg_4yT&)p6Qk4cQkz+{+Onf9-OmX;Y6Fv^pLc}z6<%jt63dh8*I-v#dX55 zS)M6Vxo0V~{;B&NXMf^g+s3u~(mD3OEVkF%d1W5=&cp4m=Lr_xGyQy(^*>_5St74T0_kJ8tFr&%XGiqQ|YE)tI62z%KW^o02v$uiTecDSymlii)+dg!8ETLU-W43EUJizgCZoUfJ3ntc80yOi&i=_zSVd+u!7 z{jeih)o$whBkR70@~ZkYi?D`DwRkhE(s1PN4!Qg)e{w*4aJha}3-@h#4%xLgJOsC< z7X8S%nYpA+U8(z^^XF;8HsbnL3>iEOXREfp&nkBPapRSlVVCU7bBT{d9%XU_&G1(~ zrmMhEcHTRk*-rQte^$WW9AOKK-w!?BRsTQw;{NSo=}bctffTlSmZ;nl)h`_%@2E1m zcK7Y8Q!&1d7w?{ASYVmBQ2AeD+0uP=H_t!1+1X#c*3WX$r>;+~Ct116Odijfw!_~< zVKtj!+w53|Jyql51QubpI~&@49t?MC9V-ADTyViR>?)F zK#IZ0z|c_Fz);u7BE-nZ%Ea8t)L7TR!pgv4iC@u46b-rgDVb@NxHViAK2-|TAPKS| sI6tkVJh3R1!7(L2DOJHUH!(dmC^a#qvhZZ84Nwt-r>mdKI;Vst0F6rPu>b%7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02cfbad0b08d9276615ba7b25ca7f745dc3cfe4d GIT binary patch literal 2507 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 PIRr2@vP9Jz;Nt!U*I|wz literal 0 HcmV?d00001 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); + } + } }