Add the "Smart Lock" item to dynamic index.

- The "Smart Lock" item is a trust agent which comes from
  TrustAgentManager, so add it to dynamic index.

Fixes: 148867137
Test: manual test the search result and run Settings robotest
Change-Id: I7cd3a9df89a9b9378fa49cc2cb2127c778b795f2
diff --git a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
index eb50b7c..6067b77 100644
--- a/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
+++ b/src/com/android/settings/security/trustagent/TrustAgentListPreferenceController.java
@@ -44,6 +44,7 @@
 import com.android.settingslib.core.lifecycle.events.OnCreate;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import java.util.List;
 
@@ -134,34 +135,68 @@
         updateTrustAgents();
     }
 
+
+    @Override
+    public void updateDynamicRawDataToIndex(List<SearchIndexableRaw> rawData) {
+        if (!isAvailable()) {
+            return;
+        }
+
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = getActiveTrustAgents(
+                mContext);
+        if (agents == null) {
+            return;
+        }
+
+        for (int i = 0, size = agents.size(); i < size; i++) {
+            final SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
+            final TrustAgentManager.TrustAgentComponentInfo agent = agents.get(i);
+
+            raw.key = PREF_KEY_TRUST_AGENT + i;
+            raw.title = agent.title;
+            rawData.add(raw);
+        }
+    }
+
+    /**
+     * @return The active trust agents from TrustAgentManager.
+     */
+    private List<TrustAgentManager.TrustAgentComponentInfo> getActiveTrustAgents(Context context) {
+        return mTrustAgentManager.getActiveTrustAgents(context, mLockPatternUtils);
+    }
+
     private void updateTrustAgents() {
         if (mSecurityCategory == null) {
             return;
         }
+        // If for some reason the preference is no longer available, don't proceed to add.
+        if (!isAvailable()) {
+            return;
+        }
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = getActiveTrustAgents(
+                mContext);
+        if (agents == null) {
+            return;
+        }
+
         // First remove all old trust agents.
-        while (true) {
-            final Preference oldAgent = mSecurityCategory.findPreference(PREF_KEY_TRUST_AGENT);
+        for (int i = 0, size = agents.size(); i < size; i++) {
+            String key = PREF_KEY_TRUST_AGENT + i;
+            final Preference oldAgent = mSecurityCategory.findPreference(key);
             if (oldAgent == null) {
                 break;
             } else {
                 mSecurityCategory.removePreference(oldAgent);
             }
         }
-        // If for some reason the preference is no longer available, don't proceed to add.
-        if (!isAvailable()) {
-            return;
-        }
+
         // Then add new ones.
         final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);
-        final List<TrustAgentManager.TrustAgentComponentInfo> agents =
-                mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils);
-        if (agents == null) {
-            return;
-        }
-        for (TrustAgentManager.TrustAgentComponentInfo agent : agents) {
+        for (int i = 0, size = agents.size(); i < size; i++) {
             final RestrictedPreference trustAgentPreference =
                     new RestrictedPreference(mSecurityCategory.getContext());
-            trustAgentPreference.setKey(PREF_KEY_TRUST_AGENT);
+            TrustAgentManager.TrustAgentComponentInfo agent = agents.get(i);
+            trustAgentPreference.setKey(PREF_KEY_TRUST_AGENT + i);
             trustAgentPreference.setTitle(agent.title);
             trustAgentPreference.setSummary(agent.summary);
             // Create intent for this preference.
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
index d9202d4..c0fbff7 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -44,6 +44,7 @@
 import com.android.settings.security.SecuritySettings;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -111,10 +112,20 @@
     @Test
     public void onResume_shouldClearOldAgents() {
         final Preference oldAgent = new Preference(mActivity);
-        oldAgent.setKey(PREF_KEY_TRUST_AGENT);
-        when(mCategory.findPreference(PREF_KEY_TRUST_AGENT))
+        oldAgent.setKey(PREF_KEY_TRUST_AGENT + 0);
+        when(mCategory.findPreference(PREF_KEY_TRUST_AGENT + 0))
                 .thenReturn(oldAgent)
                 .thenReturn(null);
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = new ArrayList<>();
+        final TrustAgentManager.TrustAgentComponentInfo agent =
+                mock(TrustAgentManager.TrustAgentComponentInfo.class);
+        agent.title = "Test_title";
+        agent.summary = "test summary";
+        agent.componentName = new ComponentName("pkg", "agent");
+        agent.admin = null;
+        agents.add(agent);
+        when(mTrustAgentManager.getActiveTrustAgents(mActivity, mLockPatternUtils))
+                .thenReturn(agents);
 
         mController.displayPreference(mScreen);
         mController.onResume();
@@ -160,4 +171,24 @@
 
         verify(mCategory, never()).addPreference(any(Preference.class));
     }
+
+    @Test
+    public void updateDynamicRawDataToIndex_shouldIndexAgents() {
+        final List<TrustAgentManager.TrustAgentComponentInfo> agents = new ArrayList<>();
+        final TrustAgentManager.TrustAgentComponentInfo agent =
+                mock(TrustAgentManager.TrustAgentComponentInfo.class);
+        agent.title = "Test_title";
+        agent.summary = "test summary";
+        agent.componentName = new ComponentName("pkg", "agent");
+        agent.admin = null;
+        agents.add(agent);
+        when(mTrustAgentManager.getActiveTrustAgents(mActivity, mLockPatternUtils))
+                .thenReturn(agents);
+        final List<SearchIndexableRaw> indexRaws = new ArrayList<>();
+
+        mController.updateDynamicRawDataToIndex(indexRaws);
+
+        assertThat(indexRaws).hasSize(1);
+    }
+
 }