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