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 {