diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index f968cd0..e3e95be 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -40,8 +40,8 @@
 import com.android.settings.dashboard.conditional.Condition;
 import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
 import com.android.settings.dashboard.suggestions.SuggestionDismissController;
+import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.SuggestionParser;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 
@@ -60,6 +60,7 @@
     private final Context mContext;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final DashboardFeatureProvider mDashboardFeatureProvider;
+    private final SuggestionFeatureProvider mSuggestionFeatureProvider;
     private final ArrayList<String> mSuggestionsShownLogged;
     private boolean mFirstFrameDrawn;
 
@@ -97,17 +98,17 @@
         }
     };
 
-    public DashboardAdapter(Context context, SuggestionParser parser,
-            MetricsFeatureProvider metricsFeatureProvider, Bundle savedInstanceState,
+    public DashboardAdapter(Context context, Bundle savedInstanceState,
             List<Condition> conditions) {
         List<Tile> suggestions = null;
         List<DashboardCategory> categories = null;
         int suggestionMode = DashboardData.SUGGESTION_MODE_DEFAULT;
 
         mContext = context;
-        mMetricsFeatureProvider = metricsFeatureProvider;
-        mDashboardFeatureProvider = FeatureFactory.getFactory(context)
-                .getDashboardFeatureProvider(context);
+        final FeatureFactory factory = FeatureFactory.getFactory(context);
+        mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
+        mDashboardFeatureProvider = factory.getDashboardFeatureProvider(context);
+        mSuggestionFeatureProvider = factory.getSuggestionFeatureProvider(context);
         mCache = new IconCache(context);
 
         setHasStableIds(true);
@@ -120,7 +121,7 @@
             mSuggestionsShownLogged = savedInstanceState.getStringArrayList(
                     STATE_SUGGESTIONS_SHOWN_LOGGED);
         } else {
-            mSuggestionsShownLogged = new ArrayList<String>();
+            mSuggestionsShownLogged = new ArrayList<>();
         }
 
         mDashboardData = new DashboardData.Builder()
@@ -173,11 +174,11 @@
         }
         if (shownSuggestions != null) {
             for (Tile suggestion : shownSuggestions) {
-                String suggestionId = getSuggestionIdentifier(mContext, suggestion);
+                final String identifier = mSuggestionFeatureProvider.getSuggestionIdentifier(
+                        mContext, suggestion);
                 mMetricsFeatureProvider.action(
-                        mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
-                        getSuggestionIdentifier(mContext, suggestion));
-                mSuggestionsShownLogged.add(getSuggestionIdentifier(mContext, suggestion));
+                        mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, identifier);
+                mSuggestionsShownLogged.add(identifier);
             }
         }
     }
@@ -237,7 +238,8 @@
                 break;
             case R.layout.suggestion_tile:
                 final Tile suggestion = (Tile) mDashboardData.getItemEntityByPosition(position);
-                String suggestionId = getSuggestionIdentifier(mContext, suggestion);
+                final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
+                        mContext, suggestion);
                 // This is for cases when a suggestion is dismissed and the next one comes to view
                 if (!mSuggestionsShownLogged.contains(suggestionId)) {
                     mMetricsFeatureProvider.action(
@@ -245,14 +247,10 @@
                     mSuggestionsShownLogged.add(suggestionId);
                 }
                 onBindTile(holder, suggestion);
-                holder.itemView.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        mMetricsFeatureProvider.action(mContext,
-                                MetricsEvent.ACTION_SETTINGS_SUGGESTION,
-                                DashboardAdapter.getSuggestionIdentifier(mContext, suggestion));
-                        ((SettingsActivity) mContext).startSuggestion(suggestion.intent);
-                    }
+                holder.itemView.setOnClickListener(v -> {
+                    mMetricsFeatureProvider.action(mContext,
+                            MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId);
+                    ((SettingsActivity) mContext).startSuggestion(suggestion.intent);
                 });
                 break;
             case R.layout.condition_card:
@@ -260,13 +258,7 @@
                         == mDashboardData.getExpandedCondition();
                 ConditionAdapterUtils.bindViews(
                         (Condition) mDashboardData.getItemEntityByPosition(position),
-                        holder, isExpanded, mConditionClickListener,
-                        new View.OnClickListener() {
-                            @Override
-                            public void onClick(View v) {
-                                onExpandClick(v);
-                            }
-                        });
+                        holder, isExpanded, mConditionClickListener, v -> onExpandClick(v));
                 break;
         }
     }
@@ -291,7 +283,8 @@
             return;
         }
         for (Tile suggestion : mDashboardData.getSuggestions()) {
-            String suggestionId = getSuggestionIdentifier(mContext, suggestion);
+            String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
+                    mContext, suggestion);
             if (mSuggestionsShownLogged.contains(suggestionId)) {
                 mMetricsFeatureProvider.action(
                         mContext, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, suggestionId);
@@ -320,16 +313,6 @@
         return mDashboardData.getItemEntityById(itemId);
     }
 
-    public static String getSuggestionIdentifier(Context context, Tile suggestion) {
-        String packageName = suggestion.intent.getComponent().getPackageName();
-        if (packageName.equals(context.getPackageName())) {
-            // Since Settings provides several suggestions, fill in the class instead of the
-            // package for these.
-            packageName = suggestion.intent.getComponent().getClassName();
-        }
-        return packageName;
-    }
-
     private void notifyDashboardDataChanged(DashboardData prevData) {
         if (mFirstFrameDrawn && prevData != null) {
             final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData
@@ -394,33 +377,30 @@
             holder.summary.setText(
                     mContext.getString(R.string.suggestions_summary, undisplayedSuggestionCount));
         }
-        holder.itemView.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                final int suggestionMode;
-                if (moreSuggestions) {
-                    suggestionMode = DashboardData.SUGGESTION_MODE_EXPANDED;
+        holder.itemView.setOnClickListener(v -> {
+            final int suggestionMode;
+            if (moreSuggestions) {
+                suggestionMode = DashboardData.SUGGESTION_MODE_EXPANDED;
 
-                    for (Tile suggestion : mDashboardData.getSuggestions()) {
-                        String suggestionId =
-                                DashboardAdapter.getSuggestionIdentifier(mContext, suggestion);
-                        if (!mSuggestionsShownLogged.contains(suggestionId)) {
-                            mMetricsFeatureProvider.action(
-                                    mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
-                                    suggestionId);
-                            mSuggestionsShownLogged.add(suggestionId);
-                        }
+                for (Tile suggestion : mDashboardData.getSuggestions()) {
+                    final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
+                            mContext, suggestion);
+                    if (!mSuggestionsShownLogged.contains(suggestionId)) {
+                        mMetricsFeatureProvider.action(
+                                mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
+                                suggestionId);
+                        mSuggestionsShownLogged.add(suggestionId);
                     }
-                } else {
-                    suggestionMode = DashboardData.SUGGESTION_MODE_COLLAPSED;
                 }
-
-                DashboardData prevData = mDashboardData;
-                mDashboardData = new DashboardData.Builder(prevData)
-                        .setSuggestionMode(suggestionMode)
-                        .build();
-                notifyDashboardDataChanged(prevData);
+            } else {
+                suggestionMode = DashboardData.SUGGESTION_MODE_COLLAPSED;
             }
+
+            DashboardData prevData = mDashboardData;
+            mDashboardData = new DashboardData.Builder(prevData)
+                    .setSuggestionMode(suggestionMode)
+                    .build();
+            notifyDashboardDataChanged(prevData);
         });
     }
 
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index 4e2baa9..7a5f395 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -190,8 +190,7 @@
         mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
         mDashboard.setListener(this);
         Log.d(TAG, "adapter created");
-        mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, mMetricsFeatureProvider,
-                bundle, mConditionManager.getConditions());
+        mAdapter = new DashboardAdapter(getContext(), bundle, mConditionManager.getConditions());
         mDashboard.setAdapter(mAdapter);
         mSuggestionDismissHandler = new SuggestionDismissController(
                 getContext(), mDashboard, mSuggestionParser, mAdapter);
@@ -245,8 +244,8 @@
             if (isSmartSuggestionEnabled) {
                 List<String> suggestionIds = new ArrayList<>(suggestions.size());
                 for (Tile suggestion : suggestions) {
-                    suggestionIds.add(
-                            DashboardAdapter.getSuggestionIdentifier(context, suggestion));
+                    suggestionIds.add(mSuggestionFeatureProvider.getSuggestionIdentifier(
+                            context, suggestion));
                 }
                 // TODO: create a Suggestion class to maintain the id and other info
                 mSuggestionFeatureProvider.rankSuggestions(suggestions, suggestionIds);
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
index 806d6f8..14f5e9c 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
@@ -49,4 +49,9 @@
      * Dismisses a suggestion.
      */
     void dismissSuggestion(Context context, SuggestionParser parser, Tile suggestion);
+
+    /**
+     * Returns an identifier for the suggestion
+     */
+    String getSuggestionIdentifier(Context context, Tile suggestion);
 }
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
index 9231037..b82c28d 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
@@ -21,7 +21,6 @@
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.dashboard.DashboardAdapter;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.SuggestionParser;
 import com.android.settingslib.drawer.Tile;
@@ -50,9 +49,10 @@
 
 
     public SuggestionFeatureProviderImpl(Context context) {
+        final Context appContext = context.getApplicationContext();
         mSuggestionRanker = new SuggestionRanker(
-                new SuggestionFeaturizer(new EventStore(context.getApplicationContext())));
-        mMetricsFeatureProvider = FeatureFactory.getFactory(context)
+                new SuggestionFeaturizer(new EventStore(appContext)));
+        mMetricsFeatureProvider = FeatureFactory.getFactory(appContext)
                 .getMetricsFeatureProvider();
     }
 
@@ -68,7 +68,7 @@
         }
         mMetricsFeatureProvider.action(
                 context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
-                DashboardAdapter.getSuggestionIdentifier(context, suggestion));
+                getSuggestionIdentifier(context, suggestion));
 
         final boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
         if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
@@ -81,4 +81,18 @@
         parser.markCategoryDone(suggestion.category);
     }
 
+    @Override
+    public String getSuggestionIdentifier(Context context, Tile suggestion) {
+        if (suggestion.intent == null || suggestion.intent.getComponent() == null) {
+            return "unknown_suggestion";
+        }
+        String packageName = suggestion.intent.getComponent().getPackageName();
+        if (packageName.equals(context.getPackageName())) {
+            // Since Settings provides several suggestions, fill in the class instead of the
+            // package for these.
+            packageName = suggestion.intent.getComponent().getClassName();
+        }
+        return packageName;
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index 7f0229a..d7daa03 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -21,35 +21,32 @@
 import android.content.res.Resources;
 import android.view.View;
 import android.widget.FrameLayout;
+
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-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.dashboard.conditional.Condition;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
-import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
+
 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.annotation.Config;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import static com.google.common.truth.Truth.assertThat;
-import org.mockito.Matchers;
 import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -64,20 +61,19 @@
         })
 public class DashboardAdapterTest {
 
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
     @Mock
     private View mView;
     @Mock
     private Condition mCondition;
     @Mock
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-    @Mock
     private Resources mResources;
-    @Mock
-    private DashboardData mDashboardData;
     @Captor
     private ArgumentCaptor<Integer> mActionCategoryCaptor = ArgumentCaptor.forClass(Integer.class);
     @Captor
     private ArgumentCaptor<String> mActionPackageCaptor = ArgumentCaptor.forClass(String.class);
+    private FakeFeatureFactory mFactory;
     private DashboardAdapter mDashboardAdapter;
     private DashboardAdapter.DashboardItemHolder mSuggestionHolder;
     private DashboardData.SuggestionHeaderData mSuggestionHeaderData;
@@ -85,15 +81,20 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        Context context = RuntimeEnvironment.application;
-        context = spy(context);
-        when(context.getResources()).thenReturn(mResources);
-        when(mResources
-                .getQuantityString(any(int.class), any(int.class), Matchers.<Object>anyVararg()))
+        FakeFeatureFactory.setupForTest(mContext);
+        mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+        when(mFactory.suggestionsFeatureProvider
+                .getSuggestionIdentifier(any(Context.class), any(Tile.class)))
+                .thenAnswer(invocation -> {
+                    final Object[] args = invocation.getArguments();
+                    return ((Tile)args[1]).intent.getComponent().getPackageName();
+                });
+
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getQuantityString(any(int.class), any(int.class), any()))
                 .thenReturn("");
-        FakeFeatureFactory.setupForTest(context);
-        mDashboardAdapter = new DashboardAdapter(context, null, mMetricsFeatureProvider,
-                null, null);
+
+        mDashboardAdapter = new DashboardAdapter(mContext, null, null);
         mSuggestionHeaderData = new DashboardData.SuggestionHeaderData(true, 1, 0);
         when(mView.getTag()).thenReturn(mCondition);
     }
@@ -109,7 +110,7 @@
     @Test
     public void testSuggestionsLogs_NotExpanded() {
         setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
-        verify(mMetricsFeatureProvider, times(2)).action(
+        verify(mFactory.metricsFeatureProvider, times(2)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg2"};
@@ -117,15 +118,15 @@
                 MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
                 MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION
         };
-        assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages);
         assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions);
+        assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages);
     }
 
     @Test
     public void testSuggestionsLogs_NotExpandedAndPaused() {
         setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
         mDashboardAdapter.onPause();
-        verify(mMetricsFeatureProvider, times(4)).action(
+        verify(mFactory.metricsFeatureProvider, times(4)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg1", "pkg2"};
@@ -134,8 +135,8 @@
                 MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
                 MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION,
                 MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION};
-        assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages);
         assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions);
+        assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages);
     }
 
     @Test
@@ -144,7 +145,7 @@
         mDashboardAdapter.onBindSuggestionHeader(
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
-        verify(mMetricsFeatureProvider, times(3)).action(
+        verify(mFactory.metricsFeatureProvider, times(3)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg3"};
@@ -164,7 +165,7 @@
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
         mDashboardAdapter.onPause();
-        verify(mMetricsFeatureProvider, times(6)).action(
+        verify(mFactory.metricsFeatureProvider, times(6)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"};
@@ -187,7 +188,7 @@
         mDashboardAdapter.onBindSuggestionHeader(
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
-        verify(mMetricsFeatureProvider, times(7)).action(
+        verify(mFactory.metricsFeatureProvider, times(7)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{
@@ -213,7 +214,7 @@
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
         mDashboardAdapter.onPause();
-        verify(mMetricsFeatureProvider, times(10)).action(
+        verify(mFactory.metricsFeatureProvider, times(10)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{
@@ -240,7 +241,7 @@
         mDashboardAdapter.onBindSuggestionHeader(
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
-        verify(mMetricsFeatureProvider, times(1)).action(
+        verify(mFactory.metricsFeatureProvider, times(1)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1"};
@@ -258,7 +259,7 @@
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
         mDashboardAdapter.onPause();
-        verify(mMetricsFeatureProvider, times(2)).action(
+        verify(mFactory.metricsFeatureProvider, times(2)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg1"};
@@ -277,7 +278,7 @@
         mDashboardAdapter.onBindSuggestionHeader(
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
-        verify(mMetricsFeatureProvider, times(3)).action(
+        verify(mFactory.metricsFeatureProvider, times(3)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg1", "pkg1"};
@@ -298,7 +299,7 @@
                 mSuggestionHolder, mSuggestionHeaderData);
         mSuggestionHolder.itemView.callOnClick();
         mDashboardAdapter.onPause();
-        verify(mMetricsFeatureProvider, times(4)).action(
+        verify(mFactory.metricsFeatureProvider, times(4)).action(
                 any(Context.class), mActionCategoryCaptor.capture(),
                 mActionPackageCaptor.capture());
         String[] expectedPackages = new String[]{"pkg1", "pkg1", "pkg1", "pkg1"};
@@ -313,23 +314,18 @@
     }
 
     private List<Tile> makeSuggestions(String[] pkgNames) {
-        List<Tile> suggestions = new ArrayList<Tile>();
+        final List<Tile> suggestions = new ArrayList<>();
         for (String pkgName : pkgNames) {
-            suggestions.add(makeSuggestion(pkgName, "cls"));
+            Tile suggestion = new Tile();
+            suggestion.intent = new Intent("action");
+            suggestion.intent.setComponent(new ComponentName(pkgName, "cls"));
+            suggestions.add(suggestion);
         }
         return suggestions;
     }
 
-    private Tile makeSuggestion(String pkgName, String className) {
-        Tile suggestion = new Tile();
-        suggestion.intent = new Intent("action");
-        suggestion.intent.setComponent(new ComponentName(pkgName, className));
-        return suggestion;
-    }
-
     private void setUpSuggestions(List<Tile> suggestions) {
-        mDashboardAdapter.setCategoriesAndSuggestions(
-                new ArrayList<DashboardCategory>(), suggestions);
+        mDashboardAdapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions);
         mSuggestionHolder = mDashboardAdapter.onCreateViewHolder(
                 new FrameLayout(RuntimeEnvironment.application),
                 mDashboardAdapter.getItemViewType(0));
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 912947a..b36aef2 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
@@ -36,6 +36,7 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyString;
@@ -81,6 +82,32 @@
     }
 
     @Test
+    public void getSuggestionIdentifier_samePackage_returnClassName() {
+        final Tile suggestion = new Tile();
+        suggestion.intent = new Intent()
+                .setClassName(RuntimeEnvironment.application.getPackageName(), "123");
+        assertThat(mProvider.getSuggestionIdentifier(RuntimeEnvironment.application, suggestion))
+                .isEqualTo("123");
+    }
+
+    @Test
+    public void getSuggestionIdentifier_differentPackage_returnPackageName() {
+        final Tile suggestion = new Tile();
+        suggestion.intent = new Intent()
+                .setClassName(RuntimeEnvironment.application.getPackageName(), "123");
+        assertThat(mProvider.getSuggestionIdentifier(mContext, suggestion))
+                .isEqualTo(RuntimeEnvironment.application.getPackageName());
+    }
+
+    @Test
+    public void getSuggestionIdentifier_nullComponent_shouldNotCrash() {
+        final Tile suggestion = new Tile();
+        suggestion.intent = new Intent();
+        assertThat(mProvider.getSuggestionIdentifier(mContext, suggestion))
+                .isNotEmpty();
+    }
+
+    @Test
     public void dismissSuggestion_hasMoreDismissCount_shouldNotDisableComponent() {
         when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
                 .thenReturn(false);
