import 'package:device_apps/device_apps.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/ui/widgets/appInfoView/app_info_viewmodel.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'; class AppInfoView extends StatelessWidget { final PatchedApplication app; const AppInfoView({ Key? key, required this.app, }) : super(key: key); @override Widget build(BuildContext context) { return ViewModelBuilder.reactive( onModelReady: (model) => model.initialize(), viewModelBuilder: () => AppInfoViewModel(), builder: (context, model, child) => Scaffold( body: CustomScrollView( slivers: [ CustomSliverAppBar( title: I18nText( 'appInfoView.widgetTitle', child: Text( '', style: GoogleFonts.inter( color: Theme.of(context).textTheme.headline6!.color, ), ), ), ), SliverPadding( padding: const EdgeInsets.all(20.0), sliver: SliverList( delegate: SliverChildListDelegate.fixed( [ SizedBox( height: 64.0, child: CircleAvatar( child: Image.memory( app.icon, fit: BoxFit.cover, ), ), ), const SizedBox(height: 20), Text( app.name, textAlign: TextAlign.center, style: Theme.of(context).textTheme.headline6, ), const SizedBox(height: 4), Text( app.version, textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, ), const SizedBox(height: 20), CustomCard( child: IntrinsicHeight( child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ InkWell( onTap: () => DeviceApps.openApp( app.packageName, ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.open_in_new_outlined, color: Theme.of(context).colorScheme.primary, ), const SizedBox(height: 10), I18nText( 'appInfoView.openButton', child: Text( '', style: TextStyle( color: Theme.of(context) .colorScheme .primary, fontWeight: FontWeight.bold, ), ), ), ], ), ), VerticalDivider( color: Theme.of(context).canvasColor, ), InkWell( onTap: () => model.showUninstallAlertDialog(context, app), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.delete_outline, color: Theme.of(context).colorScheme.primary, ), const SizedBox(height: 10), I18nText( 'appInfoView.uninstallButton', child: Text( '', style: TextStyle( color: Theme.of(context) .colorScheme .primary, fontWeight: FontWeight.bold, ), ), ), ], ), ), VerticalDivider( color: Theme.of(context).canvasColor, ), InkWell( onTap: () { model.navigateToPatcher(app); Navigator.of(context).pop(); }, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.build_outlined, color: Theme.of(context).colorScheme.primary, ), const SizedBox(height: 10), I18nText( 'appInfoView.patchButton', child: Text( '', style: TextStyle( color: Theme.of(context) .colorScheme .primary, fontWeight: FontWeight.bold, ), ), ), ], ), ), ], ), ), ), const SizedBox(height: 20), ListTile( contentPadding: EdgeInsets.zero, title: I18nText( 'appInfoView.packageNameLabel', child: const Text( '', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w500, ), ), ), subtitle: Text(app.packageName), ), const SizedBox(height: 4), ListTile( contentPadding: EdgeInsets.zero, title: I18nText( 'appInfoView.rootModeLabel', child: const Text( '', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w500, ), ), ), subtitle: model.isRooted ? I18nText('enabledLabel') : I18nText('disabledLabel'), ), const SizedBox(height: 4), ListTile( contentPadding: EdgeInsets.zero, title: I18nText( 'appInfoView.patchedDateLabel', child: const Text( '', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w500, ), ), ), subtitle: I18nText( 'appInfoView.patchedDateHint', translationParams: { 'date': model.getPrettyDate(context, app.patchDate), 'time': model.getPrettyTime(context, app.patchDate), }, ), ), const SizedBox(height: 4), ListTile( contentPadding: EdgeInsets.zero, title: I18nText( 'appInfoView.appliedPatchesLabel', child: const Text( '', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w500, ), ), ), subtitle: I18nText( 'appInfoView.appliedPatchesHint', translationParams: { 'quantity': app.appliedPatches.length.toString(), }, ), onTap: () => model.showAppliedPatchesDialog(context, app), ), ], ), ), ), ], ), ), ); } }