| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 
 | From: =?utf-8?q?Jeremy_B=C3=ADcha?= <jeremy.bicha@canonical.com>
Date: Sat, 12 Apr 2025 19:30:17 -0400
Subject: Revert "recent_files_menu: Dont always check for existance"
This reverts commit 94e2d362772d1fb180e1525904ff09d3113f0413.
asyncio requires pygobject 3.52
---
 gsecrets/application.py       |  4 ----
 gsecrets/recent_files_menu.py | 27 +++++++++++++++++++++++++++
 gsecrets/recent_manager.py    | 41 ++++++-----------------------------------
 3 files changed, 33 insertions(+), 39 deletions(-)
diff --git a/gsecrets/application.py b/gsecrets/application.py
index ba73619..62920c8 100644
--- a/gsecrets/application.py
+++ b/gsecrets/application.py
@@ -9,7 +9,6 @@ from gi.events import GLibEventLoopPolicy
 from gi.repository import Adw, Gio, GLib, Gtk, GtkSource
 
 from gsecrets import const
-from gsecrets.recent_manager import RecentManager
 from gsecrets.widgets.mod import load_widgets
 from gsecrets.widgets.window import Window
 
@@ -52,9 +51,6 @@ class Application(Adw.Application):
 
         load_widgets()
 
-        recents = RecentManager()
-        self.create_asyncio_task(recents.clean_non_existent())
-
     def do_open(self, gfile_list, _n_files, _hint):  # pylint: disable=arguments-differ
         for gfile in gfile_list:
             if not gfile.query_exists():
diff --git a/gsecrets/recent_files_menu.py b/gsecrets/recent_files_menu.py
index 21b40af..9fcfffa 100644
--- a/gsecrets/recent_files_menu.py
+++ b/gsecrets/recent_files_menu.py
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-3.0-only
 from __future__ import annotations
 
+import logging
 from gettext import gettext as _
 
 from gi.repository import Gio
@@ -19,12 +20,38 @@ class RecentFilesMenu:
         self.is_empty = True
 
         recents = RecentManager()
+        to_remove = []
 
+        attribute = Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE
         for item in reversed(recents):
+            if not item.query_exists():
+                uri = item.get_uri()
+                logging.info("Ignoring nonexistent recent file: %s", uri)
+                to_remove.append(item)
+                continue
+
+            file_info = item.query_info(
+                attribute,
+                Gio.FileQueryInfoFlags.NONE,
+                None,
+            )
+            if content_type := file_info.get_attribute_as_string(attribute):
+                mime_type = Gio.content_type_get_mime_type(content_type)
+            else:
+                mime_type = "application/octet-stream"
+
+            if mime_type != "application/x-keepass2":
+                continue
+
             basename = item.get_basename()
             path = item.get_path()
             self.section.append(basename, f"win.open_database::{path}")
             self.is_empty = False
 
+        # We remove items after we are done iterating to avoid undefined
+        # behaviour.
+        for item in to_remove:
+            recents.remove_item(item)
+
         self.menu.append_section(_("Recent Files"), self.section)
         self.menu.freeze()
diff --git a/gsecrets/recent_manager.py b/gsecrets/recent_manager.py
index f1097dd..99600ff 100644
--- a/gsecrets/recent_manager.py
+++ b/gsecrets/recent_manager.py
@@ -1,8 +1,7 @@
 # SPDX-License-Identifier: GPL-3.0-only
-import logging
 from collections import deque
 
-from gi.repository import Gio, GLib, GObject
+from gi.repository import Gio, GObject
 
 from gsecrets.const import APP_ID
 
@@ -39,12 +38,11 @@ class RecentManager(GObject.Object):
         self._save_items()
         self.emit(self.changed)
 
-    def _remove_items(self, items: list[Gio.File]) -> None:
-        for item in items:
-            self.recents.remove(item)
-
-        if bool(items):
-            self._save_items()
+    def remove_item(self, item: Gio.File) -> None:
+        if found := next(
+            (f for f in self.recents if f.get_uri() == item.get_uri()), None
+        ):
+            self.recents.remove(found)
             self.emit(self.changed)
 
     def is_empty(self) -> bool:
@@ -70,30 +68,3 @@ class RecentManager(GObject.Object):
     def _on_settings_changed(self, _settings, _key):
         self._load_items()
         self.emit(self.changed)
-
-    async def clean_non_existent(self) -> None:
-        to_remove = []
-
-        for item in self.recents:
-            try:
-                await item.query_info_async(
-                    Gio.FILE_ATTRIBUTE_STANDARD_TYPE,
-                    Gio.FileQueryInfoFlags.NONE,
-                    GLib.PRIORITY_DEFAULT,
-                    None,
-                )
-            except GLib.Error as err:
-                file_exist = not err.matches(
-                    Gio.io_error_quark(), Gio.IOErrorEnum.NOT_FOUND
-                )
-                if file_exist:
-                    logging.exception("Could not get file info")
-                else:
-                    uri = item.get_uri()
-                    logging.info("Ignoring nonexistent recent file: %s", uri)
-
-                to_remove.append(item)
-
-        # We remove items after we are done iterating to avoid undefined
-        # behaviour.
-        self._remove_items(to_remove)
 |