@@ -16,6 +16,7 @@ import android.widget.AdapterView
16
16
import android.widget.EditText
17
17
import android.widget.ListView
18
18
import android.widget.TextView
19
+ import android.widget.Toast
19
20
import androidx.activity.result.ActivityResultLauncher
20
21
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
21
22
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
@@ -73,6 +74,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
73
74
74
75
private var themeListPreference: ListPreference ? = null
75
76
private var descriptionLanguageListPreference: Preference ? = null
77
+ private var descriptionSecondaryLanguagesListPreference: Preference ? = null
76
78
private var appUiLanguageListPreference: Preference ? = null
77
79
private var showDeletionButtonPreference: Preference ? = null
78
80
private var keyLanguageListPreference: String? = null
@@ -204,6 +206,12 @@ class SettingsFragment : PreferenceFragmentCompat() {
204
206
}
205
207
}
206
208
209
+ descriptionSecondaryLanguagesListPreference = findPreference(" descriptionSecondaryLanguagesPref" )
210
+ descriptionSecondaryLanguagesListPreference?.setOnPreferenceClickListener {
211
+ prepareSecondaryLanguagesDialog()
212
+ true
213
+ }
214
+
207
215
showDeletionButtonPreference = findPreference(" displayDeletionButton" )
208
216
showDeletionButtonPreference?.setOnPreferenceChangeListener { _, newValue ->
209
217
val isEnabled = newValue as Boolean
@@ -299,6 +307,82 @@ class SettingsFragment : PreferenceFragmentCompat() {
299
307
}
300
308
}
301
309
310
+ private fun prepareSecondaryLanguagesDialog () {
311
+ val languageCode = getCurrentLanguageCode(" descriptionSecondaryLanguagesPref" )
312
+ val selectedLanguages = hashMapOf<Int , String >()
313
+ languageCode?.let {
314
+ selectedLanguages[0 ] = Locale .getDefault().language
315
+ }
316
+
317
+ val savedLanguages = arrayListOf<Language >()
318
+ languageCode?.split(" ,\\ s*" .toRegex())?.forEach { code ->
319
+ if (code != Locale .getDefault().language) {
320
+ val locale = Locale (code)
321
+ savedLanguages.add(Language (locale.displayLanguage, code))
322
+ }
323
+ }
324
+
325
+ val dialog = Dialog (requireActivity())
326
+ dialog.setContentView(R .layout.dialog_select_secondary_languages)
327
+ dialog.setCanceledOnTouchOutside(true )
328
+ dialog.window?.setLayout(
329
+ (resources.displayMetrics.widthPixels * 0.90 ).toInt(),
330
+ (resources.displayMetrics.heightPixels * 0.90 ).toInt()
331
+ )
332
+ dialog.show()
333
+
334
+ val editText: EditText = dialog.findViewById(R .id.search_language)
335
+ val listView: ListView = dialog.findViewById(R .id.language_list)
336
+ val savedLanguageListView: ListView = dialog.findViewById(R .id.language_history_list)
337
+ val separator: View = dialog.findViewById(R .id.separator)
338
+
339
+ updateSavedLanguages(savedLanguageListView, savedLanguages, selectedLanguages)
340
+
341
+ val languagesAdapter = LanguagesAdapter (requireActivity(), selectedLanguages)
342
+ listView.adapter = languagesAdapter
343
+
344
+ editText.addTextChangedListener(object : TextWatcher {
345
+ override fun beforeTextChanged (charSequence : CharSequence , start : Int , count : Int , after : Int ) {}
346
+ override fun onTextChanged (charSequence : CharSequence , start : Int , before : Int , count : Int ) {
347
+ languagesAdapter.filter.filter(charSequence)
348
+ }
349
+ override fun afterTextChanged (editable : Editable ? ) {}
350
+ })
351
+
352
+ savedLanguageListView.setOnItemClickListener { _, _, position, _ ->
353
+ savedLanguages.removeAt(position)
354
+ updateSavedLanguages(savedLanguageListView, savedLanguages, selectedLanguages)
355
+ saveLanguageValue(
356
+ savedLanguages.joinToString(" , " ) { it.languageCode },
357
+ " descriptionSecondaryLanguagesPref"
358
+ )
359
+ }
360
+
361
+ listView.setOnItemClickListener { _, _, position, _ ->
362
+ val selectedLanguageCode = languagesAdapter.getLanguageCode(position)
363
+ val selectedLanguageName = languagesAdapter.getLanguageName(position)
364
+
365
+ if (savedLanguages.any { it.languageCode == selectedLanguageCode }) {
366
+ Toast .makeText(requireActivity(), " Language already selected" , Toast .LENGTH_SHORT ).show()
367
+ return @setOnItemClickListener
368
+ }
369
+
370
+ savedLanguages.add(Language (selectedLanguageName, selectedLanguageCode))
371
+ updateSavedLanguages(savedLanguageListView, savedLanguages, selectedLanguages)
372
+ saveLanguageValue(
373
+ savedLanguages.joinToString(" , " ) { it.languageCode },
374
+ " descriptionSecondaryLanguagesPref"
375
+ )
376
+ }
377
+
378
+ dialog.setOnDismissListener {
379
+ saveLanguageValue(
380
+ savedLanguages.joinToString(" , " ) { it.languageCode },
381
+ " descriptionSecondaryLanguagesPref"
382
+ )
383
+ }
384
+ }
385
+
302
386
/* *
303
387
* Prepare and Show language selection dialog box
304
388
* Uses previously saved language if there is any, if not uses phone locale as initial language.
@@ -497,6 +581,16 @@ class SettingsFragment : PreferenceFragmentCompat() {
497
581
}
498
582
}
499
583
584
+ // Helper function to update saved languages
585
+ private fun updateSavedLanguages (
586
+ savedLanguageListView : ListView ,
587
+ savedLanguages : List <Language >,
588
+ selectedLanguages : HashMap <Int , String >
589
+ ) {
590
+ val savedLanguagesAdapter = RecentLanguagesAdapter (requireActivity(), savedLanguages, selectedLanguages)
591
+ savedLanguageListView.adapter = savedLanguagesAdapter
592
+ }
593
+
500
594
/* *
501
595
* Save userSelected language in List Preference
502
596
* @param userSelectedValue
@@ -506,6 +600,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
506
600
when (preferenceKey) {
507
601
" appUiDefaultLanguagePref" -> defaultKvStore.putString(Prefs .APP_UI_LANGUAGE , userSelectedValue)
508
602
" descriptionDefaultLanguagePref" -> defaultKvStore.putString(Prefs .DESCRIPTION_LANGUAGE , userSelectedValue)
603
+ " descriptionSecondaryLanguagesPref" -> defaultKvStore.putString(Prefs .SECONDARY_LANGUAGES , userSelectedValue)
509
604
}
510
605
}
511
606
@@ -522,6 +617,9 @@ class SettingsFragment : PreferenceFragmentCompat() {
522
617
" descriptionDefaultLanguagePref" -> defaultKvStore.getString(
523
618
Prefs .DESCRIPTION_LANGUAGE , " "
524
619
)
620
+ " descriptionSecondaryLanguagesPref" -> defaultKvStore.getString(
621
+ Prefs .SECONDARY_LANGUAGES , " "
622
+ )
525
623
else -> null
526
624
}
527
625
}
0 commit comments