Recursively find preference in progressive disclosure.

Add handling to check for nested preference when finding preference
in the collapsed list.

Change-Id: I830bdd5fd99f09c505f41fd3bb2fa968eb9b13cf
Fix: 35363405
Test: make RunSettingsRoboTests
diff --git a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java
index 77bd253..90c3d25 100644
--- a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java
+++ b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java
@@ -21,6 +21,7 @@
 import android.support.annotation.VisibleForTesting;
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.util.Log;
@@ -219,6 +220,12 @@
             if (TextUtils.equals(key, pref.getKey())) {
                 return pref;
             }
+            if (pref instanceof PreferenceGroup) {
+                final Preference returnedPreference = ((PreferenceGroup)pref).findPreference(key);
+                if (returnedPreference != null) {
+                    return returnedPreference;
+                }
+            }
         }
         Log.d(TAG, "Cannot find preference with key " + key);
         return null;
diff --git a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java
index 573b2b5..e7f97c3 100644
--- a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceManager;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
@@ -44,7 +45,9 @@
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -142,6 +145,22 @@
     }
 
     @Test
+    public void findPreference_nestedPrefInCollapsedList_shouldFindIt() {
+        when(mScreen.findPreference(anyString())).thenReturn(null);
+        final PreferenceScreen prefGroup = spy(new PreferenceScreen(mAppContext, null));
+        when(prefGroup.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
+        final Preference preference = mock(Preference.class);
+        when(preference.getKey()).thenReturn("TestKey");
+        prefGroup.addPreference(preference);
+        mMixin.addToCollapsedList(prefGroup);
+
+        Preference pref = mMixin.findPreference(mScreen, "TestKey");
+
+        assertThat(pref).isNotNull();
+        assertThat(pref).isSameAs(preference);
+    }
+
+    @Test
     public void removePreference_shouldRemoveOnScreenPreference() {
         when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);