diff --git a/android/app/build.gradle b/android/app/build.gradle index b5d4059..dc8cd61 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -37,12 +37,12 @@ android { ndkVersion flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = '17' + jvmTarget = '1.8' } sourceSets { diff --git a/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt b/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt index 3a2edc8..048262b 100644 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt +++ b/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt @@ -6,19 +6,20 @@ import java.io.File import java.io.FileInputStream class DefaultSystemFont { - fun get(): String? { + fun get(): String { return try { val file = File("/system/etc/fonts.xml") val fileStream = FileInputStream(file) parseFontsFileStream(fileStream) - } catch (_: Exception) { - null + } catch (e: Exception) { + e.message ?: "Unknown fonts.xml parsing exception" } } private fun parseFontsFileStream(fileStream: FileInputStream): String { fileStream.use { stream -> val parser = Xml.newPullParser() + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) parser.setInput(stream, null) parser.nextTag() return parseFonts(parser) @@ -26,8 +27,18 @@ class DefaultSystemFont { } private fun parseFonts(parser: XmlPullParser): String { - while (parser.name != "font") { parser.next() } + while (!((parser.next() == XmlPullParser.END_TAG) && (parser.name == "family"))) { + if ((parser.eventType == XmlPullParser.START_TAG) && (parser.name == "font") + && (parser.getAttributeValue(null, "style") == "normal") + && (parser.getAttributeValue(null, "weight") == "400")) { + break + } + } parser.next() - return "/system/fonts/" + parser.text.trim() + val fontFile = parser.text.trim() + if (fontFile == "") { + throw NoSuchFieldException("The font filename couldn't be found in fonts.xml") + } + return "/system/fonts/$fontFile" } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt index f1c3659..2991f00 100644 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt +++ b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt @@ -77,8 +77,8 @@ class MainActivity: FlutterActivity() { val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) var installFlags: Int = PackageInstallerUtils.getInstallFlags(params) - installFlags = installFlags or (0x00000002/*PackageManager.INSTALL_REPLACE_EXISTING*/ or - 0x00000004 /*PackageManager.INSTALL_ALLOW_TEST*/) + installFlags = installFlags or (0x00000002/*PackageManager.INSTALL_REPLACE_EXISTING*/ + or 0x00000004 /*PackageManager.INSTALL_ALLOW_TEST*/) PackageInstallerUtils.setInstallFlags(params, installFlags) val sessionId = packageInstaller.createSession(params) val iSession = IPackageInstallerSession.Stub.asInterface( diff --git a/android/build.gradle b/android/build.gradle index 994513f..5d6d8f4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.8.10' ext { compileSdkVersion = 34 // or latest targetSdkVersion = 34 // or latest diff --git a/assets/translations/en.json b/assets/translations/en.json index cae0e06..ed5a898 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -287,7 +287,8 @@ "shizuku": "Shizuku", "root": "Root", "shizukuBinderNotFound": "Сompatible Shizuku service wasn't found", - "tryUseSystemFont": "Try to use a system font", + "useSystemFont": "Use the system font", + "systemFontError": "Error loading the system font: {}", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index ed87a9d..67c424d 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -287,7 +287,8 @@ "shizuku": "Shizuku", "root": "Суперпользователь", "shizukuBinderNotFound": "Совместимый сервис Shizuku не найден", - "tryUseSystemFont": "Попытаться использовать системный шрифт", + "useSystemFont": "Использовать системный шрифт", + "systemFontError": "Ошибка загрузки системного шрифта: {}", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/lib/main.dart b/lib/main.dart index 26c328e..b8a8d8c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,7 +5,6 @@ import 'package:flutter/services.dart'; import 'package:obtainium/pages/home.dart'; import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/logs_provider.dart'; -import 'package:obtainium/providers/native_provider.dart'; import 'package:obtainium/providers/notifications_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; @@ -201,16 +200,6 @@ class _ObtainiumState extends State { context.locale.languageCode)) { settingsProvider.resetLocaleSafe(context); } - settingsProvider.addListener(() async { - if (settingsProvider.tryUseSystemFont && - settingsProvider.appFont == "Metropolis") { - bool fontLoaded = await NativeFeatures.tryLoadSystemFont(); - if (fontLoaded) { settingsProvider.appFont = "SystemFont"; } - } else if (!settingsProvider.tryUseSystemFont && - settingsProvider.appFont != "Metropolis") { - settingsProvider.appFont = "Metropolis"; - } - }); } return DynamicColorBuilder( @@ -247,13 +236,17 @@ class _ObtainiumState extends State { colorScheme: settingsProvider.theme == ThemeSettings.dark ? darkColorScheme : lightColorScheme, - fontFamily: settingsProvider.appFont), + fontFamily: settingsProvider.useSystemFont + ? 'SystemFont' + : 'Metropolis'), darkTheme: ThemeData( useMaterial3: true, colorScheme: settingsProvider.theme == ThemeSettings.light ? lightColorScheme : darkColorScheme, - fontFamily: settingsProvider.appFont), + fontFamily: settingsProvider.useSystemFont + ? 'SystemFont' + : 'Metropolis'), home: Shortcuts(shortcuts: { LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), }, child: const HomePage())); diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 3272275..4e0d69b 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -7,6 +7,7 @@ import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/main.dart'; import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/logs_provider.dart'; +import 'package:obtainium/providers/native_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; import 'package:provider/provider.dart'; @@ -410,11 +411,23 @@ class _SettingsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Flexible(child: Text(tr('tryUseSystemFont'))), + Flexible(child: Text(tr('useSystemFont'))), Switch( - value: settingsProvider.tryUseSystemFont, - onChanged: (value) { - settingsProvider.tryUseSystemFont = value; + value: settingsProvider.useSystemFont, + onChanged: (useSystemFont) { + if (useSystemFont) { + NativeFeatures.loadSystemFont().then((fontLoadRes) { + if (fontLoadRes == 'ok') { + settingsProvider.useSystemFont = true; + } else { + showError(ObtainiumError( + tr('systemFontError', args: [fontLoadRes]) + ), context); + } + }); + } else { + settingsProvider.useSystemFont = false; + } }) ], ), diff --git a/lib/providers/native_provider.dart b/lib/providers/native_provider.dart index 8a1767d..88e0b82 100644 --- a/lib/providers/native_provider.dart +++ b/lib/providers/native_provider.dart @@ -4,8 +4,8 @@ import 'package:flutter/services.dart'; class NativeFeatures { static const MethodChannel _channel = MethodChannel('native'); - static bool _callbacksApplied = false; static bool _systemFontLoaded = false; + static bool _callbacksApplied = false; static int _resPermShizuku = -2; // not set static Future _readFileBytes(String path) async { @@ -34,15 +34,15 @@ class NativeFeatures { return completer.future; } - static Future tryLoadSystemFont() async { - if (_systemFontLoaded) { return true; } - var font = await _channel.invokeMethod('getSystemFont'); - if (font == null) { return false; } + static Future loadSystemFont() async { + if (_systemFontLoaded) { return "ok"; } + var getFontRes = await _channel.invokeMethod('getSystemFont'); + if (getFontRes[0] != '/') { return getFontRes; } // Error var fontLoader = FontLoader('SystemFont'); - fontLoader.addFont(_readFileBytes(font)); + fontLoader.addFont(_readFileBytes(getFontRes)); await fontLoader.load(); _systemFontLoaded = true; - return true; + return "ok"; } static Future checkPermissionShizuku() async { diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index c1a8bcd..3935f9c 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -51,21 +51,12 @@ class SettingsProvider with ChangeNotifier { notifyListeners(); } - String get appFont { - return prefs?.getString('appFont') ?? 'Metropolis'; + bool get useSystemFont { + return prefs?.getBool('useSystemFont') ?? false; } - set appFont(String appFont) { - prefs?.setString('appFont', appFont); - notifyListeners(); - } - - bool get tryUseSystemFont { - return prefs?.getBool('tryUseSystemFont') ?? false; - } - - set tryUseSystemFont(bool tryUseSystemFont) { - prefs?.setBool('tryUseSystemFont', tryUseSystemFont); + set useSystemFont(bool useSystemFont) { + prefs?.setBool('useSystemFont', useSystemFont); notifyListeners(); }