From c93d18e29c4c0c82483d87345dbfc1afae1ed2fc Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 21 Sep 2016 17:01:39 -0700 Subject: [PATCH] Use MetricsFeatureProvider for condition/suggestion/search. Bug: 31664539 Test: make RunSettingsRoboTests This allows different metric clients to listen to these events. Change-Id: Ib19c8099b16ff78d9aa4901278e0ff33eeefd4a8 --- .../settings/dashboard/DashboardAdapter.java | 24 ++-- .../settings/dashboard/DashboardSummary.java | 17 +-- .../dashboard/SearchResultsSummary.java | 7 +- .../settings/dashboard/SupportFragment.java | 4 +- .../dashboard/SupportItemAdapter.java | 20 +-- .../dashboard/conditional/Condition.java | 16 ++- .../conditional/ConditionAdapterUtils.java | 11 +- .../internal/app/NightDisplayController.java | 27 ++++ .../dashboard/conditional/ConditionTest.java | 120 ++++++++++++++++++ 9 files changed, 208 insertions(+), 38 deletions(-) create mode 100644 tests/robotests/src/com/android/internal/app/NightDisplayController.java create mode 100644 tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index ca68a740628..cc65357d738 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -33,11 +33,11 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.util.ArrayUtils; import com.android.settings.R; import com.android.settings.SettingsActivity; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.dashboard.conditional.Condition; import com.android.settings.dashboard.conditional.ConditionAdapterUtils; import com.android.settingslib.SuggestionParser; @@ -71,6 +71,7 @@ public class DashboardAdapter extends RecyclerView.Adapter mCategories; private List mConditions; @@ -85,9 +86,11 @@ public class DashboardAdapter extends RecyclerView.Adapter conditions) { + public DashboardAdapter(Context context, SuggestionParser parser, + MetricsFeatureProvider metricsFeatureProvider, Bundle savedInstanceState, + List conditions) { mContext = context; + mMetricsFeatureProvider = metricsFeatureProvider; mCache = new IconCache(context); mSuggestionParser = parser; mConditions = conditions; @@ -240,7 +243,8 @@ public class DashboardAdapter extends RecyclerView.Adapter 0); } else if (cursor != null) { diff --git a/src/com/android/settings/dashboard/SupportFragment.java b/src/com/android/settings/dashboard/SupportFragment.java index 9773a50f823..c8fed8acf7b 100644 --- a/src/com/android/settings/dashboard/SupportFragment.java +++ b/src/com/android/settings/dashboard/SupportFragment.java @@ -36,8 +36,8 @@ import android.view.View; import android.view.ViewGroup; import com.android.internal.logging.MetricsProto; -import com.android.settings.core.InstrumentedFragment; import com.android.settings.R; +import com.android.settings.core.InstrumentedFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.SupportFeatureProvider; @@ -89,7 +89,7 @@ public final class SupportFragment extends InstrumentedFragment implements View. mSupportFeatureProvider = FeatureFactory.getFactory(mActivity).getSupportFeatureProvider(mActivity); mSupportItemAdapter = new SupportItemAdapter(mActivity, savedInstanceState, - mSupportFeatureProvider, this /* itemClickListener */); + mSupportFeatureProvider, mMetricsFeatureProvider, this /* itemClickListener */); mConnectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE); } diff --git a/src/com/android/settings/dashboard/SupportItemAdapter.java b/src/com/android/settings/dashboard/SupportItemAdapter.java index 9ef6988325a..f966668a851 100644 --- a/src/com/android/settings/dashboard/SupportItemAdapter.java +++ b/src/com/android/settings/dashboard/SupportItemAdapter.java @@ -37,9 +37,9 @@ import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; -import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto; import com.android.settings.R; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.overlay.SupportFeatureProvider; import com.android.settings.support.SupportDisclaimerDialogFragment; import com.android.settings.support.SupportPhone; @@ -69,6 +69,7 @@ public final class SupportItemAdapter extends RecyclerView.Adapter mSupportData; @@ -77,9 +78,12 @@ public final class SupportItemAdapter extends RecyclerView.Adapter= 0) { - MetricsLogger.action(mActivity, data.metricsEvent); + mMetricsFeatureProvider.action(mActivity, data.metricsEvent); } mActivity.startActivityForResult(data.intent, 0); } @@ -427,7 +431,7 @@ public final class SupportItemAdapter extends RecyclerView.Adapter receiverClass = getReceiverClass(); if (receiverClass != null && shouldAlwaysListenToBroadcast()) { PackageManager pm = mManager.getContext().getPackageManager(); @@ -93,8 +102,9 @@ public abstract class Condition { public void silence() { if (!mIsSilenced) { mIsSilenced = true; - MetricsLogger.action(mManager.getContext(), - MetricsEvent.ACTION_SETTINGS_CONDITION_DISMISS, getMetricsConstant()); + Context context = mManager.getContext(); + mMetricsFeatureProvider.action(context, MetricsEvent.ACTION_SETTINGS_CONDITION_DISMISS, + getMetricsConstant()); onSilenceChanged(mIsSilenced); notifyChanged(); } diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java b/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java index a16de502d32..0c165271f01 100644 --- a/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java +++ b/src/com/android/settings/dashboard/conditional/ConditionAdapterUtils.java @@ -18,6 +18,7 @@ package com.android.settings.dashboard.conditional; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.View; @@ -25,10 +26,11 @@ import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.ImageView; -import com.android.internal.logging.MetricsLogger; + import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.dashboard.DashboardAdapter; +import com.android.settings.overlay.FeatureFactory; public class ConditionAdapterUtils { @@ -94,9 +96,10 @@ public class ConditionAdapterUtils { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - MetricsLogger.action(v.getContext(), - MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON, - condition.getMetricsConstant()); + Context context = v.getContext(); + FeatureFactory.getFactory(context).getMetricsFeatureProvider() + .action(context, MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON, + condition.getMetricsConstant()); condition.onActionClick(index); } }); diff --git a/tests/robotests/src/com/android/internal/app/NightDisplayController.java b/tests/robotests/src/com/android/internal/app/NightDisplayController.java new file mode 100644 index 00000000000..2125c19bcf5 --- /dev/null +++ b/tests/robotests/src/com/android/internal/app/NightDisplayController.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.internal.app; + +/** + * Fake controller to make robolectric test compile. Should be removed when Robolectric supports + * API 25. + */ +public class NightDisplayController { + + public interface Callback { + + } +} diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java new file mode 100644 index 00000000000..5c0c02a752d --- /dev/null +++ b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.settings.dashboard.conditional; + +import android.content.Context; +import android.graphics.drawable.Icon; + +import com.android.internal.logging.MetricsProto; +import com.android.settings.TestConfig; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class ConditionTest { + + @Mock + private ConditionManager mConditionManager; + @Mock + private MetricsFeatureProvider mMetricsFeatureProvider; + + private TestCondition mCondition; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mCondition = new TestCondition(mConditionManager, mMetricsFeatureProvider); + } + + @Test + public void initialize_shouldNotBeSilenced() { + assertThat(mCondition.isSilenced()).isFalse(); + } + + @Test + public void silence_shouldNotifyDataChangeAndLog() { + mCondition.silence(); + + assertThat(mCondition.isSilenced()).isTrue(); + verify(mConditionManager).notifyChanged(mCondition); + verify(mMetricsFeatureProvider).action(any(Context.class), + eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_DISMISS), + eq(TestCondition.TEST_METRIC_CONSTANT)); + } + + private static final class TestCondition extends Condition { + + private static final int TEST_METRIC_CONSTANT = 1234; + + TestCondition(ConditionManager manager, + MetricsFeatureProvider metricsFeatureProvider) { + super(manager, metricsFeatureProvider); + } + + @Override + public void refreshState() { + + } + + @Override + public int getMetricsConstant() { + return TEST_METRIC_CONSTANT; + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public CharSequence getTitle() { + return null; + } + + @Override + public CharSequence getSummary() { + return null; + } + + @Override + public CharSequence[] getActions() { + return new CharSequence[0]; + } + + @Override + public void onPrimaryClick() { + + } + + @Override + public void onActionClick(int index) { + + } + } +}