Skip to content

Commit 7594c86

Browse files
committed
Add language selector in Settings (English, Indonesian), fix values-in to values-id, update README
1 parent ce247de commit 7594c86

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed

app/src/main/java/com/appcontrolx/ui/SettingsFragment.kt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class SettingsFragment : Fragment() {
4646
super.onViewCreated(view, savedInstanceState)
4747

4848
setupTheme()
49+
setupLanguage()
4950
setupCurrentMode()
5051
setupSafetySettings()
5152
setupRollbackSettings()
@@ -88,6 +89,64 @@ class SettingsFragment : Fragment() {
8889
}
8990
}
9091

92+
private fun setupLanguage() {
93+
updateLanguageText()
94+
95+
binding.itemLanguage.setOnClickListener {
96+
val languages = arrayOf(
97+
getString(R.string.language_system),
98+
getString(R.string.language_english),
99+
getString(R.string.language_indonesian)
100+
)
101+
val languageCodes = arrayOf("system", "en", "id")
102+
103+
val currentLang = prefs.getString(Constants.PREFS_LANGUAGE, "system") ?: "system"
104+
val currentIndex = languageCodes.indexOf(currentLang).coerceAtLeast(0)
105+
106+
MaterialAlertDialogBuilder(requireContext())
107+
.setTitle(R.string.settings_language)
108+
.setSingleChoiceItems(languages, currentIndex) { dialog, which ->
109+
val selectedLang = languageCodes[which]
110+
prefs.edit().putString(Constants.PREFS_LANGUAGE, selectedLang).apply()
111+
applyLanguage(selectedLang)
112+
updateLanguageText()
113+
dialog.dismiss()
114+
}
115+
.setNegativeButton(android.R.string.cancel, null)
116+
.show()
117+
}
118+
}
119+
120+
private fun updateLanguageText() {
121+
val currentLang = prefs.getString(Constants.PREFS_LANGUAGE, "system") ?: "system"
122+
binding.tvCurrentLanguage.text = when (currentLang) {
123+
"en" -> getString(R.string.language_english)
124+
"id" -> getString(R.string.language_indonesian)
125+
else -> getString(R.string.language_system)
126+
}
127+
}
128+
129+
private fun applyLanguage(langCode: String) {
130+
val locale = when (langCode) {
131+
"en" -> java.util.Locale.ENGLISH
132+
"id" -> java.util.Locale("id", "ID")
133+
else -> java.util.Locale.getDefault()
134+
}
135+
136+
val config = resources.configuration
137+
config.setLocale(locale)
138+
139+
// Restart activity to apply
140+
MaterialAlertDialogBuilder(requireContext())
141+
.setTitle(R.string.settings_language)
142+
.setMessage(R.string.settings_restart_required)
143+
.setPositiveButton(R.string.settings_restart_now) { _, _ ->
144+
restartApp()
145+
}
146+
.setNegativeButton(R.string.settings_restart_later, null)
147+
.show()
148+
}
149+
91150
private fun setupCurrentMode() {
92151
updateModeDisplay()
93152

app/src/main/java/com/appcontrolx/utils/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ object Constants {
88
const val PREFS_PROTECT_SYSTEM = "protect_system"
99
const val PREFS_AUTO_SNAPSHOT = "auto_snapshot"
1010
const val PREFS_THEME = "theme"
11+
const val PREFS_LANGUAGE = "language"
1112

1213
const val MODE_ROOT = "root"
1314
const val MODE_SHIZUKU = "shizuku"

app/src/main/res/layout/fragment_settings.xml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,42 @@
7070
android:textSize="14sp" />
7171
</LinearLayout>
7272
</LinearLayout>
73+
74+
<View
75+
android:layout_width="match_parent"
76+
android:layout_height="1dp"
77+
android:background="@color/outline"
78+
android:layout_marginVertical="8dp" />
79+
80+
<LinearLayout
81+
android:id="@+id/itemLanguage"
82+
android:layout_width="match_parent"
83+
android:layout_height="wrap_content"
84+
android:orientation="horizontal"
85+
android:gravity="center_vertical"
86+
android:paddingVertical="8dp"
87+
android:background="?attr/selectableItemBackground">
88+
89+
<LinearLayout
90+
android:layout_width="0dp"
91+
android:layout_height="wrap_content"
92+
android:layout_weight="1"
93+
android:orientation="vertical">
94+
95+
<TextView
96+
android:layout_width="wrap_content"
97+
android:layout_height="wrap_content"
98+
android:text="@string/settings_language"
99+
android:textSize="16sp" />
100+
101+
<TextView
102+
android:id="@+id/tvCurrentLanguage"
103+
android:layout_width="wrap_content"
104+
android:layout_height="wrap_content"
105+
android:textColor="@color/on_surface_secondary"
106+
android:textSize="14sp" />
107+
</LinearLayout>
108+
</LinearLayout>
73109
</LinearLayout>
74110
</com.google.android.material.card.MaterialCardView>
75111

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@
159159
<string name="theme_system">System Default</string>
160160
<string name="theme_light">Light</string>
161161
<string name="theme_dark">Dark</string>
162+
<string name="settings_language">Language</string>
163+
<string name="settings_language_desc">Choose app language</string>
164+
<string name="language_system">System Default</string>
165+
<string name="language_english">English</string>
166+
<string name="language_indonesian">Bahasa Indonesia</string>
162167

163168
<!-- App Detail -->
164169
<string name="btn_info">App Info</string>

0 commit comments

Comments
 (0)