Commit 47341945 authored by Brandon Wylie's avatar Brandon Wylie Committed by Commit Bot

Chrome/AGSA accounts match before using Assistant voice search

This is a requirement to prevent logging against the wrong account.
Once AGSA supports incognito mode, then this can be removed.

Bug: 1117271
Change-Id: I9aed4cb6bf5945e4f5e69488ba847e69474ae7be
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2530089Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Brandon Wylie <wylieb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#826040}
parent 37bc98c7
...@@ -61,7 +61,8 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU ...@@ -61,7 +61,8 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU
EligibilityFailureReason.AGSA_DOESNT_SUPPORT_VOICE_SEARCH_CHECK_NOT_COMPLETE, EligibilityFailureReason.AGSA_DOESNT_SUPPORT_VOICE_SEARCH_CHECK_NOT_COMPLETE,
EligibilityFailureReason.AGSA_DOESNT_SUPPORT_VOICE_SEARCH, EligibilityFailureReason.AGSA_DOESNT_SUPPORT_VOICE_SEARCH,
EligibilityFailureReason.CHROME_NOT_GOOGLE_SIGNED, EligibilityFailureReason.CHROME_NOT_GOOGLE_SIGNED,
EligibilityFailureReason.AGSA_NOT_GOOGLE_SIGNED, EligibilityFailureReason.MAX_VALUE}) EligibilityFailureReason.AGSA_NOT_GOOGLE_SIGNED,
EligibilityFailureReason.ACCOUNT_MISMATCH, EligibilityFailureReason.MAX_VALUE})
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@interface EligibilityFailureReason { @interface EligibilityFailureReason {
int AGSA_CANT_HANDLE_INTENT = 0; int AGSA_CANT_HANDLE_INTENT = 0;
...@@ -70,9 +71,10 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU ...@@ -70,9 +71,10 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU
int AGSA_DOESNT_SUPPORT_VOICE_SEARCH = 3; int AGSA_DOESNT_SUPPORT_VOICE_SEARCH = 3;
int CHROME_NOT_GOOGLE_SIGNED = 4; int CHROME_NOT_GOOGLE_SIGNED = 4;
int AGSA_NOT_GOOGLE_SIGNED = 5; int AGSA_NOT_GOOGLE_SIGNED = 5;
int ACCOUNT_MISMATCH = 6;
// STOP: When updating this, also update values in enums.xml. // STOP: When updating this, also update values in enums.xml.
int MAX_VALUE = 6; int MAX_VALUE = 7;
} }
/** Allows outside classes to listen for changes in this service. */ /** Allows outside classes to listen for changes in this service. */
...@@ -286,6 +288,12 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU ...@@ -286,6 +288,12 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU
return false; return false;
} }
if (!mGsaState.doesGsaAccountMatchChrome()) {
RecordHistogram.recordEnumeratedHistogram(USER_ELIGIBILITY_FAILURE_REASON_HISTOGRAM,
EligibilityFailureReason.ACCOUNT_MISMATCH, EligibilityFailureReason.MAX_VALUE);
return false;
}
return true; return true;
} }
...@@ -309,7 +317,7 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU ...@@ -309,7 +317,7 @@ public class AssistantVoiceSearchService implements TemplateUrlService.TemplateU
} }
// Allows testing the NULL case for Boolean. // Allows testing the NULL case for Boolean.
void setAgsaSupportsAssistantVoiceSearchForTesting(Boolean value) { static void setAgsaSupportsAssistantVoiceSearchForTesting(Boolean value) {
sAgsaSupportsAssistantVoiceSearch = value; sAgsaSupportsAssistantVoiceSearch = value;
} }
} }
...@@ -7,6 +7,9 @@ package org.chromium.chrome.browser.omnibox.voice; ...@@ -7,6 +7,9 @@ package org.chromium.chrome.browser.omnibox.voice;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.ASSISTANT_LAST_VERSION;
import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.ASSISTANT_VOICE_SEARCH_SUPPORTED;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
...@@ -14,6 +17,7 @@ import android.content.pm.PackageManager; ...@@ -14,6 +17,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
...@@ -26,9 +30,11 @@ import org.mockito.MockitoAnnotations; ...@@ -26,9 +30,11 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.BaseSwitches;
import org.chromium.base.metrics.test.ShadowRecordHistogram; import org.chromium.base.metrics.test.ShadowRecordHistogram;
import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.task.test.CustomShadowAsyncTask;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.DeferredStartupHandler; import org.chromium.chrome.browser.DeferredStartupHandler;
import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler;
...@@ -46,6 +52,7 @@ import org.chromium.components.search_engines.TemplateUrlService; ...@@ -46,6 +52,7 @@ import org.chromium.components.search_engines.TemplateUrlService;
@Config(manifest = Config.NONE, @Config(manifest = Config.NONE,
shadows = {CustomShadowAsyncTask.class, ShadowRecordHistogram.class}) shadows = {CustomShadowAsyncTask.class, ShadowRecordHistogram.class})
@Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH) @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH)
@CommandLineFlags.Add(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)
public class AssistantVoiceSearchServiceUnitTest { public class AssistantVoiceSearchServiceUnitTest {
AssistantVoiceSearchService mAssistantVoiceSearchService; AssistantVoiceSearchService mAssistantVoiceSearchService;
...@@ -61,6 +68,7 @@ public class AssistantVoiceSearchServiceUnitTest { ...@@ -61,6 +68,7 @@ public class AssistantVoiceSearchServiceUnitTest {
@Mock @Mock
ExternalAuthUtils mExternalAuthUtils; ExternalAuthUtils mExternalAuthUtils;
SharedPreferencesManager mSharedPreferencesManager;
PackageInfo mPackageInfo; PackageInfo mPackageInfo;
Context mContext; Context mContext;
...@@ -76,20 +84,29 @@ public class AssistantVoiceSearchServiceUnitTest { ...@@ -76,20 +84,29 @@ public class AssistantVoiceSearchServiceUnitTest {
ShadowRecordHistogram.reset(); ShadowRecordHistogram.reset();
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
DeferredStartupHandler.setInstanceForTests(new TestDeferredStartupHandler()); DeferredStartupHandler.setInstanceForTests(new TestDeferredStartupHandler());
mSharedPreferencesManager = SharedPreferencesManager.getInstance();
mContext = Mockito.spy(Robolectric.buildActivity(Activity.class).setup().get()); mContext = Mockito.spy(Robolectric.buildActivity(Activity.class).setup().get());
doReturn(true).when(mExternalAuthUtils).isChromeGoogleSigned(); doReturn(true).when(mExternalAuthUtils).isChromeGoogleSigned();
doReturn(true).when(mExternalAuthUtils).isGoogleSigned(IntentHandler.PACKAGE_GSA); doReturn(true).when(mExternalAuthUtils).isGoogleSigned(IntentHandler.PACKAGE_GSA);
doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle();
doReturn(false).when(mGsaState).isAgsaVersionBelowMinimum(any(), any()); doReturn(false).when(mGsaState).isAgsaVersionBelowMinimum(any(), any());
doReturn(true).when(mGsaState).canAgsaHandleIntent(any()); doReturn(true).when(mGsaState).canAgsaHandleIntent(any());
doReturn(true).when(mGsaState).agsaSupportsAssistantVoiceSearch(); doReturn(true).when(mGsaState).agsaSupportsAssistantVoiceSearch();
doReturn(true).when(mGsaState).doesGsaAccountMatchChrome();
mAssistantVoiceSearchService = new AssistantVoiceSearchService(mContext, mExternalAuthUtils, mAssistantVoiceSearchService = new AssistantVoiceSearchService(mContext, mExternalAuthUtils,
mTemplateUrlService, mGsaState, null, SharedPreferencesManager.getInstance()); mTemplateUrlService, mGsaState, null, mSharedPreferencesManager);
}
@After
public void tearDown() {
mSharedPreferencesManager.removeKey(ASSISTANT_VOICE_SEARCH_SUPPORTED);
mSharedPreferencesManager.removeKey(ASSISTANT_LAST_VERSION);
AssistantVoiceSearchService.setAgsaSupportsAssistantVoiceSearchForTesting(null);
} }
@Test @Test
@Feature("OmniboxAssistantVoiceSearch") @Feature("OmniboxAssistantVoiceSearch")
public void testStartVoiceRecognition_StartsAssistantVoiceSearch() { public void testStartVoiceRecognition_StartsAssistantVoiceSearch() {
...@@ -125,7 +142,7 @@ public class AssistantVoiceSearchServiceUnitTest { ...@@ -125,7 +142,7 @@ public class AssistantVoiceSearchServiceUnitTest {
@Test @Test
@Feature("OmniboxAssistantVoiceSearch") @Feature("OmniboxAssistantVoiceSearch")
public void testStartVoiceRecognition_StartsAssistantVoiceSearch_AGSARotiChromeNotEnabled() { public void testStartVoiceRecognition_StartsAssistantVoiceSearch_AGSARotiChromeNotEnabled() {
mAssistantVoiceSearchService.setAgsaSupportsAssistantVoiceSearchForTesting(false); AssistantVoiceSearchService.setAgsaSupportsAssistantVoiceSearchForTesting(false);
Assert.assertFalse(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch()); Assert.assertFalse(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch());
Assert.assertEquals(1, Assert.assertEquals(1,
...@@ -139,7 +156,7 @@ public class AssistantVoiceSearchServiceUnitTest { ...@@ -139,7 +156,7 @@ public class AssistantVoiceSearchServiceUnitTest {
@Feature("OmniboxAssistantVoiceSearch") @Feature("OmniboxAssistantVoiceSearch")
public void public void
testStartVoiceRecognition_StartsAssistantVoiceSearch_AGSARotiChromeNotEnabledNotComplete() { testStartVoiceRecognition_StartsAssistantVoiceSearch_AGSARotiChromeNotEnabledNotComplete() {
mAssistantVoiceSearchService.setAgsaSupportsAssistantVoiceSearchForTesting(null); AssistantVoiceSearchService.setAgsaSupportsAssistantVoiceSearchForTesting(null);
Assert.assertFalse(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch()); Assert.assertFalse(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch());
Assert.assertEquals(1, Assert.assertEquals(1,
...@@ -149,6 +166,18 @@ public class AssistantVoiceSearchServiceUnitTest { ...@@ -149,6 +166,18 @@ public class AssistantVoiceSearchServiceUnitTest {
.AGSA_DOESNT_SUPPORT_VOICE_SEARCH_CHECK_NOT_COMPLETE)); .AGSA_DOESNT_SUPPORT_VOICE_SEARCH_CHECK_NOT_COMPLETE));
} }
@Test
@Feature("OmniboxAssistantVoiceSearch")
public void testStartVoiceRecognition_StartsAssistantVoiceSearch_AccountMismatch() {
doReturn(false).when(mGsaState).doesGsaAccountMatchChrome();
Assert.assertFalse(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch());
Assert.assertEquals(1,
ShadowRecordHistogram.getHistogramValueCountForTesting(
AssistantVoiceSearchService.USER_ELIGIBILITY_FAILURE_REASON_HISTOGRAM,
AssistantVoiceSearchService.EligibilityFailureReason.ACCOUNT_MISMATCH));
}
@Test @Test
@Feature("OmniboxAssistantVoiceSearch") @Feature("OmniboxAssistantVoiceSearch")
public void testAssistantEligibility_VersionTooLow() { public void testAssistantEligibility_VersionTooLow() {
......
...@@ -20144,6 +20144,7 @@ Called by update_document_policy_enum.py.--> ...@@ -20144,6 +20144,7 @@ Called by update_document_policy_enum.py.-->
<int value="3" label="AGSA_DOESNT_SUPPORT_VOICE_SEARCH"/> <int value="3" label="AGSA_DOESNT_SUPPORT_VOICE_SEARCH"/>
<int value="4" label="CHROME_NOT_GOOGLE_SIGNED"/> <int value="4" label="CHROME_NOT_GOOGLE_SIGNED"/>
<int value="5" label="AGSA_NOT_GOOGLE_SIGNED"/> <int value="5" label="AGSA_NOT_GOOGLE_SIGNED"/>
<int value="6" label="ACCOUNT_MISMATCH"/>
</enum> </enum>
<enum name="EmbeddedWorkerStartingPhase"> <enum name="EmbeddedWorkerStartingPhase">
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