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