Skip to content

Commit 7801c3f

Browse files
committed
MySnapsPage: correctly build when snapchange done (#34)
1 parent e356cca commit 7801c3f

11 files changed

+121
-176
lines changed

Diff for: lib/l10n/app_en.arb

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,6 @@
4949
"size": "Size",
5050
"name": "Name",
5151
"sortBy": "Sort by",
52-
"media": "Media"
52+
"media": "Media",
53+
"done": "Done"
5354
}

Diff for: lib/services/app_change_service.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class AppChangeService {
1010
final SnapdClient _snapDClient;
1111
final NotificationsClient _notificationsClient;
1212

13-
Future<void> addChange(Snap snap, String id) async {
13+
Future<void> addChange(Snap snap, String id, String doneString) async {
1414
final newChange = await _snapDClient.getChange(id);
1515
_snapChanges.putIfAbsent(snap, () => newChange);
1616
if (!_snapChangesController.isClosed) {
@@ -22,12 +22,12 @@ class AppChangeService {
2222
removeChange(snap);
2323
_notificationsClient.notify(
2424
'Software',
25-
body: newChange.summary,
25+
body: '$doneString: ${newChange.summary}',
2626
appName: snap.name,
2727
appIcon: 'snap-store',
2828
hints: [
2929
NotificationHint.desktopEntry('software'),
30-
NotificationHint.urgency(NotificationUrgency.critical)
30+
NotificationHint.urgency(NotificationUrgency.normal)
3131
],
3232
);
3333
break;

Diff for: lib/store_app/common/snap_dialog.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
33
import 'package:snapd/snapd.dart';
4+
import 'package:software/l10n/l10n.dart';
45
import 'package:software/services/app_change_service.dart';
56
import 'package:software/store_app/common/constants.dart';
67
import 'package:software/store_app/common/snap_channel_expandable.dart';
@@ -23,7 +24,8 @@ class SnapDialog extends StatefulWidget {
2324
required String huskSnapName,
2425
}) =>
2526
ChangeNotifierProvider<SnapModel>(
26-
create: (context) => SnapModel(
27+
create: (_) => SnapModel(
28+
doneString: context.l10n.done,
2729
getService<SnapdClient>(),
2830
getService<AppChangeService>(),
2931
huskSnapName: huskSnapName,

Diff for: lib/store_app/common/snap_model.dart

+13-64
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
import 'dart:async';
2-
import 'dart:convert';
32
import 'dart:io';
43

54
import 'package:flutter/material.dart';
6-
import 'package:flutter_svg/flutter_svg.dart';
75
import 'package:intl/intl.dart';
86
import 'package:safe_change_notifier/safe_change_notifier.dart';
97
import 'package:snapd/snapd.dart';
108
import 'package:software/services/app_change_service.dart';
119
import 'package:software/services/color_generator.dart';
1210
import 'package:software/snapx.dart';
13-
import 'package:xdg_icons/xdg_icons.dart';
14-
import 'package:yaru_icons/yaru_icons.dart';
1511

1612
class SnapModel extends SafeChangeNotifier {
1713
final AppChangeService _appChangeService;
@@ -21,10 +17,12 @@ class SnapModel extends SafeChangeNotifier {
2117
Snap? _storeSnap;
2218
Snap? _localSnap;
2319
bool online;
20+
final String doneString;
2421

2522
SnapModel(
2623
this._client,
2724
this._appChangeService, {
25+
required this.doneString,
2826
this.colorGenerator,
2927
required this.huskSnapName,
3028
this.online = true,
@@ -245,6 +243,7 @@ class SnapModel extends SafeChangeNotifier {
245243
await _appChangeService.addChange(
246244
_storeSnap!,
247245
changeId,
246+
doneString,
248247
);
249248
_localSnap = await _findLocalSnap(huskSnapName);
250249
notifyListeners();
@@ -254,7 +253,11 @@ class SnapModel extends SafeChangeNotifier {
254253
if (name == null) return;
255254
await _client.loadAuthorization();
256255
final changeId = await _client.remove(name!);
257-
await _appChangeService.addChange(_localSnap!, changeId);
256+
await _appChangeService.addChange(
257+
_localSnap!,
258+
changeId,
259+
doneString,
260+
);
258261
_localSnap = await _findLocalSnap(huskSnapName);
259262
notifyListeners();
260263
}
@@ -264,7 +267,11 @@ class SnapModel extends SafeChangeNotifier {
264267
await _client.loadAuthorization();
265268
final changeId =
266269
await _client.refresh(name!, channel: channelToBeInstalled);
267-
await _appChangeService.addChange(_localSnap!, changeId);
270+
await _appChangeService.addChange(
271+
_localSnap!,
272+
changeId,
273+
doneString,
274+
);
268275
notifyListeners();
269276
}
270277

@@ -342,62 +349,4 @@ class SnapModel extends SafeChangeNotifier {
342349
mode: ProcessStartMode.detached,
343350
);
344351
}
345-
346-
String? get _desktopFile =>
347-
apps != null && apps!.isNotEmpty && apps!.first.desktopFile != null
348-
? apps!.first.desktopFile!
349-
: null;
350-
351-
Widget offlineIcon = fallbackSnapIcon;
352-
String _iconLine = '';
353-
354-
void loadOfflineIcon() {
355-
if (_desktopFile != null) {
356-
File? file = File(_desktopFile!);
357-
(file
358-
.openRead()
359-
.map(utf8.decode)
360-
.transform(const LineSplitter())
361-
.where((line) => line.contains('Icon='))
362-
.first)
363-
.then((line) {
364-
_iconLine = line.replaceAll('Icon=', '');
365-
if (_iconLine.endsWith('.png') ||
366-
_iconLine.endsWith('.jpg') ||
367-
_iconLine.endsWith('.jpeg')) {
368-
offlineIcon = Image.file(
369-
File(_iconLine),
370-
filterQuality: FilterQuality.medium,
371-
width: 50,
372-
);
373-
}
374-
if (_iconLine.endsWith('.svg')) {
375-
try {
376-
offlineIcon = SvgPicture.file(
377-
File(_iconLine),
378-
width: 50,
379-
);
380-
} finally {
381-
if (offlineIcon != fallbackSnapIcon) {
382-
offlineIcon = fallbackSnapIcon;
383-
}
384-
}
385-
}
386-
if (!_iconLine.contains('/')) {
387-
offlineIcon = XdgIconTheme(
388-
data: const XdgIconThemeData(theme: 'Yaru'),
389-
child: XdgIcon(name: _iconLine, size: 48),
390-
);
391-
}
392-
notifyListeners();
393-
return;
394-
});
395-
}
396-
notifyListeners();
397-
}
398352
}
399-
400-
const fallbackSnapIcon = Icon(
401-
YaruIcons.package_snap,
402-
size: 50,
403-
);

Diff for: lib/store_app/explore/section_banner_grid.dart

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
3+
import 'package:software/snapx.dart';
4+
import 'package:software/store_app/common/snap_dialog.dart';
35
import 'package:software/store_app/common/snap_section.dart';
46
import 'package:software/store_app/explore/explore_model.dart';
57
import 'package:software/store_app/explore/snap_banner.dart';
@@ -43,7 +45,18 @@ class _SectionBannerGridState extends State<SectionBannerGrid> {
4345
),
4446
children: sections != null && sections.isNotEmpty
4547
? sections.take(widget.amount).map((snap) {
46-
return SnapBanner.create(context, snap);
48+
return SnapBanner(
49+
name: snap.name,
50+
summary: snap.summary,
51+
url: snap.iconUrl,
52+
onTap: () => showDialog(
53+
context: context,
54+
builder: (context) => SnapDialog.create(
55+
context: context,
56+
huskSnapName: snap.name,
57+
),
58+
),
59+
);
4760
}).toList()
4861
: [],
4962
);

Diff for: lib/store_app/explore/snap_banner.dart

+14-39
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,27 @@
11
import 'package:flutter/material.dart';
2-
import 'package:provider/provider.dart';
3-
import 'package:snapd/snapd.dart';
4-
import 'package:software/services/app_change_service.dart';
5-
import 'package:software/snapx.dart';
6-
import 'package:software/store_app/common/safe_image.dart';
7-
import 'package:software/store_app/common/snap_dialog.dart';
82
import 'package:software/store_app/common/app_banner.dart';
9-
10-
import 'package:software/store_app/common/snap_model.dart';
11-
import 'package:ubuntu_service/ubuntu_service.dart';
3+
import 'package:software/store_app/common/safe_image.dart';
124
import 'package:yaru_colors/yaru_colors.dart';
135
import 'package:yaru_icons/yaru_icons.dart';
146

157
class SnapBanner extends StatelessWidget {
168
const SnapBanner({
179
Key? key,
18-
required this.snap,
1910
this.onTap,
2011
this.surfaceTintColor,
2112
this.watermark = false,
13+
required this.name,
14+
required this.summary,
15+
this.url,
2216
}) : super(key: key);
2317

24-
final Snap snap;
18+
final String name;
19+
final String summary;
20+
final String? url;
2521
final Function()? onTap;
2622
final Color? surfaceTintColor;
2723
final bool watermark;
2824

29-
static Widget create(BuildContext context, Snap snap) {
30-
final snapModel = SnapModel(
31-
getService<SnapdClient>(),
32-
getService<AppChangeService>(),
33-
huskSnapName: snap.name,
34-
);
35-
return ChangeNotifierProvider<SnapModel>(
36-
create: (context) => snapModel,
37-
child: SnapBanner(
38-
snap: snap,
39-
onTap: () => showDialog(
40-
context: context,
41-
builder: (context) => ChangeNotifierProvider.value(
42-
value: snapModel,
43-
child: const SnapDialog(),
44-
),
45-
),
46-
),
47-
);
48-
}
49-
5025
@override
5126
Widget build(BuildContext context) {
5227
final borderRadius = BorderRadius.circular(10);
@@ -61,11 +36,11 @@ class SnapBanner extends StatelessWidget {
6136
AppBanner(
6237
borderRadius: borderRadius,
6338
color: surfaceTintColor!,
64-
title: snap.title ?? '',
65-
summary: snap.summary,
39+
title: name,
40+
summary: summary,
6641
elevation: light ? 4 : 6,
6742
icon: SafeImage(
68-
url: snap.iconUrl,
43+
url: url,
6944
fallBackIconData: YaruIcons.package_snap,
7045
),
7146
textOverflow: TextOverflow.fade,
@@ -80,7 +55,7 @@ class SnapBanner extends StatelessWidget {
8055
child: SizedBox(
8156
height: 130,
8257
child: SafeImage(
83-
url: snap.iconUrl,
58+
url: url,
8459
fallBackIconData: YaruIcons.package_snap,
8560
),
8661
),
@@ -96,11 +71,11 @@ class SnapBanner extends StatelessWidget {
9671
: Theme.of(context).colorScheme.onBackground,
9772
elevation: light ? 2 : 1,
9873
icon: SafeImage(
99-
url: snap.iconUrl,
74+
url: url,
10075
fallBackIconData: YaruIcons.package_snap,
10176
),
102-
title: snap.title ?? '',
103-
summary: snap.summary,
77+
title: name,
78+
summary: summary,
10479
textOverflow: TextOverflow.ellipsis,
10580
),
10681
);

Diff for: lib/store_app/explore/snap_banner_carousel.dart

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
33
import 'package:snapd/snapd.dart';
4+
import 'package:software/l10n/l10n.dart';
45
import 'package:software/services/app_change_service.dart';
6+
import 'package:software/snapx.dart';
57
import 'package:software/store_app/common/snap_model.dart';
68
import 'package:software/store_app/common/snap_section.dart';
79
import 'package:software/store_app/explore/explore_model.dart';
@@ -77,6 +79,7 @@ class _AppBannerCarouselItem extends StatefulWidget {
7779
getService<AppChangeService>(),
7880
huskSnapName: snap.name,
7981
colorGenerator: getService<ColorGenerator>(),
82+
doneString: context.l10n.done,
8083
),
8184
child: _AppBannerCarouselItem(snap: snap),
8285
);
@@ -98,12 +101,16 @@ class _AppBannerCarouselItemState extends State<_AppBannerCarouselItem> {
98101
final model = context.watch<SnapModel>();
99102
return SnapBanner(
100103
watermark: true,
101-
snap: widget.snap,
104+
name: widget.snap.name,
105+
summary: widget.snap.summary,
106+
url: widget.snap.iconUrl,
102107
surfaceTintColor: model.surfaceTintColor,
103108
onTap: () => showDialog(
104109
context: context,
105-
builder: (context) =>
106-
SnapDialog.create(context: context, huskSnapName: widget.snap.name),
110+
builder: (context) => ChangeNotifierProvider.value(
111+
value: model,
112+
child: const SnapDialog(),
113+
),
107114
),
108115
);
109116
}

0 commit comments

Comments
 (0)