diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f1d2b2..4aa139d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -53,7 +53,7 @@ android:exported="false" android:taskAffinity="" /> chatLv.setSelection(chatAdapter.getCount() + 1)); diff --git a/app/src/main/java/net/devemperor/wristassist/activities/EditChatActivity.java b/app/src/main/java/net/devemperor/wristassist/activities/EditChatActivity.java index 3f894b6..c03eae7 100644 --- a/app/src/main/java/net/devemperor/wristassist/activities/EditChatActivity.java +++ b/app/src/main/java/net/devemperor/wristassist/activities/EditChatActivity.java @@ -1,6 +1,5 @@ package net.devemperor.wristassist.activities; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -9,6 +8,10 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; + import net.devemperor.wristassist.R; import net.devemperor.wristassist.database.ChatHistoryDatabaseHelper; @@ -18,7 +21,7 @@ import java.text.SimpleDateFormat; import java.util.Locale; -public class EditChatActivity extends Activity { +public class EditChatActivity extends AppCompatActivity { ScrollView editChatSv; TextView titleTv; @@ -29,6 +32,7 @@ public class EditChatActivity extends Activity { ChatHistoryDatabaseHelper chatHistoryDatabaseHelper; long id; + ActivityResultLauncher editTitleLauncher; @Override protected void onCreate(Bundle savedInstanceState) { @@ -56,26 +60,22 @@ protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException(e); } - editChatSv.requestFocus(); - } + editTitleLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + String content = result.getData().getStringExtra("net.devemperor.wristassist.input.content"); + chatHistoryDatabaseHelper.setTitle(id, content); + titleTv.setText(content); + } + }); - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (resultCode != RESULT_OK) return; - if (requestCode == 1337) { - String content = data.getStringExtra("net.devemperor.wristassist.input.content"); - chatHistoryDatabaseHelper.setTitle(id, content); - titleTv.setText(content); - } + editChatSv.requestFocus(); } public void editTitle(View view) { Intent intent = new Intent(this, InputActivity.class); intent.putExtra("net.devemperor.wristassist.input.title", getString(R.string.wristassist_edit_chat_title)); intent.putExtra("net.devemperor.wristassist.input.content", titleTv.getText().toString()); - startActivityForResult(intent, 1337); + editTitleLauncher.launch(intent); } public void deleteChat(View view) { diff --git a/app/src/main/java/net/devemperor/wristassist/activities/GalleryActivity.java b/app/src/main/java/net/devemperor/wristassist/activities/GalleryActivity.java new file mode 100644 index 0000000..b79d581 --- /dev/null +++ b/app/src/main/java/net/devemperor/wristassist/activities/GalleryActivity.java @@ -0,0 +1,105 @@ +package net.devemperor.wristassist.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MotionEvent; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityOptionsCompat; +import androidx.core.view.InputDeviceCompat; +import androidx.core.view.MotionEventCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.wear.widget.WearableRecyclerView; + +import net.devemperor.wristassist.R; +import net.devemperor.wristassist.adapters.ImageAdapter; +import net.devemperor.wristassist.database.ImageModel; +import net.devemperor.wristassist.database.ImagesDatabaseHelper; + +import java.util.List; + +public class GalleryActivity extends AppCompatActivity { + + ImagesDatabaseHelper imagesDatabaseHelper; + + WearableRecyclerView galleryWrv; + List imageData; + ImageAdapter imageAdapter; + + int currentOpenPosition = -1; + ActivityResultLauncher inputLauncher; + ActivityResultLauncher createImageLauncher; + ActivityResultLauncher openImageLauncher; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_image); + + imagesDatabaseHelper = new ImagesDatabaseHelper(this); + + galleryWrv = findViewById(R.id.activity_image_gallery_wrv); + galleryWrv.setEdgeItemsCenteringEnabled(true); + galleryWrv.setHasFixedSize(true); + galleryWrv.setLayoutManager(new GridLayoutManager(this, 3)); + imageData = imagesDatabaseHelper.getAll(); + imageData.add(0, null); + + createImageLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + int imageId = result.getData().getIntExtra("net.devemperor.wristassist.imageId", -1); + if (imageId != -1) { + imageData.add(1, imagesDatabaseHelper.get(imageId)); + imageAdapter.notifyItemInserted(1); + } + } + }); + inputLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Intent createImageIntent = new Intent(this, CreateImageActivity.class); + createImageIntent.putExtra("net.devemperor.wristassist.prompt", result.getData().getStringExtra("net.devemperor.wristassist.input.content")); + + createImageLauncher.launch(createImageIntent); + } + }); + openImageLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + if (result.getData().getBooleanExtra("net.devemperor.wristassist.input.image_deleted", false)) { + imageAdapter.getData().remove(currentOpenPosition); + imageAdapter.notifyItemRemoved(currentOpenPosition); + } + } + }); + + imageAdapter = new ImageAdapter(imageData, (menuPosition, image) -> { + if (menuPosition == 0) { + Intent inputIntent = new Intent(this, InputActivity.class); + inputIntent.putExtra("net.devemperor.wristassist.input.title", getString(R.string.wristassist_describe_image)); + inputIntent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_image_hint)); + inputIntent.putExtra("net.devemperor.wristassist.input.hands_free", getSharedPreferences("net.devemperor.wristassist", MODE_PRIVATE) + .getBoolean("net.devemperor.wristassist.hands_free", false)); + + inputLauncher.launch(inputIntent); + } else { + currentOpenPosition = menuPosition; + Intent openImageIntent = new Intent(this, OpenImageActivity.class); + openImageIntent.putExtra("net.devemperor.wristassist.imageId", imageData.get(menuPosition).getId()); + ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, image, "image"); + + openImageLauncher.launch(openImageIntent, options); + } + }); + galleryWrv.setAdapter(imageAdapter); + + galleryWrv.requestFocus(); + galleryWrv.setOnGenericMotionListener((v, ev) -> { + if (ev.getAction() == MotionEvent.ACTION_SCROLL && ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)) { + v.scrollBy(0, (int) (galleryWrv.getChildAt(0).getHeight() * -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL))); + return true; + } + return false; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/net/devemperor/wristassist/activities/ImageActivity.java b/app/src/main/java/net/devemperor/wristassist/activities/ImageActivity.java deleted file mode 100644 index 5ae793e..0000000 --- a/app/src/main/java/net/devemperor/wristassist/activities/ImageActivity.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.devemperor.wristassist.activities; - -import android.content.Intent; -import android.os.Bundle; -import android.view.MotionEvent; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityOptionsCompat; -import androidx.core.view.InputDeviceCompat; -import androidx.core.view.MotionEventCompat; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.wear.widget.WearableRecyclerView; - -import net.devemperor.wristassist.R; -import net.devemperor.wristassist.adapters.ImageAdapter; -import net.devemperor.wristassist.database.ImageModel; -import net.devemperor.wristassist.database.ImagesDatabaseHelper; - -import java.util.List; - -public class ImageActivity extends AppCompatActivity { - - ImagesDatabaseHelper imagesDatabaseHelper; - - WearableRecyclerView galleryWrv; - List imageData; - ImageAdapter imageAdapter; - - int currentOpenPosition = -1; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_image); - - imagesDatabaseHelper = new ImagesDatabaseHelper(this); - - galleryWrv = findViewById(R.id.activity_image_gallery_wrv); - galleryWrv.setEdgeItemsCenteringEnabled(true); - galleryWrv.setHasFixedSize(true); - galleryWrv.setLayoutManager(new GridLayoutManager(this, 3)); - imageData = imagesDatabaseHelper.getAll(); - imageData.add(0, null); - - imageAdapter = new ImageAdapter(imageData, (menuPosition, image) -> { - if (menuPosition == 0) { - Intent intent = new Intent(this, InputActivity.class); - intent.putExtra("net.devemperor.wristassist.input.title", getString(R.string.wristassist_describe_image)); - intent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_image_hint)); - intent.putExtra("net.devemperor.wristassist.input.hands_free", getSharedPreferences("net.devemperor.wristassist", MODE_PRIVATE) - .getBoolean("net.devemperor.wristassist.hands_free", false)); - startActivityForResult(intent, 1337); - } else { - currentOpenPosition = menuPosition; - Intent intent = new Intent(this, OpenImageActivity.class); - intent.putExtra("net.devemperor.wristassist.imageId", imageData.get(menuPosition).getId()); - ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, image, "image"); - startActivityForResult(intent, 1338, options.toBundle()); - } - }); - galleryWrv.setAdapter(imageAdapter); - - galleryWrv.requestFocus(); - galleryWrv.setOnGenericMotionListener((v, ev) -> { - if (ev.getAction() == MotionEvent.ACTION_SCROLL && ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)) { - v.scrollBy(0, (int) (galleryWrv.getChildAt(0).getHeight() * -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL))); - return true; - } - return false; - }); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK) return; - - if (requestCode == 1337) { - Intent intent = new Intent(this, CreateImageActivity.class); - intent.putExtra("net.devemperor.wristassist.prompt", data.getStringExtra("net.devemperor.wristassist.input.content")); - startActivityForResult(intent, 1339); - } - if (requestCode == 1338 && data.getBooleanExtra("net.devemperor.wristassist.input.image_deleted", false)) { - imageAdapter.getData().remove(currentOpenPosition); - imageAdapter.notifyItemRemoved(currentOpenPosition); - } - if (requestCode == 1339) { - int imageId = data.getIntExtra("net.devemperor.wristassist.imageId", -1); - if (imageId != -1) { - imageData.add(1, imagesDatabaseHelper.get(imageId)); - imageAdapter.notifyItemInserted(1); - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/net/devemperor/wristassist/activities/MainActivity.java b/app/src/main/java/net/devemperor/wristassist/activities/MainActivity.java index 3873c8b..b165f5b 100644 --- a/app/src/main/java/net/devemperor/wristassist/activities/MainActivity.java +++ b/app/src/main/java/net/devemperor/wristassist/activities/MainActivity.java @@ -1,12 +1,14 @@ package net.devemperor.wristassist.activities; -import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.ProgressBar; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.splashscreen.SplashScreen; import androidx.wear.widget.WearableLinearLayoutManager; import androidx.wear.widget.WearableRecyclerView; @@ -21,12 +23,16 @@ import java.util.ArrayList; import java.util.Random; -public class MainActivity extends Activity { +public class MainActivity extends AppCompatActivity { WearableRecyclerView mainWrv; ProgressBar mainPb; SharedPreferences sp; + ActivityResultLauncher inputLauncher; + ActivityResultLauncher inputWithSystemMessageLauncher; + ActivityResultLauncher editApiKeyLauncher; + @Override protected void onCreate(Bundle savedInstanceState) { SplashScreen.installSplashScreen(this); @@ -41,7 +47,7 @@ protected void onCreate(Bundle savedInstanceState) { Intent intent = new Intent(this, InputActivity.class); intent.putExtra("net.devemperor.wristassist.input.title", getString(R.string.wristassist_set_api_key)); intent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_api_key)); - startActivityForResult(intent, 1340); + editApiKeyLauncher.launch(intent); } else if (!sp.getBoolean("net.devemperor.wristassist.onboarding_complete", false)) { startActivity(new Intent(this, OnboardingActivity.class)); finish(); @@ -80,7 +86,7 @@ protected void onCreate(Bundle savedInstanceState) { intent = new Intent(this, SavedChatsActivity.class); startActivity(intent); } else if (menuPosition == 2) { - intent = new Intent(this, ImageActivity.class); + intent = new Intent(this, GalleryActivity.class); startActivity(intent); mainPb.setVisibility(View.VISIBLE); } else if (menuPosition == 3) { @@ -94,6 +100,34 @@ protected void onCreate(Bundle savedInstanceState) { startActivity(intent); } })); + + inputLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Intent intent = new Intent(this, ChatActivity.class); + intent.putExtra("net.devemperor.wristassist.query", result.getData().getStringExtra("net.devemperor.wristassist.input.content")); + startActivity(intent); + } + }); + + inputWithSystemMessageLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + String systemQuery = sp.getString("net.devemperor.wristassist.global_system_query", ""); + systemQuery = (systemQuery.isEmpty() ? "" : systemQuery + "\n") + result.getData().getStringExtra("net.devemperor.wristassist.input.content"); + + Intent intent = new Intent(this, ChatActivity.class); + intent.putExtra("net.devemperor.wristassist.query", result.getData().getStringExtra("net.devemperor.wristassist.input.content2")); + intent.putExtra("net.devemperor.wristassist.system_query", systemQuery); + startActivity(intent); + } + }); + + editApiKeyLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + sp.edit().putString("net.devemperor.wristassist.api_key", result.getData().getStringExtra("net.devemperor.wristassist.input.content")).apply(); + sp.edit().putBoolean("net.devemperor.wristassist.onboarding_complete", true).apply(); + } + }); + mainWrv.requestFocus(); mainWrv.postDelayed(() -> { View view = mainWrv.getChildAt(0); @@ -109,39 +143,12 @@ private void input(boolean withSystemMessage) { intent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_system_prompt)); intent.putExtra("net.devemperor.wristassist.input.title2", getString(R.string.wristassist_enter_prompt)); intent.putExtra("net.devemperor.wristassist.input.hint2", getString(R.string.wristassist_prompt)); - startActivityForResult(intent, 1338); + inputWithSystemMessageLauncher.launch(intent); } else { intent.putExtra("net.devemperor.wristassist.input.title", getString(R.string.wristassist_enter_prompt)); intent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_prompt)); intent.putExtra("net.devemperor.wristassist.input.hands_free", sp.getBoolean("net.devemperor.wristassist.hands_free", false)); - startActivityForResult(intent, 1337); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK) return; - - Intent intent; - String systemQuery = sp.getString("net.devemperor.wristassist.global_system_query", ""); - if (systemQuery.isEmpty()) systemQuery = null; - if (requestCode == 1337) { - intent = new Intent(this, ChatActivity.class); - intent.putExtra("net.devemperor.wristassist.query", data.getStringExtra("net.devemperor.wristassist.input.content")); - intent.putExtra("net.devemperor.wristassist.system_query", systemQuery); - startActivity(intent); - } - if (requestCode == 1338) { - intent = new Intent(this, ChatActivity.class); - intent.putExtra("net.devemperor.wristassist.query", data.getStringExtra("net.devemperor.wristassist.input.content2")); - systemQuery = (systemQuery == null ? "" : systemQuery + "\n") + data.getStringExtra("net.devemperor.wristassist.input.content"); - intent.putExtra("net.devemperor.wristassist.system_query", systemQuery); - startActivity(intent); - } - if (requestCode == 1340) { - sp.edit().putString("net.devemperor.wristassist.api_key", data.getStringExtra("net.devemperor.wristassist.input.content")).apply(); - sp.edit().putBoolean("net.devemperor.wristassist.onboarding_complete", true).apply(); + inputLauncher.launch(intent); } } diff --git a/app/src/main/java/net/devemperor/wristassist/activities/PreferencesFragment.java b/app/src/main/java/net/devemperor/wristassist/activities/PreferencesFragment.java index ef54633..25f93d9 100644 --- a/app/src/main/java/net/devemperor/wristassist/activities/PreferencesFragment.java +++ b/app/src/main/java/net/devemperor/wristassist/activities/PreferencesFragment.java @@ -9,6 +9,8 @@ import android.text.TextUtils; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.Preference; @@ -25,12 +27,43 @@ public class PreferencesFragment extends PreferenceFragmentCompat { SwitchPreference customServerPreference; ListPreference chatModelPreference; + ActivityResultLauncher customServerInputLauncher; + ActivityResultLauncher globalSystemPromptLauncher; + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getPreferenceManager().setSharedPreferencesName("net.devemperor.wristassist"); setPreferencesFromResource(R.xml.fragment_preferences, null); sp = getPreferenceManager().getSharedPreferences(); + customServerInputLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + String host = result.getData().getStringExtra("net.devemperor.wristassist.input.content"); + String model = result.getData().getStringExtra("net.devemperor.wristassist.input.content2"); + if (host != null && model != null) { + if (new UrlValidator().isValid(host)) { + sp.edit().putString("net.devemperor.wristassist.custom_server_host", host).apply(); + sp.edit().putString("net.devemperor.wristassist.custom_server_model", model).apply(); + chatModelPreference.setEnabled(false); + } else { + customServerPreference.setChecked(false); + chatModelPreference.setEnabled(true); + Toast.makeText(getContext(), R.string.wristassist_invalid_host, Toast.LENGTH_SHORT).show(); + } + } + } else if (result.getResultCode() == Activity.RESULT_CANCELED) { + customServerPreference.setChecked(false); + chatModelPreference.setEnabled(true); + } + }); + + globalSystemPromptLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + String systemQuery = result.getData().getStringExtra("net.devemperor.wristassist.input.content"); + sp.edit().putString("net.devemperor.wristassist.global_system_query", systemQuery).apply(); + } + }); + EditTextPreference apiKeyPreference = findPreference("net.devemperor.wristassist.api_key"); if (apiKeyPreference != null) { apiKeyPreference.setSummaryProvider((Preference.SummaryProvider) preference -> { @@ -59,14 +92,14 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { intent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_custom_host_hint)); intent.putExtra("net.devemperor.wristassist.input.title2", getString(R.string.wristassist_custom_model)); intent.putExtra("net.devemperor.wristassist.input.hint2", getString(R.string.wristassist_custom_model_hint)); - startActivityForResult(intent, 1337); + + customServerInputLauncher.launch(intent); } return true; }); } chatModelPreference = findPreference("net.devemperor.wristassist.model"); - if (chatModelPreference != null) chatModelPreference.setSummaryProvider(preference -> chatModelPreference.getEntry()); if (customServerPreference.isChecked()) chatModelPreference.setEnabled(false); Preference globalSystemQueryPreference = findPreference("net.devemperor.wristassist.global_system_query"); @@ -75,10 +108,9 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { Intent intent = new Intent(getContext(), InputActivity.class); intent.putExtra("net.devemperor.wristassist.input.title", getString(R.string.wristassist_define_global_system_prompt)); intent.putExtra("net.devemperor.wristassist.input.hint", getString(R.string.wristassist_system_prompt)); - if (!sp.getString("net.devemperor.wristassist.global_system_query", "").isEmpty()) { - intent.putExtra("net.devemperor.wristassist.input.content", sp.getString("net.devemperor.wristassist.global_system_query", "")); - } - startActivityForResult(intent, 1338); + intent.putExtra("net.devemperor.wristassist.input.content", sp.getString("net.devemperor.wristassist.global_system_query", "")); + + globalSystemPromptLauncher.launch(intent); return true; }); } @@ -90,7 +122,6 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { ttsPreference.setEnabled(false); } }); - ttsPreference.setSummaryProvider(preference -> ttsPreference.getEntry()); } SwitchPreference imageModelPreference = findPreference("net.devemperor.wristassist.image_model"); @@ -104,7 +135,6 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { imageQualityPreference.setEnabled(true); imageStylePreference.setEnabled(true); imageSizePreference.setEnabled(false); - } else { imageModelPreference.setSummaryProvider(preference1 -> "DALL-E 2"); imageQualityPreference.setEnabled(false); @@ -137,30 +167,4 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { imageSizePreference.setSummaryProvider(preference -> imageSizePreference.getEntry()); } } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == Activity.RESULT_OK && requestCode == 1337) { - String host = data.getStringExtra("net.devemperor.wristassist.input.content"); - String model = data.getStringExtra("net.devemperor.wristassist.input.content2"); - if (host != null && model != null) { - if (new UrlValidator().isValid(host)) { - sp.edit().putString("net.devemperor.wristassist.custom_server_host", host).apply(); - sp.edit().putString("net.devemperor.wristassist.custom_server_model", model).apply(); - chatModelPreference.setEnabled(false); - } else { - customServerPreference.setChecked(false); - chatModelPreference.setEnabled(true); - Toast.makeText(getContext(), R.string.wristassist_invalid_host, Toast.LENGTH_SHORT).show(); - } - } - } else if (resultCode == Activity.RESULT_CANCELED && requestCode == 1337) { - customServerPreference.setChecked(false); - chatModelPreference.setEnabled(true); - } else if (resultCode == Activity.RESULT_OK && requestCode == 1338) { - String systemQuery = data.getStringExtra("net.devemperor.wristassist.input.content"); - sp.edit().putString("net.devemperor.wristassist.global_system_query", systemQuery).apply(); - } - } } diff --git a/app/src/main/java/net/devemperor/wristassist/activities/SavedChatsActivity.java b/app/src/main/java/net/devemperor/wristassist/activities/SavedChatsActivity.java index 2d41dc9..794a976 100644 --- a/app/src/main/java/net/devemperor/wristassist/activities/SavedChatsActivity.java +++ b/app/src/main/java/net/devemperor/wristassist/activities/SavedChatsActivity.java @@ -1,11 +1,13 @@ package net.devemperor.wristassist.activities; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MotionEvent; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.InputDeviceCompat; import androidx.core.view.MotionEventCompat; import androidx.wear.widget.WearableLinearLayoutManager; @@ -18,7 +20,7 @@ import java.util.List; -public class SavedChatsActivity extends Activity { +public class SavedChatsActivity extends AppCompatActivity { WearableRecyclerView savedChatsWrv; @@ -26,6 +28,7 @@ public class SavedChatsActivity extends Activity { SavedChatsAdapter savedChatsAdapter; int currentEditPosition = -1; + ActivityResultLauncher editChatLauncher; @Override protected void onCreate(Bundle savedInstanceState) { @@ -40,6 +43,18 @@ protected void onCreate(Bundle savedInstanceState) { chatHistoryDatabaseHelper = new ChatHistoryDatabaseHelper(this); List chats = chatHistoryDatabaseHelper.getAllChats(); + TextView noSavedChats = findViewById(R.id.activity_saved_chats_no_saved_chats_tv); + noSavedChats.setVisibility(chats.isEmpty() ? android.view.View.VISIBLE : android.view.View.GONE); + + editChatLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null + && result.getData().getBooleanExtra("net.devemperor.wristassist.chat_deleted", false)) { + savedChatsAdapter.getData().remove(currentEditPosition); + savedChatsAdapter.notifyItemRemoved(currentEditPosition); + noSavedChats.setVisibility(savedChatsAdapter.getData().isEmpty() ? android.view.View.VISIBLE : android.view.View.GONE); + } + }); + savedChatsAdapter = new SavedChatsAdapter(chats, (chatPosition, longClick) -> { currentEditPosition = chatPosition; Intent intent; @@ -49,13 +64,10 @@ protected void onCreate(Bundle savedInstanceState) { intent = new Intent(this, EditChatActivity.class); } intent.putExtra("net.devemperor.wristassist.chatId", chats.get(chatPosition).getId()); - startActivityForResult(intent, 1337); + editChatLauncher.launch(intent); }); savedChatsWrv.setAdapter(savedChatsAdapter); - TextView noSavedChats = findViewById(R.id.activity_saved_chats_no_saved_chats_tv); - noSavedChats.setVisibility(chats.isEmpty() ? android.view.View.VISIBLE : android.view.View.GONE); - savedChatsWrv.requestFocus(); savedChatsWrv.setOnGenericMotionListener((v, ev) -> { if (ev.getAction() == MotionEvent.ACTION_SCROLL && ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER) && !chats.isEmpty()) { @@ -65,15 +77,4 @@ protected void onCreate(Bundle savedInstanceState) { return false; }); } - - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK) return; - - if (requestCode == 1337 && data.getBooleanExtra("net.devemperor.wristassist.chat_deleted", false)) { - savedChatsAdapter.getData().remove(currentEditPosition); - savedChatsAdapter.notifyItemRemoved(currentEditPosition); - findViewById(R.id.activity_saved_chats_no_saved_chats_tv).setVisibility(savedChatsAdapter.getData().isEmpty() ? android.view.View.VISIBLE : android.view.View.GONE); - } - } } diff --git a/app/src/main/java/net/devemperor/wristassist/adapters/ChatAdapter.java b/app/src/main/java/net/devemperor/wristassist/adapters/ChatAdapter.java index da72500..b8dbe35 100644 --- a/app/src/main/java/net/devemperor/wristassist/adapters/ChatAdapter.java +++ b/app/src/main/java/net/devemperor/wristassist/adapters/ChatAdapter.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -52,11 +53,14 @@ public class ChatAdapter extends ArrayAdapter { boolean ttsEnabled = false; String lastText = ""; Markwon markwon; + SharedPreferences sp; public ChatAdapter(@NonNull Context context, @NonNull List objects) { super(context, -1, objects); this.context = context; this.objects = objects; + + sp = context.getSharedPreferences("net.devemperor.wristassist", Context.MODE_PRIVATE); markwon = Markwon.builder(context) .usePlugin(StrikethroughPlugin.create()) .usePlugin(HtmlPlugin.create()) @@ -64,8 +68,7 @@ public ChatAdapter(@NonNull Context context, @NonNull List objects) { .usePlugin(TaskListPlugin.create(context)) .build(); - if (!context.getSharedPreferences("net.devemperor.wristassist", Context.MODE_PRIVATE) - .getString("net.devemperor.wristassist.tts", "off").equals("off")) { + if (!sp.getString("net.devemperor.wristassist.tts", "off").equals("off")) { tts = new TextToSpeech(context, status -> { if (status == TextToSpeech.SUCCESS) { ttsEnabled = true; @@ -90,8 +93,7 @@ public View getView (int position, View convertView, @NonNull ViewGroup parent) View listItem = LayoutInflater.from(context).inflate(R.layout.item_chat, parent, false); TextView chatItem = listItem.findViewById(R.id.item_chat_content_tv); - chatItem.setTextSize(context.getSharedPreferences("net.devemperor.wristassist", Context.MODE_PRIVATE) - .getInt("net.devemperor.wristassist.font_size", 15)); + chatItem.setTextSize(sp.getInt("net.devemperor.wristassist.font_size", 15)); ChatMessage chatMessage = objects.get(position).getChatMessage(); chatItem.setOnClickListener(v -> launchTTS(chatMessage.getContent())); @@ -122,8 +124,7 @@ public View getView (int position, View convertView, @NonNull ViewGroup parent) setLeadingMarginSpan(chatItem, icon); long totalCost = objects.get(position).getTotalCost(); - if (totalCost > 0 && context.getSharedPreferences("net.devemperor.wristassist", Context.MODE_PRIVATE) - .getBoolean("net.devemperor.wristassist.show_cost", false)) { + if (totalCost > 0 && sp.getBoolean("net.devemperor.wristassist.show_cost", false)) { TextView chatItemCost = listItem.findViewById(R.id.item_chat_cost_tv); chatItemCost.setText(df.format(totalCost / 1000.0) + " k"); chatItemCost.setVisibility(View.VISIBLE); @@ -143,8 +144,7 @@ public void launchTTS(String text) { lastText = text; Bundle params = new Bundle(); - params.putFloat(TextToSpeech.Engine.KEY_PARAM_VOLUME, context.getSharedPreferences("net.devemperor.wristassist", Context.MODE_PRIVATE) - .getInt("net.devemperor.wristassist.tts_volume", 5) / 10f); + params.putFloat(TextToSpeech.Engine.KEY_PARAM_VOLUME, sp.getInt("net.devemperor.wristassist.tts_volume", 5) / 10f); langId.identifyLanguage(text).addOnSuccessListener(languageCode -> { if (tts.isLanguageAvailable(Locale.forLanguageTag(languageCode)) < TextToSpeech.LANG_AVAILABLE) { Toast.makeText(context, R.string.wristassist_tts_lang_not_available, Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/res/xml/fragment_preferences.xml b/app/src/main/res/xml/fragment_preferences.xml index e4a2b9f..4a8cf94 100644 --- a/app/src/main/res/xml/fragment_preferences.xml +++ b/app/src/main/res/xml/fragment_preferences.xml @@ -15,7 +15,8 @@ app:negativeButtonText="@string/wristassist_cancel" app:entries="@array/models_chat" app:entryValues="@array/models_chat_values" - app:dialogTitle=" "/> + app:dialogTitle=" " + app:summary="%s"/> + app:negativeButtonText="@string/wristassist_cancel" + app:summary="%s"/>