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

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc

Issue 2849833002: cros: Add UMA metrics in encryption migration UI. (Closed)
Patch Set: Address review comments. Created 3 years, 7 months 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/ui/webui/chromeos/login/encryption_migration_screen_han dler.h" 5 #include "chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_han dler.h"
6 6
7 #include <cmath>
7 #include <string> 8 #include <string>
8 #include <utility> 9 #include <utility>
9 10
10 #include "ash/system/devicetype_utils.h" 11 #include "ash/system/devicetype_utils.h"
11 #include "base/command_line.h" 12 #include "base/command_line.h"
12 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/metrics/histogram_macros.h"
13 #include "base/sys_info.h" 15 #include "base/sys_info.h"
14 #include "base/task_scheduler/post_task.h" 16 #include "base/task_scheduler/post_task.h"
15 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/lifetime/application_lifetime.h" 18 #include "chrome/browser/lifetime/application_lifetime.h"
17 #include "chrome/grit/generated_resources.h" 19 #include "chrome/grit/generated_resources.h"
18 #include "chromeos/chromeos_switches.h" 20 #include "chromeos/chromeos_switches.h"
19 #include "chromeos/cryptohome/async_method_caller.h" 21 #include "chromeos/cryptohome/async_method_caller.h"
20 #include "chromeos/cryptohome/homedir_methods.h" 22 #include "chromeos/cryptohome/homedir_methods.h"
21 #include "chromeos/dbus/cryptohome_client.h" 23 #include "chromeos/dbus/cryptohome_client.h"
22 #include "chromeos/dbus/dbus_thread_manager.h" 24 #include "chromeos/dbus/dbus_thread_manager.h"
(...skipping 16 matching lines...) Expand all
39 constexpr int64_t kMinimumAvailableStorage = 10LL * 1024 * 1024; // 10MB 41 constexpr int64_t kMinimumAvailableStorage = 10LL * 1024 * 1024; // 10MB
40 42
41 // The minimum battery level to start the migration. 43 // The minimum battery level to start the migration.
42 constexpr double kMinimumBatteryPercent = 30; 44 constexpr double kMinimumBatteryPercent = 30;
43 45
44 // JS API callbacks names. 46 // JS API callbacks names.
45 constexpr char kJsApiStartMigration[] = "startMigration"; 47 constexpr char kJsApiStartMigration[] = "startMigration";
46 constexpr char kJsApiSkipMigration[] = "skipMigration"; 48 constexpr char kJsApiSkipMigration[] = "skipMigration";
47 constexpr char kJsApiRequestRestart[] = "requestRestart"; 49 constexpr char kJsApiRequestRestart[] = "requestRestart";
48 50
51 // UMA names.
52 constexpr char kUmaNameFirstScreen[] = "Cryptohome.MigrationUI.FirstScreen";
53 constexpr char kUmaNameUserChoice[] = "Cryptohome.MigrationUI.UserChoice";
54 constexpr char kUmaNameConsumedBatteryPercent[] =
55 "Cryptohome.MigrationUI.ConsumedBatteryPercent";
56
57 // This enum must match the numbering for Cryptohome.MigrationUI.FirstScreen in
58 // histograms.xml. Do not reorder or remove items, only add new items before
59 // FIRST_SCREEN_MAX.
60 enum class FirstScreen {
61 FIRST_SCREEN_READY = 0,
62 FIRST_SCREEN_RESUME = 1,
63 FIRST_SCREEN_LOW_STORAGE = 2,
64 FIRST_SCREEN_COUNT
65 };
66
67 // This enum must match the numbering for Cryptohome.MigrationUI.UserChoice in
68 // histograms.xml. Do not reorder or remove items, only add new items before
69 // FIRST_SCREEN_MAX.
70 enum class UserChoice {
71 USER_CHOICE_UPDATE = 0,
72 USER_CHOICE_SKIP = 1,
73 USER_CHOICE_COUNT
74 };
75
49 bool IsTestingUI() { 76 bool IsTestingUI() {
50 return base::CommandLine::ForCurrentProcess()->HasSwitch( 77 return base::CommandLine::ForCurrentProcess()->HasSwitch(
51 chromeos::switches::kTestEncryptionMigrationUI); 78 chromeos::switches::kTestEncryptionMigrationUI);
52 } 79 }
53 80
81 // Wrapper functions for histogram macros to avoid duplication of expanded code.
82 void RecordFirstScreen(FirstScreen first_screen) {
83 UMA_HISTOGRAM_ENUMERATION(kUmaNameFirstScreen, static_cast<int>(first_screen),
84 static_cast<int>(FirstScreen::FIRST_SCREEN_COUNT));
85 }
86
87 void RecordUserChoice(UserChoice user_choice) {
88 UMA_HISTOGRAM_ENUMERATION(kUmaNameUserChoice, static_cast<int>(user_choice),
89 static_cast<int>(UserChoice::USER_CHOICE_COUNT));
Ilya Sherman 2017/05/01 18:02:10 nit: FYI, static_casts are no longer needed for th
fukino 2017/05/02 04:27:34 Oh, I did not know it. Thanks! I'll update it in a
90 }
91
54 } // namespace 92 } // namespace
55 93
56 namespace chromeos { 94 namespace chromeos {
57 95
58 EncryptionMigrationScreenHandler::EncryptionMigrationScreenHandler() 96 EncryptionMigrationScreenHandler::EncryptionMigrationScreenHandler()
59 : BaseScreenHandler(kScreenId), weak_ptr_factory_(this) { 97 : BaseScreenHandler(kScreenId), weak_ptr_factory_(this) {
60 set_call_js_prefix(kJsScreenPath); 98 set_call_js_prefix(kJsScreenPath);
61 } 99 }
62 100
63 EncryptionMigrationScreenHandler::~EncryptionMigrationScreenHandler() { 101 EncryptionMigrationScreenHandler::~EncryptionMigrationScreenHandler() {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 // If the migration was already requested and the bettery level is enough now, 218 // If the migration was already requested and the bettery level is enough now,
181 // The migration should start immediately. 219 // The migration should start immediately.
182 if (current_battery_percent_ >= kMinimumBatteryPercent && 220 if (current_battery_percent_ >= kMinimumBatteryPercent &&
183 should_migrate_on_enough_battery_) { 221 should_migrate_on_enough_battery_) {
184 should_migrate_on_enough_battery_ = false; 222 should_migrate_on_enough_battery_ = false;
185 StartMigration(); 223 StartMigration();
186 } 224 }
187 } 225 }
188 226
189 void EncryptionMigrationScreenHandler::HandleStartMigration() { 227 void EncryptionMigrationScreenHandler::HandleStartMigration() {
228 RecordUserChoice(UserChoice::USER_CHOICE_UPDATE);
190 WaitBatteryAndMigrate(); 229 WaitBatteryAndMigrate();
191 } 230 }
192 231
193 void EncryptionMigrationScreenHandler::HandleSkipMigration() { 232 void EncryptionMigrationScreenHandler::HandleSkipMigration() {
233 RecordUserChoice(UserChoice::USER_CHOICE_SKIP);
194 // If the user skips migration, we mount the cryptohome without performing the 234 // If the user skips migration, we mount the cryptohome without performing the
195 // migration by reusing UserContext and LoginPerformer which were used in the 235 // migration by reusing UserContext and LoginPerformer which were used in the
196 // previous attempt and dropping |is_forcing_dircrypto| flag in UserContext. 236 // previous attempt and dropping |is_forcing_dircrypto| flag in UserContext.
197 // In this case, the user can not launch ARC apps in the session, and will be 237 // In this case, the user can not launch ARC apps in the session, and will be
198 // asked to do the migration again in the next log-in attempt. 238 // asked to do the migration again in the next log-in attempt.
199 if (!continue_login_callback_.is_null()) { 239 if (!continue_login_callback_.is_null()) {
200 user_context_.SetIsForcingDircrypto(false); 240 user_context_.SetIsForcingDircrypto(false);
201 std::move(continue_login_callback_).Run(user_context_); 241 std::move(continue_login_callback_).Run(user_context_);
202 } 242 }
203 } 243 }
(...skipping 28 matching lines...) Expand all
232 base::TaskPriority::USER_VISIBLE), 272 base::TaskPriority::USER_VISIBLE),
233 base::Bind(&base::SysInfo::AmountOfFreeDiskSpace, 273 base::Bind(&base::SysInfo::AmountOfFreeDiskSpace,
234 base::FilePath(kCheckStoragePath)), 274 base::FilePath(kCheckStoragePath)),
235 base::Bind(&EncryptionMigrationScreenHandler::OnGetAvailableStorage, 275 base::Bind(&EncryptionMigrationScreenHandler::OnGetAvailableStorage,
236 weak_ptr_factory_.GetWeakPtr())); 276 weak_ptr_factory_.GetWeakPtr()));
237 } 277 }
238 278
239 void EncryptionMigrationScreenHandler::OnGetAvailableStorage(int64_t size) { 279 void EncryptionMigrationScreenHandler::OnGetAvailableStorage(int64_t size) {
240 if (size >= kMinimumAvailableStorage || IsTestingUI()) { 280 if (size >= kMinimumAvailableStorage || IsTestingUI()) {
241 if (should_resume_) { 281 if (should_resume_) {
282 RecordFirstScreen(FirstScreen::FIRST_SCREEN_RESUME);
242 WaitBatteryAndMigrate(); 283 WaitBatteryAndMigrate();
243 } else { 284 } else {
285 RecordFirstScreen(FirstScreen::FIRST_SCREEN_READY);
244 UpdateUIState(UIState::READY); 286 UpdateUIState(UIState::READY);
245 } 287 }
246 } else { 288 } else {
289 RecordFirstScreen(FirstScreen::FIRST_SCREEN_LOW_STORAGE);
247 CallJS("setAvailableSpaceInString", ui::FormatBytes(size)); 290 CallJS("setAvailableSpaceInString", ui::FormatBytes(size));
248 CallJS("setNecessarySpaceInString", 291 CallJS("setNecessarySpaceInString",
249 ui::FormatBytes(kMinimumAvailableStorage)); 292 ui::FormatBytes(kMinimumAvailableStorage));
250 UpdateUIState(UIState::NOT_ENOUGH_STORAGE); 293 UpdateUIState(UIState::NOT_ENOUGH_STORAGE);
251 } 294 }
252 } 295 }
253 296
254 void EncryptionMigrationScreenHandler::WaitBatteryAndMigrate() { 297 void EncryptionMigrationScreenHandler::WaitBatteryAndMigrate() {
255 if (current_battery_percent_ >= kMinimumBatteryPercent) { 298 if (current_battery_percent_ >= kMinimumBatteryPercent) {
256 StartMigration(); 299 StartMigration();
257 return; 300 return;
258 } 301 }
259 UpdateUIState(UIState::READY); 302 UpdateUIState(UIState::READY);
260 303
261 should_migrate_on_enough_battery_ = true; 304 should_migrate_on_enough_battery_ = true;
262 DBusThreadManager::Get()->GetPowerManagerClient()->RequestStatusUpdate(); 305 DBusThreadManager::Get()->GetPowerManagerClient()->RequestStatusUpdate();
263 } 306 }
264 307
265 void EncryptionMigrationScreenHandler::StartMigration() { 308 void EncryptionMigrationScreenHandler::StartMigration() {
266 UpdateUIState(UIState::MIGRATING); 309 UpdateUIState(UIState::MIGRATING);
310 initial_battery_percent_ = current_battery_percent_;
267 311
268 // Mount the existing eCryptfs vault to a temporary location for migration. 312 // Mount the existing eCryptfs vault to a temporary location for migration.
269 cryptohome::MountParameters mount(false); 313 cryptohome::MountParameters mount(false);
270 mount.to_migrate_from_ecryptfs = true; 314 mount.to_migrate_from_ecryptfs = true;
271 cryptohome::HomedirMethods::GetInstance()->MountEx( 315 cryptohome::HomedirMethods::GetInstance()->MountEx(
272 cryptohome::Identification(user_context_.GetAccountId()), 316 cryptohome::Identification(user_context_.GetAccountId()),
273 cryptohome::Authorization(GetAuthKey()), mount, 317 cryptohome::Authorization(GetAuthKey()), mount,
274 base::Bind(&EncryptionMigrationScreenHandler::OnMountExistingVault, 318 base::Bind(&EncryptionMigrationScreenHandler::OnMountExistingVault,
275 weak_ptr_factory_.GetWeakPtr())); 319 weak_ptr_factory_.GetWeakPtr()));
276 } 320 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 uint64_t total) { 399 uint64_t total) {
356 switch (status) { 400 switch (status) {
357 case cryptohome::DIRCRYPTO_MIGRATION_INITIALIZING: 401 case cryptohome::DIRCRYPTO_MIGRATION_INITIALIZING:
358 UpdateUIState(UIState::MIGRATING); 402 UpdateUIState(UIState::MIGRATING);
359 break; 403 break;
360 case cryptohome::DIRCRYPTO_MIGRATION_IN_PROGRESS: 404 case cryptohome::DIRCRYPTO_MIGRATION_IN_PROGRESS:
361 UpdateUIState(UIState::MIGRATING); 405 UpdateUIState(UIState::MIGRATING);
362 CallJS("setMigrationProgress", static_cast<double>(current) / total); 406 CallJS("setMigrationProgress", static_cast<double>(current) / total);
363 break; 407 break;
364 case cryptohome::DIRCRYPTO_MIGRATION_SUCCESS: 408 case cryptohome::DIRCRYPTO_MIGRATION_SUCCESS:
409 // If the battery level decreased during migration, record the consumed
410 // battery level.
411 if (current_battery_percent_ < initial_battery_percent_) {
412 UMA_HISTOGRAM_PERCENTAGE(
413 kUmaNameConsumedBatteryPercent,
414 static_cast<int>(std::round(initial_battery_percent_ -
415 current_battery_percent_)));
416 }
365 // Restart immediately after successful migration. 417 // Restart immediately after successful migration.
366 DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); 418 DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
367 break; 419 break;
368 case cryptohome::DIRCRYPTO_MIGRATION_FAILED: 420 case cryptohome::DIRCRYPTO_MIGRATION_FAILED:
369 // Stop listening to the progress updates. 421 // Stop listening to the progress updates.
370 DBusThreadManager::Get() 422 DBusThreadManager::Get()
371 ->GetCryptohomeClient() 423 ->GetCryptohomeClient()
372 ->SetDircryptoMigrationProgressHandler( 424 ->SetDircryptoMigrationProgressHandler(
373 CryptohomeClient::DircryptoMigrationProgessHandler()); 425 CryptohomeClient::DircryptoMigrationProgessHandler());
374 // Shows error screen after removing user directory is completed. 426 // Shows error screen after removing user directory is completed.
375 RemoveCryptohome(); 427 RemoveCryptohome();
376 break; 428 break;
377 default: 429 default:
378 break; 430 break;
379 } 431 }
380 } 432 }
381 433
382 void EncryptionMigrationScreenHandler::OnMigrationRequested(bool success) { 434 void EncryptionMigrationScreenHandler::OnMigrationRequested(bool success) {
383 LOG_IF(ERROR, !success) << "Requesting MigrateToDircrypto failed."; 435 LOG_IF(ERROR, !success) << "Requesting MigrateToDircrypto failed.";
384 UpdateUIState(UIState::MIGRATION_FAILED); 436 UpdateUIState(UIState::MIGRATION_FAILED);
385 } 437 }
386 438
387 } // namespace chromeos 439 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698