diff --git a/assets/i18n/en.json b/assets/i18n/en.json index e0f3a806..550d8853 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -87,8 +87,10 @@ "patcherSectionTitle": "Patcher", "teamSectionTitle": "Team", "infoSectionTitle": "Info", - "themeLabel": "Theme", - "themeHint": "Change the theme of the app", + "darkThemeLabel": "Dark Mode", + "darkThemeHint": "Welcome to the dark side", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Enjoy an experience closer to your device", "languageLabel": "Language", "englishOption": "English", "frenchOption": "French", diff --git a/lib/app/app.dart b/lib/app/app.dart index 69d38c95..1fac4b7c 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -13,7 +13,6 @@ import 'package:revanced_manager/ui/views/root_checker/root_checker_view.dart'; import 'package:revanced_manager/ui/views/settings/settings_view.dart'; import 'package:stacked/stacked_annotations.dart'; import 'package:stacked_services/stacked_services.dart'; -import 'package:stacked_themes/stacked_themes.dart'; @StackedApp( routes: [ @@ -31,10 +30,6 @@ import 'package:stacked_themes/stacked_themes.dart'; LazySingleton(classType: HomeViewModel), LazySingleton(classType: PatcherViewModel), LazySingleton(classType: NavigationService), - LazySingleton( - classType: ThemeService, - resolveUsing: ThemeService.getInstance, - ), LazySingleton(classType: ManagerAPI), LazySingleton(classType: PatcherAPI), ], diff --git a/lib/constants.dart b/lib/constants.dart index bd318280..744fa04d 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1,27 +1,6 @@ -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; - -const purple80 = Color(0xFFD0BCFF); -const purpleGrey80 = Color(0xFFCCC2DC); -const pink80 = Color(0xFFEFB8C8); -const purple40 = Color(0xFF6650a4); -const purpleGrey40 = Color(0xFF625b71); -const pink40 = Color(0xFF7D5260); - -final kInterTextStyle = GoogleFonts.inter(); -final kRobotoTextStyle = GoogleFonts.roboto(); -final kSettingItemTextStyle = GoogleFonts.roboto( - fontSize: 20, - fontWeight: FontWeight.w500, -); -final kSettingItemSubtitleTextStyle = GoogleFonts.roboto( - fontSize: 13, - fontWeight: FontWeight.w300, -); - String ghOrg = 'revanced'; String patchesRepo = 'revanced-patches'; String integrationsRepo = 'revanced-integrations'; -const patcherRepo = 'revanced-patcher'; -const cliRepo = 'revanced-cli'; -const managerRepo = 'revanced-manager'; +const String patcherRepo = 'revanced-patcher'; +const String cliRepo = 'revanced-cli'; +const String managerRepo = 'revanced-manager'; diff --git a/lib/main.dart b/lib/main.dart index 661cb377..dfa5eadc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,23 +4,22 @@ import 'package:flutter_i18n/flutter_i18n.dart'; // ignore: depend_on_referenced_packages import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/app/app.router.dart'; import 'package:revanced_manager/main_viewmodel.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/patcher_api.dart'; -import 'package:revanced_manager/theme.dart'; +import 'package:revanced_manager/ui/theme/dynamic_theme_builder.dart'; import 'package:revanced_manager/ui/views/home/home_view.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_view.dart'; import 'package:revanced_manager/ui/views/root_checker/root_checker_view.dart'; import 'package:revanced_manager/ui/views/settings/settings_view.dart'; import 'package:stacked/stacked.dart'; -import 'package:stacked_services/stacked_services.dart'; import 'package:stacked_themes/stacked_themes.dart'; Future main() async { await ThemeManager.initialise(); await setupLocator(); WidgetsFlutterBinding.ensureInitialized(); + await locator().initialize(); runApp(const MyApp()); } @@ -29,47 +28,36 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return ThemeBuilder( - defaultThemeMode: ThemeMode.dark, - darkTheme: darkTheme, - lightTheme: lightTheme, - builder: (context, regularTheme, darkTheme, themeMode) => MaterialApp( - debugShowCheckedModeBanner: false, - title: 'ReVanced Manager', - theme: lightTheme, - darkTheme: darkTheme, - themeMode: themeMode, - navigatorKey: StackedService.navigatorKey, - onGenerateRoute: StackedRouter().onGenerateRoute, - home: FutureBuilder( - future: _init(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return snapshot.data!; - } else { - return Center( - child: CircularProgressIndicator( - color: Theme.of(context).colorScheme.secondary, - ), - ); - } - }, - ), - localizationsDelegates: [ - FlutterI18nDelegate( - translationLoader: FileTranslationLoader( - fallbackFile: 'en', - basePath: 'assets/i18n', - ), - ), - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate - ], + return DynamicThemeBuilder( + title: 'ReVanced Manager', + home: FutureBuilder( + future: _init(context), + builder: (context, snapshot) { + if (snapshot.hasData) { + return snapshot.data!; + } else { + return Center( + child: CircularProgressIndicator( + color: Theme.of(context).colorScheme.secondary, + ), + ); + } + }, ), + localizationsDelegates: [ + FlutterI18nDelegate( + translationLoader: FileTranslationLoader( + fallbackFile: 'en', + basePath: 'assets/i18n', + ), + ), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate + ], ); } - Future _init() async { + Future _init(BuildContext context) async { await locator().initialize(); await locator().initialize(); bool? isRooted = locator().isRooted(); diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 08b3f251..8d71d07d 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -49,10 +49,30 @@ class ManagerAPI { return packageInfo.version; } + bool getUseDynamicTheme() { + return _prefs.getBool('useDynamicTheme') ?? false; + } + + Future setUseDynamicTheme(bool value) async { + await _prefs.setBool('useDynamicTheme', value); + } + + bool getUseDarkTheme() { + return _prefs.getBool('useDarkTheme') ?? false; + } + + Future setUseDarkTheme(bool value) async { + await _prefs.setBool('useDarkTheme', value); + } + bool? isRooted() { return _prefs.getBool('isRooted'); } + Future setIsRooted(bool value) async { + await _prefs.setBool('isRooted', value); + } + List getPatchedApps() { List apps = _prefs.getStringList('patchedApps') ?? []; return apps diff --git a/lib/services/patcher_api.dart b/lib/services/patcher_api.dart index ee43a42a..3bf13d89 100644 --- a/lib/services/patcher_api.dart +++ b/lib/services/patcher_api.dart @@ -14,9 +14,7 @@ import 'package:share_extend/share_extend.dart'; @lazySingleton class PatcherAPI { - static const patcherChannel = MethodChannel( - 'app.revanced.manager/patcher', - ); + static const patcherChannel = MethodChannel('app.revanced.manager/patcher'); final ManagerAPI _managerAPI = locator(); final RootAPI _rootAPI = RootAPI(); late Directory _tmpDir; diff --git a/lib/theme.dart b/lib/theme.dart index 3e8e537e..64e540fd 100644 --- a/lib/theme.dart +++ b/lib/theme.dart @@ -1,80 +1,25 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:stacked_themes/stacked_themes.dart'; -import 'app/app.locator.dart'; - -final _themeService = locator(); -bool isDark = _themeService.isDarkMode; - -var lightTheme = ThemeData.light().copyWith( - backgroundColor: const Color.fromARGB(255, 243, 243, 243), - navigationBarTheme: NavigationBarThemeData( - indicatorColor: const Color.fromRGBO(75, 129, 210, 0.20), - backgroundColor: const Color(0xffCBDFFC), - labelTextStyle: MaterialStateProperty.all( - GoogleFonts.roboto( - fontSize: 12, - ), - ), - ), +var lightCustomTheme = ThemeData( useMaterial3: true, - textButtonTheme: TextButtonThemeData( - style: ButtonStyle( - padding: MaterialStateProperty.all( - const EdgeInsets.symmetric( - vertical: 8, - horizontal: 14, - ), - ), - backgroundColor: MaterialStateProperty.all( - const Color(0xff4B7CC6), - ), - ), - ), - toggleableActiveColor: const Color(0xff3868AF), - colorScheme: const ColorScheme.light( - primary: Color.fromRGBO(154, 193, 252, 0.18), - secondary: Color(0xff3868AF), - tertiary: Color(0xff485A74), - background: Color(0xffDFD5EC), + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blue, + brightness: Brightness.light, ), + textTheme: GoogleFonts.robotoTextTheme(ThemeData.light().textTheme), ); -var darkTheme = ThemeData.dark().copyWith( - backgroundColor: const Color(0xff1E1E1E), - navigationBarTheme: NavigationBarThemeData( - iconTheme: MaterialStateProperty.all(const IconThemeData( - color: Colors.white, - )), - indicatorColor: const Color(0xff223144), - backgroundColor: const Color(0x1b222b6b), - labelTextStyle: MaterialStateProperty.all( - GoogleFonts.roboto( - fontSize: 12, - ), - ), - ), +var darkCustomTheme = ThemeData( useMaterial3: true, + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blue, + brightness: Brightness.dark, + primary: const Color(0xff7792BA), + surface: const Color(0xff0A0D11), + ), + canvasColor: const Color(0xff0A0D11), scaffoldBackgroundColor: const Color(0xff0A0D11), - textButtonTheme: TextButtonThemeData( - style: ButtonStyle( - padding: MaterialStateProperty.all( - const EdgeInsets.symmetric( - vertical: 8, - horizontal: 12, - ), - ), - backgroundColor: MaterialStateProperty.all( - const Color.fromRGBO(119, 146, 168, 1), - ), - ), - ), toggleableActiveColor: const Color(0xff7792BA), - colorScheme: const ColorScheme.dark( - primary: Color(0xff11161C), - secondary: Color(0xff7792BA), - tertiary: Color(0xff8691A0), - background: Color(0xff0A0D11), - ), + textTheme: GoogleFonts.robotoTextTheme(ThemeData.dark().textTheme), ); diff --git a/lib/ui/theme/dynamic_theme_builder.dart b/lib/ui/theme/dynamic_theme_builder.dart new file mode 100644 index 00000000..2939158b --- /dev/null +++ b/lib/ui/theme/dynamic_theme_builder.dart @@ -0,0 +1,58 @@ +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:dynamic_themes/dynamic_themes.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/theme.dart'; +import 'package:stacked_services/stacked_services.dart'; + +class DynamicThemeBuilder extends StatelessWidget { + final String title; + final Widget home; + final Iterable localizationsDelegates; + + const DynamicThemeBuilder({ + Key? key, + required this.title, + required this.home, + required this.localizationsDelegates, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return DynamicColorBuilder( + builder: (lightColorScheme, darkColorScheme) { + ThemeData lightDynamicTheme = ThemeData( + useMaterial3: true, + colorScheme: lightColorScheme?.harmonized(), + textTheme: GoogleFonts.robotoTextTheme(ThemeData.light().textTheme), + ); + ThemeData darkDynamicTheme = ThemeData( + useMaterial3: true, + colorScheme: darkColorScheme?.harmonized(), + textTheme: GoogleFonts.robotoTextTheme(ThemeData.dark().textTheme), + ); + return DynamicTheme( + themeCollection: ThemeCollection( + themes: { + 0: lightCustomTheme, + 1: darkCustomTheme, + 2: lightDynamicTheme, + 3: darkDynamicTheme, + }, + fallbackTheme: lightCustomTheme, + ), + builder: (context, theme) => MaterialApp( + debugShowCheckedModeBanner: false, + title: title, + navigatorKey: StackedService.navigatorKey, + onGenerateRoute: StackedRouter().onGenerateRoute, + theme: theme, + home: home, + localizationsDelegates: localizationsDelegates, + ), + ); + }, + ); + } +} diff --git a/lib/ui/views/app_selector/app_selector_view.dart b/lib/ui/views/app_selector/app_selector_view.dart index f2dbba78..b7dc00b0 100644 --- a/lib/ui/views/app_selector/app_selector_view.dart +++ b/lib/ui/views/app_selector/app_selector_view.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/ui/widgets/appSelectorView/installed_app_item.dart'; import 'package:revanced_manager/ui/widgets/shared/search_bar.dart'; import 'package:revanced_manager/ui/widgets/appSelectorView/app_skeleton_loader.dart'; @@ -30,11 +29,6 @@ class _AppSelectorViewState extends State { model.selectAppFromStorage(context); Navigator.of(context).pop(); }, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.surface, ), body: SafeArea( child: Padding( @@ -50,15 +44,10 @@ class _AppSelectorViewState extends State { children: [ SearchBar( showSelectIcon: false, - fillColor: isDark - ? const Color(0xff1B222B) - : Colors.grey[200], hintText: FlutterI18n.translate( context, 'appSelectorView.searchBarHint', ), - hintTextColor: - Theme.of(context).colorScheme.tertiary, onQueryChanged: (searchQuery) { setState(() { _query = searchQuery; diff --git a/lib/ui/views/app_selector/app_selector_viewmodel.dart b/lib/ui/views/app_selector/app_selector_viewmodel.dart index 128cb4bf..52e48fc9 100644 --- a/lib/ui/views/app_selector/app_selector_viewmodel.dart +++ b/lib/ui/views/app_selector/app_selector_viewmodel.dart @@ -6,12 +6,13 @@ import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/models/patched_application.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/patcher_api.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:stacked/stacked.dart'; class AppSelectorViewModel extends BaseViewModel { + final ManagerAPI _managerAPI = locator(); final PatcherAPI _patcherAPI = locator(); final List apps = []; bool noApps = false; @@ -21,8 +22,7 @@ class AppSelectorViewModel extends BaseViewModel { apps.addAll(await _patcherAPI.getFilteredInstalledApps()); apps.sort((a, b) => a.appName.compareTo(b.appName)); noApps = apps.isEmpty; - SharedPreferences prefs = await SharedPreferences.getInstance(); - _isRooted = prefs.getBool('isRooted') ?? false; + _isRooted = _managerAPI.isRooted() ?? false; notifyListeners(); } diff --git a/lib/ui/views/home/home_view.dart b/lib/ui/views/home/home_view.dart index a3218d2b..a2c7e2d2 100644 --- a/lib/ui/views/home/home_view.dart +++ b/lib/ui/views/home/home_view.dart @@ -2,10 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/homeView/available_updates_card.dart'; -import 'package:revanced_manager/ui/widgets/homeView/dashboard_raw_chip.dart'; +import 'package:revanced_manager/ui/widgets/homeView/dashboard_chip.dart'; import 'package:revanced_manager/ui/widgets/homeView/installed_apps_card.dart'; import 'package:revanced_manager/ui/widgets/homeView/latest_commit_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; @@ -29,8 +28,7 @@ class HomeView extends StatelessWidget { child: Text( '', style: GoogleFonts.inter( - color: Theme.of(context).textTheme.headline5!.color, - fontWeight: FontWeight.w500, + color: Theme.of(context).textTheme.headline6!.color, ), ), ), @@ -44,13 +42,7 @@ class HomeView extends StatelessWidget { 'homeView.updatesSubtitle', child: Text( '', - style: GoogleFonts.inter( - fontSize: 20, - fontWeight: FontWeight.w500, - color: isDark - ? const Color(0xffD1E1FA) - : const Color(0xff384E6E), - ), + style: Theme.of(context).textTheme.headline6!, ), ), const SizedBox(height: 10), @@ -62,12 +54,7 @@ class HomeView extends StatelessWidget { 'homeView.patchedSubtitle', child: Text( '', - style: GoogleFonts.inter( - fontSize: 20, - color: isDark - ? const Color(0xffD1E1FA) - : const Color(0xff384E6E), - ), + style: Theme.of(context).textTheme.headline6!, ), ), const SizedBox(height: 8), diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index a856ab9d..27ed7a0e 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -3,6 +3,7 @@ import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/ui/views/installer/installer_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/installerView/custom_material_button.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; import 'package:stacked/stacked.dart'; @@ -23,14 +24,13 @@ class InstallerView extends StatelessWidget { title: Text( model.headerLogs, style: GoogleFonts.inter( - color: Theme.of(context).textTheme.headline5!.color, - fontWeight: FontWeight.w500, + color: Theme.of(context).textTheme.headline6!.color, ), ), bottom: PreferredSize( preferredSize: const Size(double.infinity, 1.0), child: LinearProgressIndicator( - color: Theme.of(context).colorScheme.secondary, + color: Theme.of(context).colorScheme.primary, backgroundColor: Colors.white, value: model.progress, ), @@ -41,13 +41,7 @@ class InstallerView extends StatelessWidget { sliver: SliverList( delegate: SliverChildListDelegate.fixed( [ - Container( - padding: const EdgeInsets.all(12.0), - width: double.infinity, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - borderRadius: BorderRadius.circular(12), - ), + CustomCard( child: Text( model.logs, style: GoogleFonts.jetBrainsMono( diff --git a/lib/ui/views/patcher/patcher_view.dart b/lib/ui/views/patcher/patcher_view.dart index 5d360906..b0a74182 100644 --- a/lib/ui/views/patcher/patcher_view.dart +++ b/lib/ui/views/patcher/patcher_view.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/ui/views/app_selector/app_selector_view.dart'; import 'package:revanced_manager/ui/views/installer/installer_view.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; @@ -30,11 +29,6 @@ class PatcherView extends StatelessWidget { label: I18nText('patcherView.patchButton'), icon: const Icon(Icons.build), onPressed: openContainer, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.surface, ), ), ), @@ -46,8 +40,7 @@ class PatcherView extends StatelessWidget { child: Text( '', style: GoogleFonts.inter( - color: Theme.of(context).textTheme.headline5!.color, - fontWeight: FontWeight.w500, + color: Theme.of(context).textTheme.headline6!.color, ), ), ), @@ -65,9 +58,7 @@ class PatcherView extends StatelessWidget { ), const SizedBox(height: 16), Opacity( - opacity: isDark - ? (model.dimPatchesCard() ? 0.5 : 1) - : (model.dimPatchesCard() ? 0.75 : 1), + opacity: model.dimPatchesCard() ? 0.5 : 1, child: OpenContainerWrapper( openBuilder: (_, __) => const PatchesSelectorView(), closedBuilder: (_, openContainer) => PatchSelectorCard( diff --git a/lib/ui/views/patches_selector/patches_selector_view.dart b/lib/ui/views/patches_selector/patches_selector_view.dart index 979e6709..26943361 100644 --- a/lib/ui/views/patches_selector/patches_selector_view.dart +++ b/lib/ui/views/patches_selector/patches_selector_view.dart @@ -2,7 +2,6 @@ import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/patchesSelectorView/patch_item.dart'; import 'package:revanced_manager/ui/widgets/patchesSelectorView/patch_options_fields.dart'; @@ -35,11 +34,6 @@ class _PatchesSelectorViewState extends State { model.selectPatches(); Navigator.of(context).pop(); }, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.surface, ), ), body: SafeArea( @@ -49,20 +43,17 @@ class _PatchesSelectorViewState extends State { child: model.patches.isEmpty ? Center( child: CircularProgressIndicator( - color: Theme.of(context).colorScheme.secondary, + color: Theme.of(context).colorScheme.primary, ), ) : Column( children: [ SearchBar( showSelectIcon: true, - fillColor: - isDark ? const Color(0xff1B222B) : Colors.grey[200], hintText: FlutterI18n.translate( context, 'patchesSelectorView.searchBarHint', ), - hintTextColor: Theme.of(context).colorScheme.tertiary, onQueryChanged: (searchQuery) { setState(() { _query = searchQuery; diff --git a/lib/ui/views/root_checker/root_checker_view.dart b/lib/ui/views/root_checker/root_checker_view.dart index f2d311a4..5559c5ee 100644 --- a/lib/ui/views/root_checker/root_checker_view.dart +++ b/lib/ui/views/root_checker/root_checker_view.dart @@ -17,11 +17,6 @@ class RootCheckerView extends StatelessWidget { label: I18nText('rootCheckerView.nonRootButton'), icon: const Icon(Icons.keyboard_arrow_right), onPressed: () => model.navigateAsNonRoot(), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.surface, ), body: Container( height: double.infinity, @@ -41,10 +36,10 @@ class RootCheckerView extends StatelessWidget { const SizedBox(height: 24), I18nText( 'rootCheckerView.widgetDescription', - child: Text( + child: const Text( '', textAlign: TextAlign.center, - style: GoogleFonts.roboto( + style: TextStyle( fontSize: 17, letterSpacing: 1.1, ), @@ -62,10 +57,6 @@ class RootCheckerView extends StatelessWidget { translationParams: { 'isRooted': model.isRooted.toString(), }, - child: Text( - '', - style: GoogleFonts.poppins(), - ), ), ], ), diff --git a/lib/ui/views/root_checker/root_checker_viewmodel.dart b/lib/ui/views/root_checker/root_checker_viewmodel.dart index 296610c2..a4e89e66 100644 --- a/lib/ui/views/root_checker/root_checker_viewmodel.dart +++ b/lib/ui/views/root_checker/root_checker_viewmodel.dart @@ -1,12 +1,13 @@ import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:stacked/stacked.dart'; import 'package:root/root.dart'; import 'package:stacked_services/stacked_services.dart'; class RootCheckerViewModel extends BaseViewModel { final NavigationService _navigationService = locator(); + final ManagerAPI _managerAPI = locator(); bool isRooted = false; Future navigateAsRoot() async { @@ -25,8 +26,7 @@ class RootCheckerViewModel extends BaseViewModel { } Future navigateToHome() async { - final prefs = await SharedPreferences.getInstance(); - await prefs.setBool('isRooted', isRooted); + _managerAPI.setIsRooted(isRooted); _navigationService.navigateTo(Routes.navigation); } } diff --git a/lib/ui/views/settings/settings_view.dart b/lib/ui/views/settings/settings_view.dart index ecb4b5cc..e35014fd 100644 --- a/lib/ui/views/settings/settings_view.dart +++ b/lib/ui/views/settings/settings_view.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/constants.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/ui/views/contributors/contributors_view.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/about_widget.dart'; @@ -14,7 +12,6 @@ import 'package:revanced_manager/ui/widgets/settingsView/sources_widget.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; import 'package:revanced_manager/ui/widgets/shared/open_container_wrapper.dart'; import 'package:stacked/stacked.dart'; -import 'package:stacked_themes/stacked_themes.dart'; class SettingsView extends StatelessWidget { final TextEditingController organizationController = TextEditingController(); @@ -37,8 +34,7 @@ class SettingsView extends StatelessWidget { child: Text( '', style: GoogleFonts.inter( - color: Theme.of(context).textTheme.headline5!.color, - fontWeight: FontWeight.w500, + color: Theme.of(context).textTheme.headline6!.color, ), ), ), @@ -56,18 +52,39 @@ class SettingsView extends StatelessWidget { children: [ CustomSwitchTile( title: I18nText( - 'settingsView.themeLabel', - child: Text( + 'settingsView.darkThemeLabel', + child: const Text( '', - style: kSettingItemTextStyle, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), ), ), - subtitle: I18nText('settingsView.themeHint'), - value: isDark, - onTap: (value) { - isDark = value; - getThemeManager(context).toggleDarkLightTheme(); - }, + subtitle: I18nText('settingsView.darkThemeHint'), + value: model.getDarkThemeStatus(), + onTap: (value) => model.setUseDarkTheme( + context, + value, + ), + ), + CustomSwitchTile( + title: I18nText( + 'settingsView.dynamicThemeLabel', + child: const Text( + '', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + ), + subtitle: I18nText('settingsView.dynamicThemeHint'), + value: model.getDynamicThemeStatus(), + onTap: (value) => model.setUseDynamicTheme( + context, + value, + ), ), ], ), @@ -102,9 +119,12 @@ class SettingsView extends StatelessWidget { contentPadding: EdgeInsets.zero, title: I18nText( 'settingsView.rootModeLabel', - child: Text( + child: const Text( '', - style: kSettingItemTextStyle, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), ), ), subtitle: I18nText('settingsView.rootModeHint'), @@ -129,7 +149,13 @@ class SettingsView extends StatelessWidget { contentPadding: EdgeInsets.zero, title: I18nText( 'settingsView.contributorsLabel', - child: Text('', style: kSettingItemTextStyle), + child: const Text( + '', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), ), subtitle: I18nText('settingsView.contributorsHint'), onTap: openContainer, diff --git a/lib/ui/views/settings/settings_viewmodel.dart b/lib/ui/views/settings/settings_viewmodel.dart index 444a127e..00a04efc 100644 --- a/lib/ui/views/settings/settings_viewmodel.dart +++ b/lib/ui/views/settings/settings_viewmodel.dart @@ -1,13 +1,18 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:dynamic_themes/dynamic_themes.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; import 'package:timeago/timeago.dart'; class SettingsViewModel extends BaseViewModel { final NavigationService _navigationService = locator(); + final ManagerAPI _managerAPI = locator(); void setLanguage(String language) { notifyListeners(); @@ -23,4 +28,34 @@ class SettingsViewModel extends BaseViewModel { setLocaleMessages(value, EnMessages()); } } + + bool getDynamicThemeStatus() { + return _managerAPI.getUseDynamicTheme(); + } + + void setUseDynamicTheme(BuildContext context, bool value) async { + await _managerAPI.setUseDynamicTheme(value); + int currentTheme = DynamicTheme.of(context)!.themeId; + if (currentTheme.isEven) { + DynamicTheme.of(context)!.setTheme(value ? 2 : 0); + } else { + DynamicTheme.of(context)!.setTheme(value ? 3 : 1); + } + notifyListeners(); + } + + bool getDarkThemeStatus() { + return _managerAPI.getUseDarkTheme(); + } + + void setUseDarkTheme(BuildContext context, bool value) async { + await _managerAPI.setUseDarkTheme(value); + int currentTheme = DynamicTheme.of(context)!.themeId; + if (currentTheme < 2) { + DynamicTheme.of(context)!.setTheme(value ? 1 : 0); + } else { + DynamicTheme.of(context)!.setTheme(value ? 3 : 2); + } + notifyListeners(); + } } diff --git a/lib/ui/widgets/appSelectorView/installed_app_item.dart b/lib/ui/widgets/appSelectorView/installed_app_item.dart index 126f13ec..8429834e 100644 --- a/lib/ui/widgets/appSelectorView/installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/installed_app_item.dart @@ -1,7 +1,6 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/constants.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class InstalledAppItem extends StatefulWidget { final String name; @@ -24,12 +23,7 @@ class _InstalledAppItemState extends State { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Container( - padding: const EdgeInsets.all(12.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), + child: CustomCard( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -52,16 +46,13 @@ class _InstalledAppItemState extends State { widget.name, maxLines: 2, overflow: TextOverflow.visible, - style: GoogleFonts.inter( + style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 4), - Text( - widget.pkgName, - style: kRobotoTextStyle, - ), + Text(widget.pkgName), ], ), ), diff --git a/lib/ui/widgets/contributorsView/contributors_card.dart b/lib/ui/widgets/contributorsView/contributors_card.dart index 651b20e7..621650cf 100644 --- a/lib/ui/widgets/contributorsView/contributors_card.dart +++ b/lib/ui/widgets/contributorsView/contributors_card.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:github/github.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/theme.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:url_launcher/url_launcher.dart'; class ContributorsCard extends StatefulWidget { @@ -23,54 +22,49 @@ class ContributorsCard extends StatefulWidget { class _ContributorsCardState extends State { @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0, horizontal: 4.0), - child: Text( - widget.title, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w600, + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Text( + widget.title, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + ), ), ), - ), - Container( - margin: const EdgeInsets.all(8.0), - padding: const EdgeInsets.all(4.0), - decoration: BoxDecoration( - color: isDark - ? Theme.of(context).colorScheme.primary - : Theme.of(context).navigationBarTheme.backgroundColor!, - borderRadius: BorderRadius.circular(12), - ), - height: widget.height, - child: GridView.builder( - physics: const NeverScrollableScrollPhysics(), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 7, - mainAxisSpacing: 8, - crossAxisSpacing: 8, - ), - itemCount: widget.contributors.length, - itemBuilder: (context, index) { - return ClipRRect( - borderRadius: BorderRadius.circular(100), - child: GestureDetector( - onTap: () => - launchUrl(Uri.parse(widget.contributors[index].htmlUrl!)), - child: Image.network( - widget.contributors[index].avatarUrl!, - height: 40, - width: 40, + CustomCard( + child: GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 7, + mainAxisSpacing: 8, + crossAxisSpacing: 8, + ), + itemCount: widget.contributors.length, + itemBuilder: (context, index) { + return ClipRRect( + borderRadius: BorderRadius.circular(100), + child: GestureDetector( + onTap: () => launchUrl( + Uri.parse(widget.contributors[index].htmlUrl!)), + child: Image.network( + widget.contributors[index].avatarUrl!, + height: 40, + width: 40, + ), ), - ), - ); - }, + ); + }, + ), ), - ), - ], + ], + ), ); } } diff --git a/lib/ui/widgets/homeView/available_updates_card.dart b/lib/ui/widgets/homeView/available_updates_card.dart index 65b05384..48cb42cc 100644 --- a/lib/ui/widgets/homeView/available_updates_card.dart +++ b/lib/ui/widgets/homeView/available_updates_card.dart @@ -4,6 +4,7 @@ import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/application_item.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class AvailableUpdatesCard extends StatelessWidget { AvailableUpdatesCard({Key? key}) : super(key: key); @@ -14,28 +15,18 @@ class AvailableUpdatesCard extends StatelessWidget { @override Widget build(BuildContext context) { return apps.isEmpty - ? Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20), + ? CustomCard( child: Center( child: Column( children: [ - Icon( - Icons.update_disabled, - size: 40, - color: Theme.of(context).colorScheme.secondary, - ), + const Icon(Icons.update_disabled, size: 40), const SizedBox(height: 16), I18nText( 'homeView.noUpdates', child: Text( '', textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1!.copyWith( - color: Theme.of(context).colorScheme.secondary), + style: Theme.of(context).textTheme.subtitle1!, ), ) ], diff --git a/lib/ui/widgets/homeView/dashboard_chip.dart b/lib/ui/widgets/homeView/dashboard_chip.dart new file mode 100644 index 00000000..57aa337f --- /dev/null +++ b/lib/ui/widgets/homeView/dashboard_chip.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class DashboardChip extends StatelessWidget { + final Widget label; + final bool isSelected; + final Function(bool)? onSelected; + + const DashboardChip({ + Key? key, + required this.label, + required this.isSelected, + this.onSelected, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return RawChip( + showCheckmark: false, + label: label, + selected: isSelected, + labelStyle: Theme.of(context).textTheme.subtitle2!.copyWith( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, + ), + backgroundColor: Colors.transparent, + selectedColor: Theme.of(context).colorScheme.secondaryContainer, + padding: const EdgeInsets.all(10), + onSelected: onSelected, + ); + } +} diff --git a/lib/ui/widgets/homeView/dashboard_raw_chip.dart b/lib/ui/widgets/homeView/dashboard_raw_chip.dart deleted file mode 100644 index d715e903..00000000 --- a/lib/ui/widgets/homeView/dashboard_raw_chip.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/theme.dart'; - -class DashboardChip extends StatelessWidget { - final Widget label; - final bool isSelected; - final Function(bool)? onSelected; - - const DashboardChip({ - Key? key, - required this.label, - required this.isSelected, - this.onSelected, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return RawChip( - showCheckmark: false, - label: label, - selected: isSelected, - labelStyle: GoogleFonts.inter( - color: isSelected - ? isDark - ? const Color(0xff95C0FE) - : Theme.of(context).colorScheme.secondary - : isDark - ? Colors.grey - : Colors.grey[700], - fontWeight: FontWeight.w500, - ), - backgroundColor: - isDark ? Theme.of(context).colorScheme.background : Colors.white, - selectedColor: const Color.fromRGBO(118, 155, 209, 0.42), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - side: BorderSide( - width: 1, - color: isDark - ? isSelected - ? const Color.fromRGBO(118, 155, 209, 0.42) - : Colors.grey - : isSelected - ? const Color.fromRGBO(118, 155, 209, 0.42) - : Colors.grey, - ), - ), - onSelected: onSelected, - ); - } -} diff --git a/lib/ui/widgets/homeView/installed_apps_card.dart b/lib/ui/widgets/homeView/installed_apps_card.dart index f3bc0c17..ae0a0fc9 100644 --- a/lib/ui/widgets/homeView/installed_apps_card.dart +++ b/lib/ui/widgets/homeView/installed_apps_card.dart @@ -5,6 +5,7 @@ import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/application_item.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class InstalledAppsCard extends StatelessWidget { InstalledAppsCard({Key? key}) : super(key: key); @@ -15,28 +16,18 @@ class InstalledAppsCard extends StatelessWidget { @override Widget build(BuildContext context) { return apps.isEmpty - ? Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20), + ? CustomCard( child: Center( child: Column( children: [ - Icon( - Icons.file_download_off, - size: 40, - color: Theme.of(context).colorScheme.secondary, - ), + const Icon(Icons.file_download_off, size: 40), const SizedBox(height: 16), I18nText( 'homeView.noInstallations', child: Text( '', textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1!.copyWith( - color: Theme.of(context).colorScheme.secondary), + style: Theme.of(context).textTheme.subtitle1!, ), ) ], diff --git a/lib/ui/widgets/homeView/latest_commit_card.dart b/lib/ui/widgets/homeView/latest_commit_card.dart index 3265196c..6c216cf3 100644 --- a/lib/ui/widgets/homeView/latest_commit_card.dart +++ b/lib/ui/widgets/homeView/latest_commit_card.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; -import 'package:revanced_manager/ui/widgets/shared/patch_text_button.dart'; +import 'package:revanced_manager/ui/widgets/installerView/custom_material_button.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class LatestCommitCard extends StatefulWidget { final Function() onPressed; @@ -24,12 +24,7 @@ class _LatestCommitCardState extends State { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20), + return CustomCard( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -40,11 +35,9 @@ class _LatestCommitCardState extends State { children: [ I18nText( 'latestCommitCard.patcherLabel', - child: Text( + child: const Text( '', - style: GoogleFonts.roboto( - fontWeight: FontWeight.w700, - ), + style: TextStyle(fontWeight: FontWeight.bold), ), ), FutureBuilder( @@ -60,7 +53,6 @@ class _LatestCommitCardState extends State { context, 'latestCommitCard.loadingLabel', ), - style: kRobotoTextStyle, ), ), ], @@ -70,28 +62,20 @@ class _LatestCommitCardState extends State { children: [ I18nText( 'latestCommitCard.managerLabel', - child: Text( + child: const Text( '', - style: GoogleFonts.roboto( - fontWeight: FontWeight.w700, - ), + style: TextStyle(fontWeight: FontWeight.bold), ), ), FutureBuilder( future: _githubAPI.latestCommitTime(ghOrg, managerRepo), - builder: (context, snapshot) => Text( - snapshot.hasData && snapshot.data!.isNotEmpty - ? FlutterI18n.translate( - context, - 'latestCommitCard.timeagoLabel', - translationParams: {'time': snapshot.data!}, - ) - : FlutterI18n.translate( - context, - 'latestCommitCard.loadingLabel', - ), - style: kRobotoTextStyle, - ), + builder: (context, snapshot) => + snapshot.hasData && snapshot.data!.isNotEmpty + ? I18nText( + 'latestCommitCard.timeagoLabel', + translationParams: {'time': snapshot.data!}, + ) + : I18nText('latestCommitCard.loadingLabel'), ), ], ), @@ -101,17 +85,13 @@ class _LatestCommitCardState extends State { future: locator().hasManagerUpdates(), initialData: false, builder: (context, snapshot) => Opacity( - opacity: snapshot.hasData && snapshot.data! ? 1.0 : 0.5, - child: PatchTextButton( - text: FlutterI18n.translate( - context, - 'latestCommitCard.updateButton', - ), + opacity: snapshot.hasData && snapshot.data! ? 1.0 : 1.0, + child: CustomMaterialButton( + isExpanded: false, + label: I18nText('latestCommitCard.updateButton'), onPressed: snapshot.hasData && snapshot.data! ? widget.onPressed : () => {}, - backgroundColor: Theme.of(context).colorScheme.secondary, - borderColor: Theme.of(context).colorScheme.secondary, ), ), ), diff --git a/lib/ui/widgets/installerView/custom_material_button.dart b/lib/ui/widgets/installerView/custom_material_button.dart index 54c884e8..772e66a2 100644 --- a/lib/ui/widgets/installerView/custom_material_button.dart +++ b/lib/ui/widgets/installerView/custom_material_button.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:revanced_manager/theme.dart'; class CustomMaterialButton extends StatelessWidget { final Widget label; @@ -21,43 +20,17 @@ class CustomMaterialButton extends StatelessWidget { style: ButtonStyle( padding: MaterialStateProperty.all( isExpanded - ? const EdgeInsets.symmetric( - horizontal: 24, - vertical: 12, - ) - : const EdgeInsets.symmetric( - horizontal: 20, - vertical: 12, - ), - ), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(100), - side: BorderSide( - width: 1, - color: Theme.of(context).colorScheme.secondary, - ), - ), - ), - side: MaterialStateProperty.all( - BorderSide( - color: isFilled - ? Colors.transparent - : Theme.of(context).iconTheme.color!.withOpacity(0.4), - width: 1, - ), + ? const EdgeInsets.symmetric(horizontal: 24, vertical: 12) + : const EdgeInsets.symmetric(horizontal: 20, vertical: 12), ), + shape: MaterialStateProperty.all(const StadiumBorder()), backgroundColor: MaterialStateProperty.all( - isFilled - ? Theme.of(context).colorScheme.secondary - : isDark - ? Theme.of(context).colorScheme.background - : Colors.white, + isFilled ? Theme.of(context).colorScheme.primary : Colors.transparent, ), foregroundColor: MaterialStateProperty.all( isFilled - ? Theme.of(context).colorScheme.background - : Theme.of(context).colorScheme.secondary, + ? Theme.of(context).colorScheme.surface + : Theme.of(context).colorScheme.primary, ), ), onPressed: onPressed, diff --git a/lib/ui/widgets/patcherView/app_selector_card.dart b/lib/ui/widgets/patcherView/app_selector_card.dart index ee8780e0..9630719e 100644 --- a/lib/ui/widgets/patcherView/app_selector_card.dart +++ b/lib/ui/widgets/patcherView/app_selector_card.dart @@ -1,10 +1,9 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class AppSelectorCard extends StatelessWidget { final Function() onPressed; @@ -18,13 +17,7 @@ class AppSelectorCard extends StatelessWidget { Widget build(BuildContext context) { return GestureDetector( onTap: onPressed, - child: Container( - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20), + child: CustomCard( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -32,9 +25,9 @@ class AppSelectorCard extends StatelessWidget { locator().selectedApp == null ? 'appSelectorCard.widgetTitle' : 'appSelectorCard.widgetTitleSelected', - child: Text( + child: const Text( '', - style: GoogleFonts.roboto( + style: TextStyle( fontSize: 18, fontWeight: FontWeight.w500, ), @@ -42,13 +35,7 @@ class AppSelectorCard extends StatelessWidget { ), const SizedBox(height: 10), locator().selectedApp == null - ? I18nText( - 'appSelectorCard.widgetSubtitle', - child: Text( - '', - style: kRobotoTextStyle, - ), - ) + ? I18nText('appSelectorCard.widgetSubtitle') : Row( children: [ SizedBox( @@ -63,10 +50,7 @@ class AppSelectorCard extends StatelessWidget { ), ), const SizedBox(width: 4), - Text( - _getAppSelection(), - style: kRobotoTextStyle, - ), + Text(_getAppSelection()), ], ), ], diff --git a/lib/ui/widgets/patcherView/patch_selector_card.dart b/lib/ui/widgets/patcherView/patch_selector_card.dart index c19014f4..1c4a521e 100644 --- a/lib/ui/widgets/patcherView/patch_selector_card.dart +++ b/lib/ui/widgets/patcherView/patch_selector_card.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class PatchSelectorCard extends StatelessWidget { final Function() onPressed; @@ -18,13 +17,7 @@ class PatchSelectorCard extends StatelessWidget { Widget build(BuildContext context) { return GestureDetector( onTap: onPressed, - child: Container( - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 20), + child: CustomCard( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -32,9 +25,9 @@ class PatchSelectorCard extends StatelessWidget { locator().selectedPatches.isEmpty ? 'patchSelectorCard.widgetTitle' : 'patchSelectorCard.widgetTitleSelected', - child: Text( + child: const Text( '', - style: GoogleFonts.roboto( + style: TextStyle( fontSize: 18, fontWeight: FontWeight.w500, ), @@ -42,25 +35,10 @@ class PatchSelectorCard extends StatelessWidget { ), const SizedBox(height: 10), locator().selectedApp == null - ? I18nText( - 'patchSelectorCard.widgetSubtitle', - child: Text( - '', - style: kRobotoTextStyle, - ), - ) + ? I18nText('patchSelectorCard.widgetSubtitle') : locator().selectedPatches.isEmpty - ? I18nText( - 'patchSelectorCard.widgetEmptySubtitle', - child: Text( - '', - style: kRobotoTextStyle, - ), - ) - : Text( - _getPatchesSelection(), - style: kRobotoTextStyle, - ), + ? I18nText('patchSelectorCard.widgetEmptySubtitle') + : Text(_getPatchesSelection()), ], ), ), diff --git a/lib/ui/widgets/patchesSelectorView/patch_item.dart b/lib/ui/widgets/patchesSelectorView/patch_item.dart index 9f6e3acc..a21b23fe 100644 --- a/lib/ui/widgets/patchesSelectorView/patch_item.dart +++ b/lib/ui/widgets/patchesSelectorView/patch_item.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/ui/widgets/patchesSelectorView/patch_options_fields.dart'; -import 'package:revanced_manager/ui/widgets/shared/patch_text_button.dart'; +import 'package:revanced_manager/ui/widgets/installerView/custom_material_button.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; // ignore: must_be_immutable class PatchItem extends StatefulWidget { @@ -43,96 +43,92 @@ class _PatchItemState extends State { setState(() => widget.isSelected = !widget.isSelected); widget.onChanged(widget.isSelected); }, - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - borderRadius: BorderRadius.circular(12), - ), - padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 12), - margin: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text( - widget.simpleName, - style: GoogleFonts.inter( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(width: 4), - Text(widget.version) - ], - ), - const SizedBox(height: 4), - Text( - widget.description, - softWrap: true, - maxLines: 3, - overflow: TextOverflow.visible, - style: GoogleFonts.roboto( - fontSize: 14, - ), - ), - ], - ), - ), - Transform.scale( - scale: 1.2, - child: Checkbox( - value: widget.isSelected, - activeColor: Theme.of(context).colorScheme.secondary, - onChanged: (newValue) { - setState(() => widget.isSelected = newValue!); - widget.onChanged(widget.isSelected); - }, - ), - ) - ], - ), - widget.isUnsupported - ? Row( - children: [ - Padding( - padding: const EdgeInsets.only(top: 8), - child: TextButton.icon( - label: I18nText('patchItem.unsupportedWarningButton'), - icon: const Icon(Icons.warning), - onPressed: () => _showUnsupportedWarningDialog(), - style: ButtonStyle( - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - side: BorderSide( - width: 1, - color: - Theme.of(context).colorScheme.secondary, - ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: CustomCard( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + widget.simpleName, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, ), ), - backgroundColor: MaterialStateProperty.all( - Colors.transparent, - ), - foregroundColor: MaterialStateProperty.all( - Theme.of(context).colorScheme.secondary, + const SizedBox(width: 4), + Text(widget.version) + ], + ), + const SizedBox(height: 4), + Text( + widget.description, + softWrap: true, + maxLines: 3, + overflow: TextOverflow.visible, + style: const TextStyle(fontSize: 14), + ), + ], + ), + ), + Transform.scale( + scale: 1.2, + child: Checkbox( + value: widget.isSelected, + activeColor: Theme.of(context).colorScheme.primary, + onChanged: (newValue) { + setState(() => widget.isSelected = newValue!); + widget.onChanged(widget.isSelected); + }, + ), + ) + ], + ), + widget.isUnsupported + ? Row( + children: [ + Padding( + padding: const EdgeInsets.only(top: 8), + child: TextButton.icon( + label: + I18nText('patchItem.unsupportedWarningButton'), + icon: const Icon(Icons.warning), + onPressed: () => _showUnsupportedWarningDialog(), + style: ButtonStyle( + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: BorderSide( + width: 1, + color: + Theme.of(context).colorScheme.primary, + ), + ), + ), + backgroundColor: MaterialStateProperty.all( + Colors.transparent, + ), + foregroundColor: MaterialStateProperty.all( + Theme.of(context).colorScheme.primary, + ), ), ), ), - ), - ], - ) - : Container(), - widget.child ?? const SizedBox(), - ], + ], + ) + : Container(), + widget.child ?? const SizedBox(), + ], + ), ), ), ); @@ -152,14 +148,13 @@ class _PatchItemState extends State { }, ), actions: [ - PatchTextButton( - text: FlutterI18n.translate(context, 'okButton'), + CustomMaterialButton( + isFilled: true, + label: I18nText('okButton'), onPressed: () => Navigator.of(context).pop(), - backgroundColor: Theme.of(context).colorScheme.secondary, - borderColor: Theme.of(context).colorScheme.secondary, ) ], - backgroundColor: Theme.of(context).colorScheme.surface, + backgroundColor: Theme.of(context).colorScheme.secondaryContainer, ), ); } diff --git a/lib/ui/widgets/rootCheckerView/magisk_button.dart b/lib/ui/widgets/rootCheckerView/magisk_button.dart index a59d434d..cf678f3f 100644 --- a/lib/ui/widgets/rootCheckerView/magisk_button.dart +++ b/lib/ui/widgets/rootCheckerView/magisk_button.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:google_fonts/google_fonts.dart'; class MagiskButton extends StatelessWidget { final Function() onPressed; @@ -20,7 +19,7 @@ class MagiskButton extends StatelessWidget { onTap: onPressed, child: CircleAvatar( radius: 32, - backgroundColor: Theme.of(context).colorScheme.secondary, + backgroundColor: Theme.of(context).colorScheme.primary, child: SvgPicture.asset( 'assets/images/magisk.svg', color: Theme.of(context).colorScheme.surface, @@ -32,11 +31,9 @@ class MagiskButton extends StatelessWidget { const SizedBox(height: 8), I18nText( 'rootCheckerView.grantPermission', - child: Text( + child: const Text( '', - style: GoogleFonts.poppins( - fontSize: 15, - ), + style: TextStyle(fontSize: 15), ), ), ], diff --git a/lib/ui/widgets/settingsView/about_widget.dart b/lib/ui/widgets/settingsView/about_widget.dart index b5b274ce..db20f536 100644 --- a/lib/ui/widgets/settingsView/about_widget.dart +++ b/lib/ui/widgets/settingsView/about_widget.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:revanced_manager/constants.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/utils/about_info.dart'; import 'package:flutter/services.dart'; @@ -22,7 +20,13 @@ class _AboutWidgetState extends State { children: [ I18nText( 'settingsView.aboutLabel', - child: Text('', style: kSettingItemTextStyle), + child: const Text( + '', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), ), const SizedBox(height: 4), FutureBuilder>( @@ -42,30 +46,50 @@ class _AboutWidgetState extends State { ); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - 'Copied to clipboard', - style: TextStyle( - color: isDark ? Colors.white : Colors.grey[300], - ), - ), - backgroundColor: Theme.of(context).colorScheme.tertiary, + content: const Text('Copied to clipboard'), + backgroundColor: + Theme.of(context).colorScheme.secondary, ), ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Version: ${snapshot.data!['version']}', - style: kSettingItemSubtitleTextStyle), - Text('Build: ${snapshot.data!['buildNumber']}', - style: kSettingItemSubtitleTextStyle), - Text('Model: ${snapshot.data!['model']}', - style: kSettingItemSubtitleTextStyle), Text( - 'Android Version: ${snapshot.data!['androidVersion']}', - style: kSettingItemSubtitleTextStyle), - Text('Arch: ${snapshot.data!['arch']}', - style: kSettingItemSubtitleTextStyle), + 'Version: ${snapshot.data!['version']}', + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w300, + ), + ), + Text( + 'Build: ${snapshot.data!['buildNumber']}', + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w300, + ), + ), + Text( + 'Model: ${snapshot.data!['model']}', + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w300, + ), + ), + Text( + 'Android Version: ${snapshot.data!['androidVersion']}', + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w300, + ), + ), + Text( + 'Arch: ${snapshot.data!['arch']}', + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w300, + ), + ), ], ), ); diff --git a/lib/ui/widgets/settingsView/custom_switch.dart b/lib/ui/widgets/settingsView/custom_switch.dart index ef936395..5a25b2bf 100644 --- a/lib/ui/widgets/settingsView/custom_switch.dart +++ b/lib/ui/widgets/settingsView/custom_switch.dart @@ -12,8 +12,6 @@ class CustomSwitch extends StatelessWidget { @override Widget build(BuildContext context) { - Color? activeColor = Theme.of(context).colorScheme.tertiary; - Color? inactiveColor = Theme.of(context).colorScheme.secondary; return GestureDetector( onTap: () => onChanged(!value), child: SizedBox( @@ -30,7 +28,9 @@ class CustomSwitch extends StatelessWidget { borderRadius: const BorderRadius.all( Radius.circular(25.0), ), - color: !value ? activeColor : inactiveColor, + color: value + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.secondary, ), ), AnimatedAlign( diff --git a/lib/ui/widgets/settingsView/custom_text_field.dart b/lib/ui/widgets/settingsView/custom_text_field.dart index 8ea2942c..6ee7fcab 100644 --- a/lib/ui/widgets/settingsView/custom_text_field.dart +++ b/lib/ui/widgets/settingsView/custom_text_field.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:revanced_manager/theme.dart'; class CustomTextField extends StatelessWidget { final TextEditingController inputController; @@ -17,69 +16,55 @@ class CustomTextField extends StatelessWidget { @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 8), - TextField( - controller: inputController, - onChanged: onChanged, - keyboardType: TextInputType.text, - style: TextStyle( - fontSize: 14, - color: Theme.of(context).textTheme.headline5!.color, + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8), + TextField( + controller: inputController, + onChanged: onChanged, + keyboardType: TextInputType.text, + decoration: InputDecoration( + label: label, + filled: true, + fillColor: Theme.of(context).colorScheme.secondaryContainer, + hintText: hint, + contentPadding: const EdgeInsets.symmetric( + vertical: 0.0, + horizontal: 20.0, ), - cursorColor: Theme.of(context).textTheme.headline5!.color, - decoration: InputDecoration( - label: label, - labelStyle: TextStyle( - color: isDark ? Colors.grey[300] : Colors.black, + border: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 1.0, ), - filled: true, - fillColor: Theme.of(context).colorScheme.primary, - hintText: hint, - hintStyle: TextStyle( - color: Colors.grey.withOpacity(.75), + borderRadius: BorderRadius.circular(10), + gapPadding: 4.0, + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 2.0, ), - contentPadding: const EdgeInsets.symmetric( - vertical: 0.0, - horizontal: 20.0, + borderRadius: BorderRadius.circular(10), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.red, + width: 1.0, ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.tertiary, - width: 1.0, - ), - borderRadius: BorderRadius.circular(10), - gapPadding: 4.0, - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.secondary, - width: 2.0, - ), - borderRadius: BorderRadius.circular(10), - ), - errorBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffEF4444), - width: 1.0, - ), - borderRadius: BorderRadius.circular(10), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.tertiary, - width: 1.0, - ), - borderRadius: BorderRadius.circular(10), + borderRadius: BorderRadius.circular(10), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 1.0, ), + borderRadius: BorderRadius.circular(10), ), ), - ], - ), + ), + ], ); } } diff --git a/lib/ui/widgets/settingsView/settings_section.dart b/lib/ui/widgets/settingsView/settings_section.dart index 13cb211a..02343e2c 100644 --- a/lib/ui/widgets/settingsView/settings_section.dart +++ b/lib/ui/widgets/settingsView/settings_section.dart @@ -23,7 +23,7 @@ class SettingsSection extends StatelessWidget { child: Text( '', style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: Theme.of(context).colorScheme.primary, ), ), ), diff --git a/lib/ui/widgets/settingsView/settings_tile_dialog.dart b/lib/ui/widgets/settingsView/settings_tile_dialog.dart index 63ada5c2..011e1599 100644 --- a/lib/ui/widgets/settingsView/settings_tile_dialog.dart +++ b/lib/ui/widgets/settingsView/settings_tile_dialog.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:revanced_manager/constants.dart'; class SettingsTileDialog extends StatelessWidget { final String title; @@ -20,9 +19,12 @@ class SettingsTileDialog extends StatelessWidget { contentPadding: EdgeInsets.zero, title: I18nText( title, - child: Text( + child: const Text( '', - style: kSettingItemTextStyle, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), ), ), subtitle: I18nText(subtitle), diff --git a/lib/ui/widgets/settingsView/social_media_widget.dart b/lib/ui/widgets/settingsView/social_media_widget.dart index a2573102..2e6202a2 100644 --- a/lib/ui/widgets/settingsView/social_media_widget.dart +++ b/lib/ui/widgets/settingsView/social_media_widget.dart @@ -2,8 +2,7 @@ import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:revanced_manager/constants.dart'; -import 'package:revanced_manager/theme.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:url_launcher/url_launcher.dart'; class SocialMediaWidget extends StatelessWidget { @@ -18,32 +17,25 @@ class SocialMediaWidget extends StatelessWidget { iconPadding: const EdgeInsets.symmetric(vertical: 16.0), animationDuration: const Duration(milliseconds: 400), ), - header: SizedBox( - width: double.infinity, - child: ListTile( - contentPadding: EdgeInsets.zero, - title: I18nText( - 'socialMediaCard.widgetTitle', - child: Text('', style: kSettingItemTextStyle), - ), - subtitle: I18nText( - 'socialMediaCard.widgetSubtitle', - child: Text( - '', - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: isDark ? Colors.grey[400] : Colors.grey[600], - ), + header: ListTile( + contentPadding: EdgeInsets.zero, + title: I18nText( + 'socialMediaCard.widgetTitle', + child: const Text( + '', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), ), + subtitle: I18nText('socialMediaCard.widgetSubtitle'), ), - expanded: Card( - color: isDark - ? Theme.of(context).colorScheme.primary - : Theme.of(context).navigationBarTheme.backgroundColor!, + expanded: CustomCard( child: Column( children: [ ListTile( + contentPadding: EdgeInsets.zero, leading: Padding( padding: const EdgeInsets.all(8.0), child: FaIcon( @@ -59,6 +51,7 @@ class SocialMediaWidget extends StatelessWidget { ), ), ListTile( + contentPadding: EdgeInsets.zero, leading: Padding( padding: const EdgeInsets.all(8.0).copyWith(left: 5), child: FaIcon( @@ -74,6 +67,7 @@ class SocialMediaWidget extends StatelessWidget { ), ), ListTile( + contentPadding: EdgeInsets.zero, leading: Padding( padding: const EdgeInsets.all(8.0), child: FaIcon( @@ -89,6 +83,7 @@ class SocialMediaWidget extends StatelessWidget { ), ), ListTile( + contentPadding: EdgeInsets.zero, leading: Padding( padding: const EdgeInsets.all(8.0), child: FaIcon( @@ -104,6 +99,7 @@ class SocialMediaWidget extends StatelessWidget { ), ), ListTile( + contentPadding: EdgeInsets.zero, leading: Padding( padding: const EdgeInsets.all(8.0), child: FaIcon( @@ -119,6 +115,7 @@ class SocialMediaWidget extends StatelessWidget { ), ), ListTile( + contentPadding: EdgeInsets.zero, leading: Padding( padding: const EdgeInsets.all(8.0), child: FaIcon( diff --git a/lib/ui/widgets/settingsView/sources_widget.dart b/lib/ui/widgets/settingsView/sources_widget.dart index 9d0ced7d..1b4ea677 100644 --- a/lib/ui/widgets/settingsView/sources_widget.dart +++ b/lib/ui/widgets/settingsView/sources_widget.dart @@ -2,8 +2,8 @@ import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/constants.dart'; -import 'package:revanced_manager/theme.dart'; import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class SourcesWidget extends StatelessWidget { final String title; @@ -28,29 +28,21 @@ class SourcesWidget extends StatelessWidget { iconPadding: const EdgeInsets.symmetric(vertical: 16.0), animationDuration: const Duration(milliseconds: 400), ), - header: SizedBox( - width: double.infinity, - child: ListTile( - contentPadding: EdgeInsets.zero, - title: I18nText( - 'sourcesCard.widgetTitle', - child: Text('', style: kSettingItemTextStyle), - ), - subtitle: I18nText( - 'sourcesCard.widgetSubtitle', - child: Text( - '', - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: isDark ? Colors.grey[400] : Colors.grey[600], - ), + header: ListTile( + contentPadding: EdgeInsets.zero, + title: I18nText( + 'sourcesCard.widgetTitle', + child: const Text( + '', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), ), + subtitle: I18nText('sourcesCard.widgetSubtitle'), ), - expanded: Card( - color: isDark - ? Theme.of(context).colorScheme.primary - : Theme.of(context).navigationBarTheme.backgroundColor!, + expanded: CustomCard( child: Column( children: [ CustomTextField( @@ -59,12 +51,14 @@ class SourcesWidget extends StatelessWidget { hint: ghOrg, onChanged: (value) => ghOrg = value, ), + const SizedBox(height: 8), CustomTextField( inputController: patchesSourceController, label: I18nText('sourcesCard.patchesSourceLabel'), hint: patchesRepo, onChanged: (value) => patchesRepo = value, ), + const SizedBox(height: 8), CustomTextField( inputController: integrationsSourceController, label: I18nText('sourcesCard.integrationsSourceLabel'), diff --git a/lib/ui/widgets/shared/application_item.dart b/lib/ui/widgets/shared/application_item.dart index 77a0f719..86a0018c 100644 --- a/lib/ui/widgets/shared/application_item.dart +++ b/lib/ui/widgets/shared/application_item.dart @@ -1,10 +1,8 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/constants.dart'; -import 'package:revanced_manager/theme.dart'; -import 'package:revanced_manager/ui/widgets/shared/patch_text_button.dart'; +import 'package:revanced_manager/ui/widgets/installerView/custom_material_button.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:expandable/expandable.dart'; import 'package:timeago/timeago.dart'; @@ -33,56 +31,35 @@ class ApplicationItem extends StatelessWidget { hasIcon: false, animationDuration: Duration(milliseconds: 450), ), - header: Container( - height: 60, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Theme.of(context).colorScheme.primary, - ), - padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 12.0), + header: CustomCard( child: Row( children: [ SizedBox( width: 60, - child: Image.memory( - icon, - height: 39, - width: 39, - ), + child: Image.memory(icon, height: 39, width: 39), ), const SizedBox(width: 4), - SizedBox( - width: MediaQuery.of(context).size.width - 250, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - name, - style: GoogleFonts.roboto( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.w600, - ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, ), - Text( - format(patchDate, locale: 'en_short'), - style: kRobotoTextStyle.copyWith( - color: Theme.of(context).colorScheme.tertiary, - ), - ), - ], - ), + ), + Text(format(patchDate, locale: 'en_short')), + ], ), const Spacer(), Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: PatchTextButton( - text: isUpdatableApp - ? 'applicationItem.patchButton' - : 'applicationItem.openButton', + child: CustomMaterialButton( + label: isUpdatableApp + ? I18nText('applicationItem.patchButton') + : I18nText('applicationItem.openButton'), onPressed: onPressed, - borderColor: isDark - ? const Color(0xff4D5054) - : const Color.fromRGBO(119, 146, 168, 1), ), ), ], @@ -96,16 +73,13 @@ class ApplicationItem extends StatelessWidget { children: [ I18nText( 'applicationItem.changelogLabel', - child: Text( + child: const Text( '', - style: kRobotoTextStyle.copyWith(fontWeight: FontWeight.w700), + style: TextStyle(fontWeight: FontWeight.w700), ), ), const SizedBox(height: 4), - Text( - '\u2022 ${changelog.join('\n\u2022 ')}', - style: kRobotoTextStyle, - ), + Text('\u2022 ${changelog.join('\n\u2022 ')}'), ], ), ), diff --git a/lib/ui/widgets/shared/custom_card.dart b/lib/ui/widgets/shared/custom_card.dart new file mode 100644 index 00000000..0939c28f --- /dev/null +++ b/lib/ui/widgets/shared/custom_card.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class CustomCard extends StatelessWidget { + final bool isFilled; + final Widget child; + + const CustomCard({ + Key? key, + this.isFilled = true, + required this.child, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + color: isFilled + ? Theme.of(context).colorScheme.secondaryContainer + : Colors.transparent, + border: isFilled + ? null + : Border.all( + width: 1, + color: Theme.of(context).colorScheme.secondary, + ), + ), + padding: const EdgeInsets.all(20), + child: child, + ); + } +} diff --git a/lib/ui/widgets/shared/custom_sliver_app_bar.dart b/lib/ui/widgets/shared/custom_sliver_app_bar.dart index 21b71f54..34304f09 100644 --- a/lib/ui/widgets/shared/custom_sliver_app_bar.dart +++ b/lib/ui/widgets/shared/custom_sliver_app_bar.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:revanced_manager/theme.dart'; class CustomSliverAppBar extends StatelessWidget { final Widget title; @@ -21,10 +20,8 @@ class CustomSliverAppBar extends StatelessWidget { automaticallyImplyLeading: false, backgroundColor: MaterialStateColor.resolveWith( (states) => states.contains(MaterialState.scrolledUnder) - ? isDark - ? Theme.of(context).colorScheme.primary - : Theme.of(context).navigationBarTheme.backgroundColor! - : Theme.of(context).scaffoldBackgroundColor, + ? Theme.of(context).colorScheme.surface + : Theme.of(context).canvasColor, ), flexibleSpace: FlexibleSpaceBar( titlePadding: const EdgeInsets.symmetric( diff --git a/lib/ui/widgets/shared/open_container_wrapper.dart b/lib/ui/widgets/shared/open_container_wrapper.dart index 250f000f..612beeb0 100644 --- a/lib/ui/widgets/shared/open_container_wrapper.dart +++ b/lib/ui/widgets/shared/open_container_wrapper.dart @@ -21,7 +21,7 @@ class OpenContainerWrapper extends StatelessWidget { openColor: Theme.of(context).colorScheme.primary, closedColor: Colors.transparent, closedShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(16), ), ); } diff --git a/lib/ui/widgets/shared/patch_text_button.dart b/lib/ui/widgets/shared/patch_text_button.dart deleted file mode 100644 index 785b4cc7..00000000 --- a/lib/ui/widgets/shared/patch_text_button.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:revanced_manager/constants.dart'; -import 'package:revanced_manager/theme.dart'; - -class PatchTextButton extends StatelessWidget { - final String text; - final Function() onPressed; - final Color borderColor; - final Color backgroundColor; - - const PatchTextButton({ - Key? key, - required this.text, - required this.onPressed, - this.borderColor = const Color(0xff7792BA), - this.backgroundColor = Colors.transparent, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return TextButton( - onPressed: onPressed, - style: Theme.of(context).textButtonTheme.style?.copyWith( - backgroundColor: MaterialStateProperty.all(backgroundColor), - side: MaterialStateProperty.all( - BorderSide( - color: borderColor, - width: 1, - ), - ), - padding: MaterialStateProperty.all( - const EdgeInsets.symmetric( - horizontal: 16, - vertical: 4, - ), - )), - child: I18nText(text, - child: Text( - '', - style: kInterTextStyle.copyWith( - color: backgroundColor == Colors.transparent - ? const Color.fromRGBO(119, 146, 186, 1) - : isDark - ? Colors.black - : Colors.white, - ), - )), - ); - } -} diff --git a/lib/ui/widgets/shared/search_bar.dart b/lib/ui/widgets/shared/search_bar.dart index 36ecbcda..8bb2f3d0 100644 --- a/lib/ui/widgets/shared/search_bar.dart +++ b/lib/ui/widgets/shared/search_bar.dart @@ -1,23 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; class SearchBar extends StatefulWidget { final String? hintText; - final Color? fillColor; final bool showSelectIcon; final Function(bool)? onSelectAll; - final Color? backgroundColor; - final Color? hintTextColor; const SearchBar({ Key? key, required this.hintText, - required this.fillColor, - required this.onQueryChanged, - this.onSelectAll, this.showSelectIcon = false, - this.backgroundColor = const Color(0xff1B222B), - this.hintTextColor = Colors.white, + this.onSelectAll, + required this.onQueryChanged, }) : super(key: key); final Function(String) onQueryChanged; @@ -34,14 +27,8 @@ class _SearchBarState extends State { Widget build(BuildContext context) { return Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: widget.backgroundColor, - border: Border.all( - color: widget.backgroundColor != null - ? widget.backgroundColor! - : Colors.white, - width: 1, - ), + borderRadius: BorderRadius.circular(16), + color: Theme.of(context).colorScheme.secondaryContainer, ), child: Row( children: [ @@ -49,25 +36,18 @@ class _SearchBarState extends State { child: TextFormField( onChanged: widget.onQueryChanged, controller: _textController, - cursorColor: Theme.of(context).textTheme.headline5!.color, decoration: InputDecoration( - fillColor: widget.fillColor, filled: true, + fillColor: Theme.of(context).colorScheme.secondaryContainer, contentPadding: const EdgeInsets.all(12.0), hintText: widget.hintText, - hintStyle: GoogleFonts.poppins( - color: widget.hintTextColor, - fontWeight: FontWeight.w400, - ), prefixIcon: Icon( Icons.search, - size: 24.0, color: Theme.of(context).iconTheme.color, ), suffixIcon: _textController.text.isNotEmpty ? IconButton( icon: const Icon(Icons.clear), - iconSize: 24.0, onPressed: () { _textController.clear(); widget.onQueryChanged(''); @@ -78,7 +58,6 @@ class _SearchBarState extends State { icon: _toggleSelectAll ? const Icon(Icons.deselect) : const Icon(Icons.select_all), - iconSize: 24.0, onPressed: widget.onSelectAll != null ? () { setState(() { @@ -94,11 +73,6 @@ class _SearchBarState extends State { borderSide: BorderSide.none, ), ), - style: GoogleFonts.poppins( - color: Theme.of(context).textTheme.headline5!.color, - fontWeight: FontWeight.w400, - fontSize: 16, - ), ), ), ], diff --git a/pubspec.yaml b/pubspec.yaml index e838189e..05e8d400 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,8 +18,11 @@ dependencies: url: https://github.com/ponces/flutter_plugin_device_apps ref: appinfo-from-storage device_info_plus: ^4.1.2 + dynamic_color: ^1.5.4 + dynamic_themes: ^1.1.0 expandable: ^5.0.1 file_picker: ^5.0.1 + flex_color_scheme: ^6.0.0 flutter: sdk: flutter flutter_background: ^1.1.0