Skip to content

Commit 22d8f54

Browse files
hide voice input if service not available
Signed-off-by: parneet-guraya <[email protected]>
1 parent bc065c8 commit 22d8f54

File tree

5 files changed

+26
-5
lines changed

5 files changed

+26
-5
lines changed

app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.content.Intent
99
import android.database.sqlite.SQLiteException
1010
import android.os.Build
1111
import android.os.Process
12+
import android.speech.SpeechRecognizer
1213
import android.util.Log
1314
import androidx.multidex.MultiDexApplication
1415
import com.facebook.drawee.backends.pipeline.Fresco
@@ -91,6 +92,13 @@ class CommonsApplication : MultiDexApplication() {
9192
@Inject
9293
lateinit var contributionDao: ContributionDao
9394

95+
/**
96+
* Flag to check if speech recognition is available.
97+
*/
98+
val isVoiceRecognitionAvailable by lazy {
99+
SpeechRecognizer.isRecognitionAvailable(this)
100+
}
101+
94102
/**
95103
* Used to declare and initialize various components and dependencies
96104
*/

app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ class DescriptionEditActivity :
121121
savedLanguageValue,
122122
descriptionAndCaptions,
123123
recentLanguagesDao,
124-
voiceInputResultLauncher
124+
voiceInputResultLauncher,
125+
CommonsApplication.instance.isVoiceRecognitionAvailable
125126
)
126127
uploadMediaDetailAdapter.setCallback { titleStringID: Int, messageStringId: Int ->
127128
showInfoAlert(

app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -60,27 +60,35 @@ public class UploadMediaDetailAdapter extends
6060
private Activity activity;
6161
private final ActivityResultLauncher<Intent> voiceInputResultLauncher;
6262
private SelectedVoiceIcon selectedVoiceIcon;
63+
boolean isVoiceRecognitionAvailable;
6364

6465
private RowItemDescriptionBinding binding;
6566

6667
public UploadMediaDetailAdapter(Fragment fragment, String savedLanguageValue,
67-
RecentLanguagesDao recentLanguagesDao, ActivityResultLauncher<Intent> voiceInputResultLauncher) {
68+
RecentLanguagesDao recentLanguagesDao,
69+
ActivityResultLauncher<Intent> voiceInputResultLauncher,
70+
boolean isVoiceRecognitionAvailable) {
6871
uploadMediaDetails = new ArrayList<>();
6972
selectedLanguages = new HashMap<>();
7073
this.savedLanguageValue = savedLanguageValue;
7174
this.recentLanguagesDao = recentLanguagesDao;
7275
this.fragment = fragment;
7376
this.voiceInputResultLauncher = voiceInputResultLauncher;
77+
this.isVoiceRecognitionAvailable = isVoiceRecognitionAvailable;
7478
}
7579

7680
public UploadMediaDetailAdapter(Activity activity, final String savedLanguageValue,
77-
List<UploadMediaDetail> uploadMediaDetails, RecentLanguagesDao recentLanguagesDao, ActivityResultLauncher<Intent> voiceInputResultLauncher) {
81+
List<UploadMediaDetail> uploadMediaDetails,
82+
RecentLanguagesDao recentLanguagesDao,
83+
ActivityResultLauncher<Intent> voiceInputResultLauncher,
84+
boolean isVoiceRecognitionAvailable) {
7885
this.uploadMediaDetails = uploadMediaDetails;
7986
selectedLanguages = new HashMap<>();
8087
this.savedLanguageValue = savedLanguageValue;
8188
this.recentLanguagesDao = recentLanguagesDao;
8289
this.activity = activity;
8390
this.voiceInputResultLauncher = voiceInputResultLauncher;
91+
this.isVoiceRecognitionAvailable = isVoiceRecognitionAvailable;
8492
}
8593

8694
public void setCallback(Callback callback) {
@@ -274,13 +282,15 @@ public void bind(int position) {
274282
selectedVoiceIcon = SelectedVoiceIcon.CAPTION;
275283
startSpeechInput(descriptionLanguages.getText().toString());
276284
});
285+
captionInputLayout.setEndIconVisible(isVoiceRecognitionAvailable);
277286
descInputLayout.setEndIconMode(TextInputLayout.END_ICON_CUSTOM);
278287
descInputLayout.setEndIconDrawable(R.drawable.baseline_keyboard_voice);
279288
descInputLayout.setEndIconOnClickListener(v -> {
280289
currentPosition = position;
281290
selectedVoiceIcon = SelectedVoiceIcon.DESCRIPTION;
282291
startSpeechInput(descriptionLanguages.getText().toString());
283292
});
293+
descInputLayout.setEndIconVisible(isVoiceRecognitionAvailable);
284294

285295
if (position == 0) {
286296
removeButton.setVisibility(View.GONE);

app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import androidx.exifinterface.media.ExifInterface;
2727
import androidx.recyclerview.widget.LinearLayoutManager;
2828
import fr.free.nrw.commons.CameraPosition;
29+
import fr.free.nrw.commons.CommonsApplication;
2930
import fr.free.nrw.commons.LocationPicker.LocationPicker;
3031
import fr.free.nrw.commons.R;
3132
import fr.free.nrw.commons.contributions.MainActivity;
@@ -295,7 +296,8 @@ private void initPresenter() {
295296
*/
296297
private void initRecyclerView() {
297298
uploadMediaDetailAdapter = new UploadMediaDetailAdapter(this,
298-
defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""), recentLanguagesDao, voiceInputResultLauncher);
299+
defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""), recentLanguagesDao, voiceInputResultLauncher,
300+
CommonsApplication.getInstance().isVoiceRecognitionAvailable());
299301
uploadMediaDetailAdapter.setCallback(this::showInfoAlert);
300302
uploadMediaDetailAdapter.setEventListener(this);
301303
binding.rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));

app/src/test/kotlin/fr/free/nrw/commons/upload/UploadMediaDetailAdapterUnitTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class UploadMediaDetailAdapterUnitTest {
7878
uploadMediaDetails = mutableListOf(uploadMediaDetail, uploadMediaDetail)
7979
activity = Robolectric.buildActivity(UploadActivity::class.java).get()
8080
fragment = mock(UploadMediaDetailFragment::class.java)
81-
adapter = UploadMediaDetailAdapter(fragment, "", recentLanguagesDao, mockResultLauncher)
81+
adapter = UploadMediaDetailAdapter(fragment, "", recentLanguagesDao, mockResultLauncher, true)
8282
context = ApplicationProvider.getApplicationContext()
8383
Whitebox.setInternalState(adapter, "uploadMediaDetails", uploadMediaDetails)
8484
Whitebox.setInternalState(adapter, "eventListener", eventListener)

0 commit comments

Comments
 (0)