chromium/ios/chrome/browser/bookmarks/model/bookmarks_utils.h

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_BOOKMARKS_MODEL_BOOKMARKS_UTILS_H_
#define IOS_CHROME_BROWSER_BOOKMARKS_MODEL_BOOKMARKS_UTILS_H_

#include <map>
#include <set>
#include <vector>

enum class BookmarkStorageType;
class PrefService;

namespace bookmarks {
class BookmarkModel;
class BookmarkNode;
}  // namespace bookmarks

// Enum representing the internal behavior's outcome for
// `GetDefaultBookmarkFolder()`, distinguishing the various cases depending on
// the values in PrefService. These values are persisted to logs. Entries should
// not be renumbered and numeric values should never be reused.
enum class DefaultBookmarkFolderOutcomeForMetrics {
  kUnset = 0,
  kExistingLocalFolderSet = 1,
  kExistingAccountFolderSet = 2,
  kMissingLocalFolderSet = 3,
  kMissingAccountFolderSet = 4,
  kMaxValue = kMissingAccountFolderSet
};

// Used in the preference kIosBookmarkLastUsedFolderReceivingBookmarks.
// It means that the user has not set a folder for bookmarks explicitly.
extern const int64_t kLastUsedBookmarkFolderNone;

// Returns the permanent bookmark folders that match `type`.
// `model` must not be null and must be loaded. The returned list follows the
// ordering used to display the folders in the management UI. Note that the
// managed bookmarks folder is never included.
//
// Additional caveats if `BookmarkStorageType::kAccount` is used:
// 1. The function may return an empty result if account bookmarks don't
//    actually exist (e.g. the user is signed out).
// 2. In rare cases, it may also return a non-empty but partial list, if this
//    function is exercised *during* the creation of account permanent folders,
//    which report BookmarkModelObserver::BookmarkNodeAdded() individually. The
//    same is true during their destruction (during signout).
std::vector<const bookmarks::BookmarkNode*> PrimaryPermanentNodes(
    const bookmarks::BookmarkModel* model,
    BookmarkStorageType type);

// Whether a bookmark was manually moved by the user to a different folder since
// last signin/signout.
bool IsLastUsedBookmarkFolderSet(PrefService* prefs);

// Resets the preferences related to the last used folder for bookmarks.
void ResetLastUsedBookmarkFolder(PrefService* prefs);

// Records `folder` of model `type` as the last folder the user selected to save
// or move bookmarks.
void SetLastUsedBookmarkFolder(PrefService* prefs,
                               const bookmarks::BookmarkNode* folder,
                               BookmarkStorageType type);

// It returns the first bookmark folder that exists, with the following
// priority:
//- Last used folder
//- Account mobile folder
//- Local mobile folder
const bookmarks::BookmarkNode* GetDefaultBookmarkFolder(
    PrefService* prefs,
    const bookmarks::BookmarkModel* bookmark_model);

// Used when on-disk bookmark IDs have been reassigned and therefore the prefs
// need to be migrated accordingly.
void MigrateLastUsedBookmarkFolderUponLocalIdsReassigned(
    PrefService* prefs,
    const std::multimap<int64_t, int64_t>&
        local_or_syncable_reassigned_ids_per_old_id);

#endif  // IOS_CHROME_BROWSER_BOOKMARKS_MODEL_BOOKMARKS_UTILS_H_