@@ -7,17 +7,15 @@ import android.telephony.TelephonyManager
77import io.github.takusan23.newradiosupporter.tool.data.BandData
88import io.github.takusan23.newradiosupporter.tool.data.LogcatPhysicalChannelConfigResult
99import kotlinx.coroutines.Dispatchers
10+ import kotlinx.coroutines.coroutineScope
1011import kotlinx.coroutines.flow.SharingStarted
1112import kotlinx.coroutines.flow.channelFlow
1213import kotlinx.coroutines.flow.collectLatest
1314import kotlinx.coroutines.flow.filter
1415import kotlinx.coroutines.flow.filterNotNull
1516import kotlinx.coroutines.flow.flow
1617import kotlinx.coroutines.flow.flowOn
17- import kotlinx.coroutines.flow.launchIn
1818import kotlinx.coroutines.flow.map
19- import kotlinx.coroutines.flow.merge
20- import kotlinx.coroutines.flow.onEach
2119import kotlinx.coroutines.flow.stateIn
2220import kotlinx.coroutines.yield
2321import java.io.InputStreamReader
@@ -63,10 +61,10 @@ object LogcatPhysicalChannelConfig {
6361
6462 // SIM カードの枚数分返すので
6563 // SubscriptionId と LogcatPhysicalChannelConfigResult の Map
66- val resultSubscriptionIdAndConfigMap = hashMapOf <Int , LogcatPhysicalChannelConfigResult >()
64+ var resultSubscriptionIdAndConfigMap = emptyMap <Int , LogcatPhysicalChannelConfigResult >()
6765 NetworkStatusFlow .collectMultipleSimSubscriptionIdList(context).collectLatest { subscriptionIdList ->
68- subscriptionIdList
69- .map { subscriptionId ->
66+ coroutineScope {
67+ subscriptionIdList.forEach { subscriptionId ->
7068 // phoneId は SIM スロット番号っぽいので、SubscriptionManager から問い合わせる
7169 val simSlotIndex = subscriptionManager.getActiveSubscriptionInfo(subscriptionId).simSlotIndex
7270 // SIM カードスロットに対応した TelephonyManager を作る
@@ -77,7 +75,7 @@ object LogcatPhysicalChannelConfig {
7775 logcatPhysicalChannelConfigFlow
7876 .filterNotNull()
7977 .filter { (updateLog, _) -> updateLog.phoneId == simSlotIndex }
80- .onEach { (_, configs) ->
78+ .collectLatest { (_, configs) ->
8179
8280 // バンドを取得できない端末がある
8381 // が、代わりに PCI が取れているので、 getCellInfo() の中に PCI があれば、それを使う
@@ -142,14 +140,14 @@ object LogcatPhysicalChannelConfig {
142140 }
143141
144142 // 更新して、Flow で送る
143+ // 参照が変化しないと Compose が recomposition をトリガーしないので
145144 if (physicalChannelConfigResult != null ) {
146- resultSubscriptionIdAndConfigMap[subscriptionId] = physicalChannelConfigResult
145+ resultSubscriptionIdAndConfigMap = resultSubscriptionIdAndConfigMap + (subscriptionId to physicalChannelConfigResult)
147146 }
148147 trySend(resultSubscriptionIdAndConfigMap)
149148 }
150149 }
151- .merge()
152- .launchIn(this )
150+ }
153151 }
154152 }.filter { it.isNotEmpty() }
155153
@@ -201,10 +199,16 @@ object LogcatPhysicalChannelConfig {
201199 var output: String? = null
202200 while (bufferedReader.readLine()?.also { output = it } != null ) {
203201 yield ()
204- val data = output?.split(" " )?.let {
205- LogCatData (it[0 ], it[1 ], it.drop(6 ).joinToString(separator = " " ))
206- } ? : continue
207- emit(data)
202+ try {
203+ val data = output?.split(" " )?.let {
204+ LogCatData (it[0 ], it[1 ], it.drop(6 ).joinToString(separator = " " ))
205+ } ? : continue
206+ emit(data)
207+ } catch (e: Exception ) {
208+ // MediaTek 製デバイスの logcat で ImsPhoneStateListener: [0] のログが文字化けを起こす?
209+ // split() が動かなくなるため例外が投げられる
210+ // do nothing
211+ }
208212 }
209213 }
210214 } finally {
0 commit comments