blob: e4820f1c3b5b0a3a527d1d9fede20480111cdf1b [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_NTP_TILES_CUSTOM_LINKS_MANAGER_H_
#define COMPONENTS_NTP_TILES_CUSTOM_LINKS_MANAGER_H_
#include <vector>
#include "base/callback_list.h"
#include "base/strings/string16.h"
#include "components/ntp_tiles/ntp_tile.h"
#include "url/gurl.h"
namespace ntp_tiles {
// Interface to manage and store custom links for the NTP. Initialized from
// MostVisitedSites.
//
// Custom links replaces the Most Visited tiles and allows users to manually
// add, edit, and delete tiles (i.e. links) up to a certain maximum. Duplicate
// URLs are not allowed, and the links are stored locally per profile.
//
// If the link is initialized from |Initialize|, it is considered a Most Visited
// link and will be deleted when its history entry is cleared. Once the user
// modifies the link, it will no longer be considered Most Visited and will not
// be deleted when history is cleared.
//
// The current list of links is kept in sync with any changes from Chrome sync.
class CustomLinksManager {
public:
struct Link {
GURL url;
base::string16 title;
bool is_most_visited = false;
bool operator==(const Link& other) const {
return url == other.url && title == other.title &&
is_most_visited == other.is_most_visited;
}
};
virtual ~CustomLinksManager() = default;
// Fills the initial links with |tiles| and sets the initalized status to
// true. These links will be considered Most Visited and will be deleted when
// history is cleared. Returns false and does nothing if custom links has
// already been initialized.
virtual bool Initialize(const NTPTilesVector& tiles) = 0;
// Uninitializes custom links and clears the current links from storage.
virtual void Uninitialize() = 0;
// True if custom links is initialized and Most Visited tiles have been
// replaced by custom links.
virtual bool IsInitialized() const = 0;
// Returns the current links.
virtual const std::vector<Link>& GetLinks() const = 0;
// Adds a link to the end of the list. This link will not be deleted when
// history is cleared. Returns false and does nothing if custom links is not
// initialized, |url| is invalid, we're at the maximum number of links, or
// |url| already exists in the list.
virtual bool AddLink(const GURL& url, const base::string16& title) = 0;
// Updates the URL and/or title of the link specified by |url|. The link will
// no longer be considered Most Visited. Returns false and does nothing if
// custom links is not initialized, either URL is invalid, |url| does not
// exist in the list, |new_url| already exists in the list, or both parameters
// are empty.
virtual bool UpdateLink(const GURL& url,
const GURL& new_url,
const base::string16& new_title) = 0;
// Moves the specified link from its current index and inserts it at
// |new_pos|. Returns false and does nothing if custom links is not
// initialized, |url| is invalid, |url| does not exist in the list, or
// |new_pos| is invalid/already the current index.
virtual bool ReorderLink(const GURL& url, size_t new_pos) = 0;
// Deletes the link with the specified |url|. Returns false and does nothing
// if custom links is not initialized, |url| is invalid, or |url| does not
// exist in the list.
virtual bool DeleteLink(const GURL& url) = 0;
// Restores the previous state of the list of links. Used to undo the previous
// action (add, edit, delete, etc.). Returns false and does nothing if custom
// links is not initialized or there is no previous state to restore.
virtual bool UndoAction() = 0;
// Registers a callback that will be invoked when custom links are updated by
// sources other than this interface's methods (i.e. when links are deleted by
// history clear or when links are updated by Chrome sync).
virtual std::unique_ptr<base::CallbackList<void()>::Subscription>
RegisterCallbackForOnChanged(base::RepeatingClosure callback) = 0;
};
} // namespace ntp_tiles
#endif // COMPONENTS_NTP_TILES_CUSTOM_LINKS_MANAGER_H_