From 7fe6f50bf7df6cf638903b0e16fbe085a2afac08 Mon Sep 17 00:00:00 2001 From: Soroosh Mariooryad Date: Fri, 11 Aug 2017 00:04:37 -0700 Subject: [PATCH] Log smart settings suggestion enabled/disabled state for A/B experiments Test: RunSettingsRoboTests Bug: 64121058 Change-Id: I0cf4b4a0e8470cd40d38e8fe937cfb5f3e96f380 Merged-In: Iadfa575b9a21caecb515b9975d388ee0d0480c11 --- .../settings/dashboard/DashboardAdapter.java | 61 +++-- .../suggestions/SuggestionAdapter.java | 18 +- .../SuggestionFeatureProviderImpl.java | 13 +- .../suggestions/SuggestionLogHelper.java | 29 +++ .../dashboard/DashboardAdapterTest.java | 223 ++++++++++++------ .../SuggestionFeatureProviderImplTest.java | 17 +- .../suggestions/SuggestionLogHelperTest.java | 41 ++++ 7 files changed, 294 insertions(+), 108 deletions(-) create mode 100644 src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java create mode 100644 tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index c06a58fe24c..6fee28bee08 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -30,6 +30,7 @@ import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -47,6 +48,7 @@ import com.android.settings.dashboard.conditional.ConditionAdapter; import com.android.settings.dashboard.suggestions.SuggestionAdapter; import com.android.settings.dashboard.suggestions.SuggestionDismissController; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.dashboard.suggestions.SuggestionLogHelper; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.Utils; import com.android.settingslib.drawer.DashboardCategory; @@ -129,7 +131,7 @@ public class DashboardAdapter extends RecyclerView.Adapter 0 && data.conditionCount > 0 - && curMode != DashboardData.HEADER_MODE_SUGGESTION_EXPANDED - ? DashboardData.HEADER_MODE_SUGGESTION_EXPANDED - : DashboardData.HEADER_MODE_FULLY_EXPANDED; + && curMode != DashboardData.HEADER_MODE_SUGGESTION_EXPANDED + ? DashboardData.HEADER_MODE_SUGGESTION_EXPANDED + : DashboardData.HEADER_MODE_FULLY_EXPANDED; final boolean moreSuggestions = data.hiddenSuggestionCount > 0; final boolean hasConditions = data.conditionCount > 0; if (data.conditionCount > 0) { @@ -377,22 +381,22 @@ public class DashboardAdapter extends RecyclerView.Adapter 0) { holder.summary.setText(mContext.getResources().getQuantityString( - R.plurals.suggestions_collapsed_summary, - data.hiddenSuggestionCount, data.hiddenSuggestionCount)); + R.plurals.suggestions_collapsed_summary, + data.hiddenSuggestionCount, data.hiddenSuggestionCount)); } else { holder.title.setText(mContext.getResources().getQuantityString( - R.plurals.suggestions_collapsed_title, - data.hiddenSuggestionCount, data.hiddenSuggestionCount)); + R.plurals.suggestions_collapsed_title, + data.hiddenSuggestionCount, data.hiddenSuggestionCount)); holder.title.setTextColor(Color.BLACK); holder.summary.setText(null); } } else if (curMode == DashboardData.HEADER_MODE_DEFAULT) { if (data.conditionCount > 0) { holder.summary.setText(mContext.getString( - R.string.suggestions_summary, data.hiddenSuggestionCount)); + R.string.suggestions_summary, data.hiddenSuggestionCount)); } else { holder.title.setText(mContext.getString( - R.string.suggestions_more_title, data.hiddenSuggestionCount)); + R.string.suggestions_more_title, data.hiddenSuggestionCount)); holder.title.setTextColor(Color.BLACK); holder.summary.setText(null); } @@ -400,7 +404,7 @@ public class DashboardAdapter extends RecyclerView.Adapter 1) { holder.summary.setTextColor(Utils.getColorAccent(mContext)); holder.summary.setText( - mContext.getString(R.string.condition_summary, data.conditionCount)); + mContext.getString(R.string.condition_summary, data.conditionCount)); } else { holder.summary.setText(null); } @@ -413,16 +417,16 @@ public class DashboardAdapter extends RecyclerView.Adapter { - if (moreSuggestions ) { + if (moreSuggestions) { logSuggestions(); } else if (hasConditions) { mMetricsFeatureProvider.action(mContext, - MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true); + MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true); } DashboardData prevData = mDashboardData; final boolean wasCollapsed = curMode == DashboardData.HEADER_MODE_COLLAPSED; mDashboardData = new DashboardData.Builder(prevData) - .setSuggestionConditionMode(nextMode).build(); + .setSuggestionConditionMode(nextMode).build(); notifyDashboardDataChanged(prevData); if (wasCollapsed) { mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION); @@ -439,13 +443,13 @@ public class DashboardAdapter extends RecyclerView.Adapter 0) { mSuggestionAdapter = new SuggestionAdapter(mContext, (List) - mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged); + mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged); mSuggestionDismissHandler = new SuggestionDismissController(mContext, - holder.data, mSuggestionParser, mCallback); + holder.data, mSuggestionParser, mCallback); holder.data.setAdapter(mSuggestionAdapter); } else { ConditionAdapter adapter = new ConditionAdapter(mContext, - (List) mDashboardData.getItemEntityByPosition(position), + (List) mDashboardData.getItemEntityByPosition(position), mDashboardData.getSuggestionConditionMode()); adapter.addDismissHandling(holder.data); holder.data.setAdapter(adapter); @@ -507,7 +511,7 @@ public class DashboardAdapter extends RecyclerView.Adapter icons, ViewGroup parent) { @@ -519,13 +523,18 @@ public class DashboardAdapter extends RecyclerView.Adapter[] getSuggestionTaggedData() { + return SuggestionLogHelper.getSuggestionTaggedData( + mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext)); + } + public static class IconCache { private final Context mContext; private final ArrayMap mMap = new ArrayMap<>(); diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java index 2c9da4124b1..3815211c475 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java @@ -18,6 +18,7 @@ package com.android.settings.dashboard.suggestions; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -67,11 +68,12 @@ public class SuggestionAdapter extends RecyclerView.Adapter public void onBindViewHolder(DashboardItemHolder holder, int position) { final Tile suggestion = (Tile) mSuggestions.get(position); final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier( - mContext, suggestion); + mContext, suggestion); // This is for cases when a suggestion is dismissed and the next one comes to view if (!mSuggestionsShownLogged.contains(suggestionId)) { mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId); + mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId, + getSuggestionTaggedData()); mSuggestionsShownLogged.add(suggestionId); } if (suggestion.remoteViews != null) { @@ -102,9 +104,11 @@ public class SuggestionAdapter extends RecyclerView.Adapter // set the item view to disabled to remove any touch effects holder.itemView.setEnabled(false); } + clickHandler.setOnClickListener(v -> { mMetricsFeatureProvider.action(mContext, - MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId); + MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId, + getSuggestionTaggedData()); ((SettingsActivity) mContext).startSuggestion(suggestion.intent); }); } @@ -129,7 +133,7 @@ public class SuggestionAdapter extends RecyclerView.Adapter public Tile getSuggestion(int position) { final long itemId = getItemId(position); - for (Tile tile: mSuggestions) { + for (Tile tile : mSuggestions) { if (Objects.hash(tile.title) == itemId) { return tile; } @@ -141,4 +145,10 @@ public class SuggestionAdapter extends RecyclerView.Adapter mSuggestions.remove(suggestion); notifyDataSetChanged(); } + + private Pair[] getSuggestionTaggedData() { + return SuggestionLogHelper.getSuggestionTaggedData( + mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext)); + } + } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java index f8b5a8b6a60..3d40d96d4e4 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java @@ -26,8 +26,9 @@ import android.provider.Settings.Secure; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import android.util.Log; +import android.util.Pair; -import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity; import com.android.settings.Settings.AmbientDisplaySuggestionActivity; import com.android.settings.Settings.DoubleTapPowerSuggestionActivity; @@ -45,6 +46,7 @@ import com.android.settings.support.NewDeviceIntroSuggestionActivity; import com.android.settingslib.drawer.Tile; import com.android.settingslib.suggestions.SuggestionParser; +import java.util.ArrayList; import java.util.List; public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider { @@ -130,10 +132,13 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider if (parser == null || suggestion == null || context == null) { return; } - mMetricsFeatureProvider.action( - context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, - getSuggestionIdentifier(context, suggestion)); + final Pair[] taggedData = + SuggestionLogHelper.getSuggestionTaggedData(isSmartSuggestionEnabled(context)); + mMetricsFeatureProvider.action( + context, MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, + getSuggestionIdentifier(context, suggestion), + taggedData); if (!parser.dismissSuggestion(suggestion)) { return; } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java b/src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java new file mode 100644 index 00000000000..339392fa780 --- /dev/null +++ b/src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2017 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.suggestions; + +import android.util.Pair; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + +public class SuggestionLogHelper { + + public static Pair[] getSuggestionTaggedData(boolean enabled) { + return new Pair[]{ + Pair.create( + MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, enabled ? 1 : 0)}; + } +} diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java index e00908e52b3..4b345d072d7 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -37,6 +37,7 @@ import android.graphics.drawable.Icon; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; @@ -89,6 +90,8 @@ public class DashboardAdapterTest { private ArgumentCaptor mActionCategoryCaptor = ArgumentCaptor.forClass(Integer.class); @Captor private ArgumentCaptor mActionPackageCaptor = ArgumentCaptor.forClass(String.class); + @Captor + private ArgumentCaptor mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class); private FakeFeatureFactory mFactory; private DashboardAdapter mDashboardAdapter; private DashboardAdapter.SuggestionAndConditionHeaderHolder mSuggestionHolder; @@ -123,112 +126,143 @@ public class DashboardAdapterTest { @Test public void testSuggestionsLogs_NotExpanded() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + verify(mFactory.metricsFeatureProvider, times(2)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg2"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_NotExpandedAndPaused() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(4)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg1", "pkg2"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION}; - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg1", "pkg2"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_Expanded() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(3)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedAndPaused() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(6)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedAfterPause() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onPause(); mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(7)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{ - "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedAfterPauseAndPausedAgain() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onPause(); mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(10)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{ - "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, @@ -238,63 +272,82 @@ public class DashboardAdapterTest { MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedWithLessThanDefaultShown() { setupSuggestions(makeSuggestions("pkg1")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(1)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1"}; - Integer[] expectedActions = new Integer[]{ - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAndPaused() { setupSuggestions(makeSuggestions("pkg1")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(2)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg1"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPause() { setupSuggestions(makeSuggestions("pkg1")); + mDashboardAdapter.onPause(); mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(3)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg1", "pkg1"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test @@ -304,18 +357,46 @@ public class DashboardAdapterTest { mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(4)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg1", "pkg1", "pkg1"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg1", "pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); + } + + @Test + public void testSuggestionsLogs_SmartSuggestionEnabled() { + when(mFactory.suggestionsFeatureProvider + .isSmartSuggestionEnabled(any(Context.class))).thenReturn(true); + setupSuggestions(makeSuggestions("pkg1")); + + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); + mSuggestionHolder.itemView.callOnClick(); + mDashboardAdapter.onPause(); + + verify(mFactory.metricsFeatureProvider, times(2)).action( + any(Context.class), mActionCategoryCaptor.capture(), + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 1), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 1)); } @Test diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java index 45d04a45657..c343f972bd8 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java @@ -35,7 +35,9 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; import android.provider.Settings.Secure; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity; @@ -60,6 +62,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @@ -93,6 +97,8 @@ public class SuggestionFeatureProviderImplTest { private FingerprintManager mFingerprintManager; @Mock private SharedPreferences mSharedPreferences; + @Captor + private ArgumentCaptor mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class); private FakeFeatureFactory mFactory; private SuggestionFeatureProviderImpl mProvider; @@ -335,7 +341,10 @@ public class SuggestionFeatureProviderImplTest { verify(mFactory.metricsFeatureProvider).action( eq(mContext), eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); + anyString(), + mTaggedDataCaptor.capture()); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); verify(mContext, never()).getPackageManager(); } @@ -356,8 +365,10 @@ public class SuggestionFeatureProviderImplTest { verify(mFactory.metricsFeatureProvider).action( eq(mContext), eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); - + anyString(), + mTaggedDataCaptor.capture()); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); verify(mContext.getPackageManager()) .setComponentEnabledSetting(mSuggestion.intent.getComponent(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java new file mode 100644 index 00000000000..8eb4273fc54 --- /dev/null +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2017 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.suggestions; + +import static com.google.common.truth.Truth.assertThat; + +import android.util.Pair; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + +import org.junit.Test; + +public class SuggestionLogHelperTest { + + @Test + public void testGetSmartSuggestionEnabledTaggedData_disabled() { + assertThat(SuggestionLogHelper.getSuggestionTaggedData(false)).asList().containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); + } + + @Test + public void testGetSmartSuggestionEnabledTaggedData_enabled() { + assertThat(SuggestionLogHelper.getSuggestionTaggedData(true)).asList().containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 1)); + } +} +