blob: 4fd649de38a5a6a4e5f378888ffce99bc6b7728f [file] [log] [blame]
// Copyright 2015 The Chromium 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 org.chromium.mojo.shell;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcEvent;
import org.chromium.base.ApplicationStatus;
import org.chromium.mojo.system.MojoException;
import org.chromium.mojom.nfc.Nfc;
import org.chromium.mojom.nfc.NfcData;
import org.chromium.mojom.nfc.NfcTransmission;
import java.util.ArrayList;
import java.util.List;
/**
* Android implementation of Nfc.
*/
class NfcImpl implements Nfc, NfcAdapter.OnNdefPushCompleteCallback,
NfcAdapter.CreateNdefMessageCallback {
private final NfcAdapter mNfcAdapter;
private final String mPackageName;
private final String mRequestorUrl;
private final List<NfcTransmissionInfo> mNfcTransmissionInfos;
private List<NfcTransmissionInfo> mLastMessageNfcTransmissionInfos;
NfcImpl(NfcAdapter nfcAdapter, String packageName, String requestorUrl) {
mNfcAdapter = nfcAdapter;
mPackageName = packageName;
mRequestorUrl = requestorUrl;
mNfcTransmissionInfos = new ArrayList<NfcTransmissionInfo>();
mLastMessageNfcTransmissionInfos = new ArrayList<NfcTransmissionInfo>();
}
@Override
public void close() {}
@Override
public void onConnectionError(MojoException e) {}
@Override
public void transmitOnNextConnection(NfcData nfcData,
org.chromium.mojo.bindings.InterfaceRequest<NfcTransmission> request,
TransmitOnNextConnectionResponse transmitOnNextConnectionResponse) {
NfcTransmissionInfo nfcTransmissionInfo =
new NfcTransmissionInfo(nfcData, transmitOnNextConnectionResponse);
mNfcTransmissionInfos.add(nfcTransmissionInfo);
NfcTransmission nfcTransmission = new NfcTransmissionImpl(nfcTransmissionInfo);
NfcTransmission.MANAGER.bind(nfcTransmission, request);
mNfcAdapter.setNdefPushMessageCallback(
this, ApplicationStatus.getLastTrackedFocusedActivity());
mNfcAdapter.setOnNdefPushCompleteCallback(
this, ApplicationStatus.getLastTrackedFocusedActivity());
}
@Override
public void register() {
NfcDbManager.getInstance().addRegisteredApplication(mRequestorUrl);
}
@Override
public void unregister() {
NfcDbManager.getInstance().removeRegisteredApplication(mRequestorUrl);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
if (mNfcTransmissionInfos.isEmpty()) {
return null;
}
mLastMessageNfcTransmissionInfos =
new ArrayList<NfcTransmissionInfo>(mNfcTransmissionInfos);
NdefRecord[] records = new NdefRecord[mLastMessageNfcTransmissionInfos.size() + 1];
for (int i = 0, size = mLastMessageNfcTransmissionInfos.size(); i < size; i++) {
records[i] = NdefRecord.createMime(
"mojo/data", mLastMessageNfcTransmissionInfos.get(i).mNfcData.data);
}
records[records.length - 1] = NdefRecord.createApplicationRecord(mPackageName);
return new NdefMessage(records);
}
@Override
public void onNdefPushComplete(NfcEvent event) {
for (NfcTransmissionInfo nfcTransmissionInfo : mLastMessageNfcTransmissionInfos) {
nfcTransmissionInfo.mTransmitOnNextConnectionResponse.call(true);
removeNfcTransmissionInfo(nfcTransmissionInfo);
}
}
void removeNfcTransmissionInfo(NfcTransmissionInfo nfcTransmissionInfo) {
mNfcTransmissionInfos.remove(nfcTransmissionInfo);
if (mNfcTransmissionInfos.isEmpty()) {
mNfcAdapter.setNdefPushMessageCallback(
null, ApplicationStatus.getLastTrackedFocusedActivity());
mNfcAdapter.setOnNdefPushCompleteCallback(
null, ApplicationStatus.getLastTrackedFocusedActivity());
}
}
class NfcTransmissionInfo {
final NfcData mNfcData;
final TransmitOnNextConnectionResponse mTransmitOnNextConnectionResponse;
NfcTransmissionInfo(NfcData nfcData,
TransmitOnNextConnectionResponse transmitOnNextConnectionResponse) {
mNfcData = nfcData;
mTransmitOnNextConnectionResponse = transmitOnNextConnectionResponse;
}
}
class NfcTransmissionImpl implements NfcTransmission {
private final NfcTransmissionInfo mNfcTransmissionInfo;
public NfcTransmissionImpl(NfcTransmissionInfo nfcTransmissionInfo) {
mNfcTransmissionInfo = nfcTransmissionInfo;
}
@Override
public void close() {}
@Override
public void onConnectionError(MojoException e) {}
@Override
public void cancel() {
removeNfcTransmissionInfo(mNfcTransmissionInfo);
}
}
}