OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ios/chrome/browser/ui/contextual_search/contextual_search_metrics.h" |
| 6 |
| 7 #include <map> |
| 8 |
| 9 #include "base/metrics/histogram.h" |
| 10 #include "base/metrics/user_metrics.h" |
| 11 #include "base/time/time.h" |
| 12 |
| 13 using ContextualSearch::PanelState; |
| 14 using ContextualSearch::StateChangeReason; |
| 15 |
| 16 // TODO(crbug.com/546238): Convert this into a class that is injected into |
| 17 // CSController so it can be mocked and tested. |
| 18 |
| 19 #define VLOG_UMA_HISTOGRAM_ENUMERATION(log_level, name, sample) \ |
| 20 DVLOG(log_level) << (name) << ": " << (sample); |
| 21 |
| 22 #define VLOG_UMA_HISTOGRAM_TIMES(log_level, name, sample) \ |
| 23 DVLOG(log_level) << (name) << ": " << (sample).InMilliseconds(); |
| 24 |
| 25 #define LOGGED_UMA_HISTOGRAM_ENUMERATION(name, sample, boundary, log_level) \ |
| 26 { \ |
| 27 int evaluated_sample = sample; \ |
| 28 VLOG_UMA_HISTOGRAM_ENUMERATION(log_level, name, evaluated_sample); \ |
| 29 UMA_HISTOGRAM_ENUMERATION(name, evaluated_sample, boundary); \ |
| 30 } |
| 31 |
| 32 #define LOGGED_UMA_HISTOGRAM_TIMES(name, sample, log_level) \ |
| 33 VLOG_UMA_HISTOGRAM_TIMES(log_level, name, sample); \ |
| 34 UMA_HISTOGRAM_TIMES(name, sample); |
| 35 |
| 36 namespace { |
| 37 // Constants used to log UMA "enum" histograms about the Contextual Search's |
| 38 // preference state. |
| 39 const char* const kUMAContextualSearchPreferenceStateHistogram = |
| 40 "Search.ContextualSearchPreferenceState"; |
| 41 const char* const kUMAContextualSearchPreferenceStateChangeHistogram = |
| 42 "Search.ContextualSearchPreferenceStateChange"; |
| 43 const char* const kUMAContextualSearchFirstRunFlowOutcomeHistogram = |
| 44 "Search.ContextualSearchFirstRunFlowOutcome"; |
| 45 enum ContextualSearchPrefState { |
| 46 PREFERENCE_UNINITIALIZED = 0, |
| 47 PREFERENCE_ENABLED, |
| 48 PREFERENCE_DISABLED, |
| 49 PREFERENCE_HISTOGRAM_COUNT, |
| 50 }; |
| 51 |
| 52 // Search duration histograms. |
| 53 const char* const kUMAContextualSearchDurationSeenHistogram = |
| 54 "Search.ContextualSearchDurationSeen"; |
| 55 const char* const kUMAContextualSearchDurationUnseenChainedHistogram = |
| 56 "Search.ContextualSearchDurationUnseenChained"; |
| 57 const char* const kUMAContextualSearchDurationUnseenHistogram = |
| 58 "Search.ContextualSearchDurationUnseen"; |
| 59 const char* const kUMAContextualSearchTimeToSearchHistogram = |
| 60 "Search.ContextualSearchTimeToSearch"; |
| 61 |
| 62 // Constants used to log UMA "enum" histograms about whether search results were |
| 63 // seen. |
| 64 const char* const kUMAContextualSearchFirstRunPanelSeenHistogram = |
| 65 "Search.ContextualSearchFirstRunPanelSeen"; |
| 66 const char* const kUMAContextualSearchSearchResultsSeenHistogram = |
| 67 "Search.ContextualSearchResultsSeen"; |
| 68 enum ContextualSearchResultsSeen { |
| 69 RESULTS_SEEN = 0, |
| 70 RESULTS_NOT_SEEN, |
| 71 RESULTS_SEEN_COUNT, |
| 72 }; |
| 73 |
| 74 const char* const kUMAContextualSearchSearchResultsSeenByGestureHistogram = |
| 75 "Search.ContextualSearchResultsSeenByGesture"; |
| 76 enum ContextualSearchResultsSeenByGesture { |
| 77 RESULTS_FROM_TAP_SEEN = 0, |
| 78 RESULTS_FROM_TAP_NOT_SEEN, |
| 79 RESULTS_FROM_SELECT_SEEN, |
| 80 RESULTS_FROM_SELECT_NOT_SEEN, |
| 81 RESULTS_SEEN_BY_GESTURE_COUNT, |
| 82 }; |
| 83 |
| 84 // Constants used to log UMA "enum" histograms about whether the selection is |
| 85 // valid. |
| 86 const char* const kUMAContextualSearchSelectionValidHistogram = |
| 87 "Search.ContextualSearchSelectionValid"; |
| 88 enum ContextualSearchSelectionValidity { |
| 89 SELECTION_VALID = 0, |
| 90 SELECTION_INVALID, |
| 91 SELECTION_VALIDITY_COUNT, |
| 92 }; |
| 93 |
| 94 // Constants used to log UMA "enum" histograms about the panel's state |
| 95 // transitions. |
| 96 // Entry code: first entry into CLOSED. |
| 97 const char* const kUMAContextualSearchEnterClosedHistogram = |
| 98 "Search.ContextualSearchEnterClosed"; |
| 99 enum ContextualSearchClosedReason { |
| 100 ENTER_CLOSED_FROM_OTHER = 0, |
| 101 ENTER_CLOSED_FROM_PEEKED_BACK_PRESS, |
| 102 ENTER_CLOSED_FROM_PEEKED_BASE_PAGE_SCROLL, |
| 103 ENTER_CLOSED_FROM_PEEKED_TEXT_SELECT_TAP, |
| 104 ENTER_CLOSED_FROM_EXPANDED_BACK_PRESS, |
| 105 ENTER_CLOSED_FROM_EXPANDED_BASE_PAGE_TAP, |
| 106 ENTER_CLOSED_FROM_EXPANDED_FLING, |
| 107 ENTER_CLOSED_FROM_MAXIMIZED_BACK_PRESS, |
| 108 ENTER_CLOSED_FROM_MAXIMIZED_FLING, |
| 109 ENTER_CLOSED_FROM_MAXIMIZED_TAB_PROMOTION, |
| 110 ENTER_CLOSED_FROM_MAXIMIZED_SERP_NAVIGATION, |
| 111 ENTER_CLOSED_FROM_COUNT, |
| 112 }; |
| 113 |
| 114 // Entry code: first entry into PEEKED. |
| 115 const char* const kUMAContextualSearchEnterPeekedHistogram = |
| 116 "Search.ContextualSearchEnterPeeked"; |
| 117 enum ContextualSearchPeekedReason { |
| 118 ENTER_PEEKED_FROM_OTHER = 0, |
| 119 ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_TAP, |
| 120 ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_LONG_PRESS, |
| 121 ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_TAP, |
| 122 ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_LONG_PRESS, |
| 123 ENTER_PEEKED_FROM_EXPANDED_SEARCH_BAR_TAP, |
| 124 ENTER_PEEKED_FROM_EXPANDED_SWIPE, |
| 125 ENTER_PEEKED_FROM_EXPANDED_FLING, |
| 126 ENTER_PEEKED_FROM_MAXIMIZED_SWIPE, |
| 127 ENTER_PEEKED_FROM_MAXIMIZED_FLING, |
| 128 ENTER_PEEKED_FROM_COUNT, |
| 129 }; |
| 130 |
| 131 // Entry code: first entry into EXPANDED. |
| 132 const char* const kUMAContextualSearchEnterExpandedHistogram = |
| 133 "Search.ContextualSearchEnterExpanded"; |
| 134 enum ContextualSearchExpandedReason { |
| 135 ENTER_EXPANDED_FROM_OTHER = 0, |
| 136 ENTER_EXPANDED_FROM_PEEKED_SEARCH_BAR_TAP, |
| 137 ENTER_EXPANDED_FROM_PEEKED_SWIPE, |
| 138 ENTER_EXPANDED_FROM_PEEKED_FLING, |
| 139 ENTER_EXPANDED_FROM_MAXIMIZED_SWIPE, |
| 140 ENTER_EXPANDED_FROM_MAXIMIZED_FLING, |
| 141 ENTER_EXPANDED_FROM_COUNT, |
| 142 }; |
| 143 |
| 144 // Entry code: first entry into MAXIMIZED. |
| 145 const char* const kUMAContextualSearchEnterMaximizedHistogram = |
| 146 "Search.ContextualSearchEnterMaximized"; |
| 147 enum ContextualSearchMaximizedReason { |
| 148 ENTER_MAXIMIZED_FROM_OTHER = 0, |
| 149 ENTER_MAXIMIZED_FROM_PEEKED_SWIPE, |
| 150 ENTER_MAXIMIZED_FROM_PEEKED_FLING, |
| 151 ENTER_MAXIMIZED_FROM_EXPANDED_SWIPE, |
| 152 ENTER_MAXIMIZED_FROM_EXPANDED_FLING, |
| 153 ENTER_MAXIMIZED_FROM_EXPANDED_SERP_NAVIGATION, |
| 154 ENTER_MAXIMIZED_FROM_COUNT, |
| 155 }; |
| 156 |
| 157 // Exit code: first exit from CLOSED (or UNDEFINED). |
| 158 const char* const kUMAContextualSearchExitClosedHistogram = |
| 159 "Search.ContextualSearchExitClosed"; |
| 160 enum ContextualSearchClosedExit { |
| 161 EXIT_CLOSED_TO_OTHER = 0, |
| 162 EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_TAP, |
| 163 EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_LONG_PRESS, |
| 164 EXIT_CLOSED_TO_COUNT, |
| 165 }; |
| 166 |
| 167 // Exit code: first exit from PEEKED. |
| 168 const char* const kUMAContextualSearchExitPeekedHistogram = |
| 169 "Search.ContextualSearchExitPeeked"; |
| 170 enum ContextualSearchPeekedExit { |
| 171 EXIT_PEEKED_TO_OTHER = 0, |
| 172 EXIT_PEEKED_TO_CLOSED_BACK_PRESS, |
| 173 EXIT_PEEKED_TO_CLOSED_BASE_PAGE_SCROLL, |
| 174 EXIT_PEEKED_TO_CLOSED_TEXT_SELECT_TAP, |
| 175 EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_TAP, |
| 176 EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_LONG_PRESS, |
| 177 EXIT_PEEKED_TO_EXPANDED_SEARCH_BAR_TAP, |
| 178 EXIT_PEEKED_TO_EXPANDED_SWIPE, |
| 179 EXIT_PEEKED_TO_EXPANDED_FLING, |
| 180 EXIT_PEEKED_TO_MAXIMIZED_SWIPE, |
| 181 EXIT_PEEKED_TO_MAXIMIZED_FLING, |
| 182 EXIT_PEEKED_TO_COUNT, |
| 183 }; |
| 184 |
| 185 // Exit code: first exit from EXPANDED. |
| 186 const char* const kUMAContextualSearchExitExpandedHistogram = |
| 187 "Search.ContextualSearchExitExpanded"; |
| 188 enum ContextualSearchExpandedExit { |
| 189 EXIT_EXPANDED_TO_OTHER = 0, |
| 190 EXIT_EXPANDED_TO_CLOSED_BACK_PRESS, |
| 191 EXIT_EXPANDED_TO_CLOSED_BASE_PAGE_TAP, |
| 192 EXIT_EXPANDED_TO_CLOSED_FLING, |
| 193 EXIT_EXPANDED_TO_PEEKED_SEARCH_BAR_TAP, |
| 194 EXIT_EXPANDED_TO_PEEKED_SWIPE, |
| 195 EXIT_EXPANDED_TO_PEEKED_FLING, |
| 196 EXIT_EXPANDED_TO_MAXIMIZED_SWIPE, |
| 197 EXIT_EXPANDED_TO_MAXIMIZED_FLING, |
| 198 EXIT_EXPANDED_TO_MAXIMIZED_SERP_NAVIGATION, |
| 199 EXIT_EXPANDED_TO_COUNT, |
| 200 }; |
| 201 |
| 202 // Exit code: first exit from MAXIMIZED. |
| 203 const char* const kUMAContextualSearchExitMaximizedHistogram = |
| 204 "Search.ContextualSearchExitMaximized"; |
| 205 enum ContextualSearchMaximizedExit { |
| 206 EXIT_MAXIMIZED_TO_OTHER = 0, |
| 207 EXIT_MAXIMIZED_TO_CLOSED_BACK_PRESS, |
| 208 EXIT_MAXIMIZED_TO_CLOSED_FLING, |
| 209 EXIT_MAXIMIZED_TO_CLOSED_TAB_PROMOTION, |
| 210 EXIT_MAXIMIZED_TO_CLOSED_SERP_NAVIGATION, |
| 211 EXIT_MAXIMIZED_TO_PEEKED_SWIPE, |
| 212 EXIT_MAXIMIZED_TO_PEEKED_FLING, |
| 213 EXIT_MAXIMIZED_TO_EXPANDED_SWIPE, |
| 214 EXIT_MAXIMIZED_TO_EXPANDED_FLING, |
| 215 EXIT_MAXIMIZED_TO_COUNT, |
| 216 }; |
| 217 |
| 218 // Panel states that match UMA enum names. |
| 219 enum PanelState { UNDEFINED, CLOSED, PEEKED, EXPANDED, MAXIMIZED }; |
| 220 |
| 221 // Utility method to convert enter transition (|from_state|, CLOSED, |reason|) |
| 222 // to UMA histogram value. |
| 223 int EnterClosedStateChanges(PanelState from_state, |
| 224 ContextualSearch::StateChangeReason reason, |
| 225 int default_code) { |
| 226 switch (from_state) { |
| 227 case PEEKED: |
| 228 switch (reason) { |
| 229 case ContextualSearch::BACK_PRESS: |
| 230 return ENTER_CLOSED_FROM_PEEKED_BACK_PRESS; |
| 231 case ContextualSearch::BASE_PAGE_SCROLL: |
| 232 return ENTER_CLOSED_FROM_PEEKED_BASE_PAGE_SCROLL; |
| 233 case ContextualSearch::TEXT_SELECT_TAP: |
| 234 return ENTER_CLOSED_FROM_PEEKED_TEXT_SELECT_TAP; |
| 235 default: |
| 236 break; |
| 237 } |
| 238 break; |
| 239 case EXPANDED: |
| 240 switch (reason) { |
| 241 case ContextualSearch::BACK_PRESS: |
| 242 return ENTER_CLOSED_FROM_EXPANDED_BACK_PRESS; |
| 243 case ContextualSearch::BASE_PAGE_TAP: |
| 244 return ENTER_CLOSED_FROM_EXPANDED_BASE_PAGE_TAP; |
| 245 case ContextualSearch::FLING: |
| 246 return ENTER_CLOSED_FROM_EXPANDED_FLING; |
| 247 default: |
| 248 break; |
| 249 } |
| 250 break; |
| 251 case MAXIMIZED: |
| 252 switch (reason) { |
| 253 case ContextualSearch::BACK_PRESS: |
| 254 return ENTER_CLOSED_FROM_MAXIMIZED_BACK_PRESS; |
| 255 case ContextualSearch::FLING: |
| 256 return ENTER_CLOSED_FROM_MAXIMIZED_FLING; |
| 257 case ContextualSearch::TAB_PROMOTION: |
| 258 return ENTER_CLOSED_FROM_MAXIMIZED_TAB_PROMOTION; |
| 259 case ContextualSearch::SERP_NAVIGATION: |
| 260 return ENTER_CLOSED_FROM_MAXIMIZED_SERP_NAVIGATION; |
| 261 default: |
| 262 break; |
| 263 } |
| 264 break; |
| 265 default: |
| 266 break; |
| 267 } |
| 268 return default_code; |
| 269 } |
| 270 |
| 271 // Utility method to convert enter transition (|from_state|, PEEKED, |reason|) |
| 272 // to UMA histogram value. |
| 273 int EnterPeekedStateChanges(PanelState from_state, |
| 274 ContextualSearch::StateChangeReason reason, |
| 275 int default_code) { |
| 276 switch (from_state) { |
| 277 case CLOSED: |
| 278 switch (reason) { |
| 279 case ContextualSearch::TEXT_SELECT_TAP: |
| 280 return ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_TAP; |
| 281 case ContextualSearch::TEXT_SELECT_LONG_PRESS: |
| 282 return ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_LONG_PRESS; |
| 283 default: |
| 284 break; |
| 285 } |
| 286 break; |
| 287 case PEEKED: |
| 288 switch (reason) { |
| 289 case ContextualSearch::TEXT_SELECT_TAP: |
| 290 return ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_TAP; |
| 291 case ContextualSearch::TEXT_SELECT_LONG_PRESS: |
| 292 return ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_LONG_PRESS; |
| 293 default: |
| 294 break; |
| 295 } |
| 296 break; |
| 297 case EXPANDED: |
| 298 switch (reason) { |
| 299 case ContextualSearch::SEARCH_BAR_TAP: |
| 300 return ENTER_PEEKED_FROM_EXPANDED_SEARCH_BAR_TAP; |
| 301 case ContextualSearch::SWIPE: |
| 302 return ENTER_PEEKED_FROM_EXPANDED_SWIPE; |
| 303 case ContextualSearch::FLING: |
| 304 return ENTER_PEEKED_FROM_EXPANDED_FLING; |
| 305 default: |
| 306 break; |
| 307 } |
| 308 break; |
| 309 case MAXIMIZED: |
| 310 switch (reason) { |
| 311 case ContextualSearch::SWIPE: |
| 312 return ENTER_PEEKED_FROM_MAXIMIZED_SWIPE; |
| 313 case ContextualSearch::FLING: |
| 314 return ENTER_PEEKED_FROM_MAXIMIZED_FLING; |
| 315 default: |
| 316 break; |
| 317 } |
| 318 break; |
| 319 default: |
| 320 break; |
| 321 } |
| 322 return default_code; |
| 323 } |
| 324 |
| 325 // Utility method to convert enter transition (|from_state|, EXPANDED, |reason|) |
| 326 // to UMA histogram value. |
| 327 int EnterExpandedStateChanges(PanelState from_state, |
| 328 ContextualSearch::StateChangeReason reason, |
| 329 int default_code) { |
| 330 switch (from_state) { |
| 331 case PEEKED: |
| 332 switch (reason) { |
| 333 case ContextualSearch::SEARCH_BAR_TAP: |
| 334 return ENTER_EXPANDED_FROM_PEEKED_SEARCH_BAR_TAP; |
| 335 case ContextualSearch::SWIPE: |
| 336 return ENTER_EXPANDED_FROM_PEEKED_SWIPE; |
| 337 case ContextualSearch::FLING: |
| 338 return ENTER_EXPANDED_FROM_PEEKED_FLING; |
| 339 default: |
| 340 break; |
| 341 } |
| 342 break; |
| 343 case MAXIMIZED: |
| 344 switch (reason) { |
| 345 case ContextualSearch::SWIPE: |
| 346 return ENTER_EXPANDED_FROM_MAXIMIZED_SWIPE; |
| 347 case ContextualSearch::FLING: |
| 348 return ENTER_EXPANDED_FROM_MAXIMIZED_FLING; |
| 349 default: |
| 350 break; |
| 351 } |
| 352 break; |
| 353 default: |
| 354 break; |
| 355 } |
| 356 return default_code; |
| 357 } |
| 358 |
| 359 // Utility method to convert enter transition |
| 360 // (|from_state|, MAXIMIZED, |reason|) to UMA histogram value. |
| 361 int EnterMaximizedStateChanges(PanelState from_state, |
| 362 ContextualSearch::StateChangeReason reason, |
| 363 int default_code) { |
| 364 switch (from_state) { |
| 365 case PEEKED: |
| 366 switch (reason) { |
| 367 case ContextualSearch::SWIPE: |
| 368 return ENTER_MAXIMIZED_FROM_PEEKED_SWIPE; |
| 369 case ContextualSearch::FLING: |
| 370 return ENTER_MAXIMIZED_FROM_PEEKED_FLING; |
| 371 default: |
| 372 break; |
| 373 } |
| 374 break; |
| 375 case EXPANDED: |
| 376 switch (reason) { |
| 377 case ContextualSearch::SWIPE: |
| 378 return ENTER_MAXIMIZED_FROM_EXPANDED_SWIPE; |
| 379 case ContextualSearch::FLING: |
| 380 return ENTER_MAXIMIZED_FROM_EXPANDED_FLING; |
| 381 case ContextualSearch::SERP_NAVIGATION: |
| 382 return ENTER_MAXIMIZED_FROM_EXPANDED_SERP_NAVIGATION; |
| 383 default: |
| 384 break; |
| 385 } |
| 386 break; |
| 387 default: |
| 388 break; |
| 389 } |
| 390 return default_code; |
| 391 } |
| 392 |
| 393 // Utility method to convert enter exit (CLOSED, |to_state|, |reason|) |
| 394 // to UMA histogram value. |
| 395 int ExitClosedStateChanges(PanelState to_state, |
| 396 ContextualSearch::StateChangeReason reason, |
| 397 int default_code) { |
| 398 switch (to_state) { |
| 399 case PEEKED: |
| 400 switch (reason) { |
| 401 case ContextualSearch::TEXT_SELECT_TAP: |
| 402 return EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_TAP; |
| 403 case ContextualSearch::TEXT_SELECT_LONG_PRESS: |
| 404 return EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_LONG_PRESS; |
| 405 default: |
| 406 break; |
| 407 } |
| 408 break; |
| 409 default: |
| 410 break; |
| 411 } |
| 412 return default_code; |
| 413 } |
| 414 |
| 415 // Utility method to convert enter exit (PEEKED, |to_state|, |reason|) |
| 416 // to UMA histogram value. |
| 417 int ExitPeekedStateChanges(PanelState to_state, |
| 418 ContextualSearch::StateChangeReason reason, |
| 419 int default_code) { |
| 420 switch (to_state) { |
| 421 case CLOSED: |
| 422 switch (reason) { |
| 423 case ContextualSearch::BACK_PRESS: |
| 424 return EXIT_PEEKED_TO_CLOSED_BACK_PRESS; |
| 425 case ContextualSearch::BASE_PAGE_SCROLL: |
| 426 return EXIT_PEEKED_TO_CLOSED_BASE_PAGE_SCROLL; |
| 427 case ContextualSearch::TEXT_SELECT_TAP: |
| 428 return EXIT_PEEKED_TO_CLOSED_TEXT_SELECT_TAP; |
| 429 default: |
| 430 break; |
| 431 } |
| 432 break; |
| 433 case PEEKED: |
| 434 switch (reason) { |
| 435 case ContextualSearch::TEXT_SELECT_TAP: |
| 436 return EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_TAP; |
| 437 case ContextualSearch::TEXT_SELECT_LONG_PRESS: |
| 438 return EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_LONG_PRESS; |
| 439 default: |
| 440 break; |
| 441 } |
| 442 break; |
| 443 case EXPANDED: |
| 444 switch (reason) { |
| 445 case ContextualSearch::SEARCH_BAR_TAP: |
| 446 return EXIT_PEEKED_TO_EXPANDED_SEARCH_BAR_TAP; |
| 447 case ContextualSearch::SWIPE: |
| 448 return EXIT_PEEKED_TO_EXPANDED_SWIPE; |
| 449 case ContextualSearch::FLING: |
| 450 return EXIT_PEEKED_TO_EXPANDED_FLING; |
| 451 default: |
| 452 break; |
| 453 } |
| 454 break; |
| 455 case MAXIMIZED: |
| 456 switch (reason) { |
| 457 case ContextualSearch::SWIPE: |
| 458 return EXIT_PEEKED_TO_MAXIMIZED_SWIPE; |
| 459 case ContextualSearch::FLING: |
| 460 return EXIT_PEEKED_TO_MAXIMIZED_FLING; |
| 461 default: |
| 462 break; |
| 463 } |
| 464 break; |
| 465 default: |
| 466 break; |
| 467 } |
| 468 return default_code; |
| 469 } |
| 470 |
| 471 // Utility method to convert enter exit (EXPANDED, |to_state|, |reason|) |
| 472 // to UMA histogram value. |
| 473 int ExitExpandedStateChanges(PanelState to_state, |
| 474 ContextualSearch::StateChangeReason reason, |
| 475 int default_code) { |
| 476 switch (to_state) { |
| 477 case CLOSED: |
| 478 switch (reason) { |
| 479 case ContextualSearch::BACK_PRESS: |
| 480 return EXIT_EXPANDED_TO_CLOSED_BACK_PRESS; |
| 481 case ContextualSearch::BASE_PAGE_TAP: |
| 482 return EXIT_EXPANDED_TO_CLOSED_BASE_PAGE_TAP; |
| 483 case ContextualSearch::FLING: |
| 484 return EXIT_EXPANDED_TO_CLOSED_FLING; |
| 485 default: |
| 486 break; |
| 487 } |
| 488 break; |
| 489 case PEEKED: |
| 490 switch (reason) { |
| 491 case ContextualSearch::SEARCH_BAR_TAP: |
| 492 return EXIT_EXPANDED_TO_PEEKED_SEARCH_BAR_TAP; |
| 493 case ContextualSearch::SWIPE: |
| 494 return EXIT_EXPANDED_TO_PEEKED_SWIPE; |
| 495 case ContextualSearch::FLING: |
| 496 return EXIT_EXPANDED_TO_PEEKED_FLING; |
| 497 default: |
| 498 break; |
| 499 } |
| 500 break; |
| 501 case MAXIMIZED: |
| 502 switch (reason) { |
| 503 case ContextualSearch::SWIPE: |
| 504 return EXIT_EXPANDED_TO_MAXIMIZED_SWIPE; |
| 505 case ContextualSearch::FLING: |
| 506 return EXIT_EXPANDED_TO_MAXIMIZED_FLING; |
| 507 case ContextualSearch::SERP_NAVIGATION: |
| 508 return EXIT_EXPANDED_TO_MAXIMIZED_SERP_NAVIGATION; |
| 509 default: |
| 510 break; |
| 511 } |
| 512 break; |
| 513 default: |
| 514 break; |
| 515 } |
| 516 return default_code; |
| 517 } |
| 518 |
| 519 // Utility method to convert enter exit (MAXIMIZED, |to_state|, |reason|) |
| 520 // to UMA histogram value. |
| 521 int ExitMaximizedStateChanges(PanelState to_state, |
| 522 ContextualSearch::StateChangeReason reason, |
| 523 int default_code) { |
| 524 switch (to_state) { |
| 525 case CLOSED: |
| 526 switch (reason) { |
| 527 case ContextualSearch::BACK_PRESS: |
| 528 return EXIT_MAXIMIZED_TO_CLOSED_BACK_PRESS; |
| 529 case ContextualSearch::FLING: |
| 530 return EXIT_MAXIMIZED_TO_CLOSED_FLING; |
| 531 case ContextualSearch::TAB_PROMOTION: |
| 532 return EXIT_MAXIMIZED_TO_CLOSED_TAB_PROMOTION; |
| 533 case ContextualSearch::SERP_NAVIGATION: |
| 534 return EXIT_MAXIMIZED_TO_CLOSED_SERP_NAVIGATION; |
| 535 default: |
| 536 break; |
| 537 } |
| 538 break; |
| 539 case PEEKED: |
| 540 switch (reason) { |
| 541 case ContextualSearch::SWIPE: |
| 542 return EXIT_MAXIMIZED_TO_PEEKED_SWIPE; |
| 543 case ContextualSearch::FLING: |
| 544 return EXIT_MAXIMIZED_TO_PEEKED_FLING; |
| 545 default: |
| 546 break; |
| 547 } |
| 548 break; |
| 549 case EXPANDED: |
| 550 switch (reason) { |
| 551 case ContextualSearch::SWIPE: |
| 552 return EXIT_MAXIMIZED_TO_EXPANDED_SWIPE; |
| 553 case ContextualSearch::FLING: |
| 554 return EXIT_MAXIMIZED_TO_EXPANDED_FLING; |
| 555 default: |
| 556 break; |
| 557 } |
| 558 break; |
| 559 default: |
| 560 break; |
| 561 } |
| 562 return default_code; |
| 563 } |
| 564 |
| 565 // Utility method that extracts a state change UMA enum value |
| 566 int getStateChangeCode(PanelState from_state, |
| 567 ContextualSearch::StateChangeReason reason, |
| 568 PanelState to_state, |
| 569 bool entry, |
| 570 int default_code) { |
| 571 if (entry) { |
| 572 DCHECK_NE(from_state, UNDEFINED); |
| 573 switch (to_state) { |
| 574 case CLOSED: |
| 575 return EnterClosedStateChanges(from_state, reason, default_code); |
| 576 case PEEKED: |
| 577 return EnterPeekedStateChanges(from_state, reason, default_code); |
| 578 case EXPANDED: |
| 579 return EnterExpandedStateChanges(from_state, reason, default_code); |
| 580 case MAXIMIZED: |
| 581 return EnterMaximizedStateChanges(from_state, reason, default_code); |
| 582 default: |
| 583 return default_code; |
| 584 } |
| 585 } else { |
| 586 switch (from_state) { |
| 587 case UNDEFINED: |
| 588 case CLOSED: |
| 589 return ExitClosedStateChanges(to_state, reason, default_code); |
| 590 case PEEKED: |
| 591 return ExitPeekedStateChanges(to_state, reason, default_code); |
| 592 case EXPANDED: |
| 593 return ExitExpandedStateChanges(to_state, reason, default_code); |
| 594 case MAXIMIZED: |
| 595 return ExitMaximizedStateChanges(to_state, reason, default_code); |
| 596 default: |
| 597 return default_code; |
| 598 } |
| 599 } |
| 600 } |
| 601 |
| 602 // Utility method that maps ContextualSearch::PanelStates to PanelStates. |
| 603 PanelState panelState(ContextualSearch::PanelState state) { |
| 604 switch (state) { |
| 605 case ContextualSearch::UNDEFINED: |
| 606 return UNDEFINED; |
| 607 case ContextualSearch::DISMISSED: |
| 608 return CLOSED; |
| 609 case ContextualSearch::PEEKING: |
| 610 return PEEKED; |
| 611 case ContextualSearch::PREVIEWING: |
| 612 return EXPANDED; |
| 613 case ContextualSearch::COVERING: |
| 614 return MAXIMIZED; |
| 615 default: |
| 616 NOTREACHED() << "Exciting new ContextualSearchPanel state found!"; |
| 617 return UNDEFINED; |
| 618 } |
| 619 } |
| 620 |
| 621 // Utility method that mapse xternal pref state enum value into internal pref |
| 622 // state histogram value (note that we want to keep these decoupled). |
| 623 ContextualSearchPrefState getPrefState( |
| 624 TouchToSearch::TouchToSearchPreferenceState prefState) { |
| 625 switch (prefState) { |
| 626 case TouchToSearch::DISABLED: |
| 627 return PREFERENCE_DISABLED; |
| 628 case TouchToSearch::ENABLED: |
| 629 return PREFERENCE_ENABLED; |
| 630 case TouchToSearch::UNDECIDED: |
| 631 return PREFERENCE_UNINITIALIZED; |
| 632 default: |
| 633 NOTREACHED(); |
| 634 } |
| 635 } |
| 636 |
| 637 // Utility method for recording the results-seen metric common to multiple |
| 638 // metrics calls. |
| 639 void RecordResultsSeen(bool seen) { |
| 640 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 641 kUMAContextualSearchSearchResultsSeenHistogram, |
| 642 seen ? RESULTS_SEEN : RESULTS_NOT_SEEN, RESULTS_SEEN_COUNT, 1); |
| 643 } |
| 644 |
| 645 } // namespace |
| 646 |
| 647 namespace ContextualSearch { |
| 648 |
| 649 void RecordPreferenceState(TouchToSearch::TouchToSearchPreferenceState state) { |
| 650 LOGGED_UMA_HISTOGRAM_ENUMERATION(kUMAContextualSearchPreferenceStateHistogram, |
| 651 getPrefState(state), |
| 652 PREFERENCE_HISTOGRAM_COUNT, 1); |
| 653 } |
| 654 |
| 655 void RecordPreferenceChanged(bool enabled) { |
| 656 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 657 kUMAContextualSearchPreferenceStateChangeHistogram, |
| 658 enabled ? PREFERENCE_ENABLED : PREFERENCE_DISABLED, |
| 659 PREFERENCE_HISTOGRAM_COUNT, 1); |
| 660 } |
| 661 |
| 662 void RecordFirstRunFlowOutcome( |
| 663 TouchToSearch::TouchToSearchPreferenceState state) { |
| 664 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 665 kUMAContextualSearchFirstRunFlowOutcomeHistogram, getPrefState(state), |
| 666 PREFERENCE_HISTOGRAM_COUNT, 1); |
| 667 } |
| 668 |
| 669 void RecordDuration(bool resultsSeen, bool chained, base::TimeDelta duration) { |
| 670 if (resultsSeen) { |
| 671 LOGGED_UMA_HISTOGRAM_TIMES(kUMAContextualSearchDurationSeenHistogram, |
| 672 duration, 1); |
| 673 } else if (chained) { |
| 674 LOGGED_UMA_HISTOGRAM_TIMES( |
| 675 kUMAContextualSearchDurationUnseenChainedHistogram, duration, 1); |
| 676 } else { |
| 677 LOGGED_UMA_HISTOGRAM_TIMES(kUMAContextualSearchDurationUnseenHistogram, |
| 678 duration, 1); |
| 679 } |
| 680 } |
| 681 |
| 682 void RecordTimeToSearch(base::TimeDelta duration) { |
| 683 LOGGED_UMA_HISTOGRAM_TIMES(kUMAContextualSearchTimeToSearchHistogram, |
| 684 duration, 1); |
| 685 } |
| 686 |
| 687 void RecordFirstRunPanelSeen(bool seen) { |
| 688 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 689 kUMAContextualSearchFirstRunPanelSeenHistogram, |
| 690 seen ? RESULTS_SEEN : RESULTS_NOT_SEEN, RESULTS_SEEN_COUNT, 1); |
| 691 } |
| 692 |
| 693 void RecordTapResultsSeen(bool seen) { |
| 694 RecordResultsSeen(seen); |
| 695 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 696 kUMAContextualSearchSearchResultsSeenByGestureHistogram, |
| 697 seen ? RESULTS_FROM_TAP_SEEN : RESULTS_FROM_TAP_NOT_SEEN, |
| 698 RESULTS_SEEN_BY_GESTURE_COUNT, 1); |
| 699 } |
| 700 |
| 701 void RecordSelectionResultsSeen(bool seen) { |
| 702 RecordResultsSeen(seen); |
| 703 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 704 kUMAContextualSearchSearchResultsSeenByGestureHistogram, |
| 705 seen ? RESULTS_FROM_SELECT_SEEN : RESULTS_FROM_SELECT_NOT_SEEN, |
| 706 RESULTS_SEEN_BY_GESTURE_COUNT, 1); |
| 707 } |
| 708 |
| 709 void RecordSelectionIsValid(bool valid) { |
| 710 LOGGED_UMA_HISTOGRAM_ENUMERATION(kUMAContextualSearchSelectionValidHistogram, |
| 711 valid ? SELECTION_VALID : SELECTION_INVALID, |
| 712 SELECTION_VALIDITY_COUNT, 1); |
| 713 } |
| 714 |
| 715 void RecordFirstStateEntry(PanelState from_state, |
| 716 PanelState to_state, |
| 717 StateChangeReason reason) { |
| 718 switch (panelState(to_state)) { |
| 719 case CLOSED: |
| 720 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 721 kUMAContextualSearchEnterClosedHistogram, |
| 722 getStateChangeCode(panelState(from_state), reason, CLOSED, true, |
| 723 ENTER_CLOSED_FROM_OTHER), |
| 724 ENTER_CLOSED_FROM_COUNT, 1); |
| 725 break; |
| 726 case PEEKED: |
| 727 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 728 kUMAContextualSearchEnterPeekedHistogram, |
| 729 getStateChangeCode(panelState(from_state), reason, PEEKED, true, |
| 730 ENTER_PEEKED_FROM_OTHER), |
| 731 ENTER_PEEKED_FROM_COUNT, 1); |
| 732 break; |
| 733 case EXPANDED: |
| 734 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 735 kUMAContextualSearchEnterExpandedHistogram, |
| 736 getStateChangeCode(panelState(from_state), reason, EXPANDED, true, |
| 737 ENTER_EXPANDED_FROM_OTHER), |
| 738 ENTER_EXPANDED_FROM_COUNT, 1); |
| 739 break; |
| 740 case MAXIMIZED: |
| 741 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 742 kUMAContextualSearchEnterMaximizedHistogram, |
| 743 getStateChangeCode(panelState(from_state), reason, MAXIMIZED, true, |
| 744 ENTER_MAXIMIZED_FROM_OTHER), |
| 745 ENTER_MAXIMIZED_FROM_COUNT, 1); |
| 746 break; |
| 747 default: |
| 748 NOTREACHED() << "RecordFirstStateEntry for unexpected state " << to_state; |
| 749 break; |
| 750 } |
| 751 } |
| 752 |
| 753 void RecordFirstStateExit(PanelState from_state, |
| 754 PanelState to_state, |
| 755 StateChangeReason reason) { |
| 756 switch (panelState(from_state)) { |
| 757 case CLOSED: |
| 758 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 759 kUMAContextualSearchExitClosedHistogram, |
| 760 getStateChangeCode(CLOSED, reason, panelState(to_state), false, |
| 761 EXIT_CLOSED_TO_OTHER), |
| 762 EXIT_CLOSED_TO_COUNT, 1); |
| 763 break; |
| 764 case PEEKED: |
| 765 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 766 kUMAContextualSearchExitPeekedHistogram, |
| 767 getStateChangeCode(PEEKED, reason, panelState(to_state), false, |
| 768 EXIT_PEEKED_TO_OTHER), |
| 769 EXIT_PEEKED_TO_COUNT, 1); |
| 770 break; |
| 771 case EXPANDED: |
| 772 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 773 kUMAContextualSearchExitExpandedHistogram, |
| 774 getStateChangeCode(EXPANDED, reason, panelState(to_state), false, |
| 775 EXIT_EXPANDED_TO_OTHER), |
| 776 EXIT_EXPANDED_TO_COUNT, 1); |
| 777 break; |
| 778 case MAXIMIZED: |
| 779 LOGGED_UMA_HISTOGRAM_ENUMERATION( |
| 780 kUMAContextualSearchExitMaximizedHistogram, |
| 781 getStateChangeCode(MAXIMIZED, reason, panelState(to_state), false, |
| 782 EXIT_MAXIMIZED_TO_OTHER), |
| 783 EXIT_MAXIMIZED_TO_COUNT, 1); |
| 784 break; |
| 785 default: |
| 786 NOTREACHED() << "RecordFirstStateExit for unexpected state " << to_state; |
| 787 break; |
| 788 } |
| 789 } |
| 790 |
| 791 } // namespace ContextualSearch |
OLD | NEW |