Merge "Ensure the VoicemailSettingsActivity supports edge to edge." into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f1d877f..355f6ef 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -281,6 +281,16 @@
</intent-filter>
</activity>
+ <activity android:name="com.android.phone.settings.SatelliteConfigViewer"
+ android:label="@string/satellite_config_viewer"
+ android:exported="true"
+ android:theme="@style/DialerSettingsLight">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
<activity android:name="CdmaCallOptions"
android:label="@string/cdma_options"
android:exported="false"
diff --git a/OWNERS b/OWNERS
index 96033ab..dd12ee3 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,4 +2,4 @@
per-file *SimPhonebookProvider* = file:platform/packages/apps/Contacts:/OWNERS
-per-file config.xml=hwangoo@google.com,forestchoi@google.com,avinashmp@google.com,mkoon@google.com,seheele@google.com,radhikaagrawal@google.com,jdyou@google.com
+per-file config.xml=hwangoo@google.com,avinashmp@google.com,mkoon@google.com,seheele@google.com,radhikaagrawal@google.com,jdyou@google.com
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
index c4ab74f..9084891 100644
--- a/res/layout/radio_info.xml
+++ b/res/layout/radio_info.xml
@@ -333,6 +333,16 @@
android:text="@string/demo_esos_satellite_string"
/>
+ <!-- Satellite Config Viewer -->
+ <Button android:id="@+id/satellite_config_viewer"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAllCaps="false"
+ android:text="@string/satellite_config_viewer"
+ />
+
<!-- VoLTE provisioned -->
<Switch android:id="@+id/volte_provisioned_switch"
android:textSize="14sp"
diff --git a/res/layout/satellite_config_viewer.xml b/res/layout/satellite_config_viewer.xml
new file mode 100644
index 0000000..240e697
--- /dev/null
+++ b/res/layout/satellite_config_viewer.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2025 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="120dp"
+ android:layoutDirection="locale"
+ android:textDirection="locale">
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <!-- VERSION -->
+ <LinearLayout style="@style/RadioInfo_entry_layout">
+ <TextView android:text="@string/satellite_config_version_label" style="@style/info_label" />
+ <TextView android:id="@+id/version" style="@style/info_value" />
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"/>
+ </LinearLayout>
+
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="2dip"
+ android:background="?android:attr/listDivider" />
+
+ <!-- cids, plmns, svcTypes -->
+ <LinearLayout style="@style/RadioInfo_entry_layout">
+ <TextView android:text="@string/satellite_config_service_type_label" style="@style/info_label" />
+ <TextView android:id="@+id/svc_type" style="@style/info_value" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="3dip"
+ android:background="?android:attr/listDivider"/>
+
+ <!-- allow access -->
+ <LinearLayout style="@style/RadioInfo_entry_layout">
+ <TextView android:text="@string/satellite_config_allow_access_label" style="@style/info_label" />
+ <TextView android:id="@+id/allow_access" style="@style/info_value" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="4dip"
+ android:background="?android:attr/listDivider"/>
+
+ <!-- country codes -->
+ <LinearLayout style="@style/RadioInfo_entry_layout">
+ <TextView android:text="@string/satellite_config_country_code_label" style="@style/info_label" />
+ <TextView android:id="@+id/country_codes" style="@style/info_value" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="5dip"
+ android:background="?android:attr/listDivider"/>
+
+ <!-- size of sats2dat file -->
+ <LinearLayout style="@style/RadioInfo_entry_layout">
+ <TextView android:text="@string/satellite_config_size_of_sats2_dat_label" style="@style/info_label" />
+ <TextView android:id="@+id/size_of_sats2" style="@style/info_value" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"/>
+
+ <!-- satellite access config json -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/satellite_config_json_label" style="@style/info_label" />
+ <TextView android:id="@+id/config_json" style="@style/info_value" />
+ </LinearLayout>
+
+ </LinearLayout>
+</ScrollView>
+
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index ccf0aa6..8d32f3a 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -485,7 +485,7 @@
<string name="simContacts_emptyLoading" msgid="4989040293858675483">"Leyendo la tarjeta SIM..."</string>
<string name="simContacts_empty" msgid="1135632055473689521">"No hay contactos en tu tarjeta SIM."</string>
<string name="simContacts_title" msgid="2714029230160136647">"Seleccionar contactos para importar"</string>
- <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Desactivar el modo de avión para importar contactos de la tarjeta SIM"</string>
+ <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Desactivar el modo avión para importar contactos de la tarjeta SIM"</string>
<string name="enable_pin" msgid="967674051730845376">"Activar/desactivar PIN de tarjeta SIM"</string>
<string name="change_pin" msgid="3657869530942905790">"Cambiar PIN de tarjeta SIM"</string>
<string name="enter_pin_text" msgid="3182311451978663356">"PIN de tarjeta SIM:"</string>
@@ -537,9 +537,9 @@
<string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"Número de buzón de voz desconocido"</string>
<string name="notification_network_selection_title" msgid="255595526707809121">"Sin servicio"</string>
<string name="notification_network_selection_text" msgid="553288408722427659">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible"</string>
- <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activa la red móvil y desactiva el modo de avión o el modo de ahorro de batería para realizar una llamada."</string>
- <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactivar modo de avión para hacer una llamada"</string>
- <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactivar el modo de avión o conectarse a una red inalámbrica para hacer una llamada"</string>
+ <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activa la red móvil y desactiva el modo avión o el modo de ahorro de batería para realizar una llamada."</string>
+ <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactivar modo avión para hacer una llamada"</string>
+ <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactivar el modo avión o conectarse a una red inalámbrica para hacer una llamada"</string>
<string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Se sobrecalentó el teléfono"</b>\n\n"No se puede completar esta llamada. Vuelve a intentar cuando se enfríe el teléfono.\n\nDe todos modos, puedes hacer llamadas de emergencia."</string>
<string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Para realizar una llamada que no sea de emergencia, sal del modo de devolución de llamada de emergencia."</string>
<string name="incall_error_emergency_only" msgid="8786127461027964653">"No registrado en la red."</string>
@@ -572,7 +572,7 @@
<string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"Vuelve a presionar para llamar al <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
<string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Encendiendo radio..."</string>
<string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"No hay servicio. Vuelve a intentarlo."</string>
- <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"No se puede entrar en modo de avión durante una llamada de emergencia."</string>
+ <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"No se puede entrar en modo avión durante una llamada de emergencia."</string>
<string name="dial_emergency_error" msgid="825822413209026039">"No se puede realizar la llamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
<string name="dial_emergency_empty_error" msgid="2785803395047793634">"No se puede realizar la llamada. Marca un número de emergencia."</string>
<string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"Las llamadas de emergencia no están disponibles"</string>
@@ -717,7 +717,7 @@
<string name="mobile_data_activate_button" msgid="1139792516354374612">"AGREGAR DATOS"</string>
<string name="mobile_data_activate_cancel_button" msgid="3530174817572005860">"CANCELAR"</string>
<string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"Llamada finalizada"</string>
- <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"El modo de avión está activado"</string>
+ <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"El modo avión está activado"</string>
<string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"No se puede acceder a la tarjeta SIM"</string>
<string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"Red móvil no disponible"</string>
<string name="clh_callFailed_satelliteEnabled_txt" msgid="1675517238240377396">"El modo satelital está activado"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 49485ae..7f11fd1 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -85,7 +85,7 @@
<string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"Cuando no se puede contactar con un número, las llamadas se desvían siempre a otro número"</string>
<string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Notificaciones"</string>
<string name="cell_broadcast_settings" msgid="8135324242541809924">"Difusiones de emergencia"</string>
- <string name="call_settings" msgid="3677282690157603818">"Ajustes de llamadas"</string>
+ <string name="call_settings" msgid="3677282690157603818">"Ajustes de llamada"</string>
<string name="additional_gsm_call_settings" msgid="1561980168685658846">"Ajustes adicionales"</string>
<string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Ajustes adicionales (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="sum_gsm_call_settings" msgid="7964692601608878138">"Ajustes adicionales de llamadas solo GSM"</string>
@@ -131,7 +131,7 @@
<string name="disable_cdma_cw" msgid="7119290446496301734">"Cancelar"</string>
<string name="cdma_call_waiting_in_ims_on" msgid="6390979414188659218">"Llamada en espera de CDMA en IMS activada"</string>
<string name="cdma_call_waiting_in_ims_off" msgid="1099246114368636334">"Llamada en espera de CDMA en IMS desactivada"</string>
- <string name="updating_title" msgid="6130548922615719689">"Ajustes de llamadas"</string>
+ <string name="updating_title" msgid="6130548922615719689">"Ajustes de llamada"</string>
<string name="call_settings_admin_user_only" msgid="7238947387649986286">"El administrador es el único usuario que puede cambiar los ajustes de llamada."</string>
<string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Solo el administrador o el usuario de trabajo pueden cambiar la configuración de la cuenta del teléfono."</string>
<string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"El propietario del dispositivo ha restringido la posibilidad de cambiar la configuración de la red móvil."</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3e45f96..c0beb0e 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -867,7 +867,7 @@
<string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS 등록: <xliff:g id="STATUS">%1$s</xliff:g>\nVoLTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nVoWi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\n화상 통화: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT 인터페이스: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"서비스 중"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"서비스 지역 벗어남"</string>
- <string name="radioInfo_service_emergency" msgid="4763879891415016848">"긴급 통화만 허용"</string>
+ <string name="radioInfo_service_emergency" msgid="4763879891415016848">"긴급 전화만 허용"</string>
<string name="radioInfo_service_off" msgid="3456583511226783064">"무선 연결 끊김"</string>
<string name="radioInfo_roaming_in" msgid="3156335577793145965">"로밍"</string>
<string name="radioInfo_roaming_not" msgid="1904547918725478110">"로밍 안함"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 8df54cd..6b4e17c 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -867,7 +867,7 @@
<string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS 注册:<xliff:g id="STATUS">%1$s</xliff:g>\nLTE 语音通话:<xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nWLAN 语音通话:<xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\n视频通话:<xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT 接口:<xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"服务中"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"不在服务区"</string>
- <string name="radioInfo_service_emergency" msgid="4763879891415016848">"只能拨打紧急呼叫电话"</string>
+ <string name="radioInfo_service_emergency" msgid="4763879891415016848">"只能拨打紧急求助电话"</string>
<string name="radioInfo_service_off" msgid="3456583511226783064">"关闭无线装置"</string>
<string name="radioInfo_roaming_in" msgid="3156335577793145965">"漫游"</string>
<string name="radioInfo_roaming_not" msgid="1904547918725478110">"未使用漫游服务"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index d20aa6d..8385490 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -303,7 +303,7 @@
<string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_2">%2$s</xliff:g>期間使用了 <xliff:g id="ID_1">%1$s</xliff:g> 的行動數據"</string>
<string name="advanced_options_title" msgid="9208195294513520934">"進階"</string>
<string name="carrier_settings_euicc" msgid="1190237227261337749">"電信業者"</string>
- <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"電信業者, eSIM 卡, SIM 卡, eUICC, 切換電信業者, 新增電信業者"</string>
+ <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"電信業者, eSIM, SIM 卡, eUICC, 切換電信業者, 新增電信業者"</string>
<string name="carrier_settings_euicc_summary" msgid="2027941166597330117">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
<string name="mobile_data_settings_title" msgid="7228249980933944101">"行動數據"</string>
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"使用行動網路存取數據"</string>
@@ -843,7 +843,7 @@
<string name="dsds_dialog_message" msgid="4047480385678538850">"你必須重新啟動裝置,才能變更這項設定。"</string>
<string name="dsds_dialog_confirm" msgid="9032004888134129885">"重新啟動"</string>
<string name="dsds_dialog_cancel" msgid="3245958947099586655">"取消"</string>
- <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 卡設為預設 eSIM 卡"</string>
+ <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 設為預設 eSIM"</string>
<string name="radio_info_radio_power" msgid="8805595022160471587">"行動無線電電源"</string>
<string name="simulate_out_of_service_string" msgid="7787925611727597193">"模擬無法使用服務的情況 (僅限偵錯版本)"</string>
<string name="enforce_satellite_channel_string" msgid="295306734591329892">"強制執行 Camp 衛星 LTE 頻道 (僅限偵錯版本)"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 06e81b2..41c98e3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2249,4 +2249,21 @@
<string name="send_from_work_profile_action_str">Switch to work profile</string>
<string name="install_messages_on_work_profile_action_str">Install a work messages app</string>
+ <!-- The title of option menu from phoneInfo test screen, to show satellite config -->
+ <string name="radio_info_data_view_satellite_config">Show Satellite Config</string>
+ <!-- Title of SatelliteConfigViewer screen -->
+ <string name="satellite_config_viewer">Satellite Config Viewer</string>
+ <!-- Satellite config viewer screen. Label for the config data version -->
+ <string name="satellite_config_version_label">version: </string>
+ <!-- Satellite config viewer screen. Label for the subId/plmn/servicetype -->
+ <string name="satellite_config_service_type_label">subId/plmn/servicetype: </string>
+ <!-- Satellite config viewer screen. Label for the allow access -->
+ <string name="satellite_config_allow_access_label">allow_access: </string>
+ <!-- Satellite config viewer screen. Label for the country codes -->
+ <string name="satellite_config_country_code_label">country codes: </string>
+ <!-- Satellite config viewer screen. Label for size of the s2sat.dat file -->
+ <string name="satellite_config_size_of_sats2_dat_label">size of sats2.dat: </string>
+ <!-- Satellite config viewer screen. satellite access config json file -->
+ <string name="satellite_config_json_label">satellite access config json: </string>
+
</resources>
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 5f3fc97..26ff9c7 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -141,6 +141,9 @@
@NonNull private boolean[] mHasSentConfigChange;
// Whether the broadcast was sent from EVENT_SYSTEM_UNLOCKED, to track rebroadcasts
@NonNull private boolean[] mFromSystemUnlocked;
+ // Whether this carrier config loading needs to trigger
+ // TelephonyRegistryManager.notifyCarrierConfigChanged
+ @NonNull private boolean[] mNeedNotifyCallback;
// CarrierService change monitoring
@NonNull private CarrierServiceChangeCallback[] mCarrierServiceChangeCallbacks;
@@ -257,6 +260,7 @@
}
switch (msg.what) {
case EVENT_CLEAR_CONFIG: {
+ mNeedNotifyCallback[phoneId] = true;
clearConfigForPhone(phoneId, true);
break;
}
@@ -268,8 +272,10 @@
// trying to load the carrier config when the SIM is still loading when the
// unlock happens.
if (mHasSentConfigChange[i]) {
- logdWithLocalLog("System unlocked");
+ logl("System unlocked");
mFromSystemUnlocked[i] = true;
+ // Do not add mNeedNotifyCallback[phoneId] = true here. We intentionally
+ // do not want to notify callback when system unlock happens.
updateConfigForPhoneId(i);
}
}
@@ -281,8 +287,9 @@
// Always clear up the cache and re-load config from scratch since the carrier
// service change is reliable and specific to the phoneId now.
clearCachedConfigForPackage(carrierPackageName);
- logdWithLocalLog("Package changed: " + carrierPackageName
+ logl("Package changed: " + carrierPackageName
+ ", phone=" + phoneId);
+ mNeedNotifyCallback[phoneId] = true;
updateConfigForPhoneId(phoneId);
break;
}
@@ -375,7 +382,7 @@
ICarrierService carrierService =
ICarrierService.Stub.asInterface(conn.service);
carrierService.getCarrierConfig(phoneId, carrierId, resultReceiver);
- logdWithLocalLog("Fetch config for default app: "
+ logl("Fetch config for default app: "
+ mPlatformCarrierConfigPackage
+ ", carrierId=" + carrierId.getSpecificCarrierId());
} catch (RemoteException e) {
@@ -494,7 +501,7 @@
if (config != null) {
mConfigFromCarrierApp[phoneId] = config;
} else {
- logdWithLocalLog("Config from carrier app is null "
+ logl("Config from carrier app is null "
+ "for phoneId " + phoneId);
// Put a stub bundle in place so that the rest of the logic
// continues smoothly.
@@ -510,7 +517,7 @@
ICarrierService carrierService =
ICarrierService.Stub.asInterface(conn.service);
carrierService.getCarrierConfig(phoneId, carrierId, resultReceiver);
- logdWithLocalLog("Fetch config for carrier app: "
+ logl("Fetch config for carrier app: "
+ getCarrierPackageForPhoneId(phoneId)
+ ", carrierId=" + carrierId.getSpecificCarrierId());
} catch (RemoteException e) {
@@ -676,7 +683,7 @@
ICarrierService carrierService =
ICarrierService.Stub.asInterface(conn.service);
carrierService.getCarrierConfig(phoneId, null, resultReceiver);
- logdWithLocalLog("Fetch no sim config from default app: "
+ logl("Fetch no sim config from default app: "
+ mPlatformCarrierConfigPackage);
} catch (RemoteException e) {
loge("Failed to get no sim carrier config from default app: " +
@@ -728,6 +735,7 @@
mServiceBound = new boolean[mNumPhones];
mHasSentConfigChange = new boolean[mNumPhones];
mFromSystemUnlocked = new boolean[mNumPhones];
+ mNeedNotifyCallback = new boolean[mNumPhones];
mServiceConnectionForNoSimConfig = new CarrierServiceConnection[mNumPhones];
mServiceBoundForNoSimConfig = new boolean[mNumPhones];
mCarrierServiceChangeCallbacks = new CarrierServiceChangeCallback[mNumPhones];
@@ -866,16 +874,21 @@
TelephonyRegistryManager trm = mContext.getSystemService(TelephonyRegistryManager.class);
// Unlike broadcast, we wouldn't notify registrants on carrier config change when device is
// unlocked. Only real carrier config change will send the notification to registrants.
- if (trm != null && !mFromSystemUnlocked[phoneId]) {
+ if (trm != null && (mFeatureFlags.carrierConfigChangedCallbackFix()
+ ? mNeedNotifyCallback[phoneId] : !mFromSystemUnlocked[phoneId])) {
+ logl("Notify carrier config changed callback for phone " + phoneId);
trm.notifyCarrierConfigChanged(phoneId, subId, carrierId, specificCarrierId);
+ mNeedNotifyCallback[phoneId] = false;
+ } else {
+ logl("Skipped notifying carrier config changed callback for phone " + phoneId);
}
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
if (SubscriptionManager.isValidSubscriptionId(subId)) {
- logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subId);
+ logl("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subId);
} else {
- logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId);
+ logl("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId);
}
mHasSentConfigChange[phoneId] = true;
mFromSystemUnlocked[phoneId] = false;
@@ -896,7 +909,7 @@
/** Binds to the default or carrier config app. */
private boolean bindToConfigPackage(@NonNull String pkgName, int phoneId, int eventId) {
- logdWithLocalLog("Binding to " + pkgName + " for phone " + phoneId);
+ logl("Binding to " + pkgName + " for phone " + phoneId);
Intent carrierService = new Intent(CarrierService.CARRIER_SERVICE_INTERFACE);
carrierService.setPackage(pkgName);
CarrierServiceConnection serviceConnection = new CarrierServiceConnection(
@@ -1071,7 +1084,7 @@
return;
}
- logdWithLocalLog("Save carrier config to cache. phoneId=" + phoneId
+ logl("Save carrier config to cache. phoneId=" + phoneId
+ ", xml=" + getFilePathForLogging(fileName) + ", version=" + version);
FileOutputStream outFile = null;
@@ -1175,7 +1188,7 @@
}
if (restoredBundle != null) {
- logdWithLocalLog("Restored carrier config from cache. phoneId=" + phoneId + ", xml="
+ logl("Restored carrier config from cache. phoneId=" + phoneId + ", xml="
+ getFilePathForLogging(fileName) + ", version=" + savedVersion
+ ", modified time=" + getFileTime(filePath));
}
@@ -1232,7 +1245,7 @@
});
if (packageFiles == null || packageFiles.length < 1) return false;
for (File f : packageFiles) {
- logdWithLocalLog("Deleting " + getFilePathForLogging(f.getName()));
+ logl("Deleting " + getFilePathForLogging(f.getName()));
f.delete();
}
return true;
@@ -1299,7 +1312,7 @@
if (mNumPhones == oldNumPhones) {
return;
}
- logdWithLocalLog("mNumPhones change from " + oldNumPhones + " to " + mNumPhones);
+ logl("mNumPhones change from " + oldNumPhones + " to " + mNumPhones);
// If DS -> SS switch, release the resources BEFORE truncating the arrays to avoid leaking
for (int phoneId = mNumPhones; phoneId < oldNumPhones; phoneId++) {
@@ -1332,10 +1345,12 @@
mServiceBoundForNoSimConfig = Arrays.copyOf(mServiceBoundForNoSimConfig, mNumPhones);
mHasSentConfigChange = Arrays.copyOf(mHasSentConfigChange, mNumPhones);
mFromSystemUnlocked = Arrays.copyOf(mFromSystemUnlocked, mNumPhones);
+ mNeedNotifyCallback = Arrays.copyOf(mNeedNotifyCallback, mNumPhones);
mCarrierServiceChangeCallbacks = Arrays.copyOf(mCarrierServiceChangeCallbacks, mNumPhones);
// Load the config for all the phones and re-register callback AFTER padding the arrays.
for (int phoneId = 0; phoneId < mNumPhones; phoneId++) {
+ mNeedNotifyCallback[phoneId] = true;
updateConfigForPhoneId(phoneId);
mCarrierServiceChangeCallbacks[phoneId] = new CarrierServiceChangeCallback(phoneId);
TelephonyManager.from(mContext).registerCarrierPrivilegesCallback(phoneId,
@@ -1464,6 +1479,7 @@
// Post to run on handler thread on which all states should be confined.
mHandler.post(() -> {
+ mNeedNotifyCallback[phoneId] = true;
overrideConfig(mOverrideConfigs, phoneId, overrides);
if (persistent) {
@@ -1483,7 +1499,7 @@
fileToDelete.delete();
}
}
- logdWithLocalLog("overrideConfig: subId=" + subscriptionId + ", persistent="
+ logl("overrideConfig: subId=" + subscriptionId + ", persistent="
+ persistent + ", overrides=" + overrides);
updateSubscriptionDatabase(phoneId);
});
@@ -1520,7 +1536,7 @@
enforceTelephonyFeatureWithException(getCurrentPackageName(),
"notifyConfigChangedForSubId");
- logdWithLocalLog("Notified carrier config changed. phoneId=" + phoneId
+ logl("Notified carrier config changed. phoneId=" + phoneId
+ ", subId=" + subscriptionId);
// This method should block until deleting has completed, so that an error which prevents us
@@ -1529,6 +1545,7 @@
String callingPackageName = mContext.getPackageManager().getNameForUid(
Binder.getCallingUid());
clearCachedConfigForPackage(callingPackageName);
+ mNeedNotifyCallback[phoneId] = true;
updateConfigForPhoneId(phoneId);
}
@@ -1536,7 +1553,7 @@
@Override
public void updateConfigForPhoneId(int phoneId, @NonNull String simState) {
updateConfigForPhoneId_enforcePermission();
- logdWithLocalLog("Update config for phoneId=" + phoneId + " simState=" + simState);
+ logl("Update config for phoneId=" + phoneId + " simState=" + simState);
if (!SubscriptionManager.isValidPhoneId(phoneId)) {
throw new IllegalArgumentException("Invalid phoneId: " + phoneId);
}
@@ -1554,6 +1571,7 @@
break;
case IccCardConstants.INTENT_VALUE_ICC_LOADED:
case IccCardConstants.INTENT_VALUE_ICC_LOCKED:
+ mNeedNotifyCallback[phoneId] = true;
updateConfigForPhoneId(phoneId);
break;
}
@@ -1703,6 +1721,7 @@
+ Arrays.toString(mServiceBoundForNoSimConfig));
indentPW.println("mHasSentConfigChange=" + Arrays.toString(mHasSentConfigChange));
indentPW.println("mFromSystemUnlocked=" + Arrays.toString(mFromSystemUnlocked));
+ indentPW.println("mNeedNotifyCallback=" + Arrays.toString(mNeedNotifyCallback));
indentPW.println();
indentPW.println("CarrierConfigLoader local log=");
indentPW.increaseIndent();
@@ -1909,8 +1928,7 @@
return;
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
Binder.getCallingUserHandle())
|| mVendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
// Skip to check associated telephony feature,
@@ -2067,7 +2085,7 @@
Log.d(LOG_TAG, msg, tr);
}
- private void logdWithLocalLog(@NonNull String msg) {
+ private void logl(@NonNull String msg) {
Log.d(LOG_TAG, msg);
mCarrierConfigLoadingLog.log(msg);
}
diff --git a/src/com/android/phone/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index e2ae343..65ca6f5 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -1009,8 +1009,7 @@
return;
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
Binder.getCallingUserHandle())
|| mVendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
// Skip to check associated telephony feature,
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 1139850..4fe2d24 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -843,11 +843,6 @@
* @param subId The subscription ID
*/
void updateNetworkSelection(int serviceState, int subId) {
- if (!mFeatureFlags.dismissNetworkSelectionNotificationOnSimDisable()) {
- updateNetworkSelectionForFeatureDisabled(serviceState, subId);
- return;
- }
-
// for dismissNetworkSelectionNotificationOnSimDisable feature enabled.
int phoneId = SubscriptionManager.getPhoneId(subId);
Phone phone = SubscriptionManager.isValidPhoneId(phoneId) ?
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 17d3392..df6b766 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -17,7 +17,6 @@
package com.android.phone;
import android.annotation.IntDef;
-import android.annotation.Nullable;
import android.app.Activity;
import android.app.KeyguardManager;
import android.app.ProgressDialog;
@@ -443,19 +442,11 @@
//TODO: handle message here;
break;
case EVENT_DATA_ROAMING_SETTINGS_CHANGED:
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- updateDataRoamingStatus(
- ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED);
- } else {
- updateDataRoamingStatusForFeatureDisabled(null);
- }
+ updateDataRoamingStatus(
+ ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED);
break;
case EVENT_MOBILE_DATA_SETTINGS_CHANGED:
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED);
- } else {
- updateDataRoamingStatusForFeatureDisabled(null);
- }
+ updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED);
break;
case EVENT_CARRIER_CONFIG_CHANGED:
int subId = (Integer) msg.obj;
@@ -510,11 +501,7 @@
public PhoneGlobals(Context context) {
super(context);
sMe = this;
- if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()) {
- if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
- mSettingsObserver = new SettingsObserver(context, mHandler);
- }
- } else {
+ if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
mSettingsObserver = new SettingsObserver(context, mHandler);
}
}
@@ -524,9 +511,8 @@
ContentResolver resolver = getContentResolver();
- if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- && !getResources().getBoolean(
- com.android.internal.R.bool.config_force_phone_globals_creation)) {
+ if (!getResources().getBoolean(
+ com.android.internal.R.bool.config_force_phone_globals_creation)) {
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
Log.v(LOG_TAG, "onCreate()... but not defined FEATURE_TELEPHONY");
return;
@@ -896,11 +882,7 @@
/** Clear fields on power off radio **/
private void clearCacheOnRadioOff() {
// Re-show is-roaming notifications after APM mode
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- mShownNotificationReasons.clear();
- } else {
- mPrevRoamingOperatorNumerics.clear();
- }
+ mShownNotificationReasons.clear();
}
private void setRadioPowerOn() {
@@ -997,11 +979,7 @@
} else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
// Roaming status could be overridden by carrier config, so we need to update it.
if (VDBG) Log.v(LOG_TAG, "carrier config changed.");
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED);
- } else {
- updateDataRoamingStatusForFeatureDisabled(null);
- }
+ updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED);
updateLimitedSimFunctionForDualSim();
int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
@@ -1016,12 +994,8 @@
registerSettingsObserver();
Phone phone = getPhone(mDefaultDataSubId);
if (phone != null) {
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- updateDataRoamingStatus(
- ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED);
- } else {
- updateDataRoamingStatusForFeatureDisabled(null);
- }
+ updateDataRoamingStatus(
+ ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED);
}
}
}
@@ -1037,11 +1011,7 @@
+ mDefaultDataSubId + ", ss roaming=" + serviceState.getDataRoaming());
}
if (subId == mDefaultDataSubId) {
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED);
- } else {
- updateDataRoamingStatusForFeatureDisabled(serviceState.getOperatorNumeric());
- }
+ updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED);
}
}
@@ -1067,26 +1037,24 @@
List<DataDisallowedReason> disallowReasons = phone.getDataNetworkController()
.getInternetDataDisallowedReasons();
- if (mFeatureFlags.roamingNotificationForSingleDataNetwork()) {
- if (disallowReasons.contains(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
- && disallowReasons.contains(DataDisallowedReason.ROAMING_DISABLED)
- && (notificationReason == ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED
- || notificationReason
- == ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED)) {
- // If the ONLY_ALLOWED_SINGLE_NETWORK disallow reason has not yet been removed due
- // to a change in mobile_data (including roaming_data) settings, update roaming
- // notification again after the Internet is completely disconnected to check
- // ONLY_ALLOWED_SINGLE_NETWORK disallow reason is removed.
- mWaitForInternetDisconnection.set(true);
- Log.d(LOG_TAG, "updateDataRoamingStatus,"
- + " wait for internet disconnection for single data network");
- } else if (!disallowReasons.contains(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
- && mWaitForInternetDisconnection.compareAndSet(true, false)) {
- // If the ONLY_ALLOWED_SINGLE_NETWORK disallow reason has been removed,
- // no longer wait for Internet disconnection.
- Log.d(LOG_TAG, "updateDataRoamingStatus,"
- + " cancel to wait for internet disconnection for single data network");
- }
+ if (disallowReasons.contains(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
+ && disallowReasons.contains(DataDisallowedReason.ROAMING_DISABLED)
+ && (notificationReason == ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED
+ || notificationReason
+ == ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED)) {
+ // If the ONLY_ALLOWED_SINGLE_NETWORK disallow reason has not yet been removed due
+ // to a change in mobile_data (including roaming_data) settings, update roaming
+ // notification again after the Internet is completely disconnected to check
+ // ONLY_ALLOWED_SINGLE_NETWORK disallow reason is removed.
+ mWaitForInternetDisconnection.set(true);
+ Log.d(LOG_TAG, "updateDataRoamingStatus,"
+ + " wait for internet disconnection for single data network");
+ } else if (!disallowReasons.contains(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
+ && mWaitForInternetDisconnection.compareAndSet(true, false)) {
+ // If the ONLY_ALLOWED_SINGLE_NETWORK disallow reason has been removed,
+ // no longer wait for Internet disconnection.
+ Log.d(LOG_TAG, "updateDataRoamingStatus,"
+ + " cancel to wait for internet disconnection for single data network");
}
updateDataRoamingStatus(notificationReason, disallowReasons, serviceState);
@@ -1229,88 +1197,6 @@
return mCurrentRoamingNotification;
}
- // For reorganize_roaming_notification feature disabled.
- /**
- * When roaming, if mobile data cannot be established due to data roaming not enabled, we need
- * to notify the user so they can enable it through settings. Vise versa if the condition
- * changes, we need to dismiss the notification.
- * @param roamingOperatorNumeric The operator numeric for the current roaming. {@code null} if
- * the current roaming operator numeric didn't change.
- */
- private void updateDataRoamingStatusForFeatureDisabled(
- @Nullable String roamingOperatorNumeric) {
- if (VDBG) Log.v(LOG_TAG, "updateDataRoamingStatusForFeatureDisabled");
- Phone phone = getPhone(mDefaultDataSubId);
- if (phone == null) {
- Log.w(LOG_TAG, "Can't get phone with sub id = " + mDefaultDataSubId);
- return;
- }
-
- boolean dataAllowed;
- boolean notAllowedDueToRoamingOff;
- List<DataDisallowedReason> reasons = phone.getDataNetworkController()
- .getInternetDataDisallowedReasons();
- dataAllowed = reasons.isEmpty();
- notAllowedDueToRoamingOff = (reasons.size() == 1
- && reasons.contains(DataDisallowedReason.ROAMING_DISABLED));
- mDataRoamingNotifLog.log("dataAllowed=" + dataAllowed + ", reasons=" + reasons
- + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
- if (VDBG) {
- Log.v(LOG_TAG, "dataAllowed=" + dataAllowed + ", reasons=" + reasons
- + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
- }
-
- if (!dataAllowed && notAllowedDueToRoamingOff) {
- // Don't show roaming notification if we've already shown for this MccMnc
- if (roamingOperatorNumeric != null
- && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
- Log.d(LOG_TAG, "Skip roaming disconnected notification since already shown in "
- + "MccMnc " + roamingOperatorNumeric);
- return;
- }
- // No need to show it again if we never cancelled it explicitly.
- if (mPrevRoamingNotification == ROAMING_NOTIFICATION_DISCONNECTED) return;
- // If the only reason of no data is data roaming disabled, then we notify the user
- // so the user can turn on data roaming.
- mPrevRoamingNotification = ROAMING_NOTIFICATION_DISCONNECTED;
- Log.d(LOG_TAG, "Show roaming disconnected notification");
- mDataRoamingNotifLog.log("Show roaming off.");
- Message msg = mHandler.obtainMessage(EVENT_DATA_ROAMING_DISCONNECTED);
- msg.arg1 = mDefaultDataSubId;
- msg.sendToTarget();
- } else if (dataAllowed && dataIsNowRoaming(mDefaultDataSubId)) {
- if (!shouldShowRoamingNotification(roamingOperatorNumeric != null
- ? roamingOperatorNumeric : phone.getServiceState().getOperatorNumeric())) {
- Log.d(LOG_TAG, "Skip showing roaming connected notification.");
- return;
- }
- // Don't show roaming notification if we've already shown for this MccMnc
- if (roamingOperatorNumeric != null
- && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
- Log.d(LOG_TAG, "Skip roaming connected notification since already shown in "
- + "MccMnc " + roamingOperatorNumeric);
- return;
- }
- // No need to show it again if we never cancelled it explicitly, or carrier config
- // indicates this is not needed.
- if (mPrevRoamingNotification == ROAMING_NOTIFICATION_CONNECTED) return;
- mPrevRoamingNotification = ROAMING_NOTIFICATION_CONNECTED;
- Log.d(LOG_TAG, "Show roaming connected notification");
- mDataRoamingNotifLog.log("Show roaming on.");
- Message msg = mHandler.obtainMessage(EVENT_DATA_ROAMING_CONNECTED);
- msg.arg1 = mDefaultDataSubId;
- msg.sendToTarget();
- } else if (mPrevRoamingNotification != ROAMING_NOTIFICATION_NO_NOTIFICATION) {
- // Otherwise we either 1) we are not roaming or 2) roaming is off but ROAMING_DISABLED
- // is not the only data disable reason. In this case we dismiss the notification we
- // showed earlier.
- mPrevRoamingNotification = ROAMING_NOTIFICATION_NO_NOTIFICATION;
- Log.d(LOG_TAG, "Dismiss roaming notification");
- mDataRoamingNotifLog.log("Hide. data allowed=" + dataAllowed);
- mHandler.sendEmptyMessage(EVENT_DATA_ROAMING_OK);
- }
- }
-
/**
*
* @param subId to check roaming on
@@ -1448,16 +1334,8 @@
pw.increaseIndent();
pw.println("FeatureFlags:");
pw.increaseIndent();
- pw.println("reorganizeRoamingNotification="
- + mFeatureFlags.reorganizeRoamingNotification());
- pw.println("dismissNetworkSelectionNotificationOnSimDisable="
- + mFeatureFlags.dismissNetworkSelectionNotificationOnSimDisable());
pw.decreaseIndent();
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- pw.println("mCurrentRoamingNotification=" + mCurrentRoamingNotification);
- } else {
- pw.println("mPrevRoamingNotification=" + mPrevRoamingNotification);
- }
+ pw.println("mCurrentRoamingNotification=" + mCurrentRoamingNotification);
pw.println("mDefaultDataSubId=" + mDefaultDataSubId);
pw.println("isSmsCapable=" + TelephonyManager.from(this).isSmsCapable());
pw.println("mDataRoamingNotifLog:");
@@ -1495,11 +1373,7 @@
}
pw.decreaseIndent();
pw.decreaseIndent();
- if (mFeatureFlags.reorganizeRoamingNotification()) {
- pw.println("mShownNotificationReasons=" + mShownNotificationReasons);
- } else {
- pw.println("mPrevRoamingOperatorNumerics:" + mPrevRoamingOperatorNumerics);
- }
+ pw.println("mShownNotificationReasons=" + mShownNotificationReasons);
pw.println("------- End PhoneGlobals -------");
}
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 0548aa5..f4b2545 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -8446,10 +8446,8 @@
public boolean isRttEnabled(int subscriptionId) {
final long identity = Binder.clearCallingIdentity();
try {
- if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()) {
- if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS)) {
- return false;
- }
+ if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS)) {
+ return false;
}
boolean isRttSupported = isRttSupported(subscriptionId);
@@ -11265,8 +11263,7 @@
throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
Binder.getCallingUserHandle())) {
if (!isImsAvailableOnDevice()) {
// ProvisioningManager can not handle ServiceSpecificException.
@@ -11870,8 +11867,7 @@
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
Binder.getCallingUserHandle())) {
if (!isImsAvailableOnDevice()) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
@@ -11909,8 +11905,7 @@
throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
Binder.getCallingUserHandle())) {
if (!isImsAvailableOnDevice()) {
// operation failed silently
@@ -11943,8 +11938,7 @@
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
Binder.getCallingUserHandle())) {
if (!isImsAvailableOnDevice()) {
// ProvisioningManager can not handle ServiceSpecificException.
@@ -11975,8 +11969,7 @@
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
Binder.getCallingUserHandle())) {
if (!isImsAvailableOnDevice()) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
@@ -14750,8 +14743,7 @@
return;
}
- if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
- || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
+ if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
Binder.getCallingUserHandle())
|| mVendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
// Skip to check associated telephony feature,
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java
index ad0926b..b22fb64 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java
@@ -26,8 +26,6 @@
import android.telephony.satellite.SatellitePosition;
import android.util.Log;
-import com.android.internal.annotations.VisibleForTesting;
-
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -302,7 +300,6 @@
* @return json string type json contents
*/
@Nullable
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public static String readJsonStringFromFile(@NonNull String jsonFilePath) {
logd("jsonFilePath is " + jsonFilePath);
String json = null;
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index c8a8475..aaba0f7 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -60,6 +60,7 @@
import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
+import android.os.FileUtils;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.HandlerThread;
@@ -75,7 +76,6 @@
import android.telecom.TelecomManager;
import android.telephony.AnomalyReporter;
import android.telephony.CarrierConfigManager;
-import android.telephony.DropBoxManagerLoggerBackend;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PersistentLogger;
import android.telephony.Rlog;
@@ -106,6 +106,7 @@
import com.android.internal.telephony.satellite.SatelliteConfig;
import com.android.internal.telephony.satellite.SatelliteConstants;
import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.internal.telephony.satellite.SatelliteServiceUtils;
import com.android.internal.telephony.satellite.metrics.AccessControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.ConfigUpdaterMetricsStats;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
@@ -497,10 +498,7 @@
@Nullable File s2CellFile) {
super(looper);
mContext = context;
- if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
- mPersistentLogger = new PersistentLogger(
- DropBoxManagerLoggerBackend.getInstance(context));
- }
+ mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context);
mFeatureFlags = featureFlags;
mLocationManager = locationManager;
mTelecomManager = telecomManager;
@@ -623,7 +621,6 @@
+ satelliteSubscriberProvisionStatus);
}
};
- initializeSatelliteSystemNotification(context);
result = mSatelliteController.registerForSatelliteProvisionStateChanged(
mInternalSatelliteProvisionStateCallback);
plogd("registerForSatelliteProvisionStateChanged result: " + result);
@@ -708,7 +705,9 @@
plogd("EVENT_LOCATION_SETTINGS_ENABLED");
case EVENT_LOCATION_SETTINGS_DISABLED:
// Fall through
+ plogd("EVENT_LOCATION_SETTINGS_DISABLED");
case EVENT_COUNTRY_CODE_CHANGED:
+ plogd("EVENT_COUNTRY_CODE_CHANGED");
handleSatelliteAllowedRegionPossiblyChanged(msg.what);
break;
case CMD_UPDATE_SYSTEM_SELECTION_CHANNELS:
@@ -716,6 +715,7 @@
break;
case EVENT_SATELLITE_SUBSCRIPTION_CHANGED:
plogd("Event: EVENT_SATELLITE_SUBSCRIPTION_CHANGED");
+ initializeSatelliteSystemNotification(mContext);
handleEventDisallowedReasonsChanged();
break;
default:
@@ -828,6 +828,9 @@
if (reset) {
mIsOverlayConfigOverridden = false;
cleanUpCtsResources();
+ cleanUpTelephonyConfigs();
+ cleanUpSatelliteAccessConfigOtaResources();
+ cleanupSatelliteConfigOtaResources();
} else {
mIsOverlayConfigOverridden = true;
mOverriddenIsSatelliteAllowAccessControl = isAllowed;
@@ -839,7 +842,6 @@
+ " does not exist");
mOverriddenSatelliteS2CellFile = null;
}
- ///TODO :: need to check when thi will be reloaded this map
mCachedAccessRestrictionMap.clear();
} else {
mOverriddenSatelliteS2CellFile = null;
@@ -1049,6 +1051,39 @@
}
}
+ private void cleanUpTelephonyConfigs() {
+ mSatelliteController.cleanUpTelephonyConfigs();
+ }
+
+ private void cleanUpSatelliteAccessConfigOtaResources() {
+ PhoneGlobals phoneGlobals = PhoneGlobals.getInstance();
+ File satelliteAccessControlDir =
+ phoneGlobals.getDir(SATELLITE_ACCESS_CONTROL_DATA_DIR, Context.MODE_PRIVATE);
+ if (satelliteAccessControlDir == null || !satelliteAccessControlDir.exists()) {
+ plogd(
+ "cleanUpSatelliteAccessConfigOtaResources: "
+ + SATELLITE_ACCESS_CONTROL_DATA_DIR
+ + " does not exist");
+ return;
+ }
+ plogd(
+ "cleanUpSatelliteAccessConfigOtaResources: Deleting contents under "
+ + SATELLITE_ACCESS_CONTROL_DATA_DIR);
+ FileUtils.deleteContents(satelliteAccessControlDir);
+ }
+
+ private void cleanupSatelliteConfigOtaResources() {
+ SatelliteConfig satelliteConfig = mSatelliteController.getSatelliteConfig();
+ if (satelliteConfig == null) {
+ plogd(
+ "cleanupSatelliteConfigOtaResources: satelliteConfig is null. Cannot or Not"
+ + " needed to delete satellite config OTA files");
+ return;
+ }
+ plogd("cleanupSatelliteConfigOtaResources: Deleting satellite config OTA files");
+ satelliteConfig.cleanOtaResources(mContext);
+ }
+
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected long getElapsedRealtimeNanos() {
return SystemClock.elapsedRealtimeNanos();
@@ -1497,8 +1532,13 @@
}
}
+ /**
+ * Returns a list of satellite country codes.
+ *
+ * @return The list of satellite country codes.
+ */
@NonNull
- private List<String> getSatelliteCountryCodes() {
+ public List<String> getSatelliteCountryCodes() {
synchronized (mLock) {
if (mIsOverlayConfigOverridden) {
return mOverriddenSatelliteCountryCodes;
@@ -1507,8 +1547,13 @@
}
}
+ /**
+ * Returns a satellite s2 cell file
+ *
+ * @return The file of satellite s2 cell
+ */
@Nullable
- protected File getSatelliteS2CellFile() {
+ public File getSatelliteS2CellFile() {
synchronized (mLock) {
if (mIsOverlayConfigOverridden) {
return mOverriddenSatelliteS2CellFile;
@@ -1517,8 +1562,13 @@
}
}
+ /**
+ * Returns a satellite access config file
+ *
+ * @return The file of satellite access config
+ */
@Nullable
- protected File getSatelliteAccessConfigFile() {
+ public File getSatelliteAccessConfigFile() {
synchronized (mLock) {
if (mIsOverlayConfigOverridden) {
logd("mIsOverlayConfigOverridden: " + mIsOverlayConfigOverridden);
@@ -1532,8 +1582,12 @@
}
}
-
- private boolean isSatelliteAllowAccessControl() {
+ /**
+ * Checks if satellite access control is allowed.
+ *
+ * @return {@code true} if satellite access control is allowed, {@code false} otherwise.
+ */
+ public boolean isSatelliteAllowAccessControl() {
synchronized (mLock) {
if (mIsOverlayConfigOverridden) {
return mOverriddenIsSatelliteAllowAccessControl;
@@ -1684,10 +1738,19 @@
private void sendSatelliteAllowResultToReceivers(int resultCode, Bundle resultData,
boolean allowed) {
plogd("sendSatelliteAllowResultToReceivers : resultCode is " + resultCode);
- if (resultCode == SATELLITE_RESULT_SUCCESS) {
- updateCurrentSatelliteAllowedState(allowed);
- mIsCurrentLocationEligibleForNotification = true;
+ switch(resultCode) {
+ case SATELLITE_RESULT_SUCCESS:
+ updateCurrentSatelliteAllowedState(allowed);
+ mIsCurrentLocationEligibleForNotification = true;
+ break;
+
+ case SATELLITE_RESULT_LOCATION_DISABLED:
+ updateCurrentSatelliteAllowedState(allowed);
+ break;
+ default:
+ break;
}
+
synchronized (mLock) {
for (ResultReceiver resultReceiver : mSatelliteAllowResultReceivers) {
resultReceiver.send(resultCode, resultData);
@@ -1936,7 +1999,8 @@
.setAutoCancel(true)
.setColor(context.getColor(
com.android.internal.R.color.system_notification_accent_color))
- .setVisibility(Notification.VISIBILITY_PUBLIC);
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setLocalOnly(true);
return notificationBuilder.build();
}
@@ -2282,9 +2346,9 @@
plogd(
"checkSatelliteAccessRestrictionForLocation: "
+ "checking satellite access restriction for location: lat - "
- + location.getLatitude()
+ + Rlog.pii(TAG, location.getLatitude())
+ ", long - "
- + location.getLongitude()
+ + Rlog.pii(TAG, location.getLongitude())
+ ", mS2Level - "
+ mS2Level);
SatelliteOnDeviceAccessController.LocationToken locationToken =
@@ -2336,9 +2400,9 @@
"checkSatelliteAccessRestrictionForLocation: "
+ (satelliteAllowed ? "Satellite Allowed" : "Satellite NOT Allowed")
+ " for location: lat - "
- + location.getLatitude()
+ + Rlog.pii(TAG, location.getLatitude())
+ ", long - "
- + location.getLongitude()
+ + Rlog.pii(TAG, location.getLongitude())
+ ", mS2Level - "
+ mS2Level);
Bundle bundle = new Bundle();
@@ -2531,6 +2595,8 @@
*/
private boolean initSatelliteOnDeviceAccessController()
throws IllegalStateException {
+ plogd("initSatelliteOnDeviceAccessController");
+
synchronized (mLock) {
if (getSatelliteS2CellFile() == null) return false;
@@ -2544,6 +2610,10 @@
mSatelliteOnDeviceAccessController =
SatelliteOnDeviceAccessController.create(
getSatelliteS2CellFile(), mFeatureFlags);
+
+ plogd(
+ "initSatelliteOnDeviceAccessController: initialized"
+ + " SatelliteOnDeviceAccessController");
restartKeepOnDeviceAccessControllerResourcesTimer();
mS2Level = mSatelliteOnDeviceAccessController.getS2Level();
plogd("mS2Level=" + mS2Level);
@@ -2699,7 +2769,6 @@
return accessAllowed;
}
-
@Nullable
protected String getSatelliteConfigurationFileNameFromOverlayConfig(
@NonNull Context context) {
@@ -3194,19 +3263,6 @@
Rlog.v(TAG, log);
}
- private boolean isSatellitePersistentLoggingEnabled(
- @NonNull Context context, @NonNull FeatureFlags featureFlags) {
- if (featureFlags.satellitePersistentLogging()) {
- return true;
- }
- try {
- return context.getResources().getBoolean(
- R.bool.config_dropboxmanager_persistent_logging_enabled);
- } catch (RuntimeException e) {
- return false;
- }
- }
-
/**
* This API can be used only for test purpose to override the carrier roaming Ntn eligibility
*
@@ -3345,6 +3401,17 @@
return satelliteDisallowedReasons;
}
+ /**
+ * Returns the satellite access configuration version.
+ *
+ * If the satellite config data hasn't been updated by configUpdater,
+ * it returns 0. If it has been updated, it returns the updated version information.
+ */
+ @NonNull
+ public int getSatelliteAccessConfigVersion() {
+ return mSatelliteAccessConfigVersion;
+ }
+
private void plogv(@NonNull String log) {
Rlog.v(TAG, log);
if (mPersistentLogger != null) {
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
index 1f46ff6..60b57c3 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
@@ -37,7 +37,6 @@
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
-
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.ExponentialBackoff;
@@ -118,10 +117,6 @@
* @param featureFlags The feature flag.
*/
public static void make(@NonNull Context context, @NonNull FeatureFlags featureFlags) {
- if (!featureFlags.carrierEnabledSatelliteFlag()) {
- logd("carrierEnabledSatelliteFlag is disabled. don't created this.");
- return;
- }
if (sInstance == null) {
HandlerThread handlerThread = new HandlerThread(TAG);
handlerThread.start();
@@ -253,6 +248,51 @@
sendEmptyMessage(CMD_START_QUERY_ENTITLEMENT);
}
+ private int[] getServiceTypeForEntitlementMetrics(Map<String, List<Integer>> map) {
+ if (map == null || map.isEmpty()) {
+ return new int[]{};
+ }
+
+ return map.entrySet().stream()
+ .findFirst()
+ .map(entry -> {
+ List<Integer> list = entry.getValue();
+ if (list == null) {
+ return new int[]{}; // Return empty array if the list is null
+ }
+ return list.stream().mapToInt(Integer::intValue).toArray();
+ })
+ .orElse(new int[]{}); // Return empty array if no entry is found
+ }
+
+ private int getDataPolicyForEntitlementMetrics(Map<String, Integer> dataPolicyMap) {
+ if (dataPolicyMap != null && !dataPolicyMap.isEmpty()) {
+ return dataPolicyMap.values().stream().findFirst()
+ .orElse(-1);
+ }
+ return -1;
+ }
+
+ private void reportSuccessForEntitlement(int subId, SatelliteEntitlementResult
+ entitlementResult) {
+ // allowed service info entitlement status
+ boolean isAllowedServiceInfo = !entitlementResult
+ .getAvailableServiceTypeInfoForPlmnList().isEmpty();
+
+ int[] serviceType = new int[0];
+ int dataPolicy = 0;
+ if (isAllowedServiceInfo) {
+ serviceType = getServiceTypeForEntitlementMetrics(
+ entitlementResult.getAvailableServiceTypeInfoForPlmnList());
+ dataPolicy = SatelliteController.getInstance().mapDataPolicyForMetrics(
+ getDataPolicyForEntitlementMetrics(
+ entitlementResult.getDataServicePolicyInfoForPlmnList()));
+ }
+ mEntitlementMetricsStats.reportSuccess(subId,
+ getEntitlementStatus(entitlementResult), true, isAllowedServiceInfo,
+ serviceType, dataPolicy);
+ }
+
/**
* Check if the device can request to entitlement server (if there is an internet connection and
* if the throttle time has passed since the last request), and then pass the response to
@@ -273,8 +313,7 @@
SatelliteEntitlementResult entitlementResult = getSatelliteEntitlementApi(
subId).checkEntitlementStatus();
mSatelliteEntitlementResultPerSub.put(subId, entitlementResult);
- mEntitlementMetricsStats.reportSuccess(subId,
- getEntitlementStatus(entitlementResult), false);
+ reportSuccessForEntitlement(subId, entitlementResult);
}
} catch (ServiceEntitlementException e) {
loge(e.toString());
@@ -341,8 +380,8 @@
SatelliteEntitlementResult entitlementResult = getSatelliteEntitlementApi(
subId).checkEntitlementStatus();
mSatelliteEntitlementResultPerSub.put(subId, entitlementResult);
- mEntitlementMetricsStats.reportSuccess(subId,
- getEntitlementStatus(entitlementResult), true);
+ reportSuccessForEntitlement(subId, entitlementResult);
+
}
} catch (ServiceEntitlementException e) {
loge(e.toString());
diff --git a/src/com/android/phone/security/SafetySourceReceiver.java b/src/com/android/phone/security/SafetySourceReceiver.java
index 99394c2..835c79b 100644
--- a/src/com/android/phone/security/SafetySourceReceiver.java
+++ b/src/com/android/phone/security/SafetySourceReceiver.java
@@ -26,7 +26,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.flags.Flags;
import com.android.phone.PhoneGlobals;
import com.android.telephony.Rlog;
@@ -45,11 +44,7 @@
return;
}
- if (Flags.enforceTelephonyFeatureMappingForPublicApis()) {
- if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
- refreshSafetySources(refreshBroadcastId);
- }
- } else {
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
refreshSafetySources(refreshBroadcastId);
}
}
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index 5f0b2c1..be4f2a4 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -335,6 +335,7 @@
private Button mEsosButton;
private Button mSatelliteEnableNonEmergencyModeButton;
private Button mEsosDemoButton;
+ private Button mSatelliteConfigViewerButton;
private Switch mImsVolteProvisionedSwitch;
private Switch mImsVtProvisionedSwitch;
private Switch mImsWfcProvisionedSwitch;
@@ -576,6 +577,7 @@
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ SettingsConstants.setupEdgeToEdge(this);
mSystemUser = android.os.Process.myUserHandle().isSystem();
log("onCreate: mSystemUser=" + mSystemUser);
UserManager userManager = getSystemService(UserManager.class);
@@ -808,6 +810,7 @@
mEsosDemoButton = (Button) findViewById(R.id.demo_esos_questionnaire);
mSatelliteEnableNonEmergencyModeButton = (Button) findViewById(
R.id.satellite_enable_non_emergency_mode);
+ mSatelliteConfigViewerButton = (Button) findViewById(R.id.satellite_config_viewer);
if (shouldHideButton(mActionEsos)) {
mEsosButton.setVisibility(View.GONE);
@@ -837,6 +840,14 @@
});
}
+ mSatelliteConfigViewerButton.setOnClickListener(v -> {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.putExtra("mSubId", mSubId);
+ intent.setClassName("com.android.phone",
+ "com.android.phone.settings.SatelliteConfigViewer");
+ startActivityAsUser(intent, UserHandle.CURRENT);
+ });
+
mOemInfoButton = (Button) findViewById(R.id.oem_info);
mOemInfoButton.setOnClickListener(mOemInfoButtonHandler);
PackageManager pm = getPackageManager();
diff --git a/src/com/android/phone/settings/SatelliteConfigViewer.java b/src/com/android/phone/settings/SatelliteConfigViewer.java
new file mode 100644
index 0000000..4d7309f
--- /dev/null
+++ b/src/com/android/phone/settings/SatelliteConfigViewer.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.settings;
+
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+import static android.telephony.SubscriptionManager.getDefaultSubscriptionId;
+
+import android.annotation.ArrayRes;
+import android.annotation.NonNull;
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.MenuItem;
+import android.widget.TextView;
+
+import com.android.internal.telephony.flags.FeatureFlagsImpl;
+import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.phone.R;
+import com.android.phone.satellite.accesscontrol.SatelliteAccessConfigurationParser;
+import com.android.phone.satellite.accesscontrol.SatelliteAccessController;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+
+public class SatelliteConfigViewer extends Activity {
+ private static final String TAG = SatelliteConfigViewer.class.getSimpleName();
+
+ private TextView mVersion;
+ private TextView mServiceType;
+ private TextView mAllowAccess;
+ private TextView mCountryCodes;
+ private TextView mSizeOfSats2;
+ private TextView mConfigAccessJson;
+
+ private SatelliteController mSatelliteController;
+ private SatelliteAccessController mSatelliteAccessController;
+
+ private int mSubId = INVALID_SUBSCRIPTION_ID;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.satellite_config_viewer);
+ Log.d(TAG, "SatelliteConfigViewer: onCreate");
+
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ Intent intentRadioInfo = getIntent();
+ mSubId = intentRadioInfo.getIntExtra("mSubId", getDefaultSubscriptionId());
+ Log.d(TAG, "SatelliteConfigViewer: mSubId: " + mSubId);
+
+ mVersion = (TextView) findViewById(R.id.version);
+ mServiceType = (TextView) findViewById(R.id.svc_type);
+ mAllowAccess = (TextView) findViewById(R.id.allow_access);
+ mCountryCodes = (TextView) findViewById(R.id.country_codes);
+ mSizeOfSats2 = (TextView) findViewById(R.id.size_of_sats2);
+ mConfigAccessJson = (TextView) findViewById(R.id.config_json);
+
+ mSatelliteController = SatelliteController.getInstance();
+ mSatelliteAccessController = SatelliteAccessController.getOrCreateInstance(
+ getApplicationContext(), new FeatureFlagsImpl());
+
+ mVersion.setText(getSatelliteConfigVersion());
+ mServiceType.setText(getSatelliteCarrierConfigUpdateData());
+ mAllowAccess.setText(getSatelliteAllowAccess());
+ mCountryCodes.setText(getSatelliteConfigCountryCodes());
+ mSizeOfSats2.setText(getSatelliteS2SatFileSize(getApplicationContext()));
+ mConfigAccessJson.setText(getSatelliteConfigJsonFile(getApplicationContext()));
+ }
+
+ private String getSatelliteConfigVersion() {
+ logd("getSatelliteConfigVersion");
+ return Integer.toString(mSatelliteAccessController.getSatelliteAccessConfigVersion());
+ }
+
+ private String getSatelliteCarrierConfigUpdateData() {
+ logd("getSatelliteCarrierConfigUpdateData");
+ HashMap<String, List<Integer>> mapPlmnServiceType = new HashMap<>();
+ List<String> plmnList = mSatelliteController.getSatellitePlmnsForCarrier(mSubId);
+ for (String plmn : plmnList) {
+ List<Integer> listServiceType =
+ mSatelliteController.getSupportedSatelliteServicesForPlmn(mSubId, plmn);
+ mapPlmnServiceType.put(plmn, listServiceType);
+ }
+ logd("getSatelliteCarrierConfigUpdateData: " + "subId: " + mSubId + ": "
+ + mapPlmnServiceType);
+ return "subId: " + mSubId + ": " + mapPlmnServiceType;
+ }
+
+ private String getSatelliteAllowAccess() {
+ logd("getSatelliteAllowAccess");
+ return Boolean.toString(mSatelliteAccessController.isSatelliteAllowAccessControl());
+ }
+
+ private String getSatelliteConfigCountryCodes() {
+ logd("getSatelliteConfigCountryCodes");
+ return String.join(",", mSatelliteAccessController.getSatelliteCountryCodes());
+ }
+
+ private String getSatelliteConfigJsonFile(Context context) {
+ logd("getSatelliteConfigJsonFile");
+
+ File jsonFile = mSatelliteAccessController.getSatelliteAccessConfigFile();
+ if (jsonFile == null) {
+ loge("getSatelliteConfigJsonFile: satellite access config json file is null");
+ return "satellite access config json file is not ready";
+ }
+ return SatelliteAccessConfigurationParser
+ .readJsonStringFromFile(jsonFile.getAbsolutePath());
+ }
+
+ private String getSatelliteS2SatFileSize(Context context) {
+ logd("getSatelliteS2SatFileSize");
+ File s2CellFile = mSatelliteAccessController.getSatelliteS2CellFile();
+ if (s2CellFile == null) {
+ loge("getSatelliteS2SatFileSize: s2satFile is null");
+ return "s2satFile is null";
+ }
+ return Long.toString(s2CellFile.length());
+ }
+
+ @NonNull
+ private static String[] readStringArrayFromOverlayConfig(
+ @NonNull Context context, @ArrayRes int id) {
+ String[] strArray = null;
+ try {
+ strArray = context.getResources().getStringArray(id);
+ } catch (Resources.NotFoundException ex) {
+ loge("readStringArrayFromOverlayConfig: id= " + id + ", ex=" + ex);
+ }
+ if (strArray == null) {
+ strArray = new String[0];
+ }
+ return strArray;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@androidx.annotation.NonNull MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private static void logd(@NonNull String log) {
+ Log.d(TAG, log);
+ }
+
+ private static void loge(@NonNull String log) {
+ Log.e(TAG, log);
+ }
+}
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index de4076d..2222fb8 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -1398,8 +1398,7 @@
Build.VERSION.DEVICE_INITIAL_SDK_INT);
PackageManager pm = context.getPackageManager();
- if (Flags.enforceTelephonyFeatureMappingForPublicApis()
- && vendorApiLevel >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
+ if (vendorApiLevel >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
if (pm != null && pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
&& pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
sInstance = new TelecomAccountRegistry(context);
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 6860b25..320e8be 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -220,6 +220,8 @@
private final CdmaConferenceController mCdmaConferenceController =
new CdmaConferenceController(this);
+ private com.android.server.telecom.flags.FeatureFlags mTelecomFlags =
+ new com.android.server.telecom.flags.FeatureFlagsImpl();
private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
private ImsConferenceController mImsConferenceController;
@@ -4512,6 +4514,8 @@
*/
public void maybeIndicateAnsweringWillDisconnect(@NonNull TelephonyConnection connection,
@NonNull PhoneAccountHandle phoneAccountHandle) {
+ // With sequencing, Telecom handles setting the extra.
+ if (mTelecomFlags.enableCallSequencing()) return;
if (isCallPresentOnOtherSub(phoneAccountHandle)) {
if (mTelephonyManagerProxy.isConcurrentCallsPossible()
&& allCallsSupportHold(connection)) {
@@ -4922,8 +4926,10 @@
/* Only for testing */
@VisibleForTesting
- public void setFeatureFlags(FeatureFlags featureFlags) {
+ public void setFeatureFlags(FeatureFlags featureFlags,
+ com.android.server.telecom.flags.FeatureFlags telecomFlags) {
mFeatureFlags = featureFlags;
+ mTelecomFlags = telecomFlags;
}
private void loge(String s) {
diff --git a/tests/src/com/android/TelephonyTestBase.java b/tests/src/com/android/TelephonyTestBase.java
index 94e91d3..5e7cdda 100644
--- a/tests/src/com/android/TelephonyTestBase.java
+++ b/tests/src/com/android/TelephonyTestBase.java
@@ -37,6 +37,7 @@
import com.android.internal.telephony.data.DataNetworkController;
import com.android.internal.telephony.metrics.MetricsCollector;
import com.android.internal.telephony.metrics.PersistAtomsStorage;
+import com.android.internal.telephony.satellite.SatelliteController;
import com.android.phone.PhoneGlobals;
import com.android.phone.PhoneInterfaceManager;
@@ -80,6 +81,9 @@
doCallRealMethod().when(mPhoneGlobals).getBaseContext();
doCallRealMethod().when(mPhoneGlobals).getResources();
+ doCallRealMethod().when(mPhoneGlobals).getSystemService(Mockito.anyString());
+ doCallRealMethod().when(mPhoneGlobals).getSystemService(Mockito.any(Class.class));
+ doCallRealMethod().when(mPhoneGlobals).getSystemServiceName(Mockito.any(Class.class));
doCallRealMethod().when(mPhone).getServiceState();
mContext = spy(new TestContext());
@@ -96,6 +100,8 @@
replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[] {mPhone});
replaceInstance(PhoneGlobals.class, "sMe", null, mPhoneGlobals);
replaceInstance(PhoneFactory.class, "sMetricsCollector", null, mMetricsCollector);
+ replaceInstance(SatelliteController.class, "sInstance", null,
+ Mockito.mock(SatelliteController.class));
doReturn(Mockito.mock(PersistAtomsStorage.class)).when(mMetricsCollector).getAtomsStorage();
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index bf7832a..54ee6e0 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -33,6 +33,7 @@
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
+import android.net.ConnectivityManager;
import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
@@ -72,6 +73,7 @@
@Mock ImsManager mMockImsManager;
@Mock UserManager mMockUserManager;
@Mock PackageManager mPackageManager;
+ @Mock ConnectivityManager mMockConnectivityManager;
private final SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
@@ -192,6 +194,9 @@
case Context.CARRIER_CONFIG_SERVICE: {
return mMockCarrierConfigManager;
}
+ case Context.CONNECTIVITY_SERVICE: {
+ return mMockConnectivityManager;
+ }
case Context.TELECOM_SERVICE: {
return mMockTelecomManager;
}
@@ -216,6 +221,9 @@
if (serviceClass == CarrierConfigManager.class) {
return Context.CARRIER_CONFIG_SERVICE;
}
+ if (serviceClass == ConnectivityManager.class) {
+ return Context.CONNECTIVITY_SERVICE;
+ }
if (serviceClass == TelecomManager.class) {
return Context.TELECOM_SERVICE;
}
diff --git a/tests/src/com/android/phone/CarrierConfigLoaderTest.java b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
index 5190b21..324bcbc 100644
--- a/tests/src/com/android/phone/CarrierConfigLoaderTest.java
+++ b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
@@ -28,6 +28,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -69,6 +70,7 @@
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -115,6 +117,8 @@
@Before
public void setUp() throws Exception {
super.setUp();
+ doReturn(true).when(mPackageManager).hasSystemFeature(
+ eq(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION));
doReturn(Context.PERMISSION_ENFORCER_SERVICE).when(mContext).getSystemServiceName(
eq(PermissionEnforcer.class));
doReturn(mFakePermissionEnforcer).when(mContext).getSystemService(
@@ -431,7 +435,6 @@
replaceInstance(CarrierConfigLoader.class, "mVendorApiLevel", mCarrierConfigLoader,
vendorApiLevel);
- doReturn(true).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
doReturn(false).when(mPackageManager).hasSystemFeature(
eq(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION));
@@ -482,4 +485,41 @@
mCarrierConfigLoader.updateConfigForPhoneId(1, IccCardConstants.INTENT_VALUE_ICC_ABSENT);
mTestableLooper.processAllMessages();
}
+
+ @Test
+ public void testSystemUnlocked_noCallback() throws Exception {
+ replaceInstance(TelephonyManager.class, "sInstance", null, mTelephonyManager);
+ replaceInstance(CarrierConfigLoader.class, "mHasSentConfigChange",
+ mCarrierConfigLoader, new boolean[]{true});
+ doNothing().when(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
+
+ mFakePermissionEnforcer.grant(android.Manifest.permission.MODIFY_PHONE_STATE);
+ // Prepare to make sure we can save the config into the XML file which used as cache
+ doReturn(PLATFORM_CARRIER_CONFIG_PACKAGE).when(mTelephonyManager)
+ .getCarrierServicePackageNameForLogicalSlot(anyInt());
+
+ doReturn(true).when(mContext).bindService(
+ any(Intent.class), any(ServiceConnection.class), anyInt());
+ Mockito.clearInvocations(mTelephonyRegistryManager);
+ Mockito.clearInvocations(mContext);
+ mHandler.sendMessage(mHandler.obtainMessage(13 /* EVENT_SYSTEM_UNLOCKED */));
+ mTestableLooper.processAllMessages();
+ mHandler.sendMessage(mHandler.obtainMessage(5 /* EVENT_FETCH_DEFAULT_DONE */));
+ mTestableLooper.processAllMessages();
+ mHandler.sendMessage(mHandler.obtainMessage(6 /* EVENT_FETCH_CARRIER_DONE */));
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
+ verify(mSubscriptionManagerService).updateSubscriptionByCarrierConfig(eq(0), anyString(),
+ any(PersistableBundle.class), runnableCaptor.capture());
+
+ runnableCaptor.getValue().run();
+ mTestableLooper.processAllMessages();
+
+ // Broadcast should be sent for backwards compatibility.
+ verify(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
+ // But callback should not be sent.
+ verify(mTelephonyRegistryManager, never()).notifyCarrierConfigChanged(
+ anyInt(), anyInt(), anyInt(), anyInt());
+ }
}
diff --git a/tests/src/com/android/phone/LocationAccessPolicyTest.java b/tests/src/com/android/phone/LocationAccessPolicyTest.java
index 551c2cb..7acdb77 100644
--- a/tests/src/com/android/phone/LocationAccessPolicyTest.java
+++ b/tests/src/com/android/phone/LocationAccessPolicyTest.java
@@ -148,7 +148,7 @@
}
}
- private static final int TESTING_UID = 10001;
+ private static final int TESTING_UID = UserHandle.getUid(UserHandle.myUserId(), 10001);
private static final int TESTING_PID = 8009;
private static final String TESTING_CALLING_PACKAGE = "com.android.phone";
diff --git a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
index bbcb52b..88b84a7 100644
--- a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
+++ b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
@@ -142,7 +142,6 @@
// In order not to affect the existing implementation, define a telephony features
// and disabled enforce_telephony_feature_mapping_for_public_apis feature flag
mPhoneInterfaceManager.setFeatureFlags(mFeatureFlags);
- doReturn(false).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
doReturn(true).when(mFeatureFlags).hsumPackageManager();
mPhoneInterfaceManager.setPackageManager(mPackageManager);
doReturn(mPackageManager).when(mPhoneGlobals).getPackageManager();
@@ -508,7 +507,6 @@
@Test
@EnableCompatChanges({TelephonyManager.ENABLE_FEATURE_MAPPING})
public void testWithTelephonyFeatureAndCompatChanges() throws Exception {
- doReturn(true).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
mPhoneInterfaceManager.setFeatureFlags(mFeatureFlags);
doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
@@ -533,7 +531,6 @@
doReturn(false).when(mPackageManager).hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_RADIO_ACCESS);
mPhoneInterfaceManager.setPackageManager(mPackageManager);
- doReturn(true).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
mPhoneInterfaceManager.setFeatureFlags(mFeatureFlags);
doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
diff --git a/tests/src/com/android/phone/SimPhonebookProviderTest.java b/tests/src/com/android/phone/SimPhonebookProviderTest.java
index d8518f8..817c53e 100644
--- a/tests/src/com/android/phone/SimPhonebookProviderTest.java
+++ b/tests/src/com/android/phone/SimPhonebookProviderTest.java
@@ -29,11 +29,11 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -169,8 +169,7 @@
@Test
public void query_entityFiles_noSim_returnsEmptyCursor() {
- when(mMockSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
- ImmutableList.of());
+ doReturn(ImmutableList.of()).when(mMockSubscriptionManager).getActiveSubscriptionInfoList();
try (Cursor cursor = mResolver.query(ElementaryFiles.CONTENT_URI, null, null, null)) {
assertThat(cursor).hasCount(0);
@@ -363,7 +362,7 @@
// Use a mock so that a null list can be returned
IIccPhoneBook mockIccPhoneBook = mock(
IIccPhoneBook.class, AdditionalAnswers.delegatesTo(mIccPhoneBook));
- when(mockIccPhoneBook.getAdnRecordsInEfForSubscriber(anyInt(), anyInt())).thenReturn(null);
+ doReturn(null).when(mockIccPhoneBook).getAdnRecordsInEfForSubscriber(anyInt(), anyInt());
TestableSimPhonebookProvider.setup(mResolver, mMockSubscriptionManager, mockIccPhoneBook);
try (Cursor adnCursor = mResolver.query(SimRecords.getContentUri(1, EF_ADN), null, null,
@@ -1334,14 +1333,14 @@
}
private void setupSimsWithSubscriptionIds(int... subscriptionIds) {
- when(mMockSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(subscriptionIds);
- when(mMockSubscriptionManager.getActiveSubscriptionInfoCount())
- .thenReturn(subscriptionIds.length);
+ doReturn(subscriptionIds).when(mMockSubscriptionManager).getActiveSubscriptionIdList();
+ doReturn(subscriptionIds.length).when(mMockSubscriptionManager)
+ .getActiveSubscriptionInfoCount();
List<SubscriptionInfo> subscriptions = createSubscriptionsWithIds(subscriptionIds);
- when(mMockSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(subscriptions);
+ doReturn(subscriptions).when(mMockSubscriptionManager).getActiveSubscriptionInfoList();
for (SubscriptionInfo info : subscriptions) {
- when(mMockSubscriptionManager.getActiveSubscriptionInfo(info.getSubscriptionId()))
- .thenReturn(info);
+ doReturn(info).when(mMockSubscriptionManager)
+ .getActiveSubscriptionInfo(info.getSubscriptionId());
}
}
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 12d848c..b4ae4b9 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -240,6 +240,10 @@
@Mock
private ConcurrentHashMap<IBinder, ISatelliteCommunicationAccessStateCallback>
mSatelliteCommunicationAllowedStateCallbackMap;
+ @Mock
+ private ConcurrentHashMap<IBinder, ISatelliteCommunicationAccessStateCallback>
+ mMockSatelliteCommunicationAccessStateChangedListeners;
+
private SatelliteInfo mSatelliteInfo;
private TestableLooper mTestableLooper;
@@ -421,7 +425,6 @@
.putInt(anyString(), anyInt());
doNothing().when(mMockSharedPreferencesEditor).apply();
- when(mMockFeatureFlags.satellitePersistentLogging()).thenReturn(true);
when(mMockFeatureFlags.geofenceEnhancementForBetterUx()).thenReturn(true);
when(mMockFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
@@ -1758,7 +1761,6 @@
mSatelliteAccessControllerUT,
DEFAULT_S2_LEVEL);
when(mMockFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
- when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
when(mMockContext.getResources()).thenReturn(mMockResources);
when(mMockResources.getBoolean(
com.android.internal.R.bool.config_oem_enabled_satellite_access_allow))
@@ -1976,7 +1978,8 @@
@Test
public void testLocationModeChanged() throws Exception {
- // setup for querying GPS not to reset mIsSatelliteAllowedRegionPossiblyChanged false.
+ logd("testLocationModeChanged: setup to query the current location");
+ when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
when(mMockContext.getResources()).thenReturn(mMockResources);
when(mMockResources.getBoolean(
com.android.internal.R.bool.config_oem_enabled_satellite_access_allow))
@@ -1991,13 +1994,13 @@
doReturn(false).when(mMockCachedAccessRestrictionMap).containsKey(any());
mSatelliteAccessControllerUT.elapsedRealtimeNanos = TEST_LOCATION_FRESH_DURATION_NANOS + 1;
- // Captor and Verify if the mockReceiver and mocContext is registered well
- verify(mMockContext, times(2))
- .registerReceiver(mLocationBroadcastReceiverCaptor.capture(),
- mIntentFilterCaptor.capture());
+ logd("testLocationModeChanged: "
+ + "captor and verify if the mockReceiver and mockContext is registered well");
+ verify(mMockContext, times(2)).registerReceiver(
+ mLocationBroadcastReceiverCaptor.capture(), mIntentFilterCaptor.capture());
- // When the intent action is not MODE_CHANGED_ACTION,
- // verify if the location manager never invoke isLocationEnabled()
+ logd("testLocationModeChanged: verify if the location manager doesn't invoke "
+ + "isLocationEnabled(), when the intent action is not MODE_CHANGED_ACTION");
doReturn("").when(mMockLocationIntent).getAction();
mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
mSatelliteAccessControllerUT.getLocationBroadcastReceiver()
@@ -2006,6 +2009,8 @@
// When the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is true,
// verify if mIsSatelliteAllowedRegionPossiblyChanged is true
+ logd("testLocationModeChanged: verify if mIsSatelliteAllowedRegionPossiblyChanged is true, "
+ + "when the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is true");
doReturn(MODE_CHANGED_ACTION).when(mMockLocationIntent).getAction();
doReturn(true).when(mMockLocationManager).isLocationEnabled();
clearInvocations(mMockLocationManager);
@@ -2016,8 +2021,15 @@
mTestableLooper.processAllMessages();
assertEquals(true, mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
- // When the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is false,
- // verify if mIsSatelliteAllowedRegionPossiblyChanged is false
+ logd("testLocationModeChanged: "
+ + "verify if mIsSatelliteAllowedRegionPossiblyChanged is false, "
+ + "when the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is false");
+ mSatelliteAccessControllerUT
+ .setIsSatelliteCommunicationAllowedForCurrentLocationCache("cache_allowed");
+ replaceInstance(SatelliteAccessController.class,
+ "mSatelliteCommunicationAccessStateChangedListeners",
+ mSatelliteAccessControllerUT,
+ mMockSatelliteCommunicationAccessStateChangedListeners);
doReturn(false).when(mMockLocationManager).isLocationEnabled();
clearInvocations(mMockLocationManager);
mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
@@ -2025,7 +2037,9 @@
.onReceive(mMockContext, mMockLocationIntent);
verify(mMockLocationManager, times(1)).isLocationEnabled();
mTestableLooper.processAllMessages();
- assertEquals(false, mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
+ assertEquals(false,
+ mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
+ verify(mMockSatelliteCommunicationAccessStateChangedListeners, times(1)).values();
}
@Test
diff --git a/tests/src/com/android/phone/security/SafetySourceReceiverTest.java b/tests/src/com/android/phone/security/SafetySourceReceiverTest.java
index 584fb25..7268771 100644
--- a/tests/src/com/android/phone/security/SafetySourceReceiverTest.java
+++ b/tests/src/com/android/phone/security/SafetySourceReceiverTest.java
@@ -35,7 +35,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.flags.Flags;
import org.junit.Before;
import org.junit.Rule;
@@ -91,9 +90,6 @@
@Test
public void testOnReceive_noTelephonyFeature() {
- mSetFlagsRule.enableFlags(
- Flags.FLAG_ENFORCE_TELEPHONY_FEATURE_MAPPING_FOR_PUBLIC_APIS);
-
when(mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY)).thenReturn(false);
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 12b34d0..3710d6a 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -258,6 +258,7 @@
@Mock private EmergencyStateTracker mEmergencyStateTracker;
@Mock private Resources mMockResources;
@Mock private FeatureFlags mFeatureFlags;
+ @Mock private com.android.server.telecom.flags.FeatureFlags mTelecomFlags;
private Phone mPhone0;
private Phone mPhone1;
@@ -285,7 +286,7 @@
super.setUp();
mTestConnectionService = new TestTelephonyConnectionService(mContext);
- mTestConnectionService.setFeatureFlags(mFeatureFlags);
+ mTestConnectionService.setFeatureFlags(mFeatureFlags, mTelecomFlags);
mTestConnectionService.setPhoneFactoryProxy(mPhoneFactoryProxy);
mTestConnectionService.setSubscriptionManagerProxy(mSubscriptionManagerProxy);
// Set configurations statically
@@ -337,7 +338,6 @@
mTestConnectionService.setTelephonyManagerProxy(mTelephonyManagerProxy);
mBinderStub = (IConnectionService.Stub) mTestConnectionService.onBind(null);
- mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
mSetFlagsRule.enableFlags(Flags.FLAG_DO_NOT_OVERRIDE_PRECISE_LABEL);
mSetFlagsRule.enableFlags(Flags.FLAG_CALL_EXTRA_FOR_NON_HOLD_SUPPORTED_CARRIERS);
}
@@ -1862,6 +1862,7 @@
@Test
@SmallTest
public void testSecondCallSameSubWontDisconnect() throws Exception {
+ doReturn(false).when(mTelecomFlags).enableCallSequencing();
// Previous test gets us into a good enough state
testIncomingDoesntRequestDisconnect();
@@ -3805,8 +3806,6 @@
@Test
public void testNormalCallUsingNonTerrestrialNetwork_enableFlag() throws Exception {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
setupForCallTest();
// Call is not supported while using satellite
when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
@@ -3832,8 +3831,6 @@
@Test
public void testNormalCallUsingSatelliteConnectedWithinHysteresisTime() throws Exception {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
// Call is not supported when device is connected to satellite within hysteresis time
setupForCallTest();
when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
@@ -3859,25 +3856,7 @@
}
@Test
- public void testNormalCallUsingNonTerrestrialNetwork_disableFlag() throws Exception {
- mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
- setupForCallTest();
- // Flag is disabled, so call is supported while using satellite
- when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
- when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any())).thenReturn(
- List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE));
-
- // UnsupportedOperationException is thrown as we cannot perform actual call
- assertThrows(UnsupportedOperationException.class, () -> mTestConnectionService
- .onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
- createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1)));
- }
-
- @Test
public void testNormalCallUsingNonTerrestrialNetwork_canMakeWifiCall() throws Exception {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
setupForCallTest();
// Call is not supported while using satellite
when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
@@ -3895,7 +3874,6 @@
@Test
public void testNormalCallWhenEligibilityIsTrue() throws Exception {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN);
setupForCallTest();
@@ -3938,8 +3916,6 @@
@Test
public void testIsAvailableForEmergencyCallsUsingNonTerrestrialNetwork_enableFlag() {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
// Call is not supported while using satellite
when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
@@ -3960,33 +3936,7 @@
}
@Test
- public void testIsAvailableForEmergencyCallsUsingNonTerrestrialNetwork_disableFlag() {
- mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
- // Call is supported while using satellite
- when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
- when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
- .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE));
- Phone mockPhone = Mockito.mock(Phone.class);
- ServiceState ss = new ServiceState();
- ss.setEmergencyOnly(true);
- ss.setState(ServiceState.STATE_EMERGENCY_ONLY);
- when(mockPhone.getServiceState()).thenReturn(ss);
-
- when(mPhoneFactoryProxy.getPhones()).thenReturn(new Phone[] {mockPhone});
-
- assertTrue(mTestConnectionService.isAvailableForEmergencyCalls(mockPhone,
- EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY));
- assertFalse(mTestConnectionService.isAvailableForEmergencyCalls(mockPhone,
- EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL));
- assertTrue(mTestConnectionService.isAvailableForEmergencyCalls(mockPhone,
- EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN));
- }
-
- @Test
public void testIsAvailableForEmergencyCallsUsingNTN_CellularAvailable() {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
// Call is not supported while using satellite
when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
@@ -4018,8 +3968,6 @@
@Test
public void testIsAvailableForEmergencyCallsUsingNTN_CellularNotAvailable() {
- mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
// Call is not supported while using satellite
when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))