Merge "Add Taiwan country code to be formatted for local calls to remove the international prefix." into main
diff --git a/flags/data.aconfig b/flags/data.aconfig
index f93999b..d956104 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -25,10 +25,13 @@
# OWNER=linggm TARGET=24Q3
flag {
- name: "auto_data_switch_rat_ss"
+ name: "auto_data_switch_uses_data_enabled"
namespace: "telephony"
- description: "Whether switch for better rat and signal strength"
- bug:"260928808"
+ description: "Separately consider the backup phone's data allowed and data enabled."
+ bug: "338552223"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
}
# OWNER=linggm TARGET=24Q2
diff --git a/flags/satellite.aconfig b/flags/satellite.aconfig
index 27ab0b1..ea814f3 100644
--- a/flags/satellite.aconfig
+++ b/flags/satellite.aconfig
@@ -25,4 +25,20 @@
namespace: "telephony"
description: "This flag enables satellite internet support."
bug:"326972202"
-}
\ No newline at end of file
+}
+
+# OWNER=xalle TARGET=24Q3
+flag {
+ name: "satellite_persistent_logging"
+ namespace: "telephony"
+ description: "This flag enables satellite persistent logging"
+ bug:"339877723"
+}
+
+# OWNER=hyosunkim TARGET=24Q3
+flag {
+ name: "carrier_roaming_nb_iot_ntn"
+ namespace: "telephony"
+ description: "This flag enables satellite carrier roaming to nb iot ntn."
+ bug:"348253735"
+}
diff --git a/flags/subscription.aconfig b/flags/subscription.aconfig
index 32e8f2d..9a5dabc 100644
--- a/flags/subscription.aconfig
+++ b/flags/subscription.aconfig
@@ -65,3 +65,15 @@
purpose: PURPOSE_BUGFIX
}
}
+
+# OWNER=songferngwang TARGET=24Q3
+flag {
+ name: "reset_primary_sim_default_values"
+ namespace: "telephony"
+ description: "Reset the default values to the remaining sim"
+ bug: "339394518"
+
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/flags/uicc.aconfig b/flags/uicc.aconfig
index 2d7b643..2679cfe 100644
--- a/flags/uicc.aconfig
+++ b/flags/uicc.aconfig
@@ -17,7 +17,7 @@
bug:"303780982"
}
-# OWNER=arunvoddu TARGET=24Q3
+# OWNER=arunvoddu TARGET=24Q4
flag {
name: "carrier_restriction_status"
is_exported: true
@@ -50,3 +50,11 @@
description: "This flag cleans up the OpenLogicalChannelRecord once SIM is removed"
bug:"335046531"
}
+
+# OWNER=arunvoddu TARGET=24Q4
+flag {
+ name: "set_carrier_restriction_status"
+ namespace: "telephony"
+ description: "This flag controls the visibility of the setCarrierRestrictionStatus API in carrierRestrictionRules class."
+ bug:"342411308"
+}
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index c5be118..48e7b0d 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -23,7 +23,7 @@
// Holds atoms to store on persist storage in case of power cycle or process crash.
// NOTE: using int64 rather than google.protobuf.Timestamp for timestamps simplifies implementation.
-// Next id: 80
+// Next id: 82
message PersistAtoms {
/* Aggregated RAT usage during the call. */
repeated VoiceCallRatUsage voice_call_rat_usage = 1;
@@ -261,6 +261,12 @@
/* Timestamp of last satellite_config_updater pull. */
optional int64 satellite_config_updater_pull_timestamp_millis = 79;
+
+ /** Snapshot of satellite access controller. */
+ repeated SatelliteAccessController satellite_access_controller = 80;
+
+ /* Timestamp of last satellite access controller pull. */
+ optional int64 satellite_access_controller_pull_timestamp_millis = 81;
}
// The canonical versions of the following enums live in:
@@ -312,6 +318,8 @@
optional bool is_iwlan_cross_sim_at_connected = 39;
optional bool vonr_enabled = 40;
optional bool is_ntn = 41;
+ optional bool supports_business_call_composer = 42;
+ optional int32 call_composer_status = 43;
// Internal use only
optional int64 setup_begin_millis = 10001;
@@ -342,6 +350,7 @@
optional int32 count = 15;
optional bool is_managed_profile = 16;
optional bool is_ntn = 17;
+ optional bool is_emergency = 18;
// Internal use only
optional int32 hashCode = 10001;
@@ -406,6 +415,7 @@
optional bool is_iwlan_cross_sim = 23;
optional bool is_ntn = 24;
optional bool is_satellite_transport = 25;
+ optional bool is_provisioning_profile = 26;
}
message CellularServiceState {
@@ -704,6 +714,9 @@
optional int32 count_of_demo_mode_incoming_datagram_fail = 23;
optional int32 count_of_datagram_type_keep_alive_success = 24;
optional int32 count_of_datagram_type_keep_alive_fail = 25;
+ optional int32 count_of_allowed_satellite_access = 26;
+ optional int32 count_of_disallowed_satellite_access = 27;
+ optional int32 count_of_satellite_access_check_fail = 28;
}
message SatelliteSession {
@@ -808,3 +821,15 @@
optional int32 carrier_config_result = 3;
optional int32 count = 4;
}
+
+message SatelliteAccessController {
+ optional int32 access_control_type = 1;
+ optional int64 location_query_time_millis = 2;
+ optional int64 on_device_lookup_time_millis = 3;
+ optional int64 total_checking_time_millis = 4;
+ optional bool is_allowed = 5;
+ optional bool is_emergency = 6;
+ optional int32 result_code = 7;
+ repeated string country_codes = 8;
+ optional int32 config_data_source = 9;
+}
diff --git a/src/java/com/android/internal/telephony/Connection.java b/src/java/com/android/internal/telephony/Connection.java
index 68fd6ab..82b4c2b8e 100644
--- a/src/java/com/android/internal/telephony/Connection.java
+++ b/src/java/com/android/internal/telephony/Connection.java
@@ -33,6 +33,7 @@
import com.android.ims.internal.ConferenceParticipant;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.domainselection.DomainSelectionResolver;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.telephony.Rlog;
@@ -634,7 +635,7 @@
*
* @hide
*/
- public void setEmergencyCallInfo(CallTracker ct) {
+ public void setEmergencyCallInfo(CallTracker ct, Phone.DialArgs dialArgs) {
if (ct != null) {
Phone currentPhone = ct.getPhone();
if (currentPhone != null) {
@@ -677,20 +678,52 @@
} else {
Rlog.e(TAG, "setEmergencyCallInfo: call tracker is null");
}
+
+ if (DomainSelectionResolver.getInstance().isDomainSelectionSupported()) {
+ if (mEmergencyNumberInfo == null) {
+ Rlog.d(TAG, "setEmergencyCallInfo: create EmergencyNumber");
+ setNonDetectableEmergencyCallInfo((dialArgs != null) ? dialArgs.eccCategory
+ : EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED,
+ new ArrayList<String>());
+ }
+ if (dialArgs != null && dialArgs.intentExtras != null
+ && dialArgs.intentExtras.getBoolean(
+ PhoneConstants.EXTRA_USE_EMERGENCY_ROUTING, false)
+ && mEmergencyNumberInfo.getEmergencyCallRouting()
+ != EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY) {
+ int eccCategory = dialArgs.intentExtras.getInt(
+ PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY,
+ mEmergencyNumberInfo.getEmergencyServiceCategoryBitmask());
+ Rlog.d(TAG, "setEmergencyCallInfo: enforce emergency routing eccCategory="
+ + eccCategory);
+ List<String> emergencyUrns = dialArgs.intentExtras.getStringArrayList(
+ PhoneConstants.EXTRA_EMERGENCY_URNS);
+ if (emergencyUrns == null || emergencyUrns.isEmpty()) {
+ emergencyUrns = mEmergencyNumberInfo.getEmergencyUrns();
+ }
+ mEmergencyNumberInfo = new EmergencyNumber(mEmergencyNumberInfo.getNumber(),
+ mEmergencyNumberInfo.getCountryIso(),
+ mEmergencyNumberInfo.getMnc(),
+ eccCategory,
+ emergencyUrns,
+ mEmergencyNumberInfo.getEmergencyNumberSourceBitmask(),
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY);
+ }
+ }
}
/**
* Set the non-detectable emergency number information.
*/
- public void setNonDetectableEmergencyCallInfo(int eccCategory) {
- if (!mIsEmergencyCall) {
- mIsEmergencyCall = true;
- mEmergencyNumberInfo = new EmergencyNumber(mAddress, ""/*countryIso*/,
- ""/*mnc*/, eccCategory,
- new ArrayList<String>(),
- EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING,
- EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
- }
+ public void setNonDetectableEmergencyCallInfo(int eccCategory,
+ @NonNull List<String> emergencyUrns) {
+ Rlog.d(TAG, "setNonDetectableEmergencyCallInfo: eccCategory=" + eccCategory
+ + ", emergencyUrns=" + emergencyUrns);
+ mIsEmergencyCall = true;
+ mEmergencyNumberInfo = new EmergencyNumber(mAddress, ""/*countryIso*/, ""/*mnc*/,
+ eccCategory, emergencyUrns,
+ EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING,
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
}
/**
diff --git a/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java b/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
index 9113514..26d4e1b 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
@@ -160,7 +160,7 @@
public GsmCdmaCallTracker(GsmCdmaPhone phone, FeatureFlags featureFlags) {
super(featureFlags);
- if (mFeatureFlags.minimalTelephonyCdmCheck()
+ if (TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)
&& !phone.getContext().getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_CALLING)) {
throw new UnsupportedOperationException("GsmCdmaCallTracker requires calling");
diff --git a/src/java/com/android/internal/telephony/GsmCdmaConnection.java b/src/java/com/android/internal/telephony/GsmCdmaConnection.java
index e06520a..cc07047 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaConnection.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaConnection.java
@@ -139,7 +139,7 @@
mHandler = new MyHandler(mOwner.getLooper());
mAddress = dc.number;
- setEmergencyCallInfo(mOwner);
+ setEmergencyCallInfo(mOwner, null);
String forwardedNumber = TextUtils.isEmpty(dc.forwardedNumber) ? null : dc.forwardedNumber;
Rlog.i(LOG_TAG, "create, forwardedNumber=" + Rlog.pii(LOG_TAG, forwardedNumber));
@@ -186,13 +186,13 @@
mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString);
if (dialArgs.isEmergency) {
- setEmergencyCallInfo(mOwner);
+ setEmergencyCallInfo(mOwner, null);
// There was no emergency number info found for this call, however it is
// still marked as an emergency number. This may happen if it was a redialed
// non-detectable emergency call from IMS.
if (getEmergencyNumberInfo() == null) {
- setNonDetectableEmergencyCallInfo(dialArgs.eccCategory);
+ setNonDetectableEmergencyCallInfo(dialArgs.eccCategory, new ArrayList<String>());
}
}
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index 8c40e66..93a0c2f 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -470,7 +470,7 @@
};
private boolean hasCalling() {
- if (!mFeatureFlags.minimalTelephonyCdmCheck()) return true;
+ if (!TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)) return true;
return mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_CALLING);
}
diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java
index 03d56ed..49d1adc 100644
--- a/src/java/com/android/internal/telephony/InboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java
@@ -747,7 +747,9 @@
// data will be tracked when the message is processed (processMessagePart).
if (result != Intents.RESULT_SMS_HANDLED && result != Activity.RESULT_OK) {
mMetrics.writeIncomingSmsError(mPhone.getPhoneId(), is3gpp2(), smsSource, result);
- mPhone.getSmsStats().onIncomingSmsError(is3gpp2(), smsSource, result);
+ mPhone.getSmsStats().onIncomingSmsError(is3gpp2(), smsSource, result,
+ TelephonyManager.from(mContext)
+ .isEmergencyNumber(smsb.getOriginatingAddress()));
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
@@ -1020,7 +1022,8 @@
+ (pduList.size() == 0 ? "pduList.size() == 0" : "pduList.contains(null)");
logeWithLocalLog(errorMsg, tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsError(
- is3gpp2(), tracker.getSource(), RESULT_SMS_NULL_PDU);
+ is3gpp2(), tracker.getSource(), RESULT_SMS_NULL_PDU,
+ TelephonyManager.from(mContext).isEmergencyNumber(tracker.getAddress()));
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
@@ -1049,7 +1052,9 @@
SmsConstants.FORMAT_3GPP, timestamps, false,
tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsWapPush(tracker.getSource(),
- messageCount, RESULT_SMS_NULL_MESSAGE, tracker.getMessageId());
+ messageCount, RESULT_SMS_NULL_MESSAGE, tracker.getMessageId(),
+ TelephonyManager.from(mContext)
+ .isEmergencyNumber(tracker.getAddress()));
return false;
}
}
@@ -1084,7 +1089,8 @@
mMetrics.writeIncomingWapPush(mPhone.getPhoneId(), tracker.getSource(),
format, timestamps, wapPushResult, tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsWapPush(tracker.getSource(), messageCount,
- result, tracker.getMessageId());
+ result, tracker.getMessageId(), TelephonyManager.from(mContext)
+ .isEmergencyNumber(tracker.getAddress()));
// result is Activity.RESULT_OK if an ordered broadcast was sent
if (result == Activity.RESULT_OK) {
return true;
@@ -1104,10 +1110,11 @@
mMetrics.writeIncomingSmsSession(mPhone.getPhoneId(), tracker.getSource(),
format, timestamps, block, tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsSuccess(is3gpp2(), tracker.getSource(),
- messageCount, block, tracker.getMessageId());
+ messageCount, block, tracker.getMessageId(),
+ TelephonyManager.from(mContext).isEmergencyNumber(tracker.getAddress()));
CarrierRoamingSatelliteSessionStats sessionStats =
CarrierRoamingSatelliteSessionStats.getInstance(mPhone.getSubId());
- sessionStats.onIncomingSms();
+ sessionStats.onIncomingSms(mPhone.getSubId());
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
diff --git a/src/java/com/android/internal/telephony/MultiSimSettingController.java b/src/java/com/android/internal/telephony/MultiSimSettingController.java
index 83d58af..a14ae89 100644
--- a/src/java/com/android/internal/telephony/MultiSimSettingController.java
+++ b/src/java/com/android/internal/telephony/MultiSimSettingController.java
@@ -255,19 +255,19 @@
}
private boolean hasCalling() {
- if (!mFeatureFlags.minimalTelephonyCdmCheck()) return true;
+ if (!TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)) return true;
return mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_CALLING);
}
private boolean hasData() {
- if (!mFeatureFlags.minimalTelephonyCdmCheck()) return true;
+ if (!TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)) return true;
return mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_DATA);
}
private boolean hasMessaging() {
- if (!mFeatureFlags.minimalTelephonyCdmCheck()) return true;
+ if (!TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)) return true;
return mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_MESSAGING);
}
@@ -645,8 +645,11 @@
// Otherwise, if user just inserted their first SIM, or there's one primary and one
// opportunistic subscription active (activeSubInfos.size() > 1), we automatically
// set the primary to be default SIM and return.
- if (mPrimarySubList.size() == 1 && (change != PRIMARY_SUB_REMOVED
- || mActiveModemCount == 1)) {
+ boolean conditionForOnePrimarySim =
+ mFeatureFlags.resetPrimarySimDefaultValues() ? mPrimarySubList.size() == 1
+ : mPrimarySubList.size() == 1
+ && (change != PRIMARY_SUB_REMOVED || mActiveModemCount == 1);
+ if (conditionForOnePrimarySim) {
int subId = mPrimarySubList.get(0);
if (DBG) log("updateDefaultValues: to only primary sub " + subId);
if (hasData()) mSubscriptionManagerService.setDefaultDataSubId(subId);
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index d327a45..aa62acb 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -150,10 +150,10 @@
*/
public abstract class Phone extends Handler implements PhoneInternalInterface {
- private static final String LOG_TAG = "Phone";
protected final static Object lockForRadioTechnologyChange = new Object();
+ private final String mLogTag;
protected final int USSD_MAX_QUEUE = 10;
// Key used to read and write the saved network selection numeric value
@@ -597,6 +597,7 @@
boolean unitTestMode, int phoneId,
TelephonyComponentFactory telephonyComponentFactory,
FeatureFlags featureFlags) {
+ mLogTag = "Phone-" + phoneId;
mPhoneId = phoneId;
mName = name;
mNotifier = notifier;
@@ -638,10 +639,10 @@
*/
mDoesRilSendMultipleCallRing = TelephonyProperties.ril_sends_multiple_call_ring()
.orElse(true);
- Rlog.d(LOG_TAG, "mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
+ Rlog.d(mLogTag, "mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
mCallRingDelay = TelephonyProperties.call_ring_delay().orElse(3000);
- Rlog.d(LOG_TAG, "mCallRingDelay=" + mCallRingDelay);
+ Rlog.d(mLogTag, "mCallRingDelay=" + mCallRingDelay);
// Initialize SMS stats
mSmsStats = new SmsStats(this);
@@ -785,7 +786,7 @@
switch(msg.what) {
case EVENT_CALL_RING:
- Rlog.d(LOG_TAG, "Event EVENT_CALL_RING Received state=" + getState());
+ Rlog.d(mLogTag, "Event EVENT_CALL_RING Received state=" + getState());
ar = (AsyncResult)msg.obj;
if (ar.exception == null) {
PhoneConstants.State state = getState();
@@ -801,7 +802,7 @@
break;
case EVENT_CALL_RING_CONTINUE:
- Rlog.d(LOG_TAG, "Event EVENT_CALL_RING_CONTINUE Received state=" + getState());
+ Rlog.d(mLogTag, "Event EVENT_CALL_RING_CONTINUE Received state=" + getState());
if (getState() == PhoneConstants.State.RINGING) {
sendIncomingCallRingNotification(msg.arg1);
}
@@ -814,7 +815,7 @@
case EVENT_INITIATE_SILENT_REDIAL:
// This is an ImsPhone -> GsmCdmaPhone redial
// See ImsPhone#initiateSilentRedial
- Rlog.d(LOG_TAG, "Event EVENT_INITIATE_SILENT_REDIAL Received");
+ Rlog.d(mLogTag, "Event EVENT_INITIATE_SILENT_REDIAL Received");
ar = (AsyncResult) msg.obj;
if ((ar.exception == null) && (ar.result != null)) {
SilentRedialParam result = (SilentRedialParam) ar.result;
@@ -828,13 +829,13 @@
// one with a callback registered to TelephonyConnection. Notify the
// redial happened over that Phone so that it can be replaced with the
// new GSM/CDMA Connection.
- Rlog.d(LOG_TAG, "Notify redial connection changed cn: " + cn);
+ Rlog.d(mLogTag, "Notify redial connection changed cn: " + cn);
if (mImsPhone != null) {
// Don't care it is null or not.
mImsPhone.notifyRedialConnectionChanged(cn);
}
} catch (CallStateException e) {
- Rlog.e(LOG_TAG, "silent redial failed: " + e);
+ Rlog.e(mLogTag, "silent redial failed: " + e);
if (mImsPhone != null) {
mImsPhone.notifyRedialConnectionChanged(null);
}
@@ -847,7 +848,7 @@
if (ar.exception == null) {
handleSrvccStateChanged((int[]) ar.result);
} else {
- Rlog.e(LOG_TAG, "Srvcc exception: " + ar.exception);
+ Rlog.e(mLogTag, "Srvcc exception: " + ar.exception);
}
break;
@@ -866,7 +867,7 @@
try {
mUsageSettingFromModem = ((int[]) ar.result)[0];
} catch (NullPointerException | ClassCastException e) {
- Rlog.e(LOG_TAG, "Invalid response for usage setting " + ar.result);
+ Rlog.e(mLogTag, "Invalid response for usage setting " + ar.result);
break;
}
@@ -881,9 +882,9 @@
if (ce.getCommandError() == CommandException.Error.REQUEST_NOT_SUPPORTED) {
mIsUsageSettingSupported = false;
}
- Rlog.w(LOG_TAG, "Unexpected failure to retrieve usage setting " + ce);
+ Rlog.w(mLogTag, "Unexpected failure to retrieve usage setting " + ce);
} catch (ClassCastException unused) {
- Rlog.e(LOG_TAG, "Invalid Exception for usage setting " + ar.exception);
+ Rlog.e(mLogTag, "Invalid Exception for usage setting " + ar.exception);
break; // technically extraneous, but good hygiene
}
}
@@ -896,9 +897,9 @@
if (ce.getCommandError() == CommandException.Error.REQUEST_NOT_SUPPORTED) {
mIsUsageSettingSupported = false;
}
- Rlog.w(LOG_TAG, "Unexpected failure to set usage setting " + ce);
+ Rlog.w(mLogTag, "Unexpected failure to set usage setting " + ce);
} catch (ClassCastException unused) {
- Rlog.e(LOG_TAG, "Invalid Exception for usage setting " + ar.exception);
+ Rlog.e(mLogTag, "Invalid Exception for usage setting " + ar.exception);
break; // technically extraneous, but good hygiene
}
}
@@ -932,7 +933,7 @@
}
private void handleSrvccStateChanged(int[] ret) {
- Rlog.d(LOG_TAG, "handleSrvccStateChanged");
+ Rlog.d(mLogTag, "handleSrvccStateChanged");
ArrayList<Connection> conn = null;
Phone imsPhone = mImsPhone;
@@ -949,7 +950,7 @@
conn = imsPhone.getHandoverConnection();
migrateFrom(imsPhone);
} else {
- Rlog.d(LOG_TAG, "HANDOVER_STARTED: mImsPhone null");
+ Rlog.d(mLogTag, "HANDOVER_STARTED: mImsPhone null");
}
break;
case TelephonyManager.SRVCC_STATE_HANDOVER_COMPLETED:
@@ -1187,7 +1188,7 @@
to.add((Registrant) from.get(i));
}
} else {
- Rlog.d(LOG_TAG, "msg is null");
+ Rlog.d(mLogTag, "msg is null");
}
}
}
@@ -1484,7 +1485,7 @@
*/
@UnsupportedAppUsage
public void setNetworkSelectionModeAutomatic(Message response) {
- Rlog.d(LOG_TAG, "setNetworkSelectionModeAutomatic, querying current mode");
+ Rlog.d(mLogTag, "setNetworkSelectionModeAutomatic, querying current mode");
// we don't want to do this unnecessarily - it actually causes
// the radio to repeat network selection and is costly
// first check if we're already in automatic mode
@@ -1519,11 +1520,11 @@
nsm.operatorAlphaShort = "";
if (doAutomatic) {
- Rlog.d(LOG_TAG, "setNetworkSelectionModeAutomatic - set network selection auto");
+ Rlog.d(mLogTag, "setNetworkSelectionModeAutomatic - set network selection auto");
Message msg = obtainMessage(EVENT_SET_NETWORK_AUTOMATIC_COMPLETE, nsm);
mCi.setNetworkSelectionModeAutomatic(msg);
} else {
- Rlog.d(LOG_TAG, "setNetworkSelectionModeAutomatic - already auto, ignoring");
+ Rlog.d(mLogTag, "setNetworkSelectionModeAutomatic - already auto, ignoring");
// let the calling application know that the we are ignoring automatic mode switch.
if (nsm.message != null) {
nsm.message.arg1 = ALREADY_IN_AUTO_SELECTION;
@@ -1617,10 +1618,10 @@
// commit and log the result.
if (!editor.commit()) {
- Rlog.e(LOG_TAG, "failed to commit network selection preference");
+ Rlog.e(mLogTag, "failed to commit network selection preference");
}
} else {
- Rlog.e(LOG_TAG, "Cannot update network selection preference due to invalid subId " +
+ Rlog.e(mLogTag, "Cannot update network selection preference due to invalid subId " +
subId);
}
}
@@ -1631,7 +1632,7 @@
* @param nsm PLMN info of the selected network
*/
protected void updateManualNetworkSelection(NetworkSelectMessage nsm) {
- Rlog.e(LOG_TAG, "updateManualNetworkSelection() should be overridden");
+ Rlog.e(mLogTag, "updateManualNetworkSelection() should be overridden");
}
/**
@@ -1641,7 +1642,7 @@
// look for our wrapper within the asyncresult, skip the rest if it
// is null.
if (!(ar.userObj instanceof NetworkSelectMessage)) {
- Rlog.e(LOG_TAG, "unexpected result from user object.");
+ Rlog.e(mLogTag, "unexpected result from user object.");
return;
}
@@ -1705,12 +1706,12 @@
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = sp.edit();
editor.putInt(CLIR_KEY + getSubId(), commandInterfaceCLIRMode);
- Rlog.i(LOG_TAG, "saveClirSetting: " + CLIR_KEY + getSubId() + "="
+ Rlog.i(mLogTag, "saveClirSetting: " + CLIR_KEY + getSubId() + "="
+ commandInterfaceCLIRMode);
// Commit and log the result.
if (!editor.commit()) {
- Rlog.e(LOG_TAG, "Failed to commit CLIR preference");
+ Rlog.e(mLogTag, "Failed to commit CLIR preference");
}
}
@@ -1932,13 +1933,13 @@
IccFileHandler fh;
if (uiccApplication == null) {
- Rlog.d(LOG_TAG, "getIccFileHandler: uiccApplication == null, return null");
+ Rlog.d(mLogTag, "getIccFileHandler: uiccApplication == null, return null");
fh = null;
} else {
fh = uiccApplication.getIccFileHandler();
}
- Rlog.d(LOG_TAG, "getIccFileHandler: fh=" + fh);
+ Rlog.d(mLogTag, "getIccFileHandler: fh=" + fh);
return fh;
}
@@ -2025,7 +2026,7 @@
* Retrieves the SignalStrengthController of the phone instance.
*/
public SignalStrengthController getSignalStrengthController() {
- Log.wtf(LOG_TAG, "getSignalStrengthController return null.");
+ Log.wtf(mLogTag, "getSignalStrengthController return null.");
return null;
}
@@ -2059,7 +2060,7 @@
* Update voice mail count related fields and notify listeners
*/
public void updateVoiceMail() {
- Rlog.e(LOG_TAG, "updateVoiceMail() should be overridden");
+ Rlog.e(mLogTag, "updateVoiceMail() should be overridden");
}
public AppType getCurrentUiccAppType() {
@@ -2185,7 +2186,7 @@
if (SubscriptionManager.isValidSubscriptionId(subId)) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
status = sp.getInt(CF_STATUS + subId, IccRecords.CALL_FORWARDING_STATUS_UNKNOWN);
- Rlog.d(LOG_TAG, "getCallForwardingIndicatorFromSharedPref: for subId " + subId + "= " +
+ Rlog.d(mLogTag, "getCallForwardingIndicatorFromSharedPref: for subId " + subId + "= " +
status);
// Check for old preference if status is UNKNOWN for current subId. This part of the
// code is needed only when upgrading from M to N.
@@ -2199,9 +2200,9 @@
status = sp.getInt(CF_STATUS, IccRecords.CALL_FORWARDING_STATUS_DISABLED);
setCallForwardingIndicatorInSharedPref(
status == IccRecords.CALL_FORWARDING_STATUS_ENABLED ? true : false);
- Rlog.d(LOG_TAG, "getCallForwardingIndicatorFromSharedPref: " + status);
+ Rlog.d(mLogTag, "getCallForwardingIndicatorFromSharedPref: " + status);
} else {
- Rlog.d(LOG_TAG, "getCallForwardingIndicatorFromSharedPref: returning " +
+ Rlog.d(mLogTag, "getCallForwardingIndicatorFromSharedPref: returning " +
"DISABLED as status for matching subscriberId not found");
}
@@ -2213,7 +2214,7 @@
}
}
} else {
- Rlog.e(LOG_TAG, "getCallForwardingIndicatorFromSharedPref: invalid subId " + subId);
+ Rlog.e(mLogTag, "getCallForwardingIndicatorFromSharedPref: invalid subId " + subId);
}
return status;
}
@@ -2222,7 +2223,7 @@
int status = enable ? IccRecords.CALL_FORWARDING_STATUS_ENABLED :
IccRecords.CALL_FORWARDING_STATUS_DISABLED;
int subId = getSubId();
- Rlog.i(LOG_TAG, "setCallForwardingIndicatorInSharedPref: Storing status = " + status +
+ Rlog.i(mLogTag, "setCallForwardingIndicatorInSharedPref: Storing status = " + status +
" in pref " + CF_STATUS + subId);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
@@ -2265,7 +2266,7 @@
*/
public boolean getCallForwardingIndicator() {
if (getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
- Rlog.e(LOG_TAG, "getCallForwardingIndicator: not possible in CDMA");
+ Rlog.e(mLogTag, "getCallForwardingIndicator: not possible in CDMA");
return false;
}
IccRecords r = getIccRecords();
@@ -2276,7 +2277,7 @@
if (callForwardingIndicator == IccRecords.CALL_FORWARDING_STATUS_UNKNOWN) {
callForwardingIndicator = getCallForwardingIndicatorFromSharedPref();
}
- Rlog.v(LOG_TAG, "getCallForwardingIndicator: iccForwardingFlag=" + (r != null
+ Rlog.v(mLogTag, "getCallForwardingIndicator: iccForwardingFlag=" + (r != null
? r.getVoiceCallForwardingFlag() : "null") + ", sharedPrefFlag="
+ getCallForwardingIndicatorFromSharedPref());
return (callForwardingIndicator == IccRecords.CALL_FORWARDING_STATUS_ENABLED);
@@ -2473,7 +2474,7 @@
for (String pair : result.trim().split(",")) {
String[] networkTypesValues = (pair.trim().toLowerCase(Locale.ROOT)).split("=");
if (networkTypesValues.length != 2) {
- Rlog.e(LOG_TAG, "Invalid ALLOWED_NETWORK_TYPES from DB, value = " + pair);
+ Rlog.e(mLogTag, "Invalid ALLOWED_NETWORK_TYPES from DB, value = " + pair);
continue;
}
int key = convertAllowedNetworkTypeDbNameToMapIndex(networkTypesValues[0]);
@@ -2493,7 +2494,7 @@
}
}
} catch (NumberFormatException e) {
- Rlog.e(LOG_TAG, "allowedNetworkTypes NumberFormat exception" + e);
+ Rlog.e(mLogTag, "allowedNetworkTypes NumberFormat exception" + e);
}
for (int key : oldAllowedNetworkTypes.keySet()) {
@@ -2612,7 +2613,7 @@
protected void updateAllowedNetworkTypes(Message response) {
int modemRaf = getRadioAccessFamily();
if (modemRaf == RadioAccessFamily.RAF_UNKNOWN) {
- Rlog.d(LOG_TAG, "setPreferredNetworkType: Abort, unknown RAF: "
+ Rlog.d(mLogTag, "setPreferredNetworkType: Abort, unknown RAF: "
+ modemRaf);
if (response != null) {
CommandException ex;
@@ -2721,7 +2722,7 @@
* @param onComplete a callback message when the action is completed
*/
public void setUiTTYMode(int uiTtyMode, Message onComplete) {
- Rlog.d(LOG_TAG, "unexpected setUiTTYMode method call");
+ Rlog.d(mLogTag, "unexpected setUiTTYMode method call");
}
/**
@@ -2848,7 +2849,7 @@
public boolean eraseDataInSharedPreferences() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = sp.edit();
- Rlog.d(LOG_TAG, "Erase all data saved in SharedPreferences");
+ Rlog.d(mLogTag, "Erase all data saved in SharedPreferences");
editor.clear();
return editor.commit();
}
@@ -3094,7 +3095,7 @@
isVideoCallOrConference(mImsPhone.getBackgroundCall()) ||
isVideoCallOrConference(mImsPhone.getRingingCall());
}
- Rlog.d(LOG_TAG, "isImsVideoCallOrConferencePresent: " + isPresent);
+ Rlog.d(mLogTag, "isImsVideoCallOrConferencePresent: " + isPresent);
return isPresent;
}
@@ -3119,7 +3120,7 @@
int subId = getSubId();
if (SubscriptionManager.isValidSubscriptionId(subId)) {
- Rlog.d(LOG_TAG, "setVoiceMessageCount: Storing Voice Mail Count = " + countWaiting +
+ Rlog.d(mLogTag, "setVoiceMessageCount: Storing Voice Mail Count = " + countWaiting +
" for mVmCountKey = " + VM_COUNT + subId + " in preferences.");
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
@@ -3127,16 +3128,16 @@
editor.putInt(VM_COUNT + subId, countWaiting);
editor.apply();
} else {
- Rlog.e(LOG_TAG, "setVoiceMessageCount in sharedPreference: invalid subId " + subId);
+ Rlog.e(mLogTag, "setVoiceMessageCount in sharedPreference: invalid subId " + subId);
}
// store voice mail count in SIM
IccRecords records = UiccController.getInstance().getIccRecords(
mPhoneId, UiccController.APP_FAM_3GPP);
if (records != null) {
- Rlog.d(LOG_TAG, "setVoiceMessageCount: updating SIM Records");
+ Rlog.d(mLogTag, "setVoiceMessageCount: updating SIM Records");
records.setVoiceMessageWaiting(1, countWaiting);
} else {
- Rlog.d(LOG_TAG, "setVoiceMessageCount: SIM Records not found");
+ Rlog.d(mLogTag, "setVoiceMessageCount: SIM Records not found");
}
// notify listeners of voice mail
notifyMessageWaitingIndicator();
@@ -3152,7 +3153,7 @@
int countFromSP = sp.getInt(VM_COUNT + subId, invalidCount);
if (countFromSP != invalidCount) {
countVoiceMessages = countFromSP;
- Rlog.d(LOG_TAG, "getStoredVoiceMessageCount: from preference for subId " + subId +
+ Rlog.d(mLogTag, "getStoredVoiceMessageCount: from preference for subId " + subId +
"= " + countVoiceMessages);
} else {
// Check for old preference if count not found for current subId. This part of the
@@ -3165,10 +3166,10 @@
// get voice mail count from preferences
countVoiceMessages = sp.getInt(VM_COUNT, 0);
setVoiceMessageCount(countVoiceMessages);
- Rlog.d(LOG_TAG, "getStoredVoiceMessageCount: from preference = " +
+ Rlog.d(mLogTag, "getStoredVoiceMessageCount: from preference = " +
countVoiceMessages);
} else {
- Rlog.d(LOG_TAG, "getStoredVoiceMessageCount: returning 0 as count for " +
+ Rlog.d(mLogTag, "getStoredVoiceMessageCount: returning 0 as count for " +
"matching subscriberId not found");
}
@@ -3180,7 +3181,7 @@
}
}
} else {
- Rlog.e(LOG_TAG, "getStoredVoiceMessageCount: invalid subId " + subId);
+ Rlog.e(mLogTag, "getStoredVoiceMessageCount: invalid subId " + subId);
}
return countVoiceMessages;
}
@@ -3713,17 +3714,17 @@
}
}
} catch (NumberFormatException e) {
- Rlog.e(LOG_TAG, "Exception in getProvisioningUrlBaseFromFile: " + e);
+ Rlog.e(mLogTag, "Exception in getProvisioningUrlBaseFromFile: " + e);
}
}
}
return null;
} catch (FileNotFoundException e) {
- Rlog.e(LOG_TAG, "Carrier Provisioning Urls file not found");
+ Rlog.e(mLogTag, "Carrier Provisioning Urls file not found");
} catch (XmlPullParserException e) {
- Rlog.e(LOG_TAG, "Xml parser exception reading Carrier Provisioning Urls file: " + e);
+ Rlog.e(mLogTag, "Xml parser exception reading Carrier Provisioning Urls file: " + e);
} catch (IOException e) {
- Rlog.e(LOG_TAG, "I/O exception reading Carrier Provisioning Urls file: " + e);
+ Rlog.e(mLogTag, "I/O exception reading Carrier Provisioning Urls file: " + e);
}
return null;
}
@@ -3735,9 +3736,9 @@
String url = getProvisioningUrlBaseFromFile();
if (TextUtils.isEmpty(url)) {
url = mContext.getResources().getString(R.string.mobile_provisioning_url);
- Rlog.d(LOG_TAG, "getMobileProvisioningUrl: url from resource =" + url);
+ Rlog.d(mLogTag, "getMobileProvisioningUrl: url from resource =" + url);
} else {
- Rlog.d(LOG_TAG, "getMobileProvisioningUrl: url from File =" + url);
+ Rlog.d(mLogTag, "getMobileProvisioningUrl: url from File =" + url);
}
// Populate the iccid, imei and phone number in the provisioning url.
if (!TextUtils.isEmpty(url)) {
@@ -3811,7 +3812,7 @@
* version scoped to their packages
*/
public void notifyNewRingingConnectionP(Connection cn) {
- Rlog.i(LOG_TAG, String.format(
+ Rlog.i(mLogTag, String.format(
"notifyNewRingingConnection: phoneId=[%d], connection=[%s], registrants=[%s]",
getPhoneId(), cn, getNewRingingConnectionRegistrantsAsString()));
if (!mIsVoiceCapable)
@@ -3867,12 +3868,12 @@
private void sendIncomingCallRingNotification(int token) {
if (mIsVoiceCapable && !mDoesRilSendMultipleCallRing &&
(token == mCallRingContinueToken)) {
- Rlog.d(LOG_TAG, "Sending notifyIncomingRing");
+ Rlog.d(mLogTag, "Sending notifyIncomingRing");
notifyIncomingRing();
sendMessageDelayed(
obtainMessage(EVENT_CALL_RING_CONTINUE, token, 0), mCallRingDelay);
} else {
- Rlog.d(LOG_TAG, "Ignoring ring notification request,"
+ Rlog.d(mLogTag, "Ignoring ring notification request,"
+ " mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing
+ " token=" + token
+ " mCallRingContinueToken=" + mCallRingContinueToken
@@ -3912,7 +3913,7 @@
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public IsimRecords getIsimRecords() {
- Rlog.e(LOG_TAG, "getIsimRecords() is only supported on LTE devices");
+ Rlog.e(mLogTag, "getIsimRecords() is only supported on LTE devices");
return null;
}
@@ -3945,7 +3946,7 @@
*/
public void setVoiceMessageWaiting(int line, int countWaiting) {
// This function should be overridden by class GsmCdmaPhone.
- Rlog.e(LOG_TAG, "Error! This function should never be executed, inactive Phone.");
+ Rlog.e(mLogTag, "Error! This function should never be executed, inactive Phone.");
}
/**
@@ -4204,7 +4205,7 @@
isImsRegistered = sst.isImsRegistered();
}
}
- Rlog.d(LOG_TAG, "isImsRegistered =" + isImsRegistered);
+ Rlog.d(mLogTag, "isImsRegistered =" + isImsRegistered);
return isImsRegistered;
}
@@ -4218,7 +4219,7 @@
if (imsPhone != null) {
isWifiCallingEnabled = imsPhone.isWifiCallingEnabled();
}
- Rlog.d(LOG_TAG, "isWifiCallingEnabled =" + isWifiCallingEnabled);
+ Rlog.d(mLogTag, "isWifiCallingEnabled =" + isWifiCallingEnabled);
return isWifiCallingEnabled;
}
@@ -4232,7 +4233,7 @@
if (imsPhone != null) {
isAvailable = imsPhone.isImsCapabilityAvailable(capability, regTech);
}
- Rlog.d(LOG_TAG, "isImsCapabilityAvailable, capability=" + capability + ", regTech="
+ Rlog.d(mLogTag, "isImsCapabilityAvailable, capability=" + capability + ", regTech="
+ regTech + ", isAvailable=" + isAvailable);
return isAvailable;
}
@@ -4256,7 +4257,7 @@
if (imsPhone != null) {
isVolteEnabled = imsPhone.isVoiceOverCellularImsEnabled();
}
- Rlog.d(LOG_TAG, "isVoiceOverCellularImsEnabled=" + isVolteEnabled);
+ Rlog.d(mLogTag, "isVoiceOverCellularImsEnabled=" + isVolteEnabled);
return isVolteEnabled;
}
@@ -4270,7 +4271,7 @@
if (imsPhone != null) {
regTech = imsPhone.getImsRegistrationTech();
}
- Rlog.d(LOG_TAG, "getImsRegistrationTechnology =" + regTech);
+ Rlog.d(mLogTag, "getImsRegistrationTechnology =" + regTech);
return regTech;
}
@@ -4852,7 +4853,7 @@
public boolean isDeviceIdle() {
DeviceStateMonitor dsm = getDeviceStateMonitor();
if (dsm == null) {
- Rlog.e(LOG_TAG, "isDeviceIdle: DeviceStateMonitor is null");
+ Rlog.e(mLogTag, "isDeviceIdle: DeviceStateMonitor is null");
return false;
}
return !dsm.shouldEnableHighPowerConsumptionIndications();
@@ -4866,7 +4867,7 @@
public void notifyDeviceIdleStateChanged(boolean isIdle) {
SignalStrengthController ssc = getSignalStrengthController();
if (ssc == null) {
- Rlog.e(LOG_TAG, "notifyDeviceIdleStateChanged: SignalStrengthController is null");
+ Rlog.e(mLogTag, "notifyDeviceIdleStateChanged: SignalStrengthController is null");
return;
}
ssc.onDeviceIdleStateChanged(isIdle);
@@ -4922,8 +4923,8 @@
/**
* @return The data settings manager
*/
- public @Nullable DataSettingsManager getDataSettingsManager() {
- if (mDataNetworkController == null) return null;
+ @NonNull
+ public DataSettingsManager getDataSettingsManager() {
return mDataNetworkController.getDataSettingsManager();
}
@@ -5298,7 +5299,7 @@
* @param type for callback mode entry.
*/
public void startCallbackMode(@TelephonyManager.EmergencyCallbackModeType int type) {
- Rlog.d(LOG_TAG, "startCallbackMode:type=" + type);
+ Rlog.d(mLogTag, "startCallbackMode:type=" + type);
mNotifier.notifyCallbackModeStarted(this, type);
}
@@ -5309,7 +5310,7 @@
*/
public void stopCallbackMode(@TelephonyManager.EmergencyCallbackModeType int type,
@TelephonyManager.EmergencyCallbackModeStopReason int reason) {
- Rlog.d(LOG_TAG, "stopCallbackMode:type=" + type + ", reason=" + reason);
+ Rlog.d(mLogTag, "stopCallbackMode:type=" + type + ", reason=" + reason);
mNotifier.notifyCallbackModeStopped(this, type, reason);
}
@@ -5347,7 +5348,7 @@
pw.println(" isDnsCheckDisabled()=" + isDnsCheckDisabled());
pw.println(" getUnitTestMode()=" + getUnitTestMode());
pw.println(" getState()=" + getState());
- pw.println(" getIccSerialNumber()=" + Rlog.pii(LOG_TAG, getIccSerialNumber()));
+ pw.println(" getIccSerialNumber()=" + Rlog.pii(mLogTag, getIccSerialNumber()));
pw.println(" getIccRecordsLoaded()=" + getIccRecordsLoaded());
pw.println(" getMessageWaitingIndicator()=" + getMessageWaitingIndicator());
pw.println(" getCallForwardingIndicator()=" + getCallForwardingIndicator());
@@ -5532,18 +5533,14 @@
}
private void logd(String s) {
- Rlog.d(LOG_TAG, "[" + mPhoneId + "] " + s);
+ Rlog.d(mLogTag, "[" + mPhoneId + "] " + s);
}
private void logi(String s) {
- Rlog.i(LOG_TAG, "[" + mPhoneId + "] " + s);
+ Rlog.i(mLogTag, "[" + mPhoneId + "] " + s);
}
private void loge(String s) {
- Rlog.e(LOG_TAG, "[" + mPhoneId + "] " + s);
- }
-
- private static String pii(String s) {
- return Rlog.pii(LOG_TAG, s);
+ Rlog.e(mLogTag, "[" + mPhoneId + "] " + s);
}
}
diff --git a/src/java/com/android/internal/telephony/PhoneConfigurationManager.java b/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
index ffa5b69..b96887c 100644
--- a/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
+++ b/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
@@ -391,9 +391,12 @@
}
mSlotsSupportingSimultaneousCellularCalls.add(i);
}
- // Ensure the slots supporting cellular DSDA does not exceed the phone count
- if (mSlotsSupportingSimultaneousCellularCalls.size() > getPhoneCount()) {
- loge("Invalid size of DSDA slots. Disabling cellular DSDA.");
+ // Ensure the number of slots supporting cellular DSDA is valid:
+ if (mSlotsSupportingSimultaneousCellularCalls.size() > getPhoneCount() ||
+ mSlotsSupportingSimultaneousCellularCalls.size() < 2) {
+ loge("Invalid size of DSDA slots. Disabling cellular DSDA. Size of "
+ + "mSlotsSupportingSimultaneousCellularCalls=" +
+ mSlotsSupportingSimultaneousCellularCalls.size());
mSlotsSupportingSimultaneousCellularCalls.clear();
}
} else {
diff --git a/src/java/com/android/internal/telephony/SMSDispatcher.java b/src/java/com/android/internal/telephony/SMSDispatcher.java
index 70bddd1..8764e02 100644
--- a/src/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/SMSDispatcher.java
@@ -89,7 +89,6 @@
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
import com.android.internal.telephony.cdma.sms.UserData;
-import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.uicc.IccRecords;
@@ -1067,9 +1066,6 @@
tracker.isFromDefaultSmsApplication(mContext),
tracker.getInterval(),
mTelephonyManager.isEmergencyNumber(tracker.mDestAddress));
- CarrierRoamingSatelliteSessionStats sessionStats =
- CarrierRoamingSatelliteSessionStats.getInstance(mPhone.getSubId());
- sessionStats.onOutgoingSms();
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
diff --git a/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java b/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java
index 7fc499e..077ee0b 100644
--- a/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java
+++ b/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java
@@ -30,6 +30,7 @@
import android.os.UserManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
@@ -243,7 +244,8 @@
message.mMessageCount);
if (phone != null) {
phone.getSmsStats().onDroppedIncomingMultipartSms(message.mIs3gpp2, rows,
- message.mMessageCount);
+ message.mMessageCount, TelephonyManager.from(context)
+ .isEmergencyNumber(message.mAddress));
TelephonyAnalytics telephonyAnalytics = phone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
SmsMmsAnalytics smsMmsAnalytics =
diff --git a/src/java/com/android/internal/telephony/TelephonyCapabilities.java b/src/java/com/android/internal/telephony/TelephonyCapabilities.java
index 1b4a3a9..71d3b14 100644
--- a/src/java/com/android/internal/telephony/TelephonyCapabilities.java
+++ b/src/java/com/android/internal/telephony/TelephonyCapabilities.java
@@ -16,9 +16,12 @@
package com.android.internal.telephony;
+import android.annotation.NonNull;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
+import android.os.SystemProperties;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.telephony.Rlog;
/**
@@ -194,4 +197,16 @@
public static boolean canDistinguishDialingAndConnected(int phoneType) {
return phoneType == PhoneConstants.PHONE_TYPE_GSM;
}
+
+ /**
+ * Returns true if Calling/Data/Messaging features should be checked on this device.
+ */
+ public static boolean minimalTelephonyCdmCheck(@NonNull FeatureFlags featureFlags) {
+ // Check SDK version of the vendor partition.
+ final int vendorApiLevel = SystemProperties.getInt(
+ "ro.vendor.api_level", Build.VERSION.DEVICE_INITIAL_SDK_INT);
+ if (vendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) return false;
+
+ return featureFlags.minimalTelephonyCdmCheck();
+ }
}
diff --git a/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java b/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java
index 10371ab..7486b61 100644
--- a/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java
+++ b/src/java/com/android/internal/telephony/data/AutoDataSwitchController.java
@@ -473,6 +473,7 @@
@Override
public void handleMessage(@NonNull Message msg) {
AsyncResult ar;
+ Object obj;
int phoneId;
switch (msg.what) {
case EVENT_SERVICE_STATE_CHANGED:
@@ -491,33 +492,20 @@
onSignalStrengthChanged(phoneId);
break;
case EVENT_EVALUATE_AUTO_SWITCH:
- if (sFeatureFlags.autoDataSwitchRatSs()) {
- Object obj = mScheduledEventsToExtras.get(EVENT_EVALUATE_AUTO_SWITCH);
- if (obj instanceof EvaluateEventExtra extra) {
- mScheduledEventsToExtras.remove(EVENT_EVALUATE_AUTO_SWITCH);
- onEvaluateAutoDataSwitch(extra.evaluateReason);
- }
- } else {
- int reason = (int) msg.obj;
- onEvaluateAutoDataSwitch(reason);
+ obj = mScheduledEventsToExtras.get(EVENT_EVALUATE_AUTO_SWITCH);
+ if (obj instanceof EvaluateEventExtra extra) {
+ mScheduledEventsToExtras.remove(EVENT_EVALUATE_AUTO_SWITCH);
+ onEvaluateAutoDataSwitch(extra.evaluateReason);
}
break;
case EVENT_STABILITY_CHECK_PASSED:
- if (sFeatureFlags.autoDataSwitchRatSs()) {
- Object obj = mScheduledEventsToExtras.get(EVENT_STABILITY_CHECK_PASSED);
- if (obj instanceof StabilityEventExtra extra) {
- int targetPhoneId = extra.targetPhoneId;
- boolean needValidation = extra.needValidation;
- log("require validation on phone " + targetPhoneId
- + (needValidation ? "" : " no") + " need to pass");
- mScheduledEventsToExtras.remove(EVENT_STABILITY_CHECK_PASSED);
- mPhoneSwitcherCallback.onRequireValidation(targetPhoneId, needValidation);
- }
- } else {
- int targetPhoneId = msg.arg1;
- boolean needValidation = msg.arg2 == 1;
+ obj = mScheduledEventsToExtras.get(EVENT_STABILITY_CHECK_PASSED);
+ if (obj instanceof StabilityEventExtra extra) {
+ int targetPhoneId = extra.targetPhoneId;
+ boolean needValidation = extra.needValidation;
log("require validation on phone " + targetPhoneId
+ (needValidation ? "" : " no") + " need to pass");
+ mScheduledEventsToExtras.remove(EVENT_STABILITY_CHECK_PASSED);
mPhoneSwitcherCallback.onRequireValidation(targetPhoneId, needValidation);
}
break;
@@ -643,15 +631,9 @@
? mAutoDataSwitchAvailabilityStabilityTimeThreshold
<< mAutoSwitchValidationFailedCount
: 0;
- if (sFeatureFlags.autoDataSwitchRatSs()) {
- if (!mScheduledEventsToExtras.containsKey(EVENT_EVALUATE_AUTO_SWITCH)) {
- scheduleEventWithTimer(EVENT_EVALUATE_AUTO_SWITCH, new EvaluateEventExtra(reason),
- delayMs);
- }
- } else {
- if (!hasMessages(EVENT_EVALUATE_AUTO_SWITCH)) {
- sendMessageDelayed(obtainMessage(EVENT_EVALUATE_AUTO_SWITCH, reason), delayMs);
- }
+ if (!mScheduledEventsToExtras.containsKey(EVENT_EVALUATE_AUTO_SWITCH)) {
+ scheduleEventWithTimer(EVENT_EVALUATE_AUTO_SWITCH, new EvaluateEventExtra(reason),
+ delayMs);
}
}
@@ -700,12 +682,32 @@
return;
}
- if (!defaultDataPhone.isUserDataEnabled() || !backupDataPhone.isDataAllowed()) {
- mPhoneSwitcherCallback.onRequireImmediatelySwitchToPhone(DEFAULT_PHONE_INDEX,
- EVALUATION_REASON_DATA_SETTINGS_CHANGED);
- log(debugMessage.append(", immediately back to default as user turns off settings")
- .toString());
- return;
+ DataEvaluation internetEvaluation;
+ if (sFeatureFlags.autoDataSwitchUsesDataEnabled()) {
+ if (!defaultDataPhone.isUserDataEnabled()) {
+ mPhoneSwitcherCallback.onRequireImmediatelySwitchToPhone(DEFAULT_PHONE_INDEX,
+ EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ log(debugMessage.append(
+ ", immediately back to default as user turns off default").toString());
+ return;
+ } else if (!(internetEvaluation = backupDataPhone.getDataNetworkController()
+ .getInternetEvaluation(false/*ignoreExistingNetworks*/))
+ .isSubsetOf(DataEvaluation.DataDisallowedReason.NOT_IN_SERVICE)) {
+ mPhoneSwitcherCallback.onRequireImmediatelySwitchToPhone(
+ DEFAULT_PHONE_INDEX, EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ log(debugMessage.append(
+ ", immediately back to default because backup ")
+ .append(internetEvaluation).toString());
+ return;
+ }
+ } else {
+ if (!defaultDataPhone.isUserDataEnabled() || !backupDataPhone.isDataAllowed()) {
+ mPhoneSwitcherCallback.onRequireImmediatelySwitchToPhone(DEFAULT_PHONE_INDEX,
+ EVALUATION_REASON_DATA_SETTINGS_CHANGED);
+ log(debugMessage.append(
+ ", immediately back to default as user turns off settings").toString());
+ return;
+ }
}
boolean backToDefault = false;
@@ -915,12 +917,15 @@
}
if (secondaryDataPhone != null) {
- // check auto switch feature enabled
- if (secondaryDataPhone.isDataAllowed()) {
+ // check internet data is allowed on the candidate
+ DataEvaluation internetEvaluation = secondaryDataPhone.getDataNetworkController()
+ .getInternetEvaluation(false/*ignoreExistingNetworks*/);
+ if (!internetEvaluation.containsDisallowedReasons()) {
return new StabilityEventExtra(phoneId,
isForPerformance, mRequirePingTestBeforeSwitch);
} else {
- debugMessage.append(", but candidate's data is not allowed");
+ debugMessage.append(", but candidate's data is not allowed ")
+ .append(internetEvaluation);
}
}
}
@@ -932,8 +937,7 @@
* @return {@code true} If the feature of switching base on RAT and signal strength is enabled.
*/
private boolean isRatSignalStrengthBasedSwitchEnabled() {
- return sFeatureFlags.autoDataSwitchRatSs() && mScoreTolerance >= 0
- && mAutoDataSwitchPerformanceStabilityTimeThreshold >= 0;
+ return mScoreTolerance >= 0 && mAutoDataSwitchPerformanceStabilityTimeThreshold >= 0;
}
/**
@@ -953,39 +957,27 @@
*/
private void startStabilityCheck(int targetPhoneId, boolean isForPerformance,
boolean needValidation) {
- String combinationIdentifier = targetPhoneId + "" + needValidation;
- if (sFeatureFlags.autoDataSwitchRatSs()) {
- StabilityEventExtra eventExtras = (StabilityEventExtra)
- mScheduledEventsToExtras.getOrDefault(EVENT_STABILITY_CHECK_PASSED,
- new StabilityEventExtra(INVALID_PHONE_INDEX, false /*need validation*/,
- false /*isForPerformance*/));
- long delayMs = -1;
- // Check if already scheduled one with that combination of extras.
- if (eventExtras.targetPhoneId != targetPhoneId
- || eventExtras.needValidation != needValidation
- || eventExtras.isForPerformance != isForPerformance) {
- eventExtras =
- new StabilityEventExtra(targetPhoneId, isForPerformance, needValidation);
+ StabilityEventExtra eventExtras = (StabilityEventExtra)
+ mScheduledEventsToExtras.getOrDefault(EVENT_STABILITY_CHECK_PASSED,
+ new StabilityEventExtra(INVALID_PHONE_INDEX, false /*need validation*/,
+ false /*isForPerformance*/));
+ long delayMs = -1;
+ // Check if already scheduled one with that combination of extras.
+ if (eventExtras.targetPhoneId != targetPhoneId
+ || eventExtras.needValidation != needValidation
+ || eventExtras.isForPerformance != isForPerformance) {
+ eventExtras =
+ new StabilityEventExtra(targetPhoneId, isForPerformance, needValidation);
- // Reset with new timer.
- delayMs = isForPerformance
- ? mAutoDataSwitchPerformanceStabilityTimeThreshold
- : mAutoDataSwitchAvailabilityStabilityTimeThreshold;
- scheduleEventWithTimer(EVENT_STABILITY_CHECK_PASSED, eventExtras, delayMs);
- }
- log("startStabilityCheck: "
- + (delayMs != -1 ? "scheduling " : "already scheduled ")
- + eventExtras);
- } else if (!hasEqualMessages(EVENT_STABILITY_CHECK_PASSED, combinationIdentifier)) {
- removeMessages(EVENT_STABILITY_CHECK_PASSED);
- sendMessageDelayed(obtainMessage(EVENT_STABILITY_CHECK_PASSED, targetPhoneId,
- needValidation ? 1 : 0,
- combinationIdentifier),
- mAutoDataSwitchAvailabilityStabilityTimeThreshold);
- log("startStabilityCheck: targetPhoneId=" + targetPhoneId
- + " isForPerformance=" + isForPerformance
- + " needValidation=" + needValidation);
+ // Reset with new timer.
+ delayMs = isForPerformance
+ ? mAutoDataSwitchPerformanceStabilityTimeThreshold
+ : mAutoDataSwitchAvailabilityStabilityTimeThreshold;
+ scheduleEventWithTimer(EVENT_STABILITY_CHECK_PASSED, eventExtras, delayMs);
}
+ log("startStabilityCheck: "
+ + (delayMs != -1 ? "scheduling " : "already scheduled ")
+ + eventExtras);
}
/**
@@ -1075,18 +1067,14 @@
private void cancelAnyPendingSwitch() {
mSelectedTargetPhoneId = INVALID_PHONE_INDEX;
resetFailedCount();
- if (sFeatureFlags.autoDataSwitchRatSs()) {
- if (mScheduledEventsToExtras.containsKey(EVENT_STABILITY_CHECK_PASSED)) {
- if (mEventsToAlarmListener.containsKey(EVENT_STABILITY_CHECK_PASSED)) {
- mAlarmManager.cancel(mEventsToAlarmListener.get(EVENT_STABILITY_CHECK_PASSED));
- } else {
- loge("cancelAnyPendingSwitch: EVENT_STABILITY_CHECK_PASSED listener is null");
- }
- removeMessages(EVENT_STABILITY_CHECK_PASSED);
- mScheduledEventsToExtras.remove(EVENT_STABILITY_CHECK_PASSED);
+ if (mScheduledEventsToExtras.containsKey(EVENT_STABILITY_CHECK_PASSED)) {
+ if (mEventsToAlarmListener.containsKey(EVENT_STABILITY_CHECK_PASSED)) {
+ mAlarmManager.cancel(mEventsToAlarmListener.get(EVENT_STABILITY_CHECK_PASSED));
+ } else {
+ loge("cancelAnyPendingSwitch: EVENT_STABILITY_CHECK_PASSED listener is null");
}
- } else {
removeMessages(EVENT_STABILITY_CHECK_PASSED);
+ mScheduledEventsToExtras.remove(EVENT_STABILITY_CHECK_PASSED);
}
mPhoneSwitcherCallback.onRequireCancelAnyPendingAutoSwitchValidation();
}
diff --git a/src/java/com/android/internal/telephony/data/DataConfigManager.java b/src/java/com/android/internal/telephony/data/DataConfigManager.java
index 4177cc4..20761e2 100644
--- a/src/java/com/android/internal/telephony/data/DataConfigManager.java
+++ b/src/java/com/android/internal/telephony/data/DataConfigManager.java
@@ -714,8 +714,7 @@
/**
* Update the voice over PS related config from the carrier config.
*/
- private void updateVopsConfig() {
- synchronized (this) {
+ private synchronized void updateVopsConfig() {
mShouldKeepNetworkUpInNonVops = mCarrierConfig.getBoolean(CarrierConfigManager
.Ims.KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL);
int[] allowedNetworkTypes = mCarrierConfig.getIntArray(
@@ -723,7 +722,6 @@
if (allowedNetworkTypes != null) {
Arrays.stream(allowedNetworkTypes).forEach(mEnabledVopsNetworkTypesInNonVops::add);
}
- }
}
/**
@@ -886,6 +884,14 @@
}
/**
+ * @return What kind of traffic is supported on an unrestricted satellite network.
+ */
+ @CarrierConfigManager.SATELLITE_DATA_SUPPORT_MODE
+ public int getSatelliteDataSupportMode() {
+ return mCarrierConfig.getInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT);
+ }
+
+ /**
* @return Whether data throttling should be reset when the TAC changes from the carrier config.
*/
public boolean shouldResetDataThrottlingWhenTacChanges() {
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index 57d242b..8369874 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -2445,6 +2445,7 @@
}
// Always start with not-restricted, and then remove if needed.
+ // By default, NET_CAPABILITY_NOT_RESTRICTED and NET_CAPABILITY_NOT_CONSTRAINED are included
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
// When data is disabled, or data roaming is disabled and the device is roaming, we need
@@ -2483,11 +2484,6 @@
builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
}
- // mark the network as restricted when service state is non-terrestrial(satellite network)
- if (mFlags.satelliteInternet() && mIsSatellite) {
- builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
- }
-
// Check if the feature force MMS on IWLAN is enabled. When the feature is enabled, MMS
// will be attempted on IWLAN if possible, even if existing cellular networks already
// supports IWLAN.
@@ -2529,6 +2525,23 @@
builder.setLinkDownstreamBandwidthKbps(mNetworkBandwidth.downlinkBandwidthKbps);
builder.setLinkUpstreamBandwidthKbps(mNetworkBandwidth.uplinkBandwidthKbps);
+ // Configure the network as restricted/constrained for unrestricted satellite network.
+ if (mFlags.satelliteInternet() && mIsSatellite && builder.build()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
+ switch (mDataConfigManager.getSatelliteDataSupportMode()) {
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED
+ -> builder.removeCapability(
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED -> {
+ try {
+ builder.removeCapability(DataUtils
+ .NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ } catch (Exception ignored) { }
+ }
+ // default case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL
+ }
+ }
+
NetworkCapabilities nc = builder.build();
if (mNetworkCapabilities == null || mNetworkAgent == null) {
// This is the first time when network capabilities is created. The agent is not created
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index a720e03..30172db 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -92,6 +92,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.SlidingWindowEventCounter;
+import com.android.internal.telephony.TelephonyCapabilities;
import com.android.internal.telephony.TelephonyComponentFactory;
import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
@@ -462,7 +463,7 @@
};
private boolean hasCalling() {
- if (!mFeatureFlags.minimalTelephonyCdmCheck()) return true;
+ if (!TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)) return true;
return mPhone.getContext().getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_CALLING);
}
@@ -1481,6 +1482,19 @@
* still allowed in this case.
*/
public boolean isInternetDataAllowed(boolean ignoreExistingNetworks) {
+ return !getInternetEvaluation(ignoreExistingNetworks).containsDisallowedReasons();
+ }
+
+ /**
+ * @param ignoreExistingNetworks {@code true} to skip the existing network check.
+ * @return The internet evaluation result.
+ * For example, if SIM is absent, or airplane mode is on, then data is NOT allowed.
+ * This API does not reflect the currently internet data network status. It's possible there is
+ * no internet data due to weak cellular signal or network side issue, but internet data is
+ * still allowed in this case.
+ */
+ @NonNull
+ public DataEvaluation getInternetEvaluation(boolean ignoreExistingNetworks) {
TelephonyNetworkRequest internetRequest = new TelephonyNetworkRequest(
new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
@@ -1492,7 +1506,7 @@
&& mDataNetworkList.stream().anyMatch(
dataNetwork -> internetRequest.canBeSatisfiedBy(
dataNetwork.getNetworkCapabilities()))) {
- return true;
+ return new DataEvaluation(DataEvaluationReason.EXTERNAL_QUERY);
}
// If no existing network can satisfy the request, then check if we can possibly setup
@@ -1500,17 +1514,19 @@
DataEvaluation evaluation = evaluateNetworkRequest(internetRequest,
DataEvaluationReason.EXTERNAL_QUERY);
- if (evaluation.containsOnly(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)) {
+ if (evaluation.containsOnly(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
+ && internetRequest.getPriority() > mDataNetworkList.stream()
+ .map(DataNetwork::getPriority)
+ .max(Comparator.comparing(Integer::valueOf))
+ .orElse(0)) {
// If the only failed reason is only single network allowed, then check if the request
// can trump the current network.
- return internetRequest.getPriority() > mDataNetworkList.stream()
- .map(DataNetwork::getPriority)
- .max(Comparator.comparing(Integer::valueOf))
- .orElse(0);
+ evaluation.addDataAllowedReason(DataAllowedReason.NORMAL);
}
- return !evaluation.containsDisallowedReasons();
+ return evaluation;
}
+
/**
* @return {@code true} if internet is unmetered.
*/
@@ -1931,22 +1947,12 @@
// If the network is satellite, then the network must be restricted.
if (mFeatureFlags.satelliteInternet()) {
// The IWLAN data network should remain intact even when satellite is connected.
- if (dataNetwork.getTransport() != AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
- // On satellite, every data network needs to be restricted.
- if (mServiceState.isUsingNonTerrestrialNetwork()
- && dataNetwork.getNetworkCapabilities()
- .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- evaluation.addDataDisallowedReason(
- DataDisallowedReason.DATA_NETWORK_TRANSPORT_NOT_ALLOWED);
- }
-
- // Check if the transport is compatible with the network
- if (mServiceState.isUsingNonTerrestrialNetwork() != dataNetwork.isSatellite()) {
- // Since we don't support satellite/cellular network handover, we should always
- // tear down the network when transport changes.
- evaluation.addDataDisallowedReason(
- DataDisallowedReason.DATA_NETWORK_TRANSPORT_NOT_ALLOWED);
- }
+ if (dataNetwork.getTransport() != AccessNetworkConstants.TRANSPORT_TYPE_WLAN
+ && mServiceState.isUsingNonTerrestrialNetwork() != dataNetwork.isSatellite()) {
+ // Since we don't support satellite/cellular network handover, we should always
+ // tear down the network when transport changes.
+ evaluation.addDataDisallowedReason(
+ DataDisallowedReason.DATA_NETWORK_TRANSPORT_NOT_ALLOWED);
}
}
@@ -2155,11 +2161,24 @@
return true;
}
- // When the device is on satellite, only restricted network request can request network.
- if (mServiceState.isUsingNonTerrestrialNetwork()
- && networkRequest.hasCapability(
- NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- return false;
+ // When the device is on satellite, only restricted/constrained network request can request
+ // network.
+ if (mServiceState.isUsingNonTerrestrialNetwork() && networkRequest.hasCapability(
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
+ switch (mDataConfigManager.getSatelliteDataSupportMode()) {
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED -> {
+ return false;
+ }
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED -> {
+ try {
+ if (networkRequest.hasCapability(DataUtils
+ .NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)) {
+ return false;
+ }
+ } catch (Exception ignored) { }
+ }
+ // default case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL
+ }
}
// If the network request does not specify cellular or satellite, then it can be
diff --git a/src/java/com/android/internal/telephony/data/DataSettingsManager.java b/src/java/com/android/internal/telephony/data/DataSettingsManager.java
index 36e7e19..fb112d9 100644
--- a/src/java/com/android/internal/telephony/data/DataSettingsManager.java
+++ b/src/java/com/android/internal/telephony/data/DataSettingsManager.java
@@ -47,6 +47,7 @@
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SettingsObserver;
+import com.android.internal.telephony.TelephonyCapabilities;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.DeviceTelephonyPropertiesStats;
@@ -273,7 +274,7 @@
}
private boolean hasCalling() {
- if (!mFeatureFlags.minimalTelephonyCdmCheck()) return true;
+ if (!TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)) return true;
return mPhone.getContext().getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_CALLING);
}
diff --git a/src/java/com/android/internal/telephony/data/DataUtils.java b/src/java/com/android/internal/telephony/data/DataUtils.java
index 8b95913..20da97f 100644
--- a/src/java/com/android/internal/telephony/data/DataUtils.java
+++ b/src/java/com/android/internal/telephony/data/DataUtils.java
@@ -59,6 +59,7 @@
* This class contains all the utility methods used by telephony data stack.
*/
public class DataUtils {
+ public static final int NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED = 37;
/** The time format for converting time to readable string. */
private static final SimpleDateFormat TIME_FORMAT =
new SimpleDateFormat("HH:mm:ss.SSS", Locale.US);
@@ -165,6 +166,7 @@
case NetworkCapabilities.NET_CAPABILITY_MMTEL -> "MMTEL";
case NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY -> "PRIORITIZE_LATENCY";
case NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH -> "PRIORITIZE_BANDWIDTH";
+ case NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED -> "NOT_BANDWIDTH_CONSTRAINED";
default -> {
loge("Unknown network capability(" + netCap + ")");
yield "Unknown(" + netCap + ")";
diff --git a/src/java/com/android/internal/telephony/data/LinkBandwidthEstimator.java b/src/java/com/android/internal/telephony/data/LinkBandwidthEstimator.java
index b92a590..534f191 100644
--- a/src/java/com/android/internal/telephony/data/LinkBandwidthEstimator.java
+++ b/src/java/com/android/internal/telephony/data/LinkBandwidthEstimator.java
@@ -178,6 +178,7 @@
private long mRxBytesDeltaAcc;
private ModemActivityInfo mLastModemActivityInfo = null;
+ private final TelephonyCallback mTelephonyCallback = new TelephonyCallbackImpl();
private int mSignalStrengthDbm;
private int mSignalLevel;
private int mDataRat = TelephonyManager.NETWORK_TYPE_UNKNOWN;
@@ -315,8 +316,7 @@
if (cm != null) {
cm.registerDefaultNetworkCallback(mDefaultNetworkCallback, this);
}
- mTelephonyManager.registerTelephonyCallback(new HandlerExecutor(this),
- new TelephonyCallbackImpl());
+ mTelephonyManager.registerTelephonyCallback(new HandlerExecutor(this), mTelephonyCallback);
mPlaceholderNetwork = new NetworkBandwidth(UNKNOWN_PLMN);
initAvgBwPerRatTable();
registerNrStateFrequencyChange();
diff --git a/src/java/com/android/internal/telephony/domainselection/DomainSelectionController.java b/src/java/com/android/internal/telephony/domainselection/DomainSelectionController.java
index ee8517d..e4ae592 100644
--- a/src/java/com/android/internal/telephony/domainselection/DomainSelectionController.java
+++ b/src/java/com/android/internal/telephony/domainselection/DomainSelectionController.java
@@ -271,7 +271,9 @@
mHandler,
mRestartBindingRunnable);
- int numPhones = TelephonyManager.getDefault().getActiveModemCount();
+ TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
+ int numPhones = tm.getSupportedModemCount();
+ logi("numPhones=" + numPhones);
mConnectionCounts = new int[numPhones];
for (int i = 0; i < numPhones; i++) {
mConnectionCounts[i] = 0;
diff --git a/src/java/com/android/internal/telephony/domainselection/DomainSelectionResolver.java b/src/java/com/android/internal/telephony/domainselection/DomainSelectionResolver.java
index 410f89b..1b66e54 100644
--- a/src/java/com/android/internal/telephony/domainselection/DomainSelectionResolver.java
+++ b/src/java/com/android/internal/telephony/domainselection/DomainSelectionResolver.java
@@ -64,8 +64,7 @@
* to be bound to the domain selection controller.
*/
public static void make(Context context, String flattenedComponentName) {
- Log.i(TAG, "make flag=" + Flags.apDomainSelectionEnabled()
- + ", useOem=" + Flags.useOemDomainSelectionService());
+ Log.i(TAG, "make useOem=" + Flags.useOemDomainSelectionService());
if (sInstance == null) {
sInstance = new DomainSelectionResolver(context, flattenedComponentName);
}
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
index 02dd613..06ebff2 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
@@ -50,6 +50,7 @@
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.ServiceStateTracker;
+import com.android.internal.telephony.TelephonyCapabilities;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.EmergencyNumberStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
@@ -186,7 +187,7 @@
mFeatureFlags = featureFlags;
mResources = ctx.getResources();
- if (mFeatureFlags.minimalTelephonyCdmCheck()
+ if (TelephonyCapabilities.minimalTelephonyCdmCheck(mFeatureFlags)
&& !ctx.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_TELEPHONY_CALLING)) {
throw new UnsupportedOperationException("EmergencyNumberTracker requires calling");
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index dcb3b20..e73eafd 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -3553,8 +3553,10 @@
if (DBG) log("onCallStartFailed reasonCode=" + reasonInfo.getCode());
int eccCategory = EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED;
+ List<String> emergencyUrns = new ArrayList<>();
if (imsCall != null && imsCall.getCallProfile() != null) {
eccCategory = imsCall.getCallProfile().getEmergencyServiceCategories();
+ emergencyUrns = imsCall.getCallProfile().getEmergencyUrns();
}
if (mHoldSwitchingState == HoldSwapState.HOLDING_TO_ANSWER_INCOMING) {
@@ -3581,13 +3583,14 @@
// Since onCallInitiating and onCallProgressing reset mPendingMO,
// we can't depend on mPendingMO.
if (conn != null) {
- logi("onCallStartFailed eccCategory=" + eccCategory);
+ logi("onCallStartFailed eccCategory=" + eccCategory + ", emergencyUrns="
+ + emergencyUrns);
int reason = reasonInfo.getCode();
int extraCode = reasonInfo.getExtraCode();
if ((reason == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED
&& extraCode == ImsReasonInfo.EXTRA_CODE_CALL_RETRY_EMERGENCY)
|| (reason == ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL)) {
- conn.setNonDetectableEmergencyCallInfo(eccCategory);
+ conn.setNonDetectableEmergencyCallInfo(eccCategory, emergencyUrns);
}
conn.setImsReasonInfo(reasonInfo);
sendCallStartFailedDisconnect(imsCall, reasonInfo);
@@ -3765,11 +3768,13 @@
&& DomainSelectionResolver.getInstance().isDomainSelectionSupported()) {
if (conn != null) {
int eccCategory = EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED;
+ List<String> emergencyUrns = new ArrayList<>();
if (imsCall != null && imsCall.getCallProfile() != null) {
eccCategory = imsCall.getCallProfile().getEmergencyServiceCategories();
+ emergencyUrns = imsCall.getCallProfile().getEmergencyUrns();
logi("onCallTerminated eccCategory=" + eccCategory);
}
- conn.setNonDetectableEmergencyCallInfo(eccCategory);
+ conn.setNonDetectableEmergencyCallInfo(eccCategory, emergencyUrns);
}
processCallStateChange(imsCall, ImsPhoneCall.State.DISCONNECTED, cause);
return;
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
old mode 100755
new mode 100644
index aee8867..316f62a
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
@@ -286,13 +286,13 @@
mIsEmergency = isEmergency;
if (isEmergency) {
- setEmergencyCallInfo(mOwner);
+ setEmergencyCallInfo(mOwner, dialArgs);
if (getEmergencyNumberInfo() == null) {
// There was no emergency number info found for this call, however it is
// still marked as an emergency number. This may happen if it was a redialed
// non-detectable emergency call from IMS.
- setNonDetectableEmergencyCallInfo(dialArgs.eccCategory);
+ setNonDetectableEmergencyCallInfo(dialArgs.eccCategory, new ArrayList<String>());
}
}
diff --git a/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java
index 13fb826..175f5e4 100644
--- a/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java
+++ b/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java
@@ -309,6 +309,7 @@
copy.isIwlanCrossSim = call.isIwlanCrossSim;
copy.isNtn = call.isNtn;
copy.isSatelliteTransport = call.isSatelliteTransport;
+ copy.isProvisioningProfile = call.isProvisioningProfile;
return copy;
}
@@ -339,6 +340,7 @@
proto.isNtn = mSatelliteController != null
? mSatelliteController.isInSatelliteModeForCarrierRoaming(mPhone) : false;
proto.isSatelliteTransport = isSatellite;
+ proto.isProvisioningProfile = getIsProvisioningProfile();
return proto;
}
@@ -355,6 +357,17 @@
return subInfo != null && subInfo.isOpportunistic();
}
+ private boolean getIsProvisioningProfile() {
+ SubscriptionInfoInternal subInfo = SubscriptionManagerService.getInstance()
+ .getSubscriptionInfoInternal(mPhone.getSubId());
+ try {
+ return subInfo.getProfileClass() == SubscriptionManager.PROFILE_CLASS_PROVISIONING;
+ } catch (Exception ex) {
+ loge("getIsProvisioningProfile: " + ex.getMessage());
+ return false;
+ }
+ }
+
private boolean getIsOos() {
ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
ServiceState serviceState =
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index 49afd54..a83cd06 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -39,6 +39,7 @@
import static com.android.internal.telephony.TelephonyStatsLog.PRESENCE_NOTIFY_EVENT;
import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS;
import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS;
+import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_ACCESS_CONTROLLER;
import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONFIG_UPDATER;
import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_CONTROLLER;
import static com.android.internal.telephony.TelephonyStatsLog.SATELLITE_ENTITLEMENT;
@@ -95,6 +96,7 @@
import com.android.internal.telephony.nano.PersistAtomsProto.PresenceNotifyEvent;
import com.android.internal.telephony.nano.PersistAtomsProto.RcsAcsProvisioningStats;
import com.android.internal.telephony.nano.PersistAtomsProto.RcsClientProvisioningStats;
+import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteAccessController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement;
@@ -242,6 +244,7 @@
registerAtom(CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS);
registerAtom(SATELLITE_ENTITLEMENT);
registerAtom(SATELLITE_CONFIG_UPDATER);
+ registerAtom(SATELLITE_ACCESS_CONTROLLER);
Rlog.d(TAG, "registered");
} else {
Rlog.e(TAG, "could not get StatsManager, atoms not registered");
@@ -346,6 +349,8 @@
return pullSatelliteEntitlement(data);
case SATELLITE_CONFIG_UPDATER:
return pullSatelliteConfigUpdater(data);
+ case SATELLITE_ACCESS_CONTROLLER:
+ return pullSatelliteAccessController(data);
default:
Rlog.e(TAG, String.format("unexpected atom ID %d", atomTag));
return StatsManager.PULL_SKIP;
@@ -1032,6 +1037,19 @@
}
}
+ private int pullSatelliteAccessController(List<StatsEvent> data) {
+ SatelliteAccessController[] satelliteAccessControllerAtoms =
+ mStorage.getSatelliteAccessControllerStats(MIN_COOLDOWN_MILLIS);
+ if (satelliteAccessControllerAtoms != null) {
+ Arrays.stream(satelliteAccessControllerAtoms)
+ .forEach(persistAtom -> data.add(buildStatsEvent(persistAtom)));
+ return StatsManager.PULL_SUCCESS;
+ } else {
+ Rlog.w(TAG, "SATELLITE_ACCESS_CONTROLLER pull too frequent, skipping");
+ return StatsManager.PULL_SKIP;
+ }
+ }
+
/** Registers a pulled atom ID {@code atomId}. */
private void registerAtom(int atomId) {
mStatsManager.setPullAtomCallback(atomId, /* metadata= */ null,
@@ -1127,7 +1145,9 @@
session.isIwlanCrossSimAtEnd,
session.isIwlanCrossSimAtConnected,
session.vonrEnabled,
- session.isNtn);
+ session.isNtn,
+ session.supportsBusinessCallComposer,
+ session.callComposerStatus);
}
@@ -1150,7 +1170,8 @@
sms.messageId,
sms.count,
sms.isManagedProfile,
- sms.isNtn);
+ sms.isNtn,
+ sms.isEmergency);
}
private static StatsEvent buildStatsEvent(OutgoingSms sms) {
@@ -1206,7 +1227,8 @@
dataCallSession.isNonDds,
dataCallSession.isIwlanCrossSim,
dataCallSession.isNtn,
- dataCallSession.isSatelliteTransport);
+ dataCallSession.isSatelliteTransport,
+ dataCallSession.isProvisioningProfile);
}
private static StatsEvent buildStatsEvent(ImsRegistrationStats stats) {
@@ -1449,7 +1471,10 @@
satelliteController.countOfDemoModeIncomingDatagramSuccess,
satelliteController.countOfDemoModeIncomingDatagramFail,
satelliteController.countOfDatagramTypeKeepAliveSuccess,
- satelliteController.countOfDatagramTypeKeepAliveFail);
+ satelliteController.countOfDatagramTypeKeepAliveFail,
+ satelliteController.countOfAllowedSatelliteAccess,
+ satelliteController.countOfDisallowedSatelliteAccess,
+ satelliteController.countOfSatelliteAccessCheckFail);
}
private static StatsEvent buildStatsEvent(SatelliteSession satelliteSession) {
@@ -1574,6 +1599,20 @@
stats.count);
}
+ private static StatsEvent buildStatsEvent(SatelliteAccessController stats) {
+ return TelephonyStatsLog.buildStatsEvent(
+ SATELLITE_ACCESS_CONTROLLER,
+ stats.accessControlType,
+ stats.locationQueryTimeMillis,
+ stats.onDeviceLookupTimeMillis,
+ stats.totalCheckingTimeMillis,
+ stats.isAllowed,
+ stats.isEmergency,
+ stats.resultCode,
+ stats.countryCodes,
+ stats.configDataSource);
+ }
+
/** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */
static Phone[] getPhonesIfAny() {
try {
diff --git a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
index 975750e..12dab7a 100644
--- a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
+++ b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
@@ -51,6 +51,7 @@
import com.android.internal.telephony.nano.PersistAtomsProto.PresenceNotifyEvent;
import com.android.internal.telephony.nano.PersistAtomsProto.RcsAcsProvisioningStats;
import com.android.internal.telephony.nano.PersistAtomsProto.RcsClientProvisioningStats;
+import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteAccessController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement;
@@ -766,6 +767,9 @@
+= stats.countOfDatagramTypeKeepAliveSuccess;
atom.countOfDatagramTypeKeepAliveFail
+= stats.countOfDatagramTypeKeepAliveFail;
+ atom.countOfAllowedSatelliteAccess += stats.countOfAllowedSatelliteAccess;
+ atom.countOfDisallowedSatelliteAccess += stats.countOfDisallowedSatelliteAccess;
+ atom.countOfSatelliteAccessCheckFail += stats.countOfSatelliteAccessCheckFail;
mAtoms.satelliteController = atomArray;
saveAtomsToFile(SAVE_TO_FILE_DELAY_FOR_UPDATE_MILLIS);
@@ -894,6 +898,14 @@
saveAtomsToFile(SAVE_TO_FILE_DELAY_FOR_UPDATE_MILLIS);
}
+ /** Adds a new {@link SatelliteAccessController} to the storage. */
+ public synchronized void addSatelliteAccessControllerStats(SatelliteAccessController stats) {
+ mAtoms.satelliteAccessController =
+ insertAtRandomPlace(mAtoms.satelliteAccessController, stats,
+ mMaxNumSatelliteStats);
+ saveAtomsToFile(SAVE_TO_FILE_DELAY_FOR_UPDATE_MILLIS);
+ }
+
/**
* Returns and clears the voice call sessions if last pulled longer than {@code
* minIntervalMillis} ago, otherwise returns {@code null}.
@@ -1542,7 +1554,7 @@
long minIntervalMillis) {
if (getWallTimeMillis() - mAtoms.satelliteSosMessageRecommenderPullTimestampMillis
> minIntervalMillis) {
- mAtoms.satelliteProvisionPullTimestampMillis = getWallTimeMillis();
+ mAtoms.satelliteSosMessageRecommenderPullTimestampMillis = getWallTimeMillis();
SatelliteSosMessageRecommender[] statsArray = mAtoms.satelliteSosMessageRecommender;
mAtoms.satelliteSosMessageRecommender = new SatelliteSosMessageRecommender[0];
saveAtomsToFile(SAVE_TO_FILE_DELAY_FOR_GET_MILLIS);
@@ -1648,6 +1660,25 @@
}
}
+ /**
+ * Returns and clears the {@link SatelliteAccessController} stats if last pulled longer
+ * than {@code minIntervalMillis} ago, otherwise returns {@code null}.
+ */
+ @Nullable
+ public synchronized SatelliteAccessController[] getSatelliteAccessControllerStats(
+ long minIntervalMillis) {
+ if (getWallTimeMillis() - mAtoms.satelliteAccessControllerPullTimestampMillis
+ > minIntervalMillis) {
+ mAtoms.satelliteAccessControllerPullTimestampMillis = getWallTimeMillis();
+ SatelliteAccessController[] statsArray = mAtoms.satelliteAccessController;
+ mAtoms.satelliteAccessController = new SatelliteAccessController[0];
+ saveAtomsToFile(SAVE_TO_FILE_DELAY_FOR_GET_MILLIS);
+ return statsArray;
+ } else {
+ return null;
+ }
+ }
+
/** Saves {@link PersistAtoms} to a file in private storage immediately. */
public synchronized void flushAtoms() {
saveAtomsToFile(0);
@@ -1814,6 +1845,9 @@
SatelliteEntitlement.class, mMaxNumSatelliteStats);
atoms.satelliteConfigUpdater = sanitizeAtoms(atoms.satelliteConfigUpdater,
SatelliteConfigUpdater.class, mMaxNumSatelliteStats);
+ atoms.satelliteAccessController = sanitizeAtoms(
+ atoms.satelliteAccessController, SatelliteAccessController.class,
+ mMaxNumSatelliteStats);
// out of caution, sanitize also the timestamps
atoms.voiceCallRatUsagePullTimestampMillis =
@@ -1886,6 +1920,8 @@
sanitizeTimestamp(atoms.satelliteEntitlementPullTimestampMillis);
atoms.satelliteConfigUpdaterPullTimestampMillis =
sanitizeTimestamp(atoms.satelliteConfigUpdaterPullTimestampMillis);
+ atoms.satelliteAccessControllerPullTimestampMillis =
+ sanitizeTimestamp(atoms.satelliteAccessControllerPullTimestampMillis);
return atoms;
} catch (NoSuchFileException e) {
Rlog.d(TAG, "PersistAtoms file not found");
@@ -2629,6 +2665,7 @@
atoms.carrierRoamingSatelliteControllerStatsPullTimestampMillis = currentTime;
atoms.satelliteEntitlementPullTimestampMillis = currentTime;
atoms.satelliteConfigUpdaterPullTimestampMillis = currentTime;
+ atoms.satelliteAccessControllerPullTimestampMillis = currentTime;
Rlog.d(TAG, "created new PersistAtoms");
return atoms;
diff --git a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
index 978e9d3..c2b2753 100644
--- a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
@@ -24,6 +24,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteControllerStats;
import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteSession;
+import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteAccessController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement;
@@ -35,6 +36,8 @@
import com.android.internal.telephony.satellite.SatelliteConstants;
import com.android.telephony.Rlog;
+import java.util.Arrays;
+
/** Tracks Satellite metrics for each phone */
public class SatelliteStats {
private static final String TAG = SatelliteStats.class.getSimpleName();
@@ -85,6 +88,9 @@
private final int mCountOfDemoModeIncomingDatagramFail;
private final int mCountOfDatagramTypeKeepAliveSuccess;
private final int mCountOfDatagramTypeKeepAliveFail;
+ private final int mCountOfAllowedSatelliteAccess;
+ private final int mCountOfDisallowedSatelliteAccess;
+ private final int mCountOfSatelliteAccessCheckFail;
private SatelliteControllerParams(Builder builder) {
this.mCountOfSatelliteServiceEnablementsSuccess =
@@ -124,6 +130,12 @@
builder.mCountOfDatagramTypeKeepAliveSuccess;
this.mCountOfDatagramTypeKeepAliveFail =
builder.mCountOfDatagramTypeKeepAliveFail;
+ this.mCountOfAllowedSatelliteAccess =
+ builder.mCountOfAllowedSatelliteAccess;
+ this.mCountOfDisallowedSatelliteAccess =
+ builder.mCountOfDisallowedSatelliteAccess;
+ this.mCountOfSatelliteAccessCheckFail =
+ builder.mCountOfSatelliteAccessCheckFail;
}
public int getCountOfSatelliteServiceEnablementsSuccess() {
@@ -226,6 +238,18 @@
return mCountOfDatagramTypeKeepAliveFail;
}
+ public int getCountOfAllowedSatelliteAccess() {
+ return mCountOfAllowedSatelliteAccess;
+ }
+
+ public int getCountOfDisallowedSatelliteAccess() {
+ return mCountOfDisallowedSatelliteAccess;
+ }
+
+ public int getCountOfSatelliteAccessCheckFail() {
+ return mCountOfSatelliteAccessCheckFail;
+ }
+
/**
* A builder class to create {@link SatelliteControllerParams} data structure class
*/
@@ -255,6 +279,9 @@
private int mCountOfDemoModeIncomingDatagramFail = 0;
private int mCountOfDatagramTypeKeepAliveSuccess = 0;
private int mCountOfDatagramTypeKeepAliveFail = 0;
+ private int mCountOfAllowedSatelliteAccess = 0;
+ private int mCountOfDisallowedSatelliteAccess = 0;
+ private int mCountOfSatelliteAccessCheckFail = 0;
/**
* Sets countOfSatelliteServiceEnablementsSuccess value of {@link SatelliteController}
@@ -503,6 +530,37 @@
}
/**
+ * Sets countOfAllowedSatelliteAccess value of {@link SatelliteController} atom
+ * then returns Builder class
+ */
+ public Builder setCountOfAllowedSatelliteAccess(
+ int countOfAllowedSatelliteAccess) {
+ this.mCountOfAllowedSatelliteAccess =
+ countOfAllowedSatelliteAccess;
+ return this;
+ }
+
+ /**
+ * Sets countOfDisallowedSatelliteAccess value of {@link SatelliteController} atom
+ * then returns Builder class
+ */
+ public Builder setCountOfDisallowedSatelliteAccess(
+ int countOfDisallowedSatelliteAccess) {
+ this.mCountOfDisallowedSatelliteAccess = countOfDisallowedSatelliteAccess;
+ return this;
+ }
+
+ /**
+ * Sets countOfSatelliteAccessCheckFail value of {@link SatelliteController} atom
+ * then returns Builder class
+ */
+ public Builder setCountOfSatelliteAccessCheckFail(
+ int countOfSatelliteAccessCheckFail) {
+ this.mCountOfSatelliteAccessCheckFail = countOfSatelliteAccessCheckFail;
+ return this;
+ }
+
+ /**
* Returns ControllerParams, which contains whole component of
* {@link SatelliteController} atom
*/
@@ -548,6 +606,9 @@
+ mCountOfDatagramTypeKeepAliveSuccess
+ ", countOfDatagramTypeKeepAliveFail="
+ mCountOfDatagramTypeKeepAliveFail
+ + ", countOfAllowedSatelliteAccess=" + mCountOfAllowedSatelliteAccess
+ + ", countOfDisallowedSatelliteAccess=" + mCountOfDisallowedSatelliteAccess
+ + ", countOfSatelliteAccessCheckFail=" + mCountOfSatelliteAccessCheckFail
+ ")";
}
}
@@ -1915,6 +1976,169 @@
}
}
+ /**
+ * A data class to contain whole component of {@link SatelliteAccessControllerParams} atom.
+ * Refer to {@link #onSatelliteAccessControllerMetrics(SatelliteAccessControllerParams)}.
+ */
+ public class SatelliteAccessControllerParams {
+ private final @SatelliteConstants.AccessControlType int mAccessControlType;
+ private final long mLocationQueryTimeMillis;
+ private final long mOnDeviceLookupTimeMillis;
+ private final long mTotalCheckingTimeMillis;
+ private final boolean mIsAllowed;
+ private final boolean mIsEmergency;
+ private final @SatelliteManager.SatelliteResult int mResultCode;
+ private final String[] mCountryCodes;
+ private final @SatelliteConstants.ConfigDataSource int mConfigDataSource;
+
+ private SatelliteAccessControllerParams(Builder builder) {
+ this.mAccessControlType = builder.mAccessControlType;
+ this.mLocationQueryTimeMillis = builder.mLocationQueryTimeMillis;
+ this.mOnDeviceLookupTimeMillis = builder.mOnDeviceLookupTimeMillis;
+ this.mTotalCheckingTimeMillis = builder.mTotalCheckingTimeMillis;
+ this.mIsAllowed = builder.mIsAllowed;
+ this.mIsEmergency = builder.mIsEmergency;
+ this.mResultCode = builder.mResultCode;
+ this.mCountryCodes = builder.mCountryCodes;
+ this.mConfigDataSource = builder.mConfigDataSource;
+ }
+
+ public @SatelliteConstants.AccessControlType int getAccessControlType() {
+ return mAccessControlType;
+ }
+
+ public long getLocationQueryTime() {
+ return mLocationQueryTimeMillis;
+ }
+
+ public long getOnDeviceLookupTime() {
+ return mOnDeviceLookupTimeMillis;
+ }
+
+ public long getTotalCheckingTime() {
+ return mTotalCheckingTimeMillis;
+ }
+
+ public boolean getIsAllowed() {
+ return mIsAllowed;
+ }
+
+ public boolean getIsEmergency() {
+ return mIsEmergency;
+ }
+
+ public @SatelliteManager.SatelliteResult int getResultCode() {
+ return mResultCode;
+ }
+
+ public String[] getCountryCodes() {
+ return mCountryCodes;
+ }
+
+ public @SatelliteConstants.ConfigDataSource int getConfigDataSource() {
+ return mConfigDataSource;
+ }
+
+ /**
+ * A builder class to create {@link SatelliteAccessControllerParams} data structure class
+ */
+ public static class Builder {
+ private @SatelliteConstants.AccessControlType int mAccessControlType;
+ private long mLocationQueryTimeMillis;
+ private long mOnDeviceLookupTimeMillis;
+ private long mTotalCheckingTimeMillis;
+ private boolean mIsAllowed;
+ private boolean mIsEmergency;
+ private @SatelliteManager.SatelliteResult int mResultCode;
+ private String[] mCountryCodes;
+ private @SatelliteConstants.ConfigDataSource int mConfigDataSource;
+
+ /**
+ * Sets AccessControlType value of {@link #SatelliteAccessController}
+ * atom then returns Builder class
+ */
+ public Builder setAccessControlType(
+ @SatelliteConstants.AccessControlType int accessControlType) {
+ this.mAccessControlType = accessControlType;
+ return this;
+ }
+
+ /** Sets the location query time for current satellite enablement. */
+ public Builder setLocationQueryTime(long locationQueryTimeMillis) {
+ this.mLocationQueryTimeMillis = locationQueryTimeMillis;
+ return this;
+ }
+
+ /** Sets the on device lookup time for current satellite enablement. */
+ public Builder setOnDeviceLookupTime(long onDeviceLookupTimeMillis) {
+ this.mOnDeviceLookupTimeMillis = onDeviceLookupTimeMillis;
+ return this;
+ }
+
+ /** Sets the total checking time for current satellite enablement. */
+ public Builder setTotalCheckingTime(long totalCheckingTimeMillis) {
+ this.mTotalCheckingTimeMillis = totalCheckingTimeMillis;
+ return this;
+ }
+
+ /** Sets whether the satellite communication is allowed from current location. */
+ public Builder setIsAllowed(boolean isAllowed) {
+ this.mIsAllowed = isAllowed;
+ return this;
+ }
+
+ /** Sets whether the current satellite enablement is for emergency or not. */
+ public Builder setIsEmergency(boolean isEmergency) {
+ this.mIsEmergency = isEmergency;
+ return this;
+ }
+
+ /** Sets the result code for checking whether satellite service is allowed from current
+ location. */
+ public Builder setResult(int result) {
+ this.mResultCode = result;
+ return this;
+ }
+
+ /** Sets the country code for current location while attempting satellite enablement. */
+ public Builder setCountryCodes(String[] countryCodes) {
+ this.mCountryCodes = Arrays.stream(countryCodes).toArray(String[]::new);
+ return this;
+ }
+
+ /** Sets the config data source for checking whether satellite service is allowed from
+ current location. */
+ public Builder setConfigDatasource(int configDatasource) {
+ this.mConfigDataSource = configDatasource;
+ return this;
+ }
+
+ /**
+ * Returns AccessControllerParams, which contains whole component of
+ * {@link #SatelliteAccessController} atom
+ */
+ public SatelliteAccessControllerParams build() {
+ return new SatelliteStats()
+ .new SatelliteAccessControllerParams(this);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "AccessControllerParams("
+ + ", AccessControlType=" + mAccessControlType
+ + ", LocationQueryTime=" + mLocationQueryTimeMillis
+ + ", OnDeviceLookupTime=" + mOnDeviceLookupTimeMillis
+ + ", TotalCheckingTime=" + mTotalCheckingTimeMillis
+ + ", IsAllowed=" + mIsAllowed
+ + ", IsEmergency=" + mIsEmergency
+ + ", ResultCode=" + mResultCode
+ + ", CountryCodes=" + Arrays.toString(mCountryCodes)
+ + ", ConfigDataSource=" + mConfigDataSource
+ + ")";
+ }
+ }
+
/** Create a new atom or update an existing atom for SatelliteController metrics */
public synchronized void onSatelliteControllerMetrics(SatelliteControllerParams param) {
SatelliteController proto = new SatelliteController();
@@ -2079,4 +2303,20 @@
proto.count = param.getCount();
mAtomsStorage.addSatelliteConfigUpdaterStats(proto);
}
+
+ /** Create a new atom or update an existing atom for SatelliteAccessController metrics */
+ public synchronized void onSatelliteAccessControllerMetrics(
+ SatelliteAccessControllerParams param) {
+ SatelliteAccessController proto = new SatelliteAccessController();
+ proto.accessControlType = param.getAccessControlType();
+ proto.locationQueryTimeMillis = param.getLocationQueryTime();
+ proto.onDeviceLookupTimeMillis = param.getOnDeviceLookupTime();
+ proto.totalCheckingTimeMillis = param.getTotalCheckingTime();
+ proto.isAllowed = param.getIsAllowed();
+ proto.isEmergency = param.getIsEmergency();
+ proto.resultCode = param.getResultCode();
+ proto.countryCodes = param.getCountryCodes();
+ proto.configDataSource = param.getConfigDataSource();
+ mAtomsStorage.addSatelliteAccessControllerStats(proto);
+ }
}
diff --git a/src/java/com/android/internal/telephony/metrics/SmsStats.java b/src/java/com/android/internal/telephony/metrics/SmsStats.java
index 6f9a764..b62114c 100644
--- a/src/java/com/android/internal/telephony/metrics/SmsStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SmsStats.java
@@ -61,6 +61,7 @@
import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms;
import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingShortCodeSms;
import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms;
+import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.telephony.Rlog;
import java.util.Objects;
@@ -88,8 +89,9 @@
}
/** Create a new atom when multi-part incoming SMS is dropped due to missing parts. */
- public void onDroppedIncomingMultipartSms(boolean is3gpp2, int receivedCount, int totalCount) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, SOURCE_NOT_INJECTED);
+ public void onDroppedIncomingMultipartSms(boolean is3gpp2, int receivedCount, int totalCount,
+ boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, SOURCE_NOT_INJECTED, isEmergency);
// Keep SMS tech as unknown because it's possible that it changed overtime and is not
// necessarily the current one. Similarly mark the RAT as unknown.
proto.smsTech = INCOMING_SMS__SMS_TECH__SMS_TECH_UNKNOWN;
@@ -103,21 +105,21 @@
/** Create a new atom when an SMS for the voicemail indicator is received. */
public void onIncomingSmsVoicemail(boolean is3gpp2,
@InboundSmsHandler.SmsSource int smsSource) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource);
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource, false);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_VOICEMAIL_INDICATION;
mAtomsStorage.addIncomingSms(proto);
}
/** Create a new atom when an SMS of type zero is received. */
public void onIncomingSmsTypeZero(@InboundSmsHandler.SmsSource int smsSource) {
- IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource);
+ IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource, false);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_ZERO;
mAtomsStorage.addIncomingSms(proto);
}
/** Create a new atom when an SMS-PP for the SIM card is received. */
public void onIncomingSmsPP(@InboundSmsHandler.SmsSource int smsSource, boolean success) {
- IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource);
+ IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource, false);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_SMS_PP;
proto.error = getIncomingSmsError(success);
mAtomsStorage.addIncomingSms(proto);
@@ -126,8 +128,8 @@
/** Create a new atom when an SMS is received successfully. */
public void onIncomingSmsSuccess(boolean is3gpp2,
@InboundSmsHandler.SmsSource int smsSource, int messageCount,
- boolean blocked, long messageId) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource);
+ boolean blocked, long messageId, boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource, isEmergency);
proto.totalParts = messageCount;
proto.receivedParts = messageCount;
proto.blocked = blocked;
@@ -137,16 +139,16 @@
/** Create a new atom when an incoming SMS has an error. */
public void onIncomingSmsError(boolean is3gpp2,
- @InboundSmsHandler.SmsSource int smsSource, int result) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource);
+ @InboundSmsHandler.SmsSource int smsSource, int result, boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource, isEmergency);
proto.error = getIncomingSmsError(result);
mAtomsStorage.addIncomingSms(proto);
}
/** Create a new atom when an incoming WAP_PUSH SMS is received. */
public void onIncomingSmsWapPush(@InboundSmsHandler.SmsSource int smsSource,
- int messageCount, int result, long messageId) {
- IncomingSms proto = getIncomingDefaultProto(false, smsSource);
+ int messageCount, int result, long messageId, boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(false, smsSource, isEmergency);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_WAP_PUSH;
proto.totalParts = messageCount;
proto.receivedParts = messageCount;
@@ -202,6 +204,9 @@
proto.networkErrorCode = networkErrorCode;
mAtomsStorage.addOutgoingSms(proto);
+ CarrierRoamingSatelliteSessionStats sessionStats =
+ CarrierRoamingSatelliteSessionStats.getInstance(mPhone.getSubId());
+ sessionStats.onOutgoingSms(mPhone.getSubId());
}
/** Create a new atom when user attempted to send an outgoing short code sms. */
@@ -215,7 +220,7 @@
/** Creates a proto for a normal single-part {@code IncomingSms} with default values. */
private IncomingSms getIncomingDefaultProto(boolean is3gpp2,
- @InboundSmsHandler.SmsSource int smsSource) {
+ @InboundSmsHandler.SmsSource int smsSource, boolean isEmergency) {
IncomingSms proto = new IncomingSms();
proto.smsFormat = getSmsFormat(is3gpp2);
proto.smsTech = getSmsTech(smsSource, is3gpp2);
@@ -236,6 +241,7 @@
proto.count = 1;
proto.isManagedProfile = mPhone.isManagedProfile();
proto.isNtn = isNonTerrestrialNetwork();
+ proto.isEmergency = isEmergency;
return proto;
}
diff --git a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
index c4ad93a..911424e 100644
--- a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
+++ b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
@@ -41,16 +41,19 @@
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.os.PersistableBundle;
import android.os.SystemClock;
import android.telecom.VideoProfile;
import android.telecom.VideoProfile.VideoState;
import android.telephony.Annotation.NetworkType;
import android.telephony.AnomalyReporter;
+import android.telephony.CarrierConfigManager;
import android.telephony.DisconnectCause;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PreciseDataConnectionState;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.CallComposerStatus;
import android.telephony.data.ApnSetting;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsStreamMediaProfile;
@@ -168,10 +171,8 @@
private final UiccController mUiccController = UiccController.getInstance();
private final DeviceStateHelper mDeviceStateHelper =
PhoneFactory.getMetricsCollector().getDeviceStateHelper();
-
private final VonrHelper mVonrHelper =
PhoneFactory.getMetricsCollector().getVonrHelper();
-
private final SatelliteController mSatelliteController;
public VoiceCallSessionStats(int phoneId, Phone phone, @NonNull FeatureFlags featureFlags) {
@@ -574,6 +575,10 @@
proto.vonrEnabled = mVonrHelper.getVonrEnabled(mPhone.getSubId());
}
+ proto.supportsBusinessCallComposer = isBusinessCallSupported();
+ // 0 is defined as UNKNOWN in Enum
+ proto.callComposerStatus = getCallComposerStatusForPhone() + 1;
+
proto.isNtn = mSatelliteController != null
? mSatelliteController.isInSatelliteModeForCarrierRoaming(mPhone) : false;
@@ -947,6 +952,36 @@
return false;
}
+ private @CallComposerStatus int getCallComposerStatusForPhone() {
+ TelephonyManager telephonyManager = mPhone.getContext()
+ .getSystemService(TelephonyManager.class);
+ if (telephonyManager == null) {
+ return TelephonyManager.CALL_COMPOSER_STATUS_OFF;
+ }
+ telephonyManager = telephonyManager.createForSubscriptionId(mPhone.getSubId());
+ return telephonyManager.getCallComposerStatus();
+ }
+
+ private boolean isBusinessCallSupported() {
+ CarrierConfigManager carrierConfigManager = (CarrierConfigManager)
+ mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ if (carrierConfigManager == null) {
+ return false;
+ }
+ int subId = mPhone.getSubId();
+ PersistableBundle b = null;
+ try {
+ b = carrierConfigManager.getConfigForSubId(subId,
+ CarrierConfigManager.KEY_SUPPORTS_BUSINESS_CALL_COMPOSER_BOOL);
+ } catch (RuntimeException e) {
+ loge("CarrierConfigLoader is not available.");
+ }
+ if (b == null || b.isEmpty()) {
+ return false;
+ }
+ return b.getBoolean(CarrierConfigManager.KEY_SUPPORTS_BUSINESS_CALL_COMPOSER_BOOL);
+ }
+
@VisibleForTesting
protected long getTimeMillis() {
return SystemClock.elapsedRealtime();
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramController.java b/src/java/com/android/internal/telephony/satellite/DatagramController.java
index 8271187..ff2ee9f 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramController.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramController.java
@@ -28,11 +28,14 @@
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import android.os.Looper;
import android.os.SystemProperties;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.satellite.ISatelliteDatagramCallback;
import android.telephony.satellite.SatelliteDatagram;
@@ -41,6 +44,7 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.FeatureFlags;
import java.util.ArrayList;
import java.util.List;
@@ -55,6 +59,7 @@
@NonNull private static DatagramController sInstance;
@NonNull private final Context mContext;
+ @NonNull private final FeatureFlags mFeatureFlags;
@NonNull private final PointingAppController mPointingAppController;
@NonNull private final DatagramDispatcher mDatagramDispatcher;
@NonNull private final DatagramReceiver mDatagramReceiver;
@@ -109,6 +114,8 @@
@GuardedBy("mLock")
@SatelliteManager.SatelliteModemState
private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN;
+ @Nullable
+ private PersistentLogger mPersistentLogger = null;
/**
* @return The singleton instance of DatagramController.
@@ -124,14 +131,17 @@
* Create the DatagramController singleton instance.
* @param context The Context to use to create the DatagramController.
* @param looper The looper for the handler.
+ * @param featureFlags The telephony feature flags.
* @param pointingAppController PointingAppController is used to update
* PointingApp about datagram transfer state changes.
* @return The singleton instance of DatagramController.
*/
public static DatagramController make(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull PointingAppController pointingAppController) {
if (sInstance == null) {
- sInstance = new DatagramController(context, looper, pointingAppController);
+ sInstance = new DatagramController(
+ context, looper, featureFlags, pointingAppController);
}
return sInstance;
}
@@ -141,22 +151,27 @@
*
* @param context The Context for the DatagramController.
* @param looper The looper for the handler
+ * @param featureFlags The telephony feature flags.
* @param pointingAppController PointingAppController is used to update PointingApp
* about datagram transfer state changes.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public DatagramController(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull PointingAppController pointingAppController) {
mContext = context;
+ mFeatureFlags = featureFlags;
mPointingAppController = pointingAppController;
// Create the DatagramDispatcher singleton,
// which is used to send satellite datagrams.
- mDatagramDispatcher = DatagramDispatcher.make(mContext, looper, this);
+ mDatagramDispatcher = DatagramDispatcher.make(
+ mContext, looper, mFeatureFlags, this);
// Create the DatagramReceiver singleton,
// which is used to receive satellite datagrams.
- mDatagramReceiver = DatagramReceiver.make(mContext, looper, this);
+ mDatagramReceiver = DatagramReceiver.make(
+ mContext, looper, mFeatureFlags, this);
mDatagramWaitTimeForConnectedState = getDatagramWaitForConnectedStateTimeoutMillis();
mModemImageSwitchingDuration = getSatelliteModemImageSwitchingDurationMillis();
@@ -165,6 +180,11 @@
mDatagramWaitTimeForConnectedStateForLastMessage =
getDatagramWaitForConnectedStateForLastMessageTimeoutMillis();
mDemoModeDatagramList = new ArrayList<>();
+
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
}
/**
@@ -205,7 +225,7 @@
* @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
*/
public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
- logd("pollPendingSatelliteDatagrams");
+ plogd("pollPendingSatelliteDatagrams");
mDatagramReceiver.pollPendingSatelliteDatagrams(subId, callback);
}
@@ -247,13 +267,13 @@
@SatelliteManager.SatelliteDatagramTransferState int datagramTransferState,
int sendPendingCount, int errorCode) {
synchronized (mLock) {
- logd("updateSendStatus"
+ plogd("updateSendStatus"
+ " subId: " + subId
+ " datagramType: " + datagramType
+ " datagramTransferState: " + datagramTransferState
+ " sendPendingCount: " + sendPendingCount + " errorCode: " + errorCode);
if (shouldSuppressDatagramTransferStateUpdate(datagramType)) {
- logd("Ignore the request to update send status");
+ plogd("Ignore the request to update send status");
return;
}
@@ -295,7 +315,7 @@
@SatelliteManager.SatelliteDatagramTransferState int datagramTransferState,
int receivePendingCount, int errorCode) {
synchronized (mLock) {
- logd("updateReceiveStatus"
+ plogd("updateReceiveStatus"
+ " subId: " + subId
+ " datagramTransferState: " + datagramTransferState
+ " receivePendingCount: " + receivePendingCount + " errorCode: " + errorCode);
@@ -411,7 +431,7 @@
}
setDeviceAlignedWithSatellite(false);
}
- logd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
+ plogd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
}
/** Get the last sent datagram for demo mode */
@@ -422,7 +442,7 @@
}
synchronized (mLock) {
- logd("popDemoModeDatagram");
+ plogd("popDemoModeDatagram");
return mDemoModeDatagramList.size() > 0 ? mDemoModeDatagramList.remove(0) : null;
}
}
@@ -440,7 +460,7 @@
if (mIsDemoMode && SatelliteServiceUtils.isSosMessage(datagramType)) {
synchronized (mLock) {
mDemoModeDatagramList.add(datagram);
- logd("pushDemoModeDatagram size=" + mDemoModeDatagramList.size());
+ plogd("pushDemoModeDatagram size=" + mDemoModeDatagramList.size());
}
}
}
@@ -473,11 +493,11 @@
boolean setDatagramControllerTimeoutDuration(
boolean reset, int timeoutType, long timeoutMillis) {
if (!isMockModemAllowed()) {
- loge("Updating timeout duration is not allowed");
+ ploge("Updating timeout duration is not allowed");
return false;
}
- logd("setDatagramControllerTimeoutDuration: timeoutMillis=" + timeoutMillis
+ plogd("setDatagramControllerTimeoutDuration: timeoutMillis=" + timeoutMillis
+ ", reset=" + reset + ", timeoutType=" + timeoutType);
if (timeoutType == TIMEOUT_TYPE_ALIGN) {
if (reset) {
@@ -499,7 +519,7 @@
} else if (timeoutType == TIMEOUT_TYPE_DATAGRAM_DELAY_IN_DEMO_MODE) {
mDatagramDispatcher.setTimeoutDatagramDelayInDemoMode(reset, timeoutMillis);
} else {
- loge("Invalid timeout type " + timeoutType);
+ ploge("Invalid timeout type " + timeoutType);
return false;
}
return true;
@@ -542,7 +562,7 @@
private void notifyDatagramTransferStateChangedToSessionController() {
SatelliteSessionController sessionController = SatelliteSessionController.getInstance();
if (sessionController == null) {
- loge("notifyDatagramTransferStateChangeToSessionController: SatelliteSessionController"
+ ploge("notifyDatagramTransferStateChangeToSessionController: SatelliteSessionController"
+ " is not initialized yet");
} else {
sessionController.onDatagramTransferStateChanged(
@@ -585,7 +605,7 @@
@Override
public void accept(Integer result) {
if (result != SATELLITE_RESULT_SUCCESS) {
- logd("retryPollPendingDatagramsInDemoMode result: " + result);
+ plogd("retryPollPendingDatagramsInDemoMode result: " + result);
}
}
};
@@ -633,4 +653,31 @@
private static void loge(@NonNull String log) {
Rlog.e(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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 3984a5f..2c9463f 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -32,6 +32,8 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
import android.telephony.satellite.SatelliteDatagram;
@@ -41,6 +43,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.SatelliteStats;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
@@ -72,6 +75,7 @@
@NonNull private final DatagramController mDatagramController;
@NonNull private final ControllerMetricsStats mControllerMetricsStats;
@NonNull private final SessionMetricsStats mSessionMetricsStats;
+ @NonNull private final FeatureFlags mFeatureFlags;
private boolean mIsDemoMode = false;
private boolean mIsAligned = false;
@@ -107,18 +111,31 @@
private long mWaitTimeForDatagramSendingForLastMessageResponse;
@SatelliteManager.DatagramType
private int mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN;
+ @Nullable private PersistentLogger mPersistentLogger = null;
/**
* Create the DatagramDispatcher singleton instance.
* @param context The Context to use to create the DatagramDispatcher.
* @param looper The looper for the handler.
+ * @param featureFlags The telephony feature flags.
* @param datagramController DatagramController which is used to update datagram transfer state.
* @return The singleton instance of DatagramDispatcher.
*/
public static DatagramDispatcher make(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull DatagramController datagramController) {
if (sInstance == null) {
- sInstance = new DatagramDispatcher(context, looper, datagramController);
+ sInstance = new DatagramDispatcher(context, looper, featureFlags, datagramController);
+ }
+ return sInstance;
+ }
+
+ /**
+ * @return The singleton instance of DatagramDispatcher.
+ */
+ public static DatagramDispatcher getInstance() {
+ if (sInstance == null) {
+ loge("DatagramDispatcher was not yet initialized.");
}
return sInstance;
}
@@ -128,16 +145,23 @@
*
* @param context The Context for the DatagramDispatcher.
* @param looper The looper for the handler.
+ * @param featureFlags The telephony feature flags.
* @param datagramController DatagramController which is used to update datagram transfer state.
*/
@VisibleForTesting
protected DatagramDispatcher(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull DatagramController datagramController) {
super(looper);
mContext = context;
+ mFeatureFlags = featureFlags;
mDatagramController = datagramController;
mControllerMetricsStats = ControllerMetricsStats.getInstance();
mSessionMetricsStats = SessionMetricsStats.getInstance();
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
synchronized (mLock) {
mSendingDatagramInProgress = false;
@@ -209,7 +233,7 @@
switch(msg.what) {
case CMD_SEND_SATELLITE_DATAGRAM: {
- logd("CMD_SEND_SATELLITE_DATAGRAM mIsDemoMode=" + mIsDemoMode
+ plogd("CMD_SEND_SATELLITE_DATAGRAM mIsDemoMode=" + mIsDemoMode
+ ", shouldSendDatagramToModemInDemoMode="
+ shouldSendDatagramToModemInDemoMode());
request = (DatagramDispatcherHandlerRequest) msg.obj;
@@ -241,14 +265,15 @@
synchronized (mLock) {
if (mIsDemoMode && (error == SatelliteManager.SATELLITE_RESULT_SUCCESS)) {
if (argument.skipCheckingSatelliteAligned) {
- logd("Satellite was already aligned. No need to check alignment again");
+ plogd("Satellite was already aligned. "
+ + "No need to check alignment again");
} else if (mDatagramController.waitForAligningToSatellite(mIsAligned)) {
- logd("Satellite is not aligned in demo mode, wait for the alignment.");
+ plogd("Satellite is not aligned in demo mode, wait for the alignment.");
startSatelliteAlignedTimer(request);
break;
}
}
- logd("EVENT_SEND_SATELLITE_DATAGRAM_DONE error: " + error
+ plogd("EVENT_SEND_SATELLITE_DATAGRAM_DONE error: " + error
+ ", mIsDemoMode=" + mIsDemoMode);
/*
@@ -259,7 +284,7 @@
* 3) All pending send requests have been aborted due to some error.
*/
if (!shouldProcessEventSendSatelliteDatagramDone(argument)) {
- logw("The message " + argument.datagramId + " was already processed");
+ plogw("The message " + argument.datagramId + " was already processed");
break;
}
@@ -275,39 +300,31 @@
mPendingNonEmergencyDatagramsMap.remove(argument.datagramId);
}
- if (error == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
+ if (error == SATELLITE_RESULT_SUCCESS) {
// Update send status for current datagram
mDatagramController.updateSendStatus(argument.subId, argument.datagramType,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS,
getPendingDatagramCount(), error);
startWaitForSimulatedPollDatagramsDelayTimer(request);
- if (getPendingDatagramCount() > 0) {
- // Send response for current datagram
- argument.callback.accept(error);
- // Send pending datagrams
- sendPendingDatagrams();
- } else {
- mDatagramController.updateSendStatus(argument.subId,
- argument.datagramType,
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0,
- SatelliteManager.SATELLITE_RESULT_SUCCESS);
- // Send response for current datagram
- argument.callback.accept(error);
- }
} else {
// Update send status
mDatagramController.updateSendStatus(argument.subId, argument.datagramType,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED,
getPendingDatagramCount(), error);
- mDatagramController.updateSendStatus(argument.subId, argument.datagramType,
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
- 0, SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ }
+
+ if (getPendingDatagramCount() > 0) {
// Send response for current datagram
- // after updating datagram transfer state internally.
argument.callback.accept(error);
- // Abort sending all the pending datagrams
- abortSendingPendingDatagrams(argument.subId,
- SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
+ // Send pending datagrams
+ sendPendingDatagrams();
+ } else {
+ mDatagramController.updateSendStatus(argument.subId,
+ argument.datagramType,
+ SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0,
+ SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ // Send response for current datagram
+ argument.callback.accept(error);
}
}
break;
@@ -335,7 +352,7 @@
break;
default:
- logw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
+ plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
break;
}
}
@@ -377,7 +394,7 @@
}
if (mDatagramController.needsWaitingForSatelliteConnected(datagramType)) {
- logd("sendDatagram: wait for satellite connected");
+ plogd("sendDatagram: wait for satellite connected");
mDatagramController.updateSendStatus(subId, datagramType,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT,
getPendingDatagramCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
@@ -392,7 +409,7 @@
getPendingDatagramCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
sendRequestAsync(CMD_SEND_SATELLITE_DATAGRAM, datagramArgs, phone);
} else {
- logd("sendDatagram: mSendingDatagramInProgress="
+ plogd("sendDatagram: mSendingDatagramInProgress="
+ mSendingDatagramInProgress + ", isPollingInIdleState="
+ mDatagramController.isPollingInIdleState());
}
@@ -412,7 +429,7 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
protected void setDemoMode(boolean isDemoMode) {
mIsDemoMode = isDemoMode;
- logd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
+ plogd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
}
/**
@@ -422,14 +439,14 @@
public void setDeviceAlignedWithSatellite(boolean isAligned) {
synchronized (mLock) {
mIsAligned = isAligned;
- logd("setDeviceAlignedWithSatellite: " + mIsAligned);
+ plogd("setDeviceAlignedWithSatellite: " + mIsAligned);
if (isAligned && mIsDemoMode) handleEventSatelliteAligned();
}
}
private void startSatelliteAlignedTimer(@NonNull DatagramDispatcherHandlerRequest request) {
if (isSatelliteAlignedTimerStarted()) {
- logd("Satellite aligned timer was already started");
+ plogd("Satellite aligned timer was already started");
return;
}
mSendSatelliteDatagramRequest = request;
@@ -448,7 +465,7 @@
stopSatelliteAlignedTimer();
if (mSendSatelliteDatagramRequest == null) {
- loge("handleEventSatelliteAligned: mSendSatelliteDatagramRequest is null");
+ ploge("handleEventSatelliteAligned: mSendSatelliteDatagramRequest is null");
} else {
SendSatelliteDatagramArgument argument =
(SendSatelliteDatagramArgument) mSendSatelliteDatagramRequest.argument;
@@ -458,14 +475,14 @@
mSendSatelliteDatagramRequest = null;
AsyncResult.forMessage(message, null, null);
message.sendToTarget();
- logd("handleEventSatelliteAligned: EVENT_SEND_SATELLITE_DATAGRAM_DONE");
+ plogd("handleEventSatelliteAligned: EVENT_SEND_SATELLITE_DATAGRAM_DONE");
}
}
}
private void handleEventSatelliteAlignedTimeout(
@NonNull DatagramDispatcherHandlerRequest request) {
- logd("handleEventSatelliteAlignedTimeout");
+ plogd("handleEventSatelliteAlignedTimeout");
mSendSatelliteDatagramRequest = null;
SatelliteManager.SatelliteException exception =
new SatelliteManager.SatelliteException(
@@ -489,15 +506,15 @@
*/
@GuardedBy("mLock")
private void sendPendingDatagrams() {
- logd("sendPendingDatagrams()");
+ plogd("sendPendingDatagrams()");
if (!mDatagramController.isPollingInIdleState()) {
// Datagram should be sent to satellite modem when modem is free.
- logd("sendPendingDatagrams: modem is receiving datagrams");
+ plogd("sendPendingDatagrams: modem is receiving datagrams");
return;
}
if (getPendingDatagramCount() <= 0) {
- logd("sendPendingDatagrams: no pending datagrams to send");
+ plogd("sendPendingDatagrams: no pending datagrams to send");
return;
}
@@ -513,7 +530,7 @@
SendSatelliteDatagramArgument datagramArg =
pendingDatagram.iterator().next().getValue();
if (mDatagramController.needsWaitingForSatelliteConnected(datagramArg.datagramType)) {
- logd("sendPendingDatagrams: wait for satellite connected");
+ plogd("sendPendingDatagrams: wait for satellite connected");
return;
}
@@ -540,7 +557,7 @@
if (pendingDatagramsMap.size() == 0) {
return;
}
- loge("sendErrorCodeAndCleanupPendingDatagrams: cleaning up resources");
+ ploge("sendErrorCodeAndCleanupPendingDatagrams: cleaning up resources");
// Send error code to all the pending datagrams
for (Entry<Long, SendSatelliteDatagramArgument> entry :
@@ -563,7 +580,7 @@
@GuardedBy("mLock")
private void abortSendingPendingDatagrams(int subId,
@SatelliteManager.SatelliteResult int errorCode) {
- logd("abortSendingPendingDatagrams()");
+ plogd("abortSendingPendingDatagrams()");
sendErrorCodeAndCleanupPendingDatagrams(mPendingEmergencyDatagramsMap, errorCode);
sendErrorCodeAndCleanupPendingDatagrams(mPendingNonEmergencyDatagramsMap, errorCode);
}
@@ -578,6 +595,22 @@
}
}
+ /** Return pending user messages count */
+ public int getPendingUserMessagesCount() {
+ synchronized (mLock) {
+ int pendingUserMessagesCount = 0;
+ for (Entry<Long, SendSatelliteDatagramArgument> entry :
+ mPendingNonEmergencyDatagramsMap.entrySet()) {
+ SendSatelliteDatagramArgument argument = entry.getValue();
+ if (argument.datagramType != SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ pendingUserMessagesCount += 1;
+ }
+ }
+ pendingUserMessagesCount += mPendingEmergencyDatagramsMap.size();
+ return pendingUserMessagesCount;
+ }
+ }
+
/**
* Posts the specified command to be executed on the main thread and returns immediately.
*
@@ -608,11 +641,12 @@
if (resultCode == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
mControllerMetricsStats.reportOutgoingDatagramSuccessCount(argument.datagramType,
mIsDemoMode);
- mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram();
+ mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram(argument.datagramType);
} else {
mControllerMetricsStats.reportOutgoingDatagramFailCount(argument.datagramType,
mIsDemoMode);
- mSessionMetricsStats.addCountOfFailedOutgoingDatagram();
+ mSessionMetricsStats.addCountOfFailedOutgoingDatagram(argument.datagramType,
+ resultCode);
}
}
@@ -634,7 +668,7 @@
synchronized (mLock) {
if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
|| state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
- logd("onSatelliteModemStateChanged: cleaning up resources");
+ plogd("onSatelliteModemStateChanged: cleaning up resources");
cleanUpResources();
} else if (state == SatelliteManager.SATELLITE_MODEM_STATE_IDLE) {
sendPendingDatagrams();
@@ -650,7 +684,7 @@
@GuardedBy("mLock")
private void cleanUpResources() {
- logd("cleanUpResources");
+ plogd("cleanUpResources");
mSendingDatagramInProgress = false;
if (getPendingDatagramCount() > 0) {
mDatagramController.updateSendStatus(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
@@ -678,7 +712,7 @@
private void startDatagramWaitForConnectedStateTimer(
@NonNull SendSatelliteDatagramArgument datagramArgs) {
if (isDatagramWaitForConnectedStateTimerStarted()) {
- logd("DatagramWaitForConnectedStateTimer is already started");
+ plogd("DatagramWaitForConnectedStateTimer is already started");
return;
}
sendMessageDelayed(obtainMessage(
@@ -710,7 +744,7 @@
private void startWaitForDatagramSendingResponseTimer(
@NonNull SendSatelliteDatagramArgument argument) {
if (hasMessages(EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT)) {
- logd("WaitForDatagramSendingResponseTimer was already started");
+ plogd("WaitForDatagramSendingResponseTimer was already started");
return;
}
long waitTime = SatelliteServiceUtils.isLastSosMessage(argument.datagramType)
@@ -728,7 +762,7 @@
private void handleEventDatagramWaitForConnectedStateTimedOut(
@NonNull SendSatelliteDatagramArgument argument) {
- logw("Timed out to wait for satellite connected before sending datagrams");
+ plogw("Timed out to wait for satellite connected before sending datagrams");
synchronized (mLock) {
// Update send status
mDatagramController.updateSendStatus(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
@@ -757,7 +791,7 @@
return mShouldSendDatagramToModemInDemoMode.get();
} catch (Resources.NotFoundException ex) {
- loge("shouldSendDatagramToModemInDemoMode: id= "
+ ploge("shouldSendDatagramToModemInDemoMode: id= "
+ R.bool.config_send_satellite_datagram_to_modem_in_demo_mode + ", ex=" + ex);
return false;
}
@@ -787,7 +821,7 @@
private void handleEventWaitForDatagramSendingResponseTimedOut(
@NonNull SendSatelliteDatagramArgument argument) {
synchronized (mLock) {
- logw("Timed out to wait for the response of the request to send the datagram "
+ plogw("Timed out to wait for the response of the request to send the datagram "
+ argument.datagramId);
// Ask vendor service to abort all datagram-sending requests
@@ -817,8 +851,7 @@
}
// Abort sending all the pending datagrams
- abortSendingPendingDatagrams(argument.subId,
- SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
+ abortSendingPendingDatagrams(argument.subId, SATELLITE_RESULT_MODEM_TIMEOUT);
}
}
@@ -833,7 +866,7 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
protected void setShouldSendDatagramToModemInDemoMode(
@Nullable Boolean shouldSendToModemInDemoMode) {
- logd("setShouldSendDatagramToModemInDemoMode(" + (shouldSendToModemInDemoMode == null
+ plogd("setShouldSendDatagramToModemInDemoMode(" + (shouldSendToModemInDemoMode == null
? "null" : shouldSendToModemInDemoMode) + ")");
if (shouldSendToModemInDemoMode == null) {
@@ -851,12 +884,12 @@
private void startWaitForSimulatedPollDatagramsDelayTimer(
@NonNull DatagramDispatcherHandlerRequest request) {
if (mIsDemoMode) {
- logd("startWaitForSimulatedPollDatagramsDelayTimer");
+ plogd("startWaitForSimulatedPollDatagramsDelayTimer");
sendMessageDelayed(
obtainMessage(EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT, request),
getDemoTimeoutDuration());
} else {
- logd("Should not start WaitForSimulatedPollDatagramsDelayTimer in non-demo mode");
+ plogd("Should not start WaitForSimulatedPollDatagramsDelayTimer in non-demo mode");
}
}
@@ -867,17 +900,17 @@
private void handleEventWaitForSimulatedPollDatagramsDelayTimedOut(
@NonNull SendSatelliteDatagramArgument argument) {
if (mIsDemoMode) {
- logd("handleEventWaitForSimulatedPollDatagramsDelayTimedOut");
+ plogd("handleEventWaitForSimulatedPollDatagramsDelayTimedOut");
mDatagramController.pushDemoModeDatagram(argument.datagramType, argument.datagram);
Consumer<Integer> internalCallback = new Consumer<Integer>() {
@Override
public void accept(Integer result) {
- logd("pollPendingSatelliteDatagrams result: " + result);
+ plogd("pollPendingSatelliteDatagrams result: " + result);
}
};
mDatagramController.pollPendingSatelliteDatagrams(argument.subId, internalCallback);
} else {
- logd("Unexpected EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT in "
+ plogd("Unexpected EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT in "
+ "non-demo mode");
}
}
@@ -898,7 +931,7 @@
} else {
mDemoTimeoutDuration = timeoutMillis;
}
- logd("setTimeoutDatagramDelayInDemoMode " + mDemoTimeoutDuration + " reset=" + reset);
+ plogd("setTimeoutDatagramDelayInDemoMode " + mDemoTimeoutDuration + " reset=" + reset);
}
private static void logd(@NonNull String log) {
@@ -910,4 +943,38 @@
}
private static void logw(@NonNull String log) { Rlog.w(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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void plogw(@NonNull String log) {
+ Rlog.w(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.warn(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
index 21e4318..ea75f03 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
@@ -37,6 +37,8 @@
import android.os.Message;
import android.os.RemoteException;
import android.provider.Telephony;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
import android.telephony.satellite.ISatelliteDatagramCallback;
@@ -50,6 +52,7 @@
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.SatelliteStats;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
@@ -83,6 +86,7 @@
@NonNull private final ControllerMetricsStats mControllerMetricsStats;
@NonNull private final SessionMetricsStats mSessionMetricsStats;
@NonNull private final Looper mLooper;
+ @NonNull private final FeatureFlags mFeatureFlags;
private long mDatagramTransferStartTime = 0;
private boolean mIsDemoMode = false;
@@ -93,6 +97,8 @@
@Nullable
private DatagramReceiverHandlerRequest mPendingPollSatelliteDatagramsRequest = null;
private final Object mLock = new Object();
+ @Nullable
+ private PersistentLogger mPersistentLogger = null;
/**
* Map key: subId, value: SatelliteDatagramListenerHandler to notify registrants.
@@ -112,13 +118,15 @@
* Create the DatagramReceiver singleton instance.
* @param context The Context to use to create the DatagramReceiver.
* @param looper The looper for the handler.
+ * @param featureFlags The telephony feature flags.
* @param datagramController DatagramController which is used to update datagram transfer state.
* @return The singleton instance of DatagramReceiver.
*/
public static DatagramReceiver make(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull DatagramController datagramController) {
if (sInstance == null) {
- sInstance = new DatagramReceiver(context, looper, datagramController);
+ sInstance = new DatagramReceiver(context, looper, featureFlags, datagramController);
}
return sInstance;
}
@@ -129,25 +137,31 @@
*
* @param context The Context for the DatagramReceiver.
* @param looper The looper for the handler.
+ * @param featureFlags The telephony feature flags.
* @param datagramController DatagramController which is used to update datagram transfer state.
*/
@VisibleForTesting
protected DatagramReceiver(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull DatagramController datagramController) {
super(looper);
mContext = context;
mLooper = looper;
+ mFeatureFlags = featureFlags;
mContentResolver = context.getContentResolver();
mDatagramController = datagramController;
mControllerMetricsStats = ControllerMetricsStats.getInstance();
mSessionMetricsStats = SessionMetricsStats.getInstance();
-
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
try {
mSharedPreferences =
mContext.getSharedPreferences(SatelliteController.SATELLITE_SHARED_PREF,
Context.MODE_PRIVATE);
} catch (Exception e) {
- loge("Cannot get default shared preferences: " + e);
+ ploge("Cannot get default shared preferences: " + e);
}
}
@@ -457,7 +471,7 @@
}
}
- logd("EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE error: " + error);
+ plogd("EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE error: " + error);
if (error != SatelliteManager.SATELLITE_RESULT_SUCCESS) {
mDatagramController.updateReceiveStatus(request.subId,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED,
@@ -485,7 +499,7 @@
break;
default:
- logw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
+ plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
break;
}
}
@@ -558,7 +572,7 @@
public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
if (!mDatagramController.isPollingInIdleState()) {
// Poll request should be sent to satellite modem only when it is free.
- logd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams.");
+ plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams.");
callback.accept(SatelliteManager.SATELLITE_RESULT_MODEM_BUSY);
return;
}
@@ -570,7 +584,7 @@
if (isDatagramWaitForConnectedStateTimerStarted()) {
stopDatagramWaitForConnectedStateTimer();
if (mPendingPollSatelliteDatagramsRequest == null) {
- loge("handleSatelliteConnectedEvent: mPendingPollSatelliteDatagramsRequest is"
+ ploge("handleSatelliteConnectedEvent: mPendingPollSatelliteDatagramsRequest is"
+ " null");
return;
}
@@ -588,7 +602,7 @@
@NonNull Consumer<Integer> callback) {
if (!mDatagramController.isSendingInIdleState()) {
// Poll request should be sent to satellite modem only when it is free.
- logd("pollPendingSatelliteDatagramsInternal: satellite modem is busy sending "
+ plogd("pollPendingSatelliteDatagramsInternal: satellite modem is busy sending "
+ "datagrams.");
callback.accept(SatelliteManager.SATELLITE_RESULT_MODEM_BUSY);
return;
@@ -596,7 +610,7 @@
if (mDatagramController.needsWaitingForSatelliteConnected(
SatelliteManager.DATAGRAM_TYPE_UNKNOWN)) {
- logd("pollPendingSatelliteDatagramsInternal: wait for satellite connected");
+ plogd("pollPendingSatelliteDatagramsInternal: wait for satellite connected");
synchronized (mLock) {
mPendingPollSatelliteDatagramsRequest = new DatagramReceiverHandlerRequest(
callback, SatelliteServiceUtils.getPhone(), subId);
@@ -644,7 +658,7 @@
synchronized (mLock) {
if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
|| state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
- logd("onSatelliteModemStateChanged: cleaning up resources");
+ plogd("onSatelliteModemStateChanged: cleaning up resources");
cleanUpResources();
} else if (state == SATELLITE_MODEM_STATE_CONNECTED) {
handleSatelliteConnectedEvent();
@@ -657,7 +671,7 @@
if (isSatelliteAlignedTimerStarted()) {
stopSatelliteAlignedTimer();
if (mDemoPollPendingSatelliteDatagramsRequest == null) {
- loge("Satellite aligned timer was started "
+ ploge("Satellite aligned timer was started "
+ "but mDemoPollPendingSatelliteDatagramsRequest is null");
} else {
Consumer<Integer> callback =
@@ -755,14 +769,14 @@
public void setDeviceAlignedWithSatellite(boolean isAligned) {
synchronized (mLock) {
mIsAligned = isAligned;
- logd("setDeviceAlignedWithSatellite: " + mIsAligned);
+ plogd("setDeviceAlignedWithSatellite: " + mIsAligned);
if (isAligned && mIsDemoMode) handleEventSatelliteAligned();
}
}
private void startSatelliteAlignedTimer(DatagramReceiverHandlerRequest request) {
if (isSatelliteAlignedTimerStarted()) {
- logd("Satellite aligned timer was already started");
+ plogd("Satellite aligned timer was already started");
return;
}
mDemoPollPendingSatelliteDatagramsRequest = request;
@@ -781,7 +795,7 @@
stopSatelliteAlignedTimer();
if (mDemoPollPendingSatelliteDatagramsRequest == null) {
- loge("handleSatelliteAlignedTimer: mDemoPollPendingSatelliteDatagramsRequest "
+ ploge("handleSatelliteAlignedTimer: mDemoPollPendingSatelliteDatagramsRequest "
+ "is null");
} else {
Message message = obtainMessage(
@@ -813,7 +827,7 @@
private void startDatagramWaitForConnectedStateTimer() {
if (isDatagramWaitForConnectedStateTimerStarted()) {
- logd("DatagramWaitForConnectedStateTimer is already started");
+ plogd("DatagramWaitForConnectedStateTimer is already started");
return;
}
sendMessageDelayed(obtainMessage(
@@ -833,12 +847,12 @@
private void handleEventDatagramWaitForConnectedStateTimedOut() {
synchronized (mLock) {
if (mPendingPollSatelliteDatagramsRequest == null) {
- logw("handleEventDatagramWaitForConnectedStateTimedOut: "
+ plogw("handleEventDatagramWaitForConnectedStateTimedOut: "
+ "mPendingPollSatelliteDatagramsRequest is null");
return;
}
- logw("Timed out to wait for satellite connected before polling datagrams");
+ plogw("Timed out to wait for satellite connected before polling datagrams");
mDatagramController.updateReceiveStatus(mPendingPollSatelliteDatagramsRequest.subId,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED,
mDatagramController.getReceivePendingCount(),
@@ -877,4 +891,38 @@
private static void logw(@NonNull String log) {
Rlog.w(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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void plogw(@NonNull String log) {
+ Rlog.w(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.warn(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/NtnCapabilityResolver.java b/src/java/com/android/internal/telephony/satellite/NtnCapabilityResolver.java
index 65a25ea..dfc7919 100644
--- a/src/java/com/android/internal/telephony/satellite/NtnCapabilityResolver.java
+++ b/src/java/com/android/internal/telephony/satellite/NtnCapabilityResolver.java
@@ -47,7 +47,8 @@
SatelliteController satelliteController = SatelliteController.getInstance();
List<String> satellitePlmnList = satelliteController.getSatellitePlmnsForCarrier(subId);
for (String satellitePlmn : satellitePlmnList) {
- if (TextUtils.equals(satellitePlmn, registeredPlmn)) {
+ if (TextUtils.equals(satellitePlmn, registeredPlmn)
+ && networkRegistrationInfo.isInService()) {
logd("Registered to satellite PLMN " + satellitePlmn);
networkRegistrationInfo.setIsNonTerrestrialNetwork(true);
networkRegistrationInfo.setAvailableServices(
diff --git a/src/java/com/android/internal/telephony/satellite/PointingAppController.java b/src/java/com/android/internal/telephony/satellite/PointingAppController.java
index d6b40ca..06281c7 100644
--- a/src/java/com/android/internal/telephony/satellite/PointingAppController.java
+++ b/src/java/com/android/internal/telephony/satellite/PointingAppController.java
@@ -34,6 +34,8 @@
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
import android.telephony.satellite.PointingInfo;
@@ -42,6 +44,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.FeatureFlags;
import java.util.ArrayList;
import java.util.Arrays;
@@ -60,6 +63,7 @@
@NonNull
private static PointingAppController sInstance;
@NonNull private final Context mContext;
+ @NonNull private final FeatureFlags mFeatureFlags;
private boolean mStartedSatelliteTransmissionUpdates;
private boolean mLastNeedFullScreenPointingUI;
private boolean mLastIsDemoMode;
@@ -74,6 +78,7 @@
*/
private final ConcurrentHashMap<Integer, SatelliteTransmissionUpdateHandler>
mSatelliteTransmissionUpdateHandlers = new ConcurrentHashMap<>();
+ @Nullable private PersistentLogger mPersistentLogger = null;
/**
* @return The singleton instance of PointingAppController.
@@ -88,11 +93,13 @@
/**
* Create the PointingAppController singleton instance.
* @param context The Context to use to create the PointingAppController.
+ * @param featureFlags The telephony feature flags.
* @return The singleton instance of PointingAppController.
*/
- public static PointingAppController make(@NonNull Context context) {
+ public static PointingAppController make(@NonNull Context context,
+ @NonNull FeatureFlags featureFlags) {
if (sInstance == null) {
- sInstance = new PointingAppController(context);
+ sInstance = new PointingAppController(context, featureFlags);
}
return sInstance;
}
@@ -103,14 +110,20 @@
* @param context The Context for the PointingUIController.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- public PointingAppController(@NonNull Context context) {
+ public PointingAppController(@NonNull Context context,
+ @NonNull FeatureFlags featureFlags) {
mContext = context;
+ mFeatureFlags = featureFlags;
mStartedSatelliteTransmissionUpdates = false;
mLastNeedFullScreenPointingUI = false;
mLastIsDemoMode = false;
mLastIsEmergency = false;
mListenerForPointingUIRegistered = false;
mActivityManager = mContext.getSystemService(ActivityManager.class);
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
}
/**
@@ -147,7 +160,7 @@
if (callerPackages != null) {
if (Arrays.stream(callerPackages).anyMatch(pointingUiPackage::contains)) {
- logd("Restarting pointingUI");
+ plogd("Restarting pointingUI");
startPointingUI(mLastNeedFullScreenPointingUI, mLastIsDemoMode,
mLastIsEmergency);
}
@@ -331,7 +344,7 @@
*/
public void startSatelliteTransmissionUpdates(@NonNull Message message) {
if (mStartedSatelliteTransmissionUpdates) {
- logd("startSatelliteTransmissionUpdates: already started");
+ plogd("startSatelliteTransmissionUpdates: already started");
AsyncResult.forMessage(message, null, new SatelliteManager.SatelliteException(
SatelliteManager.SATELLITE_RESULT_SUCCESS));
message.sendToTarget();
@@ -359,7 +372,7 @@
boolean isEmergency) {
String packageName = getPointingUiPackageName();
if (TextUtils.isEmpty(packageName)) {
- logd("startPointingUI: config_pointing_ui_package is not set. Ignore the request");
+ plogd("startPointingUI: config_pointing_ui_package is not set. Ignore the request");
return;
}
@@ -373,10 +386,10 @@
launchIntent = mContext.getPackageManager().getLaunchIntentForPackage(packageName);
}
if (launchIntent == null) {
- loge("startPointingUI: launchIntent is null");
+ ploge("startPointingUI: launchIntent is null");
return;
}
- logd("startPointingUI: needFullScreenPointingUI: " + needFullScreenPointingUI
+ plogd("startPointingUI: needFullScreenPointingUI: " + needFullScreenPointingUI
+ ", isDemoMode: " + isDemoMode + ", isEmergency: " + isEmergency);
launchIntent.putExtra("needFullScreen", needFullScreenPointingUI);
launchIntent.putExtra("isDemoMode", isDemoMode);
@@ -393,7 +406,7 @@
mLastIsEmergency = isEmergency;
mContext.startActivity(launchIntent);
} catch (ActivityNotFoundException ex) {
- loge("startPointingUI: Pointing UI app activity is not found, ex=" + ex);
+ ploge("startPointingUI: Pointing UI app activity is not found, ex=" + ex);
}
}
@@ -422,7 +435,7 @@
request);
msg.sendToTarget();
} else {
- loge("SatelliteTransmissionUpdateHandler not found for subId: " + subId);
+ ploge("SatelliteTransmissionUpdateHandler not found for subId: " + subId);
}
}
@@ -441,7 +454,7 @@
request);
msg.sendToTarget();
} else {
- loge(" SatelliteTransmissionUpdateHandler not found for subId: " + subId);
+ ploge(" SatelliteTransmissionUpdateHandler not found for subId: " + subId);
}
}
@@ -456,12 +469,12 @@
boolean setSatellitePointingUiClassName(
@Nullable String packageName, @Nullable String className) {
if (!isMockModemAllowed()) {
- loge("setSatellitePointingUiClassName: modifying satellite pointing UI package and "
+ ploge("setSatellitePointingUiClassName: modifying satellite pointing UI package and "
+ "class name is not allowed");
return false;
}
- logd("setSatellitePointingUiClassName: config_pointing_ui_package is updated, new "
+ plogd("setSatellitePointingUiClassName: config_pointing_ui_package is updated, new "
+ "packageName=" + packageName
+ ", config_pointing_ui_class new className=" + className);
@@ -507,6 +520,33 @@
private static void loge(@NonNull String log) {
Rlog.e(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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
/**
* TODO: The following needs to be added in this class:
* - check if pointingUI crashes - then restart it
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteConstants.java b/src/java/com/android/internal/telephony/satellite/SatelliteConstants.java
index f88069f..384dfa5 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteConstants.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteConstants.java
@@ -83,4 +83,25 @@
})
@Retention(RetentionPolicy.SOURCE)
public @interface ConfigUpdateResult {}
+
+ // Access control type is unknown
+ public static final int ACCESS_CONTROL_TYPE_UNKNOWN = 0;
+ // Network country code is used for satellite access decision
+ public static final int ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE = 1;
+ // Device's current location is used for satellite access decision
+ public static final int ACCESS_CONTROL_TYPE_CURRENT_LOCATION = 2;
+ // Device's last known location is used for satellite access decision
+ public static final int ACCESS_CONTROL_TYPE_LAST_KNOWN_LOCATION = 3;
+ // Cached country codes are used for satellite access decision
+ public static final int ACCESS_CONTROL_TYPE_CACHED_COUNTRY_CODE = 4;
+
+ @IntDef(prefix = {"ACCESS_CONTROL_TYPE_"}, value = {
+ ACCESS_CONTROL_TYPE_UNKNOWN,
+ ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE,
+ ACCESS_CONTROL_TYPE_CURRENT_LOCATION,
+ ACCESS_CONTROL_TYPE_LAST_KNOWN_LOCATION,
+ ACCESS_CONTROL_TYPE_CACHED_COUNTRY_CODE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AccessControlType {}
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 9cc342a..f826f0b 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -82,8 +82,11 @@
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Telephony;
+import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
+import android.telephony.DropBoxManagerLoggerBackend;
import android.telephony.NetworkRegistrationInfo;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
@@ -315,6 +318,8 @@
private final Object mIsSatelliteEnabledLock = new Object();
@GuardedBy("mIsSatelliteEnabledLock")
private Boolean mIsSatelliteEnabled = null;
+ private final Object mIsRadioOnLock = new Object();
+ @GuardedBy("mIsRadioOnLock")
private boolean mIsRadioOn = false;
private final Object mSatelliteViaOemProvisionLock = new Object();
@GuardedBy("mSatelliteViaOemProvisionLock")
@@ -397,6 +402,8 @@
private int mDelayInSendingEventDisplayEmergencyMessage = 0;
@NonNull private SharedPreferences mSharedPreferences = null;
+ @Nullable private PersistentLogger mPersistentLogger = null;
+
/**
* Key : Subscription ID, Value: {@code true} if the EntitlementStatus is enabled,
* {@code false} otherwise.
@@ -418,6 +425,11 @@
private long mWaitTimeForSatelliteEnablingResponse;
private long mDemoPointingAlignedDurationMillis;
private long mDemoPointingNotAlignedDurationMillis;
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private long mLastEmergencyCallTime;
+ private long mSatelliteEmergencyModeDurationMillis;
+ private static final int DEFAULT_SATELLITE_EMERGENCY_MODE_DURATION_SECONDS = 300;
/** Key used to read/write satellite system notification done in shared preferences. */
private static final String SATELLITE_SYSTEM_NOTIFICATION_DONE_KEY =
@@ -436,6 +448,9 @@
private long mSessionStartTimeStamp;
private long mSessionProcessingTimeStamp;
+ // Variable for backup and restore device's screen rotation settings.
+ private String mDeviceRotationLockToBackupAndRestore = null;
+
/**
* @return The singleton instance of SatelliteController.
*/
@@ -472,6 +487,11 @@
@NonNull Context context, @NonNull Looper looper, @NonNull FeatureFlags featureFlags) {
super(looper);
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
+
mContext = context;
mFeatureFlags = featureFlags;
Phone phone = SatelliteServiceUtils.getPhone();
@@ -479,11 +499,12 @@
mDSM = phone.getDeviceStateMonitor();
// Create the SatelliteModemInterface singleton, which is used to manage connections
// to the satellite service and HAL interface.
- mSatelliteModemInterface = SatelliteModemInterface.make(mContext, this);
+ mSatelliteModemInterface = SatelliteModemInterface.make(
+ mContext, this, mFeatureFlags);
// Create the PointingUIController singleton,
// which is used to manage interactions with PointingUI app.
- mPointingAppController = PointingAppController.make(mContext);
+ mPointingAppController = PointingAppController.make(mContext, mFeatureFlags);
// Create the SatelliteControllerMetrics to report controller metrics
// should be called before making DatagramController
@@ -496,10 +517,14 @@
// Create the DatagramController singleton,
// which is used to send and receive satellite datagrams.
- mDatagramController = DatagramController.make(mContext, looper, mPointingAppController);
+ mDatagramController = DatagramController.make(
+ mContext, looper, mFeatureFlags, mPointingAppController);
mCi.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null);
- mIsRadioOn = phone.isRadioOn();
+ synchronized (mIsRadioOnLock) {
+ mIsRadioOn = phone.isRadioOn();
+ }
+
registerForSatelliteProvisionStateChanged();
registerForPendingDatagramCount();
registerForSatelliteModemStateChanged();
@@ -550,6 +575,8 @@
mDemoPointingAlignedDurationMillis = getDemoPointingAlignedDurationMillisFromResources();
mDemoPointingNotAlignedDurationMillis =
getDemoPointingNotAlignedDurationMillisFromResources();
+ mSatelliteEmergencyModeDurationMillis =
+ getSatelliteEmergencyModeDurationFromOverlayConfig(context);
}
/**
@@ -613,10 +640,10 @@
String satelliteModeRadios = Settings.Global.getString(mContentResolver,
Settings.Global.SATELLITE_MODE_RADIOS);
if (satelliteModeRadios == null) {
- loge("initializeSatelliteModeRadios: satelliteModeRadios is null");
+ ploge("initializeSatelliteModeRadios: satelliteModeRadios is null");
return;
}
- logd("Radios To be checked when satellite is on: " + satelliteModeRadios);
+ plogd("Radios To be checked when satellite is on: " + satelliteModeRadios);
if (satelliteModeRadios.contains(Settings.Global.RADIO_BLUETOOTH)) {
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
@@ -653,7 +680,7 @@
// Unregister receiver before registering it.
mContext.unregisterReceiver(mBTWifiNFCSateReceiver);
} catch (IllegalArgumentException e) {
- logd("initializeSatelliteModeRadios: unregisterReceiver, e=" + e);
+ plogd("initializeSatelliteModeRadios: unregisterReceiver, e=" + e);
}
mContext.registerReceiver(mBTWifiNFCSateReceiver, radioStateIntentFilter);
@@ -674,12 +701,12 @@
}
}
- logd("mDisableBTOnSatelliteEnabled: " + mDisableBTOnSatelliteEnabled
+ plogd("mDisableBTOnSatelliteEnabled: " + mDisableBTOnSatelliteEnabled
+ " mDisableNFCOnSatelliteEnabled: " + mDisableNFCOnSatelliteEnabled
+ " mDisableWifiOnSatelliteEnabled: " + mDisableWifiOnSatelliteEnabled
+ " mDisableUWBOnSatelliteEnabled: " + mDisableUWBOnSatelliteEnabled);
- logd("mBTStateEnabled: " + mBTStateEnabled
+ plogd("mBTStateEnabled: " + mBTStateEnabled
+ " mNfcStateEnabled: " + mNfcStateEnabled
+ " mWifiStateEnabled: " + mWifiStateEnabled
+ " mUwbStateEnabled: " + mUwbStateEnabled);
@@ -707,8 +734,8 @@
@Override
public void onStateChanged(int state, int reason) {
- logd("UwbAdapterStateCallback#onStateChanged() called, state = " + toString(state));
- logd("Adapter state changed reason " + String.valueOf(reason));
+ plogd("UwbAdapterStateCallback#onStateChanged() called, state = " + toString(state));
+ plogd("Adapter state changed reason " + String.valueOf(reason));
synchronized (mRadioStateLock) {
if (state == UwbManager.AdapterStateCallback.STATE_DISABLED) {
mUwbStateEnabled = false;
@@ -716,7 +743,7 @@
} else {
mUwbStateEnabled = true;
}
- logd("mUwbStateEnabled: " + mUwbStateEnabled);
+ plogd("mUwbStateEnabled: " + mUwbStateEnabled);
}
}
}
@@ -726,7 +753,7 @@
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action == null) {
- logd("BTWifiNFCStateReceiver NULL action for intent " + intent);
+ plogd("BTWifiNFCStateReceiver NULL action for intent " + intent);
return;
}
@@ -743,7 +770,7 @@
mBTStateEnabled = true;
}
if (currentBTStateEnabled != mBTStateEnabled) {
- logd("mBTStateEnabled=" + mBTStateEnabled);
+ plogd("mBTStateEnabled=" + mBTStateEnabled);
}
}
break;
@@ -759,7 +786,7 @@
evaluateToSendSatelliteEnabledSuccess();
}
if (currentNfcStateEnabled != mNfcStateEnabled) {
- logd("mNfcStateEnabled=" + mNfcStateEnabled);
+ plogd("mNfcStateEnabled=" + mNfcStateEnabled);
}
}
break;
@@ -776,7 +803,7 @@
evaluateToSendSatelliteEnabledSuccess();
}
if (currentWifiStateEnabled != mWifiStateEnabled) {
- logd("mWifiStateEnabled=" + mWifiStateEnabled);
+ plogd("mWifiStateEnabled=" + mWifiStateEnabled);
}
}
break;
@@ -965,14 +992,14 @@
RequestSatelliteEnabledArgument argument =
(RequestSatelliteEnabledArgument) request.argument;
int error = SatelliteServiceUtils.getSatelliteError(ar, "setSatelliteEnabled");
- logd("EVENT_SET_SATELLITE_ENABLED_DONE = " + error);
+ plogd("EVENT_SET_SATELLITE_ENABLED_DONE = " + error);
/*
* The timer to wait for EVENT_SET_SATELLITE_ENABLED_DONE might have expired and
* thus the request resources might have been cleaned up.
*/
if (!shouldProcessEventSetSatelliteEnabledDone(argument)) {
- logw("The request ID=" + argument.requestId + ", enableSatellite="
+ plogw("The request ID=" + argument.requestId + ", enableSatellite="
+ argument.enableSatellite + " was already processed");
return;
}
@@ -984,6 +1011,7 @@
mWaitingForRadioDisabled = true;
}
setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_TRUE);
+ setSettingsKeyToAllowDeviceRotation(SATELLITE_MODE_ENABLED_TRUE);
evaluateToSendSatelliteEnabledSuccess();
} else {
/**
@@ -1010,7 +1038,7 @@
SATELLITE_RESULT_SUCCESS,
argument.callback);
} else {
- logd("Wait for satellite modem off before updating satellite"
+ plogd("Wait for satellite modem off before updating satellite"
+ " modem state");
}
mWaitingForDisableSatelliteModemResponse = false;
@@ -1064,6 +1092,8 @@
mControllerMetricsStats.onSatelliteDisabled();
+ handlePersistentLoggingOnSessionEnd(mIsEmergency);
+
synchronized (mIsSatelliteEnabledLock) {
mWaitingForDisableSatelliteModemResponse = false;
}
@@ -1091,11 +1121,11 @@
Bundle bundle = new Bundle();
if (error == SATELLITE_RESULT_SUCCESS) {
if (ar.result == null) {
- loge("isSatelliteEnabled: result is null");
+ ploge("isSatelliteEnabled: result is null");
error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
} else {
boolean enabled = ((int[]) ar.result)[0] == 1;
- if (DBG) logd("isSatelliteEnabled: " + enabled);
+ if (DBG) plogd("isSatelliteEnabled: " + enabled);
bundle.putBoolean(SatelliteManager.KEY_SATELLITE_ENABLED, enabled);
updateSatelliteEnabledState(enabled, "EVENT_IS_SATELLITE_ENABLED_DONE");
}
@@ -1120,11 +1150,11 @@
Bundle bundle = new Bundle();
if (error == SATELLITE_RESULT_SUCCESS) {
if (ar.result == null) {
- loge("isSatelliteSupported: result is null");
+ ploge("isSatelliteSupported: result is null");
error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
} else {
boolean supported = (boolean) ar.result;
- logd("isSatelliteSupported: " + supported);
+ plogd("isSatelliteSupported: " + supported);
bundle.putBoolean(SatelliteManager.KEY_SATELLITE_SUPPORTED, supported);
updateSatelliteSupportedStateWhenSatelliteServiceConnected(supported);
}
@@ -1148,14 +1178,14 @@
Bundle bundle = new Bundle();
if (error == SATELLITE_RESULT_SUCCESS) {
if (ar.result == null) {
- loge("getSatelliteCapabilities: result is null");
+ ploge("getSatelliteCapabilities: result is null");
error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
} else {
SatelliteCapabilities capabilities = (SatelliteCapabilities) ar.result;
synchronized (mNeedsSatellitePointingLock) {
mNeedsSatellitePointing = capabilities.isPointingRequired();
}
- if (DBG) logd("getSatelliteCapabilities: " + capabilities);
+ if (DBG) plogd("getSatelliteCapabilities: " + capabilities);
bundle.putParcelable(SatelliteManager.KEY_SATELLITE_CAPABILITIES,
capabilities);
synchronized (mSatelliteCapabilitiesLock) {
@@ -1183,13 +1213,13 @@
Bundle bundle = new Bundle();
if (error == SATELLITE_RESULT_SUCCESS) {
if (ar.result == null) {
- loge("requestTimeForNextSatelliteVisibility: result is null");
+ ploge("requestTimeForNextSatelliteVisibility: result is null");
error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
} else {
int nextVisibilityDuration = ((int[]) ar.result)[0];
if (DBG) {
- logd("requestTimeForNextSatelliteVisibility: " +
- nextVisibilityDuration);
+ plogd("requestTimeForNextSatelliteVisibility: "
+ + nextVisibilityDuration);
}
bundle.putInt(SatelliteManager.KEY_SATELLITE_NEXT_VISIBILITY,
nextVisibilityDuration);
@@ -1200,11 +1230,13 @@
}
case EVENT_RADIO_STATE_CHANGED: {
- if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_ON) {
- mIsRadioOn = true;
- } else if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_OFF) {
- mIsRadioOn = false;
- resetCarrierRoamingSatelliteModeParams();
+ synchronized (mIsRadioOnLock) {
+ logd("EVENT_RADIO_STATE_CHANGED: radioState=" + mCi.getRadioState());
+ if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_ON) {
+ mIsRadioOn = true;
+ } else if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_OFF) {
+ resetCarrierRoamingSatelliteModeParams();
+ }
}
if (mCi.getRadioState() != TelephonyManager.RADIO_POWER_UNAVAILABLE) {
@@ -1215,7 +1247,7 @@
@Override
protected void onReceiveResult(
int resultCode, Bundle resultData) {
- logd("onRadioStateChanged.requestIsSatelliteSupported: "
+ plogd("onRadioStateChanged.requestIsSatelliteSupported: "
+ "resultCode=" + resultCode
+ ", resultData=" + resultData);
}
@@ -1243,18 +1275,18 @@
case EVENT_SATELLITE_PROVISION_STATE_CHANGED:
ar = (AsyncResult) msg.obj;
if (ar.result == null) {
- loge("EVENT_SATELLITE_PROVISION_STATE_CHANGED: result is null");
+ ploge("EVENT_SATELLITE_PROVISION_STATE_CHANGED: result is null");
} else {
handleEventSatelliteProvisionStateChanged((boolean) ar.result);
}
break;
case EVENT_PENDING_DATAGRAMS:
- logd("Received EVENT_PENDING_DATAGRAMS");
+ plogd("Received EVENT_PENDING_DATAGRAMS");
IIntegerConsumer internalCallback = new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
- logd("pollPendingSatelliteDatagram result: " + result);
+ plogd("pollPendingSatelliteDatagram result: " + result);
}
};
pollPendingDatagrams(
@@ -1264,7 +1296,7 @@
case EVENT_SATELLITE_MODEM_STATE_CHANGED:
ar = (AsyncResult) msg.obj;
if (ar.result == null) {
- loge("EVENT_SATELLITE_MODEM_STATE_CHANGED: result is null");
+ ploge("EVENT_SATELLITE_MODEM_STATE_CHANGED: result is null");
} else {
handleEventSatelliteModemStateChanged((int) ar.result);
}
@@ -1275,7 +1307,7 @@
break;
case CMD_EVALUATE_SATELLITE_ATTACH_RESTRICTION_CHANGE: {
- logd("CMD_EVALUATE_SATELLITE_ATTACH_RESTRICTION_CHANGE");
+ plogd("CMD_EVALUATE_SATELLITE_ATTACH_RESTRICTION_CHANGE");
request = (SatelliteControllerHandlerRequest) msg.obj;
handleRequestSatelliteAttachRestrictionForCarrierCmd(request);
break;
@@ -1306,7 +1338,7 @@
}
case CMD_REQUEST_NTN_SIGNAL_STRENGTH: {
- logd("CMD_REQUEST_NTN_SIGNAL_STRENGTH");
+ plogd("CMD_REQUEST_NTN_SIGNAL_STRENGTH");
request = (SatelliteControllerHandlerRequest) msg.obj;
onCompleted = obtainMessage(EVENT_REQUEST_NTN_SIGNAL_STRENGTH_DONE, request);
mSatelliteModemInterface.requestNtnSignalStrength(onCompleted);
@@ -1335,7 +1367,7 @@
NTN_SIGNAL_STRENGTH_NONE);
}
}
- loge("EVENT_REQUEST_NTN_SIGNAL_STRENGTH_DONE: ntnSignalStrength is null");
+ ploge("EVENT_REQUEST_NTN_SIGNAL_STRENGTH_DONE: ntnSignalStrength is null");
result.send(SatelliteManager.SATELLITE_RESULT_REQUEST_FAILED, null);
}
} else {
@@ -1352,7 +1384,7 @@
case EVENT_NTN_SIGNAL_STRENGTH_CHANGED: {
ar = (AsyncResult) msg.obj;
if (ar.result == null) {
- loge("EVENT_NTN_SIGNAL_STRENGTH_CHANGED: result is null");
+ ploge("EVENT_NTN_SIGNAL_STRENGTH_CHANGED: result is null");
} else {
handleEventNtnSignalStrengthChanged((NtnSignalStrength) ar.result);
}
@@ -1363,7 +1395,7 @@
ar = (AsyncResult) msg.obj;
boolean shouldReport = (boolean) ar.result;
if (DBG) {
- logd("CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING: shouldReport=" + shouldReport);
+ plogd("CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING: shouldReport=" + shouldReport);
}
handleCmdUpdateNtnSignalStrengthReporting(shouldReport);
break;
@@ -1400,7 +1432,7 @@
case EVENT_SATELLITE_CAPABILITIES_CHANGED: {
ar = (AsyncResult) msg.obj;
if (ar.result == null) {
- loge("EVENT_SATELLITE_CAPABILITIES_CHANGED: result is null");
+ ploge("EVENT_SATELLITE_CAPABILITIES_CHANGED: result is null");
} else {
handleEventSatelliteCapabilitiesChanged((SatelliteCapabilities) ar.result);
}
@@ -1410,7 +1442,7 @@
case EVENT_SATELLITE_SUPPORTED_STATE_CHANGED: {
ar = (AsyncResult) msg.obj;
if (ar.result == null) {
- loge("EVENT_SATELLITE_SUPPORTED_STATE_CHANGED: result is null");
+ ploge("EVENT_SATELLITE_SUPPORTED_STATE_CHANGED: result is null");
} else {
handleEventSatelliteSupportedStateChanged((boolean) ar.result);
}
@@ -1445,7 +1477,7 @@
processNewCarrierConfigData(subId);
}
} else {
- loge("updateSupportedSatelliteServicesForActiveSubscriptions: "
+ ploge("updateSupportedSatelliteServicesForActiveSubscriptions: "
+ "activeSubIds is null");
}
}
@@ -1470,7 +1502,7 @@
*/
public void requestSatelliteEnabled(int subId, boolean enableSatellite, boolean enableDemoMode,
boolean isEmergency, @NonNull IIntegerConsumer callback) {
- logd("requestSatelliteEnabled subId: " + subId + " enableSatellite: " + enableSatellite
+ plogd("requestSatelliteEnabled subId: " + subId + " enableSatellite: " + enableSatellite
+ " enableDemoMode: " + enableDemoMode + " isEmergency: " + isEmergency);
Consumer<Integer> result = FunctionalUtils.ignoreRemoteException(callback::accept);
int error = evaluateOemSatelliteRequestAllowed(true);
@@ -1480,11 +1512,13 @@
}
if (enableSatellite) {
- if (!mIsRadioOn) {
- loge("Radio is not on, can not enable satellite");
- sendErrorAndReportSessionMetrics(
- SatelliteManager.SATELLITE_RESULT_INVALID_MODEM_STATE, result);
- return;
+ synchronized (mIsRadioOnLock) {
+ if (!mIsRadioOn) {
+ ploge("Radio is not on, can not enable satellite");
+ sendErrorAndReportSessionMetrics(
+ SatelliteManager.SATELLITE_RESULT_INVALID_MODEM_STATE, result);
+ return;
+ }
}
} else {
/* if disable satellite, always assume demo is also disabled */
@@ -1495,13 +1529,13 @@
if (mIsSatelliteEnabled != null) {
if (mIsSatelliteEnabled == enableSatellite) {
if (enableDemoMode != mIsDemoModeEnabled) {
- loge("Received invalid demo mode while satellite session is enabled"
+ ploge("Received invalid demo mode while satellite session is enabled"
+ " enableDemoMode = " + enableDemoMode);
sendErrorAndReportSessionMetrics(
SatelliteManager.SATELLITE_RESULT_INVALID_ARGUMENTS, result);
return;
} else {
- logd("Enable request matches with current state"
+ plogd("Enable request matches with current state"
+ " enableSatellite = " + enableSatellite);
sendErrorAndReportSessionMetrics(
SatelliteManager.SATELLITE_RESULT_SUCCESS, result);
@@ -1528,14 +1562,14 @@
if (mSatelliteEnabledRequest == null) {
mSatelliteEnabledRequest = request;
} else if (mSatelliteEnabledRequest.enableSatellite == request.enableSatellite) {
- logd("requestSatelliteEnabled enableSatellite: " + enableSatellite
+ plogd("requestSatelliteEnabled enableSatellite: " + enableSatellite
+ " is already in progress.");
sendErrorAndReportSessionMetrics(
SatelliteManager.SATELLITE_RESULT_REQUEST_IN_PROGRESS, result);
return;
} else if (mSatelliteEnabledRequest.enableSatellite == false
&& request.enableSatellite == true) {
- logd("requestSatelliteEnabled enableSatellite: " + enableSatellite + " cannot be "
+ plogd("requestSatelliteEnabled enableSatellite: " + enableSatellite + " cannot be "
+ "processed. Disable satellite is already in progress.");
sendErrorAndReportSessionMetrics(
SatelliteManager.SATELLITE_RESULT_ERROR, result);
@@ -1581,7 +1615,7 @@
*/
public boolean isSatelliteEnabled() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("isSatelliteEnabled: oemEnabledSatelliteFlag is disabled");
+ plogd("isSatelliteEnabled: oemEnabledSatelliteFlag is disabled");
return false;
}
if (mIsSatelliteEnabled == null) return false;
@@ -1595,7 +1629,7 @@
*/
public boolean isSatelliteBeingEnabled() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("isSatelliteBeingEnabled: oemEnabledSatelliteFlag is disabled");
+ plogd("isSatelliteBeingEnabled: oemEnabledSatelliteFlag is disabled");
return false;
}
@@ -1632,7 +1666,7 @@
*/
public boolean isDemoModeEnabled() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("isDemoModeEnabled: oemEnabledSatelliteFlag is disabled");
+ plogd("isDemoModeEnabled: oemEnabledSatelliteFlag is disabled");
return false;
}
return mIsDemoModeEnabled;
@@ -1647,7 +1681,7 @@
*/
public void requestIsSatelliteSupported(int subId, @NonNull ResultReceiver result) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("requestIsSatelliteSupported: oemEnabledSatelliteFlag is disabled");
+ plogd("requestIsSatelliteSupported: oemEnabledSatelliteFlag is disabled");
result.send(SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED, null);
return;
}
@@ -1860,7 +1894,7 @@
public void unregisterForSatelliteProvisionStateChanged(
int subId, @NonNull ISatelliteProvisionStateCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("unregisterForSatelliteProvisionStateChanged: "
+ plogd("unregisterForSatelliteProvisionStateChanged: "
+ "oemEnabledSatelliteFlag is disabled");
return;
}
@@ -1906,13 +1940,13 @@
@SatelliteManager.SatelliteResult public int registerForSatelliteModemStateChanged(int subId,
@NonNull ISatelliteModemStateCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("registerForSatelliteModemStateChanged: oemEnabledSatelliteFlag is disabled");
+ plogd("registerForSatelliteModemStateChanged: oemEnabledSatelliteFlag is disabled");
return SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
}
if (mSatelliteSessionController != null) {
mSatelliteSessionController.registerForSatelliteModemStateChanged(callback);
} else {
- loge("registerForSatelliteModemStateChanged: mSatelliteSessionController"
+ ploge("registerForSatelliteModemStateChanged: mSatelliteSessionController"
+ " is not initialized yet");
return SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
}
@@ -1930,13 +1964,13 @@
public void unregisterForModemStateChanged(int subId,
@NonNull ISatelliteModemStateCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("unregisterForModemStateChanged: oemEnabledSatelliteFlag is disabled");
+ plogd("unregisterForModemStateChanged: oemEnabledSatelliteFlag is disabled");
return;
}
if (mSatelliteSessionController != null) {
mSatelliteSessionController.unregisterForSatelliteModemStateChanged(callback);
} else {
- loge("unregisterForModemStateChanged: mSatelliteSessionController"
+ ploge("unregisterForModemStateChanged: mSatelliteSessionController"
+ " is not initialized yet");
}
}
@@ -1952,13 +1986,13 @@
@SatelliteManager.SatelliteResult public int registerForIncomingDatagram(int subId,
@NonNull ISatelliteDatagramCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("registerForIncomingDatagram: oemEnabledSatelliteFlag is disabled");
+ plogd("registerForIncomingDatagram: oemEnabledSatelliteFlag is disabled");
return SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
}
if (!mSatelliteModemInterface.isSatelliteServiceSupported()) {
return SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
}
- logd("registerForIncomingDatagram: callback=" + callback);
+ plogd("registerForIncomingDatagram: callback=" + callback);
return mDatagramController.registerForSatelliteDatagram(subId, callback);
}
@@ -1973,13 +2007,13 @@
public void unregisterForIncomingDatagram(int subId,
@NonNull ISatelliteDatagramCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("unregisterForIncomingDatagram: oemEnabledSatelliteFlag is disabled");
+ plogd("unregisterForIncomingDatagram: oemEnabledSatelliteFlag is disabled");
return;
}
if (!mSatelliteModemInterface.isSatelliteServiceSupported()) {
return;
}
- logd("unregisterForIncomingDatagram: callback=" + callback);
+ plogd("unregisterForIncomingDatagram: callback=" + callback);
mDatagramController.unregisterForSatelliteDatagram(subId, callback);
}
@@ -2025,7 +2059,7 @@
public void sendDatagram(int subId, @SatelliteManager.DatagramType int datagramType,
SatelliteDatagram datagram, boolean needFullScreenPointingUI,
@NonNull IIntegerConsumer callback) {
- logd("sendSatelliteDatagram: subId: " + subId + " datagramType: " + datagramType
+ plogd("sendSatelliteDatagram: subId: " + subId + " datagramType: " + datagramType
+ " needFullScreenPointingUI: " + needFullScreenPointingUI);
Consumer<Integer> result = FunctionalUtils.ignoreRemoteException(callback::accept);
@@ -2074,7 +2108,7 @@
*/
public void setDeviceAlignedWithSatellite(@NonNull int subId, @NonNull boolean isAligned) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setDeviceAlignedWithSatellite: oemEnabledSatelliteFlag is disabled");
+ plogd("setDeviceAlignedWithSatellite: oemEnabledSatelliteFlag is disabled");
return;
}
@@ -2191,7 +2225,7 @@
* strength of the satellite connection.
*/
public void requestNtnSignalStrength(int subId, @NonNull ResultReceiver result) {
- if (DBG) logd("requestNtnSignalStrength()");
+ if (DBG) plogd("requestNtnSignalStrength()");
int error = evaluateOemSatelliteRequestAllowed(true);
if (error != SATELLITE_RESULT_SUCCESS) {
@@ -2230,7 +2264,7 @@
*/
public void registerForNtnSignalStrengthChanged(int subId,
@NonNull INtnSignalStrengthCallback callback) throws RemoteException {
- if (DBG) logd("registerForNtnSignalStrengthChanged()");
+ if (DBG) plogd("registerForNtnSignalStrengthChanged()");
int error = evaluateOemSatelliteRequestAllowed(true);
if (error == SATELLITE_RESULT_SUCCESS) {
@@ -2251,7 +2285,7 @@
*/
public void unregisterForNtnSignalStrengthChanged(
int subId, @NonNull INtnSignalStrengthCallback callback) {
- if (DBG) logd("unregisterForNtnSignalStrengthChanged()");
+ if (DBG) plogd("unregisterForNtnSignalStrengthChanged()");
int error = evaluateOemSatelliteRequestAllowed(true);
if (error == SATELLITE_RESULT_SUCCESS) {
@@ -2269,7 +2303,7 @@
*/
@SatelliteManager.SatelliteResult public int registerForCapabilitiesChanged(
int subId, @NonNull ISatelliteCapabilitiesCallback callback) {
- if (DBG) logd("registerForCapabilitiesChanged()");
+ if (DBG) plogd("registerForCapabilitiesChanged()");
int error = evaluateOemSatelliteRequestAllowed(true);
if (error != SATELLITE_RESULT_SUCCESS) return error;
@@ -2289,7 +2323,7 @@
*/
public void unregisterForCapabilitiesChanged(
int subId, @NonNull ISatelliteCapabilitiesCallback callback) {
- if (DBG) logd("unregisterForCapabilitiesChanged()");
+ if (DBG) plogd("unregisterForCapabilitiesChanged()");
int error = evaluateOemSatelliteRequestAllowed(true);
if (error == SATELLITE_RESULT_SUCCESS) {
@@ -2308,7 +2342,7 @@
@SatelliteManager.SatelliteResult public int registerForSatelliteSupportedStateChanged(
int subId, @NonNull ISatelliteSupportedStateCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("registerForSatelliteSupportedStateChanged: oemEnabledSatelliteFlag is disabled");
+ plogd("registerForSatelliteSupportedStateChanged: oemEnabledSatelliteFlag is disabled");
return SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
}
@@ -2327,7 +2361,7 @@
public void unregisterForSatelliteSupportedStateChanged(
int subId, @NonNull ISatelliteSupportedStateCallback callback) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("unregisterForSatelliteSupportedStateChanged: "
+ plogd("unregisterForSatelliteSupportedStateChanged: "
+ "oemEnabledSatelliteFlag is disabled");
return;
}
@@ -2343,16 +2377,16 @@
*/
public boolean setSatelliteServicePackageName(@Nullable String servicePackageName) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setSatelliteServicePackageName: oemEnabledSatelliteFlag is disabled");
+ plogd("setSatelliteServicePackageName: oemEnabledSatelliteFlag is disabled");
return false;
}
if (!isMockModemAllowed()) {
- logd("setSatelliteServicePackageName: mock modem not allowed");
+ plogd("setSatelliteServicePackageName: mock modem not allowed");
return false;
}
// Cached states need to be cleared whenever switching satellite vendor services.
- logd("setSatelliteServicePackageName: Resetting cached states");
+ plogd("setSatelliteServicePackageName: Resetting cached states");
synchronized (mIsSatelliteSupportedLock) {
mIsSatelliteSupported = null;
}
@@ -2379,11 +2413,11 @@
*/
public boolean setSatelliteListeningTimeoutDuration(long timeoutMillis) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setSatelliteListeningTimeoutDuration: oemEnabledSatelliteFlag is disabled");
+ plogd("setSatelliteListeningTimeoutDuration: oemEnabledSatelliteFlag is disabled");
return false;
}
if (mSatelliteSessionController == null) {
- loge("mSatelliteSessionController is not initialized yet");
+ ploge("mSatelliteSessionController is not initialized yet");
return false;
}
return mSatelliteSessionController.setSatelliteListeningTimeoutDuration(timeoutMillis);
@@ -2399,10 +2433,10 @@
public boolean setDatagramControllerTimeoutDuration(
boolean reset, int timeoutType, long timeoutMillis) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setDatagramControllerTimeoutDuration: oemEnabledSatelliteFlag is disabled");
+ plogd("setDatagramControllerTimeoutDuration: oemEnabledSatelliteFlag is disabled");
return false;
}
- logd("setDatagramControllerTimeoutDuration: reset=" + reset + ", timeoutType="
+ plogd("setDatagramControllerTimeoutDuration: reset=" + reset + ", timeoutType="
+ timeoutType + ", timeoutMillis=" + timeoutMillis);
return mDatagramController.setDatagramControllerTimeoutDuration(
reset, timeoutType, timeoutMillis);
@@ -2437,14 +2471,14 @@
public boolean setSatelliteControllerTimeoutDuration(
boolean reset, int timeoutType, long timeoutMillis) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setSatelliteControllerTimeoutDuration: oemEnabledSatelliteFlag is disabled");
+ plogd("setSatelliteControllerTimeoutDuration: oemEnabledSatelliteFlag is disabled");
return false;
}
if (!isMockModemAllowed()) {
- logd("setSatelliteControllerTimeoutDuration: mock modem is not allowed");
+ plogd("setSatelliteControllerTimeoutDuration: mock modem is not allowed");
return false;
}
- logd("setSatelliteControllerTimeoutDuration: reset=" + reset + ", timeoutType="
+ plogd("setSatelliteControllerTimeoutDuration: reset=" + reset + ", timeoutType="
+ timeoutType + ", timeoutMillis=" + timeoutMillis);
if (timeoutType == TIMEOUT_TYPE_WAIT_FOR_SATELLITE_ENABLING_RESPONSE) {
if (reset) {
@@ -2453,7 +2487,7 @@
} else {
mWaitTimeForSatelliteEnablingResponse = timeoutMillis;
}
- logd("mWaitTimeForSatelliteEnablingResponse=" + mWaitTimeForSatelliteEnablingResponse);
+ plogd("mWaitTimeForSatelliteEnablingResponse=" + mWaitTimeForSatelliteEnablingResponse);
} else if (timeoutType == TIMEOUT_TYPE_DEMO_POINTING_ALIGNED_DURATION_MILLIS) {
if (reset) {
mDemoPointingAlignedDurationMillis =
@@ -2469,7 +2503,7 @@
mDemoPointingNotAlignedDurationMillis = timeoutMillis;
}
} else {
- logw("Invalid timeoutType=" + timeoutType);
+ plogw("Invalid timeoutType=" + timeoutType);
return false;
}
return true;
@@ -2484,11 +2518,11 @@
*/
public boolean setSatelliteGatewayServicePackageName(@Nullable String servicePackageName) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setSatelliteGatewayServicePackageName: oemEnabledSatelliteFlag is disabled");
+ plogd("setSatelliteGatewayServicePackageName: oemEnabledSatelliteFlag is disabled");
return false;
}
if (mSatelliteSessionController == null) {
- loge("mSatelliteSessionController is not initialized yet");
+ ploge("mSatelliteSessionController is not initialized yet");
return false;
}
return mSatelliteSessionController.setSatelliteGatewayServicePackageName(
@@ -2506,7 +2540,7 @@
public boolean setSatellitePointingUiClassName(
@Nullable String packageName, @Nullable String className) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setSatellitePointingUiClassName: oemEnabledSatelliteFlag is disabled");
+ plogd("setSatellitePointingUiClassName: oemEnabledSatelliteFlag is disabled");
return false;
}
return mPointingAppController.setSatellitePointingUiClassName(packageName, className);
@@ -2527,7 +2561,7 @@
*/
public boolean setEmergencyCallToSatelliteHandoverType(int handoverType, int delaySeconds) {
if (!isMockModemAllowed()) {
- loge("setEmergencyCallToSatelliteHandoverType: mock modem not allowed");
+ ploge("setEmergencyCallToSatelliteHandoverType: mock modem not allowed");
return false;
}
if (isHandoverTypeValid(handoverType)) {
@@ -2551,7 +2585,7 @@
*/
public boolean setOemEnabledSatelliteProvisionStatus(boolean reset, boolean isProvisioned) {
if (!isMockModemAllowed()) {
- loge("setOemEnabledSatelliteProvisionStatus: mock modem not allowed");
+ ploge("setOemEnabledSatelliteProvisionStatus: mock modem not allowed");
return false;
}
synchronized (mSatelliteViaOemProvisionLock) {
@@ -2596,7 +2630,7 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public void onSatelliteServiceConnected() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("onSatelliteServiceConnected: oemEnabledSatelliteFlag is disabled");
+ plogd("onSatelliteServiceConnected: oemEnabledSatelliteFlag is disabled");
return;
}
if (mSatelliteModemInterface.isSatelliteServiceSupported()) {
@@ -2606,7 +2640,7 @@
@Override
protected void onReceiveResult(
int resultCode, Bundle resultData) {
- logd("onSatelliteServiceConnected.requestIsSatelliteSupported:"
+ plogd("onSatelliteServiceConnected.requestIsSatelliteSupported:"
+ " resultCode=" + resultCode);
}
};
@@ -2615,7 +2649,7 @@
}
}
} else {
- logd("onSatelliteServiceConnected: Satellite vendor service is not supported."
+ plogd("onSatelliteServiceConnected: Satellite vendor service is not supported."
+ " Ignored the event");
}
}
@@ -2626,18 +2660,21 @@
* modem. {@link SatelliteController} will then power off the satellite modem.
*/
public void onCellularRadioPowerOffRequested() {
+ logd("onCellularRadioPowerOffRequested()");
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("onCellularRadioPowerOffRequested: oemEnabledSatelliteFlag is disabled");
+ plogd("onCellularRadioPowerOffRequested: oemEnabledSatelliteFlag is disabled");
return;
}
- mIsRadioOn = false;
+ synchronized (mIsRadioOnLock) {
+ mIsRadioOn = false;
+ }
requestSatelliteEnabled(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
false /* enableSatellite */, false /* enableDemoMode */, false /* isEmergency */,
new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
- logd("onRadioPowerOffRequested: requestSatelliteEnabled result=" + result);
+ plogd("onRadioPowerOffRequested: requestSatelliteEnabled result=" + result);
}
});
}
@@ -2648,7 +2685,7 @@
*/
public boolean isSatelliteSupportedViaOem() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("isSatelliteSupported: oemEnabledSatelliteFlag is disabled");
+ plogd("isSatelliteSupported: oemEnabledSatelliteFlag is disabled");
return false;
}
Boolean supported = isSatelliteSupportedViaOemInternal();
@@ -2729,13 +2766,13 @@
*/
public boolean isSatelliteAttachRequired() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("isSatelliteAttachRequired: oemEnabledSatelliteFlag is disabled");
+ plogd("isSatelliteAttachRequired: oemEnabledSatelliteFlag is disabled");
return false;
}
synchronized (mSatelliteCapabilitiesLock) {
if (mSatelliteCapabilities == null) {
- loge("isSatelliteAttachRequired: mSatelliteCapabilities is null");
+ ploge("isSatelliteAttachRequired: mSatelliteCapabilities is null");
return false;
}
if (mSatelliteCapabilities.getSupportedRadioTechnologies().contains(
@@ -2864,7 +2901,7 @@
return true;
}
- if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
+ if (getWwanIsInService(serviceState)) {
// Device is connected to terrestrial network which has coverage
resetCarrierRoamingSatelliteModeParams(subId);
return false;
@@ -2912,6 +2949,20 @@
}
/**
+ * Request to get the {@link SatelliteSessionStats} of the satellite service.
+ *
+ * @param subId The subId of the subscription to the satellite session stats for.
+ * @param result The result receiver that returns the {@link SatelliteSessionStats}
+ * if the request is successful or an error code if the request failed.
+ */
+ public void requestSatelliteSessionStats(int subId, @NonNull ResultReceiver result) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ return;
+ }
+ mSessionMetricsStats.requestSatelliteSessionStats(subId, result);
+ }
+
+ /**
* Get the carrier-enabled emergency call wait for connection timeout millis
*/
public long getCarrierEmergencyCallWaitForConnectionTimeoutMillis() {
@@ -2949,6 +3000,29 @@
}
/**
+ * Register the handler for SIM Refresh notifications.
+ * @param handler Handler for notification message.
+ * @param what User-defined message code.
+ */
+ public void registerIccRefresh(Handler handler, int what) {
+ for (Phone phone : PhoneFactory.getPhones()) {
+ CommandsInterface ci = phone.mCi;
+ ci.registerForIccRefresh(handler, what, null);
+ }
+ }
+
+ /**
+ * Unregister the handler for SIM Refresh notifications.
+ * @param handler Handler for notification message.
+ */
+ public void unRegisterIccRefresh(Handler handler) {
+ for (Phone phone : PhoneFactory.getPhones()) {
+ CommandsInterface ci = phone.mCi;
+ ci.unregisterForIccRefresh(handler);
+ }
+ }
+
+ /**
* To use the satellite service, update the EntitlementStatus and the PlmnAllowedList after
* receiving the satellite configuration from the entitlement server. If satellite
* entitlement is enabled, enable satellite for the carrier. Otherwise, disable satellite.
@@ -3027,7 +3101,7 @@
private boolean isValidPlmnList(@NonNull List<String> plmnList) {
for (String plmn : plmnList) {
if (!TelephonyUtils.isValidPlmn(plmn)) {
- loge("Invalid PLMN = " + plmn);
+ ploge("Invalid PLMN = " + plmn);
return false;
}
}
@@ -3053,7 +3127,7 @@
new ResultReceiver(this) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
- logd("isSatelliteSupportedViaOemInternal.requestIsSatelliteSupported:"
+ plogd("isSatelliteSupportedViaOemInternal.requestIsSatelliteSupported:"
+ " resultCode=" + resultCode);
}
});
@@ -3063,12 +3137,12 @@
private void handleEventProvisionSatelliteServiceDone(
@NonNull ProvisionSatelliteServiceArgument arg,
@SatelliteManager.SatelliteResult int result) {
- logd("handleEventProvisionSatelliteServiceDone: result="
+ plogd("handleEventProvisionSatelliteServiceDone: result="
+ result + ", subId=" + arg.subId);
Consumer<Integer> callback = mSatelliteProvisionCallbacks.remove(arg.subId);
if (callback == null) {
- loge("handleEventProvisionSatelliteServiceDone: callback is null for subId="
+ ploge("handleEventProvisionSatelliteServiceDone: callback is null for subId="
+ arg.subId);
mProvisionMetricsStats
.setResultCode(SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE)
@@ -3099,10 +3173,10 @@
@NonNull ProvisionSatelliteServiceArgument arg,
@SatelliteManager.SatelliteResult int result) {
if (arg == null) {
- loge("handleEventDeprovisionSatelliteServiceDone: arg is null");
+ ploge("handleEventDeprovisionSatelliteServiceDone: arg is null");
return;
}
- logd("handleEventDeprovisionSatelliteServiceDone: result="
+ plogd("handleEventDeprovisionSatelliteServiceDone: result="
+ result + ", subId=" + arg.subId);
if (result == SATELLITE_RESULT_SUCCESS
@@ -3210,7 +3284,7 @@
new ResultReceiver(this) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
- logd("isSatelliteViaOemProvisioned: resultCode=" + resultCode);
+ plogd("isSatelliteViaOemProvisioned: resultCode=" + resultCode);
}
});
return null;
@@ -3219,10 +3293,11 @@
private void handleSatelliteEnabled(SatelliteControllerHandlerRequest request) {
RequestSatelliteEnabledArgument argument =
(RequestSatelliteEnabledArgument) request.argument;
+ handlePersistentLoggingOnSessionStart(argument);
if (mSatelliteSessionController != null) {
mSatelliteSessionController.onSatelliteEnablementStarted(argument.enableSatellite);
} else {
- loge("handleSatelliteEnabled: mSatelliteSessionController is not initialized yet");
+ ploge("handleSatelliteEnabled: mSatelliteSessionController is not initialized yet");
}
if (!argument.enableSatellite && mSatelliteModemInterface.isSatelliteServiceSupported()) {
@@ -3263,8 +3338,8 @@
mIsSatelliteSupported = supported;
}
mSatelliteSessionController = SatelliteSessionController.make(
- mContext, getLooper(), supported);
- logd("create a new SatelliteSessionController due to isSatelliteSupported state has "
+ mContext, getLooper(), mFeatureFlags, supported);
+ plogd("create a new SatelliteSessionController due to isSatelliteSupported state has "
+ "changed to " + supported);
if (supported) {
@@ -3278,14 +3353,14 @@
new ResultReceiver(this) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
- logd("requestIsSatelliteProvisioned: resultCode=" + resultCode
+ plogd("requestIsSatelliteProvisioned: resultCode=" + resultCode
+ ", resultData=" + resultData);
requestSatelliteEnabled(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
false, false, false,
new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
- logd("requestSatelliteEnabled: result=" + result);
+ plogd("requestSatelliteEnabled: result=" + result);
}
});
}
@@ -3294,7 +3369,7 @@
new ResultReceiver(this) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
- logd("requestSatelliteCapabilities: resultCode=" + resultCode
+ plogd("requestSatelliteCapabilities: resultCode=" + resultCode
+ ", resultData=" + resultData);
}
});
@@ -3310,7 +3385,7 @@
mSatelliteSessionController.onSatelliteEnabledStateChanged(enabled);
mSatelliteSessionController.setDemoMode(mIsDemoModeEnabled);
} else {
- loge(caller + ": mSatelliteSessionController is not initialized yet");
+ ploge(caller + ": mSatelliteSessionController is not initialized yet");
}
if (!enabled) {
mIsModemEnabledReportingNtnSignalStrength.set(false);
@@ -3349,7 +3424,7 @@
private void registerForNtnSignalStrengthChanged() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("registerForNtnSignalStrengthChanged: oemEnabledSatelliteFlag is disabled");
+ plogd("registerForNtnSignalStrengthChanged: oemEnabledSatelliteFlag is disabled");
return;
}
@@ -3364,7 +3439,7 @@
private void registerForCapabilitiesChanged() {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("registerForCapabilitiesChanged: oemEnabledSatelliteFlag is disabled");
+ plogd("registerForCapabilitiesChanged: oemEnabledSatelliteFlag is disabled");
return;
}
@@ -3388,7 +3463,7 @@
}
private void handleEventSatelliteProvisionStateChanged(boolean provisioned) {
- logd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned);
+ plogd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned);
synchronized (mSatelliteViaOemProvisionLock) {
persistOemEnabledSatelliteProvisionStatus(provisioned);
@@ -3400,7 +3475,7 @@
try {
listener.onSatelliteProvisionStateChanged(provisioned);
} catch (RemoteException e) {
- logd("handleSatelliteProvisionStateChangedEvent RemoteException: " + e);
+ plogd("handleSatelliteProvisionStateChangedEvent RemoteException: " + e);
deadCallersList.add(listener);
}
});
@@ -3411,7 +3486,7 @@
private void handleEventSatelliteModemStateChanged(
@SatelliteManager.SatelliteModemState int state) {
- logd("handleEventSatelliteModemStateChanged: state=" + state);
+ plogd("handleEventSatelliteModemStateChanged: state=" + state);
if (state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE
|| state == SatelliteManager.SATELLITE_MODEM_STATE_OFF) {
synchronized (mIsSatelliteEnabledLock) {
@@ -3429,8 +3504,8 @@
}
moveSatelliteToOffStateAndCleanUpResources(error, callback);
} else {
- logd("Either waiting for the response of disabling satellite modem or the event"
- + " should be ignored because isSatelliteEnabled="
+ plogd("Either waiting for the response of disabling satellite modem or the"
+ + " event should be ignored because isSatelliteEnabled="
+ isSatelliteEnabled()
+ ", mIsSatelliteEnabled=" + mIsSatelliteEnabled);
}
@@ -3440,7 +3515,7 @@
if (mSatelliteSessionController != null) {
mSatelliteSessionController.onSatelliteModemStateChanged(state);
} else {
- loge("handleEventSatelliteModemStateChanged: mSatelliteSessionController is null");
+ ploge("handleEventSatelliteModemStateChanged: mSatelliteSessionController is null");
}
}
}
@@ -3462,7 +3537,7 @@
try {
listener.onNtnSignalStrengthChanged(ntnSignalStrength);
} catch (RemoteException e) {
- logd("handleEventNtnSignalStrengthChanged RemoteException: " + e);
+ plogd("handleEventNtnSignalStrengthChanged RemoteException: " + e);
deadCallersList.add(listener);
}
});
@@ -3472,9 +3547,9 @@
}
private void handleEventSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) {
- logd("handleEventSatelliteCapabilitiesChanged()");
+ plogd("handleEventSatelliteCapabilitiesChanged()");
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("handleEventSatelliteCapabilitiesChanged: oemEnabledSatelliteFlag is disabled");
+ plogd("handleEventSatelliteCapabilitiesChanged: oemEnabledSatelliteFlag is disabled");
return;
}
@@ -3487,7 +3562,7 @@
try {
listener.onSatelliteCapabilitiesChanged(capabilities);
} catch (RemoteException e) {
- logd("handleEventSatelliteCapabilitiesChanged RemoteException: " + e);
+ plogd("handleEventSatelliteCapabilitiesChanged RemoteException: " + e);
deadCallersList.add(listener);
}
});
@@ -3497,12 +3572,12 @@
}
private void handleEventSatelliteSupportedStateChanged(boolean supported) {
- logd("handleSatelliteSupportedStateChangedEvent: supported=" + supported);
+ plogd("handleSatelliteSupportedStateChangedEvent: supported=" + supported);
synchronized (mIsSatelliteSupportedLock) {
if (mIsSatelliteSupported != null && mIsSatelliteSupported == supported) {
if (DBG) {
- logd("current satellite support state and new supported state are matched,"
+ plogd("current satellite support state and new supported state are matched,"
+ " ignore update.");
}
return;
@@ -3514,7 +3589,7 @@
enabled, request disable satellite. */
synchronized (mIsSatelliteEnabledLock) {
if (!supported && mIsSatelliteEnabled != null && mIsSatelliteEnabled) {
- logd("Invoke requestSatelliteEnabled(), supported=false, "
+ plogd("Invoke requestSatelliteEnabled(), supported=false, "
+ "mIsSatelliteEnabled=true");
requestSatelliteEnabled(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
false /* enableSatellite */, false /* enableDemoMode */,
@@ -3522,7 +3597,7 @@
new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
- logd("handleSatelliteSupportedStateChangedEvent: request "
+ plogd("handleSatelliteSupportedStateChangedEvent: request "
+ "satellite disable, result="
+ result);
}
@@ -3538,7 +3613,7 @@
try {
listener.onSatelliteSupportedStateChanged(supported);
} catch (RemoteException e) {
- logd("handleSatelliteSupportedStateChangedEvent RemoteException: " + e);
+ plogd("handleSatelliteSupportedStateChangedEvent RemoteException: " + e);
deadCallersList.add(listener);
}
});
@@ -3549,11 +3624,114 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected void setSettingsKeyForSatelliteMode(int val) {
- logd("setSettingsKeyForSatelliteMode val: " + val);
+ plogd("setSettingsKeyForSatelliteMode val: " + val);
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.SATELLITE_MODE_ENABLED, val);
}
+ /**
+ * Allow screen rotation temporary in rotation locked foldable device.
+ * <p>
+ * Temporarily allow screen rotation user to catch satellite signals properly by UI guide in
+ * emergency situations. Unlock the setting value so that the screen rotation is not locked, and
+ * return it to the original value when the satellite service is finished.
+ * <p>
+ * Note that, only the unfolded screen will be temporarily allowed screen rotation.
+ *
+ * @param val {@link SATELLITE_MODE_ENABLED_TRUE} if satellite mode is enabled,
+ * {@link SATELLITE_MODE_ENABLED_FALSE} satellite mode is not enabled.
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ protected void setSettingsKeyToAllowDeviceRotation(int val) {
+ // Only allows on a foldable device type.
+ if (!isFoldable(mContext)) {
+ return;
+ }
+
+ switch (val) {
+ case SATELLITE_MODE_ENABLED_TRUE:
+ mDeviceRotationLockToBackupAndRestore =
+ Settings.Secure.getString(mContentResolver,
+ Settings.Secure.DEVICE_STATE_ROTATION_LOCK);
+ String unlockedRotationSettings = replaceDeviceRotationValue(
+ mDeviceRotationLockToBackupAndRestore == null
+ ? "" : mDeviceRotationLockToBackupAndRestore,
+ Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNFOLDED,
+ Settings.Secure.DEVICE_STATE_ROTATION_LOCK_UNLOCKED);
+ Settings.Secure.putString(mContentResolver,
+ Settings.Secure.DEVICE_STATE_ROTATION_LOCK, unlockedRotationSettings);
+ logd("setSettingsKeyToAllowDeviceRotation(TRUE), RotationSettings is changed"
+ + " from " + mDeviceRotationLockToBackupAndRestore
+ + " to " + unlockedRotationSettings);
+ break;
+ case SATELLITE_MODE_ENABLED_FALSE:
+ if (mDeviceRotationLockToBackupAndRestore == null) {
+ break;
+ }
+ Settings.Secure.putString(mContentResolver,
+ Settings.Secure.DEVICE_STATE_ROTATION_LOCK,
+ mDeviceRotationLockToBackupAndRestore);
+ logd("setSettingsKeyToAllowDeviceRotation(FALSE), RotationSettings is restored to"
+ + mDeviceRotationLockToBackupAndRestore);
+ mDeviceRotationLockToBackupAndRestore = "";
+ break;
+ default:
+ loge("setSettingsKeyToAllowDeviceRotation(" + val + "), never reach here.");
+ break;
+ }
+ }
+
+ /**
+ * If the device type is foldable.
+ *
+ * @param context context
+ * @return {@code true} if device type is foldable. {@code false} for otherwise.
+ */
+ private boolean isFoldable(Context context) {
+ return context.getResources().getIntArray(R.array.config_foldedDeviceStates).length > 0;
+ }
+
+ /**
+ * Replaces a value of given a target key with a new value in a string of key-value pairs.
+ * <p>
+ * Replaces the value corresponding to the target key with a new value. If the key value is not
+ * found in the device rotation information, it is not replaced.
+ *
+ * @param deviceRotationValue Device rotation key values separated by colon(':').
+ * @param targetKey The key of the new item caller wants to add.
+ * @param newValue The value of the new item caller want to add.
+ * @return A new string where all the key-value pairs.
+ */
+ private static String replaceDeviceRotationValue(
+ @NonNull String deviceRotationValue, int targetKey, int newValue) {
+ // Use list of Key-Value pair
+ List<Pair<Integer, Integer>> keyValuePairs = new ArrayList<>();
+
+ String[] pairs = deviceRotationValue.split(":");
+ if (pairs.length % 2 != 0) {
+ // Return without modifying. The key-value may be incorrect if length is an odd number.
+ loge("The length of key-value pair do not match. Return without modification.");
+ return deviceRotationValue;
+ }
+
+ // collect into keyValuePairs
+ for (int i = 0; i < pairs.length; i += 2) {
+ try {
+ int key = Integer.parseInt(pairs[i]);
+ int value = Integer.parseInt(pairs[i + 1]);
+ keyValuePairs.add(new Pair<>(key, key == targetKey ? newValue : value));
+ } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
+ // Return without modifying if got exception.
+ loge("got error while parsing key-value. Return without modification. e:" + e);
+ return deviceRotationValue;
+ }
+ }
+
+ return keyValuePairs.stream()
+ .map(pair -> pair.first + ":" + pair.second) // Convert to "key:value" format
+ .collect(Collectors.joining(":")); // Join pairs with colons
+ }
+
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected boolean areAllRadiosDisabled() {
synchronized (mRadioStateLock) {
@@ -3561,20 +3739,20 @@
|| (mDisableNFCOnSatelliteEnabled && mNfcStateEnabled)
|| (mDisableWifiOnSatelliteEnabled && mWifiStateEnabled)
|| (mDisableUWBOnSatelliteEnabled && mUwbStateEnabled)) {
- logd("All radios are not disabled yet.");
+ plogd("All radios are not disabled yet.");
return false;
}
- logd("All radios are disabled.");
+ plogd("All radios are disabled.");
return true;
}
}
private void evaluateToSendSatelliteEnabledSuccess() {
- logd("evaluateToSendSatelliteEnabledSuccess");
+ plogd("evaluateToSendSatelliteEnabledSuccess");
synchronized (mSatelliteEnabledRequestLock) {
if (areAllRadiosDisabled() && (mSatelliteEnabledRequest != null)
&& mWaitingForRadioDisabled) {
- logd("Sending success to callback that sent enable satellite request");
+ plogd("Sending success to callback that sent enable satellite request");
setDemoModeEnabled(mSatelliteEnabledRequest.enableDemoMode);
mIsEmergency = mSatelliteEnabledRequest.isEmergency;
synchronized (mIsSatelliteEnabledLock) {
@@ -3591,7 +3769,7 @@
}
private void resetSatelliteEnabledRequest() {
- logd("resetSatelliteEnabledRequest");
+ plogd("resetSatelliteEnabledRequest");
synchronized (mSatelliteEnabledRequestLock) {
mSatelliteEnabledRequest = null;
mWaitingForRadioDisabled = false;
@@ -3600,13 +3778,15 @@
private void moveSatelliteToOffStateAndCleanUpResources(
@SatelliteManager.SatelliteResult int error, @Nullable Consumer<Integer> callback) {
- logd("moveSatelliteToOffStateAndCleanUpResources");
+ plogd("moveSatelliteToOffStateAndCleanUpResources");
synchronized (mIsSatelliteEnabledLock) {
resetSatelliteEnabledRequest();
setDemoModeEnabled(false);
+ handlePersistentLoggingOnSessionEnd(mIsEmergency);
mIsEmergency = false;
mIsSatelliteEnabled = false;
setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE);
+ setSettingsKeyToAllowDeviceRotation(SATELLITE_MODE_ENABLED_FALSE);
if (callback != null) callback.accept(error);
updateSatelliteEnabledState(
false, "moveSatelliteToOffStateAndCleanUpResources");
@@ -3616,7 +3796,7 @@
private void setDemoModeEnabled(boolean enabled) {
mIsDemoModeEnabled = enabled;
mDatagramController.setDemoMode(mIsDemoModeEnabled);
- logd("setDemoModeEnabled: mIsDemoModeEnabled=" + mIsDemoModeEnabled);
+ plogd("setDemoModeEnabled: mIsDemoModeEnabled=" + mIsDemoModeEnabled);
}
private boolean isMockModemAllowed() {
@@ -3674,19 +3854,19 @@
* Otherwise, If the carrierPlmnList exist then used it.
*/
private void updatePlmnListPerCarrier(int subId) {
- logd("updatePlmnListPerCarrier: subId=" + subId);
+ plogd("updatePlmnListPerCarrier: subId=" + subId);
synchronized (mSupportedSatelliteServicesLock) {
List<String> carrierPlmnList, entitlementPlmnList;
if (getConfigForSubId(subId).getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL,
false)) {
entitlementPlmnList = mEntitlementPlmnListPerCarrier.get(subId,
new ArrayList<>()).stream().toList();
- logd("updatePlmnListPerCarrier: entitlementPlmnList="
+ plogd("updatePlmnListPerCarrier: entitlementPlmnList="
+ String.join(",", entitlementPlmnList)
+ " size=" + entitlementPlmnList.size());
if (!entitlementPlmnList.isEmpty()) {
mMergedPlmnListPerCarrier.put(subId, entitlementPlmnList);
- logd("mMergedPlmnListPerCarrier is updated by Entitlement");
+ plogd("mMergedPlmnListPerCarrier is updated by Entitlement");
mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(
SatelliteConstants.CONFIG_DATA_SOURCE_ENTITLEMENT);
return;
@@ -3699,7 +3879,7 @@
int carrierId = tm.createForSubscriptionId(subId).getSimCarrierId();
List<String> plmnList = satelliteConfig.getAllSatellitePlmnsForCarrier(carrierId);
if (!plmnList.isEmpty()) {
- logd("mMergedPlmnListPerCarrier is updated by ConfigUpdater : "
+ plogd("mMergedPlmnListPerCarrier is updated by ConfigUpdater : "
+ String.join(",", plmnList));
mMergedPlmnListPerCarrier.put(subId, plmnList);
mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(
@@ -3712,20 +3892,20 @@
&& mSatelliteServicesSupportedByCarriers.get(subId) != null) {
carrierPlmnList =
mSatelliteServicesSupportedByCarriers.get(subId).keySet().stream().toList();
- logd("mMergedPlmnListPerCarrier is updated by carrier config: "
+ plogd("mMergedPlmnListPerCarrier is updated by carrier config: "
+ String.join(",", carrierPlmnList));
mCarrierRoamingSatelliteControllerStats.reportConfigDataSource(
SatelliteConstants.CONFIG_DATA_SOURCE_CARRIER_CONFIG);
} else {
carrierPlmnList = new ArrayList<>();
- logd("Empty mMergedPlmnListPerCarrier");
+ plogd("Empty mMergedPlmnListPerCarrier");
}
mMergedPlmnListPerCarrier.put(subId, carrierPlmnList);
}
}
private void updateSupportedSatelliteServices(int subId) {
- logd("updateSupportedSatelliteServices with subId " + subId);
+ plogd("updateSupportedSatelliteServices with subId " + subId);
synchronized (mSupportedSatelliteServicesLock) {
SatelliteConfig satelliteConfig = getSatelliteConfig();
@@ -3737,19 +3917,19 @@
satelliteConfig.getSupportedSatelliteServices(carrierId);
if (!supportedServicesPerPlmn.isEmpty()) {
mSatelliteServicesSupportedByCarriers.put(subId, supportedServicesPerPlmn);
- logd("updateSupportedSatelliteServices using ConfigUpdater, "
+ plogd("updateSupportedSatelliteServices using ConfigUpdater, "
+ "supportedServicesPerPlmn = " + supportedServicesPerPlmn.size());
updatePlmnListPerCarrier(subId);
return;
} else {
- logd("supportedServicesPerPlmn is empty");
+ plogd("supportedServicesPerPlmn is empty");
}
}
mSatelliteServicesSupportedByCarriers.put(
subId, readSupportedSatelliteServicesFromCarrierConfig(subId));
updatePlmnListPerCarrier(subId);
- logd("updateSupportedSatelliteServices using carrier config");
+ plogd("updateSupportedSatelliteServices using carrier config");
}
}
@@ -3790,7 +3970,7 @@
private void handleCarrierConfigChanged(int slotIndex, int subId, int carrierId,
int specificCarrierId) {
- logd("handleCarrierConfigChanged(): slotIndex(" + slotIndex + "), subId("
+ plogd("handleCarrierConfigChanged(): slotIndex(" + slotIndex + "), subId("
+ subId + "), carrierId(" + carrierId + "), specificCarrierId("
+ specificCarrierId + ")");
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
@@ -3823,21 +4003,21 @@
*/
private void updateEntitlementPlmnListPerCarrier(int subId) {
if (!getConfigForSubId(subId).getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false)) {
- logd("don't support entitlement");
+ plogd("don't support entitlement");
return;
}
synchronized (mSupportedSatelliteServicesLock) {
if (mEntitlementPlmnListPerCarrier.indexOfKey(subId) < 0) {
- logd("updateEntitlementPlmnListPerCarrier: no correspondent cache, load from "
+ plogd("updateEntitlementPlmnListPerCarrier: no correspondent cache, load from "
+ "persist storage");
List<String> entitlementPlmnList =
mSubscriptionManagerService.getSatelliteEntitlementPlmnList(subId);
if (entitlementPlmnList.isEmpty()) {
- logd("updateEntitlementPlmnListPerCarrier: read empty list");
+ plogd("updateEntitlementPlmnListPerCarrier: read empty list");
return;
}
- logd("updateEntitlementPlmnListPerCarrier: entitlementPlmnList="
+ plogd("updateEntitlementPlmnListPerCarrier: entitlementPlmnList="
+ String.join(",", entitlementPlmnList));
mEntitlementPlmnListPerCarrier.put(subId, entitlementPlmnList);
}
@@ -3867,7 +4047,7 @@
try {
strArray = mContext.getResources().getStringArray(id);
} catch (Resources.NotFoundException ex) {
- loge("readStringArrayFromOverlayConfig: id= " + id + ", ex=" + ex);
+ ploge("readStringArrayFromOverlayConfig: id= " + id + ", ex=" + ex);
}
if (strArray == null) {
strArray = new String[0];
@@ -3897,7 +4077,7 @@
return !cachedRestrictionSet.contains(
SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER);
} else {
- logd("isSatelliteAttachEnabledForCarrierByUser() no correspondent cache, "
+ plogd("isSatelliteAttachEnabledForCarrierByUser() no correspondent cache, "
+ "load from persist storage");
try {
String enabled =
@@ -3906,13 +4086,13 @@
mContext.getOpPackageName(), mContext.getAttributionTag());
if (enabled == null) {
- loge("isSatelliteAttachEnabledForCarrierByUser: invalid subId, subId="
+ ploge("isSatelliteAttachEnabledForCarrierByUser: invalid subId, subId="
+ subId);
return false;
}
if (enabled.isEmpty()) {
- loge("isSatelliteAttachEnabledForCarrierByUser: no data for subId(" + subId
+ ploge("isSatelliteAttachEnabledForCarrierByUser: no data for subId(" + subId
+ ")");
return false;
}
@@ -3927,7 +4107,7 @@
return result;
}
} catch (IllegalArgumentException | SecurityException ex) {
- loge("isSatelliteAttachEnabledForCarrierByUser: ex=" + ex);
+ ploge("isSatelliteAttachEnabledForCarrierByUser: ex=" + ex);
return false;
}
}
@@ -3950,19 +4130,19 @@
private void updateRestrictReasonForEntitlementPerCarrier(int subId) {
if (!getConfigForSubId(subId).getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false)) {
- logd("don't support entitlement");
+ plogd("don't support entitlement");
return;
}
IIntegerConsumer callback = new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
- logd("updateRestrictReasonForEntitlementPerCarrier:" + result);
+ plogd("updateRestrictReasonForEntitlementPerCarrier:" + result);
}
};
synchronized (mSupportedSatelliteServicesLock) {
if (mSatelliteEntitlementStatusPerCarrier.indexOfKey(subId) < 0) {
- logd("updateRestrictReasonForEntitlementPerCarrier: no correspondent cache, "
+ plogd("updateRestrictReasonForEntitlementPerCarrier: no correspondent cache, "
+ "load from persist storage");
String entitlementStatus = null;
try {
@@ -3971,17 +4151,17 @@
SATELLITE_ENTITLEMENT_STATUS, mContext.getOpPackageName(),
mContext.getAttributionTag());
} catch (IllegalArgumentException | SecurityException e) {
- loge("updateRestrictReasonForEntitlementPerCarrier, e=" + e);
+ ploge("updateRestrictReasonForEntitlementPerCarrier, e=" + e);
}
if (entitlementStatus == null) {
- loge("updateRestrictReasonForEntitlementPerCarrier: invalid subId, subId="
+ ploge("updateRestrictReasonForEntitlementPerCarrier: invalid subId, subId="
+ subId + " set to default value");
entitlementStatus = "0";
}
if (entitlementStatus.isEmpty()) {
- loge("updateRestrictReasonForEntitlementPerCarrier: no data for subId(" + subId
+ ploge("updateRestrictReasonForEntitlementPerCarrier: no data for subId(" + subId
+ "). set to default value");
entitlementStatus = "0";
}
@@ -4006,9 +4186,9 @@
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected boolean persistSatelliteAttachEnabledForCarrierSetting(int subId) {
- logd("persistSatelliteAttachEnabledForCarrierSetting");
+ plogd("persistSatelliteAttachEnabledForCarrierSetting");
if (!isValidSubscriptionId(subId)) {
- loge("persistSatelliteAttachEnabledForCarrierSetting: subId is not valid,"
+ ploge("persistSatelliteAttachEnabledForCarrierSetting: subId is not valid,"
+ " subId=" + subId);
return false;
}
@@ -4021,7 +4201,7 @@
.contains(SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER)
? "0" : "1");
} catch (IllegalArgumentException | SecurityException ex) {
- loge("persistSatelliteAttachEnabledForCarrierSetting, ex=" + ex);
+ ploge("persistSatelliteAttachEnabledForCarrierSetting, ex=" + ex);
return false;
}
}
@@ -4070,12 +4250,12 @@
private void evaluateEnablingSatelliteForCarrier(int subId, int reason,
@Nullable Consumer<Integer> callback) {
if (callback == null) {
- callback = errorCode -> logd("evaluateEnablingSatelliteForCarrier: "
+ callback = errorCode -> plogd("evaluateEnablingSatelliteForCarrier: "
+ "SetSatelliteAttachEnableForCarrier error code =" + errorCode);
}
if (!isSatelliteSupportedViaCarrier(subId)) {
- logd("Satellite for carrier is not supported. Only user setting is stored");
+ plogd("Satellite for carrier is not supported. Only user setting is stored");
callback.accept(SATELLITE_RESULT_SUCCESS);
return;
}
@@ -4107,17 +4287,17 @@
@SatelliteManager.SatelliteResult private int evaluateOemSatelliteRequestAllowed(
boolean isProvisionRequired) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("oemEnabledSatelliteFlag is disabled");
+ plogd("oemEnabledSatelliteFlag is disabled");
return SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
}
if (!mSatelliteModemInterface.isSatelliteServiceSupported()) {
- logd("evaluateOemSatelliteRequestAllowed: satellite service is not supported");
+ plogd("evaluateOemSatelliteRequestAllowed: satellite service is not supported");
return SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
}
Boolean satelliteSupported = isSatelliteSupportedViaOemInternal();
if (satelliteSupported == null) {
- logd("evaluateOemSatelliteRequestAllowed: satelliteSupported is null");
+ plogd("evaluateOemSatelliteRequestAllowed: satelliteSupported is null");
return SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
}
if (!satelliteSupported) {
@@ -4127,7 +4307,7 @@
if (isProvisionRequired) {
Boolean satelliteProvisioned = isSatelliteViaOemProvisioned();
if (satelliteProvisioned == null) {
- logd("evaluateOemSatelliteRequestAllowed: satelliteProvisioned is null");
+ plogd("evaluateOemSatelliteRequestAllowed: satelliteProvisioned is null");
return SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
}
if (!satelliteProvisioned) {
@@ -4195,7 +4375,7 @@
sessionStats.onSignalStrength(phone);
if (!mWasSatelliteConnectedViaCarrier.get(subId)) {
// Log satellite connection start
- sessionStats.onConnectionStart();
+ sessionStats.onConnectionStart(phone);
}
}
@@ -4211,14 +4391,14 @@
}
} else {
Boolean connected = mWasSatelliteConnectedViaCarrier.get(subId);
- if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
+ if (getWwanIsInService(serviceState)) {
resetCarrierRoamingSatelliteModeParams(subId);
} else if (connected != null && connected) {
// The device just got disconnected from a satellite network
// and is not connected to any terrestrial network that has coverage
mLastSatelliteDisconnectedTimesMillis.put(subId, getElapsedRealtime());
- logd("sendMessageDelayed subId:" + subId
+ plogd("sendMessageDelayed subId:" + subId
+ " phoneId:" + phone.getPhoneId()
+ " time:" + getSatelliteConnectionHysteresisTimeMillis(subId));
sendMessageDelayed(obtainMessage(EVENT_NOTIFY_NTN_HYSTERESIS_TIMED_OUT,
@@ -4266,7 +4446,7 @@
// Log satellite session start
CarrierRoamingSatelliteSessionStats sessionStats =
CarrierRoamingSatelliteSessionStats.getInstance(subId);
- sessionStats.onSessionStart(phone.getCarrierId());
+ sessionStats.onSessionStart(phone.getCarrierId(), phone);
mCarrierRoamingSatelliteSessionStatsMap.put(subId, sessionStats);
} else if (lastNotifiedNtnMode && !currNtnMode) {
// Log satellite session end
@@ -4286,12 +4466,12 @@
private void persistOemEnabledSatelliteProvisionStatus(boolean isProvisioned) {
synchronized (mSatelliteViaOemProvisionLock) {
- logd("persistOemEnabledSatelliteProvisionStatus: isProvisioned=" + isProvisioned);
+ plogd("persistOemEnabledSatelliteProvisionStatus: isProvisioned=" + isProvisioned);
if (!loadSatelliteSharedPreferences()) return;
if (mSharedPreferences == null) {
- loge("persistOemEnabledSatelliteProvisionStatus: mSharedPreferences is null");
+ ploge("persistOemEnabledSatelliteProvisionStatus: mSharedPreferences is null");
} else {
mSharedPreferences.edit().putBoolean(
OEM_ENABLED_SATELLITE_PROVISION_STATUS_KEY, isProvisioned).apply();
@@ -4304,7 +4484,7 @@
if (!loadSatelliteSharedPreferences()) return false;
if (mSharedPreferences == null) {
- loge("getPersistedOemEnabledSatelliteProvisionStatus: mSharedPreferences is null");
+ ploge("getPersistedOemEnabledSatelliteProvisionStatus: mSharedPreferences is null");
return false;
} else {
return mSharedPreferences.getBoolean(
@@ -4320,7 +4500,7 @@
mContext.getSharedPreferences(SATELLITE_SHARED_PREF,
Context.MODE_PRIVATE);
} catch (Exception e) {
- loge("loadSatelliteSharedPreferences: Cannot get default "
+ ploge("loadSatelliteSharedPreferences: Cannot get default "
+ "shared preferences, e=" + e);
return false;
}
@@ -4335,18 +4515,18 @@
boolean isSatelliteProvisionedInModem = false;
if (error == SATELLITE_RESULT_SUCCESS) {
if (ar.result == null) {
- loge("handleIsSatelliteProvisionedDoneEvent: result is null");
+ ploge("handleIsSatelliteProvisionedDoneEvent: result is null");
error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
} else {
isSatelliteProvisionedInModem = ((int[]) ar.result)[0] == 1;
}
} else if (error == SATELLITE_RESULT_REQUEST_NOT_SUPPORTED) {
- logd("handleIsSatelliteProvisionedDoneEvent: Modem does not support this request");
+ plogd("handleIsSatelliteProvisionedDoneEvent: Modem does not support this request");
isSatelliteProvisionedInModem = true;
}
boolean isSatelliteViaOemProvisioned =
isSatelliteProvisionedInModem && getPersistedOemEnabledSatelliteProvisionStatus();
- logd("isSatelliteProvisionedInModem=" + isSatelliteProvisionedInModem
+ plogd("isSatelliteProvisionedInModem=" + isSatelliteProvisionedInModem
+ ", isSatelliteViaOemProvisioned=" + isSatelliteViaOemProvisioned);
Bundle bundle = new Bundle();
bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED, isSatelliteViaOemProvisioned);
@@ -4365,11 +4545,11 @@
@NonNull RequestSatelliteEnabledArgument argument) {
synchronized (mSatelliteEnabledRequestLock) {
if (hasMessages(EVENT_WAIT_FOR_SATELLITE_ENABLING_RESPONSE_TIMED_OUT, argument)) {
- logd("WaitForSatelliteEnablingResponseTimer of request ID "
+ plogd("WaitForSatelliteEnablingResponseTimer of request ID "
+ argument.requestId + " was already started");
return;
}
- logd("Start timer to wait for response of the satellite enabling request ID="
+ plogd("Start timer to wait for response of the satellite enabling request ID="
+ argument.requestId + ", enableSatellite=" + argument.enableSatellite
+ ", mWaitTimeForSatelliteEnablingResponse="
+ mWaitTimeForSatelliteEnablingResponse);
@@ -4381,7 +4561,7 @@
private void stopWaitForSatelliteEnablingResponseTimer(
@NonNull RequestSatelliteEnabledArgument argument) {
synchronized (mSatelliteEnabledRequestLock) {
- logd("Stop timer to wait for response of the satellite enabling request ID="
+ plogd("Stop timer to wait for response of the satellite enabling request ID="
+ argument.requestId + ", enableSatellite=" + argument.enableSatellite);
removeMessages(EVENT_WAIT_FOR_SATELLITE_ENABLING_RESPONSE_TIMED_OUT, argument);
}
@@ -4399,7 +4579,7 @@
private void handleEventWaitForSatelliteEnablingResponseTimedOut(
@NonNull RequestSatelliteEnabledArgument argument) {
- logw("Timed out to wait for response of the satellite enabling request ID="
+ plogw("Timed out to wait for response of the satellite enabling request ID="
+ argument.requestId + ", enableSatellite=" + argument.enableSatellite);
synchronized (mSatelliteEnabledRequestLock) {
@@ -4424,7 +4604,7 @@
IIntegerConsumer callback = new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
- logd("handleEventWaitForSatelliteEnablingResponseTimedOut: "
+ plogd("handleEventWaitForSatelliteEnablingResponseTimedOut: "
+ "disable satellite result=" + result);
}
};
@@ -4474,20 +4654,20 @@
private void handleCmdUpdateNtnSignalStrengthReporting(boolean shouldReport) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("handleCmdUpdateNtnSignalStrengthReporting: oemEnabledSatelliteFlag is "
+ plogd("handleCmdUpdateNtnSignalStrengthReporting: oemEnabledSatelliteFlag is "
+ "disabled");
return;
}
if (!isSatelliteEnabled()) {
- logd("handleCmdUpdateNtnSignalStrengthReporting: ignore request, satellite is "
+ plogd("handleCmdUpdateNtnSignalStrengthReporting: ignore request, satellite is "
+ "disabled");
return;
}
mLatestRequestedStateForNtnSignalStrengthReport.set(shouldReport);
if (mIsModemEnabledReportingNtnSignalStrength.get() == shouldReport) {
- logd("handleCmdUpdateNtnSignalStrengthReporting: ignore request. "
+ plogd("handleCmdUpdateNtnSignalStrengthReporting: ignore request. "
+ "mIsModemEnabledReportingNtnSignalStrength="
+ mIsModemEnabledReportingNtnSignalStrength.get());
return;
@@ -4498,7 +4678,7 @@
private void updateNtnSignalStrengthReporting(boolean shouldReport) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("updateNtnSignalStrengthReporting: oemEnabledSatelliteFlag is "
+ plogd("updateNtnSignalStrengthReporting: oemEnabledSatelliteFlag is "
+ "disabled");
return;
}
@@ -4508,10 +4688,10 @@
Message onCompleted = obtainMessage(EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE,
request);
if (shouldReport) {
- logd("updateNtnSignalStrengthReporting: startSendingNtnSignalStrength");
+ plogd("updateNtnSignalStrengthReporting: startSendingNtnSignalStrength");
mSatelliteModemInterface.startSendingNtnSignalStrength(onCompleted);
} else {
- logd("updateNtnSignalStrengthReporting: stopSendingNtnSignalStrength");
+ plogd("updateNtnSignalStrengthReporting: stopSendingNtnSignalStrength");
mSatelliteModemInterface.stopSendingNtnSignalStrength(onCompleted);
}
}
@@ -4528,12 +4708,12 @@
*/
public boolean setShouldSendDatagramToModemInDemoMode(boolean shouldSendToModemInDemoMode) {
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- logd("setShouldSendDatagramToModemInDemoMode: oemEnabledSatelliteFlag is disabled");
+ plogd("setShouldSendDatagramToModemInDemoMode: oemEnabledSatelliteFlag is disabled");
return false;
}
if (!isMockModemAllowed()) {
- logd("setShouldSendDatagramToModemInDemoMode: mock modem not allowed.");
+ plogd("setShouldSendDatagramToModemInDemoMode: mock modem not allowed.");
return false;
}
@@ -4570,7 +4750,7 @@
}
private void showSatelliteSystemNotification(int subId) {
- logd("showSatelliteSystemNotification");
+ plogd("showSatelliteSystemNotification");
final NotificationChannel notificationChannel = new NotificationChannel(
NOTIFICATION_CHANNEL_ID,
NOTIFICATION_CHANNEL,
@@ -4608,7 +4788,7 @@
intent.addCategory(Intent.CATEGORY_HOME);
return intent;
}).orElseGet(() -> {
- loge("showSatelliteSystemNotification: no default sms package name, Invoke "
+ ploge("showSatelliteSystemNotification: no default sms package name, Invoke "
+ "default sms compose window instead");
Intent newIntent = new Intent(Intent.ACTION_VIEW);
newIntent.setData(Uri.parse("sms:"));
@@ -4681,7 +4861,7 @@
if (mSatelliteSessionController != null) {
mSatelliteSessionController.onSatelliteEnablementFailed();
} else {
- loge("notifyEnablementFailedToSatelliteSessionController: mSatelliteSessionController"
+ ploge("notifyEnablementFailedToSatelliteSessionController: mSatelliteSessionController"
+ " is not initialized yet");
}
}
@@ -4720,6 +4900,25 @@
return mDemoPointingNotAlignedDurationMillis;
}
+ private boolean getWwanIsInService(ServiceState serviceState) {
+ List<NetworkRegistrationInfo> nriList = serviceState
+ .getNetworkRegistrationInfoListForTransportType(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ for (NetworkRegistrationInfo nri : nriList) {
+ if (nri.isInService()) {
+ logv("getWwanIsInService: return true");
+ return true;
+ }
+ }
+
+ logv("getWwanIsInService: return false");
+ return false;
+ }
+
+ private static void logv(@NonNull String log) {
+ Rlog.v(TAG, log);
+ }
+
private static void logd(@NonNull String log) {
Rlog.d(TAG, log);
}
@@ -4731,4 +4930,98 @@
private static void loge(@NonNull String log) {
Rlog.e(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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void plogw(@NonNull String log) {
+ Rlog.w(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.warn(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
+
+ private void handlePersistentLoggingOnSessionStart(RequestSatelliteEnabledArgument argument) {
+ if (mPersistentLogger == null) {
+ return;
+ }
+ if (argument.isEmergency) {
+ DropBoxManagerLoggerBackend.getInstance(mContext).setLoggingEnabled(true);
+ }
+ }
+
+ private void handlePersistentLoggingOnSessionEnd(boolean isEmergency) {
+ if (mPersistentLogger == null) {
+ return;
+ }
+ DropBoxManagerLoggerBackend loggerBackend =
+ DropBoxManagerLoggerBackend.getInstance(mContext);
+ // Flush persistent satellite logs on eSOS session end
+ if (isEmergency) {
+ loggerBackend.flushAsync();
+ }
+ // Also turn off persisted logging until new session is started
+ loggerBackend.setLoggingEnabled(false);
+ }
+
+ /**
+ * Set last emergency call time to the current time.
+ */
+ public void setLastEmergencyCallTime() {
+ synchronized (mLock) {
+ mLastEmergencyCallTime = getElapsedRealtime();
+ plogd("mLastEmergencyCallTime=" + mLastEmergencyCallTime);
+ }
+ }
+
+ /**
+ * Check if satellite is in emergency mode.
+ */
+ public boolean isInEmergencyMode() {
+ synchronized (mLock) {
+ if (mLastEmergencyCallTime == 0) return false;
+
+ long currentTime = getElapsedRealtime();
+ if ((currentTime - mLastEmergencyCallTime) <= mSatelliteEmergencyModeDurationMillis) {
+ plogd("Satellite is in emergency mode");
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private long getSatelliteEmergencyModeDurationFromOverlayConfig(@NonNull Context context) {
+ Integer duration = DEFAULT_SATELLITE_EMERGENCY_MODE_DURATION_SECONDS;
+ try {
+ duration = context.getResources().getInteger(com.android.internal.R.integer
+ .config_satellite_emergency_mode_duration);
+ } catch (Resources.NotFoundException ex) {
+ ploge("getSatelliteEmergencyModeDurationFromOverlayConfig: got ex=" + ex);
+ }
+ return TimeUnit.SECONDS.toMillis(duration);
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
index 8a26fd2..da4c69b 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
@@ -30,8 +30,10 @@
import android.os.Message;
import android.os.RegistrantList;
import android.os.RemoteException;
+import android.telephony.DropBoxManagerLoggerBackend;
import android.telephony.IBooleanConsumer;
import android.telephony.IIntegerConsumer;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteCapabilities;
@@ -50,6 +52,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.ExponentialBackoff;
+import com.android.internal.telephony.flags.FeatureFlags;
import java.util.Arrays;
import java.util.List;
@@ -81,6 +84,7 @@
@NonNull private String mVendorSatellitePackageName = "";
private boolean mIsBound;
private boolean mIsBinding;
+ @Nullable private PersistentLogger mPersistentLogger = null;
@NonNull private final RegistrantList mSatelliteProvisionStateChangedRegistrants =
new RegistrantList();
@@ -117,7 +121,7 @@
public void onSatelliteDatagramReceived(
android.telephony.satellite.stub.SatelliteDatagram datagram, int pendingCount) {
if (notifyResultIfExpectedListener()) {
- logd("onSatelliteDatagramReceived: pendingCount=" + pendingCount);
+ plogd("onSatelliteDatagramReceived: pendingCount=" + pendingCount);
mSatelliteDatagramsReceivedRegistrants.notifyResult(new Pair<>(
SatelliteServiceUtils.fromSatelliteDatagram(datagram), pendingCount));
}
@@ -126,7 +130,7 @@
@Override
public void onPendingDatagrams() {
if (notifyResultIfExpectedListener()) {
- logd("onPendingDatagrams");
+ plogd("onPendingDatagrams");
mPendingDatagramsRegistrants.notifyResult(null);
}
}
@@ -187,6 +191,11 @@
mSatelliteSupportedStateChangedRegistrants.notifyResult(supported);
}
+ @Override
+ public void onRegistrationFailure(int causeCode) {
+ // TO-DO notify registrants
+ }
+
private boolean notifyResultIfExpectedListener() {
// Demo listener should notify results only during demo mode
// Vendor listener should notify result only during real mode
@@ -217,13 +226,15 @@
* Create the SatelliteModemInterface singleton instance.
* @param context The Context to use to create the SatelliteModemInterface.
* @param satelliteController The singleton instance of SatelliteController.
+ * @param featureFlags The telephony feature flags.
* @return The singleton instance of SatelliteModemInterface.
*/
public static SatelliteModemInterface make(@NonNull Context context,
- SatelliteController satelliteController) {
+ SatelliteController satelliteController,
+ @NonNull FeatureFlags featureFlags) {
if (sInstance == null) {
sInstance = new SatelliteModemInterface(
- context, satelliteController, Looper.getMainLooper());
+ context, satelliteController, Looper.getMainLooper(), featureFlags);
}
return sInstance;
}
@@ -232,11 +243,18 @@
* Create a SatelliteModemInterface to manage connections to the SatelliteService.
*
* @param context The Context for the SatelliteModemInterface.
+ * @param featureFlags The telephony feature flags.
* @param looper The Looper to run binding retry on.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected SatelliteModemInterface(@NonNull Context context,
- SatelliteController satelliteController, @NonNull Looper looper) {
+ SatelliteController satelliteController,
+ @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags) {
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
mContext = context;
mDemoSimulator = DemoSimulator.make(context, satelliteController);
mVendorListener = new SatelliteListener(false);
@@ -260,7 +278,7 @@
bindService();
});
mExponentialBackoff.start();
- logd("Created SatelliteModemInterface. Attempting to bind to SatelliteService.");
+ plogd("Created SatelliteModemInterface. Attempting to bind to SatelliteService.");
bindService();
}
@@ -293,7 +311,7 @@
}
String packageName = getSatellitePackageName();
if (TextUtils.isEmpty(packageName)) {
- loge("Unable to bind to the satellite service because the package is undefined.");
+ ploge("Unable to bind to the satellite service because the package is undefined.");
// Since the package name comes from static device configs, stop retry because
// rebind will continue to fail without a valid package name.
synchronized (mLock) {
@@ -306,18 +324,18 @@
intent.setPackage(packageName);
mSatelliteServiceConnection = new SatelliteServiceConnection();
- logd("Binding to " + packageName);
+ plogd("Binding to " + packageName);
try {
boolean success = mContext.bindService(
intent, mSatelliteServiceConnection, Context.BIND_AUTO_CREATE);
if (success) {
- logd("Successfully bound to the satellite service.");
+ plogd("Successfully bound to the satellite service.");
} else {
synchronized (mLock) {
mIsBinding = false;
}
mExponentialBackoff.notifyFailed();
- loge("Error binding to the satellite service. Retrying in "
+ ploge("Error binding to the satellite service. Retrying in "
+ mExponentialBackoff.getCurrentDelay() + " ms.");
}
} catch (Exception e) {
@@ -325,7 +343,7 @@
mIsBinding = false;
}
mExponentialBackoff.notifyFailed();
- loge("Exception binding to the satellite service. Retrying in "
+ ploge("Exception binding to the satellite service. Retrying in "
+ mExponentialBackoff.getCurrentDelay() + " ms. Exception: " + e);
}
}
@@ -345,7 +363,7 @@
private class SatelliteServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- logd("onServiceConnected: ComponentName=" + name);
+ plogd("onServiceConnected: ComponentName=" + name);
synchronized (mLock) {
mIsBound = true;
mIsBinding = false;
@@ -357,14 +375,14 @@
mDemoSimulator.setSatelliteListener(mDemoListener);
} catch (RemoteException e) {
// TODO: Retry setSatelliteListener
- logd("setSatelliteListener: RemoteException " + e);
+ plogd("setSatelliteListener: RemoteException " + e);
}
mSatelliteController.onSatelliteServiceConnected();
}
@Override
public void onServiceDisconnected(ComponentName name) {
- loge("onServiceDisconnected: Waiting for reconnect.");
+ ploge("onServiceDisconnected: Waiting for reconnect.");
synchronized (mLock) {
mIsBinding = false;
}
@@ -374,7 +392,7 @@
@Override
public void onBindingDied(ComponentName name) {
- loge("onBindingDied: Unbinding and rebinding service.");
+ ploge("onBindingDied: Unbinding and rebinding service.");
synchronized (mLock) {
mIsBound = false;
mIsBinding = false;
@@ -590,7 +608,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestSatelliteListeningEnabled: " + error);
+ plogd("requestSatelliteListeningEnabled: " + error);
Binder.withCleanCallingIdentity(() -> {
if (message != null) {
sendMessageWithResult(message, null, error);
@@ -599,14 +617,14 @@
}
});
} catch (RemoteException e) {
- loge("requestSatelliteListeningEnabled: RemoteException " + e);
+ ploge("requestSatelliteListeningEnabled: RemoteException " + e);
if (message != null) {
sendMessageWithResult(
message, null, SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
}
} else {
- loge("requestSatelliteListeningEnabled: Satellite service is unavailable.");
+ ploge("requestSatelliteListeningEnabled: Satellite service is unavailable.");
if (message != null) {
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
@@ -628,7 +646,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("enableCellularModemWhileSatelliteModeIsOn: " + error);
+ plogd("enableCellularModemWhileSatelliteModeIsOn: " + error);
Binder.withCleanCallingIdentity(() -> {
if (message != null) {
sendMessageWithResult(message, null, error);
@@ -645,14 +663,14 @@
enabled, errorCallback);
}
} catch (RemoteException e) {
- loge("enableCellularModemWhileSatelliteModeIsOn: RemoteException " + e);
+ ploge("enableCellularModemWhileSatelliteModeIsOn: RemoteException " + e);
if (message != null) {
sendMessageWithResult(
message, null, SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
}
} else {
- loge("enableCellularModemWhileSatelliteModeIsOn: Satellite service is unavailable.");
+ ploge("enableCellularModemWhileSatelliteModeIsOn: Satellite service is unavailable.");
if (message != null) {
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
@@ -678,18 +696,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("setSatelliteEnabled: " + error);
+ plogd("setSatelliteEnabled: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("setSatelliteEnabled: RemoteException " + e);
+ ploge("setSatelliteEnabled: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("setSatelliteEnabled: Satellite service is unavailable.");
+ ploge("setSatelliteEnabled: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -707,7 +725,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestIsSatelliteEnabled: " + error);
+ plogd("requestIsSatelliteEnabled: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -717,18 +735,18 @@
// Convert for compatibility with SatelliteResponse
// TODO: This should just report result instead.
int[] enabled = new int[] {result ? 1 : 0};
- logd("requestIsSatelliteEnabled: " + Arrays.toString(enabled));
+ plogd("requestIsSatelliteEnabled: " + Arrays.toString(enabled));
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, enabled, SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestIsSatelliteEnabled: RemoteException " + e);
+ ploge("requestIsSatelliteEnabled: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestIsSatelliteEnabled: Satellite service is unavailable.");
+ ploge("requestIsSatelliteEnabled: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -746,25 +764,25 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestIsSatelliteSupported: " + error);
+ plogd("requestIsSatelliteSupported: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
}, new IBooleanConsumer.Stub() {
@Override
public void accept(boolean result) {
- logd("requestIsSatelliteSupported: " + result);
+ plogd("requestIsSatelliteSupported: " + result);
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, result, SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestIsSatelliteSupported: RemoteException " + e);
+ ploge("requestIsSatelliteSupported: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestIsSatelliteSupported: Satellite service is unavailable.");
+ ploge("requestIsSatelliteSupported: Satellite service is unavailable.");
sendMessageWithResult(
message, null, SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -782,7 +800,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestSatelliteCapabilities: " + error);
+ plogd("requestSatelliteCapabilities: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -792,18 +810,18 @@
result) {
SatelliteCapabilities capabilities =
SatelliteServiceUtils.fromSatelliteCapabilities(result);
- logd("requestSatelliteCapabilities: " + capabilities);
+ plogd("requestSatelliteCapabilities: " + capabilities);
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, capabilities, SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestSatelliteCapabilities: RemoteException " + e);
+ ploge("requestSatelliteCapabilities: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestSatelliteCapabilities: Satellite service is unavailable.");
+ ploge("requestSatelliteCapabilities: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -823,18 +841,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("startSendingSatellitePointingInfo: " + error);
+ plogd("startSendingSatellitePointingInfo: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("startSendingSatellitePointingInfo: RemoteException " + e);
+ ploge("startSendingSatellitePointingInfo: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("startSendingSatellitePointingInfo: Satellite service is unavailable.");
+ ploge("startSendingSatellitePointingInfo: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -853,18 +871,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("stopSendingSatellitePointingInfo: " + error);
+ plogd("stopSendingSatellitePointingInfo: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("stopSendingSatellitePointingInfo: RemoteException " + e);
+ ploge("stopSendingSatellitePointingInfo: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("stopSendingSatellitePointingInfo: Satellite service is unavailable.");
+ ploge("stopSendingSatellitePointingInfo: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -889,18 +907,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("provisionSatelliteService: " + error);
+ plogd("provisionSatelliteService: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("provisionSatelliteService: RemoteException " + e);
+ ploge("provisionSatelliteService: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("provisionSatelliteService: Satellite service is unavailable.");
+ ploge("provisionSatelliteService: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -921,18 +939,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("deprovisionSatelliteService: " + error);
+ plogd("deprovisionSatelliteService: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("deprovisionSatelliteService: RemoteException " + e);
+ ploge("deprovisionSatelliteService: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("deprovisionSatelliteService: Satellite service is unavailable.");
+ ploge("deprovisionSatelliteService: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -950,7 +968,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestIsSatelliteProvisioned: " + error);
+ plogd("requestIsSatelliteProvisioned: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -960,18 +978,18 @@
// Convert for compatibility with SatelliteResponse
// TODO: This should just report result instead.
int[] provisioned = new int[] {result ? 1 : 0};
- logd("requestIsSatelliteProvisioned: " + Arrays.toString(provisioned));
+ plogd("requestIsSatelliteProvisioned: " + Arrays.toString(provisioned));
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, provisioned, SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestIsSatelliteProvisioned: RemoteException " + e);
+ ploge("requestIsSatelliteProvisioned: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestIsSatelliteProvisioned: Satellite service is unavailable.");
+ ploge("requestIsSatelliteProvisioned: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -991,18 +1009,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("pollPendingDatagrams: " + error);
+ plogd("pollPendingDatagrams: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("pollPendingDatagrams: RemoteException " + e);
+ ploge("pollPendingDatagrams: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("pollPendingDatagrams: Satellite service is unavailable.");
+ ploge("pollPendingDatagrams: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1027,18 +1045,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("sendDatagram: " + error);
+ plogd("sendDatagram: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("sendDatagram: RemoteException " + e);
+ ploge("sendDatagram: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("sendDatagram: Satellite service is unavailable.");
+ ploge("sendDatagram: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1058,7 +1076,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestSatelliteModemState: " + error);
+ plogd("requestSatelliteModemState: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -1067,18 +1085,18 @@
public void accept(int result) {
// Convert SatelliteModemState from service to frameworks definition.
int modemState = SatelliteServiceUtils.fromSatelliteModemState(result);
- logd("requestSatelliteModemState: " + modemState);
+ plogd("requestSatelliteModemState: " + modemState);
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, modemState, SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestSatelliteModemState: RemoteException " + e);
+ ploge("requestSatelliteModemState: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestSatelliteModemState: Satellite service is unavailable.");
+ ploge("requestSatelliteModemState: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1099,7 +1117,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestTimeForNextSatelliteVisibility: " + error);
+ plogd("requestTimeForNextSatelliteVisibility: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -1109,19 +1127,19 @@
// Convert for compatibility with SatelliteResponse
// TODO: This should just report result instead.
int[] time = new int[] {result};
- logd("requestTimeForNextSatelliteVisibility: "
+ plogd("requestTimeForNextSatelliteVisibility: "
+ Arrays.toString(time));
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, time, SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestTimeForNextSatelliteVisibility: RemoteException " + e);
+ ploge("requestTimeForNextSatelliteVisibility: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestTimeForNextSatelliteVisibility: Satellite service is unavailable.");
+ ploge("requestTimeForNextSatelliteVisibility: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1154,18 +1172,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("setSatellitePlmn: " + error);
+ plogd("setSatellitePlmn: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("setSatellitePlmn: RemoteException " + e);
+ ploge("setSatellitePlmn: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("setSatellitePlmn: Satellite service is unavailable.");
+ ploge("setSatellitePlmn: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1189,18 +1207,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestSetSatelliteEnabledForCarrier: " + error);
+ plogd("requestSetSatelliteEnabledForCarrier: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("requestSetSatelliteEnabledForCarrier: RemoteException " + e);
+ ploge("requestSetSatelliteEnabledForCarrier: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestSetSatelliteEnabledForCarrier: Satellite service is unavailable.");
+ ploge("requestSetSatelliteEnabledForCarrier: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED);
}
@@ -1222,7 +1240,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestIsSatelliteEnabledForCarrier: " + error);
+ plogd("requestIsSatelliteEnabledForCarrier: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -1232,7 +1250,7 @@
// Convert for compatibility with SatelliteResponse
// TODO: This should just report result instead.
int[] enabled = new int[] {result ? 1 : 0};
- logd("requestIsSatelliteEnabledForCarrier: "
+ plogd("requestIsSatelliteEnabledForCarrier: "
+ Arrays.toString(enabled));
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, enabled,
@@ -1240,12 +1258,12 @@
}
});
} catch (RemoteException e) {
- loge("requestIsSatelliteEnabledForCarrier: RemoteException " + e);
+ ploge("requestIsSatelliteEnabledForCarrier: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestIsSatelliteEnabledForCarrier: Satellite service is unavailable.");
+ ploge("requestIsSatelliteEnabledForCarrier: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1264,7 +1282,7 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("requestNtnSignalStrength: " + error);
+ plogd("requestNtnSignalStrength: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
@@ -1274,19 +1292,19 @@
android.telephony.satellite.stub.NtnSignalStrength result) {
NtnSignalStrength ntnSignalStrength =
SatelliteServiceUtils.fromNtnSignalStrength(result);
- logd("requestNtnSignalStrength: " + ntnSignalStrength);
+ plogd("requestNtnSignalStrength: " + ntnSignalStrength);
Binder.withCleanCallingIdentity(() -> sendMessageWithResult(
message, ntnSignalStrength,
SatelliteManager.SATELLITE_RESULT_SUCCESS));
}
});
} catch (RemoteException e) {
- loge("requestNtnSignalStrength: RemoteException " + e);
+ ploge("requestNtnSignalStrength: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("requestNtnSignalStrength: Satellite service is unavailable.");
+ ploge("requestNtnSignalStrength: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1305,18 +1323,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("startSendingNtnSignalStrength: " + error);
+ plogd("startSendingNtnSignalStrength: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("startSendingNtnSignalStrength: RemoteException " + e);
+ ploge("startSendingNtnSignalStrength: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("startSendingNtnSignalStrength: Satellite service is unavailable.");
+ ploge("startSendingNtnSignalStrength: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1334,18 +1352,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("stopSendingNtnSignalStrength: " + error);
+ plogd("stopSendingNtnSignalStrength: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("stopSendingNtnSignalStrength: RemoteException " + e);
+ ploge("stopSendingNtnSignalStrength: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("stopSendingNtnSignalStrength: Satellite service is unavailable.");
+ ploge("stopSendingNtnSignalStrength: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1363,18 +1381,18 @@
@Override
public void accept(int result) {
int error = SatelliteServiceUtils.fromSatelliteError(result);
- logd("abortSendingSatelliteDatagrams: " + error);
+ plogd("abortSendingSatelliteDatagrams: " + error);
Binder.withCleanCallingIdentity(() ->
sendMessageWithResult(message, null, error));
}
});
} catch (RemoteException e) {
- loge("abortSendingSatelliteDatagrams: RemoteException " + e);
+ ploge("abortSendingSatelliteDatagrams: RemoteException " + e);
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
}
} else {
- loge("abortSendingSatelliteDatagrams: Satellite service is unavailable.");
+ ploge("abortSendingSatelliteDatagrams: Satellite service is unavailable.");
sendMessageWithResult(message, null,
SatelliteManager.SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
}
@@ -1400,7 +1418,7 @@
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public void setSatelliteServicePackageName(@Nullable String servicePackageName) {
- logd("setSatelliteServicePackageName: config_satellite_service_package is "
+ plogd("setSatelliteServicePackageName: config_satellite_service_package is "
+ "updated, new packageName=" + servicePackageName);
mExponentialBackoff.stop();
if (mSatelliteServiceConnection != null) {
@@ -1437,4 +1455,31 @@
private static void loge(@NonNull String log) {
Rlog.e(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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
index c497ca1..3fe2970 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
@@ -24,6 +24,7 @@
import static android.telephony.satellite.SatelliteManager.EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS;
import static android.telephony.satellite.SatelliteManager.EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911;
+import static com.android.internal.telephony.flags.Flags.satellitePersistentLogging;
import static com.android.internal.telephony.satellite.SatelliteController.INVALID_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE;
import android.annotation.NonNull;
@@ -42,6 +43,10 @@
import android.os.SystemProperties;
import android.provider.DeviceConfig;
import android.telecom.Connection;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.NetworkRegistrationInfo;
+import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
@@ -65,6 +70,7 @@
import com.android.internal.telephony.SmsApplication;
import com.android.internal.telephony.metrics.SatelliteStats;
+import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -109,13 +115,16 @@
protected int mCountOfTimerStarted = 0;
private final Object mLock = new Object();
+ @Nullable private PersistentLogger mPersistentLogger = null;
+
/**
* Create an instance of SatelliteSOSMessageRecommender.
*
* @param context The Context for the SatelliteSOSMessageRecommender.
* @param looper The looper used with the handler of this class.
*/
- public SatelliteSOSMessageRecommender(@NonNull Context context, @NonNull Looper looper) {
+ public SatelliteSOSMessageRecommender(@NonNull Context context,
+ @NonNull Looper looper) {
this(context, looper, SatelliteController.getInstance(), null);
}
@@ -131,8 +140,13 @@
*/
@VisibleForTesting
protected SatelliteSOSMessageRecommender(@NonNull Context context, @NonNull Looper looper,
- @NonNull SatelliteController satelliteController, ImsManager imsManager) {
+ @NonNull SatelliteController satelliteController,
+ ImsManager imsManager) {
super(looper);
+ if (isSatellitePersistentLoggingEnabled(context)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
mContext = context;
mSatelliteController = satelliteController;
mImsManager = imsManager;
@@ -141,7 +155,7 @@
mISatelliteProvisionStateCallback = new ISatelliteProvisionStateCallback.Stub() {
@Override
public void onSatelliteProvisionStateChanged(boolean provisioned) {
- logd("onSatelliteProvisionStateChanged: provisioned=" + provisioned);
+ plogd("onSatelliteProvisionStateChanged: provisioned=" + provisioned);
sendMessage(obtainMessage(EVENT_SATELLITE_PROVISIONED_STATE_CHANGED, provisioned));
}
};
@@ -172,7 +186,7 @@
handleSatelliteAccessRestrictionCheckingResult((boolean) msg.obj);
break;
default:
- logd("handleMessage: unexpected message code: " + msg.what);
+ plogd("handleMessage: unexpected message code: " + msg.what);
break;
}
}
@@ -184,9 +198,8 @@
* call.
*/
public void onEmergencyCallStarted(@NonNull Connection connection) {
- if (!mSatelliteController.isSatelliteSupportedViaOem()
- && !mSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier()) {
- logd("onEmergencyCallStarted: satellite is not supported");
+ if (!isSatelliteSupported()) {
+ plogd("onEmergencyCallStarted: satellite is not supported");
return;
}
@@ -215,10 +228,9 @@
*/
public void onEmergencyCallConnectionStateChanged(
String callId, @Connection.ConnectionState int state) {
- logd("callId=" + callId + ", state=" + state);
- if (!mSatelliteController.isSatelliteSupportedViaOem()
- && !mSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier()) {
- logd("onEmergencyCallConnectionStateChanged: satellite is not supported");
+ plogd("callId=" + callId + ", state=" + state);
+ if (!isSatelliteSupported()) {
+ plogd("onEmergencyCallConnectionStateChanged: satellite is not supported");
return;
}
Pair<String, Integer> argument = new Pair<>(callId, state);
@@ -231,6 +243,8 @@
}
private void handleEmergencyCallStartedEvent(@NonNull Connection connection) {
+ mSatelliteController.setLastEmergencyCallTime();
+
if (sendEventDisplayEmergencyMessageForcefully(connection)) {
return;
}
@@ -263,12 +277,12 @@
private void evaluateSendingConnectionEventDisplayEmergencyMessage() {
synchronized (mLock) {
if (mEmergencyConnection == null) {
- loge("No emergency call is ongoing...");
+ ploge("No emergency call is ongoing...");
return;
}
if (!mIsTimerTimedOut || mCheckingAccessRestrictionInProgress) {
- logd("mIsTimerTimedOut=" + mIsTimerTimedOut
+ plogd("mIsTimerTimedOut=" + mIsTimerTimedOut
+ ", mCheckingAccessRestrictionInProgress="
+ mCheckingAccessRestrictionInProgress);
return;
@@ -286,14 +300,14 @@
&& isSatelliteAllowed()
&& (isSatelliteViaOemAvailable() || isSatelliteViaCarrierAvailable())
&& shouldTrackCall(mEmergencyConnection.getState())) {
- logd("handleTimeoutEvent: Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer");
+ plogd("handleTimeoutEvent: Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer");
Bundle extras = createExtraBundleForEventDisplayEmergencyMessage();
mEmergencyConnection.sendConnectionEvent(
TelephonyManager.EVENT_DISPLAY_EMERGENCY_MESSAGE, extras);
isDialerNotified = true;
}
- logd("handleTimeoutEvent: isImsRegistered=" + isImsRegistered()
+ plogd("handleTimeoutEvent: isImsRegistered=" + isImsRegistered()
+ ", isCellularAvailable=" + isCellularAvailable()
+ ", isSatelliteAllowed=" + isSatelliteAllowed()
+ ", shouldTrackCall=" + shouldTrackCall(mEmergencyConnection.getState()));
@@ -332,6 +346,7 @@
private void handleEmergencyCallConnectionStateChangedEvent(
@NonNull Pair<String, Integer> arg) {
+ mSatelliteController.setLastEmergencyCallTime();
if (mEmergencyConnection == null) {
// Either the call was not created or the timer already timed out.
return;
@@ -340,7 +355,7 @@
String callId = arg.first;
int state = arg.second;
if (!mEmergencyConnection.getTelecomCallId().equals(callId)) {
- loge("handleEmergencyCallConnectionStateChangedEvent: unexpected state changed event "
+ ploge("handleEmergencyCallConnectionStateChangedEvent: unexpected state changed event "
+ ", mEmergencyConnection=" + mEmergencyConnection + ", callId=" + callId
+ ", state=" + state);
/*
@@ -409,7 +424,7 @@
imsManager.addRegistrationCallback(
getOrCreateImsRegistrationCallback(phone.getPhoneId()), this::post);
} catch (ImsException ex) {
- loge("registerForImsRegistrationStateChanged: ex=" + ex);
+ ploge("registerForImsRegistrationStateChanged: ex=" + ex);
}
}
@@ -430,7 +445,7 @@
imsManager.removeRegistrationListener(
mImsRegistrationCallbacks.get(phone.getPhoneId()));
} else {
- loge("Phone ID=" + phone.getPhoneId() + " was not registered with ImsManager");
+ ploge("Phone ID=" + phone.getPhoneId() + " was not registered with ImsManager");
}
}
@@ -441,7 +456,7 @@
int state = serviceState.getState();
if ((state == STATE_IN_SERVICE || state == STATE_EMERGENCY_ONLY
|| serviceState.isEmergencyOnly())
- && !serviceState.isUsingNonTerrestrialNetwork()) {
+ && !isSatellitePlmn(phone.getSubId(), serviceState)) {
logv("isCellularAvailable true");
return true;
}
@@ -451,6 +466,34 @@
return false;
}
+ private boolean isSatellitePlmn(int subId, @NonNull ServiceState serviceState) {
+ List<String> satellitePlmnList =
+ mSatelliteController.getSatellitePlmnsForCarrier(subId);
+ if (satellitePlmnList.isEmpty()) {
+ logv("isSatellitePlmn: satellitePlmnList is empty");
+ return false;
+ }
+
+ for (NetworkRegistrationInfo nri :
+ serviceState.getNetworkRegistrationInfoListForTransportType(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN)) {
+ String registeredPlmn = nri.getRegisteredPlmn();
+ String mccmnc = nri.getCellIdentity().getMccString()
+ + nri.getCellIdentity().getMncString();
+ for (String satellitePlmn : satellitePlmnList) {
+ if (TextUtils.equals(satellitePlmn, registeredPlmn)
+ || TextUtils.equals(satellitePlmn, mccmnc)) {
+ logv("isSatellitePlmn: return true, satellitePlmn:" + satellitePlmn
+ + " registeredPlmn:" + registeredPlmn + " mccmnc:" + mccmnc);
+ return true;
+ }
+ }
+ }
+
+ logv("isSatellitePlmn: return false");
+ return false;
+ }
+
/**
* @return {@link ServiceState#STATE_IN_SERVICE} if any subscription is in this state; else
* {@link ServiceState#STATE_EMERGENCY_ONLY} if any subscription is in this state; else
@@ -523,7 +566,7 @@
} else {
mTimeoutMillis = mOemEnabledTimeoutMillis;
}
- logd("mTimeoutMillis = " + mTimeoutMillis);
+ plogd("mTimeoutMillis = " + mTimeoutMillis);
}
private static long getOemEnabledEmergencyCallWaitForConnectionTimeoutMillis(
@@ -631,7 +674,7 @@
packageName = defaultSmsAppComponent.getPackageName();
className = defaultSmsAppComponent.getClassName();
}
- logd("EVENT_DISPLAY_EMERGENCY_MESSAGE: handoverType=" + handoverType + ", packageName="
+ plogd("EVENT_DISPLAY_EMERGENCY_MESSAGE: handoverType=" + handoverType + ", packageName="
+ packageName + ", className=" + className + ", action=" + action);
Bundle result = new Bundle();
@@ -652,7 +695,7 @@
if (mEmergencyConnection != null) {
emergencyNumber = mEmergencyConnection.getAddress().getSchemeSpecificPart();
}
- logd("emergencyNumber=" + emergencyNumber);
+ plogd("emergencyNumber=" + emergencyNumber);
Uri uri = Uri.parse("smsto:" + emergencyNumber);
intent = new Intent(Intent.ACTION_SENDTO, uri);
@@ -684,7 +727,7 @@
private void handleCmdSendEventDisplayEmergencyMessageForcefully(
@NonNull Connection connection) {
- logd("Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer forcefully.");
+ plogd("Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer forcefully.");
mEmergencyConnection = connection;
Bundle extras = createExtraBundleForEventDisplayEmergencyMessage();
connection.sendConnectionEvent(TelephonyManager.EVENT_DISPLAY_EMERGENCY_MESSAGE, extras);
@@ -694,7 +737,7 @@
private boolean isMultiSim() {
TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
if (telephonyManager == null) {
- loge("isMultiSim: telephonyManager is null");
+ ploge("isMultiSim: telephonyManager is null");
return false;
}
return telephonyManager.isMultiSimEnabled();
@@ -711,7 +754,7 @@
private void requestIsSatelliteAllowedForCurrentLocation() {
synchronized (mLock) {
if (mCheckingAccessRestrictionInProgress) {
- logd("requestIsSatelliteCommunicationAllowedForCurrentLocation was already sent");
+ plogd("requestIsSatelliteCommunicationAllowedForCurrentLocation was already sent");
return;
}
mCheckingAccessRestrictionInProgress = true;
@@ -721,14 +764,14 @@
new OutcomeReceiver<>() {
@Override
public void onResult(Boolean result) {
- logd("requestIsSatelliteAllowedForCurrentLocation: result=" + result);
+ plogd("requestIsSatelliteAllowedForCurrentLocation: result=" + result);
sendMessage(obtainMessage(
EVENT_SATELLITE_ACCESS_RESTRICTION_CHECKING_RESULT, result));
}
@Override
public void onError(SatelliteManager.SatelliteException ex) {
- logd("requestIsSatelliteAllowedForCurrentLocation: onError, ex=" + ex);
+ plogd("requestIsSatelliteAllowedForCurrentLocation: onError, ex=" + ex);
sendMessage(obtainMessage(
EVENT_SATELLITE_ACCESS_RESTRICTION_CHECKING_RESULT, false));
}
@@ -749,6 +792,19 @@
|| SystemProperties.getBoolean(BOOT_ALLOW_MOCK_MODEM_PROPERTY, false));
}
+ private boolean isSatelliteSupported() {
+ if (mSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier()) return true;
+ if (mSatelliteController.isSatelliteSupportedViaOem() && isSatelliteViaOemProvisioned()) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isSatelliteViaOemProvisioned() {
+ Boolean provisioned = mSatelliteController.isSatelliteViaOemProvisioned();
+ return (provisioned != null) && provisioned;
+ }
+
private static void logv(@NonNull String log) {
Rlog.v(TAG, log);
}
@@ -760,4 +816,31 @@
private static void loge(@NonNull String log) {
Rlog.e(TAG, log);
}
+
+ private boolean isSatellitePersistentLoggingEnabled(
+ @NonNull Context context) {
+ if (satellitePersistentLogging()) {
+ return true;
+ }
+ try {
+ return context.getResources().getBoolean(
+ R.bool.config_dropboxmanager_persistent_logging_enabled);
+ } catch (RuntimeException e) {
+ return false;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ Rlog.d(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ Rlog.e(TAG, log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java b/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java
index dcf9bb0..dde10a0 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java
@@ -39,6 +39,9 @@
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.PersistentLogger;
+import android.telephony.Rlog;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.stub.ISatelliteGateway;
@@ -50,6 +53,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.ExponentialBackoff;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
@@ -141,6 +145,8 @@
@NonNull private boolean mIsDisableCellularModemInProgress = false;
@NonNull private final SatelliteController mSatelliteController;
@NonNull private final DatagramController mDatagramController;
+ @Nullable private PersistentLogger mPersistentLogger = null;
+
/**
* @return The singleton instance of SatelliteSessionController.
@@ -157,13 +163,21 @@
*
* @param context The Context for the SatelliteSessionController.
* @param looper The looper associated with the handler of this class.
+ * @param featureFlags The telephony feature flags.
* @param isSatelliteSupported Whether satellite is supported on the device.
* @return The singleton instance of SatelliteSessionController.
*/
public static SatelliteSessionController make(
- @NonNull Context context, @NonNull Looper looper, boolean isSatelliteSupported) {
+ @NonNull Context context,
+ @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
+ boolean isSatelliteSupported) {
if (sInstance == null || isSatelliteSupported != sInstance.mIsSatelliteSupported) {
- sInstance = new SatelliteSessionController(context, looper, isSatelliteSupported,
+ sInstance = new SatelliteSessionController(
+ context,
+ looper,
+ featureFlags,
+ isSatelliteSupported,
SatelliteModemInterface.getInstance());
}
return sInstance;
@@ -174,15 +188,22 @@
*
* @param context The Context for the SatelliteSessionController.
* @param looper The looper associated with the handler of this class.
+ * @param featureFlags The telephony feature flags.
* @param isSatelliteSupported Whether satellite is supported on the device.
* @param satelliteModemInterface The singleton of SatelliteModemInterface.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected SatelliteSessionController(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
boolean isSatelliteSupported,
@NonNull SatelliteModemInterface satelliteModemInterface) {
super(TAG, looper);
+ if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+ mPersistentLogger = new PersistentLogger(
+ DropBoxManagerLoggerBackend.getInstance(context));
+ }
+
mContext = context;
mSatelliteModemInterface = satelliteModemInterface;
mSatelliteController = SatelliteController.getInstance();
@@ -297,7 +318,7 @@
callback.onSatelliteModemStateChanged(mCurrentState);
mListeners.put(callback.asBinder(), callback);
} catch (RemoteException ex) {
- loge("registerForSatelliteModemStateChanged: Got RemoteException ex=" + ex);
+ ploge("registerForSatelliteModemStateChanged: Got RemoteException ex=" + ex);
}
}
@@ -323,11 +344,11 @@
*/
boolean setSatelliteListeningTimeoutDuration(long timeoutMillis) {
if (!isMockModemAllowed()) {
- loge("Updating listening timeout duration is not allowed");
+ ploge("Updating listening timeout duration is not allowed");
return false;
}
- logd("setSatelliteListeningTimeoutDuration: timeoutMillis=" + timeoutMillis);
+ plogd("setSatelliteListeningTimeoutDuration: timeoutMillis=" + timeoutMillis);
if (timeoutMillis == 0) {
mSatelliteStayAtListeningFromSendingMillis =
getSatelliteStayAtListeningFromSendingMillis();
@@ -353,12 +374,12 @@
*/
boolean setSatelliteGatewayServicePackageName(@Nullable String servicePackageName) {
if (!isMockModemAllowed()) {
- loge("setSatelliteGatewayServicePackageName: modifying satellite gateway service "
+ ploge("setSatelliteGatewayServicePackageName: modifying satellite gateway service "
+ "package name is not allowed");
return false;
}
- logd("setSatelliteGatewayServicePackageName: config_satellite_gateway_service_package is "
+ plogd("setSatelliteGatewayServicePackageName: config_satellite_gateway_service_package is "
+ "updated, new packageName=" + servicePackageName);
if (servicePackageName == null || servicePackageName.equals("null")) {
@@ -397,7 +418,7 @@
* @return {@code true} if state machine is in enabling state and {@code false} otherwise.
*/
public boolean isInEnablingState() {
- if (DBG) logd("isInEnablingState: getCurrentState=" + getCurrentState());
+ if (DBG) plogd("isInEnablingState: getCurrentState=" + getCurrentState());
return getCurrentState() == mEnablingState;
}
@@ -419,14 +440,14 @@
private class UnavailableState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering UnavailableState");
+ if (DBG) plogd("Entering UnavailableState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE;
notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE);
}
@Override
public boolean processMessage(Message msg) {
- loge("UnavailableState: receive msg " + getWhatToString(msg.what) + " unexpectedly");
+ ploge("UnavailableState: receive msg " + getWhatToString(msg.what) + " unexpectedly");
return HANDLED;
}
}
@@ -434,7 +455,7 @@
private class PowerOffState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering PowerOffState");
+ if (DBG) plogd("Entering PowerOffState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_OFF;
mIsSendingTriggeredDuringTransferringState.set(false);
@@ -449,14 +470,14 @@
@Override
public void exit() {
- if (DBG) logd("Exiting PowerOffState");
- logd("Attempting to bind to SatelliteGatewayService.");
+ if (DBG) plogd("Exiting PowerOffState");
+ plogd("Attempting to bind to SatelliteGatewayService.");
bindService();
}
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("PowerOffState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("PowerOffState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_SATELLITE_ENABLEMENT_STARTED:
handleSatelliteEnablementStarted((boolean) msg.obj);
@@ -470,7 +491,7 @@
if (enabled) {
transitionTo(mEnablingState);
} else {
- logw("Unexpected satellite disablement started in PowerOff state");
+ plogw("Unexpected satellite disablement started in PowerOff state");
}
}
}
@@ -478,7 +499,7 @@
private class EnablingState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering EnablingState");
+ if (DBG) plogd("Entering EnablingState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_ENABLING_SATELLITE;
notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_ENABLING_SATELLITE);
@@ -486,12 +507,12 @@
@Override
public void exit() {
- if (DBG) logd("Exiting EnablingState");
+ if (DBG) plogd("Exiting EnablingState");
}
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("EnablingState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("EnablingState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
handleSatelliteEnabledStateChanged((boolean) msg.obj);
@@ -531,7 +552,7 @@
private class DisablingState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering DisablingState");
+ if (DBG) plogd("Entering DisablingState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_DISABLING_SATELLITE;
notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_DISABLING_SATELLITE);
@@ -539,12 +560,12 @@
@Override
public void exit() {
- if (DBG) logd("Exiting DisablingState");
+ if (DBG) plogd("Exiting DisablingState");
}
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("DisablingState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("DisablingState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
handleSatelliteEnabledStateChanged((boolean) msg.obj);
@@ -556,7 +577,7 @@
private void handleSatelliteEnabledStateChanged(boolean on) {
if (on) {
- logw("Unexpected power on event while disabling satellite");
+ plogw("Unexpected power on event while disabling satellite");
} else {
transitionTo(mPowerOffState);
}
@@ -566,7 +587,7 @@
private class IdleState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering IdleState");
+ if (DBG) plogd("Entering IdleState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_IDLE;
mIsSendingTriggeredDuringTransferringState.set(false);
stopNbIotInactivityTimer();
@@ -577,7 +598,7 @@
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("IdleState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("IdleState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_DATAGRAM_TRANSFER_STATE_CHANGED:
handleEventDatagramTransferStateChanged((DatagramTransferState) msg.obj);
@@ -603,7 +624,7 @@
|| (datagramTransferState.receiveState
== SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING)) {
if (mSatelliteController.isSatelliteAttachRequired()) {
- loge("Unexpected transferring state received for NB-IOT NTN");
+ ploge("Unexpected transferring state received for NB-IOT NTN");
} else {
transitionTo(mTransferringState);
}
@@ -614,7 +635,7 @@
if (mSatelliteController.isSatelliteAttachRequired()) {
disableCellularModemWhileSatelliteModeIsOn();
} else {
- loge("Unexpected transferring state received for non-NB-IOT NTN");
+ ploge("Unexpected transferring state received for non-NB-IOT NTN");
}
}
}
@@ -630,7 +651,7 @@
}
mIsDisableCellularModemInProgress = false;
} else {
- loge("DisableCellularModemWhileSatelliteModeIsOn is not in progress");
+ ploge("DisableCellularModemWhileSatelliteModeIsOn is not in progress");
}
}
}
@@ -638,7 +659,7 @@
private void disableCellularModemWhileSatelliteModeIsOn() {
synchronized (mLock) {
if (mIsDisableCellularModemInProgress) {
- logd("Cellular scanning is already being disabled");
+ plogd("Cellular scanning is already being disabled");
return;
}
@@ -652,7 +673,7 @@
@Override
public void exit() {
- if (DBG) logd("Exiting IdleState");
+ if (DBG) plogd("Exiting IdleState");
if (!mSatelliteController.isSatelliteAttachRequired()) {
// Disable cellular modem scanning
mSatelliteModemInterface.enableCellularModemWhileSatelliteModeIsOn(false, null);
@@ -663,7 +684,7 @@
private class TransferringState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering TransferringState");
+ if (DBG) plogd("Entering TransferringState");
stopNbIotInactivityTimer();
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING);
@@ -671,7 +692,7 @@
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("TransferringState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("TransferringState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_DATAGRAM_TRANSFER_STATE_CHANGED:
handleEventDatagramTransferStateChanged((DatagramTransferState) msg.obj);
@@ -722,7 +743,7 @@
private class ListeningState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering ListeningState");
+ if (DBG) plogd("Entering ListeningState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_LISTENING;
long timeoutMillis = updateListeningMode(true);
@@ -733,7 +754,7 @@
@Override
public void exit() {
- if (DBG) logd("Exiting ListeningState");
+ if (DBG) plogd("Exiting ListeningState");
removeMessages(EVENT_LISTENING_TIMER_TIMEOUT);
updateListeningMode(false);
@@ -741,7 +762,7 @@
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("ListeningState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("ListeningState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_LISTENING_TIMER_TIMEOUT:
transitionTo(mIdleState);
@@ -785,7 +806,7 @@
private class NotConnectedState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering NotConnectedState");
+ if (DBG) plogd("Entering NotConnectedState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED;
notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
@@ -794,12 +815,12 @@
@Override
public void exit() {
- if (DBG) logd("Exiting NotConnectedState");
+ if (DBG) plogd("Exiting NotConnectedState");
}
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("NotConnectedState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("NotConnectedState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
handleSatelliteEnabledStateChanged(
@@ -850,7 +871,7 @@
private class ConnectedState extends State {
@Override
public void enter() {
- if (DBG) logd("Entering ConnectedState");
+ if (DBG) plogd("Entering ConnectedState");
mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
@@ -859,12 +880,12 @@
@Override
public void exit() {
- if (DBG) logd("Exiting ConnectedState");
+ if (DBG) plogd("Exiting ConnectedState");
}
@Override
public boolean processMessage(Message msg) {
- if (DBG) log("ConnectedState: processing " + getWhatToString(msg.what));
+ if (DBG) plogd("ConnectedState: processing " + getWhatToString(msg.what));
switch (msg.what) {
case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
handleSatelliteEnabledStateChanged(
@@ -956,7 +977,7 @@
try {
listener.onSatelliteModemStateChanged(state);
} catch (RemoteException e) {
- logd("notifyStateChangedEvent RemoteException: " + e);
+ plogd("notifyStateChangedEvent RemoteException: " + e);
toBeRemoved.add(listener);
}
});
@@ -970,7 +991,7 @@
if (off) {
transitionTo(mPowerOffState);
} else {
- loge(caller + ": Unexpected satellite radio powered-on state changed event");
+ ploge(caller + ": Unexpected satellite radio powered-on state changed event");
}
}
@@ -1003,7 +1024,7 @@
String packageName = getSatelliteGatewayPackageName();
if (TextUtils.isEmpty(packageName)) {
- loge("Unable to bind to the satellite gateway service because the package is"
+ ploge("Unable to bind to the satellite gateway service because the package is"
+ " undefined.");
// Since the package name comes from static device configs, stop retry because
// rebind will continue to fail without a valid package name.
@@ -1021,13 +1042,13 @@
boolean success = mContext.bindService(
intent, mSatelliteGatewayServiceConnection, Context.BIND_AUTO_CREATE);
if (success) {
- logd("Successfully bound to the satellite gateway service.");
+ plogd("Successfully bound to the satellite gateway service.");
} else {
synchronized (mLock) {
mIsBinding = false;
}
mExponentialBackoff.notifyFailed();
- loge("Error binding to the satellite gateway service. Retrying in "
+ ploge("Error binding to the satellite gateway service. Retrying in "
+ mExponentialBackoff.getCurrentDelay() + " ms.");
}
} catch (Exception e) {
@@ -1035,13 +1056,13 @@
mIsBinding = false;
}
mExponentialBackoff.notifyFailed();
- loge("Exception binding to the satellite gateway service. Retrying in "
+ ploge("Exception binding to the satellite gateway service. Retrying in "
+ mExponentialBackoff.getCurrentDelay() + " ms. Exception: " + e);
}
}
private void unbindService() {
- logd("unbindService");
+ plogd("unbindService");
mExponentialBackoff.stop();
mSatelliteGatewayService = null;
synchronized (mLock) {
@@ -1056,7 +1077,7 @@
private class SatelliteGatewayServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- logd("onServiceConnected: ComponentName=" + name);
+ plogd("onServiceConnected: ComponentName=" + name);
synchronized (mLock) {
mIsBound = true;
mIsBinding = false;
@@ -1067,7 +1088,7 @@
@Override
public void onServiceDisconnected(ComponentName name) {
- loge("onServiceDisconnected: Waiting for reconnect.");
+ ploge("onServiceDisconnected: Waiting for reconnect.");
synchronized (mLock) {
mIsBinding = false;
mIsBound = false;
@@ -1077,7 +1098,7 @@
@Override
public void onBindingDied(ComponentName name) {
- loge("onBindingDied: Unbinding and rebinding service.");
+ ploge("onBindingDied: Unbinding and rebinding service.");
synchronized (mLock) {
mIsBound = false;
mIsBinding = false;
@@ -1132,7 +1153,7 @@
private void startNbIotInactivityTimer() {
if (isNbIotInactivityTimerStarted()) {
- logd("NB IOT inactivity timer is already started");
+ plogd("NB IOT inactivity timer is already started");
return;
}
@@ -1152,4 +1173,38 @@
private boolean isNbIotInactivityTimerStarted() {
return hasMessages(EVENT_NB_IOT_INACTIVITY_TIMER_TIMED_OUT);
}
+
+ 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;
+ }
+ }
+
+ private void plogd(@NonNull String log) {
+ logd(log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.debug(TAG, log);
+ }
+ }
+
+ private void plogw(@NonNull String log) {
+ logw(log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.warn(TAG, log);
+ }
+ }
+
+ private void ploge(@NonNull String log) {
+ loge(log);
+ if (mPersistentLogger != null) {
+ mPersistentLogger.error(TAG, log);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java
new file mode 100644
index 0000000..13ba709
--- /dev/null
+++ b/src/java/com/android/internal/telephony/satellite/metrics/AccessControllerMetricsStats.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2024 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.internal.telephony.satellite.metrics;
+
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
+
+import static com.android.internal.telephony.satellite.SatelliteConstants.CONFIG_DATA_SOURCE_UNKNOWN;
+
+import android.annotation.NonNull;
+import android.telephony.satellite.SatelliteManager;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.metrics.SatelliteStats;
+import com.android.internal.telephony.satellite.SatelliteConstants;
+
+import java.util.Arrays;
+import java.util.List;
+public class AccessControllerMetricsStats {
+ private static final String TAG = AccessControllerMetricsStats.class.getSimpleName();
+ private static AccessControllerMetricsStats sInstance = null;
+
+ private @SatelliteConstants.AccessControlType int mAccessControlType;
+ private long mLocationQueryTimeMillis;
+ private long mOnDeviceLookupTimeMillis;
+ private long mTotalCheckingTimeMillis;
+ private Boolean mIsAllowed;
+ private Boolean mIsEmergency;
+ private @SatelliteManager.SatelliteResult int mResultCode;
+ private String[] mCountryCodes;
+ private @SatelliteConstants.ConfigDataSource int mConfigDataSource;
+ private AccessControllerMetricsStats() {
+ initializeAccessControllerMetricsParam();
+ }
+
+ /**
+ * Returns the Singleton instance of AccessControllerMetricsStats class.
+ * If an instance of the Singleton class has not been created,
+ * it creates a new instance and returns it. Otherwise, it returns
+ * the existing instance.
+ * @return the Singleton instance of AccessControllerMetricsStats.
+ */
+ public static AccessControllerMetricsStats getInstance() {
+ if (sInstance == null) {
+ loge("create new AccessControllerMetricsStats.");
+ sInstance = new AccessControllerMetricsStats();
+ }
+ return sInstance;
+ }
+ private void initializeAccessControllerMetricsParam() {
+ mAccessControlType = SatelliteConstants.ACCESS_CONTROL_TYPE_UNKNOWN;
+ mLocationQueryTimeMillis = 0;
+ mOnDeviceLookupTimeMillis = 0;
+ mTotalCheckingTimeMillis = 0;
+ mIsAllowed = null;
+ mIsEmergency = null;
+ mResultCode = SATELLITE_RESULT_SUCCESS;
+ mCountryCodes = new String[0];
+ mConfigDataSource = CONFIG_DATA_SOURCE_UNKNOWN;
+ }
+ /**
+ * Sets the Access Control Type for current satellite enablement.
+ * @param accessControlType access control type of location query is attempted.
+ */
+ public AccessControllerMetricsStats setAccessControlType(
+ @SatelliteConstants.AccessControlType int accessControlType) {
+ mAccessControlType = accessControlType;
+ logd("setAccessControlType: access control type = " + mAccessControlType);
+ return this;
+ }
+ /**
+ * Sets the location query time for current satellite enablement.
+ * @param queryStartTime the time location query is attempted.
+ */
+ public AccessControllerMetricsStats setLocationQueryTime(long queryStartTime) {
+ mLocationQueryTimeMillis =
+ (queryStartTime > 0) ? (getCurrentTime() - queryStartTime) : 0;
+ logd("setLocationQueryTimeMillis: location query time = " + mLocationQueryTimeMillis);
+ return this;
+ }
+ /**
+ * Sets the on device lookup time for current satellite enablement.
+ * @param onDeviceLookupStartTime the time on device lookup is attempted.
+ */
+ public AccessControllerMetricsStats setOnDeviceLookupTime(long onDeviceLookupStartTime) {
+ mOnDeviceLookupTimeMillis =
+ (onDeviceLookupStartTime > 0) ? (getCurrentTime() - onDeviceLookupStartTime) : 0;
+ logd("setLocationQueryTime: on device lookup time = " + mOnDeviceLookupTimeMillis);
+ return this;
+ }
+ /**
+ * Sets the total checking time for current satellite enablement.
+ * @param queryStartTime the time location query is attempted.
+ */
+ public AccessControllerMetricsStats setTotalCheckingTime(long queryStartTime) {
+ mTotalCheckingTimeMillis =
+ (queryStartTime > 0) ? (getCurrentTime() - queryStartTime) : 0;
+ logd("setTotalCheckingTime: location query time = " + mTotalCheckingTimeMillis);
+ return this;
+ }
+ /**
+ * Sets whether the satellite communication is allowed from current location.
+ * @param isAllowed {@code true} if satellite communication is allowed from current location
+ * {@code false} otherwise.
+ */
+ public AccessControllerMetricsStats setIsAllowed(boolean isAllowed) {
+ mIsAllowed = isAllowed;
+ logd("setIsAllowed: allowed=" + mIsAllowed);
+ return this;
+ }
+ /**
+ * Sets whether the current satellite enablement is for emergency or not.
+ * @param isEmergency {@code true} if current satellite enablement is for emergency SOS message
+ * {@code false} otherwise.
+ */
+ public AccessControllerMetricsStats setIsEmergency(boolean isEmergency) {
+ mIsEmergency = isEmergency;
+ logd("setIsEmergency: emergency =" + mIsEmergency);
+ return this;
+ }
+ /**
+ * Sets the result code for checking whether satellite service is allowed from current
+ * location.
+ * @param result result code for checking process.
+ */
+ public AccessControllerMetricsStats setResult(@SatelliteManager.SatelliteResult int result) {
+ mResultCode = result;
+ logd("setResult: result = " + mResultCode);
+ return this;
+ }
+ /**
+ * Sets the country code for current location while attempting satellite enablement.
+ * @param countryCodes Country code the user is located in
+ */
+ public AccessControllerMetricsStats setCountryCodes(List<String> countryCodes) {
+ mCountryCodes = countryCodes.stream().toArray(String[]::new);
+ logd("setCountryCodes: country code is " + Arrays.toString(mCountryCodes));
+ return this;
+ }
+ /**
+ * Sets the config data source for checking whether satellite service is allowed from current
+ * location.
+ * @param configDatasource configuration data source.
+ */
+ public AccessControllerMetricsStats setConfigDataSource(
+ @SatelliteConstants.ConfigDataSource int configDatasource) {
+ mConfigDataSource = configDatasource;
+ logd("setConfigDataSource: config data source = " + mConfigDataSource);
+ return this;
+ }
+ /** Report the access controller metrics atoms to PersistAtomsStorage in telephony. */
+ public void reportAccessControllerMetrics() {
+ SatelliteStats.SatelliteAccessControllerParams accessControllerParams =
+ new SatelliteStats.SatelliteAccessControllerParams.Builder()
+ .setAccessControlType(mAccessControlType)
+ .setLocationQueryTime(mLocationQueryTimeMillis)
+ .setOnDeviceLookupTime(mOnDeviceLookupTimeMillis)
+ .setTotalCheckingTime(mTotalCheckingTimeMillis)
+ .setIsAllowed(mIsAllowed)
+ .setIsEmergency(mIsEmergency)
+ .setResult(mResultCode)
+ .setCountryCodes(mCountryCodes)
+ .setConfigDatasource(mConfigDataSource)
+ .build();
+ logd("reportAccessControllerMetrics: " + accessControllerParams.toString());
+ SatelliteStats.getInstance().onSatelliteAccessControllerMetrics(accessControllerParams);
+ initializeAccessControllerMetricsParam();
+ }
+ @VisibleForTesting
+ public long getCurrentTime() {
+ return System.currentTimeMillis();
+ }
+ 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/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java b/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java
index 4ed4a98..771432e 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java
@@ -20,13 +20,18 @@
import android.telephony.CellInfo;
import android.telephony.CellSignalStrength;
import android.telephony.CellSignalStrengthLte;
+import android.telephony.NetworkRegistrationInfo;
+import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.SparseArray;
+import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.metrics.SatelliteStats;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import java.util.ArrayList;
import java.util.Collections;
@@ -36,12 +41,14 @@
private static final String TAG = CarrierRoamingSatelliteSessionStats.class.getSimpleName();
private static final SparseArray<CarrierRoamingSatelliteSessionStats>
sCarrierRoamingSatelliteSessionStats = new SparseArray<>();
+ @NonNull private final SubscriptionManagerService mSubscriptionManagerService;
private int mCarrierId;
private boolean mIsNtnRoamingInHomeCountry;
private int mCountOfIncomingSms;
private int mCountOfOutgoingSms;
private int mCountOfIncomingMms;
private int mCountOfOutgoingMms;
+ private long mIncomingMessageId;
private int mSessionStartTimeSec;
private List<Long> mConnectionStartTimeList;
@@ -49,9 +56,10 @@
private List<Integer> mRsrpList;
private List<Integer> mRssnrList;
- public CarrierRoamingSatelliteSessionStats() {
- logd("Create new CarrierRoamingSatelliteSessionStats.");
+ public CarrierRoamingSatelliteSessionStats(int subId) {
+ logd("Create new CarrierRoamingSatelliteSessionStats. subId=" + subId);
initializeParams();
+ mSubscriptionManagerService = SubscriptionManagerService.getInstance();
}
/** Gets a CarrierRoamingSatelliteSessionStats instance. */
@@ -59,28 +67,31 @@
synchronized (sCarrierRoamingSatelliteSessionStats) {
if (sCarrierRoamingSatelliteSessionStats.get(subId) == null) {
sCarrierRoamingSatelliteSessionStats.put(subId,
- new CarrierRoamingSatelliteSessionStats());
+ new CarrierRoamingSatelliteSessionStats(subId));
}
return sCarrierRoamingSatelliteSessionStats.get(subId);
}
}
/** Log carrier roaming satellite session start */
- public void onSessionStart(int carrierId) {
+ public void onSessionStart(int carrierId, Phone phone) {
mCarrierId = carrierId;
mSessionStartTimeSec = getCurrentTimeInSec();
- onConnectionStart();
+ mIsNtnRoamingInHomeCountry = false;
+ onConnectionStart(phone);
}
/** Log carrier roaming satellite connection start */
- public void onConnectionStart() {
+ public void onConnectionStart(Phone phone) {
mConnectionStartTimeList.add(getCurrentTime());
+ updateNtnRoamingInHomeCountry(phone);
}
/** Log carrier roaming satellite session end */
public void onSessionEnd() {
onConnectionEnd();
reportMetrics();
+ mIsNtnRoamingInHomeCountry = false;
}
/** Log carrier roaming satellite connection end */
@@ -107,15 +118,41 @@
}
/** Log incoming sms success case */
- public void onIncomingSms() {
+ public void onIncomingSms(int subId) {
+ if (!isNtnConnected()) {
+ return;
+ }
mCountOfIncomingSms += 1;
- logd("onIncomingSms: mCountOfIncomingSms=" + mCountOfIncomingSms);
+ logd("onIncomingSms: subId=" + subId + ", count=" + mCountOfIncomingSms);
}
/** Log outgoing sms success case */
- public void onOutgoingSms() {
+ public void onOutgoingSms(int subId) {
+ if (!isNtnConnected()) {
+ return;
+ }
mCountOfOutgoingSms += 1;
- logd("onOutgoingSms: mCountOfOutgoingSms=" + mCountOfOutgoingSms);
+ logd("onOutgoingSms: subId=" + subId + ", count=" + mCountOfOutgoingSms);
+ }
+
+ /** Log incoming or outgoing mms success case */
+ public void onMms(boolean isIncomingMms, long messageId) {
+ if (!isNtnConnected()) {
+ return;
+ }
+ if (isIncomingMms) {
+ mIncomingMessageId = messageId;
+ mCountOfIncomingMms += 1;
+ logd("onMms: messageId=" + messageId + ", countOfIncomingMms=" + mCountOfIncomingMms);
+ } else {
+ if (mIncomingMessageId == messageId) {
+ logd("onMms: NotifyResponse ignore it.");
+ mIncomingMessageId = 0;
+ return;
+ }
+ mCountOfOutgoingMms += 1;
+ logd("onMms: countOfOutgoingMms=" + mCountOfOutgoingMms);
+ }
}
private void reportMetrics() {
@@ -165,12 +202,14 @@
mCountOfOutgoingSms = 0;
mCountOfIncomingMms = 0;
mCountOfOutgoingMms = 0;
+ mIncomingMessageId = 0;
mSessionStartTimeSec = 0;
mConnectionStartTimeList = new ArrayList<>();
mConnectionEndTimeList = new ArrayList<>();
mRsrpList = new ArrayList<>();
mRssnrList = new ArrayList<>();
+ logd("initializeParams");
}
private CellSignalStrengthLte getCellSignalStrengthLte(Phone phone) {
@@ -259,6 +298,45 @@
return System.currentTimeMillis();
}
+ private boolean isNtnConnected() {
+ return mSessionStartTimeSec != 0;
+ }
+
+ private void updateNtnRoamingInHomeCountry(Phone phone) {
+ int subId = phone.getSubId();
+ ServiceState serviceState = phone.getServiceState();
+ if (serviceState == null) {
+ logd("ServiceState is null");
+ return;
+ }
+
+ String satelliteRegisteredPlmn = "";
+ for (NetworkRegistrationInfo nri
+ : serviceState.getNetworkRegistrationInfoList()) {
+ if (nri.isNonTerrestrialNetwork()) {
+ satelliteRegisteredPlmn = nri.getRegisteredPlmn();
+ }
+ }
+
+ SubscriptionInfoInternal subscriptionInfoInternal =
+ mSubscriptionManagerService.getSubscriptionInfoInternal(subId);
+ if (subscriptionInfoInternal == null) {
+ logd("SubscriptionInfoInternal is null");
+ return;
+ }
+ String simCountry = MccTable.countryCodeForMcc(subscriptionInfoInternal.getMcc());
+ String satelliteRegisteredCountry = MccTable.countryCodeForMcc(
+ satelliteRegisteredPlmn.substring(0, 3));
+ if (simCountry.equalsIgnoreCase(satelliteRegisteredCountry)) {
+ mIsNtnRoamingInHomeCountry = false;
+ } else {
+ // If device is connected to roaming non-terrestrial network, update to true.
+ mIsNtnRoamingInHomeCountry = true;
+ }
+ logd("updateNtnRoamingInHomeCountry: mIsNtnRoamingInHomeCountry="
+ + mIsNtnRoamingInHomeCountry);
+ }
+
private void logd(@NonNull String log) {
Log.d(TAG, log);
}
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java
index fdc7c5c..7dff2e6 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/ControllerMetricsStats.java
@@ -236,6 +236,36 @@
mSatelliteStats.onSatelliteControllerMetrics(controllerParam);
}
+ /**
+ * Report a counter when checking result whether satellite communication is allowed or not for
+ * current location.
+ */
+ public void reportAllowedSatelliteAccessCount(boolean isAllowed) {
+ SatelliteStats.SatelliteControllerParams.Builder builder;
+ if (isAllowed) {
+ builder = new SatelliteStats.SatelliteControllerParams.Builder()
+ .setCountOfAllowedSatelliteAccess(ADD_COUNT);
+ } else {
+ builder = new SatelliteStats.SatelliteControllerParams.Builder()
+ .setCountOfDisallowedSatelliteAccess(ADD_COUNT);
+ }
+ SatelliteStats.SatelliteControllerParams controllerParam = builder.build();
+ logd("reportAllowedSatelliteAccessCount:" + controllerParam);
+ mSatelliteStats.onSatelliteControllerMetrics(controllerParam);
+ }
+
+ /**
+ * Report a counter when checking whether satellite communication for current location is
+ * allowed has failed.
+ */
+ public void reportFailedSatelliteAccessCheckCount() {
+ SatelliteStats.SatelliteControllerParams controllerParam =
+ new SatelliteStats.SatelliteControllerParams.Builder()
+ .setCountOfSatelliteAccessCheckFail(ADD_COUNT).build();
+ logd("reportFailedSatelliteAccessCheckCount:" + controllerParam);
+ mSatelliteStats.onSatelliteControllerMetrics(controllerParam);
+ }
+
/** Return the total service up time for satellite service */
@VisibleForTesting
public int captureTotalServiceUpTimeSec() {
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
index 73ede60..65181c0 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
@@ -17,13 +17,18 @@
package com.android.internal.telephony.satellite.metrics;
import static android.telephony.satellite.NtnSignalStrength.NTN_SIGNAL_STRENGTH_NONE;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import android.annotation.NonNull;
+import android.os.Bundle;
+import android.os.ResultReceiver;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteManager;
+import android.telephony.satellite.SatelliteSessionStats;
import android.util.Log;
import com.android.internal.telephony.metrics.SatelliteStats;
+import com.android.internal.telephony.satellite.DatagramDispatcher;
/**
* Stats to log to satellite session metrics
@@ -41,6 +46,8 @@
private int mSessionDurationSec;
private int mCountOfSuccessfulOutgoingDatagram;
private int mCountOfFailedOutgoingDatagram;
+ private int mCountOfTimedOutUserMessagesWaitingForConnection;
+ private int mCountOfTimedOutUserMessagesWaitingForAck;
private int mCountOfSuccessfulIncomingDatagram;
private int mCountOfIncomingDatagramFailed;
private boolean mIsDemoMode;
@@ -111,7 +118,13 @@
}
/** Increase the count of successful outgoing datagram transmission. */
- public SessionMetricsStats addCountOfSuccessfulOutgoingDatagram() {
+ public SessionMetricsStats addCountOfSuccessfulOutgoingDatagram(
+ @NonNull @SatelliteManager.DatagramType int datagramType) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
mCountOfSuccessfulOutgoingDatagram++;
logd("addCountOfSuccessfulOutgoingDatagram: current count="
+ mCountOfSuccessfulOutgoingDatagram);
@@ -119,9 +132,51 @@
}
/** Increase the count of failed outgoing datagram transmission. */
- public SessionMetricsStats addCountOfFailedOutgoingDatagram() {
+ public SessionMetricsStats addCountOfFailedOutgoingDatagram(
+ @NonNull @SatelliteManager.DatagramType int datagramType,
+ @NonNull @SatelliteManager.SatelliteResult int resultCode) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
mCountOfFailedOutgoingDatagram++;
logd("addCountOfFailedOutgoingDatagram: current count=" + mCountOfFailedOutgoingDatagram);
+
+ if (resultCode == SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE) {
+ addCountOfTimedOutUserMessagesWaitingForConnection(datagramType);
+ } else if (resultCode == SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT) {
+ addCountOfTimedOutUserMessagesWaitingForAck(datagramType);
+ }
+
+ return this;
+ }
+
+ /** Increase the count of user messages that timed out waiting for connection. */
+ private SessionMetricsStats addCountOfTimedOutUserMessagesWaitingForConnection(
+ @NonNull @SatelliteManager.DatagramType int datagramType) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
+ mCountOfTimedOutUserMessagesWaitingForConnection++;
+ logd("addCountOfTimedOutUserMessagesWaitingForConnection: current count="
+ + mCountOfTimedOutUserMessagesWaitingForConnection);
+ return this;
+ }
+
+ /** Increase the count of user messages that timed out waiting for ack. */
+ private SessionMetricsStats addCountOfTimedOutUserMessagesWaitingForAck(
+ @NonNull @SatelliteManager.DatagramType int datagramType) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
+ mCountOfTimedOutUserMessagesWaitingForAck++;
+ logd("addCountOfTimedOutUserMessagesWaitingForAck: current count="
+ + mCountOfTimedOutUserMessagesWaitingForAck);
return this;
}
@@ -180,6 +235,23 @@
initializeSessionMetricsParam();
}
+ /** Returns {@link SatelliteSessionStats} of the satellite service. */
+ public void requestSatelliteSessionStats(int subId, @NonNull ResultReceiver result) {
+ Bundle bundle = new Bundle();
+ SatelliteSessionStats sessionStats = new SatelliteSessionStats.Builder()
+ .setCountOfSuccessfulUserMessages(mCountOfSuccessfulOutgoingDatagram)
+ .setCountOfUnsuccessfulUserMessages(mCountOfFailedOutgoingDatagram)
+ .setCountOfTimedOutUserMessagesWaitingForConnection(
+ mCountOfTimedOutUserMessagesWaitingForConnection)
+ .setCountOfTimedOutUserMessagesWaitingForAck(
+ mCountOfTimedOutUserMessagesWaitingForAck)
+ .setCountOfUserMessagesInQueueToBeSent(
+ DatagramDispatcher.getInstance().getPendingUserMessagesCount())
+ .build();
+ bundle.putParcelable(SatelliteManager.KEY_SESSION_STATS, sessionStats);
+ result.send(SATELLITE_RESULT_SUCCESS, bundle);
+ }
+
/** Returns the processing time for satellite session initialization. */
public long getSessionInitializationProcessingTimeMillis() {
return mInitializationProcessingTimeMillis;
@@ -199,6 +271,8 @@
mSessionDurationSec = 0;
mCountOfSuccessfulOutgoingDatagram = 0;
mCountOfFailedOutgoingDatagram = 0;
+ mCountOfTimedOutUserMessagesWaitingForConnection = 0;
+ mCountOfTimedOutUserMessagesWaitingForAck = 0;
mCountOfSuccessfulIncomingDatagram = 0;
mCountOfIncomingDatagramFailed = 0;
mIsDemoMode = false;
diff --git a/src/java/com/android/internal/telephony/uicc/PinStorage.java b/src/java/com/android/internal/telephony/uicc/PinStorage.java
index 23769ad..e4a0cfa 100644
--- a/src/java/com/android/internal/telephony/uicc/PinStorage.java
+++ b/src/java/com/android/internal/telephony/uicc/PinStorage.java
@@ -193,9 +193,11 @@
CarrierConfigManager ccm = mContext.getSystemService(CarrierConfigManager.class);
// Callback directly handle config change and should be executed in handler thread
- ccm.registerCarrierConfigChangeListener(this::post,
- (slotIndex, subId, carrierId, specificCarrierId) ->
- onCarrierConfigurationChanged(slotIndex));
+ if (ccm != null) {
+ ccm.registerCarrierConfigChangeListener(this::post,
+ (slotIndex, subId, carrierId, specificCarrierId) ->
+ onCarrierConfigurationChanged(slotIndex));
+ }
// Initialize the long term secret key. This needs to be present in all cases:
// - if the device is not secure or is locked: key does not require user authentication
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/ConnectionTest.java
index 0bce5cb..329b0b8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ConnectionTest.java
@@ -18,6 +18,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -25,9 +26,14 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+
+import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
+import android.telephony.emergency.EmergencyNumber;
+import com.android.internal.telephony.PhoneInternalInterface.DialArgs;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import org.junit.After;
@@ -150,7 +156,7 @@
assertNull(connection1.getEmergencyNumberInfo());
assertFalse(connection1.hasKnownUserIntentEmergency());
- connection2.setEmergencyCallInfo(mPhone.getCallTracker());
+ connection2.setEmergencyCallInfo(mPhone.getCallTracker(), null);
connection2.setHasKnownUserIntentEmergency(true);
connection1.migrateFrom(connection2);
@@ -164,7 +170,7 @@
@Test
public void testEmergencyCallParameters() {
Connection connection = new TestConnection(TEST_PHONE_TYPE);
- connection.setEmergencyCallInfo(mPhone.getCallTracker());
+ connection.setEmergencyCallInfo(mPhone.getCallTracker(), null);
assertTrue(connection.isEmergencyCall());
assertEquals(getTestEmergencyNumber(), connection.getEmergencyNumberInfo());
connection.setHasKnownUserIntentEmergency(true);
@@ -186,9 +192,44 @@
.thenReturn(getTestEmergencyNumber());
//Ensure the connection is considered as an emergency call:
- mTestConnection.setEmergencyCallInfo(mCT);
+ mTestConnection.setEmergencyCallInfo(mCT, null);
assertTrue(mTestConnection.isEmergencyCall());
}
+ @Test
+ public void testUpdateEmergencyRouting() {
+ DialArgs dialArgs = new DialArgs.Builder().build();
+ Connection connection = new TestConnection(TEST_PHONE_TYPE);
+ connection.setEmergencyCallInfo(mPhone.getCallTracker(), dialArgs);
+
+ // Not updated when DomainSelectionService is disabled.
+ assertEquals(getTestEmergencyNumber(), connection.getEmergencyNumberInfo());
+
+ // Enable DomainSelectionService
+ doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported();
+ connection = new TestConnection(TEST_PHONE_TYPE);
+ connection.setEmergencyCallInfo(mPhone.getCallTracker(), dialArgs);
+
+ // Not updated when IS_EMERGENCY_ROUTING is not specified.
+ assertEquals(getTestEmergencyNumber(), connection.getEmergencyNumberInfo());
+
+ Bundle extras = new Bundle();
+ extras.putBoolean(PhoneConstants.EXTRA_USE_EMERGENCY_ROUTING, true);
+ extras.putInt(PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY,
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE);
+ dialArgs = new DialArgs.Builder().setIntentExtras(extras).build();
+
+ connection = new TestConnection(TEST_PHONE_TYPE);
+ connection.setEmergencyCallInfo(mPhone.getCallTracker(), dialArgs);
+ EmergencyNumber expectedNumber = new EmergencyNumber("911", "us", "30",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE,
+ new ArrayList<String>(), EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING,
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY);
+
+ // Updated when DomainSelectionService is enabled.
+ assertNotEquals(getTestEmergencyNumber(), connection.getEmergencyNumberInfo());
+ assertEquals(expectedNumber, connection.getEmergencyNumberInfo());
+ }
+
// TODO Verify more methods in Connection
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
index 552b5a7..4612ad9 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
@@ -65,6 +65,7 @@
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Bundle;
+import android.os.DropBoxManager;
import android.os.Handler;
import android.os.IInterface;
import android.os.PersistableBundle;
@@ -313,6 +314,8 @@
return mImsManager;
case Context.DEVICE_POLICY_SERVICE:
return mDevicePolicyManager;
+ case Context.DROPBOX_SERVICE:
+ return mDropBoxManager;
default:
return null;
}
@@ -364,6 +367,8 @@
return Context.DEVICE_POLICY_SERVICE;
} else if (serviceClass == NotificationManager.class) {
return Context.NOTIFICATION_SERVICE;
+ } else if (serviceClass == DropBoxManager.class) {
+ return Context.DROPBOX_SERVICE;
}
return super.getSystemServiceName(serviceClass);
}
@@ -739,6 +744,7 @@
private final NetworkPolicyManager mNetworkPolicyManager = mock(NetworkPolicyManager.class);
private final ImsManager mImsManager = mock(ImsManager.class);
private final DevicePolicyManager mDevicePolicyManager = mock(DevicePolicyManager.class);
+ private final DropBoxManager mDropBoxManager = mock(DropBoxManager.class);
private final Configuration mConfiguration = new Configuration();
private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
private final SharedPreferences mSharedPreferences = PreferenceManager
diff --git a/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java
index a6b2000..855a5dc 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java
@@ -18,10 +18,8 @@
import static android.telephony.TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE;
-import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA;
import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DISMISS;
-import static android.telephony.TelephonyManager.EXTRA_SUBSCRIPTION_ID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -251,6 +249,8 @@
bundle.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
+ doReturn(true).when(mFeatureFlags).resetPrimarySimDefaultValues();
+
replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
// Capture listener to emulate the carrier config change notification used later
ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
@@ -496,18 +496,9 @@
sendCarrierConfigChanged(1, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
processAllMessages();
- verify(mSubscriptionManagerService).setDefaultDataSubId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- verify(mSubscriptionManagerService).setDefaultSmsSubId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- verify(mSubscriptionManagerService, never()).setDefaultVoiceSubId(anyInt());
-
- // Verify intent sent to select sub 2 as default for all types.
- Intent intent = captureBroadcastIntent();
- assertEquals(ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED, intent.getAction());
- assertEquals(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL,
- intent.getIntExtra(EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE, -1));
- assertEquals(2, intent.getIntExtra(EXTRA_SUBSCRIPTION_ID, -1));
+ verify(mSubscriptionManagerService).setDefaultDataSubId(2);
+ verify(mSubscriptionManagerService).setDefaultSmsSubId(2);
+ verify(mSubscriptionManagerService).setDefaultVoiceSubId(2);
}
@Test
@@ -917,8 +908,7 @@
markSubscriptionInactive(1/*subid*/);
sendCarrierConfigChanged(0/*phoneid*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- verify(mSubscriptionManagerService).setDefaultDataSubId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ verify(mSubscriptionManagerService).setDefaultDataSubId(2);
// insert it back, but carrier config not loaded yet
clearInvocations(mSubscriptionManagerService);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/PhoneConfigurationManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/PhoneConfigurationManagerTest.java
index 0e04aff..b09d90d 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/PhoneConfigurationManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/PhoneConfigurationManagerTest.java
@@ -203,26 +203,40 @@
for (int i : enabledLogicalSlots) { expectedSlots.add(i); }
assertEquals(expectedSlots, mPcm.getSlotsSupportingSimultaneousCellularCalls());
}
+ @Test
+ @SmallTest
+ public void testUpdateSimultaneousCallingSupportBothInvalidSlotIds() throws Exception {
+ // Test case where both slot IDs are invalid (-1 and 5).
+ testUpdateSimultaneousCallingSupportWithInvalidSlots(Arrays.asList(-1, 5));
+ }
@Test
@SmallTest
- public void testUpdateSimultaneousCallingSupport_invalidResponse_shouldFail() throws Exception {
- doReturn(false).when(mFeatureFlags).simultaneousCallingIndications();
- init(2);
- mPcm.updateSimultaneousCallingSupport();
+ public void testUpdateSimultaneousCallingSupportOneInvalidSlotId() throws Exception {
+ // Test case where one slot ID is valid (1) and the other is invalid (2).
+ testUpdateSimultaneousCallingSupportWithInvalidSlots(Arrays.asList(1, 2));
+ }
- // Have the modem send invalid phone slots -1 and 5:
- List<Integer> invalidEnabledLogicalSlots = Arrays.asList(-1, 5);
- ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class);
- verify(mMockRadioConfig).updateSimultaneousCallingSupport(captor.capture());
- Message msg = captor.getValue();
- AsyncResult.forMessage(msg, invalidEnabledLogicalSlots, null);
- msg.sendToTarget();
- processAllMessages();
+ @Test
+ @SmallTest
+ public void testUpdateSimultaneousCallingSupportInvalidExtraSlotId() throws Exception {
+ // Test case where the number of slot IDs exceeds the phone count (2) and one slot ID is
+ // invalid (2).
+ testUpdateSimultaneousCallingSupportWithInvalidSlots(Arrays.asList(0, 1, 2));
+ }
- // We would expect to DSDA to be disabled and mSlotsSupportingSimultaneousCellularCalls to
- // have been cleared:
- assertTrue(mPcm.getSlotsSupportingSimultaneousCellularCalls().isEmpty());
+ @Test
+ @SmallTest
+ public void testUpdateSimultaneousCallingSupportInvalidSingularSlotId() throws Exception {
+ // Test case where only a single, invalid slot ID (0) is provided.
+ testUpdateSimultaneousCallingSupportWithInvalidSlots(List.of(0));
+ }
+
+ @Test
+ @SmallTest
+ public void testUpdateSimultaneousCallingSupportInvalidEmptySlotIds() throws Exception {
+ // Test case where an empty list of slot IDs is provided.
+ testUpdateSimultaneousCallingSupportWithInvalidSlots(List.of());
}
/**
@@ -576,4 +590,28 @@
assertEquals(capability, mPcm.getStaticPhoneCapability());
}
+
+ private void testUpdateSimultaneousCallingSupportWithInvalidSlots(List<Integer> invalidSlots)
+ throws Exception {
+ doReturn(false).when(mFeatureFlags).simultaneousCallingIndications();
+ init(2);
+ mPcm.updateSimultaneousCallingSupport();
+
+ sendInvalidSlotsToModem(invalidSlots);
+ processAllMessages();
+
+ assertDsdaDisabledAndSlotsCleared();
+ }
+
+ private void sendInvalidSlotsToModem(List<Integer> invalidSlots) {
+ ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class);
+ verify(mMockRadioConfig).updateSimultaneousCallingSupport(captor.capture());
+ Message msg = captor.getValue();
+ AsyncResult.forMessage(msg, invalidSlots, null);
+ msg.sendToTarget();
+ }
+
+ private void assertDsdaDisabledAndSlotsCleared() {
+ assertTrue(mPcm.getSlotsSupportingSimultaneousCellularCalls().isEmpty());
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index fd99ad0..e3da458 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -3471,9 +3471,12 @@
AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
assertEquals(2, nriList.size());
for (NetworkRegistrationInfo nri : nriList) {
- assertTrue(Arrays.equals(satelliteSupportedServices, nri.getAvailableServices().stream()
- .mapToInt(Integer::intValue)
- .toArray()));
+ if (nri.isInService()) {
+ assertTrue(Arrays.equals(satelliteSupportedServices,
+ nri.getAvailableServices().stream()
+ .mapToInt(Integer::intValue)
+ .toArray()));
+ }
}
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SimultaneousCallingTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SimultaneousCallingTrackerTest.java
index 879b184..054df07 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SimultaneousCallingTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SimultaneousCallingTrackerTest.java
@@ -254,7 +254,7 @@
/**
* Test that simultaneous calling is not supported when IMS is not registered and cellular
- * simultaneous calling is only supported for one SIM subscription.
+ * simultaneous calling is not supported for any SIM subscriptions.
*/
@Test
@SmallTest
@@ -264,8 +264,8 @@
init(2);
setAndVerifyStaticCapability(STATIC_DSDA_CAPABILITY);
- // Have the modem inform telephony that only phone slot 0 supports DSDA:
- List<Integer> enabledLogicalSlots = List.of(0);
+ // Have the modem inform telephony that no phone slots currently support DSDA:
+ List<Integer> enabledLogicalSlots = List.of();
setAndVerifySlotsSupportingSimultaneousCellularCalling(enabledLogicalSlots);
// Trigger onSubscriptionsChanged by updating the subscription ID of a phone slot:
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java
index ddbe9c0..0e2676e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/AutoDataSwitchControllerTest.java
@@ -93,8 +93,10 @@
private TelephonyDisplayInfo mGoodTelephonyDisplayInfo;
private TelephonyDisplayInfo mBadTelephonyDisplayInfo;
private int mDefaultDataSub;
+ private DataEvaluation mDataEvaluation;
private AutoDataSwitchController mAutoDataSwitchControllerUT;
private Map<Integer, AlarmManager.OnAlarmListener> mEventsToAlarmListener;
+ private Map<Integer, Object> mScheduledEventsToExtras;
@Before
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
@@ -137,6 +139,8 @@
doAnswer(invocation -> phone.getSubId() == mDefaultDataSub)
.when(phone).isUserDataEnabled();
}
+ mDataEvaluation = new DataEvaluation(DataEvaluation.DataEvaluationReason.EXTERNAL_QUERY);
+ doReturn(mDataEvaluation).when(mDataNetworkController).getInternetEvaluation(anyBoolean());
doReturn(new int[]{SUB_1, SUB_2}).when(mSubscriptionManagerService)
.getActiveSubIdList(true);
doAnswer(invocation -> {
@@ -184,9 +188,12 @@
mAutoDataSwitchControllerUT, mMockedAlarmManager);
mEventsToAlarmListener = getPrivateField(mAutoDataSwitchControllerUT,
"mEventsToAlarmListener", Map.class);
+ mScheduledEventsToExtras = getPrivateField(mAutoDataSwitchControllerUT,
+ "mScheduledEventsToExtras", Map.class);
doReturn(true).when(mFeatureFlags).autoDataSwitchAllowRoaming();
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
+ doReturn(true).when(mFeatureFlags).autoDataSwitchUsesDataEnabled();
}
@After
@@ -240,7 +247,10 @@
prepareIdealUsesNonDdsCondition();
processAllFutureMessages();
clearInvocations(mMockedPhoneSwitcherCallback);
- doReturn(false).when(mPhone2).isDataAllowed();
+ mDataEvaluation.addDataDisallowedReason(DataEvaluation.DataDisallowedReason
+ .NO_SUITABLE_DATA_PROFILE);
+ doReturn(mDataEvaluation)
+ .when(mDataNetworkController).getInternetEvaluation(anyBoolean());
mAutoDataSwitchControllerUT.evaluateAutoDataSwitch(EVALUATION_REASON_DATA_SETTINGS_CHANGED);
processAllFutureMessages();
@@ -350,7 +360,6 @@
@Test
public void testRoaming_same_roaming_condition_uses_rat_signalStrength() {
- doReturn(true).when(mFeatureFlags).autoDataSwitchRatSs();
// On primary phone
// 1. Both roaming, user allow roaming on both phone, uses RAT score to decide switch.
prepareIdealUsesNonDdsCondition();
@@ -375,7 +384,6 @@
@Test
public void testCancelSwitch_onPrimary_rat_signalStrength() {
- doReturn(true).when(mFeatureFlags).autoDataSwitchRatSs();
// 4.1.1 Display info and signal strength on secondary phone became bad,
// but primary is still OOS, so still switch to the secondary.
prepareIdealUsesNonDdsCondition();
@@ -467,7 +475,7 @@
prepareIdealUsesNonDdsCondition();
// 2.2 Auto switch feature is disabled, no need validation
clearInvocations(mCellularNetworkValidator);
- doReturn(false).when(mPhone2).isDataAllowed();
+ mDataEvaluation.addDataDisallowedReason(DataEvaluation.DataDisallowedReason.DATA_DISABLED);
mAutoDataSwitchControllerUT.evaluateAutoDataSwitch(EVALUATION_REASON_DATA_SETTINGS_CHANGED);
processAllFutureMessages();
@@ -483,11 +491,13 @@
verify(mMockedPhoneSwitcherCallback).onRequireValidation(DEFAULT_PHONE_INDEX,
false/*needValidation*/);
+
+ clearInvocations(mMockedPhoneSwitcherCallback);
+ prepareIdealUsesNonDdsCondition();
}
@Test
public void testOnNonDdsSwitchBackToPrimary_rat_signalStrength() {
- doReturn(true).when(mFeatureFlags).autoDataSwitchRatSs();
prepareIdealUsesNonDdsCondition();
processAllFutureMessages();
doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
@@ -536,10 +546,16 @@
@Test
public void testStabilityCheckOverride_basic() {
+ // Disable RAT + signalStrength base switching.
+ doReturn(-1).when(mDataConfigManager).getAutoDataSwitchScoreTolerance();
+ mAutoDataSwitchControllerUT = new AutoDataSwitchController(mContext, Looper.myLooper(),
+ mPhoneSwitcher, mFeatureFlags, mMockedPhoneSwitcherCallback);
+
// Starting stability check for switching to non-DDS
prepareIdealUsesNonDdsCondition();
- processAllMessages();
+ processAllFutureMessages();
+ clearInvocations(mMockedPhoneSwitcherCallback);
// Switch success, but the previous stability check is still pending
doReturn(PHONE_2).when(mPhoneSwitcher).getPreferredDataPhoneId();
@@ -557,7 +573,6 @@
@Test
public void testStabilityCheckOverride_uses_rat_signalStrength() {
- doReturn(true).when(mFeatureFlags).autoDataSwitchRatSs();
// Switching due to availability first.
prepareIdealUsesNonDdsCondition();
@@ -578,6 +593,7 @@
public void testValidationFailedRetry() {
prepareIdealUsesNonDdsCondition();
+ clearInvocations(mMockedPhoneSwitcherCallback);
for (int i = 0; i < MAX_RETRY; i++) {
mAutoDataSwitchControllerUT.evaluateRetryOnValidationFailed();
processAllFutureMessages();
@@ -730,7 +746,7 @@
// 4.2 Auto switch feature is enabled
doReturn(true).when(mPhone2).getDataRoamingEnabled();
- doReturn(true).when(mPhone2).isDataAllowed();
+ mDataEvaluation.addDataAllowedReason(DataEvaluation.DataAllowedReason.NORMAL);
// 5. No default network
mAutoDataSwitchControllerUT.updateDefaultNetworkCapabilities(null /*networkCapabilities*/);
@@ -783,10 +799,12 @@
@Override
public void processAllFutureMessages() {
- if (mFeatureFlags.autoDataSwitchRatSs()
- && mEventsToAlarmListener.containsKey(EVENT_STABILITY_CHECK_PASSED)) {
+ if (mScheduledEventsToExtras.containsKey(EVENT_STABILITY_CHECK_PASSED)) {
mEventsToAlarmListener.get(EVENT_STABILITY_CHECK_PASSED).onAlarm();
}
+ if (mScheduledEventsToExtras.containsKey(EVENT_EVALUATE_AUTO_SWITCH)) {
+ mEventsToAlarmListener.get(EVENT_EVALUATE_AUTO_SWITCH).onAlarm();
+ }
super.processAllFutureMessages();
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
index f418523..60dcb59 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -185,7 +185,6 @@
private LinkBandwidthEstimatorCallback mLinkBandwidthEstimatorCallback;
private boolean mIsNonTerrestrialNetwork = false;
- private FeatureFlags mFeatureFlags;
private final DataProfile mGeneralPurposeDataProfile = new DataProfile.Builder()
.setApnSetting(new ApnSetting.Builder()
@@ -864,7 +863,6 @@
mMockedDataNetworkControllerCallback = Mockito.mock(DataNetworkControllerCallback.class);
mMockedDataRetryManagerCallback = Mockito.mock(DataRetryManagerCallback.class);
mMockSubInfo = Mockito.mock(SubscriptionInfo.class);
- mFeatureFlags = Mockito.mock(FeatureFlags.class);
when(mTelephonyComponentFactory.makeDataSettingsManager(any(Phone.class),
any(DataNetworkController.class), any(FeatureFlags.class), any(Looper.class),
any(DataSettingsManager.DataSettingsManagerCallback.class))).thenCallRealMethod();
@@ -892,6 +890,8 @@
.when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt());
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
doReturn(true).when(mFeatureFlags).satelliteInternet();
+ doReturn(true).when(mFeatureFlags)
+ .ignoreExistingNetworksForInternetAllowedChecking();
List<SubscriptionInfo> infoList = new ArrayList<>();
infoList.add(mMockSubInfo);
@@ -5052,18 +5052,84 @@
@Test
public void testNonTerrestrialNetwork() throws Exception {
+ TelephonyNetworkRequest request;
mIsNonTerrestrialNetwork = true;
serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
- mDataNetworkControllerUT.addNetworkRequest(
- createNetworkRequest(false, NetworkCapabilities.NET_CAPABILITY_RCS));
+ // By default, Test only support restricted network, regardless whether constrained.
+ // Verify not_restricted network not supported.
+ request = createNetworkRequest(false, NetworkCapabilities.NET_CAPABILITY_RCS);
+ mDataNetworkControllerUT.addNetworkRequest(request);
processAllMessages();
verifyAllDataDisconnected();
+ mDataNetworkControllerUT.removeNetworkRequest(request);
- mDataNetworkControllerUT.addNetworkRequest(
- createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_RCS));
+ // Verify restricted network is supported.
+ request = createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_RCS);
+ mDataNetworkControllerUT.addNetworkRequest(request);
processAllMessages();
verifyConnectedNetworkHasDataProfile(mNtnDataProfile);
+ mDataNetworkControllerUT.removeNetworkRequest(request);
+ getDataNetworks().get(0).tearDown(DataNetwork
+ .TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED);
+
+ // Test constrained network is supported, regardless whether it's restricted
+ processAllFutureMessages();
+ verifyAllDataDisconnected();
+ mCarrierConfig.putInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
+ CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED);
+ carrierConfigChanged();
+ // Verify not_restricted, not_constrained network not supported.
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
+ try {
+ netCaps.addCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ } catch (Exception ignored) { }
+ request = new TelephonyNetworkRequest(new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
+
+ mDataNetworkControllerUT.addNetworkRequest(request);
+ processAllMessages();
+ verifyAllDataDisconnected();
+ mDataNetworkControllerUT.removeNetworkRequest(request);
+
+ // Verify restricted, not_constrained network is supported.
+ netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+ try {
+ netCaps.addCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ } catch (Exception ignored) { }
+ request = new TelephonyNetworkRequest(new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
+ mDataNetworkControllerUT.addNetworkRequest(request);
+ processAllMessages();
+ verifyConnectedNetworkHasDataProfile(mNtnDataProfile);
+ mDataNetworkControllerUT.removeNetworkRequest(request);
+ getDataNetworks().get(0).tearDown(DataNetwork
+ .TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED);
+
+ // TODO(enable after NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED become a default cap)
+ // Test not constrained network supported
+// processAllFutureMessages();
+// verifyAllDataDisconnected();
+// mCarrierConfig.putInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
+// CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL);
+// carrierConfigChanged();
+//
+// netCaps = new NetworkCapabilities();
+// netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
+// try {
+// netCaps.addCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+// } catch (Exception ignored) {}
+// mDataNetworkControllerUT.addNetworkRequest(
+// new TelephonyNetworkRequest(new NetworkRequest(netCaps,
+// ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+// NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags));
+// processAllMessages();
+// verifyConnectedNetworkHasDataProfile(mNtnDataProfile);
}
@Test
@@ -5394,4 +5460,14 @@
verify(mMockedDataNetworkControllerCallback, never()).onAnyDataNetworkExistingChanged(
anyBoolean());
}
+
+ @Test
+ public void testGetInternetEvaluation() throws Exception {
+ testSetupDataNetwork();
+ doReturn(true).when(mSST).isPendingRadioPowerOffAfterDataOff();
+ assertThat(mDataNetworkControllerUT.getInternetEvaluation(false/*ignoreExistingNetworks*/)
+ .containsDisallowedReasons()).isFalse();
+ assertThat(mDataNetworkControllerUT.getInternetEvaluation(true/*ignoreExistingNetworks*/)
+ .containsDisallowedReasons()).isTrue();
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
index d5a52ea..7795e42 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -53,6 +53,7 @@
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Annotation;
import android.telephony.Annotation.DataFailureCause;
+import android.telephony.CarrierConfigManager;
import android.telephony.DataFailCause;
import android.telephony.DataSpecificRegistrationInfo;
import android.telephony.LteVopsSupportInfo;
@@ -333,33 +334,40 @@
private void serviceStateChanged(@Annotation.NetworkType int networkType,
@NetworkRegistrationInfo.RegistrationState int regState,
DataSpecificRegistrationInfo dsri, boolean isNtn) {
- ServiceState ss = new ServiceState();
- ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ doReturn(isNtn).when(mServiceState).isUsingNonTerrestrialNetwork();
+
+ doReturn(new NetworkRegistrationInfo.Builder()
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
.setAccessNetworkTechnology(networkType)
.setRegistrationState(regState)
.setDomain(NetworkRegistrationInfo.DOMAIN_PS)
.setDataSpecificInfo(dsri)
.setIsNonTerrestrialNetwork(isNtn)
- .build());
+ .build()).when(mServiceState)
+ .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
- ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ doReturn(new NetworkRegistrationInfo.Builder()
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)
.setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
.setDomain(NetworkRegistrationInfo.DOMAIN_PS)
- .build());
+ .build()).when(mServiceState)
+ .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
- ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ doReturn(new NetworkRegistrationInfo.Builder()
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
.setAccessNetworkTechnology(networkType)
.setRegistrationState(regState)
.setDomain(NetworkRegistrationInfo.DOMAIN_CS)
- .build());
- ss.setDataRoamingFromRegistration(regState
- == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
- doReturn(ss).when(mSST).getServiceState();
- doReturn(ss).when(mPhone).getServiceState();
+ .build()).when(mServiceState)
+ .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_CS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+
+ boolean isRoaming = regState == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING;
+ doReturn(isRoaming).when(mServiceState).getDataRoamingFromRegistration();
+ doReturn(isRoaming).when(mServiceState).getDataRoaming();
if (mDataNetworkUT != null) {
mDataNetworkUT.obtainMessage(9/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget();
@@ -420,6 +428,8 @@
doReturn(Set.of(NetworkCapabilities.NET_CAPABILITY_IMS,
NetworkCapabilities.NET_CAPABILITY_EIMS, NetworkCapabilities.NET_CAPABILITY_XCAP))
.when(mDataConfigManager).getForcedCellularTransportCapabilities();
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED)
+ .when(mDataConfigManager).getSatelliteDataSupportMode();
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
doReturn(true).when(mFeatureFlags).satelliteInternet();
@@ -2373,6 +2383,7 @@
}
private void setupNonTerrestrialDataNetwork() {
+ doReturn(true).when(mServiceState).isUsingNonTerrestrialNetwork();
NetworkRequestList networkRequestList = new NetworkRequestList();
networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
@@ -2387,6 +2398,8 @@
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
DataAllowedReason.NORMAL, mDataNetworkCallback);
processAllMessages();
+
+ assertThat(mDataNetworkUT.isSatellite()).isTrue();
}
private void setupTerrestrialDataNetwork() {
@@ -2509,6 +2522,42 @@
}
@Test
+ public void testUnrestrictedSatelliteNetworkCapabilities() {
+ setupNonTerrestrialDataNetwork();
+ assertThat(mDataNetworkUT.isSatellite()).isTrue();
+
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isFalse();
+
+ // Test constrained traffic
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED)
+ .when(mDataConfigManager).getSatelliteDataSupportMode();
+ mDataNetworkUT.sendMessage(22/*EVENT_VOICE_CALL_STARTED*/); // update network capabilities
+ processAllMessages();
+
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isTrue();
+ try {
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)).isFalse();
+ } catch (Exception ignored) { }
+
+ // Test not constrained traffic
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL)
+ .when(mDataConfigManager).getSatelliteDataSupportMode();
+ mDataNetworkUT.sendMessage(22/*EVENT_VOICE_CALL_STARTED*/); // update network capabilities
+ processAllMessages();
+
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isTrue();
+ // TODO(enable after NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED become a default cap)
+// try {
+// assertThat(mDataNetworkUT.getNetworkCapabilities()
+// .hasCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)).isTrue();
+// } catch (Exception ignored) {}
+ }
+
+ @Test
public void testIsTransportSatelliteSupportNonImsNonTerrestrialNetwork() throws Exception {
// Service state at Non-terrestrial network
serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkRequestTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkRequestTest.java
index 1517006..9f11a3a 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkRequestTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkRequestTest.java
@@ -168,18 +168,12 @@
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build(), mPhone, mFeatureFlags);
- assertThat(internetRequest.getCapabilities()).isEqualTo(
- new int[]{NetworkCapabilities.NET_CAPABILITY_INTERNET,
- NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED,
- NetworkCapabilities.NET_CAPABILITY_TRUSTED,
- NetworkCapabilities.NET_CAPABILITY_NOT_VPN,
- NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED});
+ assertThat(internetRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED))
+ .isTrue();
assertThat(internetRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN))
.isTrue();
assertThat(internetRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
.isTrue();
- assertThat(internetRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN))
- .isTrue();
assertThat(internetRequest.hasCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)).isTrue();
assertThat(internetRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS))
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionControllerTest.java
index f5ccdd6..a55ad69 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionControllerTest.java
@@ -16,8 +16,11 @@
package com.android.internal.telephony.domainselection;
+import static android.telephony.DomainSelectionService.SELECTOR_TYPE_CALLING;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -36,6 +39,8 @@
import android.os.Looper;
import android.os.RemoteException;
import android.telephony.DomainSelectionService;
+import android.telephony.TelephonyManager;
+import android.test.mock.MockContext;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -71,6 +76,8 @@
}
};
+ Context mTestContext;
+
// Mocked classes
IDomainSelectionServiceController mMockServiceControllerBinder;
Context mMockContext;
@@ -84,9 +91,40 @@
public void setUp() throws Exception {
super.setUp(this.getClass().getSimpleName());
+ when(mTelephonyManager.getSupportedModemCount()).thenReturn(2);
mMockContext = mock(Context.class);
+ mTestContext = new MockContext() {
+ @Override
+ public String getSystemServiceName(Class<?> serviceClass) {
+ if (serviceClass == TelephonyManager.class) {
+ return Context.TELEPHONY_SERVICE;
+ }
+ return super.getSystemServiceName(serviceClass);
+ }
+
+ @Override
+ public Object getSystemService(String name) {
+ switch (name) {
+ case (Context.TELEPHONY_SERVICE) : {
+ return mTelephonyManager;
+ }
+ }
+ return super.getSystemService(name);
+ }
+
+ @Override
+ public boolean bindService(Intent service, ServiceConnection conn, int flags) {
+ return mMockContext.bindService(service, conn, flags);
+ }
+
+ @Override
+ public void unbindService(ServiceConnection conn) {
+ mMockContext.unbindService(conn);
+ }
+ };
+
mMockServiceControllerBinder = mock(IDomainSelectionServiceController.class);
- mTestController = new DomainSelectionController(mMockContext,
+ mTestController = new DomainSelectionController(mTestContext,
Looper.getMainLooper(), BIND_RETRY);
mHandler = mTestController.getHandlerForTest();
@@ -264,6 +302,17 @@
verify(mMockContext, times(1)).bindService(any(), any(), anyInt());
}
+ @SmallTest
+ @Test
+ public void testGetDomainSelectionConnection() throws Exception {
+ when(mPhone.getPhoneId()).thenReturn(1);
+ DomainSelectionConnection dsc = mTestController.getDomainSelectionConnection(
+ mPhone, SELECTOR_TYPE_CALLING, false);
+
+ assertNotNull(dsc);
+ assertTrue(dsc instanceof NormalCallDomainSelectionConnection);
+ }
+
private void bindAndNullServiceError() {
ServiceConnection connection = bindService(mTestComponentName);
connection.onNullBinding(mTestComponentName);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java
index 5ac21f8..7374aef 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java
@@ -40,6 +40,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession;
+import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import org.junit.After;
import org.junit.Before;
@@ -356,4 +357,55 @@
assertFalse(stats.isNtn);
}
+
+ @Test
+ public void testIsProvisioningProfile() {
+ SubscriptionInfoInternal mSubInfoInternal = new SubscriptionInfoInternal.Builder()
+ .setProfileClass(mSubscriptionManager.PROFILE_CLASS_PROVISIONING).build();
+
+ when(mSubscriptionManagerService.getSubscriptionInfoInternal(mPhone.getSubId()))
+ .thenReturn(mSubInfoInternal);
+
+ mDataCallSessionStats.onSetupDataCall(ApnSetting.TYPE_IMS, false);
+ mDataCallSessionStats.onSetupDataCallResponse(
+ mDefaultImsResponse,
+ TelephonyManager.NETWORK_TYPE_IWLAN,
+ ApnSetting.TYPE_IMS,
+ ApnSetting.PROTOCOL_IP,
+ DataFailCause.NONE);
+
+ mDataCallSessionStats.setTimeMillis(60000L);
+ mDataCallSessionStats.conclude();
+
+ ArgumentCaptor<DataCallSession> callCaptor =
+ ArgumentCaptor.forClass(DataCallSession.class);
+ verify(mPersistAtomsStorage, times(1)).addDataCallSession(
+ callCaptor.capture());
+ DataCallSession stats = callCaptor.getValue();
+
+ assertTrue(stats.isProvisioningProfile);
+
+ reset(mPersistAtomsStorage);
+
+ mSubInfoInternal = new SubscriptionInfoInternal.Builder()
+ .setProfileClass(mSubscriptionManager.PROFILE_CLASS_OPERATIONAL).build();
+
+ when(mSubscriptionManagerService.getSubscriptionInfoInternal(mPhone.getSubId()))
+ .thenReturn(mSubInfoInternal);
+
+ mDataCallSessionStats.onSetupDataCall(ApnSetting.TYPE_IMS, false);
+ mDataCallSessionStats.onSetupDataCallResponse(
+ mDefaultImsResponse,
+ TelephonyManager.NETWORK_TYPE_IWLAN,
+ ApnSetting.TYPE_IMS,
+ ApnSetting.PROTOCOL_IP,
+ DataFailCause.NONE);
+
+ mDataCallSessionStats.setTimeMillis(60000L);
+ mDataCallSessionStats.conclude();
+ verify(mPersistAtomsStorage).addDataCallSession(callCaptor.capture());
+ stats = callCaptor.getValue();
+
+ assertFalse(stats.isProvisioningProfile);
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
index a9b183f..8ee3a37 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
@@ -20,6 +20,7 @@
import static android.telephony.SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY;
import static android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
@@ -44,6 +45,10 @@
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MO;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MT;
+import static com.android.internal.telephony.satellite.SatelliteConstants.ACCESS_CONTROL_TYPE_CURRENT_LOCATION;
+import static com.android.internal.telephony.satellite.SatelliteConstants.ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE;
+import static com.android.internal.telephony.satellite.SatelliteConstants.CONFIG_DATA_SOURCE_CONFIG_UPDATER;
+import static com.android.internal.telephony.satellite.SatelliteConstants.CONFIG_DATA_SOURCE_DEVICE_CONFIG;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
@@ -96,6 +101,7 @@
import com.android.internal.telephony.nano.PersistAtomsProto.PresenceNotifyEvent;
import com.android.internal.telephony.nano.PersistAtomsProto.RcsAcsProvisioningStats;
import com.android.internal.telephony.nano.PersistAtomsProto.RcsClientProvisioningStats;
+import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteAccessController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement;
@@ -129,6 +135,7 @@
import java.util.Comparator;
import java.util.LinkedList;
import java.util.Queue;
+import java.util.concurrent.TimeUnit;
public class PersistAtomsStorageTest extends TelephonyTest {
private static final String TEST_FILE = "PersistAtomsStorageTest.pb";
@@ -316,6 +323,10 @@
private SatelliteConfigUpdater mSatelliteConfigUpdater2;
private SatelliteConfigUpdater[] mSatelliteConfigUpdaters;
+ private SatelliteAccessController mSatelliteAccessController1;
+ private SatelliteAccessController mSatelliteAccessController2;
+ private SatelliteAccessController[] mSatelliteAccessControllers;
+
private void makeTestData() {
// MO call with SRVCC (LTE to UMTS)
mCall1Proto = new VoiceCallSession();
@@ -1022,6 +1033,7 @@
mIncomingSms1.count = 1;
mIncomingSms1.isManagedProfile = false;
mIncomingSms1.isNtn = false;
+ mIncomingSms1.isEmergency = true;
mIncomingSms2 = new IncomingSms();
mIncomingSms2.smsFormat = INCOMING_SMS__SMS_FORMAT__SMS_FORMAT_3GPP2;
@@ -1041,6 +1053,7 @@
mIncomingSms2.count = 2;
mIncomingSms2.isManagedProfile = true;
mIncomingSms2.isNtn = true;
+ mIncomingSms2.isEmergency = true;
mIncomingSms = new IncomingSms[] {mIncomingSms1, mIncomingSms2};
@@ -1390,6 +1403,32 @@
mSatelliteConfigUpdaters = new SatelliteConfigUpdater[] {mSatelliteConfigUpdater1,
mSatelliteConfigUpdater2};
+
+ mSatelliteAccessController1 = new SatelliteAccessController();
+ mSatelliteAccessController1.accessControlType = ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE;
+ mSatelliteAccessController1.locationQueryTimeMillis = TimeUnit.SECONDS.toMillis(1);
+ mSatelliteAccessController1.onDeviceLookupTimeMillis = TimeUnit.SECONDS.toMillis(2);
+ mSatelliteAccessController1.totalCheckingTimeMillis = TimeUnit.SECONDS.toMillis(3);
+ mSatelliteAccessController1.isAllowed = true;
+ mSatelliteAccessController1.isEmergency = false;
+ mSatelliteAccessController1.resultCode = SATELLITE_RESULT_SUCCESS;
+ mSatelliteAccessController1.countryCodes = new String[]{"AB", "CD"};
+ mSatelliteAccessController1.configDataSource = CONFIG_DATA_SOURCE_DEVICE_CONFIG;
+
+ mSatelliteAccessController2 = new SatelliteAccessController();
+ mSatelliteAccessController1.accessControlType = ACCESS_CONTROL_TYPE_CURRENT_LOCATION;
+ mSatelliteAccessController1.locationQueryTimeMillis = TimeUnit.SECONDS.toMillis(4);
+ mSatelliteAccessController2.onDeviceLookupTimeMillis = TimeUnit.SECONDS.toMillis(5);
+ mSatelliteAccessController2.totalCheckingTimeMillis = TimeUnit.SECONDS.toMillis(6);
+ mSatelliteAccessController2.isAllowed = false;
+ mSatelliteAccessController2.isEmergency = true;
+ mSatelliteAccessController2.resultCode = SATELLITE_RESULT_SUCCESS;
+ mSatelliteAccessController2.countryCodes = new String[]{"EF", "GH"};
+ mSatelliteAccessController2.configDataSource = CONFIG_DATA_SOURCE_CONFIG_UPDATER;
+
+ mSatelliteAccessControllers = new SatelliteAccessController[]{
+ mSatelliteAccessController1, mSatelliteAccessController2
+ };
}
private void generateTestDataNetworkValidationsData() {
@@ -1628,6 +1667,9 @@
mSatelliteConfigUpdater1 = null;
mSatelliteConfigUpdater2 = null;
mSatelliteConfigUpdaters = null;
+ mSatelliteAccessController1 = null;
+ mSatelliteAccessController2 = null;
+ mSatelliteAccessControllers = null;
super.tearDown();
}
@@ -5182,6 +5224,63 @@
}
@Test
+ public void addSatelliteAccessControllerStats_emptyProto() throws Exception {
+ createEmptyTestFile();
+ mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
+ mPersistAtomsStorage.addSatelliteAccessControllerStats(
+ mSatelliteAccessController1);
+ mPersistAtomsStorage.incTimeMillis(100L);
+
+ // Service state and service switch should be added successfully
+ verifyCurrentStateSavedToFileOnce();
+ SatelliteAccessController[] output =
+ mPersistAtomsStorage.getSatelliteAccessControllerStats(0L);
+ assertProtoArrayEquals(
+ new SatelliteAccessController[] {mSatelliteAccessController1}, output);
+ }
+
+ @Test
+ public void addSatelliteAccessControllerStats_tooManyEntries() throws Exception {
+ createEmptyTestFile();
+ mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
+
+ // Store atoms up to maximum number + 1
+ int maxCount = 15 + 1;
+ for (int i = 0; i < maxCount; i++) {
+ mPersistAtomsStorage
+ .addSatelliteAccessControllerStats(//mSatelliteAccessController1);
+ copyOf(mSatelliteAccessController1));
+ mPersistAtomsStorage.incTimeMillis(100L);
+ }
+
+ // Store 1 different atom
+ mPersistAtomsStorage
+ .addSatelliteAccessControllerStats(mSatelliteAccessController2);
+ mPersistAtomsStorage.incTimeMillis(100L);
+
+ verifyCurrentStateSavedToFileOnce();
+
+ SatelliteAccessController[] result =
+ mPersistAtomsStorage.getSatelliteAccessControllerStats(0L);
+ // First atom should have count 14, the other should have 1
+ assertHasStatsAndCount(result, mSatelliteAccessController1, 14);
+ assertHasStatsAndCount(result, mSatelliteAccessController2, 1);
+ }
+
+ @Test
+ public void getSatelliteAccessControllerStats_tooFrequent() throws Exception {
+ createTestFile(START_TIME_MILLIS);
+
+ mPersistAtomsStorage = new TestablePersistAtomsStorage(mContext);
+ mPersistAtomsStorage.incTimeMillis(50L); // pull interval less than minimum
+ SatelliteAccessController[] output =
+ mPersistAtomsStorage.getSatelliteAccessControllerStats(100L);
+
+ // Should be denied
+ assertNull(output);
+ }
+
+ @Test
@SmallTest
public void addDataNetworkValidation_newEntry() throws Exception {
createEmptyTestFile();
@@ -5347,6 +5446,7 @@
atoms.satelliteEntitlementPullTimestampMillis = lastPullTimeMillis;
atoms.satelliteConfigUpdater = mSatelliteConfigUpdaters;
atoms.satelliteConfigUpdaterPullTimestampMillis = lastPullTimeMillis;
+ atoms.satelliteAccessControllerPullTimestampMillis = lastPullTimeMillis;
FileOutputStream stream = new FileOutputStream(mTestFile);
stream.write(PersistAtoms.toByteArray(atoms));
stream.close();
@@ -5533,6 +5633,11 @@
return SatelliteConfigUpdater.parseFrom(MessageNano.toByteArray(source));
}
+ private static SatelliteAccessController copyOf(SatelliteAccessController source)
+ throws Exception {
+ return SatelliteAccessController.parseFrom(MessageNano.toByteArray(source));
+ }
+
private void assertAllPullTimestampEquals(long timestamp) {
assertEquals(
timestamp,
@@ -5825,6 +5930,28 @@
assertEquals(expectedCount, actualCount);
}
+ private static void assertHasStatsAndCount(
+ SatelliteAccessController[] tested,
+ @Nullable SatelliteAccessController expectedStats, int expectedCount) {
+ assertNotNull(tested);
+ int actualCount = 0;
+ for (SatelliteAccessController stats : tested) {
+ if (stats.accessControlType
+ == expectedStats.accessControlType
+ && stats.locationQueryTimeMillis == expectedStats.locationQueryTimeMillis
+ && stats.onDeviceLookupTimeMillis == expectedStats.onDeviceLookupTimeMillis
+ && stats.totalCheckingTimeMillis == expectedStats.totalCheckingTimeMillis
+ && stats.isAllowed == expectedStats.isAllowed
+ && stats.isEmergency == expectedStats.isEmergency
+ && stats.resultCode == expectedStats.resultCode
+ && Arrays.equals(stats.countryCodes, expectedStats.countryCodes)
+ && stats.configDataSource == expectedStats.configDataSource) {
+ actualCount++;
+ }
+ }
+ assertEquals(expectedCount, actualCount);
+ }
+
private static void assertHasStatsAndCountDuration(
RcsAcsProvisioningStats[] statses,
@Nullable RcsAcsProvisioningStats expectedStats, int count, long duration) {
@@ -5981,7 +6108,8 @@
&& incomingSms.carrierId == expectedIncomingSms.carrierId
&& incomingSms.messageId == expectedIncomingSms.messageId
&& incomingSms.isManagedProfile == expectedIncomingSms.isManagedProfile
- && incomingSms.isNtn == expectedIncomingSms.isNtn) {
+ && incomingSms.isNtn == expectedIncomingSms.isNtn
+ && incomingSms.isEmergency == expectedIncomingSms.isEmergency) {
actualCount = incomingSms.count;
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
index daa47c1..cda96ef 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
@@ -17,6 +17,10 @@
package com.android.internal.telephony.metrics;
import static android.telephony.satellite.NtnSignalStrength.NTN_SIGNAL_STRENGTH_GOOD;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
+
+import static com.android.internal.telephony.satellite.SatelliteConstants.CONFIG_DATA_SOURCE_DEVICE_CONFIG;
+import static com.android.internal.telephony.satellite.SatelliteConstants.ACCESS_CONTROL_TYPE_CACHED_COUNTRY_CODE;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;
@@ -28,6 +32,7 @@
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteControllerStats;
import com.android.internal.telephony.nano.PersistAtomsProto.CarrierRoamingSatelliteSession;
+import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteAccessController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteConfigUpdater;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteEntitlement;
@@ -42,6 +47,8 @@
import org.junit.Test;
import org.mockito.ArgumentCaptor;
+import java.util.concurrent.TimeUnit;
+
public class SatelliteStatsTest extends TelephonyTest {
private static final String TAG = SatelliteStatsTest.class.getSimpleName();
@@ -436,4 +443,38 @@
verifyNoMoreInteractions(mPersistAtomsStorage);
}
+
+
+ @Test
+ public void onSatelliteAccessControllerMetrics_withAtoms() {
+ SatelliteStats.SatelliteAccessControllerParams param =
+ new SatelliteStats.SatelliteAccessControllerParams.Builder()
+ .setAccessControlType(ACCESS_CONTROL_TYPE_CACHED_COUNTRY_CODE)
+ .setLocationQueryTime(TimeUnit.SECONDS.toMillis(1))
+ .setOnDeviceLookupTime(TimeUnit.SECONDS.toMillis(2))
+ .setTotalCheckingTime(TimeUnit.SECONDS.toMillis(3))
+ .setIsAllowed(true)
+ .setIsEmergency(false)
+ .setResult(SATELLITE_RESULT_SUCCESS)
+ .setCountryCodes(new String[]{"AB", "CD"})
+ .setConfigDatasource(CONFIG_DATA_SOURCE_DEVICE_CONFIG)
+ .build();
+
+ mSatelliteStats.onSatelliteAccessControllerMetrics(param);
+
+ ArgumentCaptor<SatelliteAccessController> captor = ArgumentCaptor.forClass(
+ SatelliteAccessController.class);
+ verify(mPersistAtomsStorage).addSatelliteAccessControllerStats(captor.capture());
+ SatelliteAccessController stats = captor.getValue();
+ assertEquals(param.getAccessControlType(), stats.accessControlType);
+ assertEquals(param.getLocationQueryTime(), stats.locationQueryTimeMillis);
+ assertEquals(param.getOnDeviceLookupTime(), stats.onDeviceLookupTimeMillis);
+ assertEquals(param.getTotalCheckingTime(), stats.totalCheckingTimeMillis);
+ assertEquals(param.getIsAllowed(), stats.isAllowed);
+ assertEquals(param.getIsEmergency(), stats.isEmergency);
+ assertEquals(param.getResultCode(), stats.resultCode);
+ assertEquals(param.getCountryCodes(), stats.countryCodes);
+ assertEquals(param.getConfigDataSource(), stats.configDataSource);
+ verifyNoMoreInteractions(mPersistAtomsStorage);
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
index edc481a..04d140c 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
@@ -50,8 +50,10 @@
import android.annotation.NonNull;
import android.os.Looper;
+import android.os.PersistableBundle;
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation.NetworkType;
+import android.telephony.CarrierConfigManager;
import android.telephony.DisconnectCause;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PreciseDataConnectionState;
@@ -226,7 +228,8 @@
mVoiceCallSessionStats0 = new TestableVoiceCallSessionStats(0, mPhone, mFeatureFlags);
mVoiceCallSessionStats0.onServiceStateChanged(mServiceState);
- mVoiceCallSessionStats1 = new TestableVoiceCallSessionStats(1, mSecondPhone, mFeatureFlags);
+ mVoiceCallSessionStats1 = new TestableVoiceCallSessionStats(
+ 1, mSecondPhone, mFeatureFlags);
mVoiceCallSessionStats1.onServiceStateChanged(mSecondServiceState);
doReturn(true).when(mFeatureFlags).vonrEnabledMetric();
@@ -2787,6 +2790,72 @@
assertFalse(session.isNtn);
}
+
+ @Test
+ @SmallTest
+ public void singleCall_supportBusinessCall() {
+ PersistableBundle mCarrierConfig = new PersistableBundle();
+ mCarrierConfig.putBoolean(
+ CarrierConfigManager.KEY_SUPPORTS_BUSINESS_CALL_COMPOSER_BOOL, true);
+ when(mCarrierConfigManager.getConfigForSubId(eq(mPhone.getSubId()),
+ eq(CarrierConfigManager.KEY_SUPPORTS_BUSINESS_CALL_COMPOSER_BOOL)))
+ .thenReturn(mCarrierConfig);
+ setServiceState(mServiceState, TelephonyManager.NETWORK_TYPE_LTE);
+ doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mImsStats).getImsVoiceRadioTech();
+ doReturn(mImsPhone).when(mPhone).getImsPhone();
+ doReturn(false).when(mImsConnection0).isIncoming();
+ doReturn(2000L).when(mImsConnection0).getCreateTime();
+ doReturn(0L).when(mImsConnection0).getDurationMillis();
+ doReturn(mImsCall0).when(mImsConnection0).getCall();
+ doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections();
+ doReturn(2).when(mTelephonyManager).getCallComposerStatus();
+ VoiceCallSession expectedCall =
+ makeSlot0CallProto(
+ VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_IMS,
+ VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MO,
+ TelephonyManager.NETWORK_TYPE_LTE,
+ ImsReasonInfo.CODE_REMOTE_CALL_DECLINE);
+ expectedCall.setupDurationMillis = 200;
+ expectedCall.setupFailed = true;
+ expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ expectedCall.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_EVS_SWB;
+ expectedCall.mainCodecQuality =
+ VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_SUPER_WIDEBAND;
+ expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
+ expectedCall.supportsBusinessCallComposer = true;
+ // 0 is defined as UNKNOWN, adding 1 to original value.
+ expectedCall.callComposerStatus = 3;
+ VoiceCallRatUsage expectedRatUsage =
+ makeRatUsageProto(
+ CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
+ final AtomicReference<VoiceCallRatUsage[]> ratUsage = setupRatUsageCapture();
+
+ mVoiceCallSessionStats0.setTimeMillis(2000L);
+ doReturn(Call.State.DIALING).when(mImsCall0).getState();
+ doReturn(Call.State.DIALING).when(mImsConnection0).getState();
+ mVoiceCallSessionStats0.onImsDial(mImsConnection0);
+ mVoiceCallSessionStats0.setTimeMillis(2100L);
+ mVoiceCallSessionStats0.onAudioCodecChanged(
+ mImsConnection0, ImsStreamMediaProfile.AUDIO_QUALITY_EVS_SWB);
+ mVoiceCallSessionStats0.setTimeMillis(2200L);
+ doReturn(Call.State.ALERTING).when(mImsCall0).getState();
+ doReturn(Call.State.ALERTING).when(mImsConnection0).getState();
+ mVoiceCallSessionStats0.onCallStateChanged(mImsCall0);
+ mVoiceCallSessionStats0.setTimeMillis(12000L);
+ mVoiceCallSessionStats0.onImsCallTerminated(
+ mImsConnection0, new ImsReasonInfo(ImsReasonInfo.CODE_REMOTE_CALL_DECLINE, 0));
+
+ ArgumentCaptor<VoiceCallSession> callCaptor =
+ ArgumentCaptor.forClass(VoiceCallSession.class);
+ verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture());
+ verify(mPersistAtomsStorage, times(1)).addVoiceCallRatUsage(any());
+ verifyNoMoreInteractions(mPersistAtomsStorage);
+ assertProtoEquals(expectedCall, callCaptor.getValue());
+ assertThat(ratUsage.get()).hasLength(1);
+ assertProtoEquals(expectedRatUsage, ratUsage.get()[0]);
+ }
+
private AtomicReference<VoiceCallRatUsage[]> setupRatUsageCapture() {
final AtomicReference<VoiceCallRatUsage[]> ratUsage = new AtomicReference<>(null);
doAnswer(
@@ -2875,6 +2944,7 @@
call.setupBeginMillis = 0L;
call.signalStrengthAtEnd = 2;
call.vonrEnabled = false;
+ call.callComposerStatus = 1;
return call;
}
@@ -2910,6 +2980,7 @@
call.isRoaming = false;
call.setupBeginMillis = 0L;
call.signalStrengthAtEnd = 2;
+ call.callComposerStatus = 1;
return call;
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java
index f1508ee..2961b4d 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java
@@ -87,7 +87,7 @@
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
when(mMockSatelliteController.isSatelliteAttachRequired()).thenReturn(true);
mDatagramControllerUT = new DatagramController(
- mContext, Looper.myLooper(), mMockPointingAppController);
+ mContext, Looper.myLooper(), mFeatureFlags, mMockPointingAppController);
// Move both send and receive to IDLE state
mDatagramControllerUT.updateSendStatus(SUB_ID, DATAGRAM_TYPE_UNKNOWN,
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
index dba288e..7094399 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -60,6 +60,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyTest;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
@@ -155,7 +156,9 @@
mMockSessionMetricsStats);
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+ when(mFeatureFlags.satellitePersistentLogging()).thenReturn(true);
mDatagramDispatcherUT = new TestDatagramDispatcher(mContext, Looper.myLooper(),
+ mFeatureFlags,
mMockDatagramController);
mResultListener = new LinkedBlockingQueue<>(1);
@@ -238,7 +241,8 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(eq(datagramType));
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
@@ -279,7 +283,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
mResultListener.clear();
mDatagramDispatcherUT.onSatelliteModemStateChanged(
@@ -311,7 +316,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
}
}
@@ -372,7 +378,8 @@
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(anyInt());
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
clearInvocations(mMockSessionMetricsStats);
@@ -406,7 +413,8 @@
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
verify(mMockSatelliteModemInterface).abortSendingSatelliteDatagrams(any(Message.class));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_MODEM_TIMEOUT);
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
@@ -453,7 +461,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
}
@Test
@@ -494,7 +503,8 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(eq(datagramType));
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
}
@@ -542,7 +552,8 @@
verify(mMockDatagramController, never()).pollPendingSatelliteDatagrams(anyInt(), any());
verify(mMockDatagramController, never()).pushDemoModeDatagram(
anyInt(), any(SatelliteDatagram.class));
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
}
mDatagramDispatcherUT.setDemoMode(false);
@@ -587,7 +598,8 @@
.updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE2),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(eq(DATAGRAM_TYPE2));
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
@@ -699,7 +711,8 @@
verify(mMockDatagramController).pushDemoModeDatagram(
anyInt(), any(SatelliteDatagram.class));
verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any());
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(anyInt());
// Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is
// false
@@ -772,8 +785,9 @@
private long mLong = SATELLITE_ALIGN_TIMEOUT;
TestDatagramDispatcher(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull DatagramController datagramController) {
- super(context, looper, datagramController);
+ super(context, looper, featureFlags, datagramController);
}
@Override
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
index 4d3acb4..947661b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
@@ -58,6 +58,7 @@
import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.TelephonyTest;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
@@ -126,9 +127,11 @@
replaceInstance(SessionMetricsStats.class, "sInstance", null,
mMockSessionMetricsStats);
- mDatagramReceiverUT = DatagramReceiver.make(mContext, Looper.myLooper(),
+ when(mFeatureFlags.satellitePersistentLogging()).thenReturn(true);
+ mDatagramReceiverUT = DatagramReceiver.make(mContext, Looper.myLooper(), mFeatureFlags,
mMockDatagramController);
mTestDemoModeDatagramReceiver = new TestDatagramReceiver(mContext, Looper.myLooper(),
+ mFeatureFlags,
mMockDatagramController);
mSatelliteDatagramListenerHandler = new DatagramReceiver.SatelliteDatagramListenerHandler(
Looper.myLooper(), SUB_ID);
@@ -490,8 +493,9 @@
private long mLong = SATELLITE_ALIGN_TIMEOUT;
TestDatagramReceiver(@NonNull Context context, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags,
@NonNull DatagramController datagramController) {
- super(context, looper, datagramController);
+ super(context, looper, featureFlags, datagramController);
}
@Override
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/PointingAppControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/PointingAppControllerTest.java
index c1f3a88..36d32fe 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/PointingAppControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/PointingAppControllerTest.java
@@ -100,12 +100,13 @@
super.setUp(getClass().getSimpleName());
MockitoAnnotations.initMocks(this);
logd(TAG + " Setup!");
+ when(mFeatureFlags.satellitePersistentLogging()).thenReturn(true);
mInOrderForPointingUi = inOrder(mContext);
replaceInstance(SatelliteModemInterface.class, "sInstance", null,
mMockSatelliteModemInterface);
replaceInstance(SatelliteController.class, "sInstance", null,
mMockSatelliteController);
- mPointingAppController = new PointingAppController(mContext);
+ mPointingAppController = new PointingAppController(mContext, mFeatureFlags);
mContextFixture.putResource(R.string.config_pointing_ui_package,
KEY_POINTING_UI_PACKAGE_NAME);
mContextFixture.putResource(R.string.config_pointing_ui_class,
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index c37d7e9..da40c32 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -786,6 +786,7 @@
// Successfully enable satellite
mIIntegerConsumerResults.clear();
mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(true, false, false, SATELLITE_RESULT_SUCCESS);
mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
mIIntegerConsumer);
@@ -795,6 +796,7 @@
assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled);
assertEquals(
SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
verify(mMockSatelliteSessionController, times(1)).onSatelliteEnabledStateChanged(eq(true));
@@ -805,6 +807,7 @@
// Successfully disable satellite when radio is turned off.
mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(false, false, false, SATELLITE_RESULT_SUCCESS);
setRadioPower(false);
mSatelliteControllerUT.onCellularRadioPowerOffRequested();
@@ -813,6 +816,7 @@
processAllMessages();
verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS);
assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled);
assertEquals(
SATELLITE_MODE_ENABLED_FALSE, mSatelliteControllerUT.satelliteModeSettingValue);
verify(mMockSatelliteSessionController, times(2)).onSatelliteEnabledStateChanged(eq(false));
@@ -838,6 +842,7 @@
mIIntegerConsumerResults.clear();
clearInvocations(mMockPointingAppController);
mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(true, false, false,
SATELLITE_RESULT_INVALID_MODEM_STATE);
mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
@@ -849,11 +854,13 @@
verify(mMockPointingAppController, never()).startPointingUI(anyBoolean(), anyBoolean(),
anyBoolean());
assertFalse(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertFalse(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled);
verify(mMockControllerMetricsStats, times(1)).reportServiceEnablementFailCount();
// Successfully enable satellite when radio is on.
mIIntegerConsumerResults.clear();
mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(true, false, false, SATELLITE_RESULT_SUCCESS);
mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
mIIntegerConsumer);
@@ -862,6 +869,7 @@
assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled);
assertEquals(SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
verify(mMockSatelliteSessionController, times(2)).onSatelliteEnabledStateChanged(eq(true));
verify(mMockSatelliteSessionController, times(4)).setDemoMode(eq(false));
@@ -3458,6 +3466,7 @@
// startSendingNtnSignalStrength should be invoked when satellite is enabled
mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(true, false, false, SATELLITE_RESULT_SUCCESS);
mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
mIIntegerConsumer);
@@ -3466,6 +3475,7 @@
assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled);
assertEquals(
SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
verify(mMockSatelliteModemInterface, times(1)).startSendingNtnSignalStrength(
@@ -3517,6 +3527,7 @@
reset(mMockSatelliteModemInterface);
doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(true, false, false, SATELLITE_RESULT_SUCCESS);
mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
mIIntegerConsumer);
@@ -3525,6 +3536,7 @@
assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled);
assertEquals(
SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
verify(mMockSatelliteModemInterface, times(1)).startSendingNtnSignalStrength(
@@ -4479,6 +4491,7 @@
public boolean allRadiosDisabled = true;
public long elapsedRealtime = 0;
public int satelliteModeSettingValue = SATELLITE_MODE_ENABLED_FALSE;
+ public boolean setSettingsKeyToAllowDeviceRotationCalled = false;
TestSatelliteController(
Context context, Looper looper, @NonNull FeatureFlags featureFlags) {
@@ -4499,6 +4512,12 @@
}
@Override
+ protected void setSettingsKeyToAllowDeviceRotation(int val) {
+ logd("setSettingsKeyToAllowDeviceRotation: val=" + val);
+ setSettingsKeyToAllowDeviceRotationCalled = true;
+ }
+
+ @Override
protected boolean areAllRadiosDisabled() {
return allRadiosDisabled;
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java
index f6131ea..78763d1 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java
@@ -45,6 +45,7 @@
import android.testing.TestableLooper;
import com.android.internal.telephony.TelephonyTest;
+import com.android.internal.telephony.flags.FeatureFlags;
import org.junit.After;
import org.junit.Before;
@@ -105,11 +106,12 @@
Resources resources = mContext.getResources();
when(resources.getInteger(anyInt())).thenReturn(TEST_SATELLITE_TIMEOUT_MILLIS);
+ when(mFeatureFlags.satellitePersistentLogging()).thenReturn(true);
when(mMockSatelliteController.isSatelliteAttachRequired()).thenReturn(false);
mSatelliteModemInterface = new TestSatelliteModemInterface(
- mContext, mMockSatelliteController, Looper.myLooper());
+ mContext, mMockSatelliteController, Looper.myLooper(), mFeatureFlags);
mTestSatelliteSessionController = new TestSatelliteSessionController(mContext,
- Looper.myLooper(), true, mSatelliteModemInterface);
+ Looper.myLooper(), mFeatureFlags, true, mSatelliteModemInterface);
processAllMessages();
mTestSatelliteModemStateCallback = new TestSatelliteModemStateCallback();
@@ -131,7 +133,7 @@
* state.
*/
TestSatelliteSessionController sessionController1 = new TestSatelliteSessionController(
- mContext, Looper.myLooper(), false, mSatelliteModemInterface);
+ mContext, Looper.myLooper(), mFeatureFlags, false, mSatelliteModemInterface);
assertNotNull(sessionController1);
processAllMessages();
assertEquals(STATE_UNAVAILABLE, sessionController1.getCurrentStateName());
@@ -140,7 +142,7 @@
* Since satellite is supported, SatelliteSessionController should move to POWER_OFF state.
*/
TestSatelliteSessionController sessionController2 = new TestSatelliteSessionController(
- mContext, Looper.myLooper(), true, mSatelliteModemInterface);
+ mContext, Looper.myLooper(), mFeatureFlags, true, mSatelliteModemInterface);
assertNotNull(sessionController2);
processAllMessages();
assertEquals(STATE_POWER_OFF, sessionController2.getCurrentStateName());
@@ -153,7 +155,7 @@
* state.
*/
TestSatelliteSessionController sessionController = new TestSatelliteSessionController(
- mContext, Looper.myLooper(), false, mSatelliteModemInterface);
+ mContext, Looper.myLooper(), mFeatureFlags, false, mSatelliteModemInterface);
assertNotNull(sessionController);
processAllMessages();
assertEquals(STATE_UNAVAILABLE, sessionController.getCurrentStateName());
@@ -1117,8 +1119,9 @@
private int mErrorCode = SatelliteManager.SATELLITE_RESULT_SUCCESS;
TestSatelliteModemInterface(@NonNull Context context,
- SatelliteController satelliteController, @NonNull Looper looper) {
- super(context, satelliteController, looper);
+ SatelliteController satelliteController, @NonNull Looper looper,
+ @NonNull FeatureFlags featureFlags) {
+ super(context, satelliteController, looper, featureFlags);
mExponentialBackoff.stop();
}
@@ -1161,9 +1164,10 @@
}
private static class TestSatelliteSessionController extends SatelliteSessionController {
- TestSatelliteSessionController(Context context, Looper looper, boolean isSatelliteSupported,
+ TestSatelliteSessionController(Context context, Looper looper, FeatureFlags featureFlags,
+ boolean isSatelliteSupported,
SatelliteModemInterface satelliteModemInterface) {
- super(context, looper, isSatelliteSupported, satelliteModemInterface);
+ super(context, looper, featureFlags, isSatelliteSupported, satelliteModemInterface);
}
String getCurrentStateName() {