package com.android.nfc.beam; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.util.Log; import java.io.File; /** * @hide */ public class BeamStatusReceiver extends BroadcastReceiver { private static final boolean DBG = true; private static final String TAG = "BeamStatusReceiver"; private static final String ACTION_HANDOVER_STARTED = "android.nfc.handover.intent.action.HANDOVER_STARTED"; private static final String ACTION_TRANSFER_PROGRESS = "android.nfc.handover.intent.action.TRANSFER_PROGRESS"; private static final String ACTION_TRANSFER_DONE = "android.nfc.handover.intent.action.TRANSFER_DONE"; private static final String EXTRA_HANDOVER_DATA_LINK_TYPE = "android.nfc.handover.intent.extra.HANDOVER_DATA_LINK_TYPE"; private static final String EXTRA_TRANSFER_PROGRESS = "android.nfc.handover.intent.extra.TRANSFER_PROGRESS"; private static final String EXTRA_TRANSFER_URI = "android.nfc.handover.intent.extra.TRANSFER_URI"; private static final String EXTRA_OBJECT_COUNT = "android.nfc.handover.intent.extra.OBJECT_COUNT"; private static final String EXTRA_TRANSFER_STATUS = "android.nfc.handover.intent.extra.TRANSFER_STATUS"; private static final String EXTRA_TRANSFER_MIMETYPE = "android.nfc.handover.intent.extra.TRANSFER_MIME_TYPE"; private static final String ACTION_STOP_BLUETOOTH_TRANSFER = "android.btopp.intent.action.STOP_HANDOVER_TRANSFER"; // FIXME: Needs to stay in sync with com.android.bluetooth.opp.Constants private static final int HANDOVER_TRANSFER_STATUS_SUCCESS = 0; private static final int HANDOVER_TRANSFER_STATUS_FAILURE = 1; // permission needed to be able to receive handover status requests public static final String BEAM_STATUS_PERMISSION = "android.permission.NFC_HANDOVER_STATUS"; // Needed to build cancel intent in Beam notification public static final String EXTRA_INCOMING = "com.android.nfc.handover.extra.INCOMING"; public static final String EXTRA_TRANSFER_ID = "android.nfc.handover.intent.extra.TRANSFER_ID"; public static final String EXTRA_ADDRESS = "android.nfc.handover.intent.extra.ADDRESS"; public static final String ACTION_CANCEL_HANDOVER_TRANSFER = "com.android.nfc.handover.action.CANCEL_HANDOVER_TRANSFER"; public static final int DIRECTION_INCOMING = 0; public static final int DIRECTION_OUTGOING = 1; private final Context mContext; private final BeamTransferManager mTransferManager; BeamStatusReceiver(Context context, BeamTransferManager transferManager) { mContext = context; mTransferManager = transferManager; } @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); int dataLinkType = intent.getIntExtra(EXTRA_HANDOVER_DATA_LINK_TYPE, BeamTransferManager.DATA_LINK_TYPE_BLUETOOTH); if (ACTION_CANCEL_HANDOVER_TRANSFER.equals(action)) { if (mTransferManager != null) { mTransferManager.cancel(); } } else if (ACTION_TRANSFER_PROGRESS.equals(action) || ACTION_TRANSFER_DONE.equals(action) || ACTION_HANDOVER_STARTED.equals(action)) { handleTransferEvent(intent, dataLinkType); } } public IntentFilter getIntentFilter() { IntentFilter filter = new IntentFilter(ACTION_TRANSFER_DONE); filter.addAction(ACTION_TRANSFER_PROGRESS); filter.addAction(ACTION_CANCEL_HANDOVER_TRANSFER); filter.addAction(ACTION_HANDOVER_STARTED); return filter; } private void handleTransferEvent(Intent intent, int deviceType) { String action = intent.getAction(); int id = intent.getIntExtra(EXTRA_TRANSFER_ID, -1); String sourceAddress = intent.getStringExtra(EXTRA_ADDRESS); if (sourceAddress == null) return; if (mTransferManager == null) { // There is no transfer running for this source address; most likely // the transfer was cancelled. We need to tell BT OPP to stop transferring. if (id != -1) { if (deviceType == BeamTransferManager.DATA_LINK_TYPE_BLUETOOTH) { if (DBG) Log.d(TAG, "Didn't find transfer, stopping"); Intent cancelIntent = new Intent(ACTION_STOP_BLUETOOTH_TRANSFER); cancelIntent.putExtra(EXTRA_TRANSFER_ID, id); mContext.sendBroadcast(cancelIntent); } } return; } mTransferManager.setBluetoothTransferId(id); if (action.equals(ACTION_TRANSFER_DONE)) { int handoverStatus = intent.getIntExtra(EXTRA_TRANSFER_STATUS, HANDOVER_TRANSFER_STATUS_FAILURE); if (handoverStatus == HANDOVER_TRANSFER_STATUS_SUCCESS) { String uriString = intent.getStringExtra(EXTRA_TRANSFER_URI); String mimeType = intent.getStringExtra(EXTRA_TRANSFER_MIMETYPE); Uri uri = Uri.parse(uriString); if (uri != null && uri.getScheme() == null) { uri = Uri.fromFile(new File(uri.getPath())); } mTransferManager.finishTransfer(true, uri, mimeType); } else { mTransferManager.finishTransfer(false, null, null); } } else if (action.equals(ACTION_TRANSFER_PROGRESS)) { float progress = intent.getFloatExtra(EXTRA_TRANSFER_PROGRESS, 0.0f); mTransferManager.updateFileProgress(progress); } else if (action.equals(ACTION_HANDOVER_STARTED)) { int count = intent.getIntExtra(EXTRA_OBJECT_COUNT, 0); if (count > 0) { mTransferManager.setObjectCount(count); } } } }