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/new_tab_page_prefs.h"
6
7#include <jni.h>
8
9#include "base/android/jni_string.h"
10#include "base/prefs/pref_service.h"
11#include "base/prefs/scoped_user_pref_update.h"
12#include "chrome/browser/profiles/profile_android.h"
13#include "chrome/common/pref_names.h"
14#include "components/pref_registry/pref_registry_syncable.h"
15#include "jni/NewTabPagePrefs_jni.h"
16
17using base::android::ConvertJavaStringToUTF8;
18
19static jlong Init(JNIEnv* env, jclass clazz, jobject profile) {
20  NewTabPagePrefs* new_tab_page_prefs =
21      new NewTabPagePrefs(ProfileAndroid::FromProfileAndroid(profile));
22  return reinterpret_cast<intptr_t>(new_tab_page_prefs);
23}
24
25NewTabPagePrefs::NewTabPagePrefs(Profile* profile)
26  : profile_(profile) {
27}
28
29void NewTabPagePrefs::Destroy(JNIEnv* env, jobject obj) {
30  delete this;
31}
32
33NewTabPagePrefs::~NewTabPagePrefs() {
34}
35
36jboolean NewTabPagePrefs::GetCurrentlyOpenTabsCollapsed(JNIEnv* env,
37                                                       jobject obj) {
38  PrefService* prefs = profile_->GetPrefs();
39  return prefs->GetBoolean(prefs::kNtpCollapsedCurrentlyOpenTabs);
40}
41
42void NewTabPagePrefs::SetCurrentlyOpenTabsCollapsed(JNIEnv* env,
43                                                   jobject obj,
44                                                   jboolean is_collapsed) {
45  PrefService* prefs = profile_->GetPrefs();
46  prefs->SetBoolean(prefs::kNtpCollapsedCurrentlyOpenTabs, is_collapsed);
47}
48
49jboolean NewTabPagePrefs::GetSnapshotDocumentCollapsed(JNIEnv* env,
50                                                       jobject obj) {
51  return profile_->GetPrefs()->GetBoolean(prefs::kNtpCollapsedSnapshotDocument);
52}
53
54void NewTabPagePrefs::SetSnapshotDocumentCollapsed(JNIEnv* env,
55                                                   jobject obj,
56                                                   jboolean is_collapsed) {
57  PrefService* prefs = profile_->GetPrefs();
58  prefs->SetBoolean(prefs::kNtpCollapsedSnapshotDocument, is_collapsed);
59}
60
61jboolean NewTabPagePrefs::GetRecentlyClosedTabsCollapsed(JNIEnv* env,
62                                                         jobject obj) {
63  return profile_->GetPrefs()->GetBoolean(
64      prefs::kNtpCollapsedRecentlyClosedTabs);
65}
66
67void NewTabPagePrefs::SetRecentlyClosedTabsCollapsed(JNIEnv* env,
68                                                     jobject obj,
69                                                     jboolean is_collapsed) {
70  PrefService* prefs = profile_->GetPrefs();
71  prefs->SetBoolean(prefs::kNtpCollapsedRecentlyClosedTabs, is_collapsed);
72}
73
74jboolean NewTabPagePrefs::GetSyncPromoCollapsed(JNIEnv* env,
75                                                       jobject obj) {
76  return profile_->GetPrefs()->GetBoolean(prefs::kNtpCollapsedSyncPromo);
77}
78
79void NewTabPagePrefs::SetSyncPromoCollapsed(JNIEnv* env,
80                                            jobject obj,
81                                            jboolean is_collapsed) {
82  PrefService* prefs = profile_->GetPrefs();
83  prefs->SetBoolean(prefs::kNtpCollapsedSyncPromo, is_collapsed);
84}
85
86jboolean NewTabPagePrefs::GetForeignSessionCollapsed(JNIEnv* env,
87                                                     jobject obj,
88                                                     jstring session_tag) {
89  const base::DictionaryValue* dict = profile_->GetPrefs()->GetDictionary(
90      prefs::kNtpCollapsedForeignSessions);
91  return dict && dict->HasKey(ConvertJavaStringToUTF8(env, session_tag));
92}
93
94void NewTabPagePrefs::SetForeignSessionCollapsed(JNIEnv* env,
95                                                 jobject obj,
96                                                 jstring session_tag,
97                                                 jboolean is_collapsed) {
98  // Store session tags for collapsed sessions in a preference so that the
99  // collapsed state persists.
100  PrefService* prefs = profile_->GetPrefs();
101  DictionaryPrefUpdate update(prefs, prefs::kNtpCollapsedForeignSessions);
102  if (is_collapsed)
103    update.Get()->SetBoolean(ConvertJavaStringToUTF8(env, session_tag), true);
104  else
105    update.Get()->Remove(ConvertJavaStringToUTF8(env, session_tag), NULL);
106}
107
108// static
109void NewTabPagePrefs::RegisterProfilePrefs(
110    user_prefs::PrefRegistrySyncable* registry) {
111  registry->RegisterBooleanPref(
112      prefs::kNtpCollapsedCurrentlyOpenTabs,
113      false,
114      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
115  registry->RegisterBooleanPref(
116      prefs::kNtpCollapsedSnapshotDocument,
117      false,
118      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
119  registry->RegisterBooleanPref(
120      prefs::kNtpCollapsedRecentlyClosedTabs,
121      false,
122      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
123  registry->RegisterBooleanPref(
124      prefs::kNtpCollapsedSyncPromo,
125      false,
126      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
127  registry->RegisterDictionaryPref(
128      prefs::kNtpCollapsedForeignSessions,
129      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
130  registry->RegisterDictionaryPref(
131      prefs::kNtpMostVisitedURLsBlacklist,
132      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
133}
134
135// static
136bool NewTabPagePrefs::RegisterNewTabPagePrefs(JNIEnv* env) {
137  return RegisterNativesImpl(env);
138}
139