Skip to content

Commit 4b214ae

Browse files
authored
PrivacyPage: add clear recently used button (#294)
1 parent c6f9017 commit 4b214ae

File tree

5 files changed

+94
-55
lines changed

5 files changed

+94
-55
lines changed

lib/l10n/app_de.arb

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@
6262
"houseKeepingRecentFilesRememberAction": "Dateichronik",
6363
"houseKeepingRecentFilesRememberForeverAction": "Dateichronik für immer behalten",
6464
"houseKeepingRecentFilesDaysAction": "Zeitraum der Dateichronik",
65+
"houseKeepingRecentFilesClearAction": "Dateichronik bereinigen",
6566
"houseKeepingTempTrashHeadline": "Papierkorb und temporäre Datelen",
6667
"houseKeepingTempTrashDescription": "Der Papierkorb sowie temporare Dateien können persönliche und sensible Informationen enthalten. Eine automatische Löschung kann dem Erhalt Ihrer Privatsphäre dienen.",
6768
"houseKeepingTrashAutoRemoveAction": "Automatisch den Papierkorb leeren",
6869
"houseKeepingTempAutoRemoveAction": "Automatisch temporäre Dateien löschen",
6970
"houseKeepingTempTrashAutoDeleteDays": "Zeitraum für automatisches Löschen",
70-
"houseKeepingTempTrashActionLabel": "Bereinigen",
7171
"houseKeepingEmptyTrash": "Papierkorb leeren",
7272
"houseKeepingRemoveTempFiles": "Temporäre Dateien löschen",
7373
"privacyPageTitle": "Datenschutz",

lib/l10n/app_en.arb

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@
6262
"houseKeepingRecentFilesRememberAction": "File history",
6363
"houseKeepingRecentFilesRememberForeverAction": "Keep file history forever",
6464
"houseKeepingRecentFilesDaysAction": "Period of file history",
65+
"houseKeepingRecentFilesClearAction": "Delete recent file history",
6566
"houseKeepingTempTrashHeadline": "Recycle bin and temporary files",
6667
"houseKeepingTempTrashDescription": "The recycle bin and temporary files can contain personal and sensitive information. Automatic deletion can serve to preserve your privacy.",
6768
"houseKeepingTrashAutoRemoveAction": "Automatically empty the recycle bin",
6869
"houseKeepingTempAutoRemoveAction": "Automatically delete temporary files",
6970
"houseKeepingTempTrashAutoDeleteDays": "Period for automatic deletion",
70-
"houseKeepingTempTrashActionLabel": "Clean up",
7171
"houseKeepingEmptyTrash": "Empty trash",
7272
"houseKeepingRemoveTempFiles": "Delete temporary files",
7373
"privacyPageTitle": "Privacy",
+23-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import 'dart:async';
2+
import 'dart:io';
23

34
import 'package:dbus/dbus.dart';
45

5-
const kHouseKeepingInterface = 'org.gnome.SettingsDaemon.Housekeeping';
6-
const kHouseKeepingPath = '/org/gnome/SettingsDaemon/Housekeeping';
7-
const kEmptyTrashMethodName = 'EmptyTrash';
8-
const kRemoveTempFiles = 'RemoveTempFiles';
6+
const _kHouseKeepingInterface = 'org.gnome.SettingsDaemon.Housekeeping';
7+
const _kHouseKeepingPath = '/org/gnome/SettingsDaemon/Housekeeping';
8+
const _kEmptyTrashMethodName = 'EmptyTrash';
9+
const _kRemoveTempFiles = 'RemoveTempFiles';
10+
const _kRecentlyUsedFilePathSuffix = '/.local/share/recently-used.xbel';
911

1012
class HouseKeepingService {
1113
final DBusRemoteObject _object;
@@ -15,8 +17,8 @@ class HouseKeepingService {
1517
static DBusRemoteObject _createObject() {
1618
return DBusRemoteObject(
1719
DBusClient.session(),
18-
name: kHouseKeepingInterface,
19-
path: DBusObjectPath(kHouseKeepingPath),
20+
name: _kHouseKeepingInterface,
21+
path: DBusObjectPath(_kHouseKeepingPath),
2022
);
2123
}
2224

@@ -27,14 +29,27 @@ class HouseKeepingService {
2729
void emptyTrash() => _object.emptyTrash();
2830

2931
void removeTempFiles() => _object.removeTempFiles();
32+
33+
void clearRecentlyUsed() {
34+
final String? path =
35+
Platform.environment['HOME']! + _kRecentlyUsedFilePathSuffix;
36+
if (Platform.environment['HOME'] == null || path == null) return;
37+
var file = File(path);
38+
var sink = file.openWrite();
39+
const cleanContent = '''<?xml version="1.0" encoding="UTF-8"?>
40+
<xbel version="1.0" xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks" xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info">
41+
</xbel>''';
42+
sink.write(cleanContent);
43+
sink.close();
44+
}
3045
}
3146

3247
extension _HouseKeepingObject on DBusRemoteObject {
3348
Future<DBusMethodSuccessResponse> emptyTrash() {
34-
return callMethod(kHouseKeepingInterface, kEmptyTrashMethodName, []);
49+
return callMethod(_kHouseKeepingInterface, _kEmptyTrashMethodName, []);
3550
}
3651

3752
Future<DBusMethodSuccessResponse> removeTempFiles() {
38-
return callMethod(kHouseKeepingInterface, kRemoveTempFiles, []);
53+
return callMethod(_kHouseKeepingInterface, _kRemoveTempFiles, []);
3954
}
4055
}

lib/view/pages/privacy/house_keeping_page.dart

+67-45
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,24 @@ class HouseKeepingPage extends StatelessWidget {
6262
: model.recentFilesMaxAge?.toDouble(),
6363
min: -1,
6464
max: 30,
65-
onChanged: (value) => model.recentFilesMaxAge = value.toInt())
65+
onChanged: (value) => model.recentFilesMaxAge = value.toInt()),
66+
YaruRow(
67+
trailingWidget:
68+
Text(context.l10n.houseKeepingRecentFilesClearAction),
69+
actionWidget: _TrashButton(
70+
onPressed: () => showDialog(
71+
context: context,
72+
builder: (context) => _ConfirmationDialog(
73+
title:
74+
context.l10n.houseKeepingRecentFilesClearAction,
75+
iconData: YaruIcons.clock,
76+
onConfirm: () {
77+
model.clearRecentlyUsed();
78+
Navigator.of(context).pop();
79+
},
80+
),
81+
)),
82+
enabled: true)
6683
],
6784
),
6885
YaruSection(
@@ -98,50 +115,36 @@ class HouseKeepingPage extends StatelessWidget {
98115
min: 0,
99116
max: 30,
100117
onChanged: (value) => model.oldFilesAge = value.toInt()),
101-
SizedBox(
102-
width: kDefaultWidth,
103-
child: Row(
104-
children: [
105-
Expanded(
106-
child: OutlinedButton(
107-
onPressed: () => showDialog(
108-
context: context,
109-
builder: (context) => _ConfirmationDialog(
110-
title: context.l10n.houseKeepingEmptyTrash,
111-
iconData: YaruIcons.trash_full,
112-
onConfirm: () {
113-
model.emptyTrash();
114-
Navigator.of(context).pop();
115-
},
116-
),
117-
),
118-
child: Text(context.l10n.houseKeepingEmptyTrash,
119-
style:
120-
TextStyle(color: Theme.of(context).errorColor))),
121-
),
122-
const SizedBox(
123-
width: 10,
124-
),
125-
Expanded(
126-
child: OutlinedButton(
127-
onPressed: () => showDialog(
128-
context: context,
129-
builder: (context) => _ConfirmationDialog(
130-
title: context.l10n.houseKeepingRemoveTempFiles,
131-
iconData: YaruIcons.document,
132-
onConfirm: () {
133-
model.removeTempFiles();
134-
Navigator.of(context).pop();
135-
},
136-
),
137-
),
138-
child: Text(context.l10n.houseKeepingRemoveTempFiles,
139-
style:
140-
TextStyle(color: Theme.of(context).errorColor))),
141-
),
142-
],
143-
),
144-
),
118+
YaruRow(
119+
trailingWidget: Text(context.l10n.houseKeepingEmptyTrash),
120+
actionWidget: _TrashButton(
121+
onPressed: () => showDialog(
122+
context: context,
123+
builder: (context) => _ConfirmationDialog(
124+
title: context.l10n.houseKeepingEmptyTrash,
125+
iconData: YaruIcons.trash_full,
126+
onConfirm: () {
127+
model.emptyTrash();
128+
Navigator.of(context).pop();
129+
},
130+
),
131+
)),
132+
enabled: true),
133+
YaruRow(
134+
trailingWidget: Text(context.l10n.houseKeepingRemoveTempFiles),
135+
actionWidget: _TrashButton(
136+
onPressed: () => showDialog(
137+
context: context,
138+
builder: (context) => _ConfirmationDialog(
139+
title: context.l10n.houseKeepingRemoveTempFiles,
140+
iconData: YaruIcons.document,
141+
onConfirm: () {
142+
model.removeTempFiles();
143+
Navigator.of(context).pop();
144+
},
145+
),
146+
)),
147+
enabled: true),
145148
],
146149
),
147150
]);
@@ -237,3 +240,22 @@ class _ConfirmationDialogState extends State<_ConfirmationDialog>
237240
);
238241
}
239242
}
243+
244+
class _TrashButton extends StatelessWidget {
245+
const _TrashButton({Key? key, required this.onPressed}) : super(key: key);
246+
247+
final void Function()? onPressed;
248+
249+
@override
250+
Widget build(BuildContext context) {
251+
return SizedBox(
252+
height: 40,
253+
width: 40,
254+
child: OutlinedButton(
255+
style: OutlinedButton.styleFrom(padding: const EdgeInsets.all(0)),
256+
onPressed: onPressed,
257+
child: Icon(YaruIcons.trash, color: Theme.of(context).errorColor),
258+
),
259+
);
260+
}
261+
}

lib/view/pages/privacy/privacy_model.dart

+2
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,6 @@ class PrivacyModel extends SafeChangeNotifier {
7171
void emptyTrash() => _houseKeepingService.emptyTrash();
7272

7373
void removeTempFiles() => _houseKeepingService.removeTempFiles();
74+
75+
void clearRecentlyUsed() => _houseKeepingService.clearRecentlyUsed();
7476
}

0 commit comments

Comments
 (0)