From e07e59df4e4bba68af5ad566a64d8a6c99da658f Mon Sep 17 00:00:00 2001 From: Xisheng-Zhao Date: Sun, 17 May 2026 05:16:51 +0800 Subject: [PATCH] add android public and public build flavors --- app/build.gradle | 16 ++++++++++++++++ app/src/main/AndroidManifest.xml | 4 ++-- app/src/main/java/ai/multica/app/ApiClient.java | 5 ++--- app/src/main/java/ai/multica/app/AuthStore.java | 3 +-- .../java/ai/multica/app/ComposePilotActivity.kt | 8 ++++---- .../main/java/ai/multica/app/MainActivity.java | 2 +- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b98cdc1..224b366 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,6 +29,22 @@ android { buildFeatures { compose true + buildConfig true + } + + flavorDimensions "distribution" + productFlavors { + create("public") { + dimension "distribution" + applicationId "ai.multica.app" + resValue "string", "app_name", "Multica" + manifestPlaceholders = [usesCleartextTraffic: "false", deepLinkScheme: "multica"] + buildConfigField "String", "MULTICA_ENVIRONMENT", "\"public\"" + buildConfigField "String", "MULTICA_API_BASE_URL", "\"https://api.multica.ai\"" + buildConfigField "String", "MULTICA_WEB_BASE_URL", "\"https://app.multica.ai\"" + buildConfigField "String", "MULTICA_WS_BASE_URL", "\"wss://api.multica.ai\"" + buildConfigField "String", "MULTICA_AUTH_PREFS_NAME", "\"multica_auth\"" + } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c48aff1..033711f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ android:allowBackup="true" android:label="@string/app_name" android:theme="@style/AppTheme" - android:usesCleartextTraffic="false"> + android:usesCleartextTraffic="${usesCleartextTraffic}"> - + extraHeaders, int connectTimeoutMs, int readTimeoutMs) throws Exception { - URL url = new URL(BASE + path + queryString(query)); + URL url = new URL(BuildConfig.MULTICA_API_BASE_URL + path + queryString(query)); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod(method); conn.setConnectTimeout(connectTimeoutMs); diff --git a/app/src/main/java/ai/multica/app/AuthStore.java b/app/src/main/java/ai/multica/app/AuthStore.java index 0fb28f1..b112854 100644 --- a/app/src/main/java/ai/multica/app/AuthStore.java +++ b/app/src/main/java/ai/multica/app/AuthStore.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Map; final class AuthStore { - private static final String PREFS = "multica_auth"; private static final String TOKEN = "token"; private static final String WORKSPACE_ID = "workspace_id"; private static final String LANGUAGE = "language"; @@ -18,7 +17,7 @@ final class AuthStore { private final SharedPreferences prefs; AuthStore(Context context) { - prefs = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE); + prefs = context.getSharedPreferences(BuildConfig.MULTICA_AUTH_PREFS_NAME, Context.MODE_PRIVATE); } String token() { diff --git a/app/src/main/java/ai/multica/app/ComposePilotActivity.kt b/app/src/main/java/ai/multica/app/ComposePilotActivity.kt index 9d119b3..85011fa 100644 --- a/app/src/main/java/ai/multica/app/ComposePilotActivity.kt +++ b/app/src/main/java/ai/multica/app/ComposePilotActivity.kt @@ -175,7 +175,7 @@ class ComposePilotActivity : ComponentActivity() { val authStore = AuthStore(this) val api = ApiClient(authStore) val initialSettingsPageName = intent.getStringExtra("initial_settings_page") - ?: getSharedPreferences("multica_auth", Context.MODE_PRIVATE).getString("initial_settings_page", null) + ?: getSharedPreferences(BuildConfig.MULTICA_AUTH_PREFS_NAME, Context.MODE_PRIVATE).getString("initial_settings_page", null) val initialIssueId = intent.getStringExtra("initial_issue_id") val initialTabName = intent.data?.host if (intent.getBooleanExtra("preview_agent_transcript", false)) { @@ -819,7 +819,7 @@ private fun PilotLoginScreen( MulticaPillButton( text = if (zh) "用浏览器打开 Web 登录" else "Open Web Sign In", onClick = { - context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://app.multica.ai/login"))) + context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("${BuildConfig.MULTICA_WEB_BASE_URL}/login"))) }, tone = MulticaButtonTone.Ghost, contentDescription = "Login Open Web Sign In", @@ -9462,7 +9462,7 @@ private fun PilotIssueDetail( fun copyIssueLink() { val slug = workspaceSlug.ifBlank { workspaceId } - val url = "https://app.multica.ai/$slug/issues/${data.issue.id}" + val url = "${BuildConfig.MULTICA_WEB_BASE_URL}/$slug/issues/${data.issue.id}" val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager clipboard.setPrimaryClip(ClipData.newPlainText("Multica issue link", url)) copyLinkMessage = if (zh) "链接已复制" else "Link copied" @@ -21044,7 +21044,7 @@ private fun PilotRuntimeConnectRemotePage( ) SettingsCompactCommandRow( title = if (zh) "配置服务" else "Configure service", - command = "multica config set server_url https://api.multica.ai", + command = "multica config set server_url ${BuildConfig.MULTICA_API_BASE_URL}", showDivider = true, ) SettingsCompactCommandRow( diff --git a/app/src/main/java/ai/multica/app/MainActivity.java b/app/src/main/java/ai/multica/app/MainActivity.java index 5d97f05..eda8b88 100644 --- a/app/src/main/java/ai/multica/app/MainActivity.java +++ b/app/src/main/java/ai/multica/app/MainActivity.java @@ -179,7 +179,7 @@ public final class MainActivity extends Activity { toast(t("sendCodeFailed")); }); }); - google.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://app.multica.ai/login")))); + google.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.MULTICA_WEB_BASE_URL + "/login")))); setContentView(root); }