Index: chrome/browser/chromeos/arc/arc_auth_service.cc |
diff --git a/chrome/browser/chromeos/arc/arc_auth_service.cc b/chrome/browser/chromeos/arc/arc_auth_service.cc |
index 46a2cea720f2f280f36d5bb591665d685f3cd213..4638797e1a02b24f65153dcc10413027534e7856 100644 |
--- a/chrome/browser/chromeos/arc/arc_auth_service.cc |
+++ b/chrome/browser/chromeos/arc/arc_auth_service.cc |
@@ -6,15 +6,53 @@ |
#include <utility> |
+#include "chrome/browser/chromeos/arc/arc_auth_ui.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "components/arc/arc_bridge_service.h" |
+ |
namespace arc { |
+namespace { |
+ |
+// Weak pointer. This class is owned by ArcServiceManager. |
+ArcAuthService* arc_auth_service = nullptr; |
+ |
+// Skip creating UI in unit tests |
+bool disable_ui_for_testing = false; |
+ |
+const char kStateDisable[] = "DISABLE"; |
+const char kStateFetchingCode[] = "FETCHING_CODE"; |
+const char kStateNoCode[] = "NO_CODE"; |
+const char kStateEnable[] = "ENABLE"; |
+ |
+} // namespace |
+ |
ArcAuthService::ArcAuthService(ArcBridgeService* bridge_service) |
: ArcService(bridge_service), binding_(this) { |
+ DCHECK(!arc_auth_service); |
+ arc_auth_service = this; |
+ |
arc_bridge_service()->AddObserver(this); |
} |
ArcAuthService::~ArcAuthService() { |
arc_bridge_service()->RemoveObserver(this); |
+ CloseUI(); |
+ |
+ DCHECK(arc_auth_service == this); |
+ arc_auth_service = nullptr; |
+} |
+ |
+// static |
+ArcAuthService* ArcAuthService::Get() { |
+ DCHECK(arc_auth_service); |
+ DCHECK(arc_auth_service->thread_checker_.CalledOnValidThread()); |
+ return arc_auth_service; |
+} |
+ |
+// static |
+void ArcAuthService::DisableUIForTesting() { |
+ disable_ui_for_testing = true; |
} |
void ArcAuthService::OnAuthInstanceReady() { |
@@ -22,9 +60,126 @@ void ArcAuthService::OnAuthInstanceReady() { |
binding_.CreateInterfacePtrAndBind()); |
} |
+std::string ArcAuthService::GetAndResetAutoCode() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ std::string auth_code; |
+ auth_code_.swap(auth_code); |
+ return auth_code; |
+} |
+ |
void ArcAuthService::GetAuthCode(const GetAuthCodeCallback& callback) { |
- // TODO(victorhsieh): request auth code from LSO (crbug.com/571146). |
- callback.Run(mojo::String("fake auth code from ArcAuthService in Chrome")); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ callback.Run(mojo::String(GetAndResetAutoCode())); |
+} |
+ |
+void ArcAuthService::SetState(State state) { |
+ DCHECK_NE(state_, state); |
+ state_ = state; |
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnOptInChanged(state_)); |
+} |
+ |
+void ArcAuthService::OnPrimaryUserProfilePrepared(Profile* profile) { |
+ DCHECK(profile && profile != profile_); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ Shutdown(); |
+ |
+ profile_ = profile; |
+ |
+ // TODO(khmel). At this moment UI to handle ARC OptIn is not ready yet. Assume |
+ // we opted in by default. When UI is ready, this should be synced with |
+ // user's prefs. |
+ FetchAuthCode(); |
+} |
+ |
+void ArcAuthService::Shutdown() { |
+ profile_ = nullptr; |
+ ArcBridgeService::Get()->Shutdown(); |
+ if (state_ != State::DISABLE) { |
+ auth_fetcher_.reset(); |
+ SetState(State::DISABLE); |
+ } |
+} |
+ |
+void ArcAuthService::AddObserver(Observer* observer) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ observer_list_.AddObserver(observer); |
+} |
+ |
+void ArcAuthService::RemoveObserver(Observer* observer) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ observer_list_.RemoveObserver(observer); |
+} |
+ |
+void ArcAuthService::CloseUI() { |
+ if (auth_ui_) { |
+ auth_ui_->Close(); |
+ DCHECK(!auth_ui_); |
+ } |
+} |
+ |
+void ArcAuthService::SetAuthCodeAndStartArc(const std::string& auth_code) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(!auth_code.empty()); |
+ DCHECK_NE(state_, State::ENABLE); |
+ |
+ CloseUI(); |
+ auth_fetcher_.reset(); |
+ auth_code_ = auth_code; |
+ ArcBridgeService::Get()->HandleStartup(); |
+ |
+ SetState(State::ENABLE); |
+} |
+ |
+void ArcAuthService::FetchAuthCode() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK_EQ(state_, State::DISABLE); |
+ |
+ CloseUI(); |
+ auth_code_.clear(); |
+ |
+ SetState(State::FETCHING_CODE); |
+ |
+ auth_fetcher_.reset(new ArcAuthFetcher(profile_->GetRequestContext(), this)); |
+} |
+ |
+void ArcAuthService::OnAuthCodeFetched(const std::string& auth_code) { |
+ DCHECK_EQ(state_, State::FETCHING_CODE); |
+ SetAuthCodeAndStartArc(auth_code); |
+} |
+ |
+void ArcAuthService::OnAuthCodeNeedUI() { |
+ CloseUI(); |
+ if (!disable_ui_for_testing) |
+ auth_ui_ = new ArcAuthUI(profile_, this); |
+} |
+ |
+void ArcAuthService::OnAuthCodeFailed() { |
+ DCHECK_EQ(state_, State::FETCHING_CODE); |
+ CloseUI(); |
+ |
+ SetState(State::NO_CODE); |
+} |
+ |
+void ArcAuthService::OnAuthUIClosed() { |
+ DCHECK(auth_ui_); |
+ auth_ui_ = nullptr; |
+} |
+ |
+std::ostream& operator<<(std::ostream& os, const ArcAuthService::State& state) { |
+ switch (state) { |
+ case ArcAuthService::State::DISABLE: |
+ return os << kStateDisable; |
+ case ArcAuthService::State::FETCHING_CODE: |
+ return os << kStateFetchingCode; |
+ case ArcAuthService::State::NO_CODE: |
+ return os << kStateNoCode; |
+ case ArcAuthService::State::ENABLE: |
+ return os << kStateEnable; |
+ default: |
+ NOTREACHED(); |
+ return os; |
+ } |
} |
} // namespace arc |