Browse Source

feat: language preferences (#76)

see https://developer.android.com/guide/topics/resources/app-languages

Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/76
Co-authored-by: septs <github@septs.pw>
Co-committed-by: septs <github@septs.pw>
septs 1 year ago
parent
commit
0a78daee8b

+ 10 - 0
app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt

@@ -2,7 +2,9 @@ package im.angry.openeuicc.ui
 
 
 import android.content.Intent
 import android.content.Intent
 import android.net.Uri
 import android.net.Uri
+import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
+import android.provider.Settings
 import android.widget.Toast
 import android.widget.Toast
 import androidx.datastore.preferences.core.Preferences
 import androidx.datastore.preferences.core.Preferences
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.lifecycleScope
@@ -49,6 +51,14 @@ class SettingsFragment: PreferenceFragmentCompat() {
             intent = Intent(Intent.ACTION_VIEW, Uri.parse(summary.toString()))
             intent = Intent(Intent.ACTION_VIEW, Uri.parse(summary.toString()))
         }
         }
 
 
+        findPreference<Preference>("pref_language")?.apply {
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return@apply
+            isVisible = true
+            intent = Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply {
+                data = Uri.fromParts("package", requireContext().packageName, null)
+            }
+        }
+
         findPreference<Preference>("pref_advanced_logs")?.apply {
         findPreference<Preference>("pref_advanced_logs")?.apply {
             intent = Intent(requireContext(), LogsActivity::class.java)
             intent = Intent(requireContext(), LogsActivity::class.java)
         }
         }

+ 2 - 0
app-common/src/main/res/values/strings.xml

@@ -146,6 +146,8 @@
     <string name="pref_advanced_disable_safeguard_removable_esim_desc">By default, this app prevents you from disabling the active profile on a removable eSIM inserted in the device, because doing so may <i>sometimes</i> render it inaccessible.\nCheck this box to <i>remove</i> this safeguard.</string>
     <string name="pref_advanced_disable_safeguard_removable_esim_desc">By default, this app prevents you from disabling the active profile on a removable eSIM inserted in the device, because doing so may <i>sometimes</i> render it inaccessible.\nCheck this box to <i>remove</i> this safeguard.</string>
     <string name="pref_advanced_verbose_logging">Verbose Logging</string>
     <string name="pref_advanced_verbose_logging">Verbose Logging</string>
     <string name="pref_advanced_verbose_logging_desc">Enable verbose logs, which may contain sensitive information. Only share your logs with someone you trust after turning this on.</string>
     <string name="pref_advanced_verbose_logging_desc">Enable verbose logs, which may contain sensitive information. Only share your logs with someone you trust after turning this on.</string>
+    <string name="pref_language">Language</string>
+    <string name="pref_language_desc">Select current language</string>
     <string name="pref_advanced_logs">Logs</string>
     <string name="pref_advanced_logs">Logs</string>
     <string name="pref_advanced_logs_desc">View recent debug logs of the application</string>
     <string name="pref_advanced_logs_desc">View recent debug logs of the application</string>
     <string name="pref_developer">Developer Options</string>
     <string name="pref_developer">Developer Options</string>

+ 5 - 0
app-common/src/main/res/xml/locale_config.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
+    <locale android:name="en-US" />
+    <locale android:name="ja" />
+</locale-config>

+ 7 - 0
app-common/src/main/res/xml/pref_settings.xml

@@ -36,6 +36,13 @@
             app:title="@string/pref_advanced_verbose_logging"
             app:title="@string/pref_advanced_verbose_logging"
             app:summary="@string/pref_advanced_verbose_logging_desc" />
             app:summary="@string/pref_advanced_verbose_logging_desc" />
 
 
+        <Preference
+            app:iconSpaceReserved="false"
+            app:isPreferenceVisible="false"
+            app:key="pref_language"
+            app:summary="@string/pref_language_desc"
+            app:title="@string/pref_language" />
+
         <Preference
         <Preference
             app:key="pref_advanced_logs"
             app:key="pref_advanced_logs"
             app:iconSpaceReserved="false"
             app:iconSpaceReserved="false"

+ 13 - 2
app-unpriv/src/main/AndroidManifest.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
 
 
     <application
     <application
         android:name="im.angry.openeuicc.UnprivilegedOpenEuiccApplication"
         android:name="im.angry.openeuicc.UnprivilegedOpenEuiccApplication"
@@ -8,7 +9,9 @@
         android:label="@string/app_name"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:supportsRtl="true"
-        android:theme="@style/Theme.OpenEUICC">
+        android:localeConfig="@xml/locale_config"
+        android:theme="@style/Theme.OpenEUICC"
+        tools:targetApi="tiramisu">
 
 
         <activity
         <activity
             android:name="im.angry.openeuicc.ui.UnprivilegedMainActivity"
             android:name="im.angry.openeuicc.ui.UnprivilegedMainActivity"
@@ -25,6 +28,14 @@
             android:exported="false"
             android:exported="false"
             android:label="@string/compatibility_check" />
             android:label="@string/compatibility_check" />
 
 
+        <service
+            android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
+            android:enabled="false"
+            android:exported="false">
+            <meta-data
+                android:name="autoStoreLocales"
+                android:value="true" />
+        </service>
     </application>
     </application>
 
 
     <queries>
     <queries>

+ 14 - 2
app/src/main/AndroidManifest.xml

@@ -5,7 +5,8 @@
     package="im.angry.openeuicc">
     package="im.angry.openeuicc">
     <uses-feature
     <uses-feature
         android:name="android.hardware.telephony"
         android:name="android.hardware.telephony"
-        android:required="true" />
+        android:required="true"
+        tools:ignore="UnnecessaryRequiredFeature" />
 
 
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
@@ -19,7 +20,9 @@
         android:label="@string/app_name"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:supportsRtl="true"
-        android:theme="@style/Theme.OpenEUICC">
+        android:localeConfig="@xml/locale_config"
+        android:theme="@style/Theme.OpenEUICC"
+        tools:targetApi="tiramisu">
         <activity
         <activity
             android:name=".ui.PrivilegedMainActivity"
             android:name=".ui.PrivilegedMainActivity"
             android:exported="true">
             android:exported="true">
@@ -49,6 +52,15 @@
                 <category android:name="android.service.euicc.category.EUICC_UI" />
                 <category android:name="android.service.euicc.category.EUICC_UI" />
             </intent-filter>
             </intent-filter>
         </activity>
         </activity>
+
+        <service
+            android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
+            android:enabled="false"
+            android:exported="false">
+            <meta-data
+                android:name="autoStoreLocales"
+                android:value="true" />
+        </service>
     </application>
     </application>
 
 
 </manifest>
 </manifest>