Merge "Fix popup dialog show wrong device name"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c8d9aff..71840b1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1128,12 +1128,12 @@
             </intent-filter>
         </activity-alias>
 
-        <activity android:name=".applications.InstalledAppOpenByDefaultPage"
+        <activity android:name=".applications.InstalledAppOpenByDefaultActivity"
                   android:label="@string/application_info_label"
-                  android:permission="android.permission.OPEN_APPLICATION_DETAILS_OPEN_BY_DEFAULT_PAGE"
+                  android:permission="android.permission.OPEN_APP_OPEN_BY_DEFAULT_SETTINGS"
                   android:exported="true">
             <intent-filter android:priority="1">
-                <action android:name="android.settings.APPLICATION_DETAILS_SETTINGS_OPEN_BY_DEFAULT_PAGE" />
+                <action android:name="com.android.settings.APP_OPEN_BY_DEFAULT_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <data android:scheme="package" />
             </intent-filter>
diff --git a/src/com/android/settings/applications/InstalledAppOpenByDefaultPage.java b/src/com/android/settings/applications/InstalledAppOpenByDefaultActivity.java
similarity index 93%
rename from src/com/android/settings/applications/InstalledAppOpenByDefaultPage.java
rename to src/com/android/settings/applications/InstalledAppOpenByDefaultActivity.java
index 40eef25..cd30d79 100644
--- a/src/com/android/settings/applications/InstalledAppOpenByDefaultPage.java
+++ b/src/com/android/settings/applications/InstalledAppOpenByDefaultActivity.java
@@ -20,7 +20,7 @@
 
 import com.android.settings.SettingsActivity;
 
-public class InstalledAppOpenByDefaultPage extends SettingsActivity {
+public class InstalledAppOpenByDefaultActivity extends SettingsActivity {
 
     @Override
     public Intent getIntent() {
diff --git a/src/com/android/settings/homepage/ContextualCardController.java b/src/com/android/settings/homepage/ContextualCardController.java
index 4a7a149..e47f70c 100644
--- a/src/com/android/settings/homepage/ContextualCardController.java
+++ b/src/com/android/settings/homepage/ContextualCardController.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.homepage;
 
-import java.util.List;
-
 /**
  * Data controller for {@link ContextualCard}.
  */
@@ -26,12 +24,6 @@
     @ContextualCard.CardType
     int getCardType();
 
-    /**
-     * When data is updated or changed, the new data should be passed to ContextualCardManager for
-     * list updating.
-     */
-    void onDataUpdated(List<ContextualCard> cardList);
-
     void onPrimaryClick(ContextualCard card);
 
     void onActionClick(ContextualCard card);
diff --git a/src/com/android/settings/homepage/ContextualCardManager.java b/src/com/android/settings/homepage/ContextualCardManager.java
index b9aa792..87b048e 100644
--- a/src/com/android/settings/homepage/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/ContextualCardManager.java
@@ -18,8 +18,11 @@
 
 import static com.android.settings.homepage.CardContentLoader.CARD_CONTENT_LOADER_ID;
 
+import static java.util.stream.Collectors.groupingBy;
+
 import android.content.Context;
 import android.os.Bundle;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.widget.BaseAdapter;
 
@@ -33,6 +36,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -110,15 +114,12 @@
     }
 
     @Override
-    public void onContextualCardUpdated(List<ContextualCard> updateList) {
+    public void onContextualCardUpdated(Map<Integer, List<ContextualCard>> updateList) {
         //TODO(b/112245748): Should implement a DiffCallback.
         //Keep the old list for comparison.
         final List<ContextualCard> prevCards = mContextualCards;
 
-        final Set<Integer> cardTypes = updateList
-                .stream()
-                .map(card -> card.getCardType())
-                .collect(Collectors.toSet());
+        final Set<Integer> cardTypes = updateList.keySet();
         //Remove the existing data that matches the certain cardType before inserting new data.
         final List<ContextualCard> cardsToKeep = mContextualCards
                 .stream()
@@ -126,10 +127,10 @@
                 .collect(Collectors.toList());
         final List<ContextualCard> allCards = new ArrayList<>();
         allCards.addAll(cardsToKeep);
-        allCards.addAll(updateList);
+        allCards.addAll(
+                updateList.values().stream().flatMap(List::stream).collect(Collectors.toList()));
 
         sortCards(allCards);
-
         //replace with the new data
         mContextualCards.clear();
         mContextualCards.addAll(allCards);
@@ -137,13 +138,15 @@
         loadCardControllers();
 
         if (mListener != null) {
-            mListener.onContextualCardUpdated(mContextualCards);
+            final Map<Integer, List<ContextualCard>> cardsToUpdate = new ArrayMap<>();
+            cardsToUpdate.put(ContextualCard.CardType.DEFAULT, mContextualCards);
+            mListener.onContextualCardUpdated(cardsToUpdate);
         }
     }
 
     @Override
-    public void onFinishCardLoading(List<ContextualCard> contextualCards) {
-        onContextualCardUpdated(contextualCards);
+    public void onFinishCardLoading(List<ContextualCard> cards) {
+        onContextualCardUpdated(cards.stream().collect(groupingBy(ContextualCard::getCardType)));
     }
 
     void setListener(ContextualCardUpdateListener listener) {
diff --git a/src/com/android/settings/homepage/ContextualCardUpdateListener.java b/src/com/android/settings/homepage/ContextualCardUpdateListener.java
index 812c4ce..60dd3a7 100644
--- a/src/com/android/settings/homepage/ContextualCardUpdateListener.java
+++ b/src/com/android/settings/homepage/ContextualCardUpdateListener.java
@@ -17,15 +17,19 @@
 package com.android.settings.homepage;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * When {@link ContextualCardController} detects changes, it will notify the listeners registered.
- * In our case, {@link ContextualCardManager} gets noticed.
- *
- * After the list of {@link ContextualCard} gets updated in{@link ContextualCardManager},
- * {@link ContextualCardManager} will notify the listeners registered, {@link
- * ContextualCardsAdapter} in this case.
  */
 public interface ContextualCardUpdateListener {
-    void onContextualCardUpdated(List<ContextualCard> updateList);
+
+    /**
+     * Called when a set of cards are updated.
+     *
+     * @param cards A map of updates grouped by {@link ContextualCard.CardType}. Values can be
+     *              null, which means all cards from corresponding {@link
+     *              ContextualCard.CardType} are removed.
+     */
+    void onContextualCardUpdated(Map<Integer, List<ContextualCard>> cards);
 }
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/ContextualCardsAdapter.java b/src/com/android/settings/homepage/ContextualCardsAdapter.java
index 402212f..9ab8893 100644
--- a/src/com/android/settings/homepage/ContextualCardsAdapter.java
+++ b/src/com/android/settings/homepage/ContextualCardsAdapter.java
@@ -26,6 +26,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
         implements ContextualCardUpdateListener {
@@ -101,7 +102,8 @@
     }
 
     @Override
-    public void onContextualCardUpdated(List<ContextualCard> contextualCards) {
+    public void onContextualCardUpdated(Map<Integer, List<ContextualCard>> cards) {
+        final List<ContextualCard> contextualCards = cards.get(ContextualCard.CardType.DEFAULT);
         //TODO(b/112245748): Should implement a DiffCallback so we can use notifyItemChanged()
         // instead.
         if (contextualCards == null) {
diff --git a/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
index adac8eb..fbbab14 100644
--- a/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
+++ b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
@@ -17,6 +17,7 @@
 package com.android.settings.homepage.conditional;
 
 import android.content.Context;
+import android.util.ArrayMap;
 
 import com.android.settings.homepage.ContextualCard;
 import com.android.settings.homepage.ContextualCardController;
@@ -27,6 +28,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This controller triggers the loading of conditional cards and monitors state changes to
@@ -57,11 +59,6 @@
     }
 
     @Override
-    public void onDataUpdated(List<ContextualCard> cardList) {
-        mListener.onContextualCardUpdated(cardList);
-    }
-
-    @Override
     public void onStart() {
         mConditionManager.startMonitoringStateChange();
     }
@@ -105,7 +102,9 @@
         }
 
         if (mListener != null) {
-            onDataUpdated(conditionCards);
+            final Map<Integer, List<ContextualCard>> conditionalCards = new ArrayMap<>();
+            conditionalCards.put(ContextualCard.CardType.CONDITIONAL, conditionCards);
+            mListener.onContextualCardUpdated(conditionalCards);
         }
     }
 }
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index de67c10..2e6611f 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -465,8 +465,7 @@
         } else {
             enabled = ipAndProxyFieldsAreValid();
         }
-        if (mEapCaCertSpinner != null
-                && mView.findViewById(R.id.l_ca_cert).getVisibility() != View.GONE) {
+        if (mAccessPointSecurity == AccessPoint.SECURITY_EAP) {
             String caCertSelection = (String) mEapCaCertSpinner.getSelectedItem();
             if (caCertSelection.equals(mUnspecifiedCertString)) {
                 // Disallow submit if the user has not selected a CA certificate for an EAP network
@@ -482,10 +481,8 @@
                 enabled = false;
             }
         }
-        if (mEapUserCertSpinner != null
-                && mView.findViewById(R.id.l_user_cert).getVisibility() != View.GONE
-                && ((String) mEapUserCertSpinner.getSelectedItem())
-                       .equals(mUnspecifiedCertString)) {
+        if (mAccessPointSecurity == AccessPoint.SECURITY_EAP
+                && mEapUserCertSpinner.getSelectedItem().equals(mUnspecifiedCertString)) {
             // Disallow submit if the user has not selected a user certificate for an EAP network
             // configuration.
             enabled = false;
diff --git a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java
index ed45ce7..a59a3bc 100644
--- a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java
@@ -82,7 +82,7 @@
 
         mController.onConditionsChanged();
 
-        verify(mController).onDataUpdated(any());
+        verify(mListener).onContextualCardUpdated(any());
     }
 
     @Test
@@ -94,7 +94,7 @@
 
         mController.onConditionsChanged();
 
-        verify(mController, never()).onDataUpdated(any());
+        verify(mListener, never()).onContextualCardUpdated(any());
     }
 
     private class FakeConditionalCard implements ConditionalCard {
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index 5e8dd28..54be773 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -184,6 +184,22 @@
     }
 
     @Test
+    public void isSubmittable_EapToPskWithValidPassword_shouldReturnTrue() {
+        final TextView password = mView.findViewById(R.id.password);
+        final Spinner securitySpinner = mView.findViewById(R.id.security);
+        assertThat(password).isNotNull();
+        assertThat(securitySpinner).isNotNull();
+        when(mAccessPoint.isSaved()).thenReturn(true);
+
+        // Change it from EAP to PSK
+        mController.onItemSelected(securitySpinner, null, AccessPoint.SECURITY_EAP, 0);
+        mController.onItemSelected(securitySpinner, null, AccessPoint.SECURITY_PSK, 0);
+        password.setText(GOOD_PSK);
+
+        assertThat(mController.isSubmittable()).isTrue();
+    }
+
+    @Test
     public void getSignalString_notReachable_shouldHaveNoSignalString() {
         when(mAccessPoint.isReachable()).thenReturn(false);