summaryrefslogtreecommitdiff
path: root/src/com/android/nfc/beam/BeamStatusReceiver.java
blob: eb529b5c8c84340656dcd477559b183686be314d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
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 com.android.nfc.R;

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);
                    cancelIntent.setPackage(mContext.getString(R.string.bluetooth_package));
                    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);
            }
        }
    }
}