170 lines
No EOL
5.7 KiB
Java
170 lines
No EOL
5.7 KiB
Java
package com.tangem.domain.cardReader;
|
|
|
|
import android.Manifest;
|
|
import android.annotation.TargetApi;
|
|
import android.app.Activity;
|
|
import android.content.BroadcastReceiver;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentFilter;
|
|
import android.content.pm.PackageManager;
|
|
import android.nfc.NfcAdapter;
|
|
import android.nfc.Tag;
|
|
import android.nfc.tech.IsoDep;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.support.v4.app.ActivityCompat;
|
|
import android.util.Log;
|
|
|
|
import com.tangem.presentation.dialog.NFCEnableDialog;
|
|
|
|
import java.io.IOException;
|
|
|
|
public class NfcManager {
|
|
public static final String TAG = NfcManager.class.getSimpleName();
|
|
|
|
// reader mode flags: listen for type A (not B), skipping ndef check
|
|
private static final int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK | NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS;
|
|
|
|
private NfcAdapter mNfcAdapter;
|
|
private NFCEnableDialog mEnableNfcDialog;
|
|
private Activity mActivity;
|
|
private NfcAdapter.ReaderCallback mReaderCallback;
|
|
|
|
private boolean broadcomWorkaround = false;
|
|
private static final int DELAY_PRESENCE = 1500;
|
|
|
|
|
|
public NfcManager(Activity activity, NfcAdapter.ReaderCallback readerCallback) {
|
|
mActivity = activity;
|
|
mReaderCallback = readerCallback;
|
|
mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);
|
|
}
|
|
|
|
public void onResume() {
|
|
// register broadcast receiver
|
|
IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
|
|
mActivity.registerReceiver(mBroadcastReceiver, filter);
|
|
|
|
if (mNfcAdapter == null || !mNfcAdapter.isEnabled()) {
|
|
showNFCEnableDialog();
|
|
|
|
} else {
|
|
enableReaderMode();
|
|
}
|
|
}
|
|
|
|
public void onPause() {
|
|
mActivity.unregisterReceiver(mBroadcastReceiver);
|
|
disableReaderMode();
|
|
}
|
|
|
|
public void onStop() {
|
|
if (mEnableNfcDialog != null) {
|
|
mEnableNfcDialog.dismiss();
|
|
}
|
|
}
|
|
|
|
public void ignoreTag(Tag tag) throws IOException {
|
|
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
// mNfcAdapter.ignore(tag, 500, null, null);
|
|
// }else{
|
|
IsoDep isoDep = IsoDep.get(tag);
|
|
if (isoDep != null) {
|
|
isoDep.close();
|
|
}
|
|
// }
|
|
}
|
|
|
|
int errorCount = 0;
|
|
|
|
public void notifyReadResult(boolean success) {
|
|
// if (success) {
|
|
// errorCount = 0;
|
|
// } else {
|
|
// errorCount++;
|
|
// }
|
|
// if (errorCount >= 3) {
|
|
// disableReaderMode();
|
|
// mNfcAdapter = null;
|
|
//// Toast.makeText(mActivity,"NFC restarted!",Toast.LENGTH_SHORT).show();
|
|
// mActivity.runOnUiThread(() -> {
|
|
// mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity);
|
|
// enableReaderMode();
|
|
// });
|
|
// }
|
|
}
|
|
|
|
private void showNFCEnableDialog() {
|
|
mEnableNfcDialog = new NFCEnableDialog();
|
|
mEnableNfcDialog.show(mActivity.getFragmentManager(), NFCEnableDialog.TAG);
|
|
}
|
|
|
|
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
|
|
@SuppressWarnings("deprecation")
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
String action = intent.getAction();
|
|
if (action == null)
|
|
return;
|
|
if (action.equals(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)) {
|
|
int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_ON);
|
|
if (state == NfcAdapter.STATE_ON || state == NfcAdapter.STATE_TURNING_ON) {
|
|
Log.d(TAG, "state: " + state + " , dialog: " + mEnableNfcDialog);
|
|
if (mEnableNfcDialog != null) {
|
|
mEnableNfcDialog.dismiss();
|
|
}
|
|
if (state == NfcAdapter.STATE_ON) {
|
|
enableReaderMode();
|
|
}
|
|
} else {
|
|
if (mEnableNfcDialog == null || !mEnableNfcDialog.isVisible()) {
|
|
showNFCEnableDialog();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
@TargetApi(Build.VERSION_CODES.KITKAT)
|
|
private void enableReaderMode() {
|
|
Bundle options = new Bundle();
|
|
if (broadcomWorkaround) {
|
|
/* This is a work around for some Broadcom chipsets that does
|
|
* the presence check by sending commands that interrupt the
|
|
* processing of the ongoing command.
|
|
*/
|
|
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, DELAY_PRESENCE);
|
|
}
|
|
mNfcAdapter.enableReaderMode(mActivity, mReaderCallback, READER_FLAGS, options);
|
|
}
|
|
|
|
@TargetApi(Build.VERSION_CODES.KITKAT)
|
|
private void disableReaderMode() {
|
|
if (mNfcAdapter != null) {
|
|
mNfcAdapter.disableReaderMode(mActivity);
|
|
}
|
|
}
|
|
|
|
private static final int REQUEST_NFC_PERMISSIONS = 1;
|
|
private static String[] PERMISSIONS_NFC = {
|
|
Manifest.permission.NFC
|
|
};
|
|
|
|
//Checks if the app has NFC permission
|
|
//If the app does not has permission then the user will be prompted to grant permissions
|
|
public static void verifyPermissions(Activity activity) {
|
|
// Check if we have write permission
|
|
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.NFC);
|
|
|
|
if (permission != PackageManager.PERMISSION_GRANTED) {
|
|
// We don't have permission so prompt the user
|
|
ActivityCompat.requestPermissions(
|
|
activity,
|
|
PERMISSIONS_NFC,
|
|
REQUEST_NFC_PERMISSIONS
|
|
);
|
|
}
|
|
}
|
|
|
|
} |