diff --git a/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt b/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt deleted file mode 100644 index 048262b..0000000 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/DefaultSystemFont.kt +++ /dev/null @@ -1,44 +0,0 @@ -package dev.imranr.obtainium - -import android.util.Xml -import org.xmlpull.v1.XmlPullParser -import java.io.File -import java.io.FileInputStream - -class DefaultSystemFont { - fun get(): String { - return try { - val file = File("/system/etc/fonts.xml") - val fileStream = FileInputStream(file) - parseFontsFileStream(fileStream) - } 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) - } - } - - private fun parseFonts(parser: XmlPullParser): String { - 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() - 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 0048001..eeeb366 100644 --- a/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt +++ b/android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt @@ -140,10 +140,7 @@ class MainActivity: FlutterActivity() { flutterEngine.dartExecutor.binaryMessenger, "native") nativeChannel!!.setMethodCallHandler { call, result -> - if (call.method == "getSystemFont") { - val res = DefaultSystemFont().get() - result.success(res) - } else if (call.method == "checkPermissionShizuku") { + if (call.method == "checkPermissionShizuku") { shizukuCheckPermission(result) } else if (call.method == "installWithShizuku") { val apkFileUri: String = call.argument("apkFileUri")!! diff --git a/lib/main.dart b/lib/main.dart index 32f2c0b..f36bd8e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ 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'; @@ -231,6 +232,8 @@ class _ObtainiumState extends State { .harmonized(); } + if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont(); + return MaterialApp( title: 'Obtainium', localizationsDelegates: context.localizationDelegates, diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index a8cde00..b8e4def 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -469,17 +469,8 @@ class _SettingsPageState extends State { onChanged: (useSystemFont) { if (useSystemFont) { NativeFeatures.loadSystemFont() - .then((fontLoadRes) { - if (fontLoadRes == 'ok') { - settingsProvider.useSystemFont = - true; - } else { - showError( - ObtainiumError(tr( - 'systemFontError', - args: [fontLoadRes])), - context); - } + .then((val) { + settingsProvider.useSystemFont = true; }); } else { settingsProvider.useSystemFont = false; diff --git a/lib/providers/native_provider.dart b/lib/providers/native_provider.dart index a32531d..428069f 100644 --- a/lib/providers/native_provider.dart +++ b/lib/providers/native_provider.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'package:android_system_font/android_system_font.dart'; import 'package:flutter/services.dart'; class NativeFeatures { @@ -9,8 +10,7 @@ class NativeFeatures { static int _resPermShizuku = -2; // not set static Future _readFileBytes(String path) async { - var file = File(path); - var bytes = await file.readAsBytes(); + var bytes = await File(path).readAsBytes(); return ByteData.view(bytes.buffer); } @@ -34,15 +34,13 @@ class NativeFeatures { return completer.future; } - static Future loadSystemFont() async { - if (_systemFontLoaded) { return "ok"; } - var getFontRes = await _channel.invokeMethod('getSystemFont'); - if (getFontRes[0] != '/') { return getFontRes; } // Error + static Future loadSystemFont() async { + if (_systemFontLoaded) return; var fontLoader = FontLoader('SystemFont'); - fontLoader.addFont(_readFileBytes(getFontRes)); - await fontLoader.load(); + var fontFilePath = await AndroidSystemFont().getFilePath(); + fontLoader.addFont(_readFileBytes(fontFilePath!)); + fontLoader.load(); _systemFontLoaded = true; - return "ok"; } static Future checkPermissionShizuku() async { diff --git a/pubspec.lock b/pubspec.lock index 28bb66d..262dad8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -26,6 +26,15 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.1" + android_system_font: + dependency: "direct main" + description: + path: "." + ref: master + resolved-ref: "355f897e92a58a803f91d9270d389d9ec40ba550" + url: "https://github.com/re7gog/android_system_font" + source: git + version: "1.0.0" animations: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3d8195a..3c52c57 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -68,6 +68,10 @@ dependencies: crypto: ^3.0.3 app_links: ^4.0.0 background_fetch: ^1.2.1 + android_system_font: + git: + url: https://github.com/re7gog/android_system_font + ref: master dev_dependencies: flutter_test: