From 1004e6d5ee586be5a31412a7db614748b054d7de Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 29 May 2023 20:32:24 +0200 Subject: [PATCH] Added OpenAI Uri option (2) --- .../faircode/email/FragmentOptionsMisc.java | 28 ++++++++++++++++++- .../main/java/eu/faircode/email/OpenAI.java | 14 ++++++++-- .../main/res/layout/fragment_options_misc.xml | 17 +++++++++-- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 2e02cedae6..2bfc6077b2 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; @@ -2432,6 +2457,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..399b59d865 100644 --- a/app/src/main/java/eu/faircode/email/OpenAI.java +++ b/app/src/main/java/eu/faircode/email/OpenAI.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; +import java.util.Objects; public class OpenAI { private static final int MAX_OPENAI_LEN = 1000; // characters @@ -53,7 +54,8 @@ public class OpenAI { boolean enabled = prefs.getBoolean("openai_enabled", false); String apikey = prefs.getString("openai_apikey", null); - return (enabled && !TextUtils.isEmpty(apikey)); + return (enabled && + (!TextUtils.isEmpty(apikey) || !Objects.equals(getUri(context), BuildConfig.OPENAI_ENDPOINT))); } static Pair getGrants(Context context) throws JSONException, IOException { @@ -154,12 +156,20 @@ public class OpenAI { return choices; } + private static String getUri(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + String endpoint = prefs.getString("openai_uri", BuildConfig.OPENAI_ENDPOINT); + if (!endpoint.endsWith("/")) + endpoint += "/"; + return 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" />