| Index: ios/chrome/browser/ui/contextual_search/contextual_search_metrics.mm
|
| diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_metrics.mm b/ios/chrome/browser/ui/contextual_search/contextual_search_metrics.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0dd443803fcd8b685ba6909af2d03949e0c27229
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/contextual_search/contextual_search_metrics.mm
|
| @@ -0,0 +1,791 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ios/chrome/browser/ui/contextual_search/contextual_search_metrics.h"
|
| +
|
| +#include <map>
|
| +
|
| +#include "base/metrics/histogram.h"
|
| +#include "base/metrics/user_metrics.h"
|
| +#include "base/time/time.h"
|
| +
|
| +using ContextualSearch::PanelState;
|
| +using ContextualSearch::StateChangeReason;
|
| +
|
| +// TODO(crbug.com/546238): Convert this into a class that is injected into
|
| +// CSController so it can be mocked and tested.
|
| +
|
| +#define VLOG_UMA_HISTOGRAM_ENUMERATION(log_level, name, sample) \
|
| + DVLOG(log_level) << (name) << ": " << (sample);
|
| +
|
| +#define VLOG_UMA_HISTOGRAM_TIMES(log_level, name, sample) \
|
| + DVLOG(log_level) << (name) << ": " << (sample).InMilliseconds();
|
| +
|
| +#define LOGGED_UMA_HISTOGRAM_ENUMERATION(name, sample, boundary, log_level) \
|
| + { \
|
| + int evaluated_sample = sample; \
|
| + VLOG_UMA_HISTOGRAM_ENUMERATION(log_level, name, evaluated_sample); \
|
| + UMA_HISTOGRAM_ENUMERATION(name, evaluated_sample, boundary); \
|
| + }
|
| +
|
| +#define LOGGED_UMA_HISTOGRAM_TIMES(name, sample, log_level) \
|
| + VLOG_UMA_HISTOGRAM_TIMES(log_level, name, sample); \
|
| + UMA_HISTOGRAM_TIMES(name, sample);
|
| +
|
| +namespace {
|
| +// Constants used to log UMA "enum" histograms about the Contextual Search's
|
| +// preference state.
|
| +const char* const kUMAContextualSearchPreferenceStateHistogram =
|
| + "Search.ContextualSearchPreferenceState";
|
| +const char* const kUMAContextualSearchPreferenceStateChangeHistogram =
|
| + "Search.ContextualSearchPreferenceStateChange";
|
| +const char* const kUMAContextualSearchFirstRunFlowOutcomeHistogram =
|
| + "Search.ContextualSearchFirstRunFlowOutcome";
|
| +enum ContextualSearchPrefState {
|
| + PREFERENCE_UNINITIALIZED = 0,
|
| + PREFERENCE_ENABLED,
|
| + PREFERENCE_DISABLED,
|
| + PREFERENCE_HISTOGRAM_COUNT,
|
| +};
|
| +
|
| +// Search duration histograms.
|
| +const char* const kUMAContextualSearchDurationSeenHistogram =
|
| + "Search.ContextualSearchDurationSeen";
|
| +const char* const kUMAContextualSearchDurationUnseenChainedHistogram =
|
| + "Search.ContextualSearchDurationUnseenChained";
|
| +const char* const kUMAContextualSearchDurationUnseenHistogram =
|
| + "Search.ContextualSearchDurationUnseen";
|
| +const char* const kUMAContextualSearchTimeToSearchHistogram =
|
| + "Search.ContextualSearchTimeToSearch";
|
| +
|
| +// Constants used to log UMA "enum" histograms about whether search results were
|
| +// seen.
|
| +const char* const kUMAContextualSearchFirstRunPanelSeenHistogram =
|
| + "Search.ContextualSearchFirstRunPanelSeen";
|
| +const char* const kUMAContextualSearchSearchResultsSeenHistogram =
|
| + "Search.ContextualSearchResultsSeen";
|
| +enum ContextualSearchResultsSeen {
|
| + RESULTS_SEEN = 0,
|
| + RESULTS_NOT_SEEN,
|
| + RESULTS_SEEN_COUNT,
|
| +};
|
| +
|
| +const char* const kUMAContextualSearchSearchResultsSeenByGestureHistogram =
|
| + "Search.ContextualSearchResultsSeenByGesture";
|
| +enum ContextualSearchResultsSeenByGesture {
|
| + RESULTS_FROM_TAP_SEEN = 0,
|
| + RESULTS_FROM_TAP_NOT_SEEN,
|
| + RESULTS_FROM_SELECT_SEEN,
|
| + RESULTS_FROM_SELECT_NOT_SEEN,
|
| + RESULTS_SEEN_BY_GESTURE_COUNT,
|
| +};
|
| +
|
| +// Constants used to log UMA "enum" histograms about whether the selection is
|
| +// valid.
|
| +const char* const kUMAContextualSearchSelectionValidHistogram =
|
| + "Search.ContextualSearchSelectionValid";
|
| +enum ContextualSearchSelectionValidity {
|
| + SELECTION_VALID = 0,
|
| + SELECTION_INVALID,
|
| + SELECTION_VALIDITY_COUNT,
|
| +};
|
| +
|
| +// Constants used to log UMA "enum" histograms about the panel's state
|
| +// transitions.
|
| +// Entry code: first entry into CLOSED.
|
| +const char* const kUMAContextualSearchEnterClosedHistogram =
|
| + "Search.ContextualSearchEnterClosed";
|
| +enum ContextualSearchClosedReason {
|
| + ENTER_CLOSED_FROM_OTHER = 0,
|
| + ENTER_CLOSED_FROM_PEEKED_BACK_PRESS,
|
| + ENTER_CLOSED_FROM_PEEKED_BASE_PAGE_SCROLL,
|
| + ENTER_CLOSED_FROM_PEEKED_TEXT_SELECT_TAP,
|
| + ENTER_CLOSED_FROM_EXPANDED_BACK_PRESS,
|
| + ENTER_CLOSED_FROM_EXPANDED_BASE_PAGE_TAP,
|
| + ENTER_CLOSED_FROM_EXPANDED_FLING,
|
| + ENTER_CLOSED_FROM_MAXIMIZED_BACK_PRESS,
|
| + ENTER_CLOSED_FROM_MAXIMIZED_FLING,
|
| + ENTER_CLOSED_FROM_MAXIMIZED_TAB_PROMOTION,
|
| + ENTER_CLOSED_FROM_MAXIMIZED_SERP_NAVIGATION,
|
| + ENTER_CLOSED_FROM_COUNT,
|
| +};
|
| +
|
| +// Entry code: first entry into PEEKED.
|
| +const char* const kUMAContextualSearchEnterPeekedHistogram =
|
| + "Search.ContextualSearchEnterPeeked";
|
| +enum ContextualSearchPeekedReason {
|
| + ENTER_PEEKED_FROM_OTHER = 0,
|
| + ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_TAP,
|
| + ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_LONG_PRESS,
|
| + ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_TAP,
|
| + ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_LONG_PRESS,
|
| + ENTER_PEEKED_FROM_EXPANDED_SEARCH_BAR_TAP,
|
| + ENTER_PEEKED_FROM_EXPANDED_SWIPE,
|
| + ENTER_PEEKED_FROM_EXPANDED_FLING,
|
| + ENTER_PEEKED_FROM_MAXIMIZED_SWIPE,
|
| + ENTER_PEEKED_FROM_MAXIMIZED_FLING,
|
| + ENTER_PEEKED_FROM_COUNT,
|
| +};
|
| +
|
| +// Entry code: first entry into EXPANDED.
|
| +const char* const kUMAContextualSearchEnterExpandedHistogram =
|
| + "Search.ContextualSearchEnterExpanded";
|
| +enum ContextualSearchExpandedReason {
|
| + ENTER_EXPANDED_FROM_OTHER = 0,
|
| + ENTER_EXPANDED_FROM_PEEKED_SEARCH_BAR_TAP,
|
| + ENTER_EXPANDED_FROM_PEEKED_SWIPE,
|
| + ENTER_EXPANDED_FROM_PEEKED_FLING,
|
| + ENTER_EXPANDED_FROM_MAXIMIZED_SWIPE,
|
| + ENTER_EXPANDED_FROM_MAXIMIZED_FLING,
|
| + ENTER_EXPANDED_FROM_COUNT,
|
| +};
|
| +
|
| +// Entry code: first entry into MAXIMIZED.
|
| +const char* const kUMAContextualSearchEnterMaximizedHistogram =
|
| + "Search.ContextualSearchEnterMaximized";
|
| +enum ContextualSearchMaximizedReason {
|
| + ENTER_MAXIMIZED_FROM_OTHER = 0,
|
| + ENTER_MAXIMIZED_FROM_PEEKED_SWIPE,
|
| + ENTER_MAXIMIZED_FROM_PEEKED_FLING,
|
| + ENTER_MAXIMIZED_FROM_EXPANDED_SWIPE,
|
| + ENTER_MAXIMIZED_FROM_EXPANDED_FLING,
|
| + ENTER_MAXIMIZED_FROM_EXPANDED_SERP_NAVIGATION,
|
| + ENTER_MAXIMIZED_FROM_COUNT,
|
| +};
|
| +
|
| +// Exit code: first exit from CLOSED (or UNDEFINED).
|
| +const char* const kUMAContextualSearchExitClosedHistogram =
|
| + "Search.ContextualSearchExitClosed";
|
| +enum ContextualSearchClosedExit {
|
| + EXIT_CLOSED_TO_OTHER = 0,
|
| + EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_TAP,
|
| + EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_LONG_PRESS,
|
| + EXIT_CLOSED_TO_COUNT,
|
| +};
|
| +
|
| +// Exit code: first exit from PEEKED.
|
| +const char* const kUMAContextualSearchExitPeekedHistogram =
|
| + "Search.ContextualSearchExitPeeked";
|
| +enum ContextualSearchPeekedExit {
|
| + EXIT_PEEKED_TO_OTHER = 0,
|
| + EXIT_PEEKED_TO_CLOSED_BACK_PRESS,
|
| + EXIT_PEEKED_TO_CLOSED_BASE_PAGE_SCROLL,
|
| + EXIT_PEEKED_TO_CLOSED_TEXT_SELECT_TAP,
|
| + EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_TAP,
|
| + EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_LONG_PRESS,
|
| + EXIT_PEEKED_TO_EXPANDED_SEARCH_BAR_TAP,
|
| + EXIT_PEEKED_TO_EXPANDED_SWIPE,
|
| + EXIT_PEEKED_TO_EXPANDED_FLING,
|
| + EXIT_PEEKED_TO_MAXIMIZED_SWIPE,
|
| + EXIT_PEEKED_TO_MAXIMIZED_FLING,
|
| + EXIT_PEEKED_TO_COUNT,
|
| +};
|
| +
|
| +// Exit code: first exit from EXPANDED.
|
| +const char* const kUMAContextualSearchExitExpandedHistogram =
|
| + "Search.ContextualSearchExitExpanded";
|
| +enum ContextualSearchExpandedExit {
|
| + EXIT_EXPANDED_TO_OTHER = 0,
|
| + EXIT_EXPANDED_TO_CLOSED_BACK_PRESS,
|
| + EXIT_EXPANDED_TO_CLOSED_BASE_PAGE_TAP,
|
| + EXIT_EXPANDED_TO_CLOSED_FLING,
|
| + EXIT_EXPANDED_TO_PEEKED_SEARCH_BAR_TAP,
|
| + EXIT_EXPANDED_TO_PEEKED_SWIPE,
|
| + EXIT_EXPANDED_TO_PEEKED_FLING,
|
| + EXIT_EXPANDED_TO_MAXIMIZED_SWIPE,
|
| + EXIT_EXPANDED_TO_MAXIMIZED_FLING,
|
| + EXIT_EXPANDED_TO_MAXIMIZED_SERP_NAVIGATION,
|
| + EXIT_EXPANDED_TO_COUNT,
|
| +};
|
| +
|
| +// Exit code: first exit from MAXIMIZED.
|
| +const char* const kUMAContextualSearchExitMaximizedHistogram =
|
| + "Search.ContextualSearchExitMaximized";
|
| +enum ContextualSearchMaximizedExit {
|
| + EXIT_MAXIMIZED_TO_OTHER = 0,
|
| + EXIT_MAXIMIZED_TO_CLOSED_BACK_PRESS,
|
| + EXIT_MAXIMIZED_TO_CLOSED_FLING,
|
| + EXIT_MAXIMIZED_TO_CLOSED_TAB_PROMOTION,
|
| + EXIT_MAXIMIZED_TO_CLOSED_SERP_NAVIGATION,
|
| + EXIT_MAXIMIZED_TO_PEEKED_SWIPE,
|
| + EXIT_MAXIMIZED_TO_PEEKED_FLING,
|
| + EXIT_MAXIMIZED_TO_EXPANDED_SWIPE,
|
| + EXIT_MAXIMIZED_TO_EXPANDED_FLING,
|
| + EXIT_MAXIMIZED_TO_COUNT,
|
| +};
|
| +
|
| +// Panel states that match UMA enum names.
|
| +enum PanelState { UNDEFINED, CLOSED, PEEKED, EXPANDED, MAXIMIZED };
|
| +
|
| +// Utility method to convert enter transition (|from_state|, CLOSED, |reason|)
|
| +// to UMA histogram value.
|
| +int EnterClosedStateChanges(PanelState from_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (from_state) {
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::BACK_PRESS:
|
| + return ENTER_CLOSED_FROM_PEEKED_BACK_PRESS;
|
| + case ContextualSearch::BASE_PAGE_SCROLL:
|
| + return ENTER_CLOSED_FROM_PEEKED_BASE_PAGE_SCROLL;
|
| + case ContextualSearch::TEXT_SELECT_TAP:
|
| + return ENTER_CLOSED_FROM_PEEKED_TEXT_SELECT_TAP;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case EXPANDED:
|
| + switch (reason) {
|
| + case ContextualSearch::BACK_PRESS:
|
| + return ENTER_CLOSED_FROM_EXPANDED_BACK_PRESS;
|
| + case ContextualSearch::BASE_PAGE_TAP:
|
| + return ENTER_CLOSED_FROM_EXPANDED_BASE_PAGE_TAP;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_CLOSED_FROM_EXPANDED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case MAXIMIZED:
|
| + switch (reason) {
|
| + case ContextualSearch::BACK_PRESS:
|
| + return ENTER_CLOSED_FROM_MAXIMIZED_BACK_PRESS;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_CLOSED_FROM_MAXIMIZED_FLING;
|
| + case ContextualSearch::TAB_PROMOTION:
|
| + return ENTER_CLOSED_FROM_MAXIMIZED_TAB_PROMOTION;
|
| + case ContextualSearch::SERP_NAVIGATION:
|
| + return ENTER_CLOSED_FROM_MAXIMIZED_SERP_NAVIGATION;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter transition (|from_state|, PEEKED, |reason|)
|
| +// to UMA histogram value.
|
| +int EnterPeekedStateChanges(PanelState from_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (from_state) {
|
| + case CLOSED:
|
| + switch (reason) {
|
| + case ContextualSearch::TEXT_SELECT_TAP:
|
| + return ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_TAP;
|
| + case ContextualSearch::TEXT_SELECT_LONG_PRESS:
|
| + return ENTER_PEEKED_FROM_CLOSED_TEXT_SELECT_LONG_PRESS;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::TEXT_SELECT_TAP:
|
| + return ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_TAP;
|
| + case ContextualSearch::TEXT_SELECT_LONG_PRESS:
|
| + return ENTER_PEEKED_FROM_PEEKED_TEXT_SELECT_LONG_PRESS;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case EXPANDED:
|
| + switch (reason) {
|
| + case ContextualSearch::SEARCH_BAR_TAP:
|
| + return ENTER_PEEKED_FROM_EXPANDED_SEARCH_BAR_TAP;
|
| + case ContextualSearch::SWIPE:
|
| + return ENTER_PEEKED_FROM_EXPANDED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_PEEKED_FROM_EXPANDED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case MAXIMIZED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return ENTER_PEEKED_FROM_MAXIMIZED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_PEEKED_FROM_MAXIMIZED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter transition (|from_state|, EXPANDED, |reason|)
|
| +// to UMA histogram value.
|
| +int EnterExpandedStateChanges(PanelState from_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (from_state) {
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::SEARCH_BAR_TAP:
|
| + return ENTER_EXPANDED_FROM_PEEKED_SEARCH_BAR_TAP;
|
| + case ContextualSearch::SWIPE:
|
| + return ENTER_EXPANDED_FROM_PEEKED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_EXPANDED_FROM_PEEKED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case MAXIMIZED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return ENTER_EXPANDED_FROM_MAXIMIZED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_EXPANDED_FROM_MAXIMIZED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter transition
|
| +// (|from_state|, MAXIMIZED, |reason|) to UMA histogram value.
|
| +int EnterMaximizedStateChanges(PanelState from_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (from_state) {
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return ENTER_MAXIMIZED_FROM_PEEKED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_MAXIMIZED_FROM_PEEKED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case EXPANDED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return ENTER_MAXIMIZED_FROM_EXPANDED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return ENTER_MAXIMIZED_FROM_EXPANDED_FLING;
|
| + case ContextualSearch::SERP_NAVIGATION:
|
| + return ENTER_MAXIMIZED_FROM_EXPANDED_SERP_NAVIGATION;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter exit (CLOSED, |to_state|, |reason|)
|
| +// to UMA histogram value.
|
| +int ExitClosedStateChanges(PanelState to_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (to_state) {
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::TEXT_SELECT_TAP:
|
| + return EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_TAP;
|
| + case ContextualSearch::TEXT_SELECT_LONG_PRESS:
|
| + return EXIT_CLOSED_TO_PEEKED_TEXT_SELECT_LONG_PRESS;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter exit (PEEKED, |to_state|, |reason|)
|
| +// to UMA histogram value.
|
| +int ExitPeekedStateChanges(PanelState to_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (to_state) {
|
| + case CLOSED:
|
| + switch (reason) {
|
| + case ContextualSearch::BACK_PRESS:
|
| + return EXIT_PEEKED_TO_CLOSED_BACK_PRESS;
|
| + case ContextualSearch::BASE_PAGE_SCROLL:
|
| + return EXIT_PEEKED_TO_CLOSED_BASE_PAGE_SCROLL;
|
| + case ContextualSearch::TEXT_SELECT_TAP:
|
| + return EXIT_PEEKED_TO_CLOSED_TEXT_SELECT_TAP;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::TEXT_SELECT_TAP:
|
| + return EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_TAP;
|
| + case ContextualSearch::TEXT_SELECT_LONG_PRESS:
|
| + return EXIT_PEEKED_TO_PEEKED_TEXT_SELECT_LONG_PRESS;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case EXPANDED:
|
| + switch (reason) {
|
| + case ContextualSearch::SEARCH_BAR_TAP:
|
| + return EXIT_PEEKED_TO_EXPANDED_SEARCH_BAR_TAP;
|
| + case ContextualSearch::SWIPE:
|
| + return EXIT_PEEKED_TO_EXPANDED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_PEEKED_TO_EXPANDED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case MAXIMIZED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return EXIT_PEEKED_TO_MAXIMIZED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_PEEKED_TO_MAXIMIZED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter exit (EXPANDED, |to_state|, |reason|)
|
| +// to UMA histogram value.
|
| +int ExitExpandedStateChanges(PanelState to_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (to_state) {
|
| + case CLOSED:
|
| + switch (reason) {
|
| + case ContextualSearch::BACK_PRESS:
|
| + return EXIT_EXPANDED_TO_CLOSED_BACK_PRESS;
|
| + case ContextualSearch::BASE_PAGE_TAP:
|
| + return EXIT_EXPANDED_TO_CLOSED_BASE_PAGE_TAP;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_EXPANDED_TO_CLOSED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::SEARCH_BAR_TAP:
|
| + return EXIT_EXPANDED_TO_PEEKED_SEARCH_BAR_TAP;
|
| + case ContextualSearch::SWIPE:
|
| + return EXIT_EXPANDED_TO_PEEKED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_EXPANDED_TO_PEEKED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case MAXIMIZED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return EXIT_EXPANDED_TO_MAXIMIZED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_EXPANDED_TO_MAXIMIZED_FLING;
|
| + case ContextualSearch::SERP_NAVIGATION:
|
| + return EXIT_EXPANDED_TO_MAXIMIZED_SERP_NAVIGATION;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method to convert enter exit (MAXIMIZED, |to_state|, |reason|)
|
| +// to UMA histogram value.
|
| +int ExitMaximizedStateChanges(PanelState to_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + int default_code) {
|
| + switch (to_state) {
|
| + case CLOSED:
|
| + switch (reason) {
|
| + case ContextualSearch::BACK_PRESS:
|
| + return EXIT_MAXIMIZED_TO_CLOSED_BACK_PRESS;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_MAXIMIZED_TO_CLOSED_FLING;
|
| + case ContextualSearch::TAB_PROMOTION:
|
| + return EXIT_MAXIMIZED_TO_CLOSED_TAB_PROMOTION;
|
| + case ContextualSearch::SERP_NAVIGATION:
|
| + return EXIT_MAXIMIZED_TO_CLOSED_SERP_NAVIGATION;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case PEEKED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return EXIT_MAXIMIZED_TO_PEEKED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_MAXIMIZED_TO_PEEKED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + case EXPANDED:
|
| + switch (reason) {
|
| + case ContextualSearch::SWIPE:
|
| + return EXIT_MAXIMIZED_TO_EXPANDED_SWIPE;
|
| + case ContextualSearch::FLING:
|
| + return EXIT_MAXIMIZED_TO_EXPANDED_FLING;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return default_code;
|
| +}
|
| +
|
| +// Utility method that extracts a state change UMA enum value
|
| +int getStateChangeCode(PanelState from_state,
|
| + ContextualSearch::StateChangeReason reason,
|
| + PanelState to_state,
|
| + bool entry,
|
| + int default_code) {
|
| + if (entry) {
|
| + DCHECK_NE(from_state, UNDEFINED);
|
| + switch (to_state) {
|
| + case CLOSED:
|
| + return EnterClosedStateChanges(from_state, reason, default_code);
|
| + case PEEKED:
|
| + return EnterPeekedStateChanges(from_state, reason, default_code);
|
| + case EXPANDED:
|
| + return EnterExpandedStateChanges(from_state, reason, default_code);
|
| + case MAXIMIZED:
|
| + return EnterMaximizedStateChanges(from_state, reason, default_code);
|
| + default:
|
| + return default_code;
|
| + }
|
| + } else {
|
| + switch (from_state) {
|
| + case UNDEFINED:
|
| + case CLOSED:
|
| + return ExitClosedStateChanges(to_state, reason, default_code);
|
| + case PEEKED:
|
| + return ExitPeekedStateChanges(to_state, reason, default_code);
|
| + case EXPANDED:
|
| + return ExitExpandedStateChanges(to_state, reason, default_code);
|
| + case MAXIMIZED:
|
| + return ExitMaximizedStateChanges(to_state, reason, default_code);
|
| + default:
|
| + return default_code;
|
| + }
|
| + }
|
| +}
|
| +
|
| +// Utility method that maps ContextualSearch::PanelStates to PanelStates.
|
| +PanelState panelState(ContextualSearch::PanelState state) {
|
| + switch (state) {
|
| + case ContextualSearch::UNDEFINED:
|
| + return UNDEFINED;
|
| + case ContextualSearch::DISMISSED:
|
| + return CLOSED;
|
| + case ContextualSearch::PEEKING:
|
| + return PEEKED;
|
| + case ContextualSearch::PREVIEWING:
|
| + return EXPANDED;
|
| + case ContextualSearch::COVERING:
|
| + return MAXIMIZED;
|
| + default:
|
| + NOTREACHED() << "Exciting new ContextualSearchPanel state found!";
|
| + return UNDEFINED;
|
| + }
|
| +}
|
| +
|
| +// Utility method that mapse xternal pref state enum value into internal pref
|
| +// state histogram value (note that we want to keep these decoupled).
|
| +ContextualSearchPrefState getPrefState(
|
| + TouchToSearch::TouchToSearchPreferenceState prefState) {
|
| + switch (prefState) {
|
| + case TouchToSearch::DISABLED:
|
| + return PREFERENCE_DISABLED;
|
| + case TouchToSearch::ENABLED:
|
| + return PREFERENCE_ENABLED;
|
| + case TouchToSearch::UNDECIDED:
|
| + return PREFERENCE_UNINITIALIZED;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| +// Utility method for recording the results-seen metric common to multiple
|
| +// metrics calls.
|
| +void RecordResultsSeen(bool seen) {
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchSearchResultsSeenHistogram,
|
| + seen ? RESULTS_SEEN : RESULTS_NOT_SEEN, RESULTS_SEEN_COUNT, 1);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace ContextualSearch {
|
| +
|
| +void RecordPreferenceState(TouchToSearch::TouchToSearchPreferenceState state) {
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(kUMAContextualSearchPreferenceStateHistogram,
|
| + getPrefState(state),
|
| + PREFERENCE_HISTOGRAM_COUNT, 1);
|
| +}
|
| +
|
| +void RecordPreferenceChanged(bool enabled) {
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchPreferenceStateChangeHistogram,
|
| + enabled ? PREFERENCE_ENABLED : PREFERENCE_DISABLED,
|
| + PREFERENCE_HISTOGRAM_COUNT, 1);
|
| +}
|
| +
|
| +void RecordFirstRunFlowOutcome(
|
| + TouchToSearch::TouchToSearchPreferenceState state) {
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchFirstRunFlowOutcomeHistogram, getPrefState(state),
|
| + PREFERENCE_HISTOGRAM_COUNT, 1);
|
| +}
|
| +
|
| +void RecordDuration(bool resultsSeen, bool chained, base::TimeDelta duration) {
|
| + if (resultsSeen) {
|
| + LOGGED_UMA_HISTOGRAM_TIMES(kUMAContextualSearchDurationSeenHistogram,
|
| + duration, 1);
|
| + } else if (chained) {
|
| + LOGGED_UMA_HISTOGRAM_TIMES(
|
| + kUMAContextualSearchDurationUnseenChainedHistogram, duration, 1);
|
| + } else {
|
| + LOGGED_UMA_HISTOGRAM_TIMES(kUMAContextualSearchDurationUnseenHistogram,
|
| + duration, 1);
|
| + }
|
| +}
|
| +
|
| +void RecordTimeToSearch(base::TimeDelta duration) {
|
| + LOGGED_UMA_HISTOGRAM_TIMES(kUMAContextualSearchTimeToSearchHistogram,
|
| + duration, 1);
|
| +}
|
| +
|
| +void RecordFirstRunPanelSeen(bool seen) {
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchFirstRunPanelSeenHistogram,
|
| + seen ? RESULTS_SEEN : RESULTS_NOT_SEEN, RESULTS_SEEN_COUNT, 1);
|
| +}
|
| +
|
| +void RecordTapResultsSeen(bool seen) {
|
| + RecordResultsSeen(seen);
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchSearchResultsSeenByGestureHistogram,
|
| + seen ? RESULTS_FROM_TAP_SEEN : RESULTS_FROM_TAP_NOT_SEEN,
|
| + RESULTS_SEEN_BY_GESTURE_COUNT, 1);
|
| +}
|
| +
|
| +void RecordSelectionResultsSeen(bool seen) {
|
| + RecordResultsSeen(seen);
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchSearchResultsSeenByGestureHistogram,
|
| + seen ? RESULTS_FROM_SELECT_SEEN : RESULTS_FROM_SELECT_NOT_SEEN,
|
| + RESULTS_SEEN_BY_GESTURE_COUNT, 1);
|
| +}
|
| +
|
| +void RecordSelectionIsValid(bool valid) {
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(kUMAContextualSearchSelectionValidHistogram,
|
| + valid ? SELECTION_VALID : SELECTION_INVALID,
|
| + SELECTION_VALIDITY_COUNT, 1);
|
| +}
|
| +
|
| +void RecordFirstStateEntry(PanelState from_state,
|
| + PanelState to_state,
|
| + StateChangeReason reason) {
|
| + switch (panelState(to_state)) {
|
| + case CLOSED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchEnterClosedHistogram,
|
| + getStateChangeCode(panelState(from_state), reason, CLOSED, true,
|
| + ENTER_CLOSED_FROM_OTHER),
|
| + ENTER_CLOSED_FROM_COUNT, 1);
|
| + break;
|
| + case PEEKED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchEnterPeekedHistogram,
|
| + getStateChangeCode(panelState(from_state), reason, PEEKED, true,
|
| + ENTER_PEEKED_FROM_OTHER),
|
| + ENTER_PEEKED_FROM_COUNT, 1);
|
| + break;
|
| + case EXPANDED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchEnterExpandedHistogram,
|
| + getStateChangeCode(panelState(from_state), reason, EXPANDED, true,
|
| + ENTER_EXPANDED_FROM_OTHER),
|
| + ENTER_EXPANDED_FROM_COUNT, 1);
|
| + break;
|
| + case MAXIMIZED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchEnterMaximizedHistogram,
|
| + getStateChangeCode(panelState(from_state), reason, MAXIMIZED, true,
|
| + ENTER_MAXIMIZED_FROM_OTHER),
|
| + ENTER_MAXIMIZED_FROM_COUNT, 1);
|
| + break;
|
| + default:
|
| + NOTREACHED() << "RecordFirstStateEntry for unexpected state " << to_state;
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void RecordFirstStateExit(PanelState from_state,
|
| + PanelState to_state,
|
| + StateChangeReason reason) {
|
| + switch (panelState(from_state)) {
|
| + case CLOSED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchExitClosedHistogram,
|
| + getStateChangeCode(CLOSED, reason, panelState(to_state), false,
|
| + EXIT_CLOSED_TO_OTHER),
|
| + EXIT_CLOSED_TO_COUNT, 1);
|
| + break;
|
| + case PEEKED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchExitPeekedHistogram,
|
| + getStateChangeCode(PEEKED, reason, panelState(to_state), false,
|
| + EXIT_PEEKED_TO_OTHER),
|
| + EXIT_PEEKED_TO_COUNT, 1);
|
| + break;
|
| + case EXPANDED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchExitExpandedHistogram,
|
| + getStateChangeCode(EXPANDED, reason, panelState(to_state), false,
|
| + EXIT_EXPANDED_TO_OTHER),
|
| + EXIT_EXPANDED_TO_COUNT, 1);
|
| + break;
|
| + case MAXIMIZED:
|
| + LOGGED_UMA_HISTOGRAM_ENUMERATION(
|
| + kUMAContextualSearchExitMaximizedHistogram,
|
| + getStateChangeCode(MAXIMIZED, reason, panelState(to_state), false,
|
| + EXIT_MAXIMIZED_TO_OTHER),
|
| + EXIT_MAXIMIZED_TO_COUNT, 1);
|
| + break;
|
| + default:
|
| + NOTREACHED() << "RecordFirstStateExit for unexpected state " << to_state;
|
| + break;
|
| + }
|
| +}
|
| +
|
| +} // namespace ContextualSearch
|
|
|