Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ class ThreadManagerImpl @Inject constructor(

var exportFromDevice = false
var updated: Boolean? = null
var deviceNowPrefersCore: Boolean? = null
if (!coreIsDevicePreferred) {
if (appIsDevicePreferred) {
// Update or remove the device preferred credential to match core state.
Expand Down Expand Up @@ -169,6 +170,24 @@ class ThreadManagerImpl @Inject constructor(
)
}
Timber.d("Thread update device completed: deleted ${localIds.size} datasets, updated 1")
// ThreadNetworkClient.addCredentials does not promote the new
// credential to preferred. Verify what Play Services chose so the
// caller can report honestly instead of assuming success.
deviceNowPrefersCore = try {
isPreferredDatasetByDevice(context, coreThreadDataset.datasetId, serverId)
} catch (e: Exception) {
Timber.w(e, "Unable to verify preferred dataset after import")
null
Comment on lines +178 to +182
}
Timber.d(
"Thread: after import device ${
when (deviceNowPrefersCore) {
true -> "now prefers"
false -> "still doesn't prefer"
null -> "preference state unknown for"
}
} core preferred dataset",
)
true
} else { // Core prefers imported from other app, this shouldn't be managed by HA
localIds.forEach { baId ->
Expand Down Expand Up @@ -197,6 +216,7 @@ class ThreadManagerImpl @Inject constructor(
matches = coreIsDevicePreferred,
fromApp = appIsDevicePreferred,
updated = updated,
deviceNowPrefersCore = deviceNowPrefersCore,
exportIntent = if (exportFromDevice) deviceThreadIntent else null,
)
} catch (e: Exception) {
Expand All @@ -205,6 +225,7 @@ class ThreadManagerImpl @Inject constructor(
matches = null,
fromApp = null,
updated = null,
deviceNowPrefersCore = null,
exportIntent = null,
)
}
Expand Down Expand Up @@ -262,6 +283,7 @@ class ThreadManagerImpl @Inject constructor(
}
}

@OptIn(ExperimentalStdlibApi::class)
private suspend fun appAddedIsPreferredCredentials(context: Context): Boolean {
val appCredentials = suspendCoroutine { cont ->
ThreadNetwork.getNetworkClient(context)
Expand All @@ -274,9 +296,10 @@ class ThreadManagerImpl @Inject constructor(
val isPreferred = isPreferredCredentials(context, it)
if (isPreferred) {
Timber.d(
"Thread device prefers app added dataset: ${it.networkName} (PAN ${it.panId}, EXTPAN ${String(
it.extendedPanId,
)})",
"Thread device prefers app added dataset: %s (PAN %s, EXTPAN %s)",
it.networkName,
it.panId,
it.extendedPanId.toHexString(HexFormat.UpperCase),
)
}
isPreferred
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,12 @@ class DeveloperSettingsPresenterImpl @Inject constructor(
} else if (syncResult.matches == true) {
view.onThreadDebugResult(context.getString(commonR.string.thread_debug_result_match), true)
} else if (syncResult.fromApp == true && syncResult.updated == true) {
view.onThreadDebugResult(
context.getString(commonR.string.thread_debug_result_updated),
true,
)
val message = if (syncResult.deviceNowPrefersCore == false) {
context.getString(commonR.string.thread_debug_result_updated_not_preferred)
} else {
context.getString(commonR.string.thread_debug_result_updated)
}
view.onThreadDebugResult(message, syncResult.deviceNowPrefersCore != false)
} else if (syncResult.fromApp == true && syncResult.updated == false) {
view.onThreadDebugResult(
context.getString(commonR.string.thread_debug_result_removed),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ interface ThreadManager {
val matches: Boolean?,
val fromApp: Boolean?,
val updated: Boolean?,
val deviceNowPrefersCore: Boolean?,
val exportIntent: IntentSender?,
) : SyncResult()
object NoneHaveCredentials : SyncResult()
Expand Down
1 change: 1 addition & 0 deletions common/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1178,6 +1178,7 @@
<string name="thread_debug_result_removed">Removed old network from Home Assistant on this device</string>
<string name="thread_debug_result_unsupported_server">The Home Assistant server does not support Thread</string>
<string name="thread_debug_result_updated">Updated network from Home Assistant on this device</string>
<string name="thread_debug_result_updated_not_preferred">Updated network from Home Assistant on this device, but the device still prefers a different network</string>
<string name="thread_debug_summary">Manually update device and server Thread credentials and verify results</string>
<string name="thread_export_success">Imported credential</string>
<string name="thread_export_none">You don\'t have any credentials to import.</string>
Expand Down
Loading