diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6102c540..3a2c4f8c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -44,19 +44,7 @@ - - - - - + android:exported="true"> - when (call.method) { - "accept" -> { - val data = call.argument("data") - val resultIntent = Intent() - resultIntent.putExtra("data", data as Serializable) - setResult(Activity.RESULT_OK, resultIntent) - finish() - } - "deny" -> { - setResult(Activity.RESULT_CANCELED) - finish() - } - else -> result.notImplemented() - } + // Default Data + json.put("keystorePassword", "s3cur3p@ssw0rd") + + // Load Shared Preferences + val sharedPreferences = getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE) + val allEntries: Map = sharedPreferences.getAll() + for ((key, value) in allEntries.entries) { + json.put( + key.replace("flutter.", ""), + if (value is Boolean) if (value) 1 else 0 else value + ) } - } - override fun getDartEntrypointFunctionName(): String { - return "mainExportSettings" - } + // Load keystore + val keystoreFile = File(getExternalFilesDir(null), "/revanced-manager.keystore") + if (keystoreFile.exists()) { + val keystoreBytes = keystoreFile.readBytes() + val keystoreBase64 = + Base64.encodeToString(keystoreBytes, Base64.DEFAULT).replace("\n", "") + json.put("keystore", keystoreBase64) + } - override fun getTransparencyMode(): TransparencyMode { - return TransparencyMode.transparent + // Load saved patches + val storedPatchesFile = File(filesDir.parentFile.absolutePath, "/app_flutter/selected-patches.json") + if (storedPatchesFile.exists()) { + val patchesBytes = storedPatchesFile.readBytes() + val patches = String(patchesBytes, Charsets.UTF_8) + json.put("patches", patches) + } + + // Send data back + Log.e("ExportSettingsActivity", json.toString()) + val resultIntent = Intent() + resultIntent.putExtra("data", json.toString()) + setResult(Activity.RESULT_OK, resultIntent) + finish() } } diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index ae451e0a..cb1ef880 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -15,10 +15,4 @@ - - diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json index e1c1f848..05694ced 100644 --- a/assets/i18n/en_US.json +++ b/assets/i18n/en_US.json @@ -304,11 +304,5 @@ "integrationsContributors": "Integrations contributors", "cliContributors": "CLI contributors", "managerContributors": "Manager contributors" - }, - "exportSettingsView": { - "widgetTitle": "Import settings", - "description": "Would you like to import your settings to the previous version of ReVanced Manager?", - "exportButton": "Import", - "dismissButton": "No thanks" } } diff --git a/lib/main.dart b/lib/main.dart index df883453..29b715b9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,7 +8,6 @@ import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/revanced_api.dart'; import 'package:revanced_manager/ui/theme/dynamic_theme_builder.dart'; -import 'package:revanced_manager/ui/views/export_settings/export_settings_view.dart'; import 'package:revanced_manager/ui/views/navigation/navigation_view.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:stacked_themes/stacked_themes.dart'; @@ -16,14 +15,6 @@ import 'package:timezone/data/latest.dart' as tz; late SharedPreferences prefs; Future main() async { - initialize(const NavigationView()); -} - -Future mainExportSettings() async { - initialize(const ExportSettingsView()); -} - -Future initialize(Widget homeView) async { await ThemeManager.initialise(); await setupLocator(); WidgetsFlutterBinding.ensureInitialized(); @@ -35,12 +26,11 @@ Future initialize(Widget homeView) async { tz.initializeTimeZones(); prefs = await SharedPreferences.getInstance(); - runApp(MyApp(homeView: homeView)); + runApp(const MyApp()); } class MyApp extends StatelessWidget { - const MyApp({Key? key, required this.homeView}) : super(key: key); - final Widget homeView; + const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -52,7 +42,7 @@ class MyApp extends StatelessWidget { return DynamicThemeBuilder( title: 'ReVanced Manager', - home: homeView, + home: const NavigationView(), localizationsDelegates: [ FlutterI18nDelegate( translationLoader: FileTranslationLoader( diff --git a/lib/ui/views/export_settings/export_settings_view.dart b/lib/ui/views/export_settings/export_settings_view.dart deleted file mode 100644 index c7e797b5..00000000 --- a/lib/ui/views/export_settings/export_settings_view.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:revanced_manager/ui/views/export_settings/export_settings_viewmodel.dart'; -import 'package:revanced_manager/ui/widgets/shared/custom_material_button.dart'; - -final _exportSettingsViewModel = ExportSettingsViewModel(); - -class ExportSettingsView extends StatelessWidget { - const ExportSettingsView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - SystemChrome.setSystemUIOverlayStyle( - SystemUiOverlayStyle( - systemNavigationBarColor: Colors.black.withOpacity(0.002), - statusBarColor: Colors.black.withOpacity(0.002), - ), - ); - SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - - return AlertDialog( - title: I18nText('exportSettingsView.widgetTitle'), - content: I18nText('exportSettingsView.description'), - icon: const Icon(Icons.update), - actions: [ - CustomMaterialButton( - isFilled: false, - label: I18nText('exportSettingsView.dismissButton'), - onPressed: _exportSettingsViewModel.deny, - ), - CustomMaterialButton( - label: I18nText('exportSettingsView.exportButton'), - onPressed: () async { - await _exportSettingsViewModel.accept(); - }, - ), - ], - ); - } -} diff --git a/lib/ui/views/export_settings/export_settings_viewmodel.dart b/lib/ui/views/export_settings/export_settings_viewmodel.dart deleted file mode 100644 index 0aee70fd..00000000 --- a/lib/ui/views/export_settings/export_settings_viewmodel.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:dynamic_themes/dynamic_themes.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:injectable/injectable.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/services/manager_api.dart'; -import 'package:stacked/stacked.dart'; - -@lazySingleton -class ExportSettingsViewModel extends BaseViewModel { - final _channel = const MethodChannel('app.revanced.manager.flutter/settings'); - final ManagerAPI _managerAPI = locator(); - - Future accept() async { - final externalDir = await getExternalStorageDirectory(); - - final Map data = {}; - - data['themeMode'] = _managerAPI.getThemeMode(); - data['useDynamicTheme'] = _managerAPI.getUseDynamicTheme() ? 1 : 0; - - data['apiUrl'] = _managerAPI.getApiUrl(); - data['patchesRepo'] = _managerAPI.getPatchesRepo(); - data['integrationsRepo'] = _managerAPI.getIntegrationsRepo(); - - data['patchesAutoUpdate'] = _managerAPI.isPatchesAutoUpdate() ? 1 : 0; - data['patchesChangeEnabled'] = _managerAPI.isPatchesChangeEnabled() ? 1 : 0; - data['universalPatchesEnabled'] = _managerAPI.areUniversalPatchesEnabled() ? 1 : 0; - data['experimentalPatchesEnabled'] = _managerAPI.areExperimentalPatchesEnabled() ? 1 : 0; - - data['keystorePassword'] = _managerAPI.getKeystorePassword(); - - // Load keystore - if (externalDir != null) { - final keystoreFile = File('${externalDir.path}/revanced-manager.keystore'); - if (keystoreFile.existsSync()) { - final keystoreBytes = keystoreFile.readAsBytesSync(); - data['keystore'] = base64Encode(keystoreBytes); - } - } - - // Load patches - final patchFile = File(_managerAPI.storedPatchesFile); - if (patchFile.existsSync()) { - data['patches'] = patchFile.readAsStringSync(); - } - - _channel.invokeMethod('accept', {'data': jsonEncode(data)}); - } - - void deny() { - _channel.invokeMethod('deny'); - } -}