Index: chrome/browser/supervised_user/child_accounts/child_account_service.cc |
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service.cc b/chrome/browser/supervised_user/child_accounts/child_account_service.cc |
index 1e906124a4b7ba4cd6950fc33d535a2f32049a8e..2245b7d456da8c71856e5383aa30c1f5be7a1f09 100644 |
--- a/chrome/browser/supervised_user/child_accounts/child_account_service.cc |
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service.cc |
@@ -26,6 +26,7 @@ |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/pref_names.h" |
+#include "components/pref_registry/pref_registry_syncable.h" |
#include "components/signin/core/browser/profile_oauth2_token_service.h" |
#include "components/signin/core/browser/signin_manager.h" |
@@ -75,6 +76,15 @@ ChildAccountService::ChildAccountService(Profile* profile) |
ChildAccountService::~ChildAccountService() {} |
+// static |
+void ChildAccountService::RegisterProfilePrefs( |
+ user_prefs::PrefRegistrySyncable* registry) { |
+ registry->RegisterBooleanPref( |
+ prefs::kChildAccountStatusKnown, |
+ false, |
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
+} |
+ |
void ChildAccountService::SetIsChildAccount(bool is_child_account) { |
PropagateChildStatusToUser(is_child_account); |
if (profile_->IsChild() == is_child_account) |
@@ -101,6 +111,10 @@ void ChildAccountService::Init() { |
StartFetchingServiceFlags(); |
} |
+bool ChildAccountService::IsChildAccountStatusKnown() { |
+ return profile_->GetPrefs()->GetBoolean(prefs::kChildAccountStatusKnown); |
+} |
+ |
void ChildAccountService::Shutdown() { |
family_fetcher_.reset(); |
CancelFetchingServiceFlags(); |
@@ -109,6 +123,15 @@ void ChildAccountService::Shutdown() { |
SigninManagerFactory::GetForProfile(profile_)->RemoveObserver(this); |
} |
+ |
+void ChildAccountService::AddChildStatusReceivedCallback( |
+ const base::Closure& callback) { |
+ if (IsChildAccountStatusKnown()) |
+ callback.Run(); |
+ else |
+ status_received_callback_list_.push_back(callback); |
+} |
+ |
bool ChildAccountService::SetActive(bool active) { |
if (!profile_->IsChild() && !active_) |
return false; |
@@ -295,6 +318,17 @@ void ChildAccountService::OnFlagsFetched( |
bool is_child_account = |
std::find(flags.begin(), flags.end(), |
kIsChildAccountServiceFlagName) != flags.end(); |
+ |
+ bool status_was_known = profile_->GetPrefs()->GetBoolean( |
+ prefs::kChildAccountStatusKnown); |
+ profile_->GetPrefs()->SetBoolean(prefs::kChildAccountStatusKnown, true); |
+ |
+ if (!status_was_known) { |
+ for (auto& callback : status_received_callback_list_) |
+ callback.Run(); |
+ status_received_callback_list_.clear(); |
+ } |
+ |
SetIsChildAccount(is_child_account); |
ScheduleNextStatusFlagUpdate( |