summaryrefslogtreecommitdiffstats
path: root/src/com/android/nfc/handover/BluetoothOppHandover.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/nfc/handover/BluetoothOppHandover.java')
-rw-r--r--src/com/android/nfc/handover/BluetoothOppHandover.java78
1 files changed, 69 insertions, 9 deletions
diff --git a/src/com/android/nfc/handover/BluetoothOppHandover.java b/src/com/android/nfc/handover/BluetoothOppHandover.java
index 9c1a60d..3f3718f 100644
--- a/src/com/android/nfc/handover/BluetoothOppHandover.java
+++ b/src/com/android/nfc/handover/BluetoothOppHandover.java
@@ -1,13 +1,19 @@
package com.android.nfc.handover;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.net.Uri;
+import android.nfc.NfcAdapter;
import android.util.Log;
import android.webkit.MimeTypeMap;
+import com.android.nfc.handover.HandoverManager.HandoverPowerManager;
+
import java.util.ArrayList;
import java.util.Arrays;
@@ -15,27 +21,36 @@ public class BluetoothOppHandover {
static final String TAG = "BluetoothOppHandover";
static final boolean D = true;
+ static final int STATE_INIT = 0;
+ static final int STATE_TURNING_ON = 1;
+ static final int STATE_COMPLETE = 2;
+
+ public static final String EXTRA_CONNECTION_HANDOVER =
+ "com.android.intent.extra.CONNECTION_HANDOVER";
+
final Context mContext;
final BluetoothDevice mDevice;
final Uri[] mUris;
+ final HandoverPowerManager mHandoverPowerManager;
- public interface Callback {
- public void onBluetoothOppHandoverComplete();
- }
+ int mState;
- public BluetoothOppHandover(Context context, BluetoothDevice device,
- Uri[] uris) {
+ public BluetoothOppHandover(Context context, BluetoothDevice device, Uri[] uris,
+ HandoverPowerManager powerManager) {
mContext = context;
mDevice = device;
mUris = uris;
+ mHandoverPowerManager = powerManager;
+
+ mState = STATE_INIT;
}
- public String getMimeTypeForUri(Uri uri) {
+ public static String getMimeTypeForUri(Context context, Uri uri) {
if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
- ContentResolver cr = mContext.getContentResolver();
+ ContentResolver cr = context.getContentResolver();
return cr.getType(uri);
} else if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
- String extension = MimeTypeMap.getFileExtensionFromUrl(uri.getPath());
+ String extension = MimeTypeMap.getFileExtensionFromUrl(uri.getPath()).toLowerCase();
if (extension != null) {
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
} else {
@@ -52,12 +67,33 @@ public class BluetoothOppHandover {
* to begin the BT sequence. Must be called on Main thread.
*/
public void start() {
+ IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+ mContext.registerReceiver(mReceiver, filter);
+
+ if (!mHandoverPowerManager.isBluetoothEnabled()) {
+ if (mHandoverPowerManager.enableBluetooth()) {
+ mState = STATE_TURNING_ON;
+ } else {
+ // TODO deal with this: toast or tie in to Beam failure?
+ }
+ } else {
+ // BT already enabled
+ sendIntent();
+ }
+ }
+
+ void complete() {
+ mState = STATE_COMPLETE;
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ void sendIntent() {
//TODO: either open up BluetoothOppLauncherActivity to all MIME types
// or gracefully handle mime types that can't be sent
Log.d(TAG, "Sending handover intent for " + mDevice.getAddress());
Intent intent = new Intent();
intent.setPackage("com.android.bluetooth");
- String mimeType = getMimeTypeForUri(mUris[0]);
+ String mimeType = getMimeTypeForUri(mContext, mUris[0]);
Log.d(TAG, "Determined mime type as " + mimeType);
intent.setType(mimeType);
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
@@ -69,7 +105,31 @@ public class BluetoothOppHandover {
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
}
+ intent.putExtra(EXTRA_CONNECTION_HANDOVER, true);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
+
+ complete();
+ }
+
+ void handleIntent(Intent intent) {
+ String action = intent.getAction();
+ if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action) && mState == STATE_TURNING_ON) {
+ int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
+ if (state == BluetoothAdapter.STATE_ON) {
+ sendIntent();
+ } else if (state == BluetoothAdapter.STATE_OFF) {
+ complete();
+ }
+ return;
+ }
}
+
+ final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ handleIntent(intent);
+ }
+ };
+
}