]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Make sure that old URLs do not appear duplicated in places model
authorRenato Araujo Oliveira Filho <renato.araujo@kdab.com>
Thu, 14 Dec 2017 15:35:44 +0000 (12:35 -0300)
committerRenato Araujo Oliveira Filho <renato.araujo@kdab.com>
Fri, 26 Jan 2018 14:07:59 +0000 (11:07 -0300)
Summary:
BUG: 389401

KIO model now provides Baloo URLs; we need to remove the old ones
created by Dolphin places model

BUG: 387888
Depends on D9332

Test Plan: unit test

Reviewers: mwolff, #dolphin, ngraham, elvisangelaccio

Reviewed By: #dolphin, ngraham, elvisangelaccio

Subscribers: elvisangelaccio, broulik, ervin, ngraham, #dolphin

Differential Revision: https://phabricator.kde.org/D9333

src/panels/places/placesitemmodel.cpp
src/panels/places/placesitemmodel.h
src/tests/placesitemmodeltest.cpp

index 62d1e5d78fda5a7238c63b2d0bda84da7fdb8821..bee3b7cbe662fcc3c0bc7ab44aa6cd656ea8f28b 100644 (file)
 #include <views/viewproperties.h>
 
 namespace {
-    // Hence a prefix to the application-name of the stored bookmarks is
+    // A suffix to the application-name of the stored bookmarks is
     // added, which is only read by PlacesItemModel.
-    const char AppNamePrefix[] = "-places-panel";
+    const QString AppNameSuffix = QStringLiteral("-places-panel");
+    static QList<QUrl> balooURLs = {
+        QUrl(QStringLiteral("timeline:/today")),
+        QUrl(QStringLiteral("timeline:/yesterday")),
+        QUrl(QStringLiteral("timeline:/thismonth")),
+        QUrl(QStringLiteral("timeline:/lastmonth")),
+        QUrl(QStringLiteral("search:/documents")),
+        QUrl(QStringLiteral("search:/images")),
+        QUrl(QStringLiteral("search:/audio")),
+        QUrl(QStringLiteral("search:/videos"))
+    };
 }
 
 PlacesItemModel::PlacesItemModel(QObject* parent) :
@@ -63,8 +73,9 @@ PlacesItemModel::PlacesItemModel(QObject* parent) :
     m_hiddenItemsShown(false),
     m_deviceToTearDown(nullptr),
     m_storageSetupInProgress(),
-    m_sourceModel(new KFilePlacesModel(this))
+    m_sourceModel(new KFilePlacesModel(KAboutData::applicationData().componentName() + AppNameSuffix, this))
 {
+    cleanupBookmarks();
     loadBookmarks();
     initializeDefaultViewProperties();
 
@@ -153,12 +164,13 @@ void PlacesItemModel::insertSortedItem(PlacesItem* item)
 
     for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
         sourceIndex = m_sourceModel->index(r, 0);
+        const KBookmark sourceBookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
 
-        if (bookmarkId(m_sourceModel->bookmarkForIndex(sourceIndex)) == iBookmarkId) {
+        if (bookmarkId(sourceBookmark) == iBookmarkId) {
             break;
         }
 
-        if (!m_sourceModel->isHidden(sourceIndex)) {
+        if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) {
             pos++;
         }
     }
@@ -559,11 +571,7 @@ void PlacesItemModel::onSourceModelRowsMoved(const QModelIndex &parent, int star
         const int targetRow = row + (start - r) - (r < row ? blockSize : 0);
         const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination);
 
-        const KBookmark bookmark = m_sourceModel->bookmarkForIndex(targetIndex);
-        PlacesItem *item = new PlacesItem(bookmark);
-        updateItem(item, targetIndex);
-
-        insertSortedItem(item);
+        addItemFromSourceModel(targetIndex);
     }
 }
 
@@ -608,13 +616,33 @@ void PlacesItemModel::onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupTyp
     }
 }
 
+void PlacesItemModel::cleanupBookmarks()
+{
+    // KIO model now provides support for baloo urls, and because of that we
+    // need to remove old URLs that were visible only in Dolphin to avoid duplication
+    int row = 0;
+    do {
+        const QModelIndex sourceIndex = m_sourceModel->index(row, 0);
+        const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
+        const QUrl url = bookmark.url();
+        const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp"));
+
+        if ((appName == KAboutData::applicationData().componentName() ||
+             appName == KAboutData::applicationData().componentName() + AppNameSuffix) && balooURLs.contains(url)) {
+            qCDebug(DolphinDebug) << "Removing old baloo url:" << url;
+            m_sourceModel->removePlace(sourceIndex);
+        } else {
+            row++;
+        }
+    } while (row < m_sourceModel->rowCount());
+}
+
 void PlacesItemModel::loadBookmarks()
 {
     for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
         const QModelIndex sourceIndex = m_sourceModel->index(r, 0);
         KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
-        if (acceptBookmark(bookmark) &&
-                (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex))) {
+        if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) {
             addItemFromSourceModel(sourceIndex);
         }
     }
@@ -625,19 +653,6 @@ void PlacesItemModel::loadBookmarks()
 #endif
 }
 
-bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark) const
-{
-    const QString udi = bookmark.metaDataItem(QStringLiteral("UDI"));
-    const QUrl url = bookmark.url();
-    const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp"));
-
-    const bool allowedHere = (appName.isEmpty()
-                              || appName == KAboutData::applicationData().componentName()
-                              || appName == KAboutData::applicationData().componentName() + AppNamePrefix);
-
-    return (udi.isEmpty() && allowedHere);
-}
-
 void PlacesItemModel::clear() {
     KStandardItemModel::clear();
 }
index c8830ee6f4c54f19453bbb16fa42c37ef672de0e..a1b23b220190bc6cce7a930c5f553a6041aea62d 100644 (file)
@@ -168,17 +168,16 @@ private slots:
 
 private:
     /**
-     * Loads the bookmarks from the bookmark-manager and creates items for
-     * the model or moves hidden items to m_bookmarkedItems.
+     * Remove bookmarks created by the previous version of dolphin that are
+     * not valid anymore
      */
-    void loadBookmarks();
+    void cleanupBookmarks();
 
     /**
-     * @return True, if the bookmark can be accepted in the context of the
-     *         current application (e.g. bookmarks from other applications
-     *         will be ignored).
+     * Loads the bookmarks from the bookmark-manager and creates items for
+     * the model or moves hidden items to m_bookmarkedItems.
      */
-    bool acceptBookmark(const KBookmark& bookmark) const;
+    void loadBookmarks();
 
     QString internalMimeType() const;
 
index ef24292ed42ea2137306397c512cc37058bf9256..8fb01676abc6364208a81adf8b408ca702c53179 100644 (file)
@@ -83,6 +83,7 @@ private slots:
     void testIcons();
     void testDragAndDrop();
     void testHideDevices();
+    void testDuplicatedEntries();
 
 private:
     PlacesItemModel* m_model;
@@ -780,6 +781,31 @@ void PlacesItemModelTest::testHideDevices()
     m_model = new PlacesItemModel();
     QTRY_COMPARE(m_model->count(), urls.count());
     CHECK_PLACES_URLS(urls);
+
+    // revert changes
+    m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, false);
+    urls = initialUrls();
+    QTRY_COMPARE(m_model->count(), urls.count());
+    CHECK_PLACES_URLS(urls);
+}
+
+void PlacesItemModelTest::testDuplicatedEntries()
+{
+    QStringList urls = initialUrls();
+    // create a duplicated entry on bookmark
+    KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(bookmarksFile(), QStringLiteral("kfilePlaces"));
+    KBookmarkGroup root = bookmarkManager->root();
+    KBookmark bookmark = root.addBookmark(QStringLiteral("Duplicated Search Videos"), QUrl("search:/videos"), {});
+
+    const QString id = QUuid::createUuid().toString();
+    bookmark.setMetaDataItem(QStringLiteral("ID"), id);
+    bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName());
+    bookmarkManager->emitChanged(bookmarkManager->root());
+
+    PlacesItemModel *newModel = new PlacesItemModel();
+    QTRY_COMPARE(placesUrls(newModel).count(QStringLiteral("search:/videos")), 1);
+    QTRY_COMPARE(urls, placesUrls(newModel));
+    delete newModel;
 }
 
 QTEST_MAIN(PlacesItemModelTest)