Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync / profile_sync_service_android.h
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 #ifndef CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_ANDROID_H_
6 #define CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_ANDROID_H_
7
8 #include <jni.h>
9 #include <map>
10
11 #include "base/android/jni_weak_ref.h"
12 #include "base/callback.h"
13 #include "base/compiler_specific.h"
14 #include "base/time/time.h"
15 #include "chrome/browser/sync/profile_sync_service_observer.h"
16 #include "components/sync_driver/sync_prefs.h"
17 #include "google/cacheinvalidation/include/types.h"
18 #include "google_apis/gaia/google_service_auth_error.h"
19
20 class Profile;
21 class ProfileSyncService;
22
23 // Android wrapper of the ProfileSyncService which provides access from the Java
24 // layer. Note that on Android, there's only a single profile, and therefore
25 // a single instance of this wrapper. The name of the Java class is
26 // ProfileSyncService.
27 // This class should only be accessed from the UI thread.
28 class ProfileSyncServiceAndroid : public ProfileSyncServiceObserver {
29  public:
30
31   ProfileSyncServiceAndroid(JNIEnv* env, jobject obj);
32
33   // This method should be called once right after contructing the object.
34   void Init();
35
36   // Called from Java when we need to nudge native syncer. The |objectSource|,
37   // |objectId|, |version| and |payload| values should come from an
38   // invalidation.
39   void NudgeSyncer(JNIEnv* env,
40                    jobject obj,
41                    jint objectSource,
42                    jstring objectId,
43                    jlong version,
44                    jstring payload);
45
46   // Called from Java when we need to nudge native syncer but have lost state on
47   // which types have changed.
48   void NudgeSyncerForAllTypes(JNIEnv* env, jobject obj);
49
50   // Called from Java when the user manually enables sync
51   void EnableSync(JNIEnv* env, jobject obj);
52
53   // Called from Java when the user manually disables sync
54   void DisableSync(JNIEnv* env, jobject obj);
55
56   // Called from Java when the user signs in to Chrome. Starts up sync.
57   void SignInSync(JNIEnv* env, jobject obj);
58
59   // Called from Java when the user signs out of Chrome
60   void SignOutSync(JNIEnv* env, jobject obj);
61
62   // Returns a string version of browser_sync::SyncBackendHost::StatusSummary
63   base::android::ScopedJavaLocalRef<jstring> QuerySyncStatusSummary(
64       JNIEnv* env, jobject obj);
65
66   // Called from Java early during startup to ensure we use the correct
67   // unique machine tag in session sync. Returns true if the machine tag was
68   // succesfully set.
69   // This must be called before the |SessionModelAssociator| is initialized.
70   jboolean SetSyncSessionsId(JNIEnv* env, jobject obj, jstring tag);
71
72   // Returns true if the sync backend is initialized.
73   jboolean IsSyncInitialized(JNIEnv* env, jobject obj);
74
75   // Returns true if the sync is currently being setup for the first time.
76   jboolean IsFirstSetupInProgress(JNIEnv* env, jobject obj);
77
78   // Returns true if the user is currently encrypting everything.
79   jboolean IsEncryptEverythingEnabled(JNIEnv* env, jobject obj);
80
81   // Returns true if the sync code needs a passphrase for either encryption or
82   // decryption (can need a passphrase for encryption if the user is turning on
83   // encryption and no passphrase has been set yet).
84   jboolean IsPassphraseRequired(JNIEnv* env, jobject obj);
85
86   // Returns true if the sync code needs a decryption passphrase for one of the
87   // currently enabled types.
88   jboolean IsPassphraseRequiredForDecryption(JNIEnv* env, jobject obj);
89
90   // Returns true if the sync code needs a decryption passphrase for *any* type,
91   // even types that aren't supported on this platform (like passwords).
92   jboolean IsPassphraseRequiredForExternalType(JNIEnv* env, jobject obj);
93
94   // Returns true if the sync code needs a custom decryption passphrase.
95   // Can not be called if the sync backend is not initialized.
96   jboolean IsUsingSecondaryPassphrase(JNIEnv* env, jobject obj);
97
98   // Returns true if the decryption passphrase works (was able to decrypt the
99   // stored sync data). Should only be called if
100   // IsPassphraseRequiredForDecryption() returns true.
101   jboolean SetDecryptionPassphrase(JNIEnv* env,
102                                    jobject obj,
103                                    jstring passphrase);
104
105   // Encrypts the user's data with the passed passphrase. If |is_gaia| == true
106   // then the passphrase is treated as a google (GAIA) passphrase, otherwise
107   // it's treated like an explicit/custom passphrase.
108   void SetEncryptionPassphrase(JNIEnv* env,
109                                jobject obj,
110                                jstring passphrase,
111                                jboolean is_gaia);
112
113   // Returns whether the cryptographer is ready (i.e. encrypted types can be
114   // handled).
115   jboolean IsCryptographerReady(JNIEnv* env, jobject);
116
117   // Returns the actual passphrase type being used for encryption. This is a
118   // value from the enum defined in syncer::PassphraseType and must be matched
119   // in Java.
120   jint GetPassphraseType(JNIEnv* env, jobject obj);
121
122   // Returns true if the current explicit passphrase time is defined.
123   jboolean HasExplicitPassphraseTime(JNIEnv* env, jobject);
124
125   base::android::ScopedJavaLocalRef<jstring>
126       GetSyncEnterGooglePassphraseBodyWithDateText(
127           JNIEnv* env, jobject);
128
129   base::android::ScopedJavaLocalRef<jstring>
130       GetSyncEnterCustomPassphraseBodyWithDateText(
131           JNIEnv* env, jobject);
132
133   base::android::ScopedJavaLocalRef<jstring>
134       GetCurrentSignedInAccountText(
135           JNIEnv* env, jobject);
136
137   base::android::ScopedJavaLocalRef<jstring>
138       GetSyncEnterCustomPassphraseBodyText(
139           JNIEnv* env, jobject);
140
141   // Returns true if sync has been migrated.
142   jboolean IsSyncKeystoreMigrationDone(JNIEnv* env, jobject obj);
143
144   // Get the set of enabled data types. These are the types currently both
145   // registered and preferred. Note that control types are always included here.
146   // Returns a bit map of the values from
147   // profile_sync_service_model_type_selection_android.h.
148   jlong GetEnabledDataTypes(JNIEnv* env, jobject obj);
149
150   // Enables the passed data types.
151   // If |sync_everything| is true, then all data types are enabled and the
152   // contents of |model_type_selection| is
153   // ignored.
154   // Otherwise, the values of |model_type_selection| must contain a bit map of
155   // values from profile_sync_service_model_type_selection_android.h.
156   void SetPreferredDataTypes(JNIEnv* env,
157                              jobject obj,
158                              jboolean sync_everything,
159                              jlong model_type_selection);
160
161   // Tells sync that we're currently configuring so no data types should be
162   // downloaded yet.
163   void SetSetupInProgress(JNIEnv* env, jobject obj, jboolean in_progress);
164
165   // Tells sync that sync setup is complete so we can start syncing now.
166   void SetSyncSetupCompleted(JNIEnv* env, jobject obj);
167
168   // Returns true if sync setup has been completed.
169   jboolean HasSyncSetupCompleted(JNIEnv* env, jobject obj);
170
171   // Returns true if sync startup is currently suppressed.
172   jboolean IsStartSuppressed(JNIEnv* env, jobject obj);
173
174   // Returns true if sync is configured to "sync everything".
175   jboolean HasKeepEverythingSynced(JNIEnv* env, jobject obj);
176
177   // Turns on encryption for all data types. This is an asynchronous operation
178   // which happens after the current configuration pass is done, so a call to
179   // this routine must be followed by a call to SetEnabledDataTypes().
180   void EnableEncryptEverything(JNIEnv* env, jobject obj);
181
182   // Returns true if sync has encountered an unrecoverable error.
183   jboolean HasUnrecoverableError(JNIEnv* env, jobject obj);
184
185   // Returns sync internals in a JSON-formatted Java string.
186   base::android::ScopedJavaLocalRef<jstring> GetAboutInfoForTest(JNIEnv* env,
187                                                                  jobject obj);
188
189   // Returns the integer value corresponding to the current auth error state
190   // (GoogleServiceAuthError.State).
191   jint GetAuthError(JNIEnv* env, jobject obj);
192
193   // ProfileSyncServiceObserver:
194   virtual void OnStateChanged() OVERRIDE;
195
196   // Returns a timestamp for when a sync was last executed. The return value is
197   // the internal value of base::Time.
198   jlong GetLastSyncedTimeForTest(JNIEnv* env, jobject obj);
199
200   static ProfileSyncServiceAndroid* GetProfileSyncServiceAndroid();
201
202   // Registers the ProfileSyncServiceAndroid's native methods through JNI.
203   static bool Register(JNIEnv* env);
204
205  private:
206   typedef std::map<invalidation::ObjectId,
207                    int64,
208                    syncer::ObjectIdLessThan> ObjectIdVersionMap;
209
210   virtual ~ProfileSyncServiceAndroid();
211   // Remove observers to profile sync service.
212   void RemoveObserver();
213   // Called from Java when we need to nudge native syncer. The |object_source|,
214   // |objectId|, |version| and |payload| values should come from an
215   // invalidation.
216   void SendNudgeNotification(int object_source,
217                              const std::string& str_object_id,
218                              int64 version,
219                              const std::string& payload);
220
221   Profile* profile_;
222   ProfileSyncService* sync_service_;
223   // The class that handles getting, setting, and persisting sync
224   // preferences.
225   scoped_ptr<sync_driver::SyncPrefs> sync_prefs_;
226
227   // Java-side ProfileSyncService object.
228   JavaObjectWeakGlobalRef weak_java_profile_sync_service_;
229
230   // The invalidation API spec allows for the possibility of redundant
231   // invalidations, so keep track of the max versions and drop
232   // invalidations with old versions.
233   ObjectIdVersionMap max_invalidation_versions_;
234
235   DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceAndroid);
236 };
237
238 #endif  // CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_ANDROID_H_