Fix NPE when building suggestion identifier.

And refactored the getIdent logic into feature provider.

Change-Id: Id6f66a6942cbaf6d26ae4dca62037a6cf01179a5
Fix: 36314240
Test: make RunSettingsRoboTests
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);