Chromium Code Reviews| Index: chrome/browser/chromeos/policy/consumer_management_service.cc |
| diff --git a/chrome/browser/chromeos/policy/consumer_management_service.cc b/chrome/browser/chromeos/policy/consumer_management_service.cc |
| index ca29330adac27d2ea93594f5f36e84b767733485..bdcfe8aba0358cfd1f75f00fd0d6b010cc0e4353 100644 |
| --- a/chrome/browser/chromeos/policy/consumer_management_service.cc |
| +++ b/chrome/browser/chromeos/policy/consumer_management_service.cc |
| @@ -109,52 +109,111 @@ class DesktopNotificationDelegate : public NotificationDelegate { |
| DISALLOW_COPY_AND_ASSIGN(DesktopNotificationDelegate); |
| }; |
| +// The string of Status enum. |
| +const char* kStatusString[] = { |
| + "STATUS_UNKNOWN", |
| + "STATUS_ENROLLED", |
| + "STATUS_ENROLLING", |
| + "STATUS_UNENROLLED", |
| + "STATUS_UNENROLLING", |
| +}; |
| + |
| +COMPILE_ASSERT( |
| + arraysize(kStatusString) == policy::ConsumerManagementService::STATUS_LAST, |
| + "invalid kStatusString array size."); |
| + |
|
bartfab (slow)
2014/08/25 13:00:45
Nit: Remove extraneous blank line.
davidyu
2014/08/28 09:21:14
Done.
|
| + |
| } // namespace |
| +namespace em = enterprise_management; |
| + |
| namespace policy { |
| ConsumerManagementService::ConsumerManagementService( |
| - chromeos::CryptohomeClient* client) |
| + chromeos::CryptohomeClient* client, |
| + chromeos::DeviceSettingsService* device_settings_service) |
| : Consumer("consumer_management_service"), |
| client_(client), |
| + device_settings_service_(device_settings_service), |
| enrolling_profile_(NULL), |
| weak_ptr_factory_(this) { |
| registrar_.Add(this, |
| chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, |
| content::NotificationService::AllSources()); |
| + // A NULL value may be passed in tests. |
| + if (device_settings_service_) |
| + device_settings_service_->AddObserver(this); |
| } |
| ConsumerManagementService::~ConsumerManagementService() { |
| - registrar_.Remove(this, |
| - chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, |
| - content::NotificationService::AllSources()); |
| if (enrolling_profile_) { |
| ProfileOAuth2TokenServiceFactory::GetForProfile(enrolling_profile_)-> |
| RemoveObserver(this); |
| } |
| + if (device_settings_service_) |
| + device_settings_service_->RemoveObserver(this); |
| + registrar_.Remove(this, |
| + chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, |
| + content::NotificationService::AllSources()); |
| } |
| // static |
| void ConsumerManagementService::RegisterPrefs(PrefRegistrySimple* registry) { |
| registry->RegisterIntegerPref( |
| - prefs::kConsumerManagementEnrollmentState, ENROLLMENT_NONE); |
| + prefs::kConsumerManagementEnrollmentStage, ENROLLMENT_STAGE_NONE); |
| +} |
| + |
| +void ConsumerManagementService::AddObserver(Observer* observer) { |
| + observers_.AddObserver(observer); |
| +} |
| + |
| +void ConsumerManagementService::RemoveObserver(Observer* observer) { |
| + observers_.RemoveObserver(observer); |
| } |
| -ConsumerManagementService::ConsumerEnrollmentState |
| -ConsumerManagementService::GetEnrollmentState() const { |
| +ConsumerManagementService::Status |
| +ConsumerManagementService::GetStatus() const { |
| + if (!device_settings_service_) |
| + return STATUS_UNKNOWN; |
| + |
| + const enterprise_management::PolicyData* policy_data = |
| + device_settings_service_->policy_data(); |
| + if (!policy_data) |
| + return STATUS_UNKNOWN; |
| + |
| + if (policy_data->management_mode() == em::PolicyData::CONSUMER_MANAGED) { |
| + // TODO(davidyu): Check if unenrollment is in progress. |
| + // http://crbug.com/353050. |
| + return STATUS_ENROLLED; |
| + } |
| + |
| + EnrollmentStage stage = GetEnrollmentStage(); |
| + if (stage > ENROLLMENT_STAGE_NONE && stage < ENROLLMENT_STAGE_SUCCESS) |
| + return STATUS_ENROLLING; |
| + |
| + return STATUS_UNENROLLED; |
| +} |
| + |
| +std::string ConsumerManagementService::GetStatusString() const { |
| + return kStatusString[GetStatus()]; |
| +} |
| + |
| +ConsumerManagementService::EnrollmentStage |
| +ConsumerManagementService::GetEnrollmentStage() const { |
| const PrefService* prefs = g_browser_process->local_state(); |
| - int state = prefs->GetInteger(prefs::kConsumerManagementEnrollmentState); |
| - if (state < 0 || state >= ENROLLMENT_LAST) { |
| - LOG(ERROR) << "Unknown enrollment state: " << state; |
| - state = 0; |
| + int stage = prefs->GetInteger(prefs::kConsumerManagementEnrollmentStage); |
| + if (stage < 0 || stage >= ENROLLMENT_STAGE_LAST) { |
| + LOG(ERROR) << "Unknown enrollment stage: " << stage; |
| + stage = 0; |
| } |
| - return static_cast<ConsumerEnrollmentState>(state); |
| + return static_cast<EnrollmentStage>(stage); |
| } |
| -void ConsumerManagementService::SetEnrollmentState( |
| - ConsumerEnrollmentState state) { |
| +void ConsumerManagementService::SetEnrollmentStage(EnrollmentStage stage) { |
| PrefService* prefs = g_browser_process->local_state(); |
| - prefs->SetInteger(prefs::kConsumerManagementEnrollmentState, state); |
| + prefs->SetInteger(prefs::kConsumerManagementEnrollmentStage, stage); |
| + |
| + NotifyStatusChanged(); |
| } |
| void ConsumerManagementService::GetOwner(const GetOwnerCallback& callback) { |
| @@ -179,6 +238,13 @@ void ConsumerManagementService::SetOwner(const std::string& user_id, |
| callback)); |
| } |
| +void ConsumerManagementService::OwnershipStatusChanged() { |
| +} |
| + |
| +void ConsumerManagementService::DeviceSettingsUpdated() { |
| + NotifyStatusChanged(); |
| +} |
| + |
| void ConsumerManagementService::Observe( |
| int type, |
| const content::NotificationSource& source, |
| @@ -221,7 +287,7 @@ void ConsumerManagementService::OnGetTokenFailure( |
| base::MessageLoop::current()->DeleteSoon(FROM_HERE, token_request_.release()); |
| LOG(ERROR) << "Failed to get the access token: " << error.ToString(); |
| - EndEnrollment(ENROLLMENT_GET_TOKEN_FAILED); |
| + EndEnrollment(ENROLLMENT_STAGE_GET_TOKEN_FAILED); |
| } |
| void ConsumerManagementService::OnGetBootAttributeDone( |
| @@ -273,28 +339,28 @@ void ConsumerManagementService::OnFlushAndSignBootAttributesDone( |
| } |
| void ConsumerManagementService::OnOwnerSignin(Profile* profile) { |
| - const ConsumerEnrollmentState state = GetEnrollmentState(); |
| - switch (state) { |
| - case ENROLLMENT_NONE: |
| + const EnrollmentStage stage = GetEnrollmentStage(); |
| + switch (stage) { |
| + case ENROLLMENT_STAGE_NONE: |
| // Do nothing. |
| return; |
| - case ENROLLMENT_OWNER_STORED: |
| + case ENROLLMENT_STAGE_OWNER_STORED: |
| // Continue the enrollment process after the owner signs in. |
| ContinueEnrollmentProcess(profile); |
| return; |
| - case ENROLLMENT_SUCCESS: |
| - case ENROLLMENT_CANCELED: |
| - case ENROLLMENT_BOOT_LOCKBOX_FAILED: |
| - case ENROLLMENT_DM_SERVER_FAILED: |
| - case ENROLLMENT_GET_TOKEN_FAILED: |
| - ShowDesktopNotificationAndResetState(state, profile); |
| + case ENROLLMENT_STAGE_SUCCESS: |
| + case ENROLLMENT_STAGE_CANCELED: |
| + case ENROLLMENT_STAGE_BOOT_LOCKBOX_FAILED: |
| + case ENROLLMENT_STAGE_DM_SERVER_FAILED: |
| + case ENROLLMENT_STAGE_GET_TOKEN_FAILED: |
| + ShowDesktopNotificationAndResetStage(stage, profile); |
| return; |
| - case ENROLLMENT_REQUESTED: |
| - case ENROLLMENT_LAST: |
| - NOTREACHED() << "Unexpected enrollment state " << state; |
| + case ENROLLMENT_STAGE_REQUESTED: |
| + case ENROLLMENT_STAGE_LAST: |
| + NOTREACHED() << "Unexpected enrollment stage " << stage; |
| return; |
| } |
| } |
| @@ -356,30 +422,30 @@ void ConsumerManagementService::OnEnrollmentCompleted(EnrollmentStatus status) { |
| << " http_status=" << status.http_status() |
| << " store_status=" << status.store_status() |
| << " validation_status=" << status.validation_status(); |
| - EndEnrollment(ENROLLMENT_DM_SERVER_FAILED); |
| + EndEnrollment(ENROLLMENT_STAGE_DM_SERVER_FAILED); |
| return; |
| } |
| - EndEnrollment(ENROLLMENT_SUCCESS); |
| + EndEnrollment(ENROLLMENT_STAGE_SUCCESS); |
| } |
| -void ConsumerManagementService::EndEnrollment(ConsumerEnrollmentState state) { |
| +void ConsumerManagementService::EndEnrollment(EnrollmentStage stage) { |
| Profile* profile = enrolling_profile_; |
| enrolling_profile_ = NULL; |
| - SetEnrollmentState(state); |
| + SetEnrollmentStage(stage); |
| if (user_manager::UserManager::Get()->IsCurrentUserOwner()) |
| - ShowDesktopNotificationAndResetState(state, profile); |
| + ShowDesktopNotificationAndResetStage(stage, profile); |
| } |
| -void ConsumerManagementService::ShowDesktopNotificationAndResetState( |
| - ConsumerEnrollmentState state, Profile* profile) { |
| +void ConsumerManagementService::ShowDesktopNotificationAndResetStage( |
| + EnrollmentStage stage, Profile* profile) { |
| base::string16 title; |
| base::string16 body; |
| base::string16 button_label; |
| base::Closure button_click_callback; |
| - if (state == ENROLLMENT_SUCCESS) { |
| + if (stage == ENROLLMENT_STAGE_SUCCESS) { |
| title = l10n_util::GetStringUTF16( |
| IDS_CONSUMER_MANAGEMENT_ENROLLMENT_NOTIFICATION_TITLE); |
| body = l10n_util::GetStringUTF16( |
| @@ -423,7 +489,7 @@ void ConsumerManagementService::ShowDesktopNotificationAndResetState( |
| notification.SetSystemPriority(); |
| g_browser_process->notification_ui_manager()->Add(notification, profile); |
| - SetEnrollmentState(ENROLLMENT_NONE); |
| + SetEnrollmentStage(ENROLLMENT_STAGE_NONE); |
| } |
| void ConsumerManagementService::OpenSettingsPage(Profile* profile) const { |
| @@ -442,4 +508,8 @@ void ConsumerManagementService::TryEnrollmentAgain(Profile* profile) const { |
| chrome::Navigate(¶ms); |
| } |
| +void ConsumerManagementService::NotifyStatusChanged() { |
| + FOR_EACH_OBSERVER(Observer, observers_, OnConsumerManagementStatusChanged()); |
| +} |
| + |
| } // namespace policy |