Merge "Import translations. DO NOT MERGE ANYWHERE" into 24D1-dev
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index c4edc9e..3248179 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -208,14 +208,17 @@
   eccs {
     phone_number: "122"
     types: POLICE
+    routing: NORMAL
   }
   eccs {
     phone_number: "124"
     types: AMBULANCE
+    routing: NORMAL
   }
   eccs {
     phone_number: "123"
     types: FIRE
+    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -518,7 +521,7 @@
   eccs {
     phone_number: "117"
     types: POLICE
-    routing: EMERGENCY
+    routing: NORMAL
   }
   eccs {
     phone_number: "144"
@@ -548,6 +551,7 @@
   eccs {
     phone_number: "1414"
     types: TYPE_UNSPECIFIED
+    routing: NORMAL
   }
   eccs {
     phone_number: "0800117117"
@@ -1197,6 +1201,46 @@
     types: FIRE
     routing: NORMAL
   }
+  eccs {
+    phone_number: "115"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "116000"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "191"
+    types: MOUNTAIN_RESCUE
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "196"
+    types: MARINE_GUARD
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "197"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "116117"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "119"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "116111"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
   ecc_fallback: "112"
 }
 countries {
@@ -1367,10 +1411,12 @@
   eccs {
     phone_number: "101"
     types: AMBULANCE
+    routing: NORMAL
   }
   eccs {
     phone_number: "102"
     types: FIRE
+    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -1389,6 +1435,28 @@
     types: FIRE
     routing: NORMAL
   }
+  eccs {
+    phone_number: "101"
+    types: FIRE
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "102"
+    types: AMBULANCE
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "103"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "108"
+    types: POLICE
+    types: AMBULANCE
+    types: FIRE
+    routing: NORMAL
+  }
   ecc_fallback: "112"
 }
 countries {
@@ -2360,6 +2428,86 @@
     types: AMBULANCE
     types: FIRE
   }
+  eccs {
+    phone_number: "984"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+    normal_routing_mncs: "01"
+    normal_routing_mncs: "06"
+  }
+  eccs {
+    phone_number: "985"
+    types: MOUNTAIN_RESCUE
+    routing: NORMAL
+    normal_routing_mncs: "01"
+    normal_routing_mncs: "06"
+  }
+  eccs {
+    phone_number: "997"
+    types: POLICE
+    routing: NORMAL
+    normal_routing_mncs: "01"
+    normal_routing_mncs: "06"
+  }
+  eccs {
+    phone_number: "998"
+    types: FIRE
+    routing: NORMAL
+    normal_routing_mncs: "01"
+    normal_routing_mncs: "06"
+  }
+  eccs {
+    phone_number: "999"
+    types: AMBULANCE
+    routing: NORMAL
+    normal_routing_mncs: "01"
+    normal_routing_mncs: "06"
+  }
+  eccs {
+    phone_number: "986"
+    types: POLICE
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "987"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "989"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "991"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "992"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "993"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "994"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "995"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "996"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
   ecc_fallback: "112"
 }
 countries {
@@ -2470,6 +2618,46 @@
     types: FIRE
     routing: NORMAL
   }
+  eccs {
+    phone_number: "115"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "116000"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "191"
+    types: MOUNTAIN_RESCUE
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "196"
+    types: MARINE_GUARD
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "197"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "116117"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "119"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
+  eccs {
+    phone_number: "116111"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
   ecc_fallback: "112"
 }
 countries {
@@ -2628,6 +2816,7 @@
     phone_number: "995"
     types: AMBULANCE
     types: FIRE
+    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -2652,6 +2841,11 @@
     types: AMBULANCE
     types: FIRE
   }
+  eccs {
+    phone_number: "113"
+    types: POLICE
+    routing: NORMAL
+  }
   ecc_fallback: "112"
 }
 countries {
@@ -2662,6 +2856,11 @@
     types: AMBULANCE
     types: FIRE
   }
+  eccs {
+    phone_number: "159"
+    types: TYPE_UNSPECIFIED
+    routing: NORMAL
+  }
   ecc_fallback: "112"
 }
 countries {
@@ -2984,11 +3183,13 @@
   eccs {
     phone_number: "110"
     types: POLICE
+    routing: NORMAL
   }
   eccs {
     phone_number: "119"
     types: AMBULANCE
     types: FIRE
+    routing: NORMAL
   }
   ecc_fallback: "112"
 }
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index 482ed79..b42de09 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index ea72acd..886451d 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -17,6 +17,7 @@
 package com.android.phone.satellite.accesscontrol;
 
 import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_PROVISIONED;
 import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_SUPPORTED;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
@@ -49,6 +50,7 @@
 import android.telecom.TelecomManager;
 import android.telephony.AnomalyReporter;
 import android.telephony.Rlog;
+import android.telephony.SubscriptionManager;
 import android.telephony.satellite.ISatelliteCommunicationAllowedStateCallback;
 import android.telephony.satellite.SatelliteManager;
 import android.text.TextUtils;
@@ -140,6 +142,8 @@
     @NonNull
     private final ResultReceiver mInternalSatelliteSupportedResultReceiver;
     @NonNull
+    private final ResultReceiver mInternalSatelliteProvisionedResultReceiver;
+    @NonNull
     protected final Object mLock = new Object();
     @GuardedBy("mLock")
     @NonNull
@@ -241,6 +245,12 @@
                 handleIsSatelliteSupportedResult(resultCode, resultData);
             }
         };
+        mInternalSatelliteProvisionedResultReceiver = new ResultReceiver(this) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                handleIsSatelliteProvisionedResult(resultCode, resultData);
+            }
+        };
         // Init the SatelliteOnDeviceAccessController so that the S2 level can be cached
         initSatelliteOnDeviceAccessController();
     }
@@ -723,7 +733,11 @@
                                 false);
                         sendSatelliteAllowResultToReceivers(resultCode, bundle, false);
                     } else {
-                        checkSatelliteAccessRestrictionForCurrentLocation();
+                        logd("Satellite is supported, check if provisioned or not");
+                        int subId = resultData.getInt(SatelliteController.SATELLITE_SUBSCRIPTION_ID,
+                                SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+                        mSatelliteController.requestIsSatelliteProvisioned(
+                                subId, mInternalSatelliteProvisionedResultReceiver);
                     }
                 } else {
                     loge("KEY_SATELLITE_SUPPORTED does not exist.");
@@ -735,6 +749,33 @@
         }
     }
 
+    private void handleIsSatelliteProvisionedResult(int resultCode, Bundle resultData) {
+        logd("handleIsSatelliteProvisionedResult: resultCode=" + resultCode);
+        synchronized (mLock) {
+            if (resultCode == SATELLITE_RESULT_SUCCESS) {
+                if (resultData.containsKey(KEY_SATELLITE_PROVISIONED)) {
+                    boolean isSatelliteProvisioned =
+                            resultData.getBoolean(KEY_SATELLITE_PROVISIONED);
+                    if (!isSatelliteProvisioned) {
+                        logd("Satellite is not provisioned");
+                        Bundle bundle = new Bundle();
+                        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                                false);
+                        sendSatelliteAllowResultToReceivers(resultCode, bundle, false);
+                    } else {
+                        logd("Satellite is provisioned");
+                        checkSatelliteAccessRestrictionForCurrentLocation();
+                    }
+                } else {
+                    loge("KEY_SATELLITE_PROVISIONED does not exist.");
+                    sendSatelliteAllowResultToReceivers(resultCode, resultData, false);
+                }
+            } else {
+                sendSatelliteAllowResultToReceivers(resultCode, resultData, false);
+            }
+        }
+    }
+
     private void sendSatelliteAllowResultToReceivers(int resultCode, Bundle resultData,
             boolean allowed) {
         updateCurrentSatelliteAllowedState(allowed);
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 8a29242..62d9d8c 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -325,6 +325,7 @@
 
         // Network country codes are available.
         setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+        setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
         clearAllInvocations();
         when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(listOf("US", "CA"));
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
@@ -621,6 +622,23 @@
                 any(ResultReceiver.class));
     }
 
+    private void setUpResponseForRequestIsSatelliteProvisioned(
+            boolean isSatelliteProvisioned, @SatelliteManager.SatelliteResult int error) {
+        doAnswer(invocation -> {
+            ResultReceiver resultReceiver = invocation.getArgument(1);
+            if (error == SATELLITE_RESULT_SUCCESS) {
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED,
+                        isSatelliteProvisioned);
+                resultReceiver.send(error, bundle);
+            } else {
+                resultReceiver.send(error, Bundle.EMPTY);
+            }
+            return null;
+        }).when(mMockSatelliteController).requestIsSatelliteProvisioned(anyInt(),
+                any(ResultReceiver.class));
+    }
+
     @SafeVarargs
     private static <E> List<E> listOf(E... values) {
         return Arrays.asList(values);