blob: fa336656e30f86f1a7a7b7d38037d7b66aa669e2 [file] [log] [blame]
// Copyright 2013 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.
#include "chrome/browser/android/bookmarks/managed_bookmarks_shim.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/prefs/pref_service.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/policy/configuration_policy_handler_android.h"
#include "chrome/common/pref_names.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "grit/component_strings.h"
#include "ui/base/l10n/l10n_util.h"
using policy::ManagedBookmarksPolicyHandler;
ManagedBookmarksShim::ManagedBookmarksShim(PrefService* prefs)
: prefs_(prefs) {
registrar_.Init(prefs_);
registrar_.Add(
prefs::kManagedBookmarks,
base::Bind(&ManagedBookmarksShim::Reload, base::Unretained(this)));
Reload();
}
ManagedBookmarksShim::~ManagedBookmarksShim() {}
void ManagedBookmarksShim::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
}
void ManagedBookmarksShim::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
bool ManagedBookmarksShim::HasManagedBookmarks() const {
return !root_->empty();
}
bool ManagedBookmarksShim::IsManagedBookmark(const BookmarkNode* node) const {
while (node != NULL) {
if (node == root_.get())
return true;
node = node->parent();
}
return false;
}
const BookmarkNode* ManagedBookmarksShim::GetManagedBookmarksRoot() const {
return root_.get();
}
const BookmarkNode* ManagedBookmarksShim::GetNodeByID(int64 id) const {
if (root_->id() == id)
return root_.get();
for (int i = 0; i < root_->child_count(); ++i) {
const BookmarkNode* child = root_->GetChild(i);
if (child->id() == id)
return child;
}
return NULL;
}
void ManagedBookmarksShim::Reload() {
std::string domain;
std::string username = prefs_->GetString(prefs::kGoogleServicesUsername);
if (!username.empty())
domain = gaia::ExtractDomainName(username);
base::string16 root_node_name;
if (domain.empty()) {
root_node_name =
l10n_util::GetStringUTF16(IDS_POLICY_MANAGED_BOOKMARKS_DEFAULT_NAME);
} else {
root_node_name = l10n_util::GetStringFUTF16(IDS_POLICY_MANAGED_BOOKMARKS,
base::UTF8ToUTF16(domain));
}
root_.reset(new BookmarkPermanentNode(0));
root_->SetTitle(root_node_name);
const base::ListValue* list = prefs_->GetList(prefs::kManagedBookmarks);
int64 id = 1;
if (list) {
for (base::ListValue::const_iterator it = list->begin();
it != list->end(); ++it) {
const base::DictionaryValue* dict = NULL;
if (!*it || !(*it)->GetAsDictionary(&dict)) {
NOTREACHED();
continue;
}
base::string16 name;
std::string url;
if (!dict->GetString(ManagedBookmarksPolicyHandler::kName, &name) ||
!dict->GetString(ManagedBookmarksPolicyHandler::kUrl, &url)) {
NOTREACHED();
continue;
}
BookmarkNode* node = new BookmarkNode(id++, GURL(url));
node->set_type(BookmarkNode::URL);
node->SetTitle(name);
root_->Add(node, root_->child_count());
}
}
FOR_EACH_OBSERVER(Observer, observers_, OnManagedBookmarksChanged());
}