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);
}