package android.nfc.tech;
import android.nfc.ErrorCodes;
import android.nfc.Tag;
import android.nfc.TransceiveResult;
import android.os.RemoteException;
import android.util.Log;
import java.io.IOException;
abstract class BasicTagTechnology implements TagTechnology {
private static final String TAG = "NFC";
final Tag mTag;
boolean mIsConnected;
int mSelectedTechnology;
BasicTagTechnology(Tag tag, int tech) throws RemoteException {
mTag = tag;
mSelectedTechnology = tech;
}
@Override
public Tag getTag() {
return mTag;
}
void checkConnected() {
if ((mTag.getConnectedTechnology() != mSelectedTechnology) ||
(mTag.getConnectedTechnology() == -1)) {
throw new IllegalStateException("Call connect() first!");
}
}
@Override
public boolean isConnected() {
if (!mIsConnected) {
return false;
}
try {
return mTag.getTagService().isPresent(mTag.getServiceHandle());
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
return false;
}
}
@Override
public void connect() throws IOException {
try {
int errorCode = mTag.getTagService().connect(mTag.getServiceHandle(),
mSelectedTechnology);
if (errorCode == ErrorCodes.SUCCESS) {
mTag.setConnectedTechnology(mSelectedTechnology);
mIsConnected = true;
} else if (errorCode == ErrorCodes.ERROR_NOT_SUPPORTED) {
throw new UnsupportedOperationException("Connecting to " +
"this technology is not supported by the NFC " +
"adapter.");
} else {
throw new IOException();
}
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
throw new IOException("NFC service died");
}
}
@Override
public void reconnect() throws IOException {
if (!mIsConnected) {
throw new IllegalStateException("Technology not connected yet");
}
try {
int errorCode = mTag.getTagService().reconnect(mTag.getServiceHandle());
if (errorCode != ErrorCodes.SUCCESS) {
mIsConnected = false;
mTag.setTechnologyDisconnected();
throw new IOException();
}
} catch (RemoteException e) {
mIsConnected = false;
mTag.setTechnologyDisconnected();
Log.e(TAG, "NFC service dead", e);
throw new IOException("NFC service died");
}
}
@Override
public void close() throws IOException {
try {
mTag.getTagService().resetTimeouts();
mTag.getTagService().reconnect(mTag.getServiceHandle());
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
} finally {
mIsConnected = false;
mTag.setTechnologyDisconnected();
}
}
int getMaxTransceiveLengthInternal() {
try {
return mTag.getTagService().getMaxTransceiveLength(mSelectedTechnology);
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
return 0;
}
}
byte[] transceive(byte[] data, boolean raw) throws IOException {
checkConnected();
try {
TransceiveResult result = mTag.getTagService().transceive(mTag.getServiceHandle(),
data, raw);
if (result == null) {
throw new IOException("transceive failed");
} else {
return result.getResponseOrThrow();
}
} catch (RemoteException e) {
Log.e(TAG, "NFC service dead", e);
throw new IOException("NFC service died");
}
}
}