1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h"
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/bind.h"
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/bind_helpers.h"
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/prefs/pref_service.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "chrome/browser/bookmarks/bookmark_model.h"
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "chrome/browser/policy/configuration_policy_handler_android.h"
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "chrome/common/pref_names.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "grit/generated_resources.h"
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "ui/base/l10n/l10n_util.h"
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochusing policy::ManagedBookmarksPolicyHandler;
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
20d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochManagedBookmarksShim::ManagedBookmarksShim(PrefService* prefs)
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    : prefs_(prefs) {
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  registrar_.Init(prefs_);
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  registrar_.Add(
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      prefs::kManagedBookmarks,
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      base::Bind(&ManagedBookmarksShim::Reload, base::Unretained(this)));
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Reload();
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
29d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochManagedBookmarksShim::~ManagedBookmarksShim() {}
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvoid ManagedBookmarksShim::AddObserver(Observer* observer) {
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  observers_.AddObserver(observer);
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvoid ManagedBookmarksShim::RemoveObserver(Observer* observer) {
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  observers_.RemoveObserver(observer);
37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ManagedBookmarksShim::HasManagedBookmarks() const {
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return !root_->empty();
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ManagedBookmarksShim::IsManagedBookmark(const BookmarkNode* node) const {
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  while (node != NULL) {
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (node == root_.get())
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return true;
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    node = node->parent();
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return false;
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochconst BookmarkNode* ManagedBookmarksShim::GetManagedBookmarksRoot() const {
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return root_.get();
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochconst BookmarkNode* ManagedBookmarksShim::GetNodeByID(int64 id) const {
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (root_->id() == id)
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return root_.get();
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (int i = 0; i < root_->child_count(); ++i) {
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    const BookmarkNode* child = root_->GetChild(i);
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (child->id() == id)
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return child;
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return NULL;
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvoid ManagedBookmarksShim::Reload() {
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string domain;
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string username = prefs_->GetString(prefs::kGoogleServicesUsername);
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!username.empty())
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    domain = gaia::ExtractDomainName(username);
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  string16 root_node_name;
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (domain.empty()) {
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_node_name =
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_POLICY_MANAGED_BOOKMARKS_DEFAULT_NAME);
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    root_node_name = l10n_util::GetStringFUTF16(IDS_POLICY_MANAGED_BOOKMARKS,
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                                base::UTF8ToUTF16(domain));
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  root_.reset(new BookmarkPermanentNode(0));
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  root_->SetTitle(root_node_name);
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const base::ListValue* list = prefs_->GetList(prefs::kManagedBookmarks);
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  int64 id = 1;
86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (list) {
87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    for (base::ListValue::const_iterator it = list->begin();
88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch         it != list->end(); ++it) {
89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      const base::DictionaryValue* dict = NULL;
90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      if (!*it || !(*it)->GetAsDictionary(&dict)) {
91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        NOTREACHED();
92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        continue;
93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      string16 name;
96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      std::string url;
97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      if (!dict->GetString(ManagedBookmarksPolicyHandler::kName, &name) ||
98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          !dict->GetString(ManagedBookmarksPolicyHandler::kUrl, &url)) {
99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        NOTREACHED();
100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        continue;
101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
103d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      BookmarkNode* node = new BookmarkNode(id++, GURL(url));
104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      node->set_type(BookmarkNode::URL);
105d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      node->SetTitle(name);
106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      root_->Add(node, root_->child_count());
107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  FOR_EACH_OBSERVER(Observer, observers_, OnManagedBookmarksChanged());
111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
112