Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: chrome/browser/chromeos/arc/arc_android_management_checker.cc

Issue 2446563002: Refactor ArcAndroidManagementChecker. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/arc/arc_android_management_checker.h" 5 #include "chrome/browser/chromeos/arc/arc_android_management_checker.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h"
8 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/browser_process_platform_part.h" 11 #include "chrome/browser/browser_process_platform_part.h"
11 #include "chrome/browser/chromeos/arc/arc_android_management_checker_delegate.h" 12 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
12 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 13 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "components/policy/core/browser/browser_policy_connector.h"
13 #include "components/policy/core/common/cloud/device_management_service.h" 16 #include "components/policy/core/common/cloud/device_management_service.h"
14 #include "components/signin/core/browser/profile_oauth2_token_service.h" 17 #include "components/signin/core/browser/profile_oauth2_token_service.h"
15 18
16 namespace arc { 19 namespace arc {
17 20
18 namespace { 21 namespace {
19 22
20 constexpr int kRetryTimeMinMs = 10 * 1000; // 10 sec. 23 constexpr int kRetryTimeMinMs = 10 * 1000; // 10 sec.
Luis Héctor Chávez 2016/10/24 22:39:56 nit: constexpr base::TimeDelta kRetryTimeMin = ba
hidehiko 2016/10/25 07:22:42 Addressed in https://codereview.chromium.org/24506
21 constexpr int kRetryTimeMaxMs = 1 * 60 * 60 * 1000; // 1 hour. 24 constexpr int kRetryTimeMaxMs = 1 * 60 * 60 * 1000; // 1 hour.
22 25
23 policy::DeviceManagementService* GetDeviceManagementService() { 26 policy::DeviceManagementService* GetDeviceManagementService() {
24 policy::BrowserPolicyConnectorChromeOS* const connector = 27 policy::BrowserPolicyConnectorChromeOS* const connector =
25 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 28 g_browser_process->platform_part()->browser_policy_connector_chromeos();
26 return connector->device_management_service(); 29 return connector->device_management_service();
27 } 30 }
28 31
29 } // namespace 32 } // namespace
30 33
31 ArcAndroidManagementChecker::ArcAndroidManagementChecker( 34 ArcAndroidManagementChecker::ArcAndroidManagementChecker(
32 ArcAndroidManagementCheckerDelegate* delegate, 35 Profile* profile,
33 ProfileOAuth2TokenService* token_service, 36 ProfileOAuth2TokenService* token_service,
34 const std::string& account_id, 37 const std::string& account_id,
35 bool background_mode) 38 bool retry_on_error)
36 : delegate_(delegate), 39 : profile_(profile),
37 token_service_(token_service), 40 token_service_(token_service),
38 account_id_(account_id), 41 account_id_(account_id),
39 background_mode_(background_mode), 42 retry_on_error_(retry_on_error),
40 retry_time_ms_(kRetryTimeMinMs), 43 retry_time_ms_(kRetryTimeMinMs),
41 android_management_client_(GetDeviceManagementService(), 44 android_management_client_(GetDeviceManagementService(),
42 g_browser_process->system_request_context(), 45 g_browser_process->system_request_context(),
43 account_id, 46 account_id,
44 token_service), 47 token_service),
45 weak_ptr_factory_(this) { 48 weak_ptr_factory_(this) {}
46 if (token_service_->RefreshTokenIsAvailable(account_id_)) {
47 StartCheck();
48 } else {
49 DCHECK(background_mode_);
50 token_service_->AddObserver(this);
51 }
52 }
53 49
54 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() { 50 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() {
55 token_service_->RemoveObserver(this); 51 token_service_->RemoveObserver(this);
56 } 52 }
57 53
58 // static 54 // static
59 void ArcAndroidManagementChecker::StartClient() { 55 void ArcAndroidManagementChecker::StartClient() {
60 GetDeviceManagementService()->ScheduleInitialization(0); 56 GetDeviceManagementService()->ScheduleInitialization(0);
61 } 57 }
62 58
59 void ArcAndroidManagementChecker::StartCheck(const CheckCallback& callback) {
60 DCHECK(callback_.is_null());
61
62 // Do not send requests for Chrome OS managed users, nor for well-known
63 // consumer domains.
64 if (policy_util::IsAccountManaged(profile_) ||
65 policy::BrowserPolicyConnector::IsNonEnterpriseUser(
66 profile_->GetProfileUserName())) {
67 callback.Run(policy::AndroidManagementClient::Result::RESULT_UNMANAGED);
68 return;
69 }
70
71 callback_ = callback;
72 EnsureRefreshTokenLoaded();
73 }
74
75 void ArcAndroidManagementChecker::EnsureRefreshTokenLoaded() {
76 if (token_service_->RefreshTokenIsAvailable(account_id_)) {
77 // If the refresh token is already available, just start the management
78 // check immediately.
79 StartCheckInternal();
80 return;
81 }
82
83 // Set the observer to the token service so the callback will be called
84 // when the token is loaded.
85 token_service_->AddObserver(this);
86 }
87
63 void ArcAndroidManagementChecker::OnRefreshTokenAvailable( 88 void ArcAndroidManagementChecker::OnRefreshTokenAvailable(
64 const std::string& account_id) { 89 const std::string& account_id) {
65 if (account_id != account_id_) 90 if (account_id != account_id_)
66 return; 91 return;
67 OnRefreshTokensLoaded(); 92 OnRefreshTokensLoaded();
68 } 93 }
69 94
70 void ArcAndroidManagementChecker::OnRefreshTokensLoaded() { 95 void ArcAndroidManagementChecker::OnRefreshTokensLoaded() {
71 token_service_->RemoveObserver(this); 96 token_service_->RemoveObserver(this);
72 StartCheck(); 97 StartCheckInternal();
73 } 98 }
74 99
75 void ArcAndroidManagementChecker::StartCheck() { 100 void ArcAndroidManagementChecker::StartCheckInternal() {
Luis Héctor Chávez 2016/10/24 22:36:02 DCHECK(!callback_.is_null()); ?
hidehiko 2016/10/25 07:22:42 Done.
76 if (!token_service_->RefreshTokenIsAvailable(account_id_)) { 101 if (!token_service_->RefreshTokenIsAvailable(account_id_)) {
77 VLOG(2) << "No refresh token is available for android management check."; 102 VLOG(2) << "No refresh token is available for android management check.";
78 OnAndroidManagementChecked( 103 base::ResetAndReturn(&callback_)
79 policy::AndroidManagementClient::Result::RESULT_ERROR); 104 .Run(policy::AndroidManagementClient::Result::RESULT_ERROR);
80 return; 105 return;
81 } 106 }
82 107
83 VLOG(2) << "Start android management check."; 108 VLOG(2) << "Start android management check.";
84 android_management_client_.StartCheckAndroidManagement( 109 android_management_client_.StartCheckAndroidManagement(
85 base::Bind(&ArcAndroidManagementChecker::OnAndroidManagementChecked, 110 base::Bind(&ArcAndroidManagementChecker::OnAndroidManagementChecked,
86 weak_ptr_factory_.GetWeakPtr())); 111 weak_ptr_factory_.GetWeakPtr()));
87 } 112 }
88 113
89 void ArcAndroidManagementChecker::ScheduleCheck() {
90 DCHECK(background_mode_);
91
92 VLOG(2) << "Schedule next android management check in " << retry_time_ms_
93 << " ms.";
94
95 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
96 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::StartCheck,
97 weak_ptr_factory_.GetWeakPtr()),
98 base::TimeDelta::FromMilliseconds(retry_time_ms_));
99 retry_time_ms_ *= 2;
100 if (retry_time_ms_ > kRetryTimeMaxMs)
101 retry_time_ms_ = kRetryTimeMaxMs;
102 }
103
104 void ArcAndroidManagementChecker::DispatchResult(
105 policy::AndroidManagementClient::Result result) {
106 DCHECK(delegate_);
107 delegate_->OnAndroidManagementChecked(result);
108 }
109
110 void ArcAndroidManagementChecker::OnAndroidManagementChecked( 114 void ArcAndroidManagementChecker::OnAndroidManagementChecked(
111 policy::AndroidManagementClient::Result result) { 115 policy::AndroidManagementClient::Result result) {
Luis Héctor Chávez 2016/10/24 22:36:02 DCHECK(!callback_.is_null()); ?
hidehiko 2016/10/25 07:22:42 Done.
112 VLOG(2) << "Android management check done " << result << "."; 116 VLOG(2) << "Android management check done " << result << ".";
113 if (background_mode_ && 117 if (retry_on_error_ &&
114 result == policy::AndroidManagementClient::Result::RESULT_ERROR) { 118 result == policy::AndroidManagementClient::Result::RESULT_ERROR) {
115 ScheduleCheck(); 119 ScheduleRetry();
116 return; 120 return;
117 } 121 }
118 122
119 base::ThreadTaskRunnerHandle::Get()->PostTask( 123 base::ResetAndReturn(&callback_).Run(result);
120 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::DispatchResult, 124 }
121 weak_ptr_factory_.GetWeakPtr(), result)); 125
126 void ArcAndroidManagementChecker::ScheduleRetry() {
127 DCHECK(retry_on_error_);
128 VLOG(2) << "Schedule next android management check in " << retry_time_ms_
129 << " ms.";
130
131 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
132 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::StartCheckInternal,
133 weak_ptr_factory_.GetWeakPtr()),
134 base::TimeDelta::FromMilliseconds(retry_time_ms_));
135 retry_time_ms_ = std::min(retry_time_ms_ * 2, kRetryTimeMaxMs);
122 } 136 }
123 137
124 } // namespace arc 138 } // namespace arc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698