From 471716e2675ccbfbb04081a46ae3c264c244198d Mon Sep 17 00:00:00 2001 From: parneet-guraya Date: Thu, 24 Oct 2024 16:14:22 +0530 Subject: [PATCH] hide voice input if service not available Signed-off-by: parneet-guraya --- .../java/fr/free/nrw/commons/CommonsApplication.kt | 8 ++++++++ .../commons/description/DescriptionEditActivity.kt | 3 ++- .../commons/upload/UploadMediaDetailAdapter.java | 14 ++++++++++++-- .../mediaDetails/UploadMediaDetailFragment.java | 4 +++- .../upload/UploadMediaDetailAdapterUnitTest.kt | 2 +- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt index 9ed19d6867..e35f4e9d31 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt @@ -9,6 +9,7 @@ import android.content.Intent import android.database.sqlite.SQLiteException import android.os.Build import android.os.Process +import android.speech.SpeechRecognizer import android.util.Log import androidx.multidex.MultiDexApplication import com.facebook.drawee.backends.pipeline.Fresco @@ -91,6 +92,13 @@ class CommonsApplication : MultiDexApplication() { @Inject lateinit var contributionDao: ContributionDao + /** + * Flag to check if speech recognition is available. + */ + val isVoiceRecognitionAvailable by lazy { + SpeechRecognizer.isRecognitionAvailable(this) + } + /** * Used to declare and initialize various components and dependencies */ diff --git a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt index 32c1e58291..2c9c0026fe 100644 --- a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt @@ -121,7 +121,8 @@ class DescriptionEditActivity : savedLanguageValue, descriptionAndCaptions, recentLanguagesDao, - voiceInputResultLauncher + voiceInputResultLauncher, + CommonsApplication.instance.isVoiceRecognitionAvailable ) uploadMediaDetailAdapter.setCallback { titleStringID: Int, messageStringId: Int -> showInfoAlert( diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java index 69bd318b4f..bba3f98c58 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java @@ -59,27 +59,35 @@ public class UploadMediaDetailAdapter extends private Activity activity; private final ActivityResultLauncher voiceInputResultLauncher; private SelectedVoiceIcon selectedVoiceIcon; + boolean isVoiceRecognitionAvailable; private RowItemDescriptionBinding binding; public UploadMediaDetailAdapter(Fragment fragment, String savedLanguageValue, - RecentLanguagesDao recentLanguagesDao, ActivityResultLauncher voiceInputResultLauncher) { + RecentLanguagesDao recentLanguagesDao, + ActivityResultLauncher voiceInputResultLauncher, + boolean isVoiceRecognitionAvailable) { uploadMediaDetails = new ArrayList<>(); selectedLanguages = new HashMap<>(); this.savedLanguageValue = savedLanguageValue; this.recentLanguagesDao = recentLanguagesDao; this.fragment = fragment; this.voiceInputResultLauncher = voiceInputResultLauncher; + this.isVoiceRecognitionAvailable = isVoiceRecognitionAvailable; } public UploadMediaDetailAdapter(Activity activity, final String savedLanguageValue, - List uploadMediaDetails, RecentLanguagesDao recentLanguagesDao, ActivityResultLauncher voiceInputResultLauncher) { + List uploadMediaDetails, + RecentLanguagesDao recentLanguagesDao, + ActivityResultLauncher voiceInputResultLauncher, + boolean isVoiceRecognitionAvailable) { this.uploadMediaDetails = uploadMediaDetails; selectedLanguages = new HashMap<>(); this.savedLanguageValue = savedLanguageValue; this.recentLanguagesDao = recentLanguagesDao; this.activity = activity; this.voiceInputResultLauncher = voiceInputResultLauncher; + this.isVoiceRecognitionAvailable = isVoiceRecognitionAvailable; } public void setCallback(Callback callback) { @@ -273,6 +281,7 @@ public void bind(int position) { selectedVoiceIcon = SelectedVoiceIcon.CAPTION; startSpeechInput(descriptionLanguages.getText().toString()); }); + captionInputLayout.setEndIconVisible(isVoiceRecognitionAvailable); descInputLayout.setEndIconMode(TextInputLayout.END_ICON_CUSTOM); descInputLayout.setEndIconDrawable(R.drawable.baseline_keyboard_voice); descInputLayout.setEndIconOnClickListener(v -> { @@ -280,6 +289,7 @@ public void bind(int position) { selectedVoiceIcon = SelectedVoiceIcon.DESCRIPTION; startSpeechInput(descriptionLanguages.getText().toString()); }); + descInputLayout.setEndIconVisible(isVoiceRecognitionAvailable); if (position == 0) { removeButton.setVisibility(View.GONE); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java index 53ba6b75c9..d1616756d8 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java @@ -26,6 +26,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import fr.free.nrw.commons.CameraPosition; import fr.free.nrw.commons.locationpicker.LocationPicker; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.databinding.FragmentUploadMediaDetailFragmentBinding; @@ -295,7 +296,8 @@ private void initPresenter() { */ private void initRecyclerView() { uploadMediaDetailAdapter = new UploadMediaDetailAdapter(this, - defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""), recentLanguagesDao, voiceInputResultLauncher); + defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""), recentLanguagesDao, voiceInputResultLauncher, + CommonsApplication.getInstance().isVoiceRecognitionAvailable()); uploadMediaDetailAdapter.setCallback(this::showInfoAlert); uploadMediaDetailAdapter.setEventListener(this); binding.rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext())); diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaDetailAdapterUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaDetailAdapterUnitTest.kt index c6bed9bc5f..ba5b641caf 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaDetailAdapterUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaDetailAdapterUnitTest.kt @@ -78,7 +78,7 @@ class UploadMediaDetailAdapterUnitTest { uploadMediaDetails = mutableListOf(uploadMediaDetail, uploadMediaDetail) activity = Robolectric.buildActivity(UploadActivity::class.java).get() fragment = mock(UploadMediaDetailFragment::class.java) - adapter = UploadMediaDetailAdapter(fragment, "", recentLanguagesDao, mockResultLauncher) + adapter = UploadMediaDetailAdapter(fragment, "", recentLanguagesDao, mockResultLauncher, true) context = ApplicationProvider.getApplicationContext() Whitebox.setInternalState(adapter, "uploadMediaDetails", uploadMediaDetails) Whitebox.setInternalState(adapter, "eventListener", eventListener)