aves/lib/widgets/about/data_usage.dart
2023-06-18 23:23:31 +02:00

161 lines
5.1 KiB
Dart

import 'package:aves/ref/brand_colors.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/utils/file_utils.dart';
import 'package:aves/widgets/common/action_mixins/feedback.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_donut.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class AboutDataUsage extends StatefulWidget {
const AboutDataUsage({super.key});
@override
State<AboutDataUsage> createState() => _AboutDataUsageState();
}
class _AboutDataUsageState extends State<AboutDataUsage> with FeedbackMixin {
late Future<Map<String, int>> _loader;
bool _isExpanded = false;
@override
void initState() {
super.initState();
_loader = storageService.getDataUsage();
}
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
final animationDuration = context.select<DurationsData, Duration>((v) => v.expansionTileAnimation);
return ExpansionPanelList(
expansionCallback: (index, isExpanded) {
setState(() => _isExpanded = !isExpanded);
},
animationDuration: animationDuration,
expandedHeaderPadding: EdgeInsets.zero,
elevation: 0,
children: [
ExpansionPanel(
headerBuilder: (context, isExpanded) => ConstrainedBox(
constraints: const BoxConstraints(minHeight: kMinInteractiveDimension),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
alignment: AlignmentDirectional.centerStart,
child: Text(l10n.aboutDataUsageSectionTitle, style: AStyles.knownTitleText),
),
),
body: FutureBuilder<Map<String, int>>(
future: _loader,
builder: (context, snapshot) {
final data = snapshot.data;
if (data == null) return const SizedBox();
final dataMap = {
DataUsageDonut.bin: data['trash'] ?? 0,
DataUsageDonut.database: data['database'] ?? 0,
DataUsageDonut.vaults: data['vaults'] ?? 0,
DataUsageDonut.misc: data['miscData'] ?? 0,
};
final flutter = data['flutter'] ?? 0;
if (flutter > 0) {
dataMap[DataUsageDonut.flutter] = flutter;
}
final cacheMap = {
DataUsageDonut.internal: data['internalCache'] ?? 0,
DataUsageDonut.external: data['externalCache'] ?? 0,
};
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
DataUsageDonut(
title: l10n.aboutDataUsageData,
byTypes: dataMap,
animationDuration: animationDuration,
),
DataUsageDonut(
title: l10n.aboutDataUsageCache,
byTypes: cacheMap,
animationDuration: animationDuration,
),
],
);
},
),
isExpanded: _isExpanded,
canTapOnHeader: true,
backgroundColor: Colors.transparent,
),
],
);
}
}
class DataUsageDonut extends StatelessWidget {
final String title;
final Map<String, int> byTypes;
final Duration animationDuration;
// data
static const String bin = 'bin';
static const String database = 'database';
static const String flutter = 'flutter';
static const String vaults = 'vaults';
static const String misc = 'misc';
// cache
static const String internal = 'internal';
static const String external = 'external';
const DataUsageDonut({
super.key,
required this.title,
required this.byTypes,
required this.animationDuration,
});
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
final locale = l10n.localeName;
final colors = context.watch<AvesColorsData>();
return AvesDonut(
title: Text(title),
byTypes: byTypes,
animationDuration: animationDuration,
formatKey: (d) {
switch (d.key) {
case bin:
return l10n.binPageTitle;
case database:
return l10n.aboutDataUsageDatabase;
case flutter:
return 'Flutter';
case vaults:
return l10n.albumTierVaults;
case misc:
return l10n.aboutDataUsageMisc;
case internal:
return l10n.aboutDataUsageInternal;
case external:
return l10n.aboutDataUsageExternal;
default:
return d.key;
}
},
formatValue: (v) => formatFileSize(locale, v, round: 0),
colorize: (d) {
Color? color;
switch (d.key) {
case flutter:
color = colors.fromBrandColor(BrandColors.flutter);
}
return color ?? colors.fromString(d.key);
},
);
}
}