Commit 61a28d68 authored by Troy Hildebrandt's avatar Troy Hildebrandt Committed by Commit Bot

Fix microphone button not working from widget on home screen.

When tapping the microphone button on the search widget on the home
screen, #isVoiceSearchEnabled would return false because we were trying
to get WindowAndroid from the Tab, which doesn't exist in this case.

We now rely on getting the WindowAndroid from the LocationBar so the
two agree. What happened as a result is that recording metrics would
fail almost every startup, if the call to RecordHistogram.record* was
called before native was initialized, so CachedMetrics is used now.

Bug: 831985
Change-Id: I34c4dbe46afd42c1d793e737a48c45dc3430701d
Reviewed-on: https://chromium-review.googlesource.com/1010772
Commit-Queue: Troy Hildebrandt <thildebr@chromium.org>
Reviewed-by: default avatarMaria Khomenko <mariakhomenko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#550353}
parent a34e731a
...@@ -2524,4 +2524,9 @@ public class LocationBarLayout ...@@ -2524,4 +2524,9 @@ public class LocationBarLayout
public AutocompleteController getAutocompleteController() { public AutocompleteController getAutocompleteController() {
return mAutocomplete; return mAutocomplete;
} }
@Override
public WindowAndroid getWindowAndroid() {
return mWindowAndroid;
}
} }
...@@ -15,7 +15,7 @@ import android.support.annotation.Nullable; ...@@ -15,7 +15,7 @@ import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.text.TextUtils; import android.text.TextUtils;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.CachedMetrics;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.omnibox.VoiceSuggestionProvider.VoiceResult; import org.chromium.chrome.browser.omnibox.VoiceSuggestionProvider.VoiceResult;
import org.chromium.chrome.browser.search_engines.TemplateUrlService; import org.chromium.chrome.browser.search_engines.TemplateUrlService;
...@@ -37,6 +37,23 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -37,6 +37,23 @@ public class LocationBarVoiceRecognitionHandler {
@VisibleForTesting @VisibleForTesting
public static final float VOICE_SEARCH_CONFIDENCE_NAVIGATE_THRESHOLD = 0.9f; public static final float VOICE_SEARCH_CONFIDENCE_NAVIGATE_THRESHOLD = 0.9f;
private static final CachedMetrics
.EnumeratedHistogramSample VOICE_INTERACTION_START_SOURCE_METRIC =
new CachedMetrics.EnumeratedHistogramSample(
"VoiceInteraction.StartEventSource", VoiceInteractionSource.HISTOGRAM_BOUNDARY);
private static final CachedMetrics
.EnumeratedHistogramSample VOICE_INTERACTION_FINISH_SOURCE_METRIC =
new CachedMetrics.EnumeratedHistogramSample("VoiceInteraction.FinishEventSource",
VoiceInteractionSource.HISTOGRAM_BOUNDARY);
private static final CachedMetrics.BooleanHistogramSample VOICE_SEARCH_RESULT_METRIC =
new CachedMetrics.BooleanHistogramSample("VoiceInteraction.VoiceSearchResult");
// There's no percentage histogram sample in CachedMetrics, so we mimic what that does
// internally.
private static final CachedMetrics
.EnumeratedHistogramSample VOICE_SEARCH_CONFIDENCE_VALUE_METRIC =
new CachedMetrics.EnumeratedHistogramSample(
"VoiceInteraction.VoiceResultConfidenceValue", 101);
final private Delegate mDelegate; final private Delegate mDelegate;
private WebContentsObserver mVoiceSearchWebContentsObserver; private WebContentsObserver mVoiceSearchWebContentsObserver;
...@@ -87,6 +104,11 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -87,6 +104,11 @@ public class LocationBarVoiceRecognitionHandler {
* {@link LocationBarLayout}. * {@link LocationBarLayout}.
*/ */
AutocompleteController getAutocompleteController(); AutocompleteController getAutocompleteController();
/**
* @return The current {@link WindowAndroid}.
*/
WindowAndroid getWindowAndroid();
} }
public LocationBarVoiceRecognitionHandler(Delegate delegate) { public LocationBarVoiceRecognitionHandler(Delegate delegate) {
...@@ -200,9 +222,7 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -200,9 +222,7 @@ public class LocationBarVoiceRecognitionHandler {
* @param source The source of the voice recognition initiation, such as NTP or omnibox. * @param source The source of the voice recognition initiation, such as NTP or omnibox.
*/ */
public void startVoiceRecognition(@VoiceInteractionSource int source) { public void startVoiceRecognition(@VoiceInteractionSource int source) {
Tab tab = getCurrentTab(); WindowAndroid windowAndroid = mDelegate.getWindowAndroid();
if (tab == null) return;
WindowAndroid windowAndroid = tab.getWindowAndroid();
if (windowAndroid == null) return; if (windowAndroid == null) return;
Activity activity = windowAndroid.getActivity().get(); Activity activity = windowAndroid.getActivity().get();
if (activity == null) return; if (activity == null) return;
...@@ -268,13 +288,11 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -268,13 +288,11 @@ public class LocationBarVoiceRecognitionHandler {
* @return Whether or not voice search is enabled. * @return Whether or not voice search is enabled.
*/ */
public boolean isVoiceSearchEnabled() { public boolean isVoiceSearchEnabled() {
Tab tab = getCurrentTab();
if (tab == null) return false;
ToolbarDataProvider toolbarDataProvider = mDelegate.getToolbarDataProvider(); ToolbarDataProvider toolbarDataProvider = mDelegate.getToolbarDataProvider();
if (toolbarDataProvider == null) return false; if (toolbarDataProvider == null) return false;
boolean isIncognito = toolbarDataProvider.isIncognito(); boolean isIncognito = toolbarDataProvider.isIncognito();
WindowAndroid windowAndroid = tab.getWindowAndroid(); WindowAndroid windowAndroid = mDelegate.getWindowAndroid();
if (windowAndroid == null || isIncognito) return false; if (windowAndroid == null || isIncognito) return false;
if (!windowAndroid.hasPermission(Manifest.permission.RECORD_AUDIO) if (!windowAndroid.hasPermission(Manifest.permission.RECORD_AUDIO)
...@@ -293,8 +311,7 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -293,8 +311,7 @@ public class LocationBarVoiceRecognitionHandler {
*/ */
@VisibleForTesting @VisibleForTesting
protected void recordVoiceSearchStartEventSource(@VoiceInteractionSource int source) { protected void recordVoiceSearchStartEventSource(@VoiceInteractionSource int source) {
RecordHistogram.recordEnumeratedHistogram("VoiceInteraction.StartEventSource", source, VOICE_INTERACTION_START_SOURCE_METRIC.record(source);
VoiceInteractionSource.HISTOGRAM_BOUNDARY);
} }
/** /**
...@@ -304,8 +321,7 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -304,8 +321,7 @@ public class LocationBarVoiceRecognitionHandler {
*/ */
@VisibleForTesting @VisibleForTesting
protected void recordVoiceSearchFinishEventSource(@VoiceInteractionSource int source) { protected void recordVoiceSearchFinishEventSource(@VoiceInteractionSource int source) {
RecordHistogram.recordEnumeratedHistogram("VoiceInteraction.FinishEventSource", source, VOICE_INTERACTION_FINISH_SOURCE_METRIC.record(source);
VoiceInteractionSource.HISTOGRAM_BOUNDARY);
} }
/** /**
...@@ -314,7 +330,7 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -314,7 +330,7 @@ public class LocationBarVoiceRecognitionHandler {
*/ */
@VisibleForTesting @VisibleForTesting
protected void recordVoiceSearchResult(boolean result) { protected void recordVoiceSearchResult(boolean result) {
RecordHistogram.recordBooleanHistogram("VoiceInteraction.VoiceSearchResult", result); VOICE_SEARCH_RESULT_METRIC.record(result);
} }
/** /**
...@@ -325,16 +341,7 @@ public class LocationBarVoiceRecognitionHandler { ...@@ -325,16 +341,7 @@ public class LocationBarVoiceRecognitionHandler {
@VisibleForTesting @VisibleForTesting
protected void recordVoiceSearchConfidenceValue(float value) { protected void recordVoiceSearchConfidenceValue(float value) {
int percentage = Math.round(value * 100f); int percentage = Math.round(value * 100f);
RecordHistogram.recordPercentageHistogram( VOICE_SEARCH_CONFIDENCE_VALUE_METRIC.record(percentage);
"VoiceInteraction.VoiceResultConfidenceValue", percentage);
}
/**
* @return The currently active {@link Tab} provided by the {@link ToolbarDataProvider}.
*/
private Tab getCurrentTab() {
ToolbarDataProvider toolbarDataProvider = mDelegate.getToolbarDataProvider();
return toolbarDataProvider != null ? toolbarDataProvider.getTab() : null;
} }
/** /**
......
...@@ -257,6 +257,11 @@ public class LocationBarVoiceRecognitionHandlerTest { ...@@ -257,6 +257,11 @@ public class LocationBarVoiceRecognitionHandlerTest {
return mAutocomplete; return mAutocomplete;
} }
@Override
public WindowAndroid getWindowAndroid() {
return mWindowAndroid;
}
public boolean updatedMicButtonState() { public boolean updatedMicButtonState() {
return mUpdatedMicButtonState; return mUpdatedMicButtonState;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment