Add decompiled reference source files

- Key Java files showing custom server implementation
- Original AndroidManifest.xml for reference
- SynergyEnvironmentImpl.java - Custom server configuration
- HttpRequest.java - HTTP implementation details
- Documentation explaining each file's purpose

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-02-17 22:06:36 -08:00
parent 7f1b3cd526
commit d144aec853
5 changed files with 1863 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
# Decompiled Reference Files
This directory contains **reference files** decompiled from Real Racing 3 APK using JADX. These files are included for:
- 📚 **Educational purposes** - Understanding how the game communicates with servers
- 🔍 **Reference documentation** - See how custom server support is implemented
- 🛠️ **Modification guidance** - Know exactly what files to modify
## ⚠️ Important Legal Notice
These files are **decompiled from the original Real Racing 3 APK** and are:
- © Electronic Arts Inc. - All rights reserved
- Included for **educational and preservation purposes only**
- **NOT** to be used for commercial purposes
- **NOT** to be redistributed outside this private repository
## 📁 Directory Structure
```
decompiled-reference/
├── com/
│ ├── ea/
│ │ └── nimble/
│ │ ├── SynergyEnvironmentImpl.java - Custom server configuration
│ │ └── SynergyRequest.java - HTTP request handling
│ └── firemonkeys/
│ └── cloudcellapi/
│ └── HttpRequest.java - Low-level HTTP implementation
└── resources/
└── AndroidManifest.xml - App manifest (original)
```
## 🔑 Key Files Explained
### SynergyEnvironmentImpl.java
**Location**: Lines 166-183 contain the custom server implementation
This file contains the `NimbleConfiguration` enum and shows how RR3 reads the custom server URL:
```java
public String getSynergyDirectorServerUrl() {
switch (this.m_configuration) {
case CUSTOMIZED:
// 🎯 This is what we're using!
return ComponentManager.getComponent(ApplicationEnvironment.class)
.getApplicationInfo()
.metaData
.getString("NimbleCustomizedSynergyServerEndpointUrl");
case LIVE:
return "https://api.firemonkeys.ea.com/";
// ... other cases
}
}
```
### HttpRequest.java
Shows how the game makes HTTP requests, including:
- JNI callbacks for response streaming
- Custom SSL certificate validation
- Header management (EAM-SESSION, EAM-USER-ID, etc.)
### AndroidManifest.xml
Original manifest showing:
- Current configuration: `com.ea.nimble.configuration = "live"`
- Package name: `com.ea.game.realracing3_row`
- Permissions and activities
- **This is the file we modify** to point to community servers
## 🎓 How to Use These Files
### For Understanding
Read these files to understand:
1. How RR3 determines which server to connect to
2. What headers are required for API calls
3. How authentication and sessions work
4. SSL/certificate validation implementation
### For Modification Reference
When modifying APKs:
1. Check `SynergyEnvironmentImpl.java` to see expected metadata keys
2. Review `AndroidManifest.xml` to see original configuration
3. Reference `HttpRequest.java` to understand HTTP implementation
### For Server Development
Use these files to:
- Understand expected API behavior
- See what headers the client sends
- Know how SSL is validated
- Implement compatible server responses
## 🔍 Decompilation Details
**Tool Used**: JADX (Java Decompiler)
- Version: JADX 1.4.7+
- Command: `jadx realracing3.apk -d decompiled/`
- Source: Real Racing 3 v14.0.1
**Quality**: These files are decompiled from Dalvik bytecode:
- ✅ Structure is accurate
- ✅ Logic flow is correct
- ⚠️ Variable names may be obfuscated
- ⚠️ Some comments are from decompiler
## 📖 Related Documentation
For complete analysis of the protocol, see:
- [NETWORK_COMMUNICATION_ANALYSIS.md](../NETWORK_COMMUNICATION_ANALYSIS.md)
For modification instructions, see:
- [APK_MODIFICATION_GUIDE.md](../APK_MODIFICATION_GUIDE.md)
## 🚫 What's NOT Included
We do **NOT** include:
- ❌ Full game source code (too large, unnecessary)
- ❌ Game assets (textures, models, sounds)
- ❌ Native libraries (.so files)
- ❌ Compiled APK files
- ❌ Obfuscated/minified classes
Only the **essential files** needed to understand custom server support are included.
## 📝 Attribution
**Original Software**: Real Racing 3
**Developer**: Firemonkeys Studios / Electronic Arts
**Decompilation**: For educational research and game preservation
---
*These files are provided for educational purposes under fair use for interoperability and preservation research.*

View File

@@ -0,0 +1,490 @@
package com.ea.nimble;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.ea.nimble.Error;
import com.ea.nimble.Log;
import com.ea.nimble.Network;
import com.ea.nimble.Persistence;
import com.ea.nimble.SynergyEnvironmentUpdater;
import java.io.Serializable;
import java.util.HashMap;
/* loaded from: classes2.dex */
public class SynergyEnvironmentImpl extends Component implements ISynergyEnvironment, LogSource {
private static final String PERSISTENCE_DATA_ID = "environmentData";
public static final int SYNERGY_APP_VERSION_OK = 0;
public static final int SYNERGY_APP_VERSION_UPDATE_RECOMMENDED = 1;
public static final int SYNERGY_APP_VERSION_UPDATE_REQUIRED = 2;
private static final String SYNERGY_INT_SERVER_URL = "https://director-int.sn.eamobile.com";
private static final String SYNERGY_LIVE_SERVER_URL = "https://syn-dir.sn.eamobile.com";
private static final String SYNERGY_STAGE_SERVER_URL = "https://director-stage.sn.eamobile.com";
public static final double SYNERGY_UPDATE_RATE_LIMIT_PERIOD_IN_SECONDS = 60.0d;
public static final double SYNERGY_UPDATE_REFRESH_PERIOD_IN_SECONDS = 300.0d;
private BaseCore m_core;
private EnvironmentDataContainer m_environmentDataContainer;
private EnvironmentDataContainer m_previousValidEnvironmentDataContainer;
private Long m_synergyEnvironmentUpdateRateLimitTriggerTimestamp;
private SynergyEnvironmentUpdater m_synergyStartupObject;
private BroadcastReceiver m_networkStatusChangeReceiver = null;
private boolean m_dataLoadedOnComponentSetup = false;
private boolean m_pendingStartupFinishedNotification = false;
@Override // com.ea.nimble.Component
public String getComponentId() {
return SynergyEnvironment.COMPONENT_ID;
}
@Override // com.ea.nimble.LogSource
public String getLogSourceTitle() {
return "SynergyEnv";
}
public SynergyEnvironmentImpl(BaseCore baseCore) {
this.m_core = baseCore;
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getEADeviceId() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getEADeviceId();
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getSynergyId() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getSynergyId();
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getSellId() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getSellId();
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getProductId() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getProductId();
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getEAHardwareId() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getEAHardwareId();
}
@Override // com.ea.nimble.ISynergyEnvironment
public Error setServerUrl(String str, String str2) {
return this.m_environmentDataContainer.setServerUrl(str, str2);
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getServerUrlWithKey(String str) {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getServerUrlWithKey(str);
}
@Override // com.ea.nimble.ISynergyEnvironment
public int getLatestAppVersionCheckResult() {
Log.Helper.LOGPUBLICFUNC(this);
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return 0;
}
return environmentDataContainer.getLatestAppVersionCheckResult();
}
@Override // com.ea.nimble.ISynergyEnvironment
public int getTrackingPostInterval() {
Log.Helper.LOGPUBLICFUNC(this);
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return -1;
}
return environmentDataContainer.getTrackingPostInterval();
}
/* renamed from: com.ea.nimble.SynergyEnvironmentImpl$3, reason: invalid class name */
public static /* synthetic */ class AnonymousClass3 {
static final /* synthetic */ int[] $SwitchMap$com$ea$nimble$NimbleConfiguration;
static {
int[] iArr = new int[NimbleConfiguration.values().length];
$SwitchMap$com$ea$nimble$NimbleConfiguration = iArr;
try {
iArr[NimbleConfiguration.INTEGRATION.ordinal()] = 1;
} catch (NoSuchFieldError unused) {
}
try {
$SwitchMap$com$ea$nimble$NimbleConfiguration[NimbleConfiguration.STAGE.ordinal()] = 2;
} catch (NoSuchFieldError unused2) {
}
try {
$SwitchMap$com$ea$nimble$NimbleConfiguration[NimbleConfiguration.LIVE.ordinal()] = 3;
} catch (NoSuchFieldError unused3) {
}
try {
$SwitchMap$com$ea$nimble$NimbleConfiguration[NimbleConfiguration.CUSTOMIZED.ordinal()] = 4;
} catch (NoSuchFieldError unused4) {
}
}
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getSynergyDirectorServerUrl(NimbleConfiguration nimbleConfiguration) {
Log.Helper.LOGPUBLICFUNC(this);
int i = AnonymousClass3.$SwitchMap$com$ea$nimble$NimbleConfiguration[nimbleConfiguration.ordinal()];
if (i == 1) {
return SYNERGY_INT_SERVER_URL;
}
if (i == 2) {
return SYNERGY_STAGE_SERVER_URL;
}
if (i == 3) {
return SYNERGY_LIVE_SERVER_URL;
}
if (i == 4) {
return NimbleApplicationConfiguration.getConfigValueAsString("NimbleCustomizedSynergyServerEndpointUrl", SYNERGY_LIVE_SERVER_URL);
}
Log.Helper.LOGF(this, "Request for Synergy Director server URL with unknown NimbleConfiguration, %d.", nimbleConfiguration);
return SYNERGY_LIVE_SERVER_URL;
}
@Override // com.ea.nimble.ISynergyEnvironment
public boolean isDataAvailable() {
Log.Helper.LOGPUBLICFUNC(this);
return this.m_environmentDataContainer != null;
}
@Override // com.ea.nimble.ISynergyEnvironment
public boolean isUpdateInProgress() {
Log.Helper.LOGPUBLICFUNC(this);
return this.m_synergyStartupObject != null;
}
@Override // com.ea.nimble.ISynergyEnvironment
public Error checkAndInitiateSynergyEnvironmentUpdate() {
Log.Helper.LOGPUBLICFUNC(this);
if (isUpdateInProgress()) {
return new Error(Error.Code.SYNERGY_ENVIRONMENT_UPDATE_FAILURE, "Update in progress.");
}
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer != null && environmentDataContainer.getMostRecentDirectorResponseTimestamp() != null) {
return new Error(Error.Code.SYNERGY_ENVIRONMENT_UPDATE_FAILURE, "Environment data already cached.");
}
if (isInSynergyEnvironmentUpdateRateLimitingPeriod()) {
Log.Helper.LOGD(this, "Attempt to re-initiate Synergy environment update blocked by rate limiting. %.2f seconds of rate limiting left", Double.valueOf(60.0d - ((System.currentTimeMillis() - this.m_synergyEnvironmentUpdateRateLimitTriggerTimestamp.longValue()) / 1000.0d)));
return new Error(Error.Code.SYNERGY_ENVIRONMENT_UPDATE_FAILURE, "Synergy environment update rate limit in effect.");
}
startSynergyEnvironmentUpdate();
return null;
}
@Override // com.ea.nimble.ISynergyEnvironment
public boolean isFeatureDisabled(String str) {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
return environmentDataContainer != null && environmentDataContainer.isFeatureDisabled(str);
}
@Override // com.ea.nimble.Component
public void setup() {
Log.Helper.LOGFUNC(this);
this.m_dataLoadedOnComponentSetup = restoreEnvironmentDataFromPersistent(true);
}
@Override // com.ea.nimble.Component
public void restore() {
Log.Helper.LOGFUNC(this);
if (this.m_dataLoadedOnComponentSetup) {
this.m_dataLoadedOnComponentSetup = false;
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_RESTORED_FROM_PERSISTENT);
} else {
restoreEnvironmentDataFromPersistent(false);
}
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null || environmentDataContainer.getMostRecentDirectorResponseTimestamp() == null || (System.currentTimeMillis() - this.m_environmentDataContainer.getMostRecentDirectorResponseTimestamp().longValue()) / 1000.0d > 300.0d) {
startSynergyEnvironmentUpdate();
} else {
checkAndInitiateSynergyEnvironmentUpdate();
}
}
@Override // com.ea.nimble.Component
public void suspend() {
Log.Helper.LOGFUNC(this);
SynergyEnvironmentUpdater synergyEnvironmentUpdater = this.m_synergyStartupObject;
if (synergyEnvironmentUpdater != null) {
synergyEnvironmentUpdater.cancel();
this.m_synergyStartupObject = null;
}
BroadcastReceiver broadcastReceiver = this.m_networkStatusChangeReceiver;
if (broadcastReceiver != null) {
Utility.unregisterReceiver(broadcastReceiver);
this.m_networkStatusChangeReceiver = null;
}
saveEnvironmentDataToPersistent();
}
@Override // com.ea.nimble.Component
public void resume() {
Log.Helper.LOGFUNC(this);
clearSynergyEnvironmentUpdateRateLimiting();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null || environmentDataContainer.getMostRecentDirectorResponseTimestamp() == null || (System.currentTimeMillis() - this.m_environmentDataContainer.getMostRecentDirectorResponseTimestamp().longValue()) / 1000.0d > 300.0d) {
startSynergyEnvironmentUpdate();
}
if (this.m_pendingStartupFinishedNotification) {
this.m_pendingStartupFinishedNotification = false;
HashMap hashMap = new HashMap();
hashMap.put("result", "1");
Log.Helper.LOGD(this, "App is running in forground, sending delayed the NOTIFICATION_STARTUP_REQUESTS_FINISHED notification", new Object[0]);
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_STARTUP_REQUESTS_FINISHED, hashMap);
}
}
@Override // com.ea.nimble.Component
public void cleanup() {
Log.Helper.LOGFUNC(this);
SynergyEnvironmentUpdater synergyEnvironmentUpdater = this.m_synergyStartupObject;
if (synergyEnvironmentUpdater != null) {
synergyEnvironmentUpdater.cancel();
this.m_synergyStartupObject = null;
}
BroadcastReceiver broadcastReceiver = this.m_networkStatusChangeReceiver;
if (broadcastReceiver != null) {
Utility.unregisterReceiver(broadcastReceiver);
this.m_networkStatusChangeReceiver = null;
}
saveEnvironmentDataToPersistent();
this.m_environmentDataContainer = null;
}
@Override // com.ea.nimble.Component
public void teardown() {
Log.Helper.LOGFUNC(this);
this.m_environmentDataContainer = null;
}
private void startSynergyEnvironmentUpdate() {
SynergyEnvironmentUpdater synergyEnvironmentUpdater;
Log.Helper.LOGFUNC(this);
synchronized (this) {
try {
if (this.m_synergyStartupObject == null) {
synergyEnvironmentUpdater = new SynergyEnvironmentUpdater(this.m_core);
this.m_synergyStartupObject = synergyEnvironmentUpdater;
} else {
synergyEnvironmentUpdater = null;
}
} catch (Throwable th) {
throw th;
}
}
if (synergyEnvironmentUpdater == null) {
Log.Helper.LOGD(this, "Attempt made to start Synergy environment update while a previous one is active. Exiting.", new Object[0]);
return;
}
if (Network.getComponent().getStatus() == Network.Status.OK) {
startSynergyEnvironmentUpdateImpl(synergyEnvironmentUpdater);
} else if (this.m_networkStatusChangeReceiver == null) {
this.m_networkStatusChangeReceiver = new BroadcastReceiver() { // from class: com.ea.nimble.SynergyEnvironmentImpl.1
@Override // android.content.BroadcastReceiver
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Global.NOTIFICATION_NETWORK_STATUS_CHANGE) && Network.getComponent().getStatus() == Network.Status.OK) {
Log.Helper.LOGD(this, "Network restored. Starting Synergy environment update.", new Object[0]);
Utility.unregisterReceiver(SynergyEnvironmentImpl.this.m_networkStatusChangeReceiver);
SynergyEnvironmentImpl.this.m_networkStatusChangeReceiver = null;
SynergyEnvironmentImpl synergyEnvironmentImpl = SynergyEnvironmentImpl.this;
synergyEnvironmentImpl.startSynergyEnvironmentUpdateImpl(synergyEnvironmentImpl.m_synergyStartupObject);
}
}
};
Log.Helper.LOGD(this, "Network not available to perform environment update. Setting receiver to listen for network status change.", new Object[0]);
Utility.registerReceiver(Global.NOTIFICATION_NETWORK_STATUS_CHANGE, this.m_networkStatusChangeReceiver);
}
}
/* JADX INFO: Access modifiers changed from: private */
public void startSynergyEnvironmentUpdateImpl(final SynergyEnvironmentUpdater synergyEnvironmentUpdater) {
Log.Helper.LOGFUNC(this);
if (synergyEnvironmentUpdater == null) {
Log.Helper.LOGD(this, "Synergy Environment Update canceled before it could start", new Object[0]);
return;
}
this.m_previousValidEnvironmentDataContainer = this.m_environmentDataContainer;
HashMap hashMap = new HashMap();
hashMap.put("result", "1");
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_STARTUP_REQUESTS_STARTED, hashMap);
synergyEnvironmentUpdater.startSynergyStartupSequence(this.m_previousValidEnvironmentDataContainer, new SynergyEnvironmentUpdater.CompletionCallback() { // from class: com.ea.nimble.SynergyEnvironmentImpl.2
@Override // com.ea.nimble.SynergyEnvironmentUpdater.CompletionCallback
public void callback(Exception exc) {
if (exc == null) {
if (SynergyEnvironmentImpl.this.m_synergyStartupObject != null && synergyEnvironmentUpdater.getEnvironmentDataContainer() != null) {
SynergyEnvironmentImpl.this.m_environmentDataContainer = synergyEnvironmentUpdater.getEnvironmentDataContainer();
SynergyEnvironmentImpl.this.saveEnvironmentDataToPersistent();
if (SynergyEnvironmentImpl.this.m_environmentDataContainer.getKeysOfDifferences(SynergyEnvironmentImpl.this.m_previousValidEnvironmentDataContainer) != null) {
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_STARTUP_ENVIRONMENT_DATA_CHANGED);
}
HashMap hashMap2 = new HashMap();
hashMap2.put("result", "1");
if (ApplicationEnvironment.isMainApplicationActive()) {
Log.Helper.LOGD(this, "App is running in forground, send the NOTIFICATION_STARTUP_REQUESTS_FINISHED notification", new Object[0]);
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_STARTUP_REQUESTS_FINISHED, hashMap2);
} else {
Log.Helper.LOGI(this, "App is not running in forground, discard the NOTIFICATION_STARTUP_REQUESTS_FINISHED notification", new Object[0]);
SynergyEnvironmentImpl.this.m_pendingStartupFinishedNotification = true;
}
} else {
Log.Helper.LOGD(this, "Synergy Environment Update object or dataContainer null at callback. Update was canceled", new Object[0]);
}
} else {
Log.Helper.LOGE(this, "StartupError(%s)", exc);
if (!(exc instanceof Error)) {
if (SynergyEnvironmentImpl.this.m_synergyStartupObject == null || synergyEnvironmentUpdater.getEnvironmentDataContainer() == null) {
Log.Helper.LOGD(this, "Synergy Environment Update object or dataContainer null at callback. More than one update was being peroformed", new Object[0]);
}
} else {
Error error = (Error) exc;
if (error.isError(Error.Code.SYNERGY_GET_DIRECTION_TIMEOUT) || error.isError(Error.Code.SYNERGY_SERVER_FULL)) {
Log.Helper.LOGD(this, "GetDirection request timed out or ServerUnavailable signal received. Start rate limiting of /getDirection call.", new Object[0]);
SynergyEnvironmentImpl.this.startSynergyEnvironmentUpdateRateLimiting();
}
}
HashMap hashMap3 = new HashMap();
hashMap3.put("result", "0");
hashMap3.put("error", exc.toString());
if (ApplicationEnvironment.isMainApplicationActive()) {
Log.Helper.LOGD(this, "App is running in forground, send the NOTIFICATION_STARTUP_REQUESTS_FINISHED notification", new Object[0]);
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_STARTUP_REQUESTS_FINISHED, hashMap3);
} else {
Log.Helper.LOGI(this, "App is not running in forground, discard the NOTIFICATION_STARTUP_REQUESTS_FINISHED notification", new Object[0]);
}
}
SynergyEnvironmentImpl.this.m_synergyStartupObject = null;
}
});
}
/* JADX INFO: Access modifiers changed from: private */
public void startSynergyEnvironmentUpdateRateLimiting() {
Log.Helper.LOGFUNC(this);
this.m_synergyEnvironmentUpdateRateLimitTriggerTimestamp = Long.valueOf(System.currentTimeMillis());
}
private boolean isInSynergyEnvironmentUpdateRateLimitingPeriod() {
Log.Helper.LOGFUNC(this);
return this.m_synergyEnvironmentUpdateRateLimitTriggerTimestamp != null && ((double) (System.currentTimeMillis() - this.m_synergyEnvironmentUpdateRateLimitTriggerTimestamp.longValue())) <= 60000.0d;
}
private void clearSynergyEnvironmentUpdateRateLimiting() {
Log.Helper.LOGFUNC(this);
this.m_synergyEnvironmentUpdateRateLimitTriggerTimestamp = null;
}
private boolean restoreEnvironmentDataFromPersistent(boolean z) {
Log.Helper.LOGFUNC(this);
Persistence persistenceForNimbleComponent = PersistenceService.getPersistenceForNimbleComponent(SynergyEnvironment.COMPONENT_ID, Persistence.Storage.CACHE);
if (persistenceForNimbleComponent != null) {
Serializable value = persistenceForNimbleComponent.getValue(PERSISTENCE_DATA_ID);
if (value == null) {
Log.Helper.LOGD(this, "Environment persistence data value not found in persistence object. Probably first install.", new Object[0]);
} else {
try {
EnvironmentDataContainer environmentDataContainer = (EnvironmentDataContainer) value;
this.m_environmentDataContainer = environmentDataContainer;
Log.Helper.LOGD(this, "Restored environment data from persistent. Restored data timestamp, %s", environmentDataContainer.getMostRecentDirectorResponseTimestamp());
if (!z) {
Utility.sendBroadcast(SynergyEnvironment.NOTIFICATION_RESTORED_FROM_PERSISTENT);
}
return true;
} catch (ClassCastException unused) {
Log.Helper.LOGE(this, "Environment persistence data value is not the expected type.", new Object[0]);
}
}
} else {
Log.Helper.LOGE(this, "Could not get environment persistence object to restore from", new Object[0]);
}
this.m_environmentDataContainer = null;
return false;
}
/* JADX INFO: Access modifiers changed from: private */
public void saveEnvironmentDataToPersistent() {
Log.Helper.LOGFUNC(this);
Persistence persistenceForNimbleComponent = PersistenceService.getPersistenceForNimbleComponent(SynergyEnvironment.COMPONENT_ID, Persistence.Storage.CACHE);
if (persistenceForNimbleComponent != null) {
Log.Helper.LOGD(this, "Saving environment data to persistent.", new Object[0]);
persistenceForNimbleComponent.setValue(PERSISTENCE_DATA_ID, this.m_environmentDataContainer);
persistenceForNimbleComponent.lambda$new$0();
return;
}
Log.Helper.LOGE(this, "Could not get environment persistence object to save to.", new Object[0]);
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getNexusClientId() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getNexusClientId();
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getNexusClientSecret() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getNexusClientSecret();
}
@Override // com.ea.nimble.ISynergyEnvironment
public String getGosMdmAppKey() {
Log.Helper.LOGPUBLICFUNC(this);
checkAndInitiateSynergyEnvironmentUpdate();
EnvironmentDataContainer environmentDataContainer = this.m_environmentDataContainer;
if (environmentDataContainer == null) {
return null;
}
return environmentDataContainer.getGosMdmAppKey();
}
}

View File

@@ -0,0 +1,144 @@
package com.ea.nimble;
import com.ea.nimble.Error;
import com.ea.nimble.IHttpRequest;
import com.ea.nimble.ISynergyRequest;
import com.ea.nimble.Log;
import com.ironsource.nb;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/* loaded from: classes2.dex */
public class SynergyRequest implements ISynergyRequest {
public String api;
public String baseUrl;
public HttpRequest httpRequest;
public ISynergyRequest.IJsonData jsonData;
private SynergyNetworkConnection m_connection = null;
public SynergyRequestPreparingCallback prepareRequestCallback;
public Map<String, String> urlParameters;
public interface SynergyRequestPreparingCallback {
void prepareRequest(SynergyRequest synergyRequest);
}
public SynergyRequest(String str, IHttpRequest.Method method, SynergyRequestPreparingCallback synergyRequestPreparingCallback) {
this.api = str;
HttpRequest httpRequest = new HttpRequest();
this.httpRequest = httpRequest;
this.prepareRequestCallback = synergyRequestPreparingCallback;
this.urlParameters = null;
this.jsonData = null;
httpRequest.method = method;
httpRequest.headers.put("Content-Type", nb.L);
this.httpRequest.headers.put("SDK-VERSION", Global.NIMBLE_RELEASE_VERSION);
this.httpRequest.headers.put("SDK-TYPE", Global.NIMBLE_ID);
String sessionId = ((SynergyNetworkImpl) SynergyNetwork.getComponent()).getSessionId();
if (Utility.validString(sessionId)) {
this.httpRequest.headers.put("EAM-SESSION", sessionId);
} else {
Log.Helper.LOGES("SynergyRequest", "Synergy Network session ID is null", new Object[0]);
}
String synergyId = SynergyIdManager.getComponent().getSynergyId();
if (Utility.validString(synergyId)) {
this.httpRequest.headers.put("EAM-USER-ID", synergyId);
}
String sellId = SynergyEnvironment.getComponent().getSellId();
if (Utility.validString(sellId)) {
this.httpRequest.headers.put("EA-SELL-ID", sellId);
}
}
@Override // com.ea.nimble.ISynergyRequest
public HttpRequest getHttpRequest() {
Log.Helper.LOGPUBLICFUNC(this);
return this.httpRequest;
}
@Override // com.ea.nimble.ISynergyRequest
public String getBaseUrl() {
Log.Helper.LOGPUBLICFUNC(this);
return this.baseUrl;
}
@Override // com.ea.nimble.ISynergyRequest
public String getApi() {
Log.Helper.LOGPUBLICFUNC(this);
return this.api;
}
public IHttpRequest.Method getMethod() {
Log.Helper.LOGPUBLICFUNC(this);
return this.httpRequest.getMethod();
}
public void setMethod(IHttpRequest.Method method) {
Log.Helper.LOGPUBLICFUNC(this);
this.httpRequest.method = method;
}
@Override // com.ea.nimble.ISynergyRequest
public Map<String, String> getUrlParameters() {
Log.Helper.LOGPUBLICFUNC(this);
return this.urlParameters;
}
@Override // com.ea.nimble.ISynergyRequest
public ISynergyRequest.IJsonData getJsonData() {
Log.Helper.LOGPUBLICFUNC(this);
return this.jsonData;
}
public void send() {
Log.Helper.LOGPUBLICFUNC(this);
this.m_connection.send();
}
public void prepare(SynergyNetworkConnection synergyNetworkConnection) {
Log.Helper.LOGFUNC(this);
this.m_connection = synergyNetworkConnection;
SynergyRequestPreparingCallback synergyRequestPreparingCallback = this.prepareRequestCallback;
if (synergyRequestPreparingCallback != null) {
synergyRequestPreparingCallback.prepareRequest(this);
} else {
send();
}
}
public void build() throws Error {
ISynergyRequest.IJsonData iJsonData;
Log.Helper.LOGFUNC(this);
if (!Utility.validString(this.baseUrl) || !Utility.validString(this.api)) {
throw new Error(Error.Code.INVALID_ARGUMENT, String.format("Invalid synergy request parameter (%s, %s) to build http request url", this.baseUrl, this.api));
}
IApplicationEnvironment component = ApplicationEnvironment.getComponent();
HashMap hashMap = new HashMap();
hashMap.put("appVer", component.getApplicationVersion());
hashMap.put("appLang", component.getShortApplicationLanguageCode());
hashMap.put("localization", component.getApplicationLanguageCode());
hashMap.put("deviceLanguage", Locale.getDefault().getLanguage());
hashMap.put(ApplicationEnvironment.NIMBLE_PARAMETER_DEVICE_LOCALE, Locale.getDefault().toString());
String eAHardwareId = SynergyEnvironment.getComponent().getEAHardwareId();
if (Utility.validString(eAHardwareId)) {
hashMap.put("hwId", eAHardwareId);
}
Map<String, String> map = this.urlParameters;
if (map != null) {
hashMap.putAll(map);
}
this.httpRequest.url = Network.generateURL(this.baseUrl + this.api, hashMap);
IHttpRequest.Method method = this.httpRequest.method;
if ((method == IHttpRequest.Method.POST || method == IHttpRequest.Method.PUT) && (iJsonData = this.jsonData) != null && iJsonData.size() > 0) {
String convertObjectToJSONString = Utility.convertObjectToJSONString(this.jsonData.getData());
this.httpRequest.data = new ByteArrayOutputStream();
try {
this.httpRequest.data.write(convertObjectToJSONString.getBytes());
} catch (IOException e) {
throw new Error(Error.Code.INVALID_ARGUMENT, "Error converting jsonData in SynergyRequest to a data stream", e);
}
}
}
}

View File

@@ -0,0 +1,116 @@
package com.firemonkeys.cloudcellapi;
import com.mbridge.msdk.newreward.function.common.MBridgeCommon;
import java.security.SecureRandom;
import java.util.List;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import org.apache.http.conn.ssl.SSLSocketFactory;
/* loaded from: classes2.dex */
public class HttpRequest {
private static final String CLASSNAME = "HttpRequest";
private static boolean s_sslContextInit = false;
public static String s_userAgent;
HttpThread m_thread = null;
private double m_serverTime = 0.0d;
private boolean m_bSSLCheck = false;
private int m_TimeoutMilliseconds = MBridgeCommon.DEFAULT_LOAD_TIMEOUT;
public native void completeCallback(long j, int i);
public native void dataCallback(long j, byte[] bArr, int i);
public native void errorCallback(long j, int i);
public boolean getSSLCheck() {
return this.m_bSSLCheck;
}
public double getServerTime() {
return this.m_serverTime;
}
public int getTimeoutMilliseconds() {
return this.m_TimeoutMilliseconds;
}
public native void headerCallback(long j, int i, Map<String, List<String>> map);
public boolean isClosed() {
return this.m_thread == null;
}
public HttpRequest() {
System.setProperty("http.keepAlive", "false");
}
public void init(String str, String str2, String str3, byte[] bArr, int i, long j, boolean z, double d, boolean z2, boolean z3, int i2) {
this.m_serverTime = d;
this.m_bSSLCheck = z2;
if (i2 > 0) {
this.m_TimeoutMilliseconds = i2 * 1000;
}
initSSLContext();
initUserAgent(str);
this.m_thread = new HttpThread(this, str2, str3, bArr, i, j, z, z3);
}
public void setClosedBySSLCheck(boolean z) {
this.m_thread.setClosedBySSLCheck(z);
}
public void shutdown() {
HttpThread httpThread = this.m_thread;
if (httpThread != null) {
httpThread.shutdown();
}
}
public void addHeader(String str, String str2) {
this.m_thread.addHeader(str, str2);
}
public void post() {
HttpThread httpThread = this.m_thread;
if (httpThread == null) {
Logging.CC_ERROR(CLASSNAME, "post() called but thread is already closed");
} else if (httpThread.isAlive()) {
Logging.CC_ERROR(CLASSNAME, "post() called but thread is already running");
} else {
this.m_thread.start();
}
}
public void close() {
HttpThread httpThread = this.m_thread;
if (httpThread != null) {
httpThread.interrupt();
}
this.m_thread = null;
}
private static void initUserAgent(String str) {
if (s_userAgent != null) {
return;
}
s_userAgent = str + " " + System.getProperty("http.agent");
StringBuilder sb = new StringBuilder();
sb.append("User Agent: ");
sb.append(s_userAgent);
Logging.CC_INFO(CLASSNAME, sb.toString());
}
private void initSSLContext() {
try {
SSLContext sSLContext = SSLContext.getInstance("TLS");
sSLContext.init(null, new TrustManager[]{new CloudcellTrustManager(this)}, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory(sSLContext.getSocketFactory()));
HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
} catch (Exception unused) {
Logging.CC_ERROR(CLASSNAME, "Exception when trying to init SSLContext!");
}
}
}

View File

@@ -0,0 +1,982 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="14001"
android:versionName="14.0.1"
android:installLocation="auto"
android:compileSdkVersion="36"
android:compileSdkVersionCodename="16"
package="com.ea.games.r3_row"
platformBuildVersionCode="36"
platformBuildVersionName="16">
<uses-sdk
android:minSdkVersion="26"
android:targetSdkVersion="36"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="23"/>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="23"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="BIND_GET_INSTALL_REFERRER_SERVICE"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<uses-permission
android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"
android:maxSdkVersion="22"/>
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
<uses-permission
android:name="android.permission.WAKE_LOCK"
android:maxSdkVersion="25"/>
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false"/>
<uses-feature
android:name="android.hardware.sensor.accelerometer"
android:required="false"/>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"/>
<uses-feature
android:name="android.hardware.gamepad"
android:required="false"/>
<uses-feature
android:glEsVersion="0x20000"
android:required="true"/>
<supports-screens
android:anyDensity="true"
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"/>
<queries>
<intent>
<action android:name="com.applovin.am.intent.action.APPHUB_SERVICE"/>
</intent>
<intent>
<action android:name="android.support.customtabs.action.CustomTabsService"/>
</intent>
<package android:name="com.facebook.katana"/>
<intent>
<action android:name="com.digitalturbine.ignite.cl.IgniteRemoteService"/>
</intent>
<intent>
<action android:name="android.intent.action.MAIN"/>
</intent>
<intent>
<action android:name="android.intent.action.VIEW"/>
</intent>
<intent>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="https"/>
</intent>
<intent>
<action android:name="android.intent.action.INSERT"/>
<data android:mimeType="vnd.android.cursor.dir/event"/>
</intent>
<intent>
<action android:name="android.intent.action.VIEW"/>
<data android:scheme="sms"/>
</intent>
<intent>
<action android:name="android.intent.action.DIAL"/>
<data android:path="tel:"/>
</intent>
<package android:name="com.google.android.gms"/>
<package android:name="com.android.vending"/>
<intent>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent>
<package android:name="com.google.ar.core"/>
<intent>
<action android:name="com.android.vending.billing.InAppBillingService.BIND"/>
</intent>
</queries>
<uses-permission android:name="com.applovin.array.apphub.permission.BIND_APPHUB_SERVICE"/>
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_ATTRIBUTION"/>
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS"/>
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_AD_ID"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE"/>
<permission
android:name="com.ea.games.r3_row.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
android:protectionLevel="signature"/>
<uses-permission android:name="com.ea.games.r3_row.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/>
<application
android:theme="@style/splashScreenTheme"
android:label="@string/app_name"
android:icon="@string/icon_name_row"
android:name="androidx.multidex.MultiDexApplication"
android:screenOrientation="sensorLandscape"
android:windowSoftInputMode="adjustNothing"
android:hardwareAccelerated="true"
android:largeHeap="true"
android:supportsRtl="true"
android:banner="@string/icon_name_tv_row"
android:isGame="true"
android:extractNativeLibs="false"
android:fullBackupContent="@xml/backup_legacy"
android:usesCleartextTraffic="false"
android:resizeableActivity="false"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@string/icon_name_round_row"
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:dataExtractionRules="@xml/backup_android12"
android:localeConfig="@xml/locale_config">
<activity
android:theme="@style/splashScreenTheme"
android:label="@string/app_name"
android:name="com.firemint.realracing.UnpackAssetsActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="sensorLandscape"
android:configChanges="smallestScreenSize|screenSize|uiMode|orientation|keyboardHidden|keyboard"
android:alwaysRetainTaskState="true"
android:hardwareAccelerated="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.apps.plus.VIEW_DEEP_LINK"/>
<data android:scheme="vnd.google.deeplink"/>
<data android:scheme="rr3"/>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
<activity
android:theme="@style/splashScreenTheme"
android:label="@string/app_name"
android:name="com.firemint.realracing.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="sensorLandscape"
android:configChanges="smallestScreenSize|screenSize|uiMode|orientation|keyboardHidden|keyboard"
android:alwaysRetainTaskState="true"
android:hardwareAccelerated="true"/>
<property
android:name="android.adservices.AD_SERVICES_CONFIG"
android:resource="@xml/gma_ad_services_config"/>
<provider
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.fileprovider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<meta-data
android:name="xperiaplayoptimized_content"
android:value="@mipmap/ic_launcher"
android:resource="@mipmap/ic_launcher"/>
<meta-data
android:name="game_display_name"
android:value="@string/app_name"
android:resource="@string/app_name"/>
<meta-data
android:name="game_icon"
android:value="@mipmap/ic_launcher"
android:resource="@mipmap/ic_launcher"/>
<meta-data
android:name="android.max_aspect"
android:value="2.4"/>
<meta-data
android:name="com.google.ar.core"
android:value="optional"/>
<receiver
android:name="com.ea.nimble.ReferrerReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER"/>
</intent-filter>
</receiver>
<receiver
android:name="com.firemint.realracing.LocalNotificationBroadcastReceiver"
android:exported="true"/>
<service
android:name="com.firemint.realracing.DelayedNotificationService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"/>
<receiver
android:name="com.firemint.realracing.BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
<meta-data
android:name="com.ea.nimble.configuration"
android:value="live"/>
<meta-data
android:name="com.ea.nimble.tracking.defaultEnable"
android:value="@string/nimble_trackingEnableFlag"/>
<meta-data
android:name="com.ea.nimble.mtx.enableVerification"
android:value="@string/nimble_mtx_enableVerification"/>
<meta-data
android:name="com.ea.nimble.mtx.reportingEnabled"
android:value="@string/nimble_mtx_reportingEnabled"/>
<meta-data
android:name="com.ea.nimble.pushtng.auth.api.key"
android:resource="@string/nimble_api_key_live"/>
<meta-data
android:name="com.ea.nimble.pushtng.auth.api.secret"
android:resource="@string/nimble_api_secret_live"/>
<service
android:name="com.firemint.realracing.RRPushService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<receiver
android:name="com.firemint.realracing.RRPushTNGBroadcastForwarder"
android:exported="true">
<intent-filter>
<action android:name="com.ea.eadp.pushnotification.FORWARD_AS_ORDERED_BROADCAST"/>
</intent-filter>
</receiver>
<service
android:name="com.firemint.realracing.RRPushTNGIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
<meta-data
android:name="com.ea.nimble.pushtng.channel.id"
android:value="@string/NOTIFICATION_CHANNEL_GENERAL_ID"/>
<meta-data
android:name="com.ea.nimble.NimbleLocalNotifications.channel.id"
android:value="@string/NOTIFICATION_CHANNEL_GENERAL_ID"/>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<meta-data
android:name="com.google.android.gms.games.APP_ID"
android:value="@string/app_id"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.google.android.gms.auth.api.signin.internal.SignInHubActivity"
android:exported="false"
android:excludeFromRecents="true"
android:windowSoftInputMode="adjustPan|stateAlwaysHidden"/>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-9518260973309814~6662120154"/>
<meta-data
android:name="com.google.android.gms.ads.AD_MANAGER_APP"
android:value="true"/>
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/fb_app_id"/>
<meta-data
android:name="com.facebook.sdk.ApplicationName"
android:value="@string/app_name"/>
<meta-data
android:name="com.facebook.sdk.ClientToken"
android:value="@string/facebook_client_token"/>
<meta-data
android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
android:value="false"/>
<meta-data
android:name="com.facebook.sdk.AutoInitEnabled"
android:value="false"/>
<activity
android:theme="@style/com_facebook_activity_theme"
android:label="@string/app_name"
android:name="com.facebook.FacebookActivity"
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden|keyboard"/>
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="@string/fb_login_protocol_scheme"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:scheme="fbconnect"
android:host="cct.com.ea.games.r3_row"/>
</intent-filter>
</activity>
<service
android:name="com.firemonkeys.cloudcellapi.AndroidAssetManagerService"
android:enabled="true"
android:exported="false"/>
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false"/>
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false"/>
<meta-data
android:name="firebase_performance_collection_enabled"
android:value="false"/>
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="false"/>
<receiver
android:name="com.vungle.warren.NetworkProviderReceiver"
android:exported="false"/>
<provider
android:name="com.applovin.sdk.AppLovinInitProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.applovininitprovider"
android:initOrder="101"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.applovin.adview.AppLovinFullscreenActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="behind"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"
android:hardwareAccelerated="true"/>
<activity
android:name="com.applovin.sdk.AppLovinWebViewActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.applovin.mediation.hybridAds.MaxHybridMRecAdActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.applovin.mediation.hybridAds.MaxHybridNativeAdActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerDetailActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerMultiAdActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerAdUnitsListActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerAdUnitWaterfallsListActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerAdUnitDetailActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerCmpNetworksListActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerTcfConsentStatusesListActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerTcfInfoListActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerTcfStringActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerTestLiveNetworkActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerTestModeNetworkActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerUnifiedFlowActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.mediation.MaxDebuggerActivity.Theme"
android:name="com.applovin.mediation.MaxDebuggerWaterfallSegmentsActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.creative.CreativeDebuggerActivity.Theme"
android:name="com.applovin.creative.MaxCreativeDebuggerActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<activity
android:theme="@style/com.applovin.creative.CreativeDebuggerActivity.Theme"
android:name="com.applovin.creative.MaxCreativeDebuggerDisplayedAdActivity"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale"/>
<service
android:name="com.applovin.impl.adview.activity.FullscreenAdService"
android:exported="false"
android:stopWithTask="false"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.facebook.ads.AudienceNetworkActivity"
android:exported="false"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation|keyboardHidden"/>
<provider
android:name="com.facebook.ads.AudienceNetworkContentProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.AudienceNetworkContentProvider"/>
<activity
android:name="com.fyber.inneractive.sdk.activities.InneractiveInternalBrowserActivity"
android:screenOrientation="fullUser"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.fyber.inneractive.sdk.activities.InneractiveFullscreenAdActivity"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.fyber.inneractive.sdk.activities.InneractiveRichMediaVideoPlayerActivityCore"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.fyber.inneractive.sdk.activities.InternalStoreWebpageActivity"
android:excludeFromRecents="true"
android:screenOrientation="sensor"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation|keyboardHidden"/>
<activity
android:name="com.fyber.inneractive.sdk.activities.FyberReportAdActivity"
android:screenOrientation="fullUser"
android:configChanges="smallestScreenSize|screenSize|screenLayout|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<meta-data
android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
android:value="true"/>
<activity
android:name="com.ironsource.sdk.controller.ControllerActivity"
android:configChanges="screenSize|orientation"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.Translucent"
android:name="com.ironsource.sdk.controller.InterstitialActivity"
android:configChanges="screenSize|orientation"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.Translucent"
android:name="com.ironsource.sdk.controller.OpenUrlActivity"
android:configChanges="screenSize|orientation"
android:hardwareAccelerated="true"/>
<activity
android:name="com.tapjoy.mraid.view.ActionHandler"
android:configChanges="screenSize|orientation|keyboardHidden"/>
<activity
android:name="com.tapjoy.mraid.view.Browser"
android:configChanges="screenSize|orientation|keyboardHidden"/>
<activity
android:theme="@android:style/Theme.NoTitleBar"
android:name="com.ironsource.mediationsdk.testSuite.TestSuiteActivity"
android:exported="false"
android:configChanges="screenSize|orientation"
android:hardwareAccelerated="true">
<meta-data
android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true"/>
</activity>
<provider
android:name="com.ironsource.lifecycle.IronsourceLifecycleProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.IronsourceLifecycleProvider"/>
<activity
android:name="com.mbridge.msdk.interstitial.view.MBInterstitialActivity"
android:excludeFromRecents="true"
android:configChanges="screenSize|orientation"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.mbridge.msdk.newreward.player.MBRewardVideoActivity"
android:excludeFromRecents="true"
android:configChanges="screenSize|orientation|keyboardHidden"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.mbridge.msdk.reward.player.MBRewardVideoActivity"
android:excludeFromRecents="true"
android:configChanges="screenSize|orientation|keyboardHidden"/>
<activity
android:theme="@style/mbridge_transparent_common_activity_style"
android:name="com.mbridge.msdk.activity.MBCommonActivity"
android:exported="false"
android:excludeFromRecents="true"
android:configChanges="orientation|keyboard"/>
<activity android:name="com.mbridge.msdk.out.LoadingActivity"/>
<receiver
android:name="com.mbridge.msdk.foundation.same.broadcast.NetWorkChangeReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<activity
android:theme="@style/TranslucentTheme"
android:name="com.tapjoy.TJAdUnitActivity"
android:configChanges="screenSize|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<activity
android:theme="@style/TranslucentTheme"
android:name="com.tapjoy.TJWebViewActivity"
android:configChanges="screenSize|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.unity3d.services.ads.adunit.AdUnitActivity"
android:exported="false"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:name="com.unity3d.services.ads.adunit.AdUnitTransparentActivity"
android:exported="false"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc"
android:hardwareAccelerated="true"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:name="com.unity3d.services.ads.adunit.AdUnitTransparentSoftwareActivity"
android:exported="false"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc"
android:hardwareAccelerated="false"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.unity3d.services.ads.adunit.AdUnitSoftwareActivity"
android:exported="false"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc"
android:hardwareAccelerated="false"/>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name="com.unity3d.ads.adplayer.FullScreenWebViewDisplay"
android:exported="false"
android:configChanges="fontScale|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc"
android:hardwareAccelerated="true"/>
<provider
android:name="androidx.startup.InitializationProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.androidx-startup">
<meta-data
android:name="androidx.lifecycle.ProcessLifecycleInitializer"
android:value="androidx.startup"/>
<meta-data
android:name="com.unity3d.services.core.configuration.AdsSdkInitializer"
android:value="androidx.startup"/>
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"/>
<meta-data
android:name="androidx.emoji2.text.EmojiCompatInitializer"
android:value="androidx.startup"/>
<meta-data
android:name="androidx.profileinstaller.ProfileInstallerInitializer"
android:value="androidx.startup"/>
</provider>
<activity
android:name="com.vungle.ads.internal.ui.VungleActivity"
android:launchMode="singleTop"
android:configChanges="smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
<uses-library
android:name="org.apache.http.legacy"
android:required="false"/>
<activity
android:theme="@style/Theme.AppCompat.NoActionBar"
android:name="com.helpshift.activities.HSMainActivity"
android:launchMode="singleTop"
android:configChanges="screenSize|orientation"/>
<activity
android:theme="@style/Theme.AppCompat.NoActionBar"
android:name="com.helpshift.activities.HSDebugActivity"
android:launchMode="singleTop"
android:configChanges="screenSize|orientation"/>
<activity
android:theme="@android:style/Theme.Translucent"
android:name="com.google.android.gms.ads.AdActivity"
android:exported="false"
android:configChanges="smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard"/>
<provider
android:name="com.google.android.gms.ads.MobileAdsInitProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.mobileadsinitprovider"
android:initOrder="100"/>
<service
android:name="com.google.android.gms.ads.AdService"
android:enabled="true"
android:exported="false"/>
<activity
android:name="com.google.android.gms.ads.OutOfContextTestingActivity"
android:exported="false"
android:configChanges="smallestScreenSize|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.google.android.gms.ads.NotificationHandlerActivity"
android:exported="false"
android:taskAffinity=""
android:excludeFromRecents="true"
android:launchMode="singleTask"/>
<property
android:name="android.adservices.AD_SERVICES_CONFIG"
android:resource="@xml/gma_ad_services_config"/>
<service
android:name="androidx.work.impl.background.systemalarm.SystemAlarmService"
android:enabled="@bool/enable_system_alarm_service_default"
android:exported="false"
android:directBootAware="false"/>
<service
android:name="androidx.work.impl.background.systemjob.SystemJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:enabled="@bool/enable_system_job_service_default"
android:exported="true"
android:directBootAware="false"/>
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:enabled="@bool/enable_system_foreground_service_default"
android:exported="false"
android:directBootAware="false"/>
<receiver
android:name="androidx.work.impl.utils.ForceStopRunnable.BroadcastReceiver"
android:enabled="true"
android:exported="false"
android:directBootAware="false"/>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy.BatteryChargingProxy"
android:enabled="false"
android:exported="false"
android:directBootAware="false">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy.BatteryNotLowProxy"
android:enabled="false"
android:exported="false"
android:directBootAware="false">
<intent-filter>
<action android:name="android.intent.action.BATTERY_OKAY"/>
<action android:name="android.intent.action.BATTERY_LOW"/>
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy.StorageNotLowProxy"
android:enabled="false"
android:exported="false"
android:directBootAware="false">
<intent-filter>
<action android:name="android.intent.action.DEVICE_STORAGE_LOW"/>
<action android:name="android.intent.action.DEVICE_STORAGE_OK"/>
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy.NetworkStateProxy"
android:enabled="false"
android:exported="false"
android:directBootAware="false">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.RescheduleReceiver"
android:enabled="false"
android:exported="false"
android:directBootAware="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.TIME_SET"/>
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxyUpdateReceiver"
android:enabled="@bool/enable_system_alarm_service_default"
android:exported="false"
android:directBootAware="false">
<intent-filter>
<action android:name="androidx.work.impl.background.systemalarm.UpdateProxies"/>
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.diagnostics.DiagnosticsReceiver"
android:permission="android.permission.DUMP"
android:enabled="true"
android:exported="true"
android:directBootAware="false">
<intent-filter>
<action android:name="androidx.work.diagnostics.REQUEST_DIAGNOSTICS"/>
</intent-filter>
</receiver>
<service
android:name="androidx.room.MultiInstanceInvalidationService"
android:exported="false"
android:directBootAware="true"/>
<service
android:name="com.google.firebase.components.ComponentDiscoveryService"
android:exported="false"
android:directBootAware="true">
<meta-data
android:name="com.google.firebase.components:com.google.firebase.perf.FirebasePerfKtxRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.perf.FirebasePerfRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingKtxRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.crashlytics.ndk.CrashlyticsNdkRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.remoteconfig.FirebaseRemoteConfigKtxRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.remoteconfig.RemoteConfigRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.crashlytics.FirebaseCrashlyticsKtxRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.crashlytics.CrashlyticsRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.analytics.connector.internal.AnalyticsConnectorRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.sessions.FirebaseSessionsRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsKtxRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.ktx.FirebaseCommonLegacyRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.FirebaseCommonKtxRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.abt.component.AbtRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
<meta-data
android:name="com.google.firebase.components:com.google.firebase.datatransport.TransportRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar"/>
</service>
<activity android:name="com.facebook.CustomTabMainActivity"/>
<service
android:name="androidx.credentials.playservices.CredentialProviderMetadataHolder"
android:enabled="true"
android:exported="false">
<meta-data
android:name="androidx.credentials.CREDENTIAL_PROVIDER_KEY"
android:value="androidx.credentials.playservices.CredentialProviderPlayServicesImpl"/>
</service>
<activity
android:theme="@style/Theme.Hidden"
android:name="androidx.credentials.playservices.HiddenActivity"
android:enabled="true"
android:exported="false"
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden"
android:fitsSystemWindows="true"/>
<activity
android:theme="@style/Theme.Hidden"
android:name="androidx.credentials.playservices.IdentityCredentialApiHiddenActivity"
android:enabled="true"
android:exported="false"
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden"
android:fitsSystemWindows="true"/>
<provider
android:name="com.google.android.gms.games.provider.PlayGamesInitProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.playgamesinitprovider"
android:initOrder="99"/>
<activity
android:theme="@style/Theme.Games.Transparent"
android:name="com.google.android.gms.games.internal.v2.resolution.GamesResolutionActivity"
android:exported="false"/>
<activity
android:theme="@style/Theme.Games.Transparent"
android:name="com.google.android.gms.games.internal.v2.appshortcuts.PlayGamesAppShortcutsActivity"
android:exported="true"/>
<meta-data
android:name="com.google.android.gms.games.version"
android:value="@string/play_games_sdk_version"/>
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:permission="com.google.android.c2dm.permission.SEND"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
</intent-filter>
<meta-data
android:name="com.google.android.gms.cloudmessaging.FINISHED_AFTER_HANDLED"
android:value="true"/>
</receiver>
<service
android:name="com.google.firebase.messaging.FirebaseMessagingService"
android:exported="false"
android:directBootAware="true">
<intent-filter android:priority="-500">
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name="com.google.android.gms.auth.api.signin.RevocationBoundService"
android:permission="com.google.android.gms.auth.api.signin.permission.REVOCATION_NOTIFICATION"
android:exported="true"
android:visibleToInstantApps="true"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.google.android.gms.common.api.GoogleApiActivity"
android:exported="false"/>
<property
android:name="android.adservices.AD_SERVICES_CONFIG"
android:resource="@xml/ga_ad_services_config"/>
<service
android:name="com.google.firebase.sessions.SessionLifecycleService"
android:enabled="true"
android:exported="false"/>
<provider
android:name="com.google.firebase.provider.FirebaseInitProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.firebaseinitprovider"
android:initOrder="100"
android:directBootAware="true"/>
<receiver
android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
android:enabled="true"
android:exported="false"/>
<service
android:name="com.google.android.gms.measurement.AppMeasurementService"
android:enabled="true"
android:exported="false"/>
<service
android:name="com.google.android.gms.measurement.AppMeasurementJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:enabled="true"
android:exported="false"/>
<uses-library
android:name="android.ext.adservices"
android:required="false"/>
<provider
android:name="com.facebook.internal.FacebookInitProvider"
android:exported="false"
android:authorities="com.ea.games.r3_row.FacebookInitProvider"/>
<receiver
android:name="com.facebook.CurrentAccessTokenExpirationBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.facebook.sdk.ACTION_CURRENT_ACCESS_TOKEN_CHANGED"/>
</intent-filter>
</receiver>
<receiver
android:name="com.facebook.AuthenticationTokenManager.CurrentAuthenticationTokenChangedBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.facebook.sdk.ACTION_CURRENT_AUTHENTICATION_TOKEN_CHANGED"/>
</intent-filter>
</receiver>
<meta-data
android:name="com.google.ar.core.min_apk_version"
android:value="220920000"/>
<activity
android:theme="@android:style/Theme.Material.Light.Dialog.Alert"
android:name="com.google.ar.core.InstallActivity"
android:exported="false"
android:excludeFromRecents="true"
android:launchMode="singleTop"
android:configChanges="screenSize|orientation|keyboardHidden"/>
<activity
android:name="com.ea.nimble.CustomTabActivity"
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden|keyboard"/>
<activity
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:name="com.ea.nimble.WebView"/>
<activity
android:name="com.ea.nimble.AuthResultActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
<receiver
android:name="com.ea.nimble.NimbleLocalNotificationReceiver"
android:exported="false"/>
<service
android:name="com.ea.nimble.pushtng.NimblePushTNGIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
<service
android:name="com.ea.nimble.pushtng.NimblePushTNGBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<meta-data
android:name="com.google.android.play.billingclient.version"
android:value="6.0.1"/>
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.android.billingclient.api.ProxyBillingActivity"
android:exported="false"
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden|keyboard"/>
<receiver
android:name="androidx.profileinstaller.ProfileInstallReceiver"
android:permission="android.permission.DUMP"
android:enabled="true"
android:exported="true"
android:directBootAware="false">
<intent-filter>
<action android:name="androidx.profileinstaller.action.INSTALL_PROFILE"/>
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.SKIP_FILE"/>
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.SAVE_PROFILE"/>
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION"/>
</intent-filter>
</receiver>
<service
android:name="com.google.android.datatransport.runtime.backends.TransportBackendDiscovery"
android:exported="false">
<meta-data
android:name="backend:com.google.android.datatransport.cct.CctBackendFactory"
android:value="cct"/>
</service>
<service
android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.JobInfoSchedulerService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.AlarmManagerSchedulerBroadcastReceiver"
android:exported="false"/>
</application>
</manifest>