diff --git a/src/core/qgsnewsfeedparser.cpp b/src/core/qgsnewsfeedparser.cpp index bbc2be5c515..10edea874d0 100644 --- a/src/core/qgsnewsfeedparser.cpp +++ b/src/core/qgsnewsfeedparser.cpp @@ -92,7 +92,8 @@ void QgsNewsFeedParser::dismissEntry( int key ) } } - emit entryDismissed( dismissed ); + if ( !mBlockSignals ) + emit entryDismissed( dismissed ); } void QgsNewsFeedParser::dismissAll() @@ -189,7 +190,16 @@ void QgsNewsFeedParser::readStoredEntries() mEntries.reserve( existing.size() ); for ( const QString &entry : existing ) { - mEntries.append( readEntryFromSettings( entry.toInt() ) ); + const Entry e = readEntryFromSettings( entry.toInt() ); + if ( !e.expiry.isValid() || e.expiry > QDateTime::currentDateTime() ) + mEntries.append( e ); + else + { + // expired entry, prune it + mBlockSignals = true; + dismissEntry( e.key ); + mBlockSignals = false; + } } } diff --git a/src/core/qgsnewsfeedparser.h b/src/core/qgsnewsfeedparser.h index 47222b8bc97..2d9d09d8cf8 100644 --- a/src/core/qgsnewsfeedparser.h +++ b/src/core/qgsnewsfeedparser.h @@ -162,6 +162,7 @@ class CORE_EXPORT QgsNewsFeedParser : public QObject QString mSettingsKey; QList< Entry > mEntries; + bool mBlockSignals = false; void readStoredEntries(); Entry readEntryFromSettings( int key ); diff --git a/tests/src/core/testqgsnewsfeedparser.cpp b/tests/src/core/testqgsnewsfeedparser.cpp index f2be556f713..ecb8a250b40 100644 --- a/tests/src/core/testqgsnewsfeedparser.cpp +++ b/tests/src/core/testqgsnewsfeedparser.cpp @@ -35,6 +35,7 @@ class TestQgsNewsFeedParser: public QObject void cleanup(); // will be called after every testfunction. void testFetch(); + void testAutoExpiry(); void testModel(); void testProxyModel(); @@ -193,6 +194,32 @@ void TestQgsNewsFeedParser::testFetch() QCOMPARE( parser5.entries().count(), 0 ); } +void TestQgsNewsFeedParser::testAutoExpiry() +{ + const QUrl url( QStringLiteral( "xxx" ) ); + const QString feedKey = QgsNewsFeedParser::keyForFeed( url.toString() ); + QgsSettings().remove( feedKey, QgsSettings::Core ); + + // ensure entries "auto expire" when past their use-by date + QgsNewsFeedParser::Entry testEntry; + testEntry.key = 1; + testEntry.title = QStringLiteral( "test entry" ); + QgsNewsFeedParser::Entry testEntry2; + testEntry2.key = 2; + testEntry2.title = QStringLiteral( "test entry2" ); + testEntry2.expiry = QDateTime( QDate( 1997, 1, 1 ), QTime( 0, 0, 0 ), Qt::UTC ); + + QgsNewsFeedParser parser( url ); + parser.storeEntryInSettings( testEntry ); + parser.storeEntryInSettings( testEntry2 ); + + // on relaunch, expired entries should be auto-pruned + QgsNewsFeedParser parser2( url ); + QCOMPARE( parser2.entries().count(), 1 ); + QCOMPARE( parser2.entries().at( 0 ).title, QStringLiteral( "test entry" ) ); + QVERIFY( !parser2.entries().at( 0 ).expiry.isValid() ); +} + void TestQgsNewsFeedParser::testModel() { // test news feed model