From 553ba00a27408b8e8f6203bb1803575754876591 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Wed, 21 Dec 2016 11:03:45 -0800 Subject: [PATCH] Add metric event for skipping support disclaimer in future We were not recording when users selected to skip the support disclaimer in future requests for support. This event has been added and logged when it occurs. Test: SettingsRoboTests Bug: 33414180 Change-Id: I689580ea2256d5554afcd17e77f90ae498d4ad1b --- .../SupportDisclaimerDialogFragment.java | 7 +- .../SupportDisclaimerDialogFragmentTest.java | 118 ++++++++++++++++++ .../shadow/SettingsShadowResources.java | 2 +- 3 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java diff --git a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java index 3a7102c05b7..07a451a0865 100644 --- a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java +++ b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java @@ -95,10 +95,15 @@ public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFra final Activity activity = getActivity(); final CheckBox doNotShow = (CheckBox) getDialog().findViewById(R.id.support_disclaimer_do_not_show_again); + final boolean isChecked = doNotShow.isChecked(); final SupportFeatureProvider supportFeatureProvider = FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity); - supportFeatureProvider.setShouldShowDisclaimerDialog(getContext(), !doNotShow.isChecked()); + supportFeatureProvider.setShouldShowDisclaimerDialog(getContext(), !isChecked); final Bundle bundle = getArguments(); + if (isChecked) { + mMetricsFeatureProvider.action(activity, + MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED); + } mMetricsFeatureProvider.action(activity, MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_OK); supportFeatureProvider.startSupport(getActivity(), diff --git a/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java b/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java new file mode 100644 index 00000000000..8f0484daf43 --- /dev/null +++ b/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java @@ -0,0 +1,118 @@ +package com.android.settings.support; + +import android.accounts.Account; +import android.annotation.NonNull; +import android.annotation.StringRes; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; +import android.text.Spannable; +import android.text.style.URLSpan; +import android.widget.CheckBox; +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.overlay.SupportFeatureProvider; +import com.android.settings.overlay.SupportFeatureProvider.SupportType; +import com.android.settings.support.SupportDisclaimerDialogFragmentTest.SupportDisclaimerShadowResources; +import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.SettingsShadowResources; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.util.FragmentTestUtil; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.robolectric.internal.Shadow.directlyOn; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = {SupportDisclaimerShadowResources.class}) +public class SupportDisclaimerDialogFragmentTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + Context mContext; + private FakeFeatureFactory mFakeFeatureFactory; + private MetricsFeatureProvider mMetricsFeatureProvider; + private SupportFeatureProvider mSupportFeatureProvider; + + private final Account mFakeAccount = new Account("user1", "fake_type"); + + private static final int FAKE_RES_ID = -1000; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(mContext); + mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); + mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider(); + mSupportFeatureProvider = mFakeFeatureFactory.getSupportFeatureProvider(mContext); + when(mSupportFeatureProvider.getDisclaimerStringResId()) + .thenReturn(FAKE_RES_ID); + } + + @Test + public void onClick_DoNotShowCheckedLogsAction() { + SupportDisclaimerDialogFragment fragment = + SupportDisclaimerDialogFragment.newInstance(mFakeAccount, SupportType.CHAT); + FragmentTestUtil.startFragment(fragment); + + // pretend the user selected to skip the dialog in the future + CheckBox doNotShow = (CheckBox) fragment.getDialog() + .findViewById(R.id.support_disclaimer_do_not_show_again); + doNotShow.setChecked(true); + + // verify we logged the action + fragment.onClick(fragment.getDialog(), Dialog.BUTTON_POSITIVE); + verify(mMetricsFeatureProvider, times(1)).action(any(), + eq(MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED)); + } + + @Test + public void onClick_DoNotShowUncheckedDoesNotLogAction() { + SupportDisclaimerDialogFragment fragment = + SupportDisclaimerDialogFragment.newInstance(mFakeAccount, SupportType.CHAT); + FragmentTestUtil.startFragment(fragment); + + // pretend the user selected to skip the dialog in the future + CheckBox doNotShow = (CheckBox) fragment.getDialog() + .findViewById(R.id.support_disclaimer_do_not_show_again); + doNotShow.setChecked(false); + + // verify we logged the action + fragment.onClick(fragment.getDialog(), Dialog.BUTTON_POSITIVE); + verify(mMetricsFeatureProvider, never()).action(any(), + eq(MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED)); + } + + @Implements(Resources.class) + public static class SupportDisclaimerShadowResources extends SettingsShadowResources { + + @Implementation + @NonNull public CharSequence getText(@StringRes int id) throws NotFoundException { + if (id == FAKE_RES_ID) { + Spannable text = Spannable.Factory.getInstance() + .newSpannable("string with url"); + text.setSpan(new URLSpan("https://google.com"), 0, 1, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return text; + } + return directlyOn(realResources, Resources.class).getText(id); + } + } + +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java index 51a187b9d7d..3a1e0b7b41f 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java @@ -35,7 +35,7 @@ import static org.robolectric.internal.Shadow.directlyOn; @Implements(Resources.class) public class SettingsShadowResources extends ShadowResources { - @RealObject Resources realResources; + @RealObject public Resources realResources; @Implementation public int getDimensionPixelSize(@DimenRes int id) throws NotFoundException {