diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 5995a13d7ef..31e10d93878 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -58,6 +58,8 @@ import com.google.common.collect.ImmutableList; import kotlin.Unit; +import kotlinx.coroutines.Job; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -98,6 +100,8 @@ public class NetworkSelectSettings extends DashboardFragment { private AtomicBoolean mShouldFilterOutSatellitePlmn = new AtomicBoolean(); private NetworkScanRepository mNetworkScanRepository; + @Nullable + private Job mNetworkScanJob = null; @Override public void onCreate(Bundle icicle) { @@ -206,13 +210,14 @@ public class NetworkSelectSettings extends DashboardFragment { private void launchNetworkScan() { setProgressBarVisible(true); - mNetworkScanRepository.launchNetworkScan(getViewLifecycleOwner(), (networkScanResult) -> { - if (isPreferenceScreenEnabled()) { - scanResultHandler(networkScanResult); - } + mNetworkScanJob = mNetworkScanRepository.launchNetworkScan(getViewLifecycleOwner(), + (networkScanResult) -> { + if (isPreferenceScreenEnabled()) { + scanResultHandler(networkScanResult); + } - return Unit.INSTANCE; - }); + return Unit.INSTANCE; + }); } /** @@ -238,6 +243,12 @@ public class NetworkSelectSettings extends DashboardFragment { return false; } + // Need stop network scan before manual select network. + if (mNetworkScanJob != null) { + mNetworkScanJob.cancel(null); + mNetworkScanJob = null; + } + // Refresh the last selected item in case users reselect network. clearPreferenceSummary(); if (mSelectedPreference != null) { diff --git a/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt b/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt index 0344002c48d..87a085a9b8e 100644 --- a/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt +++ b/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt @@ -52,9 +52,8 @@ class NetworkScanRepository(context: Context, subId: Int) { context.getSystemService(TelephonyManager::class.java)!!.createForSubscriptionId(subId) /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */ - fun launchNetworkScan(lifecycleOwner: LifecycleOwner, onResult: (NetworkScanResult) -> Unit) { + fun launchNetworkScan(lifecycleOwner: LifecycleOwner, onResult: (NetworkScanResult) -> Unit) = networkScanFlow().collectLatestWithLifecycle(lifecycleOwner, action = onResult) - } data class CellInfoScanKey( val title: String?, @@ -101,7 +100,10 @@ class NetworkScanRepository(context: Context, subId: Int) { callback, ) - awaitClose { networkScan.stopScan() } + awaitClose { + networkScan.stopScan() + Log.d(TAG, "network scan stopped") + } }.conflate().onEach { Log.d(TAG, "networkScanFlow: $it") }.flowOn(Dispatchers.Default) /** Create network scan for allowed network types. */