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