add android public and public build flavors

This commit is contained in:
Xisheng-Zhao
2026-05-17 05:16:51 +08:00
parent 4fb1945bba
commit df25f2346e
6 changed files with 26 additions and 12 deletions
+16
View File
@@ -29,6 +29,22 @@ android {
buildFeatures { buildFeatures {
compose true 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\""
}
} }
} }
+2 -2
View File
@@ -6,7 +6,7 @@
android:allowBackup="true" android:allowBackup="true"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="false"> android:usesCleartextTraffic="${usesCleartextTraffic}">
<activity <activity
android:name=".ComposeVisualAuditActivity" android:name=".ComposeVisualAuditActivity"
android:theme="@style/ComposeAppTheme" android:theme="@style/ComposeAppTheme"
@@ -24,7 +24,7 @@
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="multica" /> <data android:scheme="${deepLinkScheme}" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
@@ -21,7 +21,6 @@ final class ApiClient {
T parse(JSONObject json) throws Exception; T parse(JSONObject json) throws Exception;
} }
private static final String BASE = "https://api.multica.ai";
private final AuthStore authStore; private final AuthStore authStore;
ApiClient(AuthStore authStore) { ApiClient(AuthStore authStore) {
@@ -1368,7 +1367,7 @@ final class ApiClient {
private JSONObject requestMultipart(String path, JSONObject query, JSONObject fields, String fieldName, String filename, private JSONObject requestMultipart(String path, JSONObject query, JSONObject fields, String fieldName, String filename,
String contentType, byte[] data) throws Exception { String contentType, byte[] data) throws Exception {
String boundary = "Boundary-" + System.currentTimeMillis(); String boundary = "Boundary-" + System.currentTimeMillis();
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(); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST"); conn.setRequestMethod("POST");
conn.setConnectTimeout(15000); conn.setConnectTimeout(15000);
@@ -1429,7 +1428,7 @@ final class ApiClient {
private JSONObject requestObject(String method, String path, JSONObject query, JSONObject body, private JSONObject requestObject(String method, String path, JSONObject query, JSONObject body,
Map<String, String> extraHeaders, int connectTimeoutMs, int readTimeoutMs) throws Exception { Map<String, String> 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(); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(method); conn.setRequestMethod(method);
conn.setConnectTimeout(connectTimeoutMs); conn.setConnectTimeout(connectTimeoutMs);
@@ -8,7 +8,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
final class AuthStore { final class AuthStore {
private static final String PREFS = "multica_auth";
private static final String TOKEN = "token"; private static final String TOKEN = "token";
private static final String WORKSPACE_ID = "workspace_id"; private static final String WORKSPACE_ID = "workspace_id";
private static final String LANGUAGE = "language"; private static final String LANGUAGE = "language";
@@ -18,7 +17,7 @@ final class AuthStore {
private final SharedPreferences prefs; private final SharedPreferences prefs;
AuthStore(Context context) { AuthStore(Context context) {
prefs = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE); prefs = context.getSharedPreferences(BuildConfig.MULTICA_AUTH_PREFS_NAME, Context.MODE_PRIVATE);
} }
String token() { String token() {
@@ -175,7 +175,7 @@ class ComposePilotActivity : ComponentActivity() {
val authStore = AuthStore(this) val authStore = AuthStore(this)
val api = ApiClient(authStore) val api = ApiClient(authStore)
val initialSettingsPageName = intent.getStringExtra("initial_settings_page") 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 initialIssueId = intent.getStringExtra("initial_issue_id")
val initialTabName = intent.data?.host val initialTabName = intent.data?.host
if (intent.getBooleanExtra("preview_agent_transcript", false)) { if (intent.getBooleanExtra("preview_agent_transcript", false)) {
@@ -819,7 +819,7 @@ private fun PilotLoginScreen(
MulticaPillButton( MulticaPillButton(
text = if (zh) "用浏览器打开 Web 登录" else "Open Web Sign In", text = if (zh) "用浏览器打开 Web 登录" else "Open Web Sign In",
onClick = { 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, tone = MulticaButtonTone.Ghost,
contentDescription = "Login Open Web Sign In", contentDescription = "Login Open Web Sign In",
@@ -9462,7 +9462,7 @@ private fun PilotIssueDetail(
fun copyIssueLink() { fun copyIssueLink() {
val slug = workspaceSlug.ifBlank { workspaceId } 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 val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(ClipData.newPlainText("Multica issue link", url)) clipboard.setPrimaryClip(ClipData.newPlainText("Multica issue link", url))
copyLinkMessage = if (zh) "链接已复制" else "Link copied" copyLinkMessage = if (zh) "链接已复制" else "Link copied"
@@ -21044,7 +21044,7 @@ private fun PilotRuntimeConnectRemotePage(
) )
SettingsCompactCommandRow( SettingsCompactCommandRow(
title = if (zh) "配置服务" else "Configure service", 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, showDivider = true,
) )
SettingsCompactCommandRow( SettingsCompactCommandRow(
@@ -179,7 +179,7 @@ public final class MainActivity extends Activity {
toast(t("sendCodeFailed")); 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); setContentView(root);
} }