Merge "Add metric event for skipping support disclaimer in future"
This commit is contained in:
committed by
Android (Google) Code Review
commit
f349b07f96
@@ -95,10 +95,15 @@ public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFra
|
|||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
final CheckBox doNotShow =
|
final CheckBox doNotShow =
|
||||||
(CheckBox) getDialog().findViewById(R.id.support_disclaimer_do_not_show_again);
|
(CheckBox) getDialog().findViewById(R.id.support_disclaimer_do_not_show_again);
|
||||||
|
final boolean isChecked = doNotShow.isChecked();
|
||||||
final SupportFeatureProvider supportFeatureProvider =
|
final SupportFeatureProvider supportFeatureProvider =
|
||||||
FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
|
FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
|
||||||
supportFeatureProvider.setShouldShowDisclaimerDialog(getContext(), !doNotShow.isChecked());
|
supportFeatureProvider.setShouldShowDisclaimerDialog(getContext(), !isChecked);
|
||||||
final Bundle bundle = getArguments();
|
final Bundle bundle = getArguments();
|
||||||
|
if (isChecked) {
|
||||||
|
mMetricsFeatureProvider.action(activity,
|
||||||
|
MetricsProto.MetricsEvent.ACTION_SKIP_DISCLAIMER_SELECTED);
|
||||||
|
}
|
||||||
mMetricsFeatureProvider.action(activity,
|
mMetricsFeatureProvider.action(activity,
|
||||||
MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_OK);
|
MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_OK);
|
||||||
supportFeatureProvider.startSupport(getActivity(),
|
supportFeatureProvider.startSupport(getActivity(),
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -35,7 +35,7 @@ import static org.robolectric.internal.Shadow.directlyOn;
|
|||||||
@Implements(Resources.class)
|
@Implements(Resources.class)
|
||||||
public class SettingsShadowResources extends ShadowResources {
|
public class SettingsShadowResources extends ShadowResources {
|
||||||
|
|
||||||
@RealObject Resources realResources;
|
@RealObject public Resources realResources;
|
||||||
|
|
||||||
@Implementation
|
@Implementation
|
||||||
public int getDimensionPixelSize(@DimenRes int id) throws NotFoundException {
|
public int getDimensionPixelSize(@DimenRes int id) throws NotFoundException {
|
||||||
|
|||||||
Reference in New Issue
Block a user