Merge "Feature flag for emergency registration CB feature" into main
diff --git a/flags/data.aconfig b/flags/data.aconfig
index 152660b..267048e 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -83,3 +83,10 @@
description: "notify data activity changed for slot id"
bug: "309896936"
}
+
+flag {
+ name: "vonr_enabled_metric"
+ namespace: "telephony"
+ description: "Collect vonr status in voice call metric"
+ bug:"288449751"
+}
diff --git a/flags/misc.aconfig b/flags/misc.aconfig
index 7f40596..ba9772b 100644
--- a/flags/misc.aconfig
+++ b/flags/misc.aconfig
@@ -51,13 +51,6 @@
}
flag {
- name: "load_dds_on_create"
- namespace: "telephony"
- description: "Load default data subid on create in PhoneGlobals."
- bug: "310591561"
-}
-
-flag {
name: "enable_telephony_analytics"
namespace: "telephony"
description: "Enable Telephony Analytics information of Service State , Sms and Call scenarios"
@@ -70,10 +63,3 @@
description: "Expose carrier config KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL and KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL."
bug: "310264981"
}
-
-flag {
- name: "radio_info_is_radio_on"
- namespace: "telephony"
- description: "change method to show mobile radio power from service state to radio power"
- bug: "306084899"
-}
diff --git a/flags/telephony.aconfig b/flags/telephony.aconfig
index f60885b..b849d53 100644
--- a/flags/telephony.aconfig
+++ b/flags/telephony.aconfig
@@ -5,4 +5,11 @@
namespace: "telephony"
description: "This flag controls telephony feature flags mapping."
bug:"297989574"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "enforce_telephony_feature_mapping_for_public_apis"
+ namespace: "telephony"
+ description: "This flag controls telephony feature flags mapping for public APIs and CTS."
+ bug:"297989574"
+}
diff --git a/flags/uicc.aconfig b/flags/uicc.aconfig
index 3ef2301..b2024b0 100644
--- a/flags/uicc.aconfig
+++ b/flags/uicc.aconfig
@@ -11,4 +11,10 @@
namespace: "telephony"
description: "This flag controls to download the IMSI encryption keys after user unlocks the phone."
bug:"303780982"
+}
+flag {
+ name: "carrier_restriction_status"
+ namespace: "telephony"
+ description: "This flag control the visibility of the getCarrierRestrictionStatus in carrierRestrictionRules class."
+ bug:"313553044"
}
\ No newline at end of file
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index 6d1008b..d7a6062 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -280,6 +280,7 @@
optional bool is_iwlan_cross_sim_at_start = 37;
optional bool is_iwlan_cross_sim_at_end = 38;
optional bool is_iwlan_cross_sim_at_connected = 39;
+ optional bool vonr_enabled = 40;
// Internal use only
optional int64 setup_begin_millis = 10001;
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index 30adfff..620b871 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -342,7 +342,7 @@
// phone type needs to be set before other initialization as other objects rely on it
mPrecisePhoneType = precisePhoneType;
- mVoiceCallSessionStats = new VoiceCallSessionStats(mPhoneId, this);
+ mVoiceCallSessionStats = new VoiceCallSessionStats(mPhoneId, this, featureFlags);
mImsManagerFactory = imsManagerFactory;
initOnce(ci);
initRatSpecific(precisePhoneType);
diff --git a/src/java/com/android/internal/telephony/PhoneFactory.java b/src/java/com/android/internal/telephony/PhoneFactory.java
index 0cbc035..4705d43 100644
--- a/src/java/com/android/internal/telephony/PhoneFactory.java
+++ b/src/java/com/android/internal/telephony/PhoneFactory.java
@@ -161,7 +161,7 @@
}
// register statsd pullers.
- sMetricsCollector = new MetricsCollector(context);
+ sMetricsCollector = new MetricsCollector(context, sFeatureFlags);
sPhoneNotifier = new DefaultPhoneNotifier(context, featureFlags);
@@ -268,7 +268,7 @@
makePhoneSwitcher(maxActivePhones, sContext, Looper.myLooper(),
featureFlags);
- sProxyController = ProxyController.getInstance(context);
+ sProxyController = ProxyController.getInstance(context, featureFlags);
sIntentBroadcaster = IntentBroadcaster.getInstance(context);
@@ -276,7 +276,7 @@
for (int i = 0; i < numPhones; i++) {
sTelephonyNetworkFactories[i] = new TelephonyNetworkFactory(
- Looper.myLooper(), sPhones[i]);
+ Looper.myLooper(), sPhones[i], featureFlags);
}
}
}
@@ -285,8 +285,9 @@
/**
* Upon single SIM to dual SIM switch or vice versa, we dynamically allocate or de-allocate
* Phone and CommandInterface objects.
- * @param context
- * @param activeModemCount
+ *
+ * @param context The context
+ * @param activeModemCount The number of active modems
*/
public static void onMultiSimConfigChanged(Context context, int activeModemCount) {
synchronized (sLockProxyPhones) {
@@ -313,7 +314,7 @@
sPhones[i].createImsPhone();
}
sTelephonyNetworkFactories[i] = new TelephonyNetworkFactory(
- Looper.myLooper(), sPhones[i]);
+ Looper.myLooper(), sPhones[i], sFeatureFlags);
}
}
}
diff --git a/src/java/com/android/internal/telephony/ProxyController.java b/src/java/com/android/internal/telephony/ProxyController.java
index ed9982e..01aed07 100644
--- a/src/java/com/android/internal/telephony/ProxyController.java
+++ b/src/java/com/android/internal/telephony/ProxyController.java
@@ -18,6 +18,7 @@
import static java.util.Arrays.copyOf;
+import android.annotation.NonNull;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.Intent;
@@ -33,6 +34,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.data.PhoneSwitcher;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.telephony.Rlog;
import java.util.ArrayList;
@@ -111,11 +113,12 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private int[] mOldRadioAccessFamily;
+ @NonNull
+ private final FeatureFlags mFlags;
- //***** Class Methods
- public static ProxyController getInstance(Context context) {
+ public static ProxyController getInstance(Context context, FeatureFlags flags) {
if (sProxyController == null) {
- sProxyController = new ProxyController(context);
+ sProxyController = new ProxyController(context, flags);
}
return sProxyController;
}
@@ -125,16 +128,23 @@
return sProxyController;
}
- private ProxyController(Context context) {
+ /**
+ * Constructor
+ *
+ * @param context The context
+ * @param featureFlags Feature flags
+ */
+ public ProxyController(@NonNull Context context, @NonNull FeatureFlags featureFlags) {
logd("Constructor - Enter");
mContext = context;
+ mFlags = featureFlags;
mPhones = PhoneFactory.getPhones();
mPhoneSwitcher = PhoneSwitcher.getInstance();
mUiccPhoneBookController = new UiccPhoneBookController();
mPhoneSubInfoController = new PhoneSubInfoController(mContext);
- mSmsController = new SmsController(mContext);
+ mSmsController = new SmsController(mContext, featureFlags);
mSetRadioAccessFamilyStatus = new int[mPhones.length];
mNewRadioAccessFamily = new int[mPhones.length];
mOldRadioAccessFamily = new int[mPhones.length];
diff --git a/src/java/com/android/internal/telephony/SmsController.java b/src/java/com/android/internal/telephony/SmsController.java
index 97161f8..777357d 100644
--- a/src/java/com/android/internal/telephony/SmsController.java
+++ b/src/java/com/android/internal/telephony/SmsController.java
@@ -22,6 +22,7 @@
import static com.android.internal.telephony.util.TelephonyUtils.checkDumpPermission;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AppOpsManager;
@@ -44,6 +45,7 @@
import android.telephony.TelephonyManager;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.internal.util.IndentingPrintWriter;
@@ -62,10 +64,11 @@
static final String LOG_TAG = "SmsController";
private final Context mContext;
-
+ private final FeatureFlags mFlags;
@VisibleForTesting
- public SmsController(Context context) {
+ public SmsController(Context context, @NonNull FeatureFlags flags) {
mContext = context;
+ mFlags = flags;
ServiceRegisterer smsServiceRegisterer = TelephonyFrameworkInitializer
.getTelephonyServiceManager()
.getSmsServiceRegisterer();
diff --git a/src/java/com/android/internal/telephony/TelephonyComponentFactory.java b/src/java/com/android/internal/telephony/TelephonyComponentFactory.java
index 74094a3..f09b9ae 100644
--- a/src/java/com/android/internal/telephony/TelephonyComponentFactory.java
+++ b/src/java/com/android/internal/telephony/TelephonyComponentFactory.java
@@ -342,8 +342,9 @@
* Create a new UiccProfile object.
*/
public UiccProfile makeUiccProfile(Context context, CommandsInterface ci, IccCardStatus ics,
- int phoneId, UiccCard uiccCard, Object lock) {
- return new UiccProfile(context, ci, ics, phoneId, uiccCard, lock);
+ int phoneId, UiccCard uiccCard, Object lock,
+ @NonNull FeatureFlags flags) {
+ return new UiccProfile(context, ci, ics, phoneId, uiccCard, lock, flags);
}
public EriManager makeEriManager(Phone phone, int eriFileSource) {
diff --git a/src/java/com/android/internal/telephony/cat/CatService.java b/src/java/com/android/internal/telephony/cat/CatService.java
index fa2b19b..cadb02e 100644
--- a/src/java/com/android/internal/telephony/cat/CatService.java
+++ b/src/java/com/android/internal/telephony/cat/CatService.java
@@ -49,6 +49,8 @@
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.ProxyController;
import com.android.internal.telephony.SmsController;
+import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.flags.FeatureFlagsImpl;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.uicc.IccCardStatus.CardState;
import com.android.internal.telephony.uicc.IccFileHandler;
@@ -104,6 +106,8 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private static CatService[] sInstance = null;
@UnsupportedAppUsage
+ private static final FeatureFlags sFlags = new FeatureFlagsImpl();
+ @UnsupportedAppUsage
private CommandsInterface mCmdIf;
@UnsupportedAppUsage
private Context mContext;
@@ -487,7 +491,8 @@
destAddr = ((SendSMSParams) cmdParams).mDestAddress.text;
}
if (text != null && destAddr != null) {
- ProxyController proxyController = ProxyController.getInstance(mContext);
+ ProxyController proxyController = ProxyController
+ .getInstance(mContext, sFlags);
SubscriptionManager subscriptionManager = (SubscriptionManager)
mContext.getSystemService(
Context.TELEPHONY_SUBSCRIPTION_SERVICE);
diff --git a/src/java/com/android/internal/telephony/data/TelephonyNetworkFactory.java b/src/java/com/android/internal/telephony/data/TelephonyNetworkFactory.java
index 2cdf807..377c219 100644
--- a/src/java/com/android/internal/telephony/data/TelephonyNetworkFactory.java
+++ b/src/java/com/android/internal/telephony/data/TelephonyNetworkFactory.java
@@ -16,6 +16,7 @@
package com.android.internal.telephony.data;
+import android.annotation.NonNull;
import android.net.NetworkCapabilities;
import android.net.NetworkFactory;
import android.net.NetworkRequest;
@@ -29,6 +30,7 @@
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.NetworkRequestsStats;
import com.android.internal.util.IndentingPrintWriter;
import com.android.telephony.Rlog;
@@ -77,11 +79,22 @@
@VisibleForTesting
public final Handler mInternalHandler;
+ private final @NonNull FeatureFlags mFlags;
- public TelephonyNetworkFactory(Looper looper, Phone phone) {
+
+ /**
+ * Constructor
+ *
+ * @param looper The looper for the handler
+ * @param phone The phone instance
+ * @param featureFlags The feature flags
+ */
+ public TelephonyNetworkFactory(@NonNull Looper looper, @NonNull Phone phone,
+ @NonNull FeatureFlags featureFlags) {
super(looper, phone.getContext(), "TelephonyNetworkFactory[" + phone.getPhoneId()
+ "]", null);
mPhone = phone;
+ mFlags = featureFlags;
mInternalHandler = new InternalHandler(looper);
mAccessNetworksManager = mPhone.getAccessNetworksManager();
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index e27d14b..8bd2547 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -55,6 +55,7 @@
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
import static com.android.internal.telephony.util.TelephonyUtils.IS_DEBUGGABLE;
+import android.annotation.NonNull;
import android.app.StatsManager;
import android.content.Context;
import android.telephony.SubscriptionManager;
@@ -66,6 +67,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyStatsLog;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.nano.PersistAtomsProto.CellularDataServiceSwitch;
import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceState;
@@ -167,21 +169,25 @@
private final PersistAtomsStorage mStorage;
private final DeviceStateHelper mDeviceStateHelper;
private final StatsManager mStatsManager;
+ private final VonrHelper mVonrHelper;
private final AirplaneModeStats mAirplaneModeStats;
private final Set<DataCallSessionStats> mOngoingDataCallStats = ConcurrentHashMap.newKeySet();
private static final Random sRandom = new Random();
- public MetricsCollector(Context context) {
- this(context, new PersistAtomsStorage(context), new DeviceStateHelper(context));
+ public MetricsCollector(Context context, @NonNull FeatureFlags featureFlags) {
+ this(context, new PersistAtomsStorage(context),
+ new DeviceStateHelper(context), new VonrHelper(featureFlags));
}
/** Allows dependency injection. Used during unit tests. */
@VisibleForTesting
public MetricsCollector(
- Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper) {
+ Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper,
+ VonrHelper vonrHelper) {
mStorage = storage;
mDeviceStateHelper = deviceStateHelper;
mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER);
+ mVonrHelper = vonrHelper;
if (mStatsManager != null) {
// Most (but not all) of these are subject to cooldown specified by MIN_COOLDOWN_MILLIS.
registerAtom(CELLULAR_DATA_SERVICE_SWITCH);
@@ -326,6 +332,11 @@
return mDeviceStateHelper;
}
+ /** Returns the {@link VonrHelper}. */
+ public VonrHelper getVonrHelper() {
+ return mVonrHelper;
+ }
+
/** Updates duration segments and calls {@link PersistAtomsStorage#flushAtoms()}. */
public void flushAtomsStorage() {
concludeAll();
@@ -1012,7 +1023,9 @@
session.handoverInProgress,
session.isIwlanCrossSimAtStart,
session.isIwlanCrossSimAtEnd,
- session.isIwlanCrossSimAtConnected);
+ session.isIwlanCrossSimAtConnected,
+ session.vonrEnabled);
+
}
private static StatsEvent buildStatsEvent(IncomingSms sms) {
diff --git a/src/java/com/android/internal/telephony/metrics/PerSimStatus.java b/src/java/com/android/internal/telephony/metrics/PerSimStatus.java
index a8c7421..70ff491 100644
--- a/src/java/com/android/internal/telephony/metrics/PerSimStatus.java
+++ b/src/java/com/android/internal/telephony/metrics/PerSimStatus.java
@@ -303,7 +303,7 @@
}
/** Returns true if VoNR is enabled */
- private static boolean isVonrEnabled(Phone phone) {
+ static boolean isVonrEnabled(Phone phone) {
TelephonyManager telephonyManager =
phone.getContext()
.getSystemService(TelephonyManager.class);
diff --git a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
index 5dbf645..9cf53c9 100644
--- a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
+++ b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
@@ -36,6 +36,7 @@
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__SIGNAL_STRENGTH_AT_END__SIGNAL_STRENGTH_GREAT;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__SIGNAL_STRENGTH_AT_END__SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.net.wifi.WifiInfo;
@@ -69,6 +70,7 @@
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.CallAnalytics;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.imsphone.ImsPhoneConnection;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession;
@@ -156,6 +158,7 @@
*/
private final VoiceCallRatTracker mRatUsage = new VoiceCallRatTracker();
+ private final @NonNull FeatureFlags mFlags;
private final int mPhoneId;
private final Phone mPhone;
@@ -165,10 +168,13 @@
private final DeviceStateHelper mDeviceStateHelper =
PhoneFactory.getMetricsCollector().getDeviceStateHelper();
- public VoiceCallSessionStats(int phoneId, Phone phone) {
+ private final VonrHelper mVonrHelper =
+ PhoneFactory.getMetricsCollector().getVonrHelper();
+
+ public VoiceCallSessionStats(int phoneId, Phone phone, @NonNull FeatureFlags featureFlags) {
mPhoneId = phoneId;
mPhone = phone;
-
+ mFlags = featureFlags;
DataConnectionStateTracker.getInstance(phoneId).start(phone);
}
@@ -457,6 +463,10 @@
@VideoState int videoState = conn.getVideoState();
VoiceCallSession proto = new VoiceCallSession();
+ if (mFlags.vonrEnabledMetric()) {
+ mVonrHelper.updateVonrEnabledState();
+ }
+
proto.bearerAtStart = bearer;
proto.bearerAtEnd = bearer;
proto.direction = getDirection(conn);
@@ -556,6 +566,10 @@
// Set device fold state
proto.foldState = mDeviceStateHelper.getFoldState();
+ if (mFlags.vonrEnabledMetric()) {
+ proto.vonrEnabled = mVonrHelper.getVonrEnabled(mPhone.getSubId());
+ }
+
mAtomsStorage.addVoiceCallSession(proto);
// merge RAT usages to PersistPullers when the call session ends (i.e. no more active calls)
diff --git a/src/java/com/android/internal/telephony/metrics/VonrHelper.java b/src/java/com/android/internal/telephony/metrics/VonrHelper.java
new file mode 100644
index 0000000..8f14a86
--- /dev/null
+++ b/src/java/com/android/internal/telephony/metrics/VonrHelper.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2023 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.metrics;
+
+import static com.android.internal.telephony.metrics.MetricsCollector.getPhonesIfAny;
+import static com.android.internal.telephony.metrics.PerSimStatus.isVonrEnabled;
+
+import android.annotation.NonNull;
+import android.os.Handler;
+import android.os.HandlerThread;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.FeatureFlags;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Vonr state handler.
+ *
+ * <p>This class is instantiated in {@link MetricsCollector}.
+*/
+public class VonrHelper {
+ private final @NonNull FeatureFlags mFlags;
+
+ private Handler mHandler;
+ private Map<Integer, Boolean> mPhoneVonrState = new ConcurrentHashMap<>();
+
+ public VonrHelper(@NonNull FeatureFlags featureFlags) {
+ this.mFlags = featureFlags;
+ if (mFlags.vonrEnabledMetric()) {
+ HandlerThread mHandlerThread = new HandlerThread("VonrHelperThread");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+ }
+ }
+
+ /** Update vonr_enabled state */
+ public void updateVonrEnabledState() {
+ if (mFlags.vonrEnabledMetric()) {
+ mHandler.post(mVonrRunnable);
+ }
+ }
+
+ @VisibleForTesting
+ protected Runnable mVonrRunnable =
+ new Runnable() {
+ @Override
+ public void run() {
+ mPhoneVonrState.clear();
+ for (Phone phone : getPhonesIfAny()) {
+ mPhoneVonrState.put(phone.getSubId(), isVonrEnabled(phone));
+ }
+ }
+ };
+
+ /** Get vonr_enabled per subId */
+ public boolean getVonrEnabled(int subId) {
+ if (mFlags.vonrEnabledMetric()) {
+ return mPhoneVonrState.getOrDefault(subId, false);
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index b29cf26..b4ce9c7 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -56,6 +56,7 @@
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.ResultReceiver;
+import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.provider.Settings;
@@ -2005,23 +2006,29 @@
}
/**
- * Registers for NTN signal strength changed from satellite modem.
+ * Registers for NTN signal strength changed from satellite modem. If the registration operation
+ * is not successful, a {@link ServiceSpecificException} that contains
+ * {@link SatelliteManager.SatelliteResult} will be thrown.
*
* @param subId The id of the subscription to request for.
- * @param callback The callback to handle the non-terrestrial network signal strength changed
- * event.
+ * @param callback The callback to handle the NTN signal strength changed event. If the
+ * operation is successful, {@link INtnSignalStrengthCallback#onNtnSignalStrengthChanged(
+ * NtnSignalStrength)} will return an instance of {@link NtnSignalStrength} with a value of
+ * {@link NtnSignalStrength.NtnSignalStrengthLevel} when the signal strength of non-terrestrial
+ * network has changed.
*
- * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+ * @throws ServiceSpecificException If the callback registration operation fails.
*/
- @SatelliteManager.SatelliteResult public int registerForNtnSignalStrengthChanged(
- int subId, @NonNull INtnSignalStrengthCallback callback) {
+ public void registerForNtnSignalStrengthChanged(int subId,
+ @NonNull INtnSignalStrengthCallback callback) throws RemoteException {
if (DBG) logd("registerForNtnSignalStrengthChanged()");
int error = evaluateOemSatelliteRequestAllowed(true);
- if (error != SATELLITE_RESULT_SUCCESS) return error;
-
- mNtnSignalStrengthChangedListeners.put(callback.asBinder(), callback);
- return SATELLITE_RESULT_SUCCESS;
+ if (error == SATELLITE_RESULT_SUCCESS) {
+ mNtnSignalStrengthChangedListeners.put(callback.asBinder(), callback);
+ } else {
+ throw new ServiceSpecificException(error);
+ }
}
/**
diff --git a/src/java/com/android/internal/telephony/uicc/UiccPort.java b/src/java/com/android/internal/telephony/uicc/UiccPort.java
index d89eab1..fd8f1c4 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccPort.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccPort.java
@@ -29,6 +29,8 @@
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.IccLogicalChannelRequest;
import com.android.internal.telephony.TelephonyComponentFactory;
+import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.flags.FeatureFlagsImpl;
import com.android.telephony.Rlog;
import java.io.FileDescriptor;
@@ -39,6 +41,7 @@
public class UiccPort {
protected static final String LOG_TAG = "UiccPort";
protected static final boolean DBG = true;
+ private static @NonNull FeatureFlags sFlags = new FeatureFlagsImpl();
// The lock object is created by UiccSlot that owns this UiccCard - this is to share the lock
// between UiccSlot, UiccCard, EuiccCard, UiccPort, EuiccPort and UiccProfile for now.
@@ -80,7 +83,7 @@
if (mUiccProfile == null) {
mUiccProfile = TelephonyComponentFactory.getInstance()
.inject(UiccProfile.class.getName()).makeUiccProfile(
- mContext, mCi, ics, mPhoneId, uiccCard, mLock);
+ mContext, mCi, ics, mPhoneId, uiccCard, mLock, sFlags);
} else {
mUiccProfile.update(mContext, mCi, ics);
}
diff --git a/src/java/com/android/internal/telephony/uicc/UiccProfile.java b/src/java/com/android/internal/telephony/uicc/UiccProfile.java
index 83db022..0457971 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccProfile.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccProfile.java
@@ -20,6 +20,7 @@
import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT__EVENT__PIN_VERIFICATION_FAILURE;
import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT__EVENT__PIN_VERIFICATION_SUCCESS;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.usage.UsageStatsManager;
@@ -65,6 +66,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyStatsLog;
import com.android.internal.telephony.cat.CatService;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
@@ -103,6 +105,7 @@
private static final String OPERATOR_BRAND_OVERRIDE_PREFIX = "operator_branding_";
+ private final @NonNull FeatureFlags mFlags;
// The lock object is created by UiccSlot that owns the UiccCard that owns this UiccProfile.
// This is to share the lock between UiccSlot, UiccCard and UiccProfile for now.
private final Object mLock;
@@ -326,8 +329,9 @@
};
public UiccProfile(Context c, CommandsInterface ci, IccCardStatus ics, int phoneId,
- UiccCard uiccCard, Object lock) {
+ UiccCard uiccCard, Object lock, @NonNull FeatureFlags flags) {
if (DBG) log("Creating profile");
+ mFlags = flags;
mLock = lock;
mUiccCard = uiccCard;
mPhoneId = phoneId;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ProxyControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ProxyControllerTest.java
index 65ab664..180a5e7 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ProxyControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ProxyControllerTest.java
@@ -55,7 +55,7 @@
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
replaceInstance(ProxyController.class, "sProxyController", null, null);
- mProxyController = ProxyController.getInstance(mContext);
+ mProxyController = new ProxyController(mContext, mFeatureFlags);
}
@After
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SmsControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SmsControllerTest.java
index 09c4173..8180bc0 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SmsControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SmsControllerTest.java
@@ -58,7 +58,7 @@
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
mAdnRecordCache = Mockito.mock(AdnRecordCache.class);
- mSmsControllerUT = new SmsController(mContext);
+ mSmsControllerUT = new SmsController(mContext, mFeatureFlags);
mCallingPackage = mContext.getOpPackageName();
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
index 9212567..25e484f 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
@@ -625,7 +625,7 @@
doReturn(mUiccProfile).when(mTelephonyComponentFactory)
.makeUiccProfile(nullable(Context.class), nullable(CommandsInterface.class),
nullable(IccCardStatus.class), anyInt(), nullable(UiccCard.class),
- nullable(Object.class));
+ nullable(Object.class), any(FeatureFlags.class));
doReturn(mCT).when(mTelephonyComponentFactory)
.makeGsmCdmaCallTracker(nullable(GsmCdmaPhone.class));
doReturn(mIccPhoneBookIntManager).when(mTelephonyComponentFactory)
diff --git a/tests/telephonytests/src/com/android/internal/telephony/cat/CATServiceTest.java b/tests/telephonytests/src/com/android/internal/telephony/cat/CATServiceTest.java
index f2c1870..a07ddbe 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/cat/CATServiceTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/cat/CATServiceTest.java
@@ -144,7 +144,7 @@
mSimulatedCommands = mock(SimulatedCommands.class);
mSimulatedCommands.setIccIoResultForApduLogicalChannel(mIccIoResult);
mUiccProfile = new UiccProfile(mContext, mSimulatedCommands, mIccCardStatus,
- 0 /* phoneId */, mUiccCard, new Object());
+ 0 /* phoneId */, mUiccCard, new Object(), mFeatureFlags);
processAllMessages();
logd("Created UiccProfile");
processAllMessages();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/ApnSettingTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/ApnSettingTest.java
index 98d3ce5..378df4b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/ApnSettingTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/ApnSettingTest.java
@@ -16,6 +16,9 @@
package com.android.internal.telephony.data;
+import static android.telephony.data.ApnSetting.INFRASTRUCTURE_CELLULAR;
+import static android.telephony.data.ApnSetting.INFRASTRUCTURE_SATELLITE;
+
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
@@ -381,4 +384,34 @@
.build();
assertEquals("proxy.mobile.att.net", apn3.getMmsProxyAddressAsString());
}
+
+ @Test
+ public void testBuild_InfrastructureBitmask() {
+ int infrastructureBitmask = INFRASTRUCTURE_CELLULAR | INFRASTRUCTURE_SATELLITE;
+ ApnSetting apn1 = new ApnSetting.Builder()
+ .setId(1234)
+ .setOperatorNumeric("310260")
+ .setEntryName("mms")
+ .setApnName("mms")
+ .setApnTypeBitmask(ApnSetting.TYPE_MMS | ApnSetting.TYPE_DEFAULT)
+ .setProtocol(ApnSetting.PROTOCOL_IPV4V6)
+ .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE))
+ .build();
+ // InfrastructureBitmask default value set to '3(cellular|satellite)'
+ assertEquals(infrastructureBitmask, apn1.getInfrastructureBitmask());
+
+ infrastructureBitmask = INFRASTRUCTURE_CELLULAR;
+ ApnSetting apn2 = new ApnSetting.Builder()
+ .setId(1235)
+ .setOperatorNumeric("310260")
+ .setEntryName("mms")
+ .setApnName("mms")
+ .setApnTypeBitmask(ApnSetting.TYPE_MMS | ApnSetting.TYPE_DEFAULT)
+ .setProtocol(ApnSetting.PROTOCOL_IPV4V6)
+ .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE))
+ .setInfrastructureBitmask(infrastructureBitmask)
+ .build();
+ // InfrastructureBitmask value set to '1(cellular)'
+ assertEquals(infrastructureBitmask, apn2.getInfrastructureBitmask());
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
index ff14f9a..e556cb8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
@@ -1611,6 +1611,7 @@
| TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(DEFAULT_APN_SET_ID)
+ .setInfrastructureBitmask(1)
.build())
.build();
@@ -1646,6 +1647,7 @@
.setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(DEFAULT_APN_SET_ID)
+ .setInfrastructureBitmask(1)
.build())
.build();
@@ -1674,6 +1676,7 @@
| TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(APN_SET_ID_1)
+ .setInfrastructureBitmask(1)
.build())
.build();
@@ -1702,6 +1705,7 @@
| TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(MATCH_ALL_APN_SET_ID)
+ .setInfrastructureBitmask(1)
.build())
.build();
@@ -1737,6 +1741,7 @@
| TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(APN_SET_ID_1)
+ .setInfrastructureBitmask(1)
.build())
.build();
@@ -1765,6 +1770,7 @@
.setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(DEFAULT_APN_SET_ID)
+ .setInfrastructureBitmask(1)
.build())
.build();
@@ -1793,6 +1799,7 @@
| TelephonyManager.NETWORK_TYPE_BITMASK_NR))
.setMvnoMatchData("")
.setApnSetId(MATCH_ALL_APN_SET_ID)
+ .setInfrastructureBitmask(1)
.build())
.build();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkFactoryTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkFactoryTest.java
index 5941f06..eff274c 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkFactoryTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkFactoryTest.java
@@ -190,7 +190,8 @@
private void createMockedTelephonyComponents() throws Exception {
replaceInstance(PhoneSwitcher.class, "sPhoneSwitcher", null, mPhoneSwitcher);
- mTelephonyNetworkFactoryUT = new TelephonyNetworkFactory(Looper.myLooper(), mPhone);
+ mTelephonyNetworkFactoryUT = new TelephonyNetworkFactory(Looper.myLooper(), mPhone,
+ mFeatureFlags);
final ArgumentCaptor<NetworkProvider> providerCaptor =
ArgumentCaptor.forClass(NetworkProvider.class);
verify(mConnectivityManager).registerNetworkProvider(providerCaptor.capture());
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java
index b8ae894..0e1135e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java
@@ -95,6 +95,7 @@
private UiccCard mActiveCard;
private UiccPort mActivePort;
private ServiceStateStats mServiceStateStats;
+ private VonrHelper mVonrHelper;
private MetricsCollector mMetricsCollector;
@@ -107,8 +108,10 @@
mActiveCard = mock(UiccCard.class);
mActivePort = mock(UiccPort.class);
mServiceStateStats = mock(ServiceStateStats.class);
+ mVonrHelper = mock(VonrHelper.class);
mMetricsCollector =
- new MetricsCollector(mContext, mPersistAtomsStorage, mDeviceStateHelper);
+ new MetricsCollector(mContext, mPersistAtomsStorage,
+ mDeviceStateHelper, mVonrHelper);
doReturn(mSST).when(mSecondPhone).getServiceStateTracker();
doReturn(mServiceStateStats).when(mSST).getServiceStateStats();
}
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 00ba0f8..1498eb4 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
@@ -44,6 +44,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import android.annotation.NonNull;
import android.os.Looper;
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation.NetworkType;
@@ -68,6 +69,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyTest;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.imsphone.ImsPhoneCall;
import com.android.internal.telephony.imsphone.ImsPhoneConnection;
import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallRatUsage;
@@ -114,12 +116,14 @@
private GsmCdmaCall mCsCall1;
private ImsPhoneCall mImsCall0;
private ImsPhoneCall mImsCall1;
+ private VonrHelper mVonrHelper;
private static class TestableVoiceCallSessionStats extends VoiceCallSessionStats {
private long mTimeMillis = 0L;
- TestableVoiceCallSessionStats(int phoneId, Phone phone) {
- super(phoneId, phone);
+ TestableVoiceCallSessionStats(int phoneId, Phone phone,
+ @NonNull FeatureFlags featureFlags) {
+ super(phoneId, phone, featureFlags);
}
@Override
@@ -160,6 +164,7 @@
mCsCall1 = mock(GsmCdmaCall.class);
mImsCall0 = mock(ImsPhoneCall.class);
mImsCall1 = mock(ImsPhoneCall.class);
+ mVonrHelper = mock(VonrHelper.class);
replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[] {mPhone, mSecondPhone});
doReturn(CARRIER_ID_SLOT_0).when(mPhone).getCarrierId();
// mPhone's mContext/mSST/mServiceState has been set up by TelephonyTest
@@ -212,10 +217,14 @@
Looper.prepare();
}
- mVoiceCallSessionStats0 = new TestableVoiceCallSessionStats(0, mPhone);
+ doReturn(mVonrHelper).when(mMetricsCollector).getVonrHelper();
+
+ mVoiceCallSessionStats0 = new TestableVoiceCallSessionStats(0, mPhone, mFeatureFlags);
mVoiceCallSessionStats0.onServiceStateChanged(mServiceState);
- mVoiceCallSessionStats1 = new TestableVoiceCallSessionStats(1, mSecondPhone);
+ mVoiceCallSessionStats1 = new TestableVoiceCallSessionStats(1, mSecondPhone, mFeatureFlags);
mVoiceCallSessionStats1.onServiceStateChanged(mSecondServiceState);
+
+ doReturn(true).when(mFeatureFlags).vonrEnabledMetric();
}
@After
@@ -2686,6 +2695,63 @@
assertProtoEquals(expectedRatUsage, ratUsage.get()[0]);
}
+ @Test
+ @SmallTest
+ public void singleCall_vonrEnabled() {
+ 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(true).when(mVonrHelper).getVonrEnabled(anyInt());
+ doReturn(new ArrayList(List.of(mImsConnection0))).when(mImsCall0).getConnections();
+ 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.vonrEnabled = true;
+ 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(
@@ -2773,6 +2839,7 @@
call.isRoaming = false;
call.setupBeginMillis = 0L;
call.signalStrengthAtEnd = 2;
+ call.vonrEnabled = false;
return call;
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/VonrHelperTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/VonrHelperTest.java
new file mode 100644
index 0000000..04cd925
--- /dev/null
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/VonrHelperTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2020 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.metrics;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+
+import android.annotation.NonNull;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.internal.telephony.TelephonyTest;
+import com.android.internal.telephony.flags.FeatureFlags;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class VonrHelperTest extends TelephonyTest {
+ private static final int SUBID = 1;
+
+ private static class TestableVonrHelper extends VonrHelper {
+ TestableVonrHelper(@NonNull FeatureFlags featureFlags) {
+ super(featureFlags);
+ }
+
+ @Override
+ public void updateVonrEnabledState() {
+ mVonrRunnable.run();
+ }
+ }
+
+ private TestableVonrHelper mVonrHelper;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp(getClass().getSimpleName());
+ doReturn(SUBID).when(mPhone).getSubId();
+ doReturn(false).when(mTelephonyManager).isVoNrEnabled();
+ mVonrHelper = new TestableVonrHelper(mFeatureFlags);
+ doReturn(true).when(mFeatureFlags).vonrEnabledMetric();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ @SmallTest
+ public void vonr_enabled() {
+ doReturn(true).when(mTelephonyManager).isVoNrEnabled();
+
+ mVonrHelper.updateVonrEnabledState();
+
+ assertThat(mVonrHelper.getVonrEnabled(SUBID)).isTrue();
+ }
+
+ @Test
+ @SmallTest
+ public void vonr_disabled() {
+ mVonrHelper.updateVonrEnabledState();
+
+ assertThat(mVonrHelper.getVonrEnabled(SUBID)).isFalse();
+ }
+}
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 eebd04c..55532cc 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -61,6 +61,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -91,7 +92,9 @@
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
+import android.os.RemoteException;
import android.os.ResultReceiver;
+import android.os.ServiceSpecificException;
import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.ServiceState;
@@ -491,7 +494,7 @@
doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
.setResultCode(anyInt());
doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
- .setIsProvisionRequest(eq(false));
+ .setIsProvisionRequest(eq(false));
doNothing().when(mMockProvisionMetricsStats).reportProvisionMetrics();
doNothing().when(mMockControllerMetricsStats).reportDeprovisionCount(anyInt());
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
@@ -1036,7 +1039,7 @@
assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE,
(long) mIIntegerConsumerResults.get(0));
verify(mMockPointingAppController).unregisterForSatelliteTransmissionUpdates(anyInt(),
- any(), eq(mStartTransmissionUpdateCallback));
+ any(), eq(mStartTransmissionUpdateCallback));
verify(mMockPointingAppController).setStartedSatelliteTransmissionUpdates(eq(false));
}
@@ -1095,7 +1098,7 @@
mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
mStopTransmissionUpdateCallback);
verify(mMockPointingAppController).unregisterForSatelliteTransmissionUpdates(anyInt(),
- any(), eq(mStopTransmissionUpdateCallback));
+ any(), eq(mStopTransmissionUpdateCallback));
processAllMessages();
assertTrue(waitForIIntegerConsumerResult(1));
assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
@@ -1519,7 +1522,7 @@
resetSatelliteControllerUT();
mIIntegerConsumerResults.clear();
mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
- TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
processAllMessages();
assertTrue(waitForIIntegerConsumerResult(1));
assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE,
@@ -2156,16 +2159,16 @@
}
};
- int errorCode = mSatelliteControllerUT.registerForNtnSignalStrengthChanged(SUB_ID,
- callback);
- assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE, errorCode);
- @NtnSignalStrength.NtnSignalStrengthLevel int expectedLevel = NTN_SIGNAL_STRENGTH_NONE;
+ verifyRegisterForNtnSignalStrengthChanged(SUB_ID, callback,
+ SATELLITE_RESULT_INVALID_TELEPHONY_STATE);
setUpResponseForRequestIsSatelliteSupported(false,
SATELLITE_RESULT_SUCCESS);
verifySatelliteSupported(false, SATELLITE_RESULT_SUCCESS);
- errorCode = mSatelliteControllerUT.registerForNtnSignalStrengthChanged(SUB_ID, callback);
- assertEquals(SATELLITE_RESULT_NOT_SUPPORTED, errorCode);
+ verifyRegisterForNtnSignalStrengthChanged(SUB_ID, callback,
+ SATELLITE_RESULT_NOT_SUPPORTED);
+
+ @NtnSignalStrength.NtnSignalStrengthLevel int expectedLevel = NTN_SIGNAL_STRENGTH_NONE;
verifyRequestNtnSignalStrength(expectedLevel, SATELLITE_RESULT_NOT_SUPPORTED);
resetSatelliteControllerUT();
@@ -2173,8 +2176,8 @@
setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
setUpResponseForRequestNtnSignalStrength(expectedLevel, SATELLITE_RESULT_SUCCESS);
verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
- errorCode = mSatelliteControllerUT.registerForNtnSignalStrengthChanged(SUB_ID, callback);
- assertEquals(SATELLITE_RESULT_SUCCESS, errorCode);
+ verifyRegisterForNtnSignalStrengthChanged(SUB_ID, callback,
+ SATELLITE_RESULT_SUCCESS);
verifyRequestNtnSignalStrength(expectedLevel, SATELLITE_RESULT_SUCCESS);
expectedLevel = NTN_SIGNAL_STRENGTH_GOOD;
@@ -2225,15 +2228,14 @@
}
};
- int errorCode = mSatelliteControllerUT.registerForNtnSignalStrengthChanged(SUB_ID,
- callback);
- assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode);
+ verifyRegisterForNtnSignalStrengthChanged(SUB_ID, callback,
+ SATELLITE_RESULT_REQUEST_NOT_SUPPORTED);
setUpResponseForRequestIsSatelliteSupported(false,
SATELLITE_RESULT_SUCCESS);
verifySatelliteSupported(false, SATELLITE_RESULT_NOT_SUPPORTED);
- errorCode = mSatelliteControllerUT.registerForNtnSignalStrengthChanged(SUB_ID, callback);
- assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode);
+ verifyRegisterForNtnSignalStrengthChanged(SUB_ID, callback,
+ SATELLITE_RESULT_REQUEST_NOT_SUPPORTED);
setUpResponseForRequestNtnSignalStrength(NTN_SIGNAL_STRENGTH_NONE,
SATELLITE_RESULT_SUCCESS);
verifyRequestNtnSignalStrength(NTN_SIGNAL_STRENGTH_NONE,
@@ -2242,8 +2244,8 @@
resetSatelliteControllerUT();
setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
verifySatelliteSupported(false, SATELLITE_RESULT_NOT_SUPPORTED);
- errorCode = mSatelliteControllerUT.registerForNtnSignalStrengthChanged(SUB_ID, callback);
- assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode);
+ verifyRegisterForNtnSignalStrengthChanged(SUB_ID, callback,
+ SATELLITE_RESULT_REQUEST_NOT_SUPPORTED);
verifyRequestNtnSignalStrength(NTN_SIGNAL_STRENGTH_NONE,
SATELLITE_RESULT_REQUEST_NOT_SUPPORTED);
@@ -2660,7 +2662,7 @@
int satelliteVisibilityTime, @SatelliteManager.SatelliteResult int error) {
SatelliteException exception = (error == SATELLITE_RESULT_SUCCESS)
? null : new SatelliteException(error);
- int[] visibilityTime = new int[] {satelliteVisibilityTime};
+ int[] visibilityTime = new int[]{satelliteVisibilityTime};
doAnswer(invocation -> {
Message message = (Message) invocation.getArguments()[0];
AsyncResult.forMessage(message, visibilityTime, exception);
@@ -2687,7 +2689,7 @@
boolean isSatelliteProvisioned, @SatelliteManager.SatelliteResult int error) {
SatelliteException exception = (error == SATELLITE_RESULT_SUCCESS)
? null : new SatelliteException(error);
- int[] provisioned = new int[] {isSatelliteProvisioned ? 1 : 0};
+ int[] provisioned = new int[]{isSatelliteProvisioned ? 1 : 0};
doAnswer(invocation -> {
Message message = (Message) invocation.getArguments()[0];
AsyncResult.forMessage(message, provisioned, exception);
@@ -3101,6 +3103,22 @@
mSimulatedCommands.setRadioPower(on, false, false, null);
}
+ private void verifyRegisterForNtnSignalStrengthChanged(int subId,
+ INtnSignalStrengthCallback callback, int expectedError) {
+ if (expectedError == SATELLITE_RESULT_SUCCESS) {
+ try {
+ mSatelliteControllerUT.registerForNtnSignalStrengthChanged(subId, callback);
+ } catch (RemoteException ex) {
+ throw new AssertionError();
+ }
+ } else {
+ ServiceSpecificException ex = assertThrows(ServiceSpecificException.class,
+ () -> mSatelliteControllerUT.registerForNtnSignalStrengthChanged(subId,
+ callback));
+ assertEquals(expectedError, ex.errorCode);
+ }
+ }
+
private static void loge(String message) {
Rlog.e(TAG, message);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccProfileTest.java b/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccProfileTest.java
index a9034eb..ca322e0 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccProfileTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccProfileTest.java
@@ -129,7 +129,7 @@
ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
mUiccProfile = new UiccProfile(mContext, mSimulatedCommands, mIccCardStatus,
- 0 /* phoneId */, mUiccCard, new Object());
+ 0 /* phoneId */, mUiccCard, new Object(), mFeatureFlags);
verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
listenerArgumentCaptor.capture());
mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(0);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccSlotTest.java b/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccSlotTest.java
index 1d320a3..671f273 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccSlotTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccSlotTest.java
@@ -428,7 +428,7 @@
mUiccSlot.update(mSimulatedCommands, mIccCardStatus, phoneId, slotIndex);
verify(mTelephonyComponentFactory).makeUiccProfile(
anyObject(), eq(mSimulatedCommands), eq(mIccCardStatus), anyInt(), anyObject(),
- anyObject());
+ anyObject(), anyObject());
assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState());
assertNotNull(mUiccSlot.getUiccCard());
@@ -451,7 +451,7 @@
mUiccSlot.update(mSimulatedCommands, mIccCardStatus, phoneId, slotIndex);
verify(mTelephonyComponentFactory).makeUiccProfile(
anyObject(), eq(mSimulatedCommands), eq(mIccCardStatus), anyInt(), anyObject(),
- anyObject());
+ anyObject(), anyObject());
assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState());
assertNotNull(mUiccSlot.getUiccCard());