Skip to content

Commit 25b942f

Browse files
committed
MediaTek 搭載端末で LogCat のログの文字列操作に失敗してクラッシュする不具合修正
1 parent f6214ab commit 25b942f

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

app/src/main/java/io/github/takusan23/newradiosupporter/tool/LogcatPhysicalChannelConfig.kt

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,15 @@ import android.telephony.TelephonyManager
77
import io.github.takusan23.newradiosupporter.tool.data.BandData
88
import io.github.takusan23.newradiosupporter.tool.data.LogcatPhysicalChannelConfigResult
99
import kotlinx.coroutines.Dispatchers
10+
import kotlinx.coroutines.coroutineScope
1011
import kotlinx.coroutines.flow.SharingStarted
1112
import kotlinx.coroutines.flow.channelFlow
1213
import kotlinx.coroutines.flow.collectLatest
1314
import kotlinx.coroutines.flow.filter
1415
import kotlinx.coroutines.flow.filterNotNull
1516
import kotlinx.coroutines.flow.flow
1617
import kotlinx.coroutines.flow.flowOn
17-
import kotlinx.coroutines.flow.launchIn
1818
import kotlinx.coroutines.flow.map
19-
import kotlinx.coroutines.flow.merge
20-
import kotlinx.coroutines.flow.onEach
2119
import kotlinx.coroutines.flow.stateIn
2220
import kotlinx.coroutines.yield
2321
import 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

Comments
 (0)