blob: 03e33249e9f8cf9a0ebad9b3b7b7be1ef49cf196 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/accessibility/accessibility_sync_prefs_utils.h"
#include <limits>
#include <utility>
#include "ash/constants/ash_constants.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "base/feature_list.h"
#include "components/live_caption/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "ui/base/cursor/cursor.h"
namespace ash {
//
// TODO(crbug.com/479890756): For each function below, once respective feature
// flag is enabled by default, stabilized and removed:
//
// 1/ the registration of preferences whose
// AccessibilityPrefBatchEntry::conflict_resolution_policy is set to `kNone`
// should be moved back to Accessibility::RegisterProfilePrefs(), and not be
// listed with AccessibilityPrefBatchEntry anymore.
//
// 2/ After /1/, the getter function will only list preferences that
// require a conflict resolution policy. The name of the
// function should be changed reflect it, eg
// GetSyncableAccessibilityPrefsWithConflictResolutionPolicy().
//
// 3/ Eventually, all the 3 feature flags will be enabled and stable, and the
// functions below will be combined into one.
std::vector<AccessibilityPrefBatchEntry> GetSyncableAccessibilityPrefsBatch1() {
const uint32_t registration_flags =
base::FeatureList::IsEnabled(features::kOsSyncAccessibilitySettingsBatch1)
? user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF
: 0;
std::vector<AccessibilityPrefBatchEntry> v;
// Color correction.
v.emplace_back(prefs::kAccessibilityColorCorrectionEnabled,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
v.emplace_back(prefs::kAccessibilityColorCorrectionHasBeenSetup,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
// Cursor highlight.
v.emplace_back(prefs::kAccessibilityCursorHighlightEnabled,
base::Value(false), ConflictResolutionPolicy::kDialogNeeded,
registration_flags);
// Cursor color.
v.emplace_back(prefs::kAccessibilityCursorColorEnabled, base::Value(false),
ConflictResolutionPolicy::kNone, registration_flags);
// Cursor colors are stored as RGB, not ARGB.
v.emplace_back(
prefs::kAccessibilityCursorColor,
base::Value(static_cast<int>(ui::kDefaultCursorColor & 0x00FFFFFF)),
ConflictResolutionPolicy::kNone, registration_flags);
// Large cursor.
v.emplace_back(prefs::kAccessibilityLargeCursorEnabled, base::Value(false),
ConflictResolutionPolicy::kDialogNeeded, registration_flags);
v.emplace_back(prefs::kAccessibilityLargeCursorDipSize,
base::Value(ui::kDefaultLargeCursorSize),
ConflictResolutionPolicy::kNone, registration_flags);
// High contrast.
v.emplace_back(prefs::kAccessibilityHighContrastEnabled, base::Value(false),
ConflictResolutionPolicy::kDialogNeeded, registration_flags);
v.emplace_back(prefs::kHighContrastAcceleratorDialogHasBeenAccepted,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
// Caret highlight.
v.emplace_back(prefs::kAccessibilityCaretHighlightEnabled, base::Value(false),
ConflictResolutionPolicy::kDialogNeeded, registration_flags);
v.emplace_back(prefs::kAccessibilityCaretBlinkInterval,
base::Value(kDefaultCaretBlinkIntervalMs),
ConflictResolutionPolicy::kNone, registration_flags);
// Focus highlight.
v.emplace_back(prefs::kAccessibilityFocusHighlightEnabled, base::Value(false),
ConflictResolutionPolicy::kDialogNeeded, registration_flags);
return v;
}
std::vector<AccessibilityPrefBatchEntry> GetSyncableAccessibilityPrefsBatch2() {
const uint32_t registration_flags =
base::FeatureList::IsEnabled(features::kOsSyncAccessibilitySettingsBatch2)
? user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF
: 0;
std::vector<AccessibilityPrefBatchEntry> v;
// Reduced animations.
v.emplace_back(prefs::kAccessibilityReducedAnimationsEnabled,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
// Captions (custom registration).
v.emplace_back(::prefs::kAccessibilityCaptionsTextSize,
base::Value(std::string()), ConflictResolutionPolicy::kNone,
registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(::prefs::kAccessibilityCaptionsTextFont,
base::Value(std::string()), ConflictResolutionPolicy::kNone,
registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(::prefs::kAccessibilityCaptionsTextColor,
base::Value(std::string()), ConflictResolutionPolicy::kNone,
registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(::prefs::kAccessibilityCaptionsTextOpacity, base::Value(100),
ConflictResolutionPolicy::kNone, registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(::prefs::kAccessibilityCaptionsBackgroundOpacity,
base::Value(100), ConflictResolutionPolicy::kNone,
registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(::prefs::kAccessibilityCaptionsBackgroundColor,
base::Value(std::string()), ConflictResolutionPolicy::kNone,
registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(::prefs::kAccessibilityCaptionsTextShadow,
base::Value(std::string()), ConflictResolutionPolicy::kNone,
registration_flags,
/*has_custom_registration=*/true);
return v;
}
std::vector<AccessibilityPrefBatchEntry> GetSyncableAccessibilityPrefsBatch3() {
const uint32_t registration_flags =
base::FeatureList::IsEnabled(features::kOsSyncAccessibilitySettingsBatch3)
? user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF
: 0;
std::vector<AccessibilityPrefBatchEntry> v;
// Screen magnifier.
v.emplace_back(prefs::kAccessibilityScreenMagnifierEnabled,
base::Value(false), ConflictResolutionPolicy::kDialogNeeded,
registration_flags);
v.emplace_back(prefs::kAccessibilityScreenMagnifierScale,
base::Value(std::numeric_limits<double>::min()),
ConflictResolutionPolicy::kLocalClobberRemote,
registration_flags);
v.emplace_back(prefs::kScreenMagnifierAcceleratorDialogHasBeenAccepted,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
// Select to speak.
v.emplace_back(prefs::kAccessibilitySelectToSpeakEnabled, base::Value(false),
ConflictResolutionPolicy::kDialogNeeded, registration_flags);
v.emplace_back(prefs::kSelectToSpeakAcceleratorDialogHasBeenAccepted,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
// Docked magnifier (custom registration).
v.emplace_back(prefs::kDockedMagnifierEnabled, base::Value(false),
ConflictResolutionPolicy::kDialogNeeded, registration_flags,
/*has_custom_registration=*/true);
constexpr float kDefaultMagnifierScale = 4.0f;
v.emplace_back(
prefs::kDockedMagnifierScale, base::Value(kDefaultMagnifierScale),
ConflictResolutionPolicy::kLocalClobberRemote, registration_flags,
/*has_custom_registration=*/true);
v.emplace_back(prefs::kDockedMagnifierAcceleratorDialogHasBeenAccepted,
base::Value(false), ConflictResolutionPolicy::kNone,
registration_flags);
return v;
}
std::vector<AccessibilityPrefBatchEntry>
GetAccessibilityPrefBatchesWithSyncEnabled() {
std::vector<AccessibilityPrefBatchEntry> prefs;
if (base::FeatureList::IsEnabled(
features::kOsSyncAccessibilitySettingsBatch1)) {
auto batch = GetSyncableAccessibilityPrefsBatch1();
std::move(batch.begin(), batch.end(), std::back_inserter(prefs));
}
if (base::FeatureList::IsEnabled(
features::kOsSyncAccessibilitySettingsBatch2)) {
auto batch = GetSyncableAccessibilityPrefsBatch2();
std::move(batch.begin(), batch.end(), std::back_inserter(prefs));
}
if (base::FeatureList::IsEnabled(
features::kOsSyncAccessibilitySettingsBatch3)) {
auto batch = GetSyncableAccessibilityPrefsBatch3();
std::move(batch.begin(), batch.end(), std::back_inserter(prefs));
}
return prefs;
}
} // namespace ash