Merge "Add getNetworkSpecifier() and getCarrierConfig()"
diff --git a/api/system-current.txt b/api/system-current.txt
index 58488d3..79d9588 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -35931,6 +35931,7 @@
     field public static final java.lang.String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
     field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
     field public static final java.lang.String ACTION_CAST_SETTINGS = "android.settings.CAST_SETTINGS";
+    field public static final java.lang.String ACTION_CONFIGURE_WIFI_SETTINGS = "android.settings.CONFIGURE_WIFI_SETTINGS";
     field public static final java.lang.String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
     field public static final java.lang.String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
     field public static final java.lang.String ACTION_DEVICE_INFO_SETTINGS = "android.settings.DEVICE_INFO_SETTINGS";
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 2d4a9e9..794e1474 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -376,6 +376,22 @@
             "android.settings.WIFI_IP_SETTINGS";
 
     /**
+     * Activity Action: Show settings to allow the configuration of Wi-Fi features.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you
+     * safeguard against this.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     * @hide
+     */
+    @SystemApi
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_CONFIGURE_WIFI_SETTINGS =
+            "android.settings.CONFIGURE_WIFI_SETTINGS";
+
+    /**
      * Activity Action: Show settings to allow configuration of Wi-Fi saved networks.
      * <p>
      * In some cases, a matching Activity may not exist, so ensure you
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c7be74f..b29bf7b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3714,12 +3714,19 @@
         if (mSafeMode) {
             flags |= PackageManager.MATCH_SYSTEM_ONLY;
         }
-        final String ephemeralPkgName = getEphemeralPackageName(Binder.getCallingUid());
-        if (ephemeralPkgName != null) {
+        final int callingUid = Binder.getCallingUid();
+        if (callingUid == Process.SYSTEM_UID || callingUid == 0) {
+            // The system sees all components
+            flags |= PackageManager.MATCH_EPHEMERAL;
+        } else if (getEphemeralPackageName(callingUid) != null) {
+            // But, ephemeral apps see both ephemeral and exposed, non-ephemeral components
             flags |= PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY;
             flags |= PackageManager.MATCH_EPHEMERAL;
+        } else {
+            // Otherwise, prevent leaking ephemeral components
+            flags &= ~PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY;
+            flags &= ~PackageManager.MATCH_EPHEMERAL;
         }
-
         return updateFlagsForComponent(flags, userId, cookie);
     }
 
@@ -5601,11 +5608,15 @@
                 // used when either 1) the calling package is normal and the activity is within
                 // an ephemeral application or 2) the calling package is ephemeral and the
                 // activity is not visible to ephemeral applications.
+                boolean matchEphemeral =
+                        (flags & PackageManager.MATCH_EPHEMERAL) != 0;
+                boolean ephemeralVisibleOnly =
+                        (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0;
                 boolean blockResolution =
-                        (ephemeralPkgName == null
+                        (!matchEphemeral && ephemeralPkgName == null
                                 && (ai.applicationInfo.privateFlags
                                         & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0)
-                        || (ephemeralPkgName != null
+                        || (ephemeralVisibleOnly && ephemeralPkgName != null
                                 && (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0);
                 if (!blockResolution) {
                     final ResolveInfo ri = new ResolveInfo();
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index df5c214..6a71db0 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -972,6 +972,13 @@
     public static final int CDMA_ROAMING_MODE_AFFILIATED = 1;
     /** @hide */
     public static final int CDMA_ROAMING_MODE_ANY = 2;
+    /**
+     * Boolean indicating if support is provided for directly dialing FDN number from FDN list.
+     * If false, this feature is not supported.
+     * @hide
+     */
+    public static final String KEY_SUPPORT_DIRECT_FDN_DIALING_BOOL =
+            "support_direct_fdn_dialing_bool";
 
     /**
      * Report IMEI as device id even if it's a CDMA/LTE phone.
@@ -1312,6 +1319,7 @@
         sDefaults.putBoolean(KEY_CONFIG_WIFI_DISABLE_IN_ECBM, false);
         sDefaults.putBoolean(KEY_CARRIER_NAME_OVERRIDE_BOOL, false);
         sDefaults.putString(KEY_CARRIER_NAME_STRING, "");
+        sDefaults.putBoolean(KEY_SUPPORT_DIRECT_FDN_DIALING_BOOL, false);
 
         // MMS defaults
         sDefaults.putBoolean(KEY_MMS_ALIAS_ENABLED_BOOL, false);