Loading src/java/com/android/internal/telephony/data/AccessNetworksManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -328,14 +328,14 @@ public class AccessNetworksManager extends Handler { log("onNetworkValidationRequested: networkCapability = [" + DataUtils.networkCapabilityToString(networkCapability) + "]"); dnc.requestNetworkValidation(networkCapability, new Consumer<Integer>() { dnc.requestNetworkValidation(networkCapability, new Consumer<>() { @Override public void accept(Integer result) { post(() -> { try { log("onNetworkValidationRequestDone:" + DataServiceCallback.resultCodeToString(result)); resultCodeCallback.accept(result.intValue()); resultCodeCallback.accept(result); } catch (RemoteException e) { // Ignore if the remote process is no longer available to call back. loge("onNetworkValidationRequestDone RemoteException" + e); Loading src/java/com/android/internal/telephony/data/CellularDataService.java +2 −3 Original line number Diff line number Diff line Loading @@ -147,8 +147,7 @@ public class CellularDataService extends DataService { if (t == null) { return RESULT_SUCCESS; } else { if (t instanceof CommandException) { CommandException ce = (CommandException) t; if (t instanceof CommandException ce) { if (ce.getCommandError() == CommandException.Error.REQUEST_NOT_SUPPORTED) { return DataServiceCallback.RESULT_ERROR_UNSUPPORTED; } else { Loading Loading @@ -229,7 +228,7 @@ public class CellularDataService extends DataService { mCallbackMap.put(message, callback); } mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[dps.size()]), message); mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[0]), message); } @Override Loading src/java/com/android/internal/telephony/data/CellularNetworkValidator.java +12 −33 Original line number Diff line number Diff line Loading @@ -58,9 +58,6 @@ import java.util.concurrent.TimeUnit; */ public class CellularNetworkValidator { private static final String LOG_TAG = "NetworkValidator"; // If true, upon validated network cache hit, we report validationDone only when // network becomes available. Otherwise, we report validationDone immediately. private static boolean sWaitForNetworkAvailableWhenCacheHit = true; // States of validator. Only one validation can happen at once. // IDLE: no validation going on. Loading @@ -69,7 +66,7 @@ public class CellularNetworkValidator { private static final int STATE_VALIDATING = 1; // VALIDATED: validation is done and successful. // Waiting for stopValidation() to release // validationg NetworkRequest. // validation NetworkRequest. private static final int STATE_VALIDATED = 2; // Singleton instance. Loading @@ -79,13 +76,11 @@ public class CellularNetworkValidator { private int mState = STATE_IDLE; private int mSubId; private long mTimeoutInMs; private boolean mReleaseAfterValidation; private NetworkRequest mNetworkRequest; private ValidationCallback mValidationCallback; private Context mContext; private ConnectivityManager mConnectivityManager; private final Context mContext; private final ConnectivityManager mConnectivityManager; @VisibleForTesting public Handler mHandler = new Handler(); @VisibleForTesting Loading @@ -96,18 +91,11 @@ public class CellularNetworkValidator { // A cache with fixed size. It remembers 10 most recently successfully validated networks. private static final int VALIDATED_NETWORK_CACHE_SIZE = 10; private final PriorityQueue<ValidatedNetwork> mValidatedNetworkPQ = new PriorityQueue((Comparator<ValidatedNetwork>) (n1, n2) -> { if (n1.mValidationTimeStamp < n2.mValidationTimeStamp) { return -1; } else if (n1.mValidationTimeStamp > n2.mValidationTimeStamp) { return 1; } else { return 0; } }); private final Map<String, ValidatedNetwork> mValidatedNetworkMap = new HashMap(); new PriorityQueue<>((Comparator<ValidatedNetwork>) Comparator.comparingLong( (ValidatedNetwork n) -> n.mValidationTimeStamp)); private final Map<String, ValidatedNetwork> mValidatedNetworkMap = new HashMap<>(); private final class ValidatedNetwork { private static final class ValidatedNetwork { ValidatedNetwork(String identity, long timeStamp) { mValidationIdentity = identity; mValidationTimeStamp = timeStamp; Loading Loading @@ -165,7 +153,6 @@ public class CellularNetworkValidator { private String getValidationNetworkIdentity(int subId) { if (!SubscriptionManager.isUsableSubscriptionId(subId)) return null; if (SubscriptionManagerService.getInstance() == null) return null; Phone phone = PhoneFactory.getPhone(SubscriptionManagerService.getInstance() .getPhoneId(subId)); if (phone == null || phone.getServiceState() == null) return null; Loading Loading @@ -270,26 +257,18 @@ public class CellularNetworkValidator { stopValidation(); } if (!sWaitForNetworkAvailableWhenCacheHit && mValidatedNetworkCache .isRecentlyValidated(subId)) { callback.onValidationDone(true, subId); return; } mState = STATE_VALIDATING; mSubId = subId; mTimeoutInMs = timeoutInMs; mValidationCallback = callback; mReleaseAfterValidation = releaseAfterValidation; mNetworkRequest = createNetworkRequest(); logd("Start validating subId " + mSubId + " mTimeoutInMs " + mTimeoutInMs logd("Start validating subId " + mSubId + " timeoutInMs " + timeoutInMs + " mReleaseAfterValidation " + mReleaseAfterValidation); mNetworkCallback = new ConnectivityNetworkCallback(subId); mConnectivityManager.requestNetwork(mNetworkRequest, mNetworkCallback, mHandler); mHandler.postDelayed(() -> onValidationTimeout(subId), mTimeoutInMs); mConnectivityManager.requestNetwork(createNetworkRequest(), mNetworkCallback, mHandler); mHandler.postDelayed(() -> onValidationTimeout(subId), timeoutInMs); } private synchronized void onValidationTimeout(int subId) { Loading Loading @@ -351,7 +330,7 @@ public class CellularNetworkValidator { mState = STATE_VALIDATED; // If validation passed and per request to NOT release after validation, delay cleanup. if (!mReleaseAfterValidation && passed) { mHandler.postDelayed(()-> stopValidation(), 500); mHandler.postDelayed(this::stopValidation, 500); } else { stopValidation(); } Loading src/java/com/android/internal/telephony/data/DataEvaluation.java +1 −1 Original line number Diff line number Diff line Loading @@ -418,7 +418,7 @@ public class DataEvaluation { public String toString() { StringBuilder evaluationStr = new StringBuilder(); evaluationStr.append("Data evaluation: evaluation reason:" + mDataEvaluationReason + ", "); if (mDataDisallowedReasons.size() > 0) { if (!mDataDisallowedReasons.isEmpty()) { evaluationStr.append("Data disallowed reasons:"); for (DataDisallowedReason reason : mDataDisallowedReasons) { evaluationStr.append(" ").append(reason); Loading src/java/com/android/internal/telephony/data/DataProfileManager.java +10 −15 Original line number Diff line number Diff line Loading @@ -104,7 +104,7 @@ public class DataProfileManager extends Handler { private @Nullable DataProfile mPreferredDataProfile = null; /** The last data profile that's successful for internet connection by subscription id. */ private @NonNull LruCache<Integer, DataProfile> mLastInternetDataProfiles = private final @NonNull LruCache<Integer, DataProfile> mLastInternetDataProfiles = new LruCache<>(256); /** Preferred data profile set id. */ Loading Loading @@ -603,7 +603,7 @@ public class DataProfileManager extends Handler { // Sort the data profiles so the preferred data profile is at the beginning. List<DataProfile> allDataProfiles = mAllDataProfiles.stream() .sorted(Comparator.comparing((DataProfile dp) -> !dp.equals(mPreferredDataProfile))) .collect(Collectors.toList()); .toList(); // Search in the order. "IA" type should be the first from getAllowedInitialAttachApnTypes. for (int apnType : mDataConfigManager.getAllowedInitialAttachApnTypes()) { initialAttachDataProfile = allDataProfiles.stream() Loading Loading @@ -799,7 +799,7 @@ public class DataProfileManager extends Handler { logv("Satisfied profile: " + dataProfile + ", last setup=" + DataUtils.elapsedTimeToString(dataProfile.getLastSetupTimestamp())); } if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { log("Can't find any data profile that can satisfy " + networkRequest); return null; } Loading @@ -816,16 +816,14 @@ public class DataProfileManager extends Handler { ApnSetting.INFRASTRUCTURE_SATELLITE)) { return false; } if (!isNtn && !dp.getApnSetting().isForInfrastructure( ApnSetting.INFRASTRUCTURE_CELLULAR)) { return false; } return isNtn || dp.getApnSetting().isForInfrastructure( ApnSetting.INFRASTRUCTURE_CELLULAR); } return true; }) .collect(Collectors.toList()); if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { String ntnReason = ""; if (mFeatureFlags.carrierEnabledSatelliteFlag()) { ntnReason = " and infrastructure for " Loading @@ -843,7 +841,7 @@ public class DataProfileManager extends Handler { == Telephony.Carriers.MATCH_ALL_APN_SET_ID || dp.getApnSetting().getApnSetId() == mPreferredDataProfileSetId)) .collect(Collectors.toList()); if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { log("Can't find any data profile has APN set id matched. mPreferredDataProfileSetId=" + mPreferredDataProfileSetId); return null; Loading @@ -851,9 +849,10 @@ public class DataProfileManager extends Handler { // Check if data profiles are permanently failed. dataProfiles = dataProfiles.stream() .filter(dp -> ignorePermanentFailure || !dp.getApnSetting().getPermanentFailed()) .filter(dp -> ignorePermanentFailure || (dp.getApnSetting() != null && !dp.getApnSetting().getPermanentFailed())) .collect(Collectors.toList()); if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { log("The suitable data profiles are all in permanent failed state."); return null; } Loading Loading @@ -1096,10 +1095,6 @@ public class DataProfileManager extends Handler { * @return {@code true} if the provided data profile can be still used in current environment. */ public boolean isDataProfileCompatible(@NonNull DataProfile dataProfile) { if (dataProfile == null) { return false; } if (dataProfile.getApnSetting() == null && dataProfile.getTrafficDescriptor() != null) { // A traffic descriptor only data profile can be always used. Traffic descriptors are // always generated on the fly instead loaded from the database. Loading Loading
src/java/com/android/internal/telephony/data/AccessNetworksManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -328,14 +328,14 @@ public class AccessNetworksManager extends Handler { log("onNetworkValidationRequested: networkCapability = [" + DataUtils.networkCapabilityToString(networkCapability) + "]"); dnc.requestNetworkValidation(networkCapability, new Consumer<Integer>() { dnc.requestNetworkValidation(networkCapability, new Consumer<>() { @Override public void accept(Integer result) { post(() -> { try { log("onNetworkValidationRequestDone:" + DataServiceCallback.resultCodeToString(result)); resultCodeCallback.accept(result.intValue()); resultCodeCallback.accept(result); } catch (RemoteException e) { // Ignore if the remote process is no longer available to call back. loge("onNetworkValidationRequestDone RemoteException" + e); Loading
src/java/com/android/internal/telephony/data/CellularDataService.java +2 −3 Original line number Diff line number Diff line Loading @@ -147,8 +147,7 @@ public class CellularDataService extends DataService { if (t == null) { return RESULT_SUCCESS; } else { if (t instanceof CommandException) { CommandException ce = (CommandException) t; if (t instanceof CommandException ce) { if (ce.getCommandError() == CommandException.Error.REQUEST_NOT_SUPPORTED) { return DataServiceCallback.RESULT_ERROR_UNSUPPORTED; } else { Loading Loading @@ -229,7 +228,7 @@ public class CellularDataService extends DataService { mCallbackMap.put(message, callback); } mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[dps.size()]), message); mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[0]), message); } @Override Loading
src/java/com/android/internal/telephony/data/CellularNetworkValidator.java +12 −33 Original line number Diff line number Diff line Loading @@ -58,9 +58,6 @@ import java.util.concurrent.TimeUnit; */ public class CellularNetworkValidator { private static final String LOG_TAG = "NetworkValidator"; // If true, upon validated network cache hit, we report validationDone only when // network becomes available. Otherwise, we report validationDone immediately. private static boolean sWaitForNetworkAvailableWhenCacheHit = true; // States of validator. Only one validation can happen at once. // IDLE: no validation going on. Loading @@ -69,7 +66,7 @@ public class CellularNetworkValidator { private static final int STATE_VALIDATING = 1; // VALIDATED: validation is done and successful. // Waiting for stopValidation() to release // validationg NetworkRequest. // validation NetworkRequest. private static final int STATE_VALIDATED = 2; // Singleton instance. Loading @@ -79,13 +76,11 @@ public class CellularNetworkValidator { private int mState = STATE_IDLE; private int mSubId; private long mTimeoutInMs; private boolean mReleaseAfterValidation; private NetworkRequest mNetworkRequest; private ValidationCallback mValidationCallback; private Context mContext; private ConnectivityManager mConnectivityManager; private final Context mContext; private final ConnectivityManager mConnectivityManager; @VisibleForTesting public Handler mHandler = new Handler(); @VisibleForTesting Loading @@ -96,18 +91,11 @@ public class CellularNetworkValidator { // A cache with fixed size. It remembers 10 most recently successfully validated networks. private static final int VALIDATED_NETWORK_CACHE_SIZE = 10; private final PriorityQueue<ValidatedNetwork> mValidatedNetworkPQ = new PriorityQueue((Comparator<ValidatedNetwork>) (n1, n2) -> { if (n1.mValidationTimeStamp < n2.mValidationTimeStamp) { return -1; } else if (n1.mValidationTimeStamp > n2.mValidationTimeStamp) { return 1; } else { return 0; } }); private final Map<String, ValidatedNetwork> mValidatedNetworkMap = new HashMap(); new PriorityQueue<>((Comparator<ValidatedNetwork>) Comparator.comparingLong( (ValidatedNetwork n) -> n.mValidationTimeStamp)); private final Map<String, ValidatedNetwork> mValidatedNetworkMap = new HashMap<>(); private final class ValidatedNetwork { private static final class ValidatedNetwork { ValidatedNetwork(String identity, long timeStamp) { mValidationIdentity = identity; mValidationTimeStamp = timeStamp; Loading Loading @@ -165,7 +153,6 @@ public class CellularNetworkValidator { private String getValidationNetworkIdentity(int subId) { if (!SubscriptionManager.isUsableSubscriptionId(subId)) return null; if (SubscriptionManagerService.getInstance() == null) return null; Phone phone = PhoneFactory.getPhone(SubscriptionManagerService.getInstance() .getPhoneId(subId)); if (phone == null || phone.getServiceState() == null) return null; Loading Loading @@ -270,26 +257,18 @@ public class CellularNetworkValidator { stopValidation(); } if (!sWaitForNetworkAvailableWhenCacheHit && mValidatedNetworkCache .isRecentlyValidated(subId)) { callback.onValidationDone(true, subId); return; } mState = STATE_VALIDATING; mSubId = subId; mTimeoutInMs = timeoutInMs; mValidationCallback = callback; mReleaseAfterValidation = releaseAfterValidation; mNetworkRequest = createNetworkRequest(); logd("Start validating subId " + mSubId + " mTimeoutInMs " + mTimeoutInMs logd("Start validating subId " + mSubId + " timeoutInMs " + timeoutInMs + " mReleaseAfterValidation " + mReleaseAfterValidation); mNetworkCallback = new ConnectivityNetworkCallback(subId); mConnectivityManager.requestNetwork(mNetworkRequest, mNetworkCallback, mHandler); mHandler.postDelayed(() -> onValidationTimeout(subId), mTimeoutInMs); mConnectivityManager.requestNetwork(createNetworkRequest(), mNetworkCallback, mHandler); mHandler.postDelayed(() -> onValidationTimeout(subId), timeoutInMs); } private synchronized void onValidationTimeout(int subId) { Loading Loading @@ -351,7 +330,7 @@ public class CellularNetworkValidator { mState = STATE_VALIDATED; // If validation passed and per request to NOT release after validation, delay cleanup. if (!mReleaseAfterValidation && passed) { mHandler.postDelayed(()-> stopValidation(), 500); mHandler.postDelayed(this::stopValidation, 500); } else { stopValidation(); } Loading
src/java/com/android/internal/telephony/data/DataEvaluation.java +1 −1 Original line number Diff line number Diff line Loading @@ -418,7 +418,7 @@ public class DataEvaluation { public String toString() { StringBuilder evaluationStr = new StringBuilder(); evaluationStr.append("Data evaluation: evaluation reason:" + mDataEvaluationReason + ", "); if (mDataDisallowedReasons.size() > 0) { if (!mDataDisallowedReasons.isEmpty()) { evaluationStr.append("Data disallowed reasons:"); for (DataDisallowedReason reason : mDataDisallowedReasons) { evaluationStr.append(" ").append(reason); Loading
src/java/com/android/internal/telephony/data/DataProfileManager.java +10 −15 Original line number Diff line number Diff line Loading @@ -104,7 +104,7 @@ public class DataProfileManager extends Handler { private @Nullable DataProfile mPreferredDataProfile = null; /** The last data profile that's successful for internet connection by subscription id. */ private @NonNull LruCache<Integer, DataProfile> mLastInternetDataProfiles = private final @NonNull LruCache<Integer, DataProfile> mLastInternetDataProfiles = new LruCache<>(256); /** Preferred data profile set id. */ Loading Loading @@ -603,7 +603,7 @@ public class DataProfileManager extends Handler { // Sort the data profiles so the preferred data profile is at the beginning. List<DataProfile> allDataProfiles = mAllDataProfiles.stream() .sorted(Comparator.comparing((DataProfile dp) -> !dp.equals(mPreferredDataProfile))) .collect(Collectors.toList()); .toList(); // Search in the order. "IA" type should be the first from getAllowedInitialAttachApnTypes. for (int apnType : mDataConfigManager.getAllowedInitialAttachApnTypes()) { initialAttachDataProfile = allDataProfiles.stream() Loading Loading @@ -799,7 +799,7 @@ public class DataProfileManager extends Handler { logv("Satisfied profile: " + dataProfile + ", last setup=" + DataUtils.elapsedTimeToString(dataProfile.getLastSetupTimestamp())); } if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { log("Can't find any data profile that can satisfy " + networkRequest); return null; } Loading @@ -816,16 +816,14 @@ public class DataProfileManager extends Handler { ApnSetting.INFRASTRUCTURE_SATELLITE)) { return false; } if (!isNtn && !dp.getApnSetting().isForInfrastructure( ApnSetting.INFRASTRUCTURE_CELLULAR)) { return false; } return isNtn || dp.getApnSetting().isForInfrastructure( ApnSetting.INFRASTRUCTURE_CELLULAR); } return true; }) .collect(Collectors.toList()); if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { String ntnReason = ""; if (mFeatureFlags.carrierEnabledSatelliteFlag()) { ntnReason = " and infrastructure for " Loading @@ -843,7 +841,7 @@ public class DataProfileManager extends Handler { == Telephony.Carriers.MATCH_ALL_APN_SET_ID || dp.getApnSetting().getApnSetId() == mPreferredDataProfileSetId)) .collect(Collectors.toList()); if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { log("Can't find any data profile has APN set id matched. mPreferredDataProfileSetId=" + mPreferredDataProfileSetId); return null; Loading @@ -851,9 +849,10 @@ public class DataProfileManager extends Handler { // Check if data profiles are permanently failed. dataProfiles = dataProfiles.stream() .filter(dp -> ignorePermanentFailure || !dp.getApnSetting().getPermanentFailed()) .filter(dp -> ignorePermanentFailure || (dp.getApnSetting() != null && !dp.getApnSetting().getPermanentFailed())) .collect(Collectors.toList()); if (dataProfiles.size() == 0) { if (dataProfiles.isEmpty()) { log("The suitable data profiles are all in permanent failed state."); return null; } Loading Loading @@ -1096,10 +1095,6 @@ public class DataProfileManager extends Handler { * @return {@code true} if the provided data profile can be still used in current environment. */ public boolean isDataProfileCompatible(@NonNull DataProfile dataProfile) { if (dataProfile == null) { return false; } if (dataProfile.getApnSetting() == null && dataProfile.getTrafficDescriptor() != null) { // A traffic descriptor only data profile can be always used. Traffic descriptors are // always generated on the fly instead loaded from the database. Loading