blob: 18f9760cc2a03142daa530f00ff894da6ab1f947 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <iterator>
#include <string>
#include <vector>
#include "base/android/jni_array.h"
#include "base/stl_util.h"
#include "chrome/browser/android/chrome_backup_agent.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/sync/base/pref_names.h"
#include "jni/ChromeBackupAgent_jni.h"
namespace {
const char* backed_up_preferences_[] = {
prefs::kDataSaverEnabled,
syncer::prefs::kSyncFirstSetupComplete,
syncer::prefs::kSyncKeepEverythingSynced,
syncer::prefs::kSyncAutofillProfile,
syncer::prefs::kSyncAutofillWallet,
syncer::prefs::kSyncAutofillWalletMetadata,
syncer::prefs::kSyncAutofill,
syncer::prefs::kSyncBookmarks,
syncer::prefs::kSyncDeviceInfo,
syncer::prefs::kSyncFaviconImages,
syncer::prefs::kSyncFaviconTracking,
syncer::prefs::kSyncHistoryDeleteDirectives,
syncer::prefs::kSyncPasswords,
syncer::prefs::kSyncPreferences,
syncer::prefs::kSyncPriorityPreferences,
syncer::prefs::kSyncSessions,
syncer::prefs::kSyncSupervisedUserSettings,
syncer::prefs::kSyncSupervisedUserSharedSettings,
syncer::prefs::kSyncSupervisedUserWhitelists,
syncer::prefs::kSyncTabs,
syncer::prefs::kSyncTypedUrls,
syncer::prefs::kSyncSuppressStart,
};
} // namespace
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_ChromeBackupAgent_GetBoolBackupNames(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller) {
return base::android::ToJavaArrayOfStrings(env,
android::GetBackupPrefNames());
}
static base::android::ScopedJavaLocalRef<jbooleanArray>
JNI_ChromeBackupAgent_GetBoolBackupValues(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller) {
PrefService* prefs = ProfileManager::GetLastUsedProfile()->GetPrefs();
constexpr int pref_count = base::size(backed_up_preferences_);
jboolean values[pref_count];
for (int i = 0; i < pref_count; i++) {
values[i] = prefs->GetBoolean(backed_up_preferences_[i]);
}
jbooleanArray array = env->NewBooleanArray(pref_count);
env->SetBooleanArrayRegion(array, 0, pref_count, values);
return base::android::ScopedJavaLocalRef<jbooleanArray>(env, array);
}
static void JNI_ChromeBackupAgent_SetBoolBackupPrefs(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jobjectArray>& names,
const base::android::JavaParamRef<jbooleanArray>& values) {
std::vector<std::string> pref_names;
base::android::AppendJavaStringArrayToStringVector(env, names, &pref_names);
std::vector<bool> pref_values;
JavaBooleanArrayToBoolVector(env, values, &pref_values);
std::unordered_set<std::string> valid_prefs(
std::begin(backed_up_preferences_), std::end(backed_up_preferences_));
PrefService* prefs = ProfileManager::GetLastUsedProfile()->GetPrefs();
for (unsigned int i = 0; i < pref_names.size(); i++) {
if (valid_prefs.count(pref_names[i])) {
prefs->SetBoolean(pref_names[i], pref_values[i]);
}
}
prefs->CommitPendingWrite();
}
namespace android {
std::vector<std::string> GetBackupPrefNames() {
return std::vector<std::string>(std::begin(backed_up_preferences_),
std::end(backed_up_preferences_));
}
base::android::ScopedJavaLocalRef<jobjectArray> GetBoolBackupNamesForTesting(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller) {
return JNI_ChromeBackupAgent_GetBoolBackupNames(env, jcaller);
}
base::android::ScopedJavaLocalRef<jbooleanArray> GetBoolBackupValuesForTesting(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller) {
return JNI_ChromeBackupAgent_GetBoolBackupValues(env, jcaller);
}
void SetBoolBackupPrefsForTesting(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jobjectArray>& names,
const base::android::JavaParamRef<jbooleanArray>& values) {
JNI_ChromeBackupAgent_SetBoolBackupPrefs(env, jcaller, names, values);
}
} // namespace android