diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 05:25:58 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 05:25:58 +0000 |
commit | 7eca110b919f21693afcbff8f4d9960ed8caeb40 (patch) | |
tree | eb715b2183e85164e53a60a4f8a1a20e5a5040c1 | |
parent | a76da014cf7091f98d67ccda16271cb9de69cad0 (diff) | |
parent | 94ec5a14cea628292aa957a95d5fa325e015072f (diff) | |
download | telephony-7eca110b919f21693afcbff8f4d9960ed8caeb40.tar.gz |
Snap for 10453563 from 94ec5a14cea628292aa957a95d5fa325e015072f to mainline-tzdata5-release
Change-Id: I3d014f365b733f6f0c8708e6d174a1a3922e7c10
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); |