From 625293ee95f3d35f818c6c76ac4d86cffd14894b Mon Sep 17 00:00:00 2001
From: Song Guo <songguo@google.com>
Date: Sat, 6 Apr 2024 13:21:54 +0000
Subject: [PATCH 1/6] [chip-tool] Create ChipToolCheckInDelegate

---
 examples/chip-tool/BUILD.gn                   |  2 +
 .../chip-tool/commands/common/CHIPCommand.cpp | 13 ++-
 .../chip-tool/commands/common/CHIPCommand.h   |  8 +-
 .../common/ChipToolCheckInDelegate.cpp        | 94 +++++++++++++++++++
 .../commands/common/ChipToolCheckInDelegate.h | 76 +++++++++++++++
 5 files changed, 190 insertions(+), 3 deletions(-)
 create mode 100644 examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
 create mode 100644 examples/chip-tool/commands/common/ChipToolCheckInDelegate.h

diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn
index 10d03c02ee295d..7c5fe3dafa0e45 100644
--- a/examples/chip-tool/BUILD.gn
+++ b/examples/chip-tool/BUILD.gn
@@ -58,6 +58,8 @@ static_library("chip-tool-utils") {
     "commands/common/BDXDiagnosticLogsServerDelegate.cpp",
     "commands/common/CHIPCommand.cpp",
     "commands/common/CHIPCommand.h",
+    "commands/common/ChipToolCheckInDelegate.cpp",
+    "commands/common/ChipToolCheckInDelegate.h",
     "commands/common/Command.cpp",
     "commands/common/Command.h",
     "commands/common/Commands.cpp",
diff --git a/examples/chip-tool/commands/common/CHIPCommand.cpp b/examples/chip-tool/commands/common/CHIPCommand.cpp
index c35eb11836d6c8..650175e11e9505 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.cpp
+++ b/examples/chip-tool/commands/common/CHIPCommand.cpp
@@ -18,6 +18,7 @@
 
 #include "CHIPCommand.h"
 
+#include <commands/common/ChipToolCheckInDelegate.h>
 #include <controller/CHIPDeviceControllerFactory.h>
 #include <credentials/attestation_verifier/FileAttestationTrustStore.h>
 #include <lib/core/CHIPConfig.h>
@@ -52,7 +53,7 @@ chip::Credentials::GroupDataProviderImpl CHIPCommand::sGroupDataProvider{ kMaxGr
 // All fabrics share the same ICD client storage.
 chip::app::DefaultICDClientStorage CHIPCommand::sICDClientStorage;
 chip::Crypto::RawKeySessionKeystore CHIPCommand::sSessionKeystore;
-chip::app::DefaultCheckInDelegate CHIPCommand::sCheckInDelegate;
+ChipToolCheckInDelegate CHIPCommand::sCheckInDelegate;
 chip::app::CheckInHandler CHIPCommand::sCheckInHandler;
 
 namespace {
@@ -653,3 +654,13 @@ void CHIPCommand::ExecuteDeferredCleanups(intptr_t ignored)
     }
     sDeferredCleanups.clear();
 }
+
+void CHIPCommand::RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+{
+    sCheckInDelegate.RegisterOnCheckInCompleteCallback(handler);
+}
+
+void CHIPCommand::UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+{
+    sCheckInDelegate.UnregisterOnCheckInCompleteCallback(handler);
+}
diff --git a/examples/chip-tool/commands/common/CHIPCommand.h b/examples/chip-tool/commands/common/CHIPCommand.h
index 50ab851d284502..484791095c2110 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.h
+++ b/examples/chip-tool/commands/common/CHIPCommand.h
@@ -28,8 +28,8 @@
 
 #include <TracingCommandLineArgument.h>
 #include <app/icd/client/CheckInHandler.h>
-#include <app/icd/client/DefaultCheckInDelegate.h>
 #include <app/icd/client/DefaultICDClientStorage.h>
+#include <commands/common/ChipToolCheckInDelegate.h>
 #include <commands/common/CredentialIssuerCommands.h>
 #include <commands/example/ExampleCredentialIssuerCommands.h>
 #include <credentials/GroupDataProviderImpl.h>
@@ -164,7 +164,7 @@ class CHIPCommand : public Command
 
     static chip::Credentials::GroupDataProviderImpl sGroupDataProvider;
     static chip::app::DefaultICDClientStorage sICDClientStorage;
-    static chip::app::DefaultCheckInDelegate sCheckInDelegate;
+    static ChipToolCheckInDelegate sCheckInDelegate;
     static chip::app::CheckInHandler sCheckInHandler;
     CredentialIssuerCommands * mCredIssuerCmds;
 
@@ -180,6 +180,10 @@ class CHIPCommand : public Command
 
     ChipDeviceCommissioner & GetCommissioner(std::string identity);
 
+    static void RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+
+    static void UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+
 private:
     CHIP_ERROR MaybeSetUpStack();
     void MaybeTearDownStack();
diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
new file mode 100644
index 00000000000000..96fcf2f1790e79
--- /dev/null
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
@@ -0,0 +1,94 @@
+/*
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "ChipToolCheckInDelegate.h"
+
+#include <app/icd/client/RefreshKeySender.h>
+#include <crypto/CHIPCryptoPAL.h>
+#include <lib/support/CodeUtils.h>
+#include <lib/support/logging/CHIPLogging.h>
+
+using namespace chip;
+using namespace chip::app;
+
+CHIP_ERROR ChipToolCheckInDelegate::Init(ICDClientStorage * storage, InteractionModelEngine * engine)
+{
+    VerifyOrReturnError(storage != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
+    VerifyOrReturnError(mpStorage == nullptr, CHIP_ERROR_INCORRECT_STATE);
+    mpStorage  = storage;
+    mpImEngine = engine;
+    return CHIP_NO_ERROR;
+}
+
+void ChipToolCheckInDelegate::OnCheckInComplete(const ICDClientInfo & clientInfo)
+{
+    ChipLogProgress(
+        ICD, "Check In Message processing complete: start_counter=%" PRIu32 " offset=%" PRIu32 " nodeid=" ChipLogFormatScopedNodeId,
+        clientInfo.start_icd_counter, clientInfo.offset, ChipLogValueScopedNodeId(clientInfo.peer_node));
+    for (auto handler : mCheckInCompleteCallbacks)
+    {
+        handler->OnCheckInComplete(clientInfo);
+    }
+}
+
+RefreshKeySender * ChipToolCheckInDelegate::OnKeyRefreshNeeded(ICDClientInfo & clientInfo, ICDClientStorage * clientStorage)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    RefreshKeySender::RefreshKeyBuffer newKey;
+
+    err = Crypto::DRBG_get_bytes(newKey.Bytes(), newKey.Capacity());
+    if (err != CHIP_NO_ERROR)
+    {
+        ChipLogError(ICD, "Generation of new key failed: %" CHIP_ERROR_FORMAT, err.Format());
+        return nullptr;
+    }
+
+    auto refreshKeySender = Platform::New<RefreshKeySender>(this, clientInfo, clientStorage, mpImEngine, newKey);
+    if (refreshKeySender == nullptr)
+    {
+        return nullptr;
+    }
+    return refreshKeySender;
+}
+
+void ChipToolCheckInDelegate::OnKeyRefreshDone(RefreshKeySender * refreshKeySender, CHIP_ERROR error)
+{
+    if (error == CHIP_NO_ERROR)
+    {
+        ChipLogProgress(ICD, "Re-registration with new key completed successfully");
+    }
+    else
+    {
+        ChipLogError(ICD, "Re-registration with new key failed with error : %" CHIP_ERROR_FORMAT, error.Format());
+        // The callee can take corrective action  based on the error received.
+    }
+    if (refreshKeySender != nullptr)
+    {
+        Platform::Delete(refreshKeySender);
+        refreshKeySender = nullptr;
+    }
+}
+
+void ChipToolCheckInDelegate::RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+{
+    chip::DeviceLayer::SystemLayer().ScheduleLambda([this, handler]() { mCheckInCompleteCallbacks.insert(handler); });
+}
+
+void ChipToolCheckInDelegate::UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+{
+    chip::DeviceLayer::SystemLayer().ScheduleLambda([this, handler]() { mCheckInCompleteCallbacks.insert(handler); });
+}
diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
new file mode 100644
index 00000000000000..b32356ab23b148
--- /dev/null
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
@@ -0,0 +1,76 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <set>
+
+#include <app/InteractionModelEngine.h>
+#include <app/icd/client/CheckInDelegate.h>
+#include <app/icd/client/ICDClientStorage.h>
+
+class CheckInCompleteCallback
+{
+public:
+    virtual ~CheckInCompleteCallback() {}
+
+    /**
+     * @brief Callback used to let the application know that a check-in message was received and validated.
+     *
+     * The callback will be executed in CHIP main loop. Implementations avoid blocking in this callback.
+     *
+     * @param[in] clientInfo - ICDClientInfo object representing the state associated with the
+     *                         node that sent the check-in message.
+     */
+    virtual void OnCheckInComplete(const chip::app::ICDClientInfo & clientInfo);
+};
+
+class ChipToolCheckInDelegate : public chip::app::CheckInDelegate
+{
+public:
+    virtual ~ChipToolCheckInDelegate() {}
+    CHIP_ERROR Init(chip::app::ICDClientStorage * storage, chip::app::InteractionModelEngine * engine);
+    void OnCheckInComplete(const chip::app::ICDClientInfo & clientInfo) override;
+    chip::app::RefreshKeySender * OnKeyRefreshNeeded(chip::app::ICDClientInfo & clientInfo,
+                                                     chip::app::ICDClientStorage * clientStorage) override;
+    void OnKeyRefreshDone(chip::app::RefreshKeySender * refreshKeySender, CHIP_ERROR error) override;
+
+    /**
+     * @brief Reigsters a callback when the check-in completes.
+     *
+     * The registeration will be processed inside CHIP main loop.
+     *
+     * @param[in] handler - A pointer to CheckInCompleteCallback to register.
+     */
+    void RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+
+    /**
+     * @brief Unreigsters a callback when the check-in completes.
+     *
+     * The unregisteration will be processed inside CHIP main loop.
+     *
+     * @param[in] handler - A pointer to CheckInCompleteCallback to unregister.
+     */
+    void UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+
+private:
+    chip::app::ICDClientStorage * mpStorage        = nullptr;
+    chip::app::InteractionModelEngine * mpImEngine = nullptr;
+
+    std::set<CheckInCompleteCallback *> mCheckInCompleteCallbacks;
+};

From 7762024501b1ab35d27886eb9404c597e710d920 Mon Sep 17 00:00:00 2001
From: Song Guo <songguo@google.com>
Date: Sun, 21 Apr 2024 12:44:59 +0000
Subject: [PATCH 2/6] remove overdesign callback

---
 .../chip-tool/commands/common/CHIPCommand.cpp |  8 ++++----
 .../chip-tool/commands/common/CHIPCommand.h   |  4 ++--
 .../common/ChipToolCheckInDelegate.cpp        | 13 ++++++------
 .../commands/common/ChipToolCheckInDelegate.h | 20 +++++++++----------
 4 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/examples/chip-tool/commands/common/CHIPCommand.cpp b/examples/chip-tool/commands/common/CHIPCommand.cpp
index 650175e11e9505..8e894f75fdcd77 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.cpp
+++ b/examples/chip-tool/commands/common/CHIPCommand.cpp
@@ -655,12 +655,12 @@ void CHIPCommand::ExecuteDeferredCleanups(intptr_t ignored)
     sDeferredCleanups.clear();
 }
 
-void CHIPCommand::RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+void CHIPCommand::SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
 {
-    sCheckInDelegate.RegisterOnCheckInCompleteCallback(handler);
+    sCheckInDelegate.SetOnCheckInCompleteCallback(handler);
 }
 
-void CHIPCommand::UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+void CHIPCommand::UnsetOnCheckInCompleteCallback()
 {
-    sCheckInDelegate.UnregisterOnCheckInCompleteCallback(handler);
+    sCheckInDelegate.UnsetOnCheckInCompleteCallback();
 }
diff --git a/examples/chip-tool/commands/common/CHIPCommand.h b/examples/chip-tool/commands/common/CHIPCommand.h
index 484791095c2110..548a27a373868e 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.h
+++ b/examples/chip-tool/commands/common/CHIPCommand.h
@@ -180,9 +180,9 @@ class CHIPCommand : public Command
 
     ChipDeviceCommissioner & GetCommissioner(std::string identity);
 
-    static void RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+    static void SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
 
-    static void UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+    static void UnsetOnCheckInCompleteCallback();
 
 private:
     CHIP_ERROR MaybeSetUpStack();
diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
index 96fcf2f1790e79..aad1883b9ad112 100644
--- a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
@@ -29,6 +29,7 @@ CHIP_ERROR ChipToolCheckInDelegate::Init(ICDClientStorage * storage, Interaction
 {
     VerifyOrReturnError(storage != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
     VerifyOrReturnError(mpStorage == nullptr, CHIP_ERROR_INCORRECT_STATE);
+    VerifyOrReturnError(engine != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
     mpStorage  = storage;
     mpImEngine = engine;
     return CHIP_NO_ERROR;
@@ -39,9 +40,9 @@ void ChipToolCheckInDelegate::OnCheckInComplete(const ICDClientInfo & clientInfo
     ChipLogProgress(
         ICD, "Check In Message processing complete: start_counter=%" PRIu32 " offset=%" PRIu32 " nodeid=" ChipLogFormatScopedNodeId,
         clientInfo.start_icd_counter, clientInfo.offset, ChipLogValueScopedNodeId(clientInfo.peer_node));
-    for (auto handler : mCheckInCompleteCallbacks)
+    if (mpCheckInCompleteCallbacks != nullptr)
     {
-        handler->OnCheckInComplete(clientInfo);
+        mpCheckInCompleteCallbacks->OnCheckInComplete(clientInfo);
     }
 }
 
@@ -83,12 +84,12 @@ void ChipToolCheckInDelegate::OnKeyRefreshDone(RefreshKeySender * refreshKeySend
     }
 }
 
-void ChipToolCheckInDelegate::RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+void ChipToolCheckInDelegate::SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
 {
-    chip::DeviceLayer::SystemLayer().ScheduleLambda([this, handler]() { mCheckInCompleteCallbacks.insert(handler); });
+    mpCheckInCompleteCallbacks = handler;
 }
 
-void ChipToolCheckInDelegate::UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
+void ChipToolCheckInDelegate::UnsetOnCheckInCompleteCallback()
 {
-    chip::DeviceLayer::SystemLayer().ScheduleLambda([this, handler]() { mCheckInCompleteCallbacks.insert(handler); });
+    mpCheckInCompleteCallbacks = nullptr;
 }
diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
index b32356ab23b148..ed93812eb56d67 100644
--- a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
@@ -32,7 +32,7 @@ class CheckInCompleteCallback
     /**
      * @brief Callback used to let the application know that a check-in message was received and validated.
      *
-     * The callback will be executed in CHIP main loop. Implementations avoid blocking in this callback.
+     * The callback will be executed in CHIP main loop. Implementations should avoid blocking operations in this callback.
      *
      * @param[in] clientInfo - ICDClientInfo object representing the state associated with the
      *                         node that sent the check-in message.
@@ -51,26 +51,24 @@ class ChipToolCheckInDelegate : public chip::app::CheckInDelegate
     void OnKeyRefreshDone(chip::app::RefreshKeySender * refreshKeySender, CHIP_ERROR error) override;
 
     /**
-     * @brief Reigsters a callback when the check-in completes.
+     * @brief Sets a callback for when the Check-In processing completes.
      *
-     * The registeration will be processed inside CHIP main loop.
+     * This method does not consider the race condition that the callback is changed during OnCheckInComplete.
      *
-     * @param[in] handler - A pointer to CheckInCompleteCallback to register.
+     * @param[in] handler - A pointer to the CheckInCompleteCallback to register.
      */
-    void RegisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+    void SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
 
     /**
-     * @brief Unreigsters a callback when the check-in completes.
+     * @brief Unsets the callback for when the Check-In processing completes.
      *
-     * The unregisteration will be processed inside CHIP main loop.
-     *
-     * @param[in] handler - A pointer to CheckInCompleteCallback to unregister.
+     * This method does not consider the race condition that the callback is changed during OnCheckInComplete.
      */
-    void UnregisterOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
+    void UnsetOnCheckInCompleteCallback();
 
 private:
     chip::app::ICDClientStorage * mpStorage        = nullptr;
     chip::app::InteractionModelEngine * mpImEngine = nullptr;
 
-    std::set<CheckInCompleteCallback *> mCheckInCompleteCallbacks;
+    CheckInCompleteCallback * mpCheckInCompleteCallbacks;
 };

From b67a457a509b9f883195d11f87861aaaf8586080 Mon Sep 17 00:00:00 2001
From: yunhanw-google <yunhanw@google.com>
Date: Fri, 26 Apr 2024 10:16:39 -0700
Subject: [PATCH 3/6] Update
 examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
---
 .../chip-tool/commands/common/ChipToolCheckInDelegate.cpp  | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
index aad1883b9ad112..4c8a6813069ef0 100644
--- a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
@@ -58,12 +58,7 @@ RefreshKeySender * ChipToolCheckInDelegate::OnKeyRefreshNeeded(ICDClientInfo & c
         return nullptr;
     }
 
-    auto refreshKeySender = Platform::New<RefreshKeySender>(this, clientInfo, clientStorage, mpImEngine, newKey);
-    if (refreshKeySender == nullptr)
-    {
-        return nullptr;
-    }
-    return refreshKeySender;
+    return Platform::New<RefreshKeySender>(this, clientInfo, clientStorage, mpImEngine, newKey);
 }
 
 void ChipToolCheckInDelegate::OnKeyRefreshDone(RefreshKeySender * refreshKeySender, CHIP_ERROR error)

From 8ebadd4b5db5b12b24bed259519f8908b04cccee Mon Sep 17 00:00:00 2001
From: yunhanw-google <yunhanw@google.com>
Date: Fri, 26 Apr 2024 10:16:58 -0700
Subject: [PATCH 4/6] Update
 examples/chip-tool/commands/common/ChipToolCheckInDelegate.h

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
---
 examples/chip-tool/commands/common/ChipToolCheckInDelegate.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
index ed93812eb56d67..ba7829b5a89184 100644
--- a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
@@ -37,7 +37,7 @@ class CheckInCompleteCallback
      * @param[in] clientInfo - ICDClientInfo object representing the state associated with the
      *                         node that sent the check-in message.
      */
-    virtual void OnCheckInComplete(const chip::app::ICDClientInfo & clientInfo);
+    virtual void OnCheckInComplete(const chip::app::ICDClientInfo & clientInfo) = 0;
 };
 
 class ChipToolCheckInDelegate : public chip::app::CheckInDelegate

From 6c051bcb36c28ea356e36b6179f8354939374daa Mon Sep 17 00:00:00 2001
From: yunhanw <yunhanw@google.com>
Date: Fri, 26 Apr 2024 10:36:13 -0700
Subject: [PATCH 5/6] remove unnecessary check-in delegate since the
 ChipToolCheckInDelegate is enough for chip-tool icd usage

---
 .../chip-tool/commands/common/CHIPCommand.cpp |  9 -----
 .../chip-tool/commands/common/CHIPCommand.h   |  4 ---
 .../common/ChipToolCheckInDelegate.cpp        | 14 --------
 .../commands/common/ChipToolCheckInDelegate.h | 34 -------------------
 4 files changed, 61 deletions(-)

diff --git a/examples/chip-tool/commands/common/CHIPCommand.cpp b/examples/chip-tool/commands/common/CHIPCommand.cpp
index 8e894f75fdcd77..cc1f498ebaf07e 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.cpp
+++ b/examples/chip-tool/commands/common/CHIPCommand.cpp
@@ -655,12 +655,3 @@ void CHIPCommand::ExecuteDeferredCleanups(intptr_t ignored)
     sDeferredCleanups.clear();
 }
 
-void CHIPCommand::SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
-{
-    sCheckInDelegate.SetOnCheckInCompleteCallback(handler);
-}
-
-void CHIPCommand::UnsetOnCheckInCompleteCallback()
-{
-    sCheckInDelegate.UnsetOnCheckInCompleteCallback();
-}
diff --git a/examples/chip-tool/commands/common/CHIPCommand.h b/examples/chip-tool/commands/common/CHIPCommand.h
index 548a27a373868e..38e4811eadf361 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.h
+++ b/examples/chip-tool/commands/common/CHIPCommand.h
@@ -180,10 +180,6 @@ class CHIPCommand : public Command
 
     ChipDeviceCommissioner & GetCommissioner(std::string identity);
 
-    static void SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
-
-    static void UnsetOnCheckInCompleteCallback();
-
 private:
     CHIP_ERROR MaybeSetUpStack();
     void MaybeTearDownStack();
diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
index 4c8a6813069ef0..1aa2f6ea705a67 100644
--- a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp
@@ -40,10 +40,6 @@ void ChipToolCheckInDelegate::OnCheckInComplete(const ICDClientInfo & clientInfo
     ChipLogProgress(
         ICD, "Check In Message processing complete: start_counter=%" PRIu32 " offset=%" PRIu32 " nodeid=" ChipLogFormatScopedNodeId,
         clientInfo.start_icd_counter, clientInfo.offset, ChipLogValueScopedNodeId(clientInfo.peer_node));
-    if (mpCheckInCompleteCallbacks != nullptr)
-    {
-        mpCheckInCompleteCallbacks->OnCheckInComplete(clientInfo);
-    }
 }
 
 RefreshKeySender * ChipToolCheckInDelegate::OnKeyRefreshNeeded(ICDClientInfo & clientInfo, ICDClientStorage * clientStorage)
@@ -78,13 +74,3 @@ void ChipToolCheckInDelegate::OnKeyRefreshDone(RefreshKeySender * refreshKeySend
         refreshKeySender = nullptr;
     }
 }
-
-void ChipToolCheckInDelegate::SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler)
-{
-    mpCheckInCompleteCallbacks = handler;
-}
-
-void ChipToolCheckInDelegate::UnsetOnCheckInCompleteCallback()
-{
-    mpCheckInCompleteCallbacks = nullptr;
-}
diff --git a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
index ba7829b5a89184..d0e456ae885dc5 100644
--- a/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
+++ b/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h
@@ -24,22 +24,6 @@
 #include <app/icd/client/CheckInDelegate.h>
 #include <app/icd/client/ICDClientStorage.h>
 
-class CheckInCompleteCallback
-{
-public:
-    virtual ~CheckInCompleteCallback() {}
-
-    /**
-     * @brief Callback used to let the application know that a check-in message was received and validated.
-     *
-     * The callback will be executed in CHIP main loop. Implementations should avoid blocking operations in this callback.
-     *
-     * @param[in] clientInfo - ICDClientInfo object representing the state associated with the
-     *                         node that sent the check-in message.
-     */
-    virtual void OnCheckInComplete(const chip::app::ICDClientInfo & clientInfo) = 0;
-};
-
 class ChipToolCheckInDelegate : public chip::app::CheckInDelegate
 {
 public:
@@ -50,25 +34,7 @@ class ChipToolCheckInDelegate : public chip::app::CheckInDelegate
                                                      chip::app::ICDClientStorage * clientStorage) override;
     void OnKeyRefreshDone(chip::app::RefreshKeySender * refreshKeySender, CHIP_ERROR error) override;
 
-    /**
-     * @brief Sets a callback for when the Check-In processing completes.
-     *
-     * This method does not consider the race condition that the callback is changed during OnCheckInComplete.
-     *
-     * @param[in] handler - A pointer to the CheckInCompleteCallback to register.
-     */
-    void SetOnCheckInCompleteCallback(CheckInCompleteCallback * handler);
-
-    /**
-     * @brief Unsets the callback for when the Check-In processing completes.
-     *
-     * This method does not consider the race condition that the callback is changed during OnCheckInComplete.
-     */
-    void UnsetOnCheckInCompleteCallback();
-
 private:
     chip::app::ICDClientStorage * mpStorage        = nullptr;
     chip::app::InteractionModelEngine * mpImEngine = nullptr;
-
-    CheckInCompleteCallback * mpCheckInCompleteCallbacks;
 };

From 5f673c31d1b4f4e738e90050bbb3be3291a50c42 Mon Sep 17 00:00:00 2001
From: Song Guo <songguo@google.com>
Date: Thu, 2 May 2024 05:59:52 +0000
Subject: [PATCH 6/6] Fix build and style

---
 examples/chip-tool/commands/common/CHIPCommand.cpp | 1 -
 examples/darwin-framework-tool/BUILD.gn            | 2 ++
 examples/tv-casting-app/tv-casting-common/BUILD.gn | 2 ++
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/examples/chip-tool/commands/common/CHIPCommand.cpp b/examples/chip-tool/commands/common/CHIPCommand.cpp
index cc1f498ebaf07e..8bf82abe14fbd7 100644
--- a/examples/chip-tool/commands/common/CHIPCommand.cpp
+++ b/examples/chip-tool/commands/common/CHIPCommand.cpp
@@ -654,4 +654,3 @@ void CHIPCommand::ExecuteDeferredCleanups(intptr_t ignored)
     }
     sDeferredCleanups.clear();
 }
-
diff --git a/examples/darwin-framework-tool/BUILD.gn b/examples/darwin-framework-tool/BUILD.gn
index 665dccf4848df4..a4859c4c68f363 100644
--- a/examples/darwin-framework-tool/BUILD.gn
+++ b/examples/darwin-framework-tool/BUILD.gn
@@ -170,6 +170,8 @@ config("config") {
 
 executable("darwin-framework-tool") {
   sources = [
+    "${chip_root}/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp",
+    "${chip_root}/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h",
     "${chip_root}/examples/chip-tool/commands/common/Command.cpp",
     "${chip_root}/examples/chip-tool/commands/common/Command.h",
     "${chip_root}/examples/chip-tool/commands/common/Commands.cpp",
diff --git a/examples/tv-casting-app/tv-casting-common/BUILD.gn b/examples/tv-casting-app/tv-casting-common/BUILD.gn
index 72f14fb7bffeee..52e5481e97c296 100644
--- a/examples/tv-casting-app/tv-casting-common/BUILD.gn
+++ b/examples/tv-casting-app/tv-casting-common/BUILD.gn
@@ -38,6 +38,8 @@ chip_data_model("tv-casting-common") {
     "${chip_root}/examples/chip-tool/commands/clusters/ModelCommand.h",
     "${chip_root}/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.cpp",
     "${chip_root}/examples/chip-tool/commands/common/CHIPCommand.h",
+    "${chip_root}/examples/chip-tool/commands/common/ChipToolCheckInDelegate.cpp",
+    "${chip_root}/examples/chip-tool/commands/common/ChipToolCheckInDelegate.h",
     "${chip_root}/examples/chip-tool/commands/common/Command.cpp",
     "${chip_root}/examples/chip-tool/commands/common/Command.h",
     "${chip_root}/examples/chip-tool/commands/common/Commands.cpp",