OSDN Git Service

Add metric event for skipping support disclaimer in future
authorSalvador Martinez <dehboxturtle@google.com>
Wed, 21 Dec 2016 19:03:45 +0000 (11:03 -0800)
committerSalvador Martinez <dehboxturtle@google.com>
Mon, 9 Jan 2017 23:59:41 +0000 (15:59 -0800)
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

src/com/android/settings/support/SupportDisclaimerDialogFragment.java
tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java [new file with mode: 0644]
tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java

index 3a7102c..07a451a 100644 (file)
@@ -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 (file)
index 0000000..8f0484d
--- /dev/null
@@ -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);
+        }
+    }
+
+}
index 51a187b..3a1e0b7 100644 (file)
@@ -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 {