Java tutorial
// Copyright 2016 The Vanadium Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package io.v.android.impl.google.services.beam; import android.app.Activity; import android.content.Intent; import android.nfc.NdefMessage; import android.nfc.NfcAdapter; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.app.ActivityCompat; import android.util.Log; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import org.joda.time.Duration; import io.v.android.v23.V; import io.v.android.v23.VBeam; import io.v.v23.OptionDefs; import io.v.v23.Options; import io.v.v23.context.VContext; import io.v.v23.security.VSecurity; /** * Handles the NDEF discovered intent on the receiver phone. * It contacts the VBeam server on the sending phone, then retrieves and starts the shared intent. */ public class BeamActivity extends Activity { private static final String TAG = "BeamActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onResume() { super.onResume(); NdefMessage msgs[] = null; Intent intent = getIntent(); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } } if (msgs == null) { Log.d(TAG, "No ndef messages"); finish(); return; } VBeamManager.Data data = null; for (NdefMessage m : msgs) { data = VBeamManager.decodeMessage(m); if (data != null) break; } if (data == null) { Log.w(TAG, "Unable to deserialize data"); finish(); return; } Log.d(TAG, "connecting to " + data.name); VContext ctx = V.init(this).withTimeout(Duration.standardSeconds(2)); Options opts = new Options(); opts.set(OptionDefs.SERVER_AUTHORIZER, VSecurity.newPublicKeyAuthorizer(data.key)); IntentBeamerClient client = IntentBeamerClientFactory.getIntentBeamerClient(data.name); ListenableFuture<IntentBeamerClient.GetIntentOut> out = client.getIntent(ctx, data.secret, opts); Futures.addCallback(out, new FutureCallback<IntentBeamerClient.GetIntentOut>() { @Override public void onSuccess(IntentBeamerClient.GetIntentOut result) { try { Log.d(TAG, "got intent " + result.intentUri); int flags = 0; if (result.intentUri.startsWith("intent:")) { flags = Intent.URI_INTENT_SCHEME; } else { flags = Intent.URI_ANDROID_APP_SCHEME; } Intent resultIntent = Intent.parseUri(result.intentUri, flags); resultIntent.putExtra(VBeamManager.EXTRA_VBEAM_PAYLOAD, result.payload); startActivity(resultIntent); finish(); } catch (Throwable t) { t.printStackTrace(); } } @Override public void onFailure(Throwable t) { t.printStackTrace(); finish(); } }); } }