diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java
index bb5867e316..9386f93d4b 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java
@@ -161,6 +161,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private ImageButton ibSend;
private SwitchCompat swOpenAi;
private TextView tvOpenAiPrivacy;
+ private EditText etOpenAi;
private TextInputLayout tilOpenAi;
private EditText etOpenAiModel;
private TextView tvOpenAiTemperature;
@@ -280,7 +281,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
"deepl_enabled",
"vt_enabled", "vt_apikey",
"send_enabled", "send_host", "send_dlimit", "send_tlimit",
- "openai_enabled", "openai_apikey", "openai_model", "openai_temperature", "openai_moderation",
+ "openai_enabled", "openai_uri", "openai_apikey", "openai_model", "openai_temperature", "openai_moderation",
"updates", "weekly", "beta", "show_changelog", "announcements",
"crash_reports", "cleanup_attachments",
"watchdog", "experiments", "main_log", "main_log_memory", "protocol", "log_level", "debug", "leak_canary",
@@ -406,6 +407,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
ibSend = view.findViewById(R.id.ibSend);
swOpenAi = view.findViewById(R.id.swOpenAi);
tvOpenAiPrivacy = view.findViewById(R.id.tvOpenAiPrivacy);
+ etOpenAi = view.findViewById(R.id.etOpenAi);
tilOpenAi = view.findViewById(R.id.tilOpenAi);
etOpenAiModel = view.findViewById(R.id.etOpenAiModel);
tvOpenAiTemperature = view.findViewById(R.id.tvOpenAiTemperature);
@@ -1047,6 +1049,28 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
+ etOpenAi.setHint(BuildConfig.OPENAI_ENDPOINT);
+ etOpenAi.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // Do nothing
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ // Do nothing
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ String apikey = s.toString().trim();
+ if (TextUtils.isEmpty(apikey))
+ prefs.edit().remove("openai_uri").apply();
+ else
+ prefs.edit().putString("openai_uri", apikey).apply();
+ }
+ });
+
tilOpenAi.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -2238,6 +2262,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
"lt_key".equals(key) ||
"vt_apikey".equals(key) ||
"send_host".equals(key) ||
+ "openai_uri".equals(key) ||
"openai_apikey".equals(key) ||
"openai_model".equals(key))
return;
@@ -2430,6 +2455,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swSend.setChecked(prefs.getBoolean("send_enabled", false));
etSend.setText(prefs.getString("send_host", null));
swOpenAi.setChecked(prefs.getBoolean("openai_enabled", false));
+ etOpenAi.setText(prefs.getString("openai_uri", null));
tilOpenAi.getEditText().setText(prefs.getString("openai_apikey", null));
etOpenAiModel.setText(prefs.getString("openai_model", null));
diff --git a/app/src/main/java/eu/faircode/email/OpenAI.java b/app/src/main/java/eu/faircode/email/OpenAI.java
index b1dbbd589d..f06a43fe86 100644
--- a/app/src/main/java/eu/faircode/email/OpenAI.java
+++ b/app/src/main/java/eu/faircode/email/OpenAI.java
@@ -154,12 +154,17 @@ public class OpenAI {
return choices;
}
+ private static String getUri(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ return prefs.getString("openai_uri", BuildConfig.OPENAI_ENDPOINT);
+ }
+
private static JSONObject call(Context context, String method, String path, JSONObject args) throws JSONException, IOException {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String apikey = prefs.getString("openai_apikey", null);
// https://platform.openai.com/docs/api-reference/introduction
- Uri uri = Uri.parse(BuildConfig.OPENAI_ENDPOINT).buildUpon().appendEncodedPath(path).build();
+ Uri uri = Uri.parse(getUri(context)).buildUpon().appendEncodedPath(path).build();
Log.i("OpenAI uri=" + uri);
long start = new Date().getTime();
diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml
index 747692c4cb..8c0642f8a1 100644
--- a/app/src/main/res/layout/fragment_options_misc.xml
+++ b/app/src/main/res/layout/fragment_options_misc.xml
@@ -967,6 +967,19 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvOpenAiHint" />
+
+
+ app:layout_constraintTop_toBottomOf="@+id/etOpenAi">
+ app:constraint_referenced_ids="swOpenAi,tvOpenAiHint,tvOpenAiPrivacy,etOpenAi,tilOpenAi,ibOpenAi,etOpenAiModel,tvOpenAiTemperature,sbOpenAiTemperature" />