Files
rr3-apk/decompiled-community/sources/com/firemint/realracing/fmNfcManager.java
Daniel Elliott c080f0d97f Add Discord community version (64-bit only)
- Added realracing3-community.apk (71.57 MB)
- Removed 32-bit support (armeabi-v7a)
- Only includes arm64-v8a libraries
- Decompiled source code included
- Added README-community.md with analysis
2026-02-18 15:48:36 -08:00

278 lines
10 KiB
Java

package com.firemint.realracing;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcEvent;
import android.nfc.Tag;
import android.nfc.TagLostException;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Parcelable;
import com.google.android.gms.drive.DriveFile;
import java.io.IOException;
/* loaded from: classes2.dex */
public class fmNfcManager implements NfcAdapter.CreateNdefMessageCallback {
static boolean m_bLog = true;
NdefMessage m_ndefMessage = null;
fmNfcData m_fmNfcData = null;
NfcMode m_eNfcMode = NfcMode.NfcMode_Read;
MainActivity m_activity = null;
NfcAdapter m_nfcAdapter = null;
boolean m_bForegroundDispatchEnabled = false;
public enum NfcMode {
NfcMode_Read,
NfcMode_Write
}
public native byte[] GetNfcDataToTransmitJNI();
public native void NfcMessageReceivedJNI(byte[] bArr, int i);
public void SetNfcMode(NfcMode nfcMode) {
this.m_eNfcMode = nfcMode;
if (nfcMode == NfcMode.NfcMode_Read) {
Log("Setting mode to read");
} else if (nfcMode == NfcMode.NfcMode_Write) {
Log("Setting mode to write");
}
}
public static void Log(String str) {
if (m_bLog) {
str.length();
}
}
public static void LogSeparator() {
Log("--------------------");
}
public boolean IsNfcAvailable() {
if (this.m_nfcAdapter == null) {
this.m_nfcAdapter = NfcAdapter.getDefaultAdapter(this.m_activity);
}
return this.m_nfcAdapter != null;
}
public void Initalise(Object obj) {
if (!(obj instanceof Activity)) {
Log("Failed to cast object to activity :(");
} else {
this.m_activity = (MainActivity) obj;
}
NfcAdapter defaultAdapter = NfcAdapter.getDefaultAdapter(this.m_activity);
this.m_nfcAdapter = defaultAdapter;
if (defaultAdapter != null) {
EnableForegroundDispatch();
}
}
@Override // android.nfc.NfcAdapter.CreateNdefMessageCallback
public NdefMessage createNdefMessage(NfcEvent nfcEvent) {
Log("createNdefMessage callback");
NdefMessage CreateNdefMessage = CreateNdefMessage(GetNfcDataToTransmitJNI());
this.m_ndefMessage = CreateNdefMessage;
return CreateNdefMessage;
}
public void onPause() {
DisableForegroundDispatch();
}
public void onResume() {
EnableForegroundDispatch();
}
public void HandleIntent(Intent intent) {
Log("HandleIntent");
if (intent != null) {
if (intent.getAction() != null) {
Log("Intent action: " + intent.getAction());
}
if (IsNfcAvailable()) {
if (this.m_eNfcMode == NfcMode.NfcMode_Read) {
Log("Read NFC message");
ReadNfcMessage(intent);
} else {
Log("Write NFC message");
WriteNfcMessage(intent);
}
}
}
}
public void ReadNfcMessage(Intent intent) {
Parcelable[] parcelableArrayExtra = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
if (parcelableArrayExtra != null) {
Log("Received a message :)");
if (parcelableArrayExtra.length > 0) {
for (Parcelable parcelable : parcelableArrayExtra) {
NdefMessage ndefMessage = (NdefMessage) parcelable;
if (ndefMessage != null) {
NdefRecord[] records = ndefMessage.getRecords();
if (records.length > 0) {
NdefRecord ndefRecord = records[0];
if (ndefRecord != null) {
fmNfcData fmnfcdata = new fmNfcData();
fmnfcdata.Import(ndefRecord.getPayload());
byte[] bArr = fmnfcdata.m_data;
Log("NfcMessageReceivedJNI");
NfcMessageReceivedJNI(bArr, bArr.length);
} else {
Log("NdefRecord record was null");
}
} else {
Log("NdefRecord[] records length = 0");
}
} else {
Log("Parcelable parcelableMessage was null");
}
}
return;
}
Log("Parcelable[] messages length = 0");
return;
}
Log("Parcelable[] messages was null");
}
public void WriteNfcMessage(Intent intent) {
Tag tag = (Tag) intent.getParcelableExtra("android.nfc.extra.TAG");
if (tag != null) {
fmNfcData fmnfcdata = this.m_fmNfcData;
if (fmnfcdata != null) {
WriteTag(this.m_activity, tag, fmnfcdata.GetByteArray());
} else {
Log("fmNfcData was null. Skip writing the tag");
}
}
}
@TargetApi(16)
public void WriteTag(Context context, Tag tag, byte[] bArr) {
NdefMessage ndefMessage = this.m_ndefMessage;
if (ndefMessage == null) {
ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord.createExternal("com.ea.games.r3_na", "r3.data", bArr), NdefRecord.createApplicationRecord(context.getPackageName())});
}
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
try {
ndef.connect();
if (ndef.isWritable()) {
int length = ndefMessage.toByteArray().length;
int maxSize = ndef.getMaxSize();
Log("Message size is (" + length + ")");
Log("Tag size is (" + maxSize + ")");
if (maxSize >= length) {
try {
try {
ndef.writeNdefMessage(ndefMessage);
} catch (FormatException unused) {
Log("Format exception :(");
}
} catch (TagLostException unused2) {
Log("Tag has been lost :(");
} catch (IOException unused3) {
Log("IOException :(");
}
} else {
Log("The message is too big for the tag");
}
} else {
Log("Tag is read only");
}
return;
} catch (Exception unused4) {
Log("Failed to connect to the tag");
return;
}
}
NdefFormatable ndefFormatable = NdefFormatable.get(tag);
if (ndefFormatable != null) {
try {
ndefFormatable.connect();
ndefFormatable.format(ndefMessage);
} catch (FormatException unused5) {
Log("Format exception :(");
} catch (TagLostException unused6) {
Log("Tag has been lost :(");
} catch (IOException unused7) {
Log("IOException :(");
}
}
}
public void EnableForegroundDispatch() {
if (!IsNfcAvailable() || this.m_bForegroundDispatchEnabled) {
return;
}
this.m_activity.runOnUiThread(new Runnable() { // from class: com.firemint.realracing.fmNfcManager.1
@Override // java.lang.Runnable
public void run() {
fmNfcManager.Log("Enable Foreground Dispatch");
PendingIntent activity = PendingIntent.getActivity(fmNfcManager.this.m_activity, 0, new Intent(fmNfcManager.this.m_activity, (Class<?>) MainActivity.class).addFlags(DriveFile.MODE_WRITE_ONLY), 335544320);
try {
new IntentFilter[]{new IntentFilter("android.nfc.action.TAG_DISCOVERED"), new IntentFilter("android.nfc.action.NDEF_DISCOVERED")}[0].addDataType("application/vnd.r3.data");
} catch (Exception e) {
fmNfcManager.Log("Failed to add data to intent filter. e = " + e.toString());
}
fmNfcManager fmnfcmanager = fmNfcManager.this;
fmnfcmanager.m_nfcAdapter.enableForegroundDispatch(fmnfcmanager.m_activity, activity, null, null);
fmNfcManager.this.m_bForegroundDispatchEnabled = true;
}
});
}
public void DisableForegroundDispatch() {
if (IsNfcAvailable() && this.m_bForegroundDispatchEnabled) {
this.m_activity.runOnUiThread(new Runnable() { // from class: com.firemint.realracing.fmNfcManager.2
@Override // java.lang.Runnable
public void run() {
fmNfcManager.Log("Disable Foreground Dispatch");
fmNfcManager fmnfcmanager = fmNfcManager.this;
fmnfcmanager.m_nfcAdapter.disableForegroundDispatch(fmnfcmanager.m_activity);
fmNfcManager.this.m_bForegroundDispatchEnabled = false;
}
});
}
}
@TargetApi(16)
public void SetNfcDataJNI(final byte[] bArr) {
this.m_activity.runOnUiThread(new Runnable() { // from class: com.firemint.realracing.fmNfcManager.3
@Override // java.lang.Runnable
public void run() {
fmNfcManager.Log("SetNfcDataJNI!");
fmNfcManager fmnfcmanager = fmNfcManager.this;
fmnfcmanager.m_ndefMessage = fmnfcmanager.CreateNdefMessage(bArr);
}
});
}
public NdefMessage CreateNdefMessage(byte[] bArr) {
fmNfcData fmnfcdata = new fmNfcData(bArr);
this.m_fmNfcData = fmnfcdata;
return new NdefMessage(new NdefRecord[]{NdefRecord.createExternal("com.ea.games.r3_na", "externaltype", fmnfcdata.GetByteArray()), NdefRecord.createApplicationRecord(this.m_activity.getPackageName())});
}
public void SetNfcMode(int i) {
if (i == 0) {
Log("Undefined mode!");
} else if (i == 1) {
SetNfcMode(NfcMode.NfcMode_Read);
} else if (i == 2) {
SetNfcMode(NfcMode.NfcMode_Write);
}
}
}