diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d40b198e7..89664029c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -78,11 +78,15 @@
-
+
+
+
+
+
diff --git a/build/apk/AndroidManifest.xml b/build/apk/AndroidManifest.xml
index ddc2aaf04..64ee0eaeb 100644
Binary files a/build/apk/AndroidManifest.xml and b/build/apk/AndroidManifest.xml differ
diff --git a/build/apk/classes2.dex b/build/apk/classes2.dex
index 15a955ce8..61eb4c01a 100644
Binary files a/build/apk/classes2.dex and b/build/apk/classes2.dex differ
diff --git a/build/apk/res/layout/activity_server_selection.xml b/build/apk/res/layout/activity_server_selection.xml
new file mode 100644
index 000000000..fcb19ff89
Binary files /dev/null and b/build/apk/res/layout/activity_server_selection.xml differ
diff --git a/build/apk/res/layout/dialog_server_input.xml b/build/apk/res/layout/dialog_server_input.xml
new file mode 100644
index 000000000..4dc4c1d45
Binary files /dev/null and b/build/apk/res/layout/dialog_server_input.xml differ
diff --git a/build/apk/res/xml/network_security_config.xml b/build/apk/res/xml/network_security_config.xml
index e356236a4..c9bc0f314 100644
Binary files a/build/apk/res/xml/network_security_config.xml and b/build/apk/res/xml/network_security_config.xml differ
diff --git a/build/apk/resources.arsc b/build/apk/resources.arsc
index 52fd679b8..11c83b8ad 100644
Binary files a/build/apk/resources.arsc and b/build/apk/resources.arsc differ
diff --git a/build/resources.zip b/build/resources.zip
index 5072157fa..b17cb7fbf 100644
Binary files a/build/resources.zip and b/build/resources.zip differ
diff --git a/res/layout/activity_server_selection.xml b/res/layout/activity_server_selection.xml
new file mode 100644
index 000000000..58079246d
--- /dev/null
+++ b/res/layout/activity_server_selection.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/dialog_server_input.xml b/res/layout/dialog_server_input.xml
new file mode 100644
index 000000000..9d2c5399e
--- /dev/null
+++ b/res/layout/dialog_server_input.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/network_security_config.xml b/res/xml/network_security_config.xml
index 23600d965..3346e0e60 100644
--- a/res/xml/network_security_config.xml
+++ b/res/xml/network_security_config.xml
@@ -1,6 +1 @@
-
-
-
- 127.0.0.1
-
-
+
\ No newline at end of file
diff --git a/smali_classes2/com/firemint/realracing/MainActivity.smali b/smali_classes2/com/firemint/realracing/MainActivity.smali
index c6dc7af02..a0a8793c8 100644
--- a/smali_classes2/com/firemint/realracing/MainActivity.smali
+++ b/smali_classes2/com/firemint/realracing/MainActivity.smali
@@ -2238,6 +2238,49 @@
:cond_0
invoke-static {p0}, Lcom/firemint/realracing/AppProxy;->SetActivity(Landroid/app/Activity;)V
+ # Check if launched from ServerSelectionActivity
+ invoke-virtual {p0}, Lcom/firemint/realracing/MainActivity;->getIntent()Landroid/content/Intent;
+
+ move-result-object v0
+
+ if-eqz v0, :skip_server_config
+
+ const-string v1, "mode"
+
+ invoke-virtual {v0, v1}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object v1
+
+ if-eqz v1, :skip_server_config
+
+ const-string v2, "online"
+
+ invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v2
+
+ if-eqz v2, :skip_server_config
+
+ # Online mode - set up custom server
+ const-string v1, "serverUrl"
+
+ invoke-virtual {v0, v1}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object v0
+
+ if-eqz v0, :skip_server_config
+
+ invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z
+
+ move-result v1
+
+ if-nez v1, :skip_server_config
+
+ # Set custom server URL for Nimble SDK
+ invoke-static {v0}, Lcom/firemint/realracing/ServerManager;->setCustomServer(Ljava/lang/String;)V
+
+ :skip_server_config
+
# Delayed initialization of offline managers (500ms delay to prevent crash)
# This allows Android system to fully initialize Context, SharedPreferences, etc.
iget-object v0, p0, Lcom/firemint/realracing/MainActivity;->handler:Landroid/os/Handler;
diff --git a/smali_classes2/com/firemint/realracing/ServerManager.smali b/smali_classes2/com/firemint/realracing/ServerManager.smali
new file mode 100644
index 000000000..2ac521358
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerManager.smali
@@ -0,0 +1,121 @@
+.class public Lcom/firemint/realracing/ServerManager;
+.super Ljava/lang/Object;
+.source "ServerManager.java"
+
+
+# direct methods
+.method public constructor ()V
+ .locals 0
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+.method public static setCustomServer(Ljava/lang/String;)V
+ .locals 4
+
+ const-string v0, "RealRacing3"
+
+ :try_start_0
+ new-instance v1, Ljava/lang/StringBuilder;
+
+ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
+
+ const-string v2, "\ud83c\udf0e Setting custom server: "
+
+ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object v1
+
+ invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
+
+ invoke-static {}, Lcom/ea/nimble/SynergyEnvironment;->getComponent()Lcom/ea/nimble/ISynergyEnvironment;
+
+ move-result-object v1
+
+ if-nez v1, :cond_0
+
+ const-string p0, "\u26a0\ufe0f Nimble SDK not initialized, custom server cannot be set"
+
+ invoke-static {v0, p0}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
+
+ return-void
+
+ :cond_0
+ const-string v2, "synergy.director"
+
+ invoke-interface {v1, v2, p0}, Lcom/ea/nimble/ISynergyEnvironment;->setServerUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/ea/nimble/Error;
+
+ const-string v2, "synergy.user"
+
+ invoke-interface {v1, v2, p0}, Lcom/ea/nimble/ISynergyEnvironment;->setServerUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/ea/nimble/Error;
+
+ const-string v2, "synergy.product"
+
+ invoke-interface {v1, v2, p0}, Lcom/ea/nimble/ISynergyEnvironment;->setServerUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/ea/nimble/Error;
+
+ const-string v2, "synergy.tracking"
+
+ invoke-interface {v1, v2, p0}, Lcom/ea/nimble/ISynergyEnvironment;->setServerUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/ea/nimble/Error;
+
+ const-string v2, "synergy.s2s"
+
+ invoke-interface {v1, v2, p0}, Lcom/ea/nimble/ISynergyEnvironment;->setServerUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/ea/nimble/Error;
+
+ const-string v2, "synergy.drm"
+
+ invoke-interface {v1, v2, p0}, Lcom/ea/nimble/ISynergyEnvironment;->setServerUrl(Ljava/lang/String;Ljava/lang/String;)Lcom/ea/nimble/Error;
+
+ new-instance v1, Ljava/lang/StringBuilder;
+
+ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
+
+ const-string v2, "\u2705 Successfully configured community server: "
+
+ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p0
+
+ invoke-static {v0, p0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
+ :try_end_0
+ .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0
+
+ goto :goto_0
+
+ :catch_0
+ move-exception p0
+
+ new-instance v1, Ljava/lang/StringBuilder;
+
+ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
+
+ const-string v2, "\u274c Error setting custom server: "
+
+ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p0}, Ljava/lang/Exception;->getMessage()Ljava/lang/String;
+
+ move-result-object v2
+
+ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object v1
+
+ invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
+
+ invoke-virtual {p0}, Ljava/lang/Exception;->printStackTrace()V
+
+ :goto_0
+ return-void
+.end method
diff --git a/smali_classes2/com/firemint/realracing/ServerSelectionActivity$1.smali b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$1.smali
new file mode 100644
index 000000000..cb99a89aa
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$1.smali
@@ -0,0 +1,150 @@
+.class Lcom/firemint/realracing/ServerSelectionActivity$1;
+.super Ljava/lang/Object;
+.source "ServerSelectionActivity.java"
+
+# interfaces
+.implements Landroid/content/DialogInterface$OnClickListener;
+
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingMethod;
+ value = Lcom/firemint/realracing/ServerSelectionActivity;->showServerInputDialog()V
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x0
+ name = null
+.end annotation
+
+
+# instance fields
+.field final synthetic this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+.field final synthetic val$etServerUrl:Landroid/widget/EditText;
+
+.field final synthetic val$cbRemember:Landroid/widget/CheckBox;
+
+.field final synthetic val$rgPreset:Landroid/widget/RadioGroup;
+
+
+# direct methods
+.method constructor (Lcom/firemint/realracing/ServerSelectionActivity;Landroid/widget/RadioGroup;Landroid/widget/EditText;Landroid/widget/CheckBox;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ iput-object p2, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->val$rgPreset:Landroid/widget/RadioGroup;
+
+ iput-object p3, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->val$etServerUrl:Landroid/widget/EditText;
+
+ iput-object p4, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->val$cbRemember:Landroid/widget/CheckBox;
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public onClick(Landroid/content/DialogInterface;I)V
+ .locals 3
+
+ iget-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->val$rgPreset:Landroid/widget/RadioGroup;
+
+ invoke-virtual {p1}, Landroid/widget/RadioGroup;->getCheckedRadioButtonId()I
+
+ move-result p1
+
+ const p2, 0x7f0a083e
+
+ const-string v0, "https://rr3.barrer.net:8443"
+
+ if-ne p1, p2, :cond_0
+
+ move-object p1, v0
+
+ goto :goto_0
+
+ :cond_0
+ const p2, 0x7f0a083c
+
+ if-ne p1, p2, :cond_1
+
+ const-string p1, "http://localhost:3000"
+
+ goto :goto_0
+
+ :cond_1
+ iget-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->val$etServerUrl:Landroid/widget/EditText;
+
+ invoke-virtual {p1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
+
+ move-result-object p1
+
+ invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-virtual {p1}, Ljava/lang/String;->trim()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-virtual {p1}, Ljava/lang/String;->isEmpty()Z
+
+ move-result p2
+
+ if-eqz p2, :cond_2
+
+ move-object p1, v0
+
+ :cond_2
+ :goto_0
+ iget-object p2, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->val$cbRemember:Landroid/widget/CheckBox;
+
+ invoke-virtual {p2}, Landroid/widget/CheckBox;->isChecked()Z
+
+ move-result p2
+
+ if-eqz p2, :cond_3
+
+ iget-object p2, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ const-string v0, "rr3_server_config"
+
+ const/4 v1, 0x0
+
+ invoke-virtual {p2, v0, v1}, Lcom/firemint/realracing/ServerSelectionActivity;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
+
+ move-result-object p2
+
+ invoke-interface {p2}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;
+
+ move-result-object p2
+
+ const-string v0, "mode"
+
+ const-string v1, "online"
+
+ invoke-interface {p2, v0, v1}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
+
+ const-string v0, "serverUrl"
+
+ invoke-interface {p2, v0, p1}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
+
+ const-string v0, "skip_selection"
+
+ const/4 v2, 0x1
+
+ invoke-interface {p2, v0, v2}, Landroid/content/SharedPreferences$Editor;->putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;
+
+ invoke-interface {p2}, Landroid/content/SharedPreferences$Editor;->apply()V
+
+ :cond_3
+ iget-object p2, p0, Lcom/firemint/realracing/ServerSelectionActivity$1;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ const-string v0, "online"
+
+ invoke-static {p2, v0, p1}, Lcom/firemint/realracing/ServerSelectionActivity;->access$000(Lcom/firemint/realracing/ServerSelectionActivity;Ljava/lang/String;Ljava/lang/String;)V
+
+ return-void
+.end method
diff --git a/smali_classes2/com/firemint/realracing/ServerSelectionActivity$2.smali b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$2.smali
new file mode 100644
index 000000000..f81208e94
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$2.smali
@@ -0,0 +1,43 @@
+.class Lcom/firemint/realracing/ServerSelectionActivity$2;
+.super Ljava/lang/Object;
+.source "ServerSelectionActivity.java"
+
+# interfaces
+.implements Landroid/content/DialogInterface$OnClickListener;
+
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingMethod;
+ value = Lcom/firemint/realracing/ServerSelectionActivity;->showServerInputDialog()V
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x0
+ name = null
+.end annotation
+
+
+# instance fields
+.field final synthetic this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+
+# direct methods
+.method constructor (Lcom/firemint/realracing/ServerSelectionActivity;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$2;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public onClick(Landroid/content/DialogInterface;I)V
+ .locals 0
+
+ invoke-interface {p1}, Landroid/content/DialogInterface;->dismiss()V
+
+ return-void
+.end method
diff --git a/smali_classes2/com/firemint/realracing/ServerSelectionActivity$3.smali b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$3.smali
new file mode 100644
index 000000000..f9c138ef7
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$3.smali
@@ -0,0 +1,49 @@
+.class Lcom/firemint/realracing/ServerSelectionActivity$3;
+.super Ljava/lang/Object;
+.source "ServerSelectionActivity.java"
+
+# interfaces
+.implements Landroid/view/View$OnClickListener;
+
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingMethod;
+ value = Lcom/firemint/realracing/ServerSelectionActivity;->onCreate(Landroid/os/Bundle;)V
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x0
+ name = null
+.end annotation
+
+
+# instance fields
+.field final synthetic this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+
+# direct methods
+.method constructor (Lcom/firemint/realracing/ServerSelectionActivity;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$3;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public onClick(Landroid/view/View;)V
+ .locals 2
+
+ iget-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$3;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ const-string v0, "offline"
+
+ const-string v1, ""
+
+ invoke-static {p1, v0, v1}, Lcom/firemint/realracing/ServerSelectionActivity;->access$000(Lcom/firemint/realracing/ServerSelectionActivity;Ljava/lang/String;Ljava/lang/String;)V
+
+ return-void
+.end method
diff --git a/smali_classes2/com/firemint/realracing/ServerSelectionActivity$4.smali b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$4.smali
new file mode 100644
index 000000000..2a793645c
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$4.smali
@@ -0,0 +1,45 @@
+.class Lcom/firemint/realracing/ServerSelectionActivity$4;
+.super Ljava/lang/Object;
+.source "ServerSelectionActivity.java"
+
+# interfaces
+.implements Landroid/view/View$OnClickListener;
+
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingMethod;
+ value = Lcom/firemint/realracing/ServerSelectionActivity;->onCreate(Landroid/os/Bundle;)V
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x0
+ name = null
+.end annotation
+
+
+# instance fields
+.field final synthetic this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+
+# direct methods
+.method constructor (Lcom/firemint/realracing/ServerSelectionActivity;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$4;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public onClick(Landroid/view/View;)V
+ .locals 0
+
+ iget-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$4;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ invoke-static {p1}, Lcom/firemint/realracing/ServerSelectionActivity;->access$100(Lcom/firemint/realracing/ServerSelectionActivity;)V
+
+ return-void
+.end method
diff --git a/smali_classes2/com/firemint/realracing/ServerSelectionActivity$5.smali b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$5.smali
new file mode 100644
index 000000000..b0ec38349
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerSelectionActivity$5.smali
@@ -0,0 +1,67 @@
+.class Lcom/firemint/realracing/ServerSelectionActivity$5;
+.super Ljava/lang/Object;
+.source "ServerSelectionActivity.java"
+
+# interfaces
+.implements Landroid/view/View$OnClickListener;
+
+
+# annotations
+.annotation system Ldalvik/annotation/EnclosingMethod;
+ value = Lcom/firemint/realracing/ServerSelectionActivity;->onCreate(Landroid/os/Bundle;)V
+.end annotation
+
+.annotation system Ldalvik/annotation/InnerClass;
+ accessFlags = 0x0
+ name = null
+.end annotation
+
+
+# instance fields
+.field final synthetic this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+
+# direct methods
+.method constructor (Lcom/firemint/realracing/ServerSelectionActivity;)V
+ .locals 0
+
+ iput-object p1, p0, Lcom/firemint/realracing/ServerSelectionActivity$5;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ invoke-direct {p0}, Ljava/lang/Object;->()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public onClick(Landroid/view/View;)V
+ .locals 2
+
+ new-instance p1, Landroid/app/AlertDialog$Builder;
+
+ iget-object v0, p0, Lcom/firemint/realracing/ServerSelectionActivity$5;->this$0:Lcom/firemint/realracing/ServerSelectionActivity;
+
+ invoke-direct {p1, v0}, Landroid/app/AlertDialog$Builder;->(Landroid/content/Context;)V
+
+ const-string v0, "Community Server Help"
+
+ invoke-virtual {p1, v0}, Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
+
+ const-string v0, "OFFLINE MODE:\nPlay with unlimited currency and all features unlocked. No internet required.\n\nONLINE MODE:\nConnect to a community server for multiplayer, events, and custom content.\n\nServer URL format:\nhttps://your-server.com:8443\n\nVisit rr3.barrer.net for more info!"
+
+ invoke-virtual {p1, v0}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
+
+ const-string v0, "OK"
+
+ const/4 v1, 0x0
+
+ invoke-virtual {p1, v0, v1}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
+
+ invoke-virtual {p1}, Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;
+
+ move-result-object p1
+
+ invoke-virtual {p1}, Landroid/app/AlertDialog;->show()V
+
+ return-void
+.end method
diff --git a/smali_classes2/com/firemint/realracing/ServerSelectionActivity.smali b/smali_classes2/com/firemint/realracing/ServerSelectionActivity.smali
new file mode 100644
index 000000000..707633d6b
--- /dev/null
+++ b/smali_classes2/com/firemint/realracing/ServerSelectionActivity.smali
@@ -0,0 +1,233 @@
+.class public Lcom/firemint/realracing/ServerSelectionActivity;
+.super Landroid/app/Activity;
+.source "ServerSelectionActivity.java"
+
+
+# direct methods
+.method public constructor ()V
+ .locals 0
+
+ invoke-direct {p0}, Landroid/app/Activity;->()V
+
+ return-void
+.end method
+
+.method static synthetic access$000(Lcom/firemint/realracing/ServerSelectionActivity;Ljava/lang/String;Ljava/lang/String;)V
+ .locals 0
+
+ invoke-direct {p0, p1, p2}, Lcom/firemint/realracing/ServerSelectionActivity;->startMainActivity(Ljava/lang/String;Ljava/lang/String;)V
+
+ return-void
+.end method
+
+.method static synthetic access$100(Lcom/firemint/realracing/ServerSelectionActivity;)V
+ .locals 0
+
+ invoke-direct {p0}, Lcom/firemint/realracing/ServerSelectionActivity;->showServerInputDialog()V
+
+ return-void
+.end method
+
+.method private loadSavedPreferences()Z
+ .locals 4
+
+ const-string v0, "rr3_server_config"
+
+ const/4 v1, 0x0
+
+ invoke-virtual {p0, v0, v1}, Lcom/firemint/realracing/ServerSelectionActivity;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
+
+ move-result-object v0
+
+ const-string v2, "skip_selection"
+
+ invoke-interface {v0, v2, v1}, Landroid/content/SharedPreferences;->getBoolean(Ljava/lang/String;Z)Z
+
+ move-result v2
+
+ if-eqz v2, :cond_0
+
+ const-string v1, "mode"
+
+ const-string v2, "offline"
+
+ invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object v1
+
+ const-string v2, "serverUrl"
+
+ const-string v3, ""
+
+ invoke-interface {v0, v2, v3}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object v0
+
+ invoke-direct {p0, v1, v0}, Lcom/firemint/realracing/ServerSelectionActivity;->startMainActivity(Ljava/lang/String;Ljava/lang/String;)V
+
+ const/4 v0, 0x1
+
+ return v0
+
+ :cond_0
+ return v1
+.end method
+
+.method private showServerInputDialog()V
+ .locals 5
+
+ new-instance v0, Landroid/app/AlertDialog$Builder;
+
+ invoke-direct {v0, p0}, Landroid/app/AlertDialog$Builder;->(Landroid/content/Context;)V
+
+ invoke-virtual {p0}, Lcom/firemint/realracing/ServerSelectionActivity;->getLayoutInflater()Landroid/view/LayoutInflater;
+
+ move-result-object v1
+
+ const v2, 0x7f0d0157
+
+ const/4 v3, 0x0
+
+ invoke-virtual {v1, v2, v3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
+
+ move-result-object v1
+
+ const v2, 0x7f0a047a
+
+ invoke-virtual {v1, v2}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+
+ move-result-object v2
+
+ check-cast v2, Landroid/widget/EditText;
+
+ const v3, 0x7f0a0826
+
+ invoke-virtual {v1, v3}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+
+ move-result-object v3
+
+ check-cast v3, Landroid/widget/RadioGroup;
+
+ const v4, 0x7f0a0216
+
+ invoke-virtual {v1, v4}, Landroid/view/View;->findViewById(I)Landroid/view/View;
+
+ move-result-object v4
+
+ check-cast v4, Landroid/widget/CheckBox;
+
+ invoke-virtual {v0, v1}, Landroid/app/AlertDialog$Builder;->setView(Landroid/view/View;)Landroid/app/AlertDialog$Builder;
+
+ new-instance v1, Lcom/firemint/realracing/ServerSelectionActivity$1;
+
+ invoke-direct {v1, p0, v3, v2, v4}, Lcom/firemint/realracing/ServerSelectionActivity$1;->(Lcom/firemint/realracing/ServerSelectionActivity;Landroid/widget/RadioGroup;Landroid/widget/EditText;Landroid/widget/CheckBox;)V
+
+ const-string v2, "Connect"
+
+ invoke-virtual {v0, v2, v1}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
+
+ new-instance v1, Lcom/firemint/realracing/ServerSelectionActivity$2;
+
+ invoke-direct {v1, p0}, Lcom/firemint/realracing/ServerSelectionActivity$2;->(Lcom/firemint/realracing/ServerSelectionActivity;)V
+
+ const-string v2, "Cancel"
+
+ invoke-virtual {v0, v2, v1}, Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
+
+ const/4 v1, 0x0
+
+ invoke-virtual {v0, v1}, Landroid/app/AlertDialog$Builder;->setCancelable(Z)Landroid/app/AlertDialog$Builder;
+
+ invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;
+
+ move-result-object v0
+
+ invoke-virtual {v0}, Landroid/app/AlertDialog;->show()V
+
+ return-void
+.end method
+
+.method private startMainActivity(Ljava/lang/String;Ljava/lang/String;)V
+ .locals 2
+
+ # First launch UnpackAssetsActivity (extracts game files)
+ new-instance v0, Landroid/content/Intent;
+
+ const-class v1, Lcom/firemint/realracing/UnpackAssetsActivity;
+
+ invoke-direct {v0, p0, v1}, Landroid/content/Intent;->(Landroid/content/Context;Ljava/lang/Class;)V
+
+ # Pass mode and serverUrl as extras so UnpackAssetsActivity can forward them
+ const-string v1, "mode"
+
+ invoke-virtual {v0, v1, p1}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
+
+ const-string p1, "serverUrl"
+
+ invoke-virtual {v0, p1, p2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
+
+ invoke-virtual {p0, v0}, Lcom/firemint/realracing/ServerSelectionActivity;->startActivity(Landroid/content/Intent;)V
+
+ invoke-virtual {p0}, Lcom/firemint/realracing/ServerSelectionActivity;->finish()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method protected onCreate(Landroid/os/Bundle;)V
+ .locals 2
+
+ invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
+
+ invoke-direct {p0}, Lcom/firemint/realracing/ServerSelectionActivity;->loadSavedPreferences()Z
+
+ move-result p1
+
+ if-eqz p1, :cond_0
+
+ return-void
+
+ :cond_0
+ const p1, 0x7f0d001c
+
+ invoke-virtual {p0, p1}, Lcom/firemint/realracing/ServerSelectionActivity;->setContentView(I)V
+
+ const p1, 0x7f0a013a
+
+ invoke-virtual {p0, p1}, Lcom/firemint/realracing/ServerSelectionActivity;->findViewById(I)Landroid/view/View;
+
+ move-result-object p1
+
+ new-instance v0, Lcom/firemint/realracing/ServerSelectionActivity$3;
+
+ invoke-direct {v0, p0}, Lcom/firemint/realracing/ServerSelectionActivity$3;->(Lcom/firemint/realracing/ServerSelectionActivity;)V
+
+ invoke-virtual {p1, v0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ const p1, 0x7f0a013b
+
+ invoke-virtual {p0, p1}, Lcom/firemint/realracing/ServerSelectionActivity;->findViewById(I)Landroid/view/View;
+
+ move-result-object p1
+
+ new-instance v0, Lcom/firemint/realracing/ServerSelectionActivity$4;
+
+ invoke-direct {v0, p0}, Lcom/firemint/realracing/ServerSelectionActivity$4;->(Lcom/firemint/realracing/ServerSelectionActivity;)V
+
+ invoke-virtual {p1, v0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ const p1, 0x7f0a0b81
+
+ invoke-virtual {p0, p1}, Lcom/firemint/realracing/ServerSelectionActivity;->findViewById(I)Landroid/view/View;
+
+ move-result-object p1
+
+ new-instance v0, Lcom/firemint/realracing/ServerSelectionActivity$5;
+
+ invoke-direct {v0, p0}, Lcom/firemint/realracing/ServerSelectionActivity$5;->(Lcom/firemint/realracing/ServerSelectionActivity;)V
+
+ invoke-virtual {p1, v0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
+
+ return-void
+.end method