Skip to content

Commit

Permalink
Merge pull request #123 from d-loose/release-card
Browse files Browse the repository at this point in the history
Update release page UI
  • Loading branch information
d-loose committed Nov 8, 2022
2 parents c7b0add + d71010e commit f1934c6
Show file tree
Hide file tree
Showing 12 changed files with 294 additions and 200 deletions.
12 changes: 6 additions & 6 deletions lib/detail_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,7 @@ class _DetailPageState extends State<DetailPage> {

@override
Widget build(BuildContext context) {
final deviceModel = context.watch<DeviceModel>();
final store = context.watch<DeviceStore>();
final navigator = Navigator.of(context);
final release = deviceModel.findRelease(store.selectedReleaseVersion);
if (release != null) deviceModel.selectedRelease = release;
return ClipRect(
child: Theme(
data: Theme.of(context).copyWith(
Expand All @@ -54,12 +50,16 @@ class _DetailPageState extends State<DetailPage> {
MaterialPage(
child: DevicePage(parentNavigator: navigator),
),
if (deviceModel.selectedRelease != null)
if (context
.select<DeviceStore, bool>((store) => store.showReleases))
const MaterialPage(
child: ReleasePage(),
)
],
onPopPage: (route, result) => route.didPop(result),
onPopPage: (route, result) {
context.read<DeviceStore>().showReleases = false;
return route.didPop(result);
},
),
),
);
Expand Down
11 changes: 0 additions & 11 deletions lib/device_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,6 @@ class DeviceModel extends SafeChangeNotifier {
Future<void> update(FwupdDevice device) async {
_device = device;
_releases = await _fetchReleases();
if (_selectedRelease != null) {
_selectedRelease = _releases?.singleWhere(
(release) => release.version == _selectedRelease?.version);
}
notifyListeners();
}

FwupdRelease? _selectedRelease;
FwupdRelease? get selectedRelease => _selectedRelease;
set selectedRelease(FwupdRelease? release) {
_selectedRelease = release;
notifyListeners();
}

Expand Down
9 changes: 5 additions & 4 deletions lib/device_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:provider/provider.dart';
import 'package:yaru_widgets/yaru_widgets.dart';

import 'device_model.dart';
import 'device_store.dart';
import 'fwupd_l10n.dart';
import 'fwupd_notifier.dart';
import 'fwupd_x.dart';
Expand Down Expand Up @@ -118,16 +119,16 @@ class DevicePage extends StatelessWidget {
? ElevatedButton(
onPressed: fwupdIdle
? () => context
.read<DeviceModel>()
.selectedRelease = releases.first
.read<DeviceStore>()
.showReleases = true
: null,
child: Text(l10n.showUpdates),
)
: OutlinedButton(
onPressed: fwupdIdle
? () => context
.read<DeviceModel>()
.selectedRelease = releases.first
.read<DeviceStore>()
.showReleases = true
: null,
child: Text(l10n.showReleases),
),
Expand Down
22 changes: 8 additions & 14 deletions lib/device_store.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,18 @@ class DeviceStore extends SafeChangeNotifier {
var _devices = <FwupdDevice>[];
StreamSubscription<FwupdDevice>? _deviceAdded;
StreamSubscription<FwupdDevice>? _deviceRemoved;
String? _selectedDeviceId;
String? _selectedReleaseVersion;
bool _showReleases = false;

List<FwupdDevice> get devices => _devices;
String? get selectedDeviceId => _selectedDeviceId;
String? get selectedReleaseVersion => _selectedReleaseVersion;

set selectedDeviceId(String? id) {
if (id == _selectedDeviceId) return;
_selectedDeviceId = id;
bool get showReleases => _showReleases;
set showReleases(bool value) {
if (value == _showReleases) return;
_showReleases = value;
notifyListeners();
}

set selectedReleaseVersion(String? version) {
if (version == _selectedReleaseVersion) return;
_selectedReleaseVersion = version;
notifyListeners();
}
List<FwupdDevice> get devices => _devices;
int indexOf(String? deviceId) =>
_devices.indexWhere((d) => d.deviceId == deviceId);

Future<void> init() async {
_deviceAdded = _service.deviceAdded.listen((device) {
Expand Down
29 changes: 17 additions & 12 deletions lib/firmware_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ class FirmwareApp extends StatefulWidget {
}

class _FirmwareAppState extends State<FirmwareApp> {
final _controller = ValueNotifier<int>(-1);
late final Future _storeInitialized;

@override
void initState() {
super.initState();
Expand All @@ -46,7 +49,7 @@ class _FirmwareAppState extends State<FirmwareApp> {
..registerErrorListener(_showError)
..registerConfirmationListener(_getConfirmation)
..registerDeviceRequestListener(_showRequest);
store.init();
_storeInitialized = store.init();
gtkNotifier.addCommandLineListener(_commandLineListener);
}

Expand All @@ -57,10 +60,11 @@ class _FirmwareAppState extends State<FirmwareApp> {
super.dispose();
}

void _commandLineListener(List<String> args) {
Future<void> _commandLineListener(List<String> args) async {
final store = context.read<DeviceStore>();
store.selectedDeviceId = args.firstOrNull;
store.selectedReleaseVersion = args.length > 1 ? args[1] : null;
await _storeInitialized;
_controller.value = store.indexOf(args.firstOrNull);
store.showReleases = args.isNotEmpty;
}

void _showRequest(FwupdDevice device) {
Expand Down Expand Up @@ -92,18 +96,19 @@ class _FirmwareAppState extends State<FirmwareApp> {
@override
Widget build(BuildContext context) {
final store = context.watch<DeviceStore>();
final notifier = context.watch<FwupdNotifier>();
final l10n = AppLocalizations.of(context);
final index =
store.devices.indexWhere((d) => d.deviceId == store.selectedDeviceId);
return store.when(
devices: (devices) => ErrorBanner(
message: notifier.onBattery ? l10n.batteryWarning : null,
message: context
.select<FwupdNotifier, bool>((notifier) => notifier.onBattery)
? l10n.batteryWarning
: null,
child: YaruMasterDetailPage(
key: ValueKey(index),
initialIndex: index,
onSelected: (value) =>
store.selectedDeviceId = store.devices[value ?? 0].deviceId,
controller: _controller,
onSelected: (value) {
store.showReleases = false;
},
initialIndex: _controller.value,
length: devices.length,
pageBuilder: (context, index) =>
DetailPage.create(context, device: devices[index]),
Expand Down
89 changes: 16 additions & 73 deletions lib/release_page.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:fwupd/fwupd.dart';
import 'package:provider/provider.dart';
import 'package:yaru_widgets/yaru_widgets.dart';

import 'device_model.dart';
import 'device_store.dart';
import 'fwupd_notifier.dart';
import 'fwupd_x.dart';
import 'src/widgets/confirmation_dialog.dart';
import 'src/widgets/release_card.dart';

class ReleasePage extends StatelessWidget {
Expand All @@ -19,90 +15,37 @@ class ReleasePage extends StatelessWidget {
final model = context.watch<DeviceModel>();
final device = model.device;
final releases = model.releases ?? [];
final selected = model.selectedRelease;
final l10n = AppLocalizations.of(context);
final String action;
final String dialogText;
final dialogDesc = device.flags.contains(FwupdDeviceFlag.usableDuringUpdate)
? null
: l10n.deviceUnavailable;

if (selected?.isDowngrade == true) {
action = l10n.downgrade;
dialogText = l10n.downgradeConfirm(
device.name,
device.version,
selected?.version,
);
} else if (selected?.isUpgrade == false) {
action = l10n.reinstall;
dialogText = l10n.reinstallConfirm(
device.name,
device.version,
);
} else {
action = l10n.upgrade;
dialogText = l10n.upgradeConfirm(
device.name,
device.version,
selected?.version,
);
}

return YaruDetailPage(
appBar: AppBar(
title: Text('${device.name} ${device.version}'),
leading: Navigator.of(context).canPop() ? const YaruBackButton() : null,
),
body: ListView(
padding: const EdgeInsets.symmetric(horizontal: 16),
padding: const EdgeInsets.only(top: 16, left: 16, right: 16),
children: releases
.map(
(release) => ReleaseCard(
release: release,
selected: release == selected,
onSelected: () =>
context.read<DeviceModel>().selectedRelease = release,
device: device,
onInstall: () async {
final notifier = context.read<FwupdNotifier>();
final store = context.read<DeviceStore>();
store.showReleases = false;
await model.install(release);
await notifier.refresh();

// refresh [DeviceStore] to force updates of all
// [DeviceModel]s even if fwupd didn't send an
// appropriate DBus signal (possible bug in 1.7.5
// on Ubuntu 22.04)
// TODO: improve when better solution is found
await store.refresh();
},
),
)
.toList(),
),
bottomNavigationBar: ButtonBar(
children: [
ElevatedButton(
onPressed: selected != null
? () {
showConfirmationDialog(
context,
title: dialogText,
message: dialogDesc,
actionText: action,
onConfirm: () async {
final notifier = context.read<FwupdNotifier>();
final store = context.read<DeviceStore>();
model.selectedRelease = null;
await model.install(selected);
await notifier.refresh();

// refresh [DeviceStore] to force updates of all
// [DeviceModel]s even if fwupd didn't send an
// appropriate DBus signal (possible bug in 1.7.5
// on Ubuntu 22.04)
// TODO: improve when better solution is found
await store.refresh();
},
onCancel: () {},
);
}
: null,
child: Text(action),
),
OutlinedButton(
onPressed: Navigator.of(context).pop,
child: Text(l10n.cancel),
)
],
),
);
}
}

0 comments on commit f1934c6

Please sign in to comment.