aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-07-07 05:25:58 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-07-07 05:25:58 +0000
commit7eca110b919f21693afcbff8f4d9960ed8caeb40 (patch)
treeeb715b2183e85164e53a60a4f8a1a20e5a5040c1
parenta76da014cf7091f98d67ccda16271cb9de69cad0 (diff)
parent94ec5a14cea628292aa957a95d5fa325e015072f (diff)
downloadtelephony-7eca110b919f21693afcbff8f4d9960ed8caeb40.tar.gz
Snap for 10453563 from 94ec5a14cea628292aa957a95d5fa325e015072f to mainline-tzdata5-release
Change-Id: I3d014f365b733f6f0c8708e6d174a1a3922e7c10
-rw-r--r--proto/src/persist_atoms.proto3
-rw-r--r--src/java/com/android/internal/telephony/NetworkTypeController.java18
-rw-r--r--src/java/com/android/internal/telephony/RIL.java50
-rw-r--r--src/java/com/android/internal/telephony/ServiceStateTracker.java49
-rw-r--r--src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java2
-rw-r--r--src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java7
-rw-r--r--src/java/com/android/internal/telephony/metrics/DeviceStateHelper.java77
-rw-r--r--src/java/com/android/internal/telephony/metrics/MetricsCollector.java21
-rw-r--r--src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java5
-rw-r--r--src/java/com/android/internal/telephony/metrics/ServiceStateStats.java24
-rw-r--r--src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java5
-rw-r--r--src/java/com/android/internal/telephony/satellite/DatagramController.java3
-rw-r--r--src/java/com/android/internal/telephony/satellite/SatelliteController.java71
-rw-r--r--src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java15
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java34
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java24
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java10
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java31
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java37
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java4
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java43
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java41
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java71
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java901
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java25
25 files changed, 1411 insertions, 160 deletions
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index aa784dd5c1..61e44a3c8f 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -274,6 +274,8 @@ message VoiceCallSession {
optional bool is_multiparty = 31;
optional int32 call_duration = 32;
optional int32 last_known_rat = 33;
+ optional int32 fold_state = 34;
+
// Internal use only
optional int64 setup_begin_millis = 10001;
}
@@ -375,6 +377,7 @@ message CellularServiceState {
optional int64 total_time_millis = 9; // Duration needs to be rounded when pulled
optional bool is_emergency_only = 10;
optional bool is_internet_pdn_up = 11;
+ optional int32 fold_state = 12;
// Internal use only
optional int64 last_used_millis = 10001;
diff --git a/src/java/com/android/internal/telephony/NetworkTypeController.java b/src/java/com/android/internal/telephony/NetworkTypeController.java
index f94ff26bb8..beebf2206e 100644
--- a/src/java/com/android/internal/telephony/NetworkTypeController.java
+++ b/src/java/com/android/internal/telephony/NetworkTypeController.java
@@ -162,6 +162,7 @@ public class NetworkTypeController extends StateMachine {
private boolean mIsTimerResetEnabledForLegacyStateRrcIdle;
private int mLtePlusThresholdBandwidth;
private int mNrAdvancedThresholdBandwidth;
+ private boolean mIncludeLteForNrAdvancedThresholdBandwidth;
private @NonNull int[] mAdditionalNrAdvancedBandsList;
private @NonNull String mPrimaryTimerState;
private @NonNull String mSecondaryTimerState;
@@ -290,6 +291,8 @@ public class NetworkTypeController extends StateMachine {
CarrierConfigManager.KEY_LTE_PLUS_THRESHOLD_BANDWIDTH_KHZ_INT);
mNrAdvancedThresholdBandwidth = config.getInt(
CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT);
+ mIncludeLteForNrAdvancedThresholdBandwidth = config.getBoolean(
+ CarrierConfigManager.KEY_INCLUDE_LTE_FOR_NR_ADVANCED_THRESHOLD_BANDWIDTH_BOOL);
mEnableNrAdvancedWhileRoaming = config.getBoolean(
CarrierConfigManager.KEY_ENABLE_NR_ADVANCED_WHILE_ROAMING_BOOL);
mAdditionalNrAdvancedBandsList = config.getIntArray(
@@ -1281,11 +1284,20 @@ public class NetworkTypeController extends StateMachine {
return false;
}
+ int bandwidths = 0;
+ if (mPhone.getServiceStateTracker().getPhysicalChannelConfigList() != null) {
+ bandwidths = mPhone.getServiceStateTracker().getPhysicalChannelConfigList()
+ .stream()
+ .filter(config -> mIncludeLteForNrAdvancedThresholdBandwidth
+ || config.getNetworkType() == TelephonyManager.NETWORK_TYPE_NR)
+ .map(PhysicalChannelConfig::getCellBandwidthDownlinkKhz)
+ .mapToInt(Integer::intValue)
+ .sum();
+ }
+
// Check if meeting minimum bandwidth requirement. For most carriers, there is no minimum
// bandwidth requirement and mNrAdvancedThresholdBandwidth is 0.
- if (mNrAdvancedThresholdBandwidth > 0
- && IntStream.of(mPhone.getServiceState().getCellBandwidths()).sum()
- < mNrAdvancedThresholdBandwidth) {
+ if (mNrAdvancedThresholdBandwidth > 0 && bandwidths < mNrAdvancedThresholdBandwidth) {
return false;
}
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index c6820c146c..5ecdfcbbd4 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -385,15 +385,12 @@ public class RIL extends BaseCommands implements CommandsInterface {
case EVENT_AIDL_PROXY_DEAD:
int aidlService = msg.arg1;
long msgCookie = (long) msg.obj;
+ riljLog("handleMessage: EVENT_AIDL_PROXY_DEAD cookie = " + msgCookie
+ + ", service = " + serviceToString(aidlService) + ", cookie = "
+ + mServiceCookies.get(aidlService));
if (msgCookie == mServiceCookies.get(aidlService).get()) {
- riljLog("handleMessage: EVENT_AIDL_PROXY_DEAD cookie = " + msgCookie
- + ", service = " + serviceToString(aidlService) + ", cookie = "
- + mServiceCookies.get(aidlService));
mIsRadioProxyInitialized = false;
resetProxyAndRequestList(aidlService);
- } else {
- riljLog("Ignore stale EVENT_AIDL_PROXY_DEAD for service "
- + serviceToString(aidlService));
}
break;
}
@@ -438,7 +435,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
public void serviceDied(long cookie) {
// Deal with service going away
riljLog("serviceDied");
- mRilHandler.sendMessageAtFrontOfQueue(mRilHandler.obtainMessage(EVENT_RADIO_PROXY_DEAD,
+ mRilHandler.sendMessage(mRilHandler.obtainMessage(EVENT_RADIO_PROXY_DEAD,
HAL_SERVICE_RADIO, 0 /* ignored arg2 */, cookie));
}
}
@@ -471,14 +468,8 @@ public class RIL extends BaseCommands implements CommandsInterface {
@Override
public void binderDied() {
riljLog("Service " + serviceToString(mService) + " has died.");
- if (!mRilHandler.hasMessages(EVENT_AIDL_PROXY_DEAD)) {
- mRilHandler.sendMessageAtFrontOfQueue(mRilHandler.obtainMessage(
- EVENT_AIDL_PROXY_DEAD, mService, 0 /* ignored arg2 */,
- mServiceCookies.get(mService).get()));
- } else {
- riljLog("Not sending redundant EVENT_AIDL_PROXY_DEAD for service "
- + serviceToString(mService));
- }
+ mRilHandler.sendMessage(mRilHandler.obtainMessage(EVENT_AIDL_PROXY_DEAD, mService,
+ 0 /* ignored arg2 */, mServiceCookies.get(mService).get()));
unlinkToDeath();
}
}
@@ -487,19 +478,14 @@ public class RIL extends BaseCommands implements CommandsInterface {
if (service == HAL_SERVICE_RADIO) {
mRadioProxy = null;
} else {
- for (int i = MIN_SERVICE_IDX; i <= MAX_SERVICE_IDX; i++) {
- if (i == HAL_SERVICE_RADIO) continue;
- if (mServiceProxies.get(i) == null) {
- // This should only happen in tests
- riljLoge("Null service proxy for service " + serviceToString(i));
- continue;
- }
- mServiceProxies.get(i).clear();
- // Increment the cookie so that death notification can be ignored
- mServiceCookies.get(i).incrementAndGet();
- }
+ mServiceProxies.get(service).clear();
}
+ // Increment the cookie so that death notification can be ignored
+ mServiceCookies.get(service).incrementAndGet();
+
+ // TODO: If a service doesn't exist or is unimplemented, it shouldn't cause the radio to
+ // become unavailable for all other services
setRadioState(TelephonyManager.RADIO_POWER_UNAVAILABLE, true /* forceNotifyRegistrants */);
RILRequest.resetSerial();
@@ -509,15 +495,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
if (service == HAL_SERVICE_RADIO) {
getRadioProxy(null);
} else {
- for (int i = MIN_SERVICE_IDX; i <= MAX_SERVICE_IDX; i++) {
- if (i == HAL_SERVICE_RADIO) continue;
- if (mServiceProxies.get(i) == null) {
- // This should only happen in tests
- riljLoge("Null service proxy for service " + serviceToString(i));
- continue;
- }
- getRadioServiceProxy(i, null);
- }
+ getRadioServiceProxy(service, null);
}
}
@@ -1804,7 +1782,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
RILRequest rr = obtainRequest(RIL_REQUEST_GET_IMSI, result, mRILDefaultWorkSource);
if (RILJ_LOGD) {
- riljLog(rr.serialString() + ">" + RILUtils.requestToString(rr.mRequest)
+ riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+ " aid = " + aid);
}
try {
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index 9fb7d439eb..50eea7f695 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -180,7 +180,6 @@ public class ServiceStateTracker extends Handler {
private long mLastCellInfoReqTime;
private List<CellInfo> mLastCellInfoList = null;
private List<PhysicalChannelConfig> mLastPhysicalChannelConfigList = null;
- private int mLastAnchorNrCellId = PhysicalChannelConfig.PHYSICAL_CELL_ID_UNKNOWN;
private final Set<Integer> mRadioPowerOffReasons = new HashSet();
@@ -1661,18 +1660,6 @@ public class ServiceStateTracker extends Handler {
log("EVENT_PHYSICAL_CHANNEL_CONFIG: list=" + list
+ (list == null ? "" : ", list.size()=" + list.size()));
}
- if ((list == null || list.isEmpty())
- && mLastAnchorNrCellId != PhysicalChannelConfig.PHYSICAL_CELL_ID_UNKNOWN
- && mPhone.getContext().getSystemService(TelephonyManager.class)
- .isRadioInterfaceCapabilitySupported(TelephonyManager
- .CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED)
- && !mCarrierConfig.getBoolean(CarrierConfigManager
- .KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL)
- && mCarrierConfig.getBoolean(CarrierConfigManager
- .KEY_RATCHET_NR_ADVANCED_BANDWIDTH_IF_RRC_IDLE_BOOL)) {
- log("Ignore empty PCC list when RRC idle.");
- break;
- }
mLastPhysicalChannelConfigList = list;
boolean hasChanged = false;
if (updateNrStateFromPhysicalChannelConfigs(list, mSS)) {
@@ -1683,40 +1670,8 @@ public class ServiceStateTracker extends Handler {
mNrFrequencyChangedRegistrants.notifyRegistrants();
hasChanged = true;
}
- int anchorNrCellId = PhysicalChannelConfig.PHYSICAL_CELL_ID_UNKNOWN;
- if (list != null) {
- anchorNrCellId = list
- .stream()
- .filter(config -> config.getNetworkType()
- == TelephonyManager.NETWORK_TYPE_NR
- && config.getConnectionStatus()
- == PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING)
- .map(PhysicalChannelConfig::getPhysicalCellId)
- .findFirst()
- .orElse(PhysicalChannelConfig.PHYSICAL_CELL_ID_UNKNOWN);
- }
- boolean includeLte = mCarrierConfig.getBoolean(CarrierConfigManager
- .KEY_INCLUDE_LTE_FOR_NR_ADVANCED_THRESHOLD_BANDWIDTH_BOOL);
- int[] bandwidths = new int[0];
- if (list != null) {
- bandwidths = list.stream()
- .filter(config -> includeLte || config.getNetworkType()
- == TelephonyManager.NETWORK_TYPE_NR)
- .map(PhysicalChannelConfig::getCellBandwidthDownlinkKhz)
- .mapToInt(Integer::intValue)
- .toArray();
- }
- if (anchorNrCellId == mLastAnchorNrCellId
- && anchorNrCellId != PhysicalChannelConfig.PHYSICAL_CELL_ID_UNKNOWN) {
- log("Ratchet bandwidths since anchor NR cell is the same.");
- hasChanged |= RatRatcheter.updateBandwidths(bandwidths, mSS);
- } else {
- log("Do not ratchet bandwidths since anchor NR cell is different ("
- + mLastAnchorNrCellId + "->" + anchorNrCellId + ").");
- mLastAnchorNrCellId = anchorNrCellId;
- hasChanged |= !Arrays.equals(mSS.getCellBandwidths(), bandwidths);
- mSS.setCellBandwidths(bandwidths);
- }
+ hasChanged |= RatRatcheter
+ .updateBandwidths(getBandwidthsFromConfigs(list), mSS);
mPhone.notifyPhysicalChannelConfig(list);
// Notify NR frequency, NR connection status or bandwidths changed.
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
index a83569b275..9b44001785 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
@@ -684,7 +684,7 @@ public class EmergencyNumberTracker extends Handler {
+ countryIso);
updateEmergencyCountryIso(countryIso.toLowerCase(Locale.ROOT));
// Use cached country iso in APM to load emergency number database.
- if (TextUtils.isEmpty(countryIso) && isAirplaneModeEnabled()) {
+ if (TextUtils.isEmpty(countryIso)) {
countryIso = getCountryIsoForCachingDatabase();
logd("updateEmergencyNumberListDatabaseAndNotify(): using cached APM country "
+ countryIso);
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index 7a9c56f87c..c3ee0f6060 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -3389,6 +3389,13 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
break;
case ImsReasonInfo.CODE_SIP_BAD_REQUEST:
+ // Auto-missed/rejected calls can sometimes use this reason cause, but if we see it
+ // for outgoing calls it is just a server error.
+ if (callState == Call.State.DIALING || callState == Call.State.ALERTING) {
+ return DisconnectCause.SERVER_ERROR;
+ } else {
+ return DisconnectCause.INCOMING_AUTO_REJECTED;
+ }
case ImsReasonInfo.CODE_REJECT_CALL_ON_OTHER_SUB:
case ImsReasonInfo.CODE_REJECT_ONGOING_E911_CALL:
case ImsReasonInfo.CODE_REJECT_ONGOING_CALL_SETUP:
diff --git a/src/java/com/android/internal/telephony/metrics/DeviceStateHelper.java b/src/java/com/android/internal/telephony/metrics/DeviceStateHelper.java
new file mode 100644
index 0000000000..29729c8092
--- /dev/null
+++ b/src/java/com/android/internal/telephony/metrics/DeviceStateHelper.java
@@ -0,0 +1,77 @@
+/*
+ * 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.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_FLIPPED;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_HALF_OPENED;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_OPENED;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN;
+
+import android.content.Context;
+import android.hardware.devicestate.DeviceStateManager;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.HandlerThread;
+
+import com.android.internal.telephony.Phone;
+
+/** Device state information like the fold state. */
+public class DeviceStateHelper {
+ private int mFoldState = CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN;
+
+ public DeviceStateHelper(Context context) {
+ HandlerThread mHandlerThread = new HandlerThread("DeviceStateHelperThread");
+ mHandlerThread.start();
+ context.getSystemService(DeviceStateManager.class)
+ .registerCallback(
+ new HandlerExecutor(new Handler(mHandlerThread.getLooper())),
+ state -> {
+ updateFoldState(state);
+ });
+ }
+
+ private void updateFoldState(int posture) {
+ switch (posture) {
+ case 0:
+ mFoldState = CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED;
+ break;
+ case 1:
+ mFoldState = CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_HALF_OPENED;
+ break;
+ case 2:
+ mFoldState = CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_OPENED;
+ break;
+ case 4:
+ mFoldState = CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_FLIPPED;
+ break;
+ default:
+ mFoldState = CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN;
+ }
+ updateServiceStateStats();
+ }
+
+ private void updateServiceStateStats() {
+ for (Phone phone : MetricsCollector.getPhonesIfAny()) {
+ phone.getServiceStateTracker().getServiceStateStats().onFoldStateChanged(mFoldState);
+ }
+ }
+
+ public int getFoldState() {
+ return mFoldState;
+ }
+}
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index 7546124697..5e00987911 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -145,20 +145,22 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
DBG ? 2L * MILLIS_PER_SECOND : 5L * MILLIS_PER_MINUTE;
private final PersistAtomsStorage mStorage;
+ private final DeviceStateHelper mDeviceStateHelper;
private final StatsManager mStatsManager;
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));
+ this(context, new PersistAtomsStorage(context), new DeviceStateHelper(context));
}
/** Allows dependency injection. Used during unit tests. */
@VisibleForTesting
- public MetricsCollector(Context context,
- PersistAtomsStorage storage) {
+ public MetricsCollector(
+ Context context, PersistAtomsStorage storage, DeviceStateHelper deviceStateHelper) {
mStorage = storage;
+ mDeviceStateHelper = deviceStateHelper;
mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER);
if (mStatsManager != null) {
// Most (but not all) of these are subject to cooldown specified by MIN_COOLDOWN_MILLIS.
@@ -299,6 +301,11 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
return mStorage;
}
+ /** Returns the {@link DeviceStateHelper}. */
+ public DeviceStateHelper getDeviceStateHelper() {
+ return mDeviceStateHelper;
+ }
+
/** Updates duration segments and calls {@link PersistAtomsStorage#flushAtoms()}. */
public void flushAtomsStorage() {
concludeAll();
@@ -915,7 +922,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
state.carrierId,
roundAndConvertMillisToSeconds(state.totalTimeMillis),
state.isEmergencyOnly,
- state.isInternetPdnUp);
+ state.isInternetPdnUp,
+ state.foldState);
}
private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) {
@@ -966,7 +974,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
session.ratAtConnected,
session.isMultiparty,
session.callDuration,
- session.lastKnownRat);
+ session.lastKnownRat,
+ session.foldState);
}
private static StatsEvent buildStatsEvent(IncomingSms sms) {
@@ -1316,7 +1325,7 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback {
}
/** Returns all phones in {@link PhoneFactory}, or an empty array if phones not made yet. */
- private static Phone[] getPhonesIfAny() {
+ static Phone[] getPhonesIfAny() {
try {
return PhoneFactory.getPhones();
} catch (IllegalStateException e) {
diff --git a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
index 13ba91b269..5a21bafd49 100644
--- a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
+++ b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
@@ -1708,7 +1708,8 @@ public class PersistAtomsStorage {
&& state.isMultiSim == key.isMultiSim
&& state.carrierId == key.carrierId
&& state.isEmergencyOnly == key.isEmergencyOnly
- && state.isInternetPdnUp == key.isInternetPdnUp) {
+ && state.isInternetPdnUp == key.isInternetPdnUp
+ && state.foldState == key.foldState) {
return state;
}
}
@@ -2334,4 +2335,4 @@ public class PersistAtomsStorage {
// Epoch time in UTC, preserved across reboots, but can be adjusted e.g. by the user or NTP
return System.currentTimeMillis();
}
-} \ No newline at end of file
+}
diff --git a/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java b/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
index 7c63dec3a3..b830cd00d2 100644
--- a/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
+++ b/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
@@ -54,11 +54,13 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
new AtomicReference<>(new TimestampedServiceState(null, 0L));
private final Phone mPhone;
private final PersistAtomsStorage mStorage;
+ private final DeviceStateHelper mDeviceStateHelper;
public ServiceStateStats(Phone phone) {
super(Runnable::run);
mPhone = phone;
mStorage = PhoneFactory.getMetricsCollector().getAtomsStorage();
+ mDeviceStateHelper = PhoneFactory.getMetricsCollector().getDeviceStateHelper();
}
/** Finalizes the durations of the current service state segment. */
@@ -120,6 +122,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
newState.carrierId = mPhone.getCarrierId();
newState.isEmergencyOnly = isEmergencyOnly(serviceState);
newState.isInternetPdnUp = isInternetPdnUp(mPhone);
+ newState.foldState = mDeviceStateHelper.getFoldState();
TimestampedServiceState prevState =
mLastState.getAndSet(new TimestampedServiceState(newState, now));
addServiceStateAndSwitch(
@@ -127,6 +130,26 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
}
}
+ /** Updates the fold state of the device for the current service state. */
+ public void onFoldStateChanged(int foldState) {
+ final long now = getTimeMillis();
+ CellularServiceState lastServiceState = mLastState.get().mServiceState;
+ if (lastServiceState == null || lastServiceState.foldState == foldState) {
+ // Not need to update the fold state if modem is off or if is the
+ // same fold state
+ return;
+ } else {
+ TimestampedServiceState lastState =
+ mLastState.getAndUpdate(
+ state -> {
+ CellularServiceState newServiceState = copyOf(state.mServiceState);
+ newServiceState.foldState = foldState;
+ return new TimestampedServiceState(newServiceState, now);
+ });
+ addServiceState(lastState, now);
+ }
+ }
+
private void addServiceState(TimestampedServiceState prevState, long now) {
addServiceStateAndSwitch(prevState, now, null);
}
@@ -247,6 +270,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
copy.totalTimeMillis = state.totalTimeMillis;
copy.isEmergencyOnly = state.isEmergencyOnly;
copy.isInternetPdnUp = state.isInternetPdnUp;
+ copy.foldState = state.foldState;
return copy;
}
diff --git a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
index 91588e6402..ba07fa035a 100644
--- a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
+++ b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
@@ -157,6 +157,8 @@ public class VoiceCallSessionStats {
private final PersistAtomsStorage mAtomsStorage =
PhoneFactory.getMetricsCollector().getAtomsStorage();
private final UiccController mUiccController = UiccController.getInstance();
+ private final DeviceStateHelper mDeviceStateHelper =
+ PhoneFactory.getMetricsCollector().getDeviceStateHelper();
public VoiceCallSessionStats(int phoneId, Phone phone) {
mPhoneId = phoneId;
@@ -514,6 +516,9 @@ public class VoiceCallSessionStats {
// Update end RAT
updateRatAtEnd(proto, getVoiceRatWithVoNRFix(mPhone, getServiceState(), proto.bearerAtEnd));
+ // Set device fold state
+ proto.foldState = mDeviceStateHelper.getFoldState();
+
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/satellite/DatagramController.java b/src/java/com/android/internal/telephony/satellite/DatagramController.java
index 1b7333456e..e7f09c23ed 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramController.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramController.java
@@ -276,7 +276,8 @@ public class DatagramController {
mDatagramReceiver.onDeviceAlignedWithSatellite(isAligned);
}
- boolean isReceivingDatagrams() {
+ @VisibleForTesting
+ public boolean isReceivingDatagrams() {
synchronized (mLock) {
return (mReceiveDatagramTransferState
== SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING);
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 0ca6f8eef6..5cd84446c7 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -285,15 +285,6 @@ public class SatelliteController extends Handler {
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected void initializeSatelliteModeRadios() {
- UwbManager uwbManager = mContext.getSystemService(UwbManager.class);
- NfcManager nfcManager = mContext.getSystemService(NfcManager.class);
- NfcAdapter nfcAdapter = null;
- if (nfcManager != null) {
- nfcAdapter = nfcManager.getDefaultAdapter();
- }
- BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
-
if (mContentResolver != null) {
BTWifiNFCStateReceiver bTWifiNFCSateReceiver = new BTWifiNFCStateReceiver();
UwbAdapterStateCallback uwbAdapterStateCallback = new UwbAdapterStateCallback();
@@ -320,38 +311,50 @@ public class SatelliteController extends Handler {
}
logd("Radios To be checked when satellite is on: " + satelliteModeRadios);
- if (satelliteModeRadios.contains(Settings.Global.RADIO_BLUETOOTH)
- && bluetoothAdapter != null) {
- mDisableBTOnSatelliteEnabled = true;
- mBTStateEnabled = bluetoothAdapter.isEnabled();
- radioStateIntentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ if (satelliteModeRadios.contains(Settings.Global.RADIO_BLUETOOTH)) {
+ BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ if (bluetoothAdapter != null) {
+ mDisableBTOnSatelliteEnabled = true;
+ mBTStateEnabled = bluetoothAdapter.isEnabled();
+ radioStateIntentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ }
}
- if (satelliteModeRadios.contains(Settings.Global.RADIO_NFC)
- && nfcAdapter != null) {
- mDisableNFCOnSatelliteEnabled = true;
- mNfcStateEnabled = nfcAdapter.isEnabled();
- radioStateIntentFilter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
+ if (satelliteModeRadios.contains(Settings.Global.RADIO_NFC)) {
+ Context applicationContext = mContext.getApplicationContext();
+ NfcAdapter nfcAdapter = null;
+ if (applicationContext != null) {
+ nfcAdapter = NfcAdapter.getDefaultAdapter(mContext.getApplicationContext());
+ }
+ if (nfcAdapter != null) {
+ mDisableNFCOnSatelliteEnabled = true;
+ mNfcStateEnabled = nfcAdapter.isEnabled();
+ radioStateIntentFilter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
+ }
}
- if (satelliteModeRadios.contains(Settings.Global.RADIO_WIFI)
- && wifiManager != null) {
- mDisableWifiOnSatelliteEnabled = true;
- mWifiStateEnabled = wifiManager.isWifiEnabled();
- radioStateIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ if (satelliteModeRadios.contains(Settings.Global.RADIO_WIFI)) {
+ WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
+ if (wifiManager != null) {
+ mDisableWifiOnSatelliteEnabled = true;
+ mWifiStateEnabled = wifiManager.isWifiEnabled();
+ radioStateIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ }
}
mContext.registerReceiver(bTWifiNFCSateReceiver, radioStateIntentFilter);
- if (satelliteModeRadios.contains(Settings.Global.RADIO_UWB)
- && uwbManager != null) {
- mDisableUWBOnSatelliteEnabled = true;
- mUwbStateEnabled = uwbManager.isUwbEnabled();
- final long identity = Binder.clearCallingIdentity();
- try {
- uwbManager.registerAdapterStateCallback(mContext.getMainExecutor(),
- uwbAdapterStateCallback);
- } finally {
- Binder.restoreCallingIdentity(identity);
+ if (satelliteModeRadios.contains(Settings.Global.RADIO_UWB)) {
+ UwbManager uwbManager = mContext.getSystemService(UwbManager.class);
+ if (uwbManager != null) {
+ mDisableUWBOnSatelliteEnabled = true;
+ mUwbStateEnabled = uwbManager.isUwbEnabled();
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ uwbManager.registerAdapterStateCallback(mContext.getMainExecutor(),
+ uwbAdapterStateCallback);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
index d898bb3b39..8e773c072d 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
@@ -46,7 +46,7 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.TelephonyServiceManager;
import android.os.UserHandle;
-import android.provider.DeviceConfig;
+import android.os.UserManager;
import android.provider.Settings;
import android.provider.Telephony.SimInfo;
import android.service.carrier.CarrierIdentifier;
@@ -1311,9 +1311,7 @@ public class SubscriptionManagerService extends ISub.Stub {
log("updateSubscription: SIM_STATE_NOT_READY is not a final state. Will update "
+ "subscription later.");
return;
- }
-
- if (!areUiccAppsEnabledOnCard(phoneId)) {
+ } else {
logl("updateSubscription: UICC app disabled on slot " + phoneId);
markSubscriptionsInactive(phoneId);
}
@@ -3668,6 +3666,15 @@ public class SubscriptionManagerService extends ISub.Stub {
}
}
+ UserManager userManager = mContext.getSystemService(UserManager.class);
+ if ((userManager != null)
+ && (userManager.isManagedProfile(userHandle.getIdentifier()))) {
+ // For work profile, return subscriptions associated only with work profile
+ return subscriptionsAssociatedWithUser;
+ }
+
+ // For all other profiles, if subscriptionsAssociatedWithUser is empty return all the
+ // subscriptionsWithNoAssociation.
return subscriptionsAssociatedWithUser.isEmpty() ?
subscriptionsWithNoAssociation : subscriptionsAssociatedWithUser;
} finally {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
index ff696fc0a3..0c57e829df 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
@@ -1274,7 +1274,12 @@ public class NetworkTypeControllerTest extends TelephonyTest {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
- doReturn(new int[] {20001}).when(mServiceState).getCellBandwidths();
+ List<PhysicalChannelConfig> lastPhysicalChannelConfigList = new ArrayList<>();
+ lastPhysicalChannelConfigList.add(new PhysicalChannelConfig.Builder()
+ .setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
+ .setCellBandwidthDownlinkKhz(20001)
+ .build());
+ doReturn(lastPhysicalChannelConfigList).when(mSST).getPhysicalChannelConfigList();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT, 20000);
sendCarrierConfigChanged();
@@ -1284,6 +1289,33 @@ public class NetworkTypeControllerTest extends TelephonyTest {
}
@Test
+ public void testTransitionToCurrentStateNrConnectedWithHighBandwidthIncludingLte()
+ throws Exception {
+ assertEquals("DefaultState", getCurrentState().getName());
+ doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
+ doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
+ List<PhysicalChannelConfig> lastPhysicalChannelConfigList = new ArrayList<>();
+ lastPhysicalChannelConfigList.add(new PhysicalChannelConfig.Builder()
+ .setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
+ .setCellBandwidthDownlinkKhz(20000)
+ .build());
+ lastPhysicalChannelConfigList.add(new PhysicalChannelConfig.Builder()
+ .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
+ .setCellBandwidthDownlinkKhz(10000)
+ .build());
+ doReturn(lastPhysicalChannelConfigList).when(mSST).getPhysicalChannelConfigList();
+ mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT, 20000);
+ mBundle.putBoolean(
+ CarrierConfigManager.KEY_INCLUDE_LTE_FOR_NR_ADVANCED_THRESHOLD_BANDWIDTH_BOOL,
+ true);
+ sendCarrierConfigChanged();
+
+ mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
+ processAllMessages();
+ assertEquals("connected_mmwave", getCurrentState().getName());
+ }
+
+ @Test
public void testNrAdvancedDisabledWhileRoaming() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(true).when(mServiceState).getDataRoaming();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index 280fbcc177..846b48e3f7 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -278,15 +278,6 @@ public class ServiceStateTrackerTest extends TelephonyTest {
// UMTS < GPRS < EDGE
new String[]{"3,1,2"});
- mBundle.putBoolean(CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL,
- false);
-
- mBundle.putBoolean(CarrierConfigManager.KEY_RATCHET_NR_ADVANCED_BANDWIDTH_IF_RRC_IDLE_BOOL,
- true);
-
- doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
- TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
-
mSimulatedCommands.setVoiceRegState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
mSimulatedCommands.setDataRegState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
@@ -2282,10 +2273,6 @@ public class ServiceStateTrackerTest extends TelephonyTest {
@Test
public void testPhyChanBandwidthRatchetedOnPhyChanBandwidth() {
- mBundle.putBoolean(
- CarrierConfigManager.KEY_INCLUDE_LTE_FOR_NR_ADVANCED_THRESHOLD_BANDWIDTH_BOOL,
- true);
-
// LTE Cell with bandwidth = 10000
CellIdentityLte cellIdentity10 =
new CellIdentityLte(1, 1, 1, 1, new int[] {1, 2}, 10000, "1", "1", "test",
@@ -2372,16 +2359,11 @@ public class ServiceStateTrackerTest extends TelephonyTest {
public void testPhyChanBandwidthForNr() {
// NR Cell with bandwidth = 10000
CellIdentityNr nrCi = new CellIdentityNr(
- 0, 0, 0, new int[]{10000}, "", "", 5, "", "", Collections.emptyList());
+ 0, 0, 0, new int[] {}, "", "", 5, "", "", Collections.emptyList());
- sendRegStateUpdateForNrCellId(nrCi);
- // should ratchet for NR
sendPhyChanConfigChange(new int[] {10000, 5000}, TelephonyManager.NETWORK_TYPE_NR, 0);
- assertArrayEquals(new int[]{10000, 5000}, sst.mSS.getCellBandwidths());
-
- // should not ratchet for LTE
- sendPhyChanConfigChange(new int[] {100}, TelephonyManager.NETWORK_TYPE_LTE, 0);
- assertArrayEquals(new int[]{}, sst.mSS.getCellBandwidths());
+ sendRegStateUpdateForNrCellId(nrCi);
+ assertArrayEquals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths());
}
/**
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
index 2f56f2ad90..b044814765 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
@@ -16,6 +16,8 @@
package com.android.internal.telephony;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN;
+
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyString;
@@ -109,6 +111,7 @@ import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
import com.android.internal.telephony.imsphone.ImsNrSaModeHandler;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
+import com.android.internal.telephony.metrics.DeviceStateHelper;
import com.android.internal.telephony.metrics.ImsStats;
import com.android.internal.telephony.metrics.MetricsCollector;
import com.android.internal.telephony.metrics.PersistAtomsStorage;
@@ -269,6 +272,7 @@ public abstract class TelephonyTest {
protected DataServiceManager mMockedWlanDataServiceManager;
protected ServiceStateStats mServiceStateStats;
protected SatelliteController mSatelliteController;
+ protected DeviceStateHelper mDeviceStateHelper;
// Initialized classes
protected ActivityManager mActivityManager;
@@ -504,6 +508,7 @@ public abstract class TelephonyTest {
mMockedWlanDataServiceManager = Mockito.mock(DataServiceManager.class);
mServiceStateStats = Mockito.mock(ServiceStateStats.class);
mSatelliteController = Mockito.mock(SatelliteController.class);
+ mDeviceStateHelper = Mockito.mock(DeviceStateHelper.class);
TelephonyManager.disableServiceHandleCaching();
PropertyInvalidatedCache.disableForTestMode();
@@ -828,6 +833,11 @@ public abstract class TelephonyTest {
doReturn(null).when(mContext).getFileStreamPath(anyString());
doReturn(mPersistAtomsStorage).when(mMetricsCollector).getAtomsStorage();
doReturn(mWifiManager).when(mContext).getSystemService(eq(Context.WIFI_SERVICE));
+ doReturn(mDeviceStateHelper).when(mMetricsCollector).getDeviceStateHelper();
+ doReturn(CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN)
+ .when(mDeviceStateHelper)
+ .getFoldState();
+ doReturn(null).when(mContext).getSystemService(eq(Context.DEVICE_STATE_SERVICE));
//Use reflection to mock singletons
replaceInstance(CallManager.class, "INSTANCE", null, mCallManager);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
index f7ea4b66f9..c47eb3beae 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
@@ -40,6 +40,7 @@ import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
@@ -50,6 +51,7 @@ import androidx.test.InstrumentationRegistry;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyTest;
import com.google.i18n.phonenumbers.ShortNumberInfo;
@@ -368,8 +370,31 @@ public class EmergencyNumberTrackerTest extends TelephonyTest {
IntentFilter ifilter = intentCaptor.getValue();
assertTrue(ifilter.hasAction(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED));
}
+
+ @Test
+ public void testUpdateEmergencyCountryIso_whenStatePowerOff() throws Exception {
+ testUpdateEmergencyCountryIso(ServiceState.STATE_POWER_OFF);
+ }
+
+ @Test
+ public void testUpdateEmergencyCountryIso_whenStateInService() throws Exception {
+ testUpdateEmergencyCountryIso(ServiceState.STATE_IN_SERVICE);
+ }
+
@Test
- public void testUpdateEmergencyCountryIso() throws Exception {
+ public void testUpdateEmergencyCountryIso_whenStateOos() throws Exception {
+ testUpdateEmergencyCountryIso(ServiceState.STATE_OUT_OF_SERVICE);
+ }
+
+ @Test
+ public void testUpdateEmergencyCountryIso_whenStateEmergencyOnly() throws Exception {
+ testUpdateEmergencyCountryIso(ServiceState.STATE_EMERGENCY_ONLY);
+ }
+
+ private void testUpdateEmergencyCountryIso(int ss) throws Exception {
+ doReturn(mLocaleTracker).when(mSST).getLocaleTracker();
+ doReturn("us").when(mLocaleTracker).getLastKnownCountryIso();
+
sendEmergencyNumberPrefix(mEmergencyNumberTrackerMock);
mEmergencyNumberTrackerMock.updateEmergencyNumberDatabaseCountryChange("us");
@@ -377,10 +402,14 @@ public class EmergencyNumberTrackerTest extends TelephonyTest {
assertTrue(mEmergencyNumberTrackerMock.getEmergencyCountryIso().equals("us"));
assertTrue(mEmergencyNumberTrackerMock.getLastKnownEmergencyCountryIso().equals("us"));
+ doReturn(ss).when(mServiceState).getState();
mEmergencyNumberTrackerMock.updateEmergencyNumberDatabaseCountryChange("");
processAllMessages();
assertTrue(mEmergencyNumberTrackerMock.getEmergencyCountryIso().equals(""));
assertTrue(mEmergencyNumberTrackerMock.getLastKnownEmergencyCountryIso().equals("us"));
+
+ //make sure we look up cached location whenever current iso is null
+ verify(mLocaleTracker).getLastKnownCountryIso();
}
@Test
diff --git a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java
index 857b6a43e1..d0a20949bb 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java
@@ -1425,6 +1425,43 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
@Test
@SmallTest
+ public void testAutoRejectedCauses() {
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_CALL_ON_OTHER_SUB, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_ONGOING_E911_CALL, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_ONGOING_CALL_SETUP, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_MAX_CALL_LIMIT_REACHED, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_ONGOING_CALL_TRANSFER, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_ONGOING_CONFERENCE_CALL, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_ONGOING_HANDOVER, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_REJECT_ONGOING_CALL_UPGRADE, 0),
+ Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_SIP_BAD_REQUEST, 0), Call.State.INCOMING));
+ assertEquals(DisconnectCause.INCOMING_AUTO_REJECTED, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_SIP_BAD_REQUEST, 0), Call.State.WAITING));
+ assertEquals(DisconnectCause.SERVER_ERROR, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_SIP_BAD_REQUEST, 0), Call.State.DIALING));
+ assertEquals(DisconnectCause.SERVER_ERROR, mCTUT.getDisconnectCauseFromReasonInfo(
+ new ImsReasonInfo(ImsReasonInfo.CODE_SIP_BAD_REQUEST, 0), Call.State.ALERTING));
+ }
+
+ @Test
+ @SmallTest
public void testImsAlternateEmergencyDisconnect() {
assertEquals(DisconnectCause.IMS_SIP_ALTERNATE_EMERGENCY_CALL,
mCTUT.getDisconnectCauseFromReasonInfo(
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 58864229e7..d4e1b86cda 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/MetricsCollectorTest.java
@@ -104,7 +104,7 @@ public class MetricsCollectorTest extends TelephonyTest {
mActivePort = mock(UiccPort.class);
mServiceStateStats = mock(ServiceStateStats.class);
mMetricsCollector =
- new MetricsCollector(mContext, mPersistAtomsStorage);
+ new MetricsCollector(mContext, mPersistAtomsStorage, mDeviceStateHelper);
doReturn(mSST).when(mSecondPhone).getServiceStateTracker();
doReturn(mServiceStateStats).when(mSST).getServiceStateStats();
}
@@ -455,4 +455,4 @@ public class MetricsCollectorTest extends TelephonyTest {
assertThat(actualAtoms).hasSize(4);
assertThat(result).isEqualTo(StatsManager.PULL_SUCCESS);
}
-} \ No newline at end of file
+}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java
index 8885aa4f59..7b66a52e40 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java
@@ -19,6 +19,8 @@ package com.android.internal.telephony.metrics;
import static android.telephony.TelephonyManager.DATA_CONNECTED;
import static android.telephony.TelephonyManager.DATA_UNKNOWN;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED;
+import static com.android.internal.telephony.TelephonyStatsLog.CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
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__BEARER_AT_END__CALL_BEARER_UNKNOWN;
@@ -993,6 +995,47 @@ public class ServiceStateStatsTest extends TelephonyTest {
mPhone, mServiceState, VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_UNKNOWN));
}
+ @Test
+ @SmallTest
+ public void onFoldStateChanged_modemOff() throws Exception {
+ doReturn(ServiceState.STATE_POWER_OFF).when(mServiceState).getVoiceRegState();
+ doReturn(ServiceState.STATE_POWER_OFF).when(mServiceState).getDataRegState();
+ doReturn(TelephonyManager.NETWORK_TYPE_UNKNOWN).when(mServiceState).getVoiceNetworkType();
+ doReturn(TelephonyManager.NETWORK_TYPE_UNKNOWN).when(mServiceState).getDataNetworkType();
+ mockWwanPsRat(TelephonyManager.NETWORK_TYPE_UNKNOWN);
+ doReturn(-1).when(mPhone).getCarrierId();
+ mServiceStateStats.onServiceStateChanged(mServiceState);
+ mServiceStateStats.incTimeMillis(100L);
+
+ mServiceStateStats.onFoldStateChanged(CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED);
+ verifyNoMoreInteractions(mPersistAtomsStorage);
+ }
+
+ @Test
+ @SmallTest
+ public void onFoldStateChanged_LTEMode() throws Exception {
+ // Using default service state for LTE with fold state unknown
+ mServiceStateStats.onServiceStateChanged(mServiceState);
+ mServiceStateStats.incTimeMillis(100L);
+ mServiceStateStats.onFoldStateChanged(CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED);
+ mServiceStateStats.incTimeMillis(1000L);
+ // Same fold state as before should not generate a new atom
+ mServiceStateStats.onFoldStateChanged(CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED);
+ mServiceStateStats.incTimeMillis(1000L);
+
+ // There should be 2 service state updates
+ mServiceStateStats.conclude();
+ ArgumentCaptor<CellularServiceState> captor =
+ ArgumentCaptor.forClass(CellularServiceState.class);
+ verify(mPersistAtomsStorage, times(2))
+ .addCellularServiceStateAndCellularDataServiceSwitch(captor.capture(), eq(null));
+ CellularServiceState state = captor.getAllValues().get(0);
+ assertEquals(CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_UNKNOWN, state.foldState);
+ state = captor.getAllValues().get(1);
+ assertEquals(CELLULAR_SERVICE_STATE__FOLD_STATE__STATE_CLOSED, state.foldState);
+ verifyNoMoreInteractions(mPersistAtomsStorage);
+ }
+
private void mockWwanPsRat(@NetworkType int rat) {
mockWwanRat(
NetworkRegistrationInfo.DOMAIN_PS,
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 bf02bb0182..bc1d7674ad 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -428,6 +428,47 @@ public class DatagramDispatcherTest extends TelephonyTest {
verifyNoMoreInteractions(mMockDatagramController);
}
+ @Test
+ public void testOnSatelliteModemStateChanged_modemStateListening() {
+ mDatagramDispatcherUT.onSatelliteModemStateChanged(
+ SatelliteManager.SATELLITE_MODEM_STATE_LISTENING);
+ processAllMessages();
+ verifyNoMoreInteractions(mMockDatagramController);
+ }
+
+ @Test
+ public void testOnSatelliteModemStateChanged_modemStateOff_modemSendingDatagrams() {
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
+ true, mResultListener::offer);
+
+ mDatagramDispatcherUT.onSatelliteModemStateChanged(
+ SatelliteManager.SATELLITE_MODEM_STATE_OFF);
+
+ processAllMessages();
+
+ mInOrder.verify(mMockDatagramController)
+ .updateSendStatus(anyInt(),
+ eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED),
+ eq(1), eq(SatelliteManager.SATELLITE_REQUEST_ABORTED));
+ mInOrder.verify(mMockDatagramController)
+ .updateSendStatus(anyInt(),
+ eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
+ eq(0), eq(SatelliteManager.SATELLITE_ERROR_NONE));
+ }
+
+ @Test
+ public void testOnSatelliteModemStateChanged_modemStateOff_modemNotSendingDatagrams() {
+ mDatagramDispatcherUT.onSatelliteModemStateChanged(
+ SatelliteManager.SATELLITE_MODEM_STATE_OFF);
+
+ processAllMessages();
+
+ mInOrder.verify(mMockDatagramController)
+ .updateSendStatus(anyInt(),
+ eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
+ eq(0), eq(SatelliteManager.SATELLITE_ERROR_NONE));
+ }
+
private static class TestDatagramDispatcher extends DatagramDispatcher {
private long mLong = SATELLITE_ALIGN_TIMEOUT;
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 709764610a..1c3777dc30 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
@@ -21,6 +21,7 @@ import static com.android.internal.telephony.satellite.DatagramController.SATELL
import android.annotation.NonNull;
import android.content.Context;
import android.provider.Telephony;
+import android.telephony.satellite.ISatelliteDatagramCallback;
import android.test.mock.MockContentResolver;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -36,15 +37,19 @@ import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.os.AsyncResult;
import android.os.Looper;
import android.os.Message;
+import android.os.IBinder;
+import android.os.RemoteException;
import android.telephony.satellite.SatelliteDatagram;
import android.telephony.satellite.SatelliteManager;
import android.util.Pair;
+import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyTest;
@@ -73,6 +78,7 @@ public class DatagramReceiverTest extends TelephonyTest {
private DatagramReceiver.SatelliteDatagramListenerHandler mSatelliteDatagramListenerHandler;
private TestDatagramReceiver mTestDemoModeDatagramReceiver;
+ @Mock private SatelliteController mMockSatelliteController;
@Mock private DatagramController mMockDatagramController;
@Mock private SatelliteModemInterface mMockSatelliteModemInterface;
@Mock private ControllerMetricsStats mMockControllerMetricsStats;
@@ -97,6 +103,7 @@ public class DatagramReceiverTest extends TelephonyTest {
Telephony.SatelliteDatagrams.PROVIDER_NAME, mFakeSatelliteProvider);
doReturn(mMockContentResolver).when(mContext).getContentResolver();
+ replaceInstance(SatelliteController.class, "sInstance", null, mMockSatelliteController);
replaceInstance(DatagramController.class, "sInstance", null,
mMockDatagramController);
replaceInstance(SatelliteModemInterface.class, "sInstance", null,
@@ -406,6 +413,70 @@ public class DatagramReceiverTest extends TelephonyTest {
assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_MODEM_BUSY);
}
+ @Test
+ public void testOnSatelliteModemStateChanged_modemStateIdle() {
+ mDatagramReceiverUT.onSatelliteModemStateChanged(
+ SatelliteManager.SATELLITE_MODEM_STATE_IDLE);
+ processAllMessages();
+ verifyNoMoreInteractions(mMockDatagramController);
+ }
+
+ @Test
+ public void testOnSatelliteModemStateChanged_modemStateOff_modemReceivingDatagrams() {
+ when(mMockDatagramController.isReceivingDatagrams()).thenReturn(true);
+ when(mMockDatagramController.getReceivePendingCount()).thenReturn(10);
+
+ mDatagramReceiverUT.onSatelliteModemStateChanged(
+ SatelliteManager.SATELLITE_MODEM_STATE_OFF);
+
+ processAllMessages();
+
+ mInOrder.verify(mMockDatagramController)
+ .updateReceiveStatus(anyInt(),
+ eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED),
+ eq(10), eq(SatelliteManager.SATELLITE_REQUEST_ABORTED));
+ mInOrder.verify(mMockDatagramController)
+ .updateReceiveStatus(anyInt(),
+ eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
+ eq(0), eq(SatelliteManager.SATELLITE_ERROR_NONE));
+ }
+
+ @Test
+ public void testOnSatelliteModemStateChanged_modemStateOff_modemNotReceivingDatagrams() {
+ when(mMockDatagramController.isReceivingDatagrams()).thenReturn(false);
+
+ mDatagramReceiverUT.onSatelliteModemStateChanged(
+ SatelliteManager.SATELLITE_MODEM_STATE_OFF);
+
+ processAllMessages();
+
+ mInOrder.verify(mMockDatagramController)
+ .updateReceiveStatus(anyInt(),
+ eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
+ eq(0), eq(SatelliteManager.SATELLITE_ERROR_NONE));
+ }
+
+ @Test
+ public void testRegisterForSatelliteDatagram_satelliteNotSupported() {
+ when(mMockSatelliteController.isSatelliteSupported()).thenReturn(false);
+
+ ISatelliteDatagramCallback callback = new ISatelliteDatagramCallback() {
+ @Override
+ public void onSatelliteDatagramReceived(long datagramId, SatelliteDatagram datagram,
+ int pendingCount, IVoidConsumer callback) throws RemoteException {
+ logd("onSatelliteDatagramReceived");
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+ };
+
+ assertThat(mDatagramReceiverUT.registerForSatelliteDatagram(SUB_ID, callback))
+ .isEqualTo(SatelliteManager.SATELLITE_NOT_SUPPORTED);
+ }
+
private static class TestDatagramReceiver extends DatagramReceiver {
private long mLong = SATELLITE_ALIGN_TIMEOUT;
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 180ea8337a..f6ed2e24df 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -16,7 +16,11 @@
package com.android.internal.telephony.satellite;
+import static android.telephony.satellite.SatelliteManager.KEY_DEMO_MODE_ENABLED;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_CAPABILITIES;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_ENABLED;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_NEXT_VISIBILITY;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_PROVISIONED;
import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_SUPPORTED;
import static android.telephony.satellite.SatelliteManager.NT_RADIO_TECHNOLOGY_EMTC_NTN;
@@ -29,17 +33,21 @@ import static android.telephony.satellite.SatelliteManager.SATELLITE_INVALID_MOD
import static android.telephony.satellite.SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_OFF;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_NOT_AUTHORIZED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_NOT_SUPPORTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_NO_RESOURCES;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RADIO_NOT_AVAILABLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_REQUEST_IN_PROGRESS;
import static android.telephony.satellite.SatelliteManager.SATELLITE_SERVICE_NOT_PROVISIONED;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_SERVICE_PROVISION_IN_PROGRESS;
import static com.android.internal.telephony.satellite.SatelliteController.SATELLITE_MODE_ENABLED_FALSE;
import static com.android.internal.telephony.satellite.SatelliteController.SATELLITE_MODE_ENABLED_TRUE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -59,7 +67,9 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncResult;
import android.os.Bundle;
+import android.os.CancellationSignal;
import android.os.Handler;
+import android.os.ICancellationSignal;
import android.os.Looper;
import android.os.Message;
import android.os.ResultReceiver;
@@ -67,6 +77,7 @@ import android.telephony.Rlog;
import android.telephony.satellite.ISatelliteDatagramCallback;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.ISatelliteStateCallback;
+import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
import android.telephony.satellite.SatelliteCapabilities;
import android.telephony.satellite.SatelliteDatagram;
import android.telephony.satellite.SatelliteManager;
@@ -76,6 +87,7 @@ import android.testing.TestableLooper;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.IVoidConsumer;
+import com.android.internal.telephony.Phone;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.ProvisionMetricsStats;
@@ -105,6 +117,8 @@ public class SatelliteControllerTest extends TelephonyTest {
private static final long TIMEOUT = 500;
private static final int SUB_ID = 0;
private static final int MAX_BYTES_PER_OUT_GOING_DATAGRAM = 339;
+ private static final String TEST_SATELLITE_TOKEN = "TEST_SATELLITE_TOKEN";
+ private static final String TEST_NEXT_SATELLITE_TOKEN = "TEST_NEXT_SATELLITE_TOKEN";
private TestSatelliteController mSatelliteControllerUT;
private TestSharedPreferences mSharedPreferences;
@@ -116,8 +130,9 @@ public class SatelliteControllerTest extends TelephonyTest {
@Mock private ControllerMetricsStats mMockControllerMetricsStats;
@Mock private ProvisionMetricsStats mMockProvisionMetricsStats;
@Mock private SessionMetricsStats mMockSessionMetricsStats;
-
private List<Integer> mIIntegerConsumerResults = new ArrayList<>();
+ @Mock private ISatelliteTransmissionUpdateCallback mStartTransmissionUpdateCallback;
+ @Mock private ISatelliteTransmissionUpdateCallback mStopTransmissionUpdateCallback;
private Semaphore mIIntegerConsumerSemaphore = new Semaphore(0);
private IIntegerConsumer mIIntegerConsumer = new IIntegerConsumer.Stub() {
@Override
@@ -141,6 +156,32 @@ public class SatelliteControllerTest extends TelephonyTest {
private SatelliteCapabilities mSatelliteCapabilities = new SatelliteCapabilities(
mSupportedRadioTechnologies, mIsPointingRequired, MAX_BYTES_PER_OUT_GOING_DATAGRAM,
new HashMap<>());
+ private Semaphore mSatelliteCapabilitiesSemaphore = new Semaphore(0);
+ private SatelliteCapabilities mQueriedSatelliteCapabilities = null;
+ private int mQueriedSatelliteCapabilitiesResultCode = SATELLITE_ERROR_NONE;
+ private ResultReceiver mSatelliteCapabilitiesReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ mQueriedSatelliteCapabilitiesResultCode = resultCode;
+ if (resultCode == SATELLITE_ERROR_NONE) {
+ if (resultData.containsKey(KEY_SATELLITE_CAPABILITIES)) {
+ mQueriedSatelliteCapabilities = resultData.getParcelable(
+ KEY_SATELLITE_CAPABILITIES, SatelliteCapabilities.class);
+ } else {
+ loge("KEY_SATELLITE_SUPPORTED does not exist.");
+ mQueriedSatelliteCapabilities = null;
+ }
+ } else {
+ logd("mSatelliteSupportReceiver: resultCode=" + resultCode);
+ mQueriedSatelliteCapabilities = null;
+ }
+ try {
+ mSatelliteCapabilitiesSemaphore.release();
+ } catch (Exception ex) {
+ loge("mSatelliteSupportReceiver: Got exception in releasing semaphore, ex=" + ex);
+ }
+ }
+ };
private boolean mQueriedSatelliteSupported = false;
private int mQueriedSatelliteSupportedResultCode = SATELLITE_ERROR_NONE;
@@ -194,6 +235,32 @@ public class SatelliteControllerTest extends TelephonyTest {
}
};
+ private boolean mQueriedIsDemoModeEnabled = false;
+ private int mQueriedIsDemoModeEnabledResultCode = SATELLITE_ERROR_NONE;
+ private Semaphore mIsDemoModeEnabledSemaphore = new Semaphore(0);
+ private ResultReceiver mIsDemoModeEnabledReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ mQueriedIsDemoModeEnabledResultCode = resultCode;
+ if (resultCode == SATELLITE_ERROR_NONE) {
+ if (resultData.containsKey(KEY_DEMO_MODE_ENABLED)) {
+ mQueriedIsDemoModeEnabled = resultData.getBoolean(KEY_DEMO_MODE_ENABLED);
+ } else {
+ loge("KEY_DEMO_MODE_ENABLED does not exist.");
+ mQueriedIsDemoModeEnabled = false;
+ }
+ } else {
+ logd("mIsSatelliteEnableReceiver: resultCode=" + resultCode);
+ mQueriedIsDemoModeEnabled = false;
+ }
+ try {
+ mIsDemoModeEnabledSemaphore.release();
+ } catch (Exception ex) {
+ loge("mIsDemoModeEnabledReceiver: Got exception in releasing semaphore, ex=" + ex);
+ }
+ }
+ };
+
private boolean mQueriedIsSatelliteProvisioned = false;
private int mQueriedIsSatelliteProvisionedResultCode = SATELLITE_ERROR_NONE;
private Semaphore mIsSatelliteProvisionedSemaphore = new Semaphore(0);
@@ -221,6 +288,62 @@ public class SatelliteControllerTest extends TelephonyTest {
}
};
+ private boolean mQueriedSatelliteAllowed = false;
+ private int mQueriedSatelliteAllowedResultCode = SATELLITE_ERROR_NONE;
+ private Semaphore mSatelliteAllowedSemaphore = new Semaphore(0);
+ private ResultReceiver mSatelliteAllowedReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ mQueriedSatelliteAllowedResultCode = resultCode;
+ if (resultCode == SATELLITE_ERROR_NONE) {
+ if (resultData.containsKey(KEY_SATELLITE_COMMUNICATION_ALLOWED)) {
+ mQueriedSatelliteAllowed = resultData.getBoolean(
+ KEY_SATELLITE_COMMUNICATION_ALLOWED);
+ } else {
+ loge("KEY_SATELLITE_COMMUNICATION_ALLOWED does not exist.");
+ mQueriedSatelliteAllowed = false;
+ }
+ } else {
+ logd("mSatelliteSupportReceiver: resultCode=" + resultCode);
+ mQueriedSatelliteAllowed = false;
+ }
+ try {
+ mSatelliteAllowedSemaphore.release();
+ } catch (Exception ex) {
+ loge("mSatelliteAllowedReceiver: Got exception in releasing semaphore, ex=" + ex);
+ }
+ }
+ };
+
+ private int mQueriedSatelliteVisibilityTime = -1;
+ private int mSatelliteNextVisibilityTime = 3600;
+ private int mQueriedSatelliteVisibilityTimeResultCode = SATELLITE_ERROR_NONE;
+ private Semaphore mSatelliteVisibilityTimeSemaphore = new Semaphore(0);
+ private ResultReceiver mSatelliteVisibilityTimeReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ mQueriedSatelliteVisibilityTimeResultCode = resultCode;
+ if (resultCode == SATELLITE_ERROR_NONE) {
+ if (resultData.containsKey(KEY_SATELLITE_NEXT_VISIBILITY)) {
+ mQueriedSatelliteVisibilityTime = resultData.getInt(
+ KEY_SATELLITE_NEXT_VISIBILITY);
+ } else {
+ loge("KEY_SATELLITE_NEXT_VISIBILITY does not exist.");
+ mQueriedSatelliteVisibilityTime = -1;
+ }
+ } else {
+ logd("mSatelliteSupportReceiver: resultCode=" + resultCode);
+ mQueriedSatelliteVisibilityTime = -1;
+ }
+ try {
+ mSatelliteVisibilityTimeSemaphore.release();
+ } catch (Exception ex) {
+ loge("mSatelliteAllowedReceiver: Got exception in releasing semaphore, ex=" + ex);
+ }
+ }
+ };
+
+
@Before
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
@@ -262,6 +385,12 @@ public class SatelliteControllerTest extends TelephonyTest {
.when(mMockSessionMetricsStats).setRadioTechnology(anyInt());
doNothing().when(mMockSessionMetricsStats).reportSessionMetrics();
+ doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
+ .setResultCode(anyInt());
+ doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
+ .setIsProvisionRequest(eq(false));
+ doNothing().when(mMockProvisionMetricsStats).reportProvisionMetrics();
+ doNothing().when(mMockControllerMetricsStats).reportDeprovisionCount(anyInt());
mSatelliteControllerUT = new TestSatelliteController(mContext, Looper.myLooper());
verify(mMockSatelliteModemInterface).registerForSatelliteProvisionStateChanged(
any(Handler.class),
@@ -285,6 +414,140 @@ public class SatelliteControllerTest extends TelephonyTest {
}
@Test
+ public void testRequestIsSatelliteCommunicationAllowedForCurrentLocation() {
+ mSatelliteAllowedSemaphore.drainPermits();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsSatelliteCommunicationAllowedForCurrentLocation(SUB_ID,
+ mSatelliteAllowedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, mQueriedSatelliteAllowedResultCode);
+
+ resetSatelliteControllerUT();
+ mSatelliteControllerUT.requestIsSatelliteCommunicationAllowedForCurrentLocation(SUB_ID,
+ mSatelliteAllowedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteAllowedResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteAllowedForCurrentLocation(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsSatelliteCommunicationAllowedForCurrentLocation(SUB_ID,
+ mSatelliteAllowedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, mQueriedSatelliteAllowedResultCode);
+ assertTrue(mQueriedSatelliteAllowed);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpNullResponseForRequestIsSatelliteAllowedForCurrentLocation(SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsSatelliteCommunicationAllowedForCurrentLocation(SUB_ID,
+ mSatelliteAllowedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteAllowedResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpNullResponseForRequestIsSatelliteAllowedForCurrentLocation(
+ SATELLITE_INVALID_MODEM_STATE);
+ mSatelliteControllerUT.requestIsSatelliteCommunicationAllowedForCurrentLocation(SUB_ID,
+ mSatelliteAllowedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(1));
+ assertEquals(SATELLITE_INVALID_MODEM_STATE, mQueriedSatelliteAllowedResultCode);
+ }
+
+ @Test
+ public void testRequestTimeForNextSatelliteVisibility() {
+ mSatelliteVisibilityTimeSemaphore.drainPermits();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, mQueriedSatelliteVisibilityTimeResultCode);
+
+ resetSatelliteControllerUT();
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteVisibilityTimeResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestTimeForNextSatelliteVisibility(mSatelliteNextVisibilityTime,
+ SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteVisibilityTimeResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestTimeForNextSatelliteVisibility(mSatelliteNextVisibilityTime,
+ SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_SERVICE_NOT_PROVISIONED, mQueriedSatelliteVisibilityTimeResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestTimeForNextSatelliteVisibility(mSatelliteNextVisibilityTime,
+ SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, mQueriedSatelliteVisibilityTimeResultCode);
+ assertEquals(mSatelliteNextVisibilityTime, mQueriedSatelliteVisibilityTime);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpNullResponseForRequestTimeForNextSatelliteVisibility(
+ SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteVisibilityTimeResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpNullResponseForRequestTimeForNextSatelliteVisibility(
+ SATELLITE_INVALID_MODEM_STATE);
+ mSatelliteControllerUT.requestTimeForNextSatelliteVisibility(SUB_ID,
+ mSatelliteVisibilityTimeReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestTimeForNextSatelliteVisibilityResult(1));
+ assertEquals(SATELLITE_INVALID_MODEM_STATE, mQueriedSatelliteVisibilityTimeResultCode);
+ }
+
+ @Test
public void testRequestSatelliteEnabled() {
mIsSatelliteEnabledSemaphore.drainPermits();
@@ -503,6 +766,258 @@ public class SatelliteControllerTest extends TelephonyTest {
}
@Test
+ public void testRequestSatelliteCapabilities() {
+ mSatelliteCapabilitiesSemaphore.drainPermits();
+ mSatelliteControllerUT.requestSatelliteCapabilities(SUB_ID, mSatelliteCapabilitiesReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestSatelliteCapabilitiesResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteCapabilitiesResultCode);
+
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestSatelliteCapabilities(SUB_ID, mSatelliteCapabilitiesReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestSatelliteCapabilitiesResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, mQueriedSatelliteCapabilitiesResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestSatelliteCapabilities(mSatelliteCapabilities, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestSatelliteCapabilities(SUB_ID, mSatelliteCapabilitiesReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestSatelliteCapabilitiesResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, mQueriedSatelliteCapabilitiesResultCode);
+ assertEquals(mSatelliteCapabilities, mQueriedSatelliteCapabilities);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpNullResponseForRequestSatelliteCapabilities(SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestSatelliteCapabilities(SUB_ID, mSatelliteCapabilitiesReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestSatelliteCapabilitiesResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedSatelliteCapabilitiesResultCode);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpNullResponseForRequestSatelliteCapabilities(SATELLITE_INVALID_MODEM_STATE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestSatelliteCapabilities(SUB_ID, mSatelliteCapabilitiesReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestSatelliteCapabilitiesResult(1));
+ assertEquals(SATELLITE_INVALID_MODEM_STATE, mQueriedSatelliteCapabilitiesResultCode);
+ }
+
+ @Test
+ public void testStartSatelliteTransmissionUpdates() {
+ mIIntegerConsumerSemaphore.drainPermits();
+ mIIntegerConsumerResults.clear();
+ mSatelliteControllerUT.startSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStartTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.startSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStartTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.startSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStartTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForStartSatelliteTransmissionUpdates(SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.startSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStartTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_SERVICE_NOT_PROVISIONED, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForStartSatelliteTransmissionUpdates(SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.startSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStartTransmissionUpdateCallback);
+ verify(mMockPointingAppController).registerForSatelliteTransmissionUpdates(anyInt(),
+ eq(mStartTransmissionUpdateCallback), any());
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+ verify(mMockPointingAppController).startSatelliteTransmissionUpdates(any(Message.class),
+ any(Phone.class));
+ verify(mMockPointingAppController).setStartedSatelliteTransmissionUpdates(eq(true));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForStartSatelliteTransmissionUpdates(SATELLITE_INVALID_TELEPHONY_STATE);
+ mSatelliteControllerUT.startSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStartTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+ verify(mMockPointingAppController).unregisterForSatelliteTransmissionUpdates(anyInt(),
+ any(), eq(mStartTransmissionUpdateCallback), any(Phone.class));
+ verify(mMockPointingAppController).setStartedSatelliteTransmissionUpdates(eq(false));
+ }
+
+ @Test
+ public void testStopSatelliteTransmissionUpdates() {
+ mIIntegerConsumerSemaphore.drainPermits();
+ mIIntegerConsumerResults.clear();
+ mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStopTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStopTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStopTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForStopSatelliteTransmissionUpdates(SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStopTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_SERVICE_NOT_PROVISIONED, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForStopSatelliteTransmissionUpdates(SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStopTransmissionUpdateCallback);
+ verify(mMockPointingAppController).unregisterForSatelliteTransmissionUpdates(anyInt(),
+ any(), eq(mStopTransmissionUpdateCallback), any(Phone.class));
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+ verify(mMockPointingAppController).stopSatelliteTransmissionUpdates(any(Message.class),
+ any(Phone.class));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForStopSatelliteTransmissionUpdates(SATELLITE_INVALID_TELEPHONY_STATE);
+ mSatelliteControllerUT.stopSatelliteTransmissionUpdates(SUB_ID, mIIntegerConsumer,
+ mStopTransmissionUpdateCallback);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+ }
+
+ @Test
+ public void testRequestIsDemoModeEnabled() {
+ mIsDemoModeEnabledSemaphore.drainPermits();
+ resetSatelliteControllerUT();
+ mSatelliteControllerUT.requestIsDemoModeEnabled(SUB_ID, mIsDemoModeEnabledReceiver);
+ assertTrue(waitForRequestIsDemoModeEnabledResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedIsDemoModeEnabledResultCode);
+ assertFalse(mQueriedIsDemoModeEnabled);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsDemoModeEnabled(SUB_ID, mIsDemoModeEnabledReceiver);
+ assertTrue(waitForRequestIsDemoModeEnabledResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, mQueriedIsDemoModeEnabledResultCode);
+ assertFalse(mQueriedIsDemoModeEnabled);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsDemoModeEnabled(SUB_ID, mIsDemoModeEnabledReceiver);
+ assertTrue(waitForRequestIsDemoModeEnabledResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, mQueriedIsDemoModeEnabledResultCode);
+ assertFalse(mQueriedIsDemoModeEnabled);
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsDemoModeEnabled(SUB_ID, mIsDemoModeEnabledReceiver);
+ assertTrue(waitForRequestIsDemoModeEnabledResult(1));
+ assertEquals(SATELLITE_SERVICE_NOT_PROVISIONED, mQueriedIsDemoModeEnabledResultCode);
+ assertFalse(mQueriedIsDemoModeEnabled);
+
+ resetSatelliteControllerUT();
+ boolean isDemoModeEnabled = mSatelliteControllerUT.isDemoModeEnabled();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.requestIsDemoModeEnabled(SUB_ID, mIsDemoModeEnabledReceiver);
+ assertTrue(waitForRequestIsDemoModeEnabledResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, mQueriedIsDemoModeEnabledResultCode);
+ assertEquals(isDemoModeEnabled, mQueriedIsDemoModeEnabled);
+ }
+
+ @Test
+ public void testIsSatelliteEnabled() {
+ assertFalse(mSatelliteControllerUT.isSatelliteEnabled());
+ setUpResponseForRequestIsSatelliteEnabled(true, SATELLITE_ERROR_NONE);
+ mIsSatelliteEnabledSemaphore.drainPermits();
+ mSatelliteControllerUT.requestIsSatelliteEnabled(SUB_ID, mIsSatelliteEnabledReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestIsSatelliteEnabledResult(1));
+ assertEquals(mSatelliteControllerUT.isSatelliteEnabled(), mQueriedIsSatelliteEnabled);
+ }
+
+ @Test
public void testOnSatelliteServiceConnected() {
verifySatelliteSupported(false, SATELLITE_RADIO_NOT_AVAILABLE);
verifySatelliteEnabled(false, SATELLITE_INVALID_TELEPHONY_STATE);
@@ -715,6 +1230,191 @@ public class SatelliteControllerTest extends TelephonyTest {
verify(mMockDatagramController, times(1)).pollPendingSatelliteDatagrams(anyInt(), any());
}
+ @Test
+ public void testProvisionSatelliteService() {
+ String mText = "This is test provision data.";
+ byte[] testProvisionData = mText.getBytes();
+ CancellationSignal cancellationSignal = new CancellationSignal();
+ ICancellationSignal cancelRemote = null;
+ mIIntegerConsumerResults.clear();
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+ assertNull(cancelRemote);
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, (long) mIIntegerConsumerResults.get(0));
+ assertNull(cancelRemote);
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+ assertNull(cancelRemote);
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForProvisionSatelliteService(TEST_SATELLITE_TOKEN, testProvisionData,
+ SATELLITE_ERROR_NONE);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+ assertNotNull(cancelRemote);
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForProvisionSatelliteService(TEST_SATELLITE_TOKEN, testProvisionData,
+ SATELLITE_NOT_AUTHORIZED);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_NOT_AUTHORIZED, (long) mIIntegerConsumerResults.get(0));
+ assertNotNull(cancelRemote);
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForProvisionSatelliteService(TEST_NEXT_SATELLITE_TOKEN, testProvisionData,
+ SATELLITE_ERROR_NONE);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_NEXT_SATELLITE_TOKEN, testProvisionData, mIIntegerConsumer);
+ cancellationSignal.setRemote(cancelRemote);
+ cancellationSignal.cancel();
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+ verify(mMockSatelliteModemInterface).deprovisionSatelliteService(
+ eq(TEST_NEXT_SATELLITE_TOKEN), any(Message.class));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpNoResponseForProvisionSatelliteService(TEST_SATELLITE_TOKEN);
+ setUpResponseForProvisionSatelliteService(TEST_NEXT_SATELLITE_TOKEN, testProvisionData,
+ SATELLITE_ERROR_NONE);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ cancelRemote = mSatelliteControllerUT.provisionSatelliteService(SUB_ID,
+ TEST_NEXT_SATELLITE_TOKEN,
+ testProvisionData, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_SERVICE_PROVISION_IN_PROGRESS,
+ (long) mIIntegerConsumerResults.get(0));
+ }
+
+ @Test
+ public void testDeprovisionSatelliteService() {
+ mIIntegerConsumerSemaphore.drainPermits();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(false, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_NOT_SUPPORTED, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForDeprovisionSatelliteService(TEST_SATELLITE_TOKEN, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_TELEPHONY_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(false, SATELLITE_ERROR_NONE);
+ setUpResponseForDeprovisionSatelliteService(TEST_SATELLITE_TOKEN, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForDeprovisionSatelliteService(TEST_SATELLITE_TOKEN, SATELLITE_ERROR_NONE);
+ mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
+
+ resetSatelliteControllerUT();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_ERROR_NONE);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ verifySatelliteSupported(true, SATELLITE_ERROR_NONE);
+ verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);
+ setUpResponseForDeprovisionSatelliteService(TEST_SATELLITE_TOKEN,
+ SATELLITE_INVALID_MODEM_STATE);
+ mSatelliteControllerUT.deprovisionSatelliteService(SUB_ID,
+ TEST_SATELLITE_TOKEN, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_INVALID_MODEM_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ }
+
private void resetSatelliteControllerUTEnabledState() {
logd("resetSatelliteControllerUTEnabledState");
setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RADIO_NOT_AVAILABLE);
@@ -773,6 +1473,18 @@ public class SatelliteControllerTest extends TelephonyTest {
verifySatelliteEnabled(true, SATELLITE_ERROR_NONE);
}
+ private void setUpResponseForRequestIsSatelliteEnabled(boolean isSatelliteEnabled,
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, isSatelliteEnabled, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface).requestIsSatelliteEnabled(any(Message.class));
+ }
+
private void setUpResponseForRequestIsSatelliteSupported(
boolean isSatelliteSupported, @SatelliteManager.SatelliteError int error) {
SatelliteException exception = (error == SATELLITE_ERROR_NONE)
@@ -785,6 +1497,59 @@ public class SatelliteControllerTest extends TelephonyTest {
}).when(mMockSatelliteModemInterface).requestIsSatelliteSupported(any(Message.class));
}
+ private void setUpResponseForRequestIsSatelliteAllowedForCurrentLocation(
+ boolean isSatelliteAllowed, @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, isSatelliteAllowed, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface)
+ .requestIsSatelliteCommunicationAllowedForCurrentLocation(any(Message.class));
+ }
+
+ private void setUpNullResponseForRequestIsSatelliteAllowedForCurrentLocation(
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface)
+ .requestIsSatelliteCommunicationAllowedForCurrentLocation(any(Message.class));
+ }
+
+ private void setUpResponseForRequestTimeForNextSatelliteVisibility(
+ int satelliteVisibilityTime, @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ int[] visibilityTime = new int[] {satelliteVisibilityTime};
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, visibilityTime, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface)
+ .requestTimeForNextSatelliteVisibility(any(Message.class));
+ }
+
+ private void setUpNullResponseForRequestTimeForNextSatelliteVisibility(
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface)
+ .requestTimeForNextSatelliteVisibility(any(Message.class));
+ }
+
private void setUpResponseForRequestIsSatelliteProvisioned(
boolean isSatelliteProvisioned, @SatelliteManager.SatelliteError int error) {
SatelliteException exception = (error == SATELLITE_ERROR_NONE)
@@ -816,6 +1581,37 @@ public class SatelliteControllerTest extends TelephonyTest {
.requestSatelliteEnabled(eq(enabled), eq(demoMode), any(Message.class));
}
+ private void setUpResponseForProvisionSatelliteService(
+ String token, byte[] provisionData, @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[2];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface)
+ .provisionSatelliteService(eq(token), any(byte[].class), any(Message.class));
+ }
+
+ private void setUpNoResponseForProvisionSatelliteService(String token) {
+ doNothing().when(mMockSatelliteModemInterface)
+ .provisionSatelliteService(eq(token), any(), any(Message.class));
+ }
+
+ private void setUpResponseForDeprovisionSatelliteService(String token,
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[1];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface)
+ .deprovisionSatelliteService(eq(token), any(Message.class));
+ }
+
private void setUpResponseForRequestSatelliteCapabilities(
SatelliteCapabilities satelliteCapabilities,
@SatelliteManager.SatelliteError int error) {
@@ -845,6 +1641,44 @@ public class SatelliteControllerTest extends TelephonyTest {
return true;
}
+ private void setUpNullResponseForRequestSatelliteCapabilities(
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface).requestSatelliteCapabilities(any(Message.class));
+ }
+
+ private void setUpResponseForStartSatelliteTransmissionUpdates(
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockPointingAppController).startSatelliteTransmissionUpdates(any(Message.class),
+ any());
+ }
+
+ private void setUpResponseForStopSatelliteTransmissionUpdates(
+ @SatelliteManager.SatelliteError int error) {
+ SatelliteException exception = (error == SATELLITE_ERROR_NONE)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[0];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockPointingAppController).stopSatelliteTransmissionUpdates(any(Message.class),
+ any());
+ }
+
private boolean waitForRequestIsSatelliteSupportedResult(int expectedNumberOfEvents) {
for (int i = 0; i < expectedNumberOfEvents; i++) {
try {
@@ -860,6 +1694,41 @@ public class SatelliteControllerTest extends TelephonyTest {
return true;
}
+ private boolean waitForRequestIsSatelliteAllowedForCurrentLocationResult(
+ int expectedNumberOfEvents) {
+ for (int i = 0; i < expectedNumberOfEvents; i++) {
+ try {
+ if (!mSatelliteAllowedSemaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS)) {
+ loge("Timeout to receive "
+ + "requestIsSatelliteCommunicationAllowedForCurrentLocation()"
+ + " callback");
+ return false;
+ }
+ } catch (Exception ex) {
+ loge("waitForRequestIsSatelliteSupportedResult: Got exception=" + ex);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean waitForRequestTimeForNextSatelliteVisibilityResult(
+ int expectedNumberOfEvents) {
+ for (int i = 0; i < expectedNumberOfEvents; i++) {
+ try {
+ if (!mSatelliteVisibilityTimeSemaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS)) {
+ loge("Timeout to receive "
+ + "requestTimeForNextSatelliteVisibility() callback");
+ return false;
+ }
+ } catch (Exception ex) {
+ loge("waitForRequestTimeForNextSatelliteVisibilityResult: Got exception=" + ex);
+ return false;
+ }
+ }
+ return true;
+ }
+
private boolean waitForRequestIsSatelliteEnabledResult(int expectedNumberOfEvents) {
for (int i = 0; i < expectedNumberOfEvents; i++) {
try {
@@ -890,6 +1759,36 @@ public class SatelliteControllerTest extends TelephonyTest {
return true;
}
+ private boolean waitForRequestSatelliteCapabilitiesResult(int expectedNumberOfEvents) {
+ for (int i = 0; i < expectedNumberOfEvents; i++) {
+ try {
+ if (!mSatelliteCapabilitiesSemaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS)) {
+ loge("Timeout to receive requestSatelliteCapabilities() callback");
+ return false;
+ }
+ } catch (Exception ex) {
+ loge("waitForRequestSatelliteCapabilitiesResult: Got exception=" + ex);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean waitForRequestIsDemoModeEnabledResult(int expectedNumberOfEvents) {
+ for (int i = 0; i < expectedNumberOfEvents; i++) {
+ try {
+ if (!mIsDemoModeEnabledSemaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS)) {
+ loge("Timeout to receive requestIsDemoModeEnabled() callback");
+ return false;
+ }
+ } catch (Exception ex) {
+ loge("waitForRequestIsDemoModeEnabled: Got exception=" + ex);
+ return false;
+ }
+ }
+ return true;
+ }
+
private boolean waitForIIntegerConsumerResult(int expectedNumberOfEvents) {
for (int i = 0; i < expectedNumberOfEvents; i++) {
try {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
index c52c6cc401..3abfac79e8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
@@ -146,6 +146,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
private static final UserHandle FAKE_USER_HANDLE = new UserHandle(12);
+ private static final UserHandle FAKE_MANAGED_PROFILE_USER_HANDLE = new UserHandle(13);
+
// mocked
private SubscriptionManagerServiceCallback mMockedSubscriptionManagerServiceCallback;
private EuiccController mEuiccController;
@@ -212,6 +214,9 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
setIdentifierAccess(false);
setPhoneNumberAccess(PackageManager.PERMISSION_DENIED);
+ doReturn(true).when(mUserManager)
+ .isManagedProfile(eq(FAKE_MANAGED_PROFILE_USER_HANDLE.getIdentifier()));
+
logd("SubscriptionManagerServiceTest -Setup!");
}
@@ -1081,6 +1086,13 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
assertThat(mSubscriptionManagerServiceUT.isSubscriptionAssociatedWithUser(1,
FAKE_USER_HANDLE)).isEqualTo(true);
+
+ // Work profile is not associated with any subscription
+ associatedSubInfoList = mSubscriptionManagerServiceUT
+ .getSubscriptionInfoListAssociatedWithUser(FAKE_MANAGED_PROFILE_USER_HANDLE);
+ assertThat(associatedSubInfoList.size()).isEqualTo(0);
+ assertThat(mSubscriptionManagerServiceUT.isSubscriptionAssociatedWithUser(1,
+ FAKE_MANAGED_PROFILE_USER_HANDLE)).isEqualTo(false);
}
@Test
@@ -2236,6 +2248,19 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
}
@Test
+ public void testSimNotReadyBySimDeactivate() {
+ insertSubscription(FAKE_SUBSCRIPTION_INFO1);
+
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
+ mSubscriptionManagerServiceUT.updateSimState(
+ 0, TelephonyManager.SIM_STATE_NOT_READY, null, null);
+ doReturn(true).when(mUiccProfile).isEmptyProfile();
+ processAllMessages();
+
+ assertThat(mSubscriptionManagerServiceUT.getActiveSubIdList(false)).isEmpty();
+ }
+
+ @Test
public void testInactiveSimRemoval() {
insertSubscription(FAKE_SUBSCRIPTION_INFO2);