Loading flags/data.aconfig +14 −0 Original line number Diff line number Diff line package: "com.android.internal.telephony.flags" flag { name: "use_alarm_callback" namespace: "telephony" description: "Use alarm callback instead of broadcast." bug: "311476875" } flag { name: "refine_preferred_data_profile_selection" namespace: "telephony" description: "Upon internet network connect, refine selection of preferred data profile." bug: "311476883" } flag { name: "unthrottle_check_transport" namespace: "telephony" Loading src/java/com/android/internal/telephony/data/DataProfileManager.java +30 −12 Original line number Diff line number Diff line Loading @@ -419,10 +419,12 @@ public class DataProfileManager extends Handler { * @param internetNetworks The connected internet data networks. */ private void onInternetDataNetworkConnected(@NonNull Set<DataNetwork> internetNetworks) { DataProfile defaultProfile = null; if (mFeatureFlags.refinePreferredDataProfileSelection()) { // Most of the cases there should be only one. // but in case there are multiple, find the default internet network, and choose the // one which has longest life cycle. DataProfile defaultProfile = internetNetworks.stream() defaultProfile = internetNetworks.stream() .filter(network -> mPreferredDataProfile == null // Find the one most resembles the current preferred profile, // avoiding e.g. DUN default network. Loading @@ -431,6 +433,22 @@ public class DataProfileManager extends Handler { .map(DataNetwork::getDataProfile) .min(Comparator.comparingLong(DataProfile::getLastSetupTimestamp)) .orElse(null); } else { if (internetNetworks.size() == 1) { // Most of the cases there should be only one. defaultProfile = internetNetworks.stream().findFirst().get().getDataProfile(); } else if (internetNetworks.size() > 1) { // but in case there are multiple, find the default internet network, and choose the // one which has longest life cycle. defaultProfile = internetNetworks.stream() .filter(network -> mPreferredDataProfile == null || canPreferredDataProfileSatisfy( network.getAttachedNetworkRequestList())) .map(DataNetwork::getDataProfile) .min(Comparator.comparingLong(DataProfile::getLastSetupTimestamp)) .orElse(null); } } // Update a working internet data profile as a future candidate for preferred data profile // after APNs are reset to default Loading src/java/com/android/internal/telephony/data/DataRetryManager.java +68 −13 Original line number Diff line number Diff line Loading @@ -22,6 +22,11 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.NetworkCapabilities; import android.os.AsyncResult; import android.os.Handler; Loading Loading @@ -74,6 +79,11 @@ import java.util.stream.Stream; public class DataRetryManager extends Handler { private static final boolean VDBG = false; /** Intent of Alarm Manager for long retry timer. */ private static final String ACTION_RETRY = "com.android.internal.telephony.data.ACTION_RETRY"; /** The extra key for the hashcode of the retry entry for Alarm Manager. */ private static final String ACTION_RETRY_EXTRA_HASHCODE = "extra_retry_hashcode"; /** Event for data setup retry. */ private static final int EVENT_DATA_SETUP_RETRY = 3; Loading Loading @@ -1014,6 +1024,22 @@ public class DataRetryManager extends Handler { mRil.registerForOn(this, EVENT_RADIO_ON, null); mRil.registerForModemReset(this, EVENT_MODEM_RESET, null); if (!mFlags.useAlarmCallback()) { // Register intent of alarm manager for long retry timer IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_RETRY); mPhone.getContext().registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (ACTION_RETRY.equals(intent.getAction())) { DataRetryManager.this.onAlarmIntentRetry( intent.getIntExtra(ACTION_RETRY_EXTRA_HASHCODE, -1 /*Bad hashcode*/)); } } }, intentFilter); } if (mDataConfigManager.shouldResetDataThrottlingWhenTacChanges()) { mPhone.getServiceStateTracker().registerForAreaCodeChanged(this, EVENT_TAC_CHANGED, null); Loading Loading @@ -1449,8 +1475,9 @@ public class DataRetryManager extends Handler { ? EVENT_DATA_SETUP_RETRY : EVENT_DATA_HANDOVER_RETRY, dataRetryEntry), dataRetryEntry.retryDelayMillis); } else { // No need to wake up the device, the retry can wait util next time the device wake up // to save power. if (mFlags.useAlarmCallback()) { // No need to wake up the device, the retry can wait util next time the device wake // up to save power. mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, dataRetryEntry.retryElapsedTime, "dataRetryHash-" + dataRetryEntry.hashCode() /*debug tag*/, Loading @@ -1462,6 +1489,34 @@ public class DataRetryManager extends Handler { ? EVENT_DATA_SETUP_RETRY : EVENT_DATA_HANDOVER_RETRY, dataRetryEntry)); }); } else { Intent intent = new Intent(ACTION_RETRY); intent.putExtra(ACTION_RETRY_EXTRA_HASHCODE, dataRetryEntry.hashCode()); // No need to wake up the device, the retry can wait util next time the device wake // up to save power. mAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, dataRetryEntry.retryElapsedTime, PendingIntent.getBroadcast(mPhone.getContext(), dataRetryEntry.hashCode()/*Unique identifier of the retry attempt*/, intent, PendingIntent.FLAG_IMMUTABLE)); } } } /** * Called when it's time to retry scheduled by Alarm Manager. * @param retryHashcode The hashcode is the unique identifier of which retry entry to retry. */ private void onAlarmIntentRetry(int retryHashcode) { DataRetryEntry dataRetryEntry = mDataRetryEntries.stream() .filter(entry -> entry.hashCode() == retryHashcode) .findAny() .orElse(null); logl("onAlarmIntentRetry: found " + dataRetryEntry + " with hashcode " + retryHashcode); if (dataRetryEntry != null) { sendMessage(obtainMessage(dataRetryEntry instanceof DataSetupRetryEntry ? EVENT_DATA_SETUP_RETRY : EVENT_DATA_HANDOVER_RETRY, dataRetryEntry)); } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java +1 −4 Original line number Diff line number Diff line Loading @@ -54,7 +54,6 @@ import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.data.DataProfileManager.DataProfileManagerCallback; import com.android.internal.telephony.flags.FeatureFlags; import org.junit.After; import org.junit.Before; Loading Loading @@ -100,8 +99,6 @@ public class DataProfileManagerTest extends TelephonyTest { private DataProfileManager mDataProfileManagerUT; private FeatureFlags mFeatureFlags; private final ApnSettingContentProvider mApnSettingContentProvider = new ApnSettingContentProvider(); Loading Loading @@ -835,7 +832,6 @@ public class DataProfileManagerTest extends TelephonyTest { logd("DataProfileManagerTest +Setup!"); super.setUp(getClass().getSimpleName()); mDataProfileManagerCallback = Mockito.mock(DataProfileManagerCallback.class); mFeatureFlags = Mockito.mock(FeatureFlags.class); ((MockContentResolver) mContext.getContentResolver()).addProvider( Telephony.Carriers.CONTENT_URI.getAuthority(), mApnSettingContentProvider); Loading Loading @@ -1035,6 +1031,7 @@ public class DataProfileManagerTest extends TelephonyTest { @Test public void testSetPreferredDataProfile() { doReturn(true).when(mFeatureFlags).refinePreferredDataProfileSelection(); TelephonyNetworkRequest tnr = new TelephonyNetworkRequest( new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) Loading tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -786,6 +786,7 @@ public class DataRetryManagerTest extends TelephonyTest { @Test public void testDataRetryLongTimer() { doReturn(true).when(mFeatureFlags).useAlarmCallback(); // Rule requires a long timer DataSetupRetryRule retryRule = new DataSetupRetryRule( "capabilities=internet, retry_interval=120000, maximum_retries=2"); Loading Loading
flags/data.aconfig +14 −0 Original line number Diff line number Diff line package: "com.android.internal.telephony.flags" flag { name: "use_alarm_callback" namespace: "telephony" description: "Use alarm callback instead of broadcast." bug: "311476875" } flag { name: "refine_preferred_data_profile_selection" namespace: "telephony" description: "Upon internet network connect, refine selection of preferred data profile." bug: "311476883" } flag { name: "unthrottle_check_transport" namespace: "telephony" Loading
src/java/com/android/internal/telephony/data/DataProfileManager.java +30 −12 Original line number Diff line number Diff line Loading @@ -419,10 +419,12 @@ public class DataProfileManager extends Handler { * @param internetNetworks The connected internet data networks. */ private void onInternetDataNetworkConnected(@NonNull Set<DataNetwork> internetNetworks) { DataProfile defaultProfile = null; if (mFeatureFlags.refinePreferredDataProfileSelection()) { // Most of the cases there should be only one. // but in case there are multiple, find the default internet network, and choose the // one which has longest life cycle. DataProfile defaultProfile = internetNetworks.stream() defaultProfile = internetNetworks.stream() .filter(network -> mPreferredDataProfile == null // Find the one most resembles the current preferred profile, // avoiding e.g. DUN default network. Loading @@ -431,6 +433,22 @@ public class DataProfileManager extends Handler { .map(DataNetwork::getDataProfile) .min(Comparator.comparingLong(DataProfile::getLastSetupTimestamp)) .orElse(null); } else { if (internetNetworks.size() == 1) { // Most of the cases there should be only one. defaultProfile = internetNetworks.stream().findFirst().get().getDataProfile(); } else if (internetNetworks.size() > 1) { // but in case there are multiple, find the default internet network, and choose the // one which has longest life cycle. defaultProfile = internetNetworks.stream() .filter(network -> mPreferredDataProfile == null || canPreferredDataProfileSatisfy( network.getAttachedNetworkRequestList())) .map(DataNetwork::getDataProfile) .min(Comparator.comparingLong(DataProfile::getLastSetupTimestamp)) .orElse(null); } } // Update a working internet data profile as a future candidate for preferred data profile // after APNs are reset to default Loading
src/java/com/android/internal/telephony/data/DataRetryManager.java +68 −13 Original line number Diff line number Diff line Loading @@ -22,6 +22,11 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.NetworkCapabilities; import android.os.AsyncResult; import android.os.Handler; Loading Loading @@ -74,6 +79,11 @@ import java.util.stream.Stream; public class DataRetryManager extends Handler { private static final boolean VDBG = false; /** Intent of Alarm Manager for long retry timer. */ private static final String ACTION_RETRY = "com.android.internal.telephony.data.ACTION_RETRY"; /** The extra key for the hashcode of the retry entry for Alarm Manager. */ private static final String ACTION_RETRY_EXTRA_HASHCODE = "extra_retry_hashcode"; /** Event for data setup retry. */ private static final int EVENT_DATA_SETUP_RETRY = 3; Loading Loading @@ -1014,6 +1024,22 @@ public class DataRetryManager extends Handler { mRil.registerForOn(this, EVENT_RADIO_ON, null); mRil.registerForModemReset(this, EVENT_MODEM_RESET, null); if (!mFlags.useAlarmCallback()) { // Register intent of alarm manager for long retry timer IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_RETRY); mPhone.getContext().registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (ACTION_RETRY.equals(intent.getAction())) { DataRetryManager.this.onAlarmIntentRetry( intent.getIntExtra(ACTION_RETRY_EXTRA_HASHCODE, -1 /*Bad hashcode*/)); } } }, intentFilter); } if (mDataConfigManager.shouldResetDataThrottlingWhenTacChanges()) { mPhone.getServiceStateTracker().registerForAreaCodeChanged(this, EVENT_TAC_CHANGED, null); Loading Loading @@ -1449,8 +1475,9 @@ public class DataRetryManager extends Handler { ? EVENT_DATA_SETUP_RETRY : EVENT_DATA_HANDOVER_RETRY, dataRetryEntry), dataRetryEntry.retryDelayMillis); } else { // No need to wake up the device, the retry can wait util next time the device wake up // to save power. if (mFlags.useAlarmCallback()) { // No need to wake up the device, the retry can wait util next time the device wake // up to save power. mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, dataRetryEntry.retryElapsedTime, "dataRetryHash-" + dataRetryEntry.hashCode() /*debug tag*/, Loading @@ -1462,6 +1489,34 @@ public class DataRetryManager extends Handler { ? EVENT_DATA_SETUP_RETRY : EVENT_DATA_HANDOVER_RETRY, dataRetryEntry)); }); } else { Intent intent = new Intent(ACTION_RETRY); intent.putExtra(ACTION_RETRY_EXTRA_HASHCODE, dataRetryEntry.hashCode()); // No need to wake up the device, the retry can wait util next time the device wake // up to save power. mAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, dataRetryEntry.retryElapsedTime, PendingIntent.getBroadcast(mPhone.getContext(), dataRetryEntry.hashCode()/*Unique identifier of the retry attempt*/, intent, PendingIntent.FLAG_IMMUTABLE)); } } } /** * Called when it's time to retry scheduled by Alarm Manager. * @param retryHashcode The hashcode is the unique identifier of which retry entry to retry. */ private void onAlarmIntentRetry(int retryHashcode) { DataRetryEntry dataRetryEntry = mDataRetryEntries.stream() .filter(entry -> entry.hashCode() == retryHashcode) .findAny() .orElse(null); logl("onAlarmIntentRetry: found " + dataRetryEntry + " with hashcode " + retryHashcode); if (dataRetryEntry != null) { sendMessage(obtainMessage(dataRetryEntry instanceof DataSetupRetryEntry ? EVENT_DATA_SETUP_RETRY : EVENT_DATA_HANDOVER_RETRY, dataRetryEntry)); } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java +1 −4 Original line number Diff line number Diff line Loading @@ -54,7 +54,6 @@ import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.data.DataProfileManager.DataProfileManagerCallback; import com.android.internal.telephony.flags.FeatureFlags; import org.junit.After; import org.junit.Before; Loading Loading @@ -100,8 +99,6 @@ public class DataProfileManagerTest extends TelephonyTest { private DataProfileManager mDataProfileManagerUT; private FeatureFlags mFeatureFlags; private final ApnSettingContentProvider mApnSettingContentProvider = new ApnSettingContentProvider(); Loading Loading @@ -835,7 +832,6 @@ public class DataProfileManagerTest extends TelephonyTest { logd("DataProfileManagerTest +Setup!"); super.setUp(getClass().getSimpleName()); mDataProfileManagerCallback = Mockito.mock(DataProfileManagerCallback.class); mFeatureFlags = Mockito.mock(FeatureFlags.class); ((MockContentResolver) mContext.getContentResolver()).addProvider( Telephony.Carriers.CONTENT_URI.getAuthority(), mApnSettingContentProvider); Loading Loading @@ -1035,6 +1031,7 @@ public class DataProfileManagerTest extends TelephonyTest { @Test public void testSetPreferredDataProfile() { doReturn(true).when(mFeatureFlags).refinePreferredDataProfileSelection(); TelephonyNetworkRequest tnr = new TelephonyNetworkRequest( new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataRetryManagerTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -786,6 +786,7 @@ public class DataRetryManagerTest extends TelephonyTest { @Test public void testDataRetryLongTimer() { doReturn(true).when(mFeatureFlags).useAlarmCallback(); // Rule requires a long timer DataSetupRetryRule retryRule = new DataSetupRetryRule( "capabilities=internet, retry_interval=120000, maximum_retries=2"); Loading