import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class InstalledAppItem extends StatefulWidget { const InstalledAppItem({ super.key, required this.name, required this.pkgName, required this.icon, required this.patchesCount, required this.suggestedVersion, required this.installedVersion, this.onTap, this.onLinkTap, }); final String name; final String pkgName; final Uint8List icon; final int patchesCount; final String suggestedVersion; final String installedVersion; final Function()? onTap; final Function()? onLinkTap; @override State createState() => _InstalledAppItemState(); } class _InstalledAppItemState extends State { @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), child: CustomCard( onTap: widget.onTap, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( width: 48, height: 48, padding: const EdgeInsets.symmetric(vertical: 4.0), alignment: Alignment.center, child: CircleAvatar( backgroundColor: Colors.transparent, child: Image.memory(widget.icon), ), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Wrap( crossAxisAlignment: WrapCrossAlignment.center, spacing: 4, children: [ Text( widget.name, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 16, ), ), Text( widget.installedVersion, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 16, ), ), Text( widget.patchesCount == 1 ? '• ${widget.patchesCount} patch' : '• ${widget.patchesCount} patches', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 16, color: Theme.of(context).colorScheme.secondary, ), ), ], ), Text( widget.pkgName, ), const SizedBox(height: 4), Wrap( crossAxisAlignment: WrapCrossAlignment.center, children: [ Material( color: Theme.of(context).colorScheme.secondaryContainer, borderRadius: const BorderRadius.all(Radius.circular(8)), child: InkWell( onTap: widget.onLinkTap, borderRadius: const BorderRadius.all(Radius.circular(8)), child: Container( padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( t.suggested( version: widget.suggestedVersion.isEmpty ? Text(t.appSelectorCard.anyVersion) : 'v${widget.suggestedVersion}', ), ), const SizedBox(width: 4), Icon( Icons.search, size: 16, color: Theme.of(context) .colorScheme .onSecondaryContainer, ), ], ), ), ), ), ], ), ], ), ), ], ), ), ); } }