feat: Add first-launch server URL input dialog

Implements a setup dialog on first game launch that allows users to enter
their custom community server URL without rebuilding the APK.

Features:
- Server URL input dialog on first launch
- URL validation (format check)
- Connection test button
- SharedPreferences storage
- Priority: SharedPreferences > AndroidManifest.xml > EA defaults
- Activity restart flow for applying configuration

New files:
- CommunityServerManager.smali (URL management)
- ServerSetupActivity.smali + 4 inner classes (dialog UI)
- res/layout/activity_server_setup.xml (layout)
- SERVER-URL-INPUT-IMPLEMENTATION.md (docs)

Modified files:
- SynergyEnvironmentImpl.smali (SharedPreferences check priority)
- MainActivity.smali (first-launch check + onActivityResult)
- AndroidManifest.xml (declare ServerSetupActivity)

Benefits:
- One APK works with any server
- Easy server switching
- Lower barrier to entry for non-technical users
This commit is contained in:
2026-02-21 23:32:06 -08:00
parent b7fb41dd0b
commit 51be1177df
19 changed files with 1661 additions and 0 deletions

View File

@@ -0,0 +1,183 @@
.class public Lcom/firemint/realracing/CommunityServerManager;
.super Ljava/lang/Object;
.source "CommunityServerManager.java"
# static fields
.field private static final PREFS_NAME:Ljava/lang/String; = "rr3_community_server"
.field private static final KEY_SERVER_URL:Ljava/lang/String; = "server_url"
.field private static final TAG:Ljava/lang/String; = "CommunityServerManager"
# direct methods
.method public constructor <init>()V
.locals 0
.line 8
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static checkServerUrl(Landroid/content/Context;)Z
.locals 3
const-string v0, "rr3_community_server"
const/4 v1, 0x0
.line 16
invoke-virtual {p0, v0, v1}, Landroid/content/Context;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
move-result-object p0
const-string v0, "server_url"
const/4 v2, 0x0
.line 17
invoke-interface {p0, v0, v2}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object p0
if-eqz p0, :cond_0
.line 20
invoke-virtual {p0}, Ljava/lang/String;->isEmpty()Z
move-result p0
if-nez p0, :cond_0
const/4 v1, 0x1
:cond_0
return v1
.end method
.method public static clearServerUrl(Landroid/content/Context;)V
.locals 2
const-string v0, "rr3_community_server"
const/4 v1, 0x0
.line 56
invoke-virtual {p0, v0, v1}, Landroid/content/Context;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
move-result-object p0
.line 57
invoke-interface {p0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;
move-result-object p0
const-string v0, "server_url"
.line 58
invoke-interface {p0, v0}, Landroid/content/SharedPreferences$Editor;->remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
.line 59
invoke-interface {p0}, Landroid/content/SharedPreferences$Editor;->apply()V
const-string p0, "CommunityServerManager"
const-string v0, "\u274c Server URL cleared"
.line 61
invoke-static {p0, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
return-void
.end method
.method public static getServerUrl(Landroid/content/Context;)Ljava/lang/String;
.locals 3
const-string v0, "rr3_community_server"
const/4 v1, 0x0
.line 28
invoke-virtual {p0, v0, v1}, Landroid/content/Context;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
move-result-object p0
const-string v0, "server_url"
const-string v1, ""
.line 29
invoke-interface {p0, v0, v1}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object p0
.line 31
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "\ud83d\udd17 Getting server URL: "
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
const-string v1, "CommunityServerManager"
invoke-static {v1, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
return-object p0
.end method
.method public static saveServerUrl(Landroid/content/Context;Ljava/lang/String;)V
.locals 2
const-string v0, "rr3_community_server"
const/4 v1, 0x0
.line 41
invoke-virtual {p0, v0, v1}, Landroid/content/Context;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
move-result-object p0
.line 42
invoke-interface {p0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;
move-result-object p0
const-string v0, "server_url"
.line 43
invoke-interface {p0, v0, p1}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
.line 44
invoke-interface {p0}, Landroid/content/SharedPreferences$Editor;->apply()V
.line 46
new-instance p0, Ljava/lang/StringBuilder;
invoke-direct {p0}, Ljava/lang/StringBuilder;-><init>()V
const-string v0, "\u2705 Server URL saved: "
invoke-virtual {p0, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p0
const-string p1, "CommunityServerManager"
invoke-static {p1, p0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
return-void
.end method