diff options
Diffstat (limited to 'src/com/android/nfc/handover/BluetoothOppHandover.java')
-rw-r--r-- | src/com/android/nfc/handover/BluetoothOppHandover.java | 78 |
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); + } + }; + } |