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 a0c30ac724bbc2bcd38903d869b973eca26d8fb8..6af9dec3208716c71f35a812d8eca19218b69e68 100644 |
--- a/chrome/browser/supervised_user/child_accounts/child_account_service.cc |
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service.cc |
@@ -36,11 +36,12 @@ |
const char kIsChildAccountServiceFlagName[] = "uca"; |
-// Normally, re-check the child account flag once per day. |
-const int kStatusFlagUpdateIntervalSeconds = 60 * 60 * 24; |
+// Normally, re-check the child account flag and the family info once per day. |
+const int kUpdateIntervalSeconds = 60 * 60 * 24; |
-// In case of an error while getting the flag, retry with exponential backoff. |
-const net::BackoffEntry::Policy kFlagFetchBackoffPolicy = { |
+// In case of an error while getting the flag or the family info, retry with |
+// exponential backoff. |
+const net::BackoffEntry::Policy kBackoffPolicy = { |
// Number of initial errors (in sequence) to ignore before applying |
// exponential back-off rules. |
0, |
@@ -68,7 +69,8 @@ const net::BackoffEntry::Policy kFlagFetchBackoffPolicy = { |
ChildAccountService::ChildAccountService(Profile* profile) |
: profile_(profile), active_(false), |
- flag_fetch_backoff_(&kFlagFetchBackoffPolicy), |
+ flag_fetch_backoff_(&kBackoffPolicy), |
+ family_fetch_backoff_(&kBackoffPolicy), |
weak_ptr_factory_(this) {} |
ChildAccountService::~ChildAccountService() {} |
@@ -128,16 +130,9 @@ bool ChildAccountService::SetActive(bool active) { |
SigninManagerFactory::GetForProfile(profile_)->ProhibitSignout(true); |
#endif |
- // TODO(treib): Maybe only fetch the parents on the first start, and then |
- // refresh occasionally (like once every 24h)? That's what |
- // GAIAInfoUpdateService does. |
- family_fetcher_.reset(new FamilyInfoFetcher( |
- this, |
- SigninManagerFactory::GetForProfile(profile_) |
- ->GetAuthenticatedAccountId(), |
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_), |
- profile_->GetRequestContext())); |
- family_fetcher_->StartGetFamilyMembers(); |
+ // TODO(treib): Maybe store the last update time in a pref, so we don't |
Marc Treib
2015/01/26 13:19:31
WDYT?
Bernhard Bauer
2015/01/26 13:41:23
That seems like a good idea. We could check at eve
|
+ // have to re-fetch on every start. |
+ StartFetchingFamilyInfo(); |
SupervisedUserService* service = |
SupervisedUserServiceFactory::GetForProfile(profile_); |
@@ -205,6 +200,7 @@ void ChildAccountService::GoogleSignedOut(const std::string& account_id, |
const std::string& username) { |
DCHECK(!profile_->IsChild()); |
CancelFetchingServiceFlags(); |
+ CancelFetchingFamilyInfo(); |
} |
void ChildAccountService::OnGetFamilyMembersSuccess( |
@@ -229,12 +225,37 @@ void ChildAccountService::OnGetFamilyMembersSuccess( |
if (!parent_found) |
ClearSecondCustodianPrefs(); |
family_fetcher_.reset(); |
+ |
+ family_fetch_backoff_.InformOfRequest(true); |
+ |
+ ScheduleNextFamilyInfoUpdate( |
+ base::TimeDelta::FromSeconds(kUpdateIntervalSeconds)); |
} |
void ChildAccountService::OnFailure(FamilyInfoFetcher::ErrorCode error) { |
DLOG(WARNING) << "GetFamilyMembers failed with code " << error; |
+ family_fetch_backoff_.InformOfRequest(false); |
+ ScheduleNextFamilyInfoUpdate(family_fetch_backoff_.GetTimeUntilRelease()); |
+} |
+ |
+void ChildAccountService::StartFetchingFamilyInfo() { |
+ family_fetcher_.reset(new FamilyInfoFetcher( |
+ this, |
+ SigninManagerFactory::GetForProfile(profile_) |
+ ->GetAuthenticatedAccountId(), |
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile_), |
+ profile_->GetRequestContext())); |
+ family_fetcher_->StartGetFamilyMembers(); |
+} |
+ |
+void ChildAccountService::CancelFetchingFamilyInfo() { |
family_fetcher_.reset(); |
- // TODO(treib): Retry after a while? |
+ family_fetch_timer_.Stop(); |
+} |
+ |
+void ChildAccountService::ScheduleNextFamilyInfoUpdate(base::TimeDelta delay) { |
+ family_fetch_timer_.Start( |
+ FROM_HERE, delay, this, &ChildAccountService::StartFetchingFamilyInfo); |
} |
void ChildAccountService::StartFetchingServiceFlags() { |
@@ -282,8 +303,8 @@ void ChildAccountService::OnFlagsFetched( |
kIsChildAccountServiceFlagName) != flags.end(); |
SetIsChildAccount(is_child_account); |
- ScheduleNextStatusFlagUpdate(base::TimeDelta::FromSeconds( |
- kStatusFlagUpdateIntervalSeconds)); |
+ ScheduleNextStatusFlagUpdate( |
+ base::TimeDelta::FromSeconds(kUpdateIntervalSeconds)); |
} |
void ChildAccountService::ScheduleNextStatusFlagUpdate(base::TimeDelta delay) { |