From 75fcb47773053d52c82e7e585c9b7da467e6b802 Mon Sep 17 00:00:00 2001
From: Hasty Granbery <hasty@granbery.org>
Date: Thu, 22 Feb 2024 07:27:07 +0900
Subject: [PATCH 1/3] Change message duration to uint64

---
 data_model/clusters/Messages.xml              |  2 +-
 .../include/messages/MessagesManager.cpp      |  2 +-
 .../include/messages/MessagesManager.h        |  2 +-
 .../tv-app/android/java/MessagesManager.cpp   |  4 ++--
 .../tv-app/android/java/MessagesManager.h     |  2 +-
 .../com/matter/tv/server/tvapp/Message.java   |  4 ++--
 .../tv/server/tvapp/MessagesManager.java      |  2 +-
 .../tv/server/tvapp/MessagesManagerStub.java  |  2 +-
 .../clusters/messages/MessagesManager.h       |  4 ++--
 examples/tv-app/tv-common/tv-app.matter       |  4 ++--
 .../tv-casting-common/tv-casting-app.matter   |  4 ++--
 .../messages-server/messages-delegate.h       |  2 +-
 .../zcl/data-model/chip/messages-cluster.xml  |  4 ++--
 .../data_model/controller-clusters.matter     |  4 ++--
 .../chip/devicecontroller/ChipClusters.java   |  4 ++--
 .../chip/devicecontroller/ChipStructs.java    |  8 +++----
 .../devicecontroller/ClusterInfoMapping.java  |  4 ++--
 .../structs/MessagesClusterMessageStruct.kt   |  4 ++--
 .../cluster/clusters/MessagesCluster.kt       |  2 +-
 .../structs/MessagesClusterMessageStruct.kt   |  4 ++--
 .../CHIPAttributeTLVValueDecoder.cpp          | 21 +++++++++----------
 .../MTRAttributeTLVValueDecoder.mm            |  2 +-
 .../zap-generated/MTRCommandPayloadsObjc.mm   |  2 +-
 .../zap-generated/cluster-objects.h           |  8 +++----
 .../zap-generated/cluster/Commands.h          |  2 +-
 .../zap-generated/cluster/Commands.h          |  4 ++--
 26 files changed, 53 insertions(+), 54 deletions(-)

diff --git a/data_model/clusters/Messages.xml b/data_model/clusters/Messages.xml
index cea28ac15f54c9..5bc3ce81fa2a0d 100644
--- a/data_model/clusters/Messages.xml
+++ b/data_model/clusters/Messages.xml
@@ -216,7 +216,7 @@ Davis, CA 95616, USA
         <quality nullable="true"/>
         <mandatoryConform/>
       </field>
-      <field id="4" name="Duration" type="uint16" default="0">
+      <field id="4" name="Duration" type="uint64" default="0">
         <access fabricSensitive="true"/>
         <quality nullable="true"/>
         <mandatoryConform/>
diff --git a/examples/tv-app/android/include/messages/MessagesManager.cpp b/examples/tv-app/android/include/messages/MessagesManager.cpp
index dcd48f028b961e..00848c67312751 100644
--- a/examples/tv-app/android/include/messages/MessagesManager.cpp
+++ b/examples/tv-app/android/include/messages/MessagesManager.cpp
@@ -25,7 +25,7 @@ using namespace chip::app::Clusters::Messages;
 void MessagesManager::HandlePresentMessagesRequest(
     const chip::ByteSpan & messageId, const MessagePriorityEnum & priority,
     const chip::BitMask<MessageControlBitmap> & messageControl, const chip::app::DataModel::Nullable<uint32_t> & startTime,
-    const chip::app::DataModel::Nullable<uint16_t> & duration, const chip::CharSpan & messageText,
+    const chip::app::DataModel::Nullable<uint64_t> & duration, const chip::CharSpan & messageText,
     const chip::Optional<chip::app::DataModel::DecodableList<MessageResponseOption>> & responses)
 {
     // TODO: Present Message
diff --git a/examples/tv-app/android/include/messages/MessagesManager.h b/examples/tv-app/android/include/messages/MessagesManager.h
index 5f06d253846c4f..d6759061800621 100644
--- a/examples/tv-app/android/include/messages/MessagesManager.h
+++ b/examples/tv-app/android/include/messages/MessagesManager.h
@@ -27,7 +27,7 @@ class MessagesManager : public chip::app::Clusters::Messages::Delegate
     void HandlePresentMessagesRequest(
         const chip::ByteSpan & messageId, const chip::app::Clusters::Messages::MessagePriorityEnum & priority,
         const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> & messageControl,
-        const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint16_t> & duration,
+        const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint64_t> & duration,
         const chip::CharSpan & messageText,
         const chip::Optional<chip::app::DataModel::DecodableList<
             chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::DecodableType>> & responses) override;
diff --git a/examples/tv-app/android/java/MessagesManager.cpp b/examples/tv-app/android/java/MessagesManager.cpp
index 9203d7b54510f5..4b853abb4e43e4 100644
--- a/examples/tv-app/android/java/MessagesManager.cpp
+++ b/examples/tv-app/android/java/MessagesManager.cpp
@@ -186,7 +186,7 @@ CHIP_ERROR MessagesManager::HandleGetMessages(AttributeValueEncoder & aEncoder)
             jint jduration         = env->GetIntField(messageObject, durationField);
             if (jduration >= 0)
             {
-                message.duration = DataModel::Nullable<uint16_t>(static_cast<uint16_t>(jduration));
+                message.duration = DataModel::Nullable<uint16_t>(static_cast<uint64_t>(jduration));
             }
 
             jfieldID getResponseOptionsField =
@@ -301,7 +301,7 @@ CHIP_ERROR MessagesManager::HandleGetActiveMessageIds(AttributeValueEncoder & aE
 
 CHIP_ERROR MessagesManager::HandlePresentMessagesRequest(
     const ByteSpan & messageId, const MessagePriorityEnum & priority, const BitMask<MessageControlBitmap> & messageControl,
-    const DataModel::Nullable<uint32_t> & startTime, const DataModel::Nullable<uint16_t> & duration, const CharSpan & messageText,
+    const DataModel::Nullable<uint32_t> & startTime, const DataModel::Nullable<uint64_t> & duration, const CharSpan & messageText,
     const Optional<DataModel::DecodableList<MessageResponseOption>> & responses)
 {
     DeviceLayer::StackUnlock unlock;
diff --git a/examples/tv-app/android/java/MessagesManager.h b/examples/tv-app/android/java/MessagesManager.h
index 563192a542bdf6..089d3e4360afe0 100644
--- a/examples/tv-app/android/java/MessagesManager.h
+++ b/examples/tv-app/android/java/MessagesManager.h
@@ -35,7 +35,7 @@ class MessagesManager : public chip::app::Clusters::Messages::Delegate
     CHIP_ERROR HandlePresentMessagesRequest(
         const chip::ByteSpan & messageId, const chip::app::Clusters::Messages::MessagePriorityEnum & priority,
         const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> & messageControl,
-        const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint16_t> & duration,
+        const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint64_t> & duration,
         const chip::CharSpan & messageText,
         const chip::Optional<
             chip::app::DataModel::DecodableList<chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type>> &
diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/Message.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/Message.java
index c194ffb44f9ee1..8949ab8283b10d 100644
--- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/Message.java
+++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/Message.java
@@ -23,7 +23,7 @@ public class Message {
   public int priority;
   public int messageControl;
   public long startTime;
-  public int duration;
+  public long duration;
   public String messageText;
   public MessageResponseOption responseOptions[];
 
@@ -32,7 +32,7 @@ public Message(
       int priority,
       int messageControl,
       long startTime,
-      int duration,
+      long duration,
       String messageText,
       MessageResponseOption responseOptions[]) {
     this.messageId = messageId;
diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManager.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManager.java
index 0a5680866714c6..5d97083cafe8a4 100644
--- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManager.java
+++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManager.java
@@ -28,7 +28,7 @@ boolean presentMessages(
       int priority,
       int messageControl,
       long startTime,
-      int duration,
+      long duration,
       String messageText,
       HashMap<Long, String> responseOptions);
 
diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManagerStub.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManagerStub.java
index 63fef69d35c936..55d94209197559 100644
--- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManagerStub.java
+++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MessagesManagerStub.java
@@ -52,7 +52,7 @@ public boolean presentMessages(
       int priority,
       int messageControl,
       long startTime,
-      int duration,
+      long duration,
       String messageText,
       HashMap<Long, String> responseOptions) {
     Log.d(
diff --git a/examples/tv-app/tv-common/clusters/messages/MessagesManager.h b/examples/tv-app/tv-common/clusters/messages/MessagesManager.h
index 325cd56fc788af..32c39b65ddd75d 100644
--- a/examples/tv-app/tv-common/clusters/messages/MessagesManager.h
+++ b/examples/tv-app/tv-common/clusters/messages/MessagesManager.h
@@ -64,7 +64,7 @@ struct CachedMessage
     CachedMessage(const chip::ByteSpan & messageId, const chip::app::Clusters::Messages::MessagePriorityEnum & priority,
                   const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> & messageControl,
                   const chip::app::DataModel::Nullable<uint32_t> & startTime,
-                  const chip::app::DataModel::Nullable<uint16_t> & duration, std::string messageText) :
+                  const chip::app::DataModel::Nullable<uint64_t> & duration, std::string messageText) :
         mPriority(priority),
         mMessageControl(messageControl), mStartTime(startTime), mDuration(duration), mMessageText(messageText)
     {
@@ -110,7 +110,7 @@ struct CachedMessage
     const chip::app::Clusters::Messages::MessagePriorityEnum mPriority;
     const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> mMessageControl;
     const chip::app::DataModel::Nullable<uint32_t> mStartTime;
-    const chip::app::DataModel::Nullable<uint16_t> mDuration;
+    const chip::app::DataModel::Nullable<uint64_t> mDuration;
 
     std::string mMessageText;
     uint8_t mMessageIdBuffer[chip::app::Clusters::Messages::kMessageIdLength];
diff --git a/examples/tv-app/tv-common/tv-app.matter b/examples/tv-app/tv-common/tv-app.matter
index 6effacc92c0812..37fd9cb777b98b 100644
--- a/examples/tv-app/tv-common/tv-app.matter
+++ b/examples/tv-app/tv-common/tv-app.matter
@@ -2067,7 +2067,7 @@ provisional cluster Messages = 151 {
     MessagePriorityEnum priority = 1;
     MessageControlBitmap messageControl = 2;
     nullable epoch_s startTime = 3;
-    nullable int16u duration = 4;
+    nullable int64u duration = 4;
     char_string<256> messageText = 5;
     optional MessageResponseOptionStruct responses[] = 6;
   }
@@ -2101,7 +2101,7 @@ provisional cluster Messages = 151 {
     MessagePriorityEnum priority = 1;
     MessageControlBitmap messageControl = 2;
     nullable epoch_s startTime = 3;
-    nullable int16u duration = 4;
+    nullable int64u duration = 4;
     char_string<256> messageText = 5;
     optional MessageResponseOptionStruct responses[] = 6;
   }
diff --git a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
index 4bece078774075..35a766e68307aa 100644
--- a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
+++ b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
@@ -1545,7 +1545,7 @@ provisional cluster Messages = 151 {
     MessagePriorityEnum priority = 1;
     MessageControlBitmap messageControl = 2;
     nullable epoch_s startTime = 3;
-    nullable int16u duration = 4;
+    nullable int64u duration = 4;
     char_string<256> messageText = 5;
     optional MessageResponseOptionStruct responses[] = 6;
   }
@@ -1579,7 +1579,7 @@ provisional cluster Messages = 151 {
     MessagePriorityEnum priority = 1;
     MessageControlBitmap messageControl = 2;
     nullable epoch_s startTime = 3;
-    nullable int16u duration = 4;
+    nullable int64u duration = 4;
     char_string<256> messageText = 5;
     optional MessageResponseOptionStruct responses[] = 6;
   }
diff --git a/src/app/clusters/messages-server/messages-delegate.h b/src/app/clusters/messages-server/messages-delegate.h
index aba771aad23953..6be09de781d340 100644
--- a/src/app/clusters/messages-server/messages-delegate.h
+++ b/src/app/clusters/messages-server/messages-delegate.h
@@ -42,7 +42,7 @@ class Delegate
     virtual CHIP_ERROR HandlePresentMessagesRequest(
         const ByteSpan & messageId, const MessagePriorityEnum & priority,
         const chip::BitMask<MessageControlBitmap> & messageControl, const DataModel::Nullable<uint32_t> & startTime,
-        const DataModel::Nullable<uint16_t> & duration, const CharSpan & messageText,
+        const DataModel::Nullable<uint64_t> & duration, const CharSpan & messageText,
         const chip::Optional<DataModel::DecodableList<chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type>> &
             responses)                                                                                          = 0;
     virtual CHIP_ERROR HandleCancelMessagesRequest(const DataModel::DecodableList<chip::ByteSpan> & messageIds) = 0;
diff --git a/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml
index 2da346cd49a6f7..16b1527625d320 100644
--- a/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml
+++ b/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml
@@ -58,7 +58,7 @@ limitations under the License.
     <item fieldId="1" name="Priority" type="MessagePriorityEnum" optional="false"/>
     <item fieldId="2" name="MessageControl" type="MessageControlBitmap" default="0" optional="false"/>
     <item fieldId="3" name="StartTime" type="epoch_s" default="0" optional="false" isNullable="true"/>
-    <item fieldId="4" name="Duration" type="int16u" default="0" optional="false" isNullable="true"/>
+    <item fieldId="4" name="Duration" type="int64u" default="0" optional="false" isNullable="true"/>
     <item fieldId="5" name="MessageText" type="char_string" length="256" optional="false"/>
     <item fieldId="6" name="Responses" type="MessageResponseOptionStruct" array="true" length="4" optional="true"/>
   </struct>
@@ -88,7 +88,7 @@ limitations under the License.
       <arg name="Priority" type="MessagePriorityEnum" optional="false"/>
       <arg name="MessageControl" type="MessageControlBitmap" default="0" optional="false"/>
       <arg name="StartTime" type="epoch_s" default="0" optional="false" isNullable="true"/>
-      <arg name="Duration" type="int16u" default="0" optional="false" isNullable="true"/>
+      <arg name="Duration" type="int64u" default="0" optional="false" isNullable="true"/>
       <arg name="MessageText" type="char_string" length="256" optional="false"/>
       <arg name="Responses" type="MessageResponseOptionStruct" array="true" length="4" optional="true"/>
     </command>
diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter
index 235366f4206e78..8611f4bdcf62d8 100644
--- a/src/controller/data_model/controller-clusters.matter
+++ b/src/controller/data_model/controller-clusters.matter
@@ -4539,7 +4539,7 @@ provisional cluster Messages = 151 {
     MessagePriorityEnum priority = 1;
     MessageControlBitmap messageControl = 2;
     nullable epoch_s startTime = 3;
-    nullable int16u duration = 4;
+    nullable int64u duration = 4;
     char_string<256> messageText = 5;
     optional MessageResponseOptionStruct responses[] = 6;
   }
@@ -4573,7 +4573,7 @@ provisional cluster Messages = 151 {
     MessagePriorityEnum priority = 1;
     MessageControlBitmap messageControl = 2;
     nullable epoch_s startTime = 3;
-    nullable int16u duration = 4;
+    nullable int64u duration = 4;
     char_string<256> messageText = 5;
     optional MessageResponseOptionStruct responses[] = 6;
   }
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
index fcc9154511d2b7..7025f3cde37858 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java
@@ -29906,11 +29906,11 @@ public long initWithDevice(long devicePtr, int endpointId) {
       return 0L;
     }
 
-    public void presentMessagesRequest(DefaultClusterCallback callback, byte[] messageID, Integer priority, Integer messageControl, @Nullable Long startTime, @Nullable Integer duration, String messageText, Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses) {
+    public void presentMessagesRequest(DefaultClusterCallback callback, byte[] messageID, Integer priority, Integer messageControl, @Nullable Long startTime, @Nullable Long duration, String messageText, Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses) {
       presentMessagesRequest(callback, messageID, priority, messageControl, startTime, duration, messageText, responses, 0);
     }
 
-    public void presentMessagesRequest(DefaultClusterCallback callback, byte[] messageID, Integer priority, Integer messageControl, @Nullable Long startTime, @Nullable Integer duration, String messageText, Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses, int timedInvokeTimeoutMs) {
+    public void presentMessagesRequest(DefaultClusterCallback callback, byte[] messageID, Integer priority, Integer messageControl, @Nullable Long startTime, @Nullable Long duration, String messageText, Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses, int timedInvokeTimeoutMs) {
       final long commandId = 0L;
 
       ArrayList<StructElement> elements = new ArrayList<>();
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipStructs.java b/src/controller/java/generated/java/chip/devicecontroller/ChipStructs.java
index 6fb0469aded45c..7730f05efe734a 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ChipStructs.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ChipStructs.java
@@ -7130,7 +7130,7 @@ public static class MessagesClusterMessageStruct {
   public Integer priority;
   public Integer messageControl;
   public @Nullable Long startTime;
-  public @Nullable Integer duration;
+  public @Nullable Long duration;
   public String messageText;
   public Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses;
   private static final long MESSAGE_I_D_ID = 0L;
@@ -7146,7 +7146,7 @@ public MessagesClusterMessageStruct(
     Integer priority,
     Integer messageControl,
     @Nullable Long startTime,
-    @Nullable Integer duration,
+    @Nullable Long duration,
     String messageText,
     Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses
   ) {
@@ -7180,7 +7180,7 @@ public static MessagesClusterMessageStruct decodeTlv(BaseTLVType tlvValue) {
     Integer priority = null;
     Integer messageControl = null;
     @Nullable Long startTime = null;
-    @Nullable Integer duration = null;
+    @Nullable Long duration = null;
     String messageText = null;
     Optional<ArrayList<ChipStructs.MessagesClusterMessageResponseOptionStruct>> responses = Optional.empty();
     for (StructElement element: ((StructType)tlvValue).value()) {
@@ -7207,7 +7207,7 @@ public static MessagesClusterMessageStruct decodeTlv(BaseTLVType tlvValue) {
       } else if (element.contextTagNum() == DURATION_ID) {
         if (element.value(BaseTLVType.class).type() == TLVType.UInt) {
           UIntType castingValue = element.value(UIntType.class);
-          duration = castingValue.value(Integer.class);
+          duration = castingValue.value(Long.class);
         }
       } else if (element.contextTagNum() == MESSAGE_TEXT_ID) {
         if (element.value(BaseTLVType.class).type() == TLVType.String) {
diff --git a/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java b/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
index 14b4a97284f173..5162f9766a74da 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
+++ b/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java
@@ -24325,7 +24325,7 @@ public Map<String, Map<String, InteractionInfo>> getCommandMap() {
     CommandParameterInfo messagespresentMessagesRequeststartTimeCommandParameterInfo = new CommandParameterInfo("startTime", Long.class, Long.class);
     messagespresentMessagesRequestCommandParams.put("startTime",messagespresentMessagesRequeststartTimeCommandParameterInfo);
 
-    CommandParameterInfo messagespresentMessagesRequestdurationCommandParameterInfo = new CommandParameterInfo("duration", Integer.class, Integer.class);
+    CommandParameterInfo messagespresentMessagesRequestdurationCommandParameterInfo = new CommandParameterInfo("duration", Long.class, Long.class);
     messagespresentMessagesRequestCommandParams.put("duration",messagespresentMessagesRequestdurationCommandParameterInfo);
 
     CommandParameterInfo messagespresentMessagesRequestmessageTextCommandParameterInfo = new CommandParameterInfo("messageText", String.class, String.class);
@@ -24343,7 +24343,7 @@ public Map<String, Map<String, InteractionInfo>> getCommandMap() {
         commandArguments.get("messageControl")
         , (Long)
         commandArguments.get("startTime")
-        , (Integer)
+        , (Long)
         commandArguments.get("duration")
         , (String)
         commandArguments.get("messageText")
diff --git a/src/controller/java/generated/java/chip/devicecontroller/cluster/structs/MessagesClusterMessageStruct.kt b/src/controller/java/generated/java/chip/devicecontroller/cluster/structs/MessagesClusterMessageStruct.kt
index d1749289a3b652..03a544caf41c32 100644
--- a/src/controller/java/generated/java/chip/devicecontroller/cluster/structs/MessagesClusterMessageStruct.kt
+++ b/src/controller/java/generated/java/chip/devicecontroller/cluster/structs/MessagesClusterMessageStruct.kt
@@ -29,7 +29,7 @@ class MessagesClusterMessageStruct(
   val priority: UInt,
   val messageControl: UInt,
   val startTime: ULong?,
-  val duration: UInt?,
+  val duration: ULong?,
   val messageText: String,
   val responses: Optional<List<MessagesClusterMessageResponseOptionStruct>>
 ) {
@@ -97,7 +97,7 @@ class MessagesClusterMessageStruct(
         }
       val duration =
         if (!tlvReader.isNull()) {
-          tlvReader.getUInt(ContextSpecificTag(TAG_DURATION))
+          tlvReader.getULong(ContextSpecificTag(TAG_DURATION))
         } else {
           tlvReader.getNull(ContextSpecificTag(TAG_DURATION))
           null
diff --git a/src/controller/java/generated/java/matter/controller/cluster/clusters/MessagesCluster.kt b/src/controller/java/generated/java/matter/controller/cluster/clusters/MessagesCluster.kt
index 5ce55e2e0dd21b..3e3fcd8f02d2f8 100644
--- a/src/controller/java/generated/java/matter/controller/cluster/clusters/MessagesCluster.kt
+++ b/src/controller/java/generated/java/matter/controller/cluster/clusters/MessagesCluster.kt
@@ -106,7 +106,7 @@ class MessagesCluster(private val controller: MatterController, private val endp
     priority: UByte,
     messageControl: UByte,
     startTime: UInt?,
-    duration: UShort?,
+    duration: ULong?,
     messageText: String,
     responses: List<MessagesClusterMessageResponseOptionStruct>?,
     timedInvokeTimeout: Duration? = null
diff --git a/src/controller/java/generated/java/matter/controller/cluster/structs/MessagesClusterMessageStruct.kt b/src/controller/java/generated/java/matter/controller/cluster/structs/MessagesClusterMessageStruct.kt
index 8560beb0a72ce1..14c573c396ca18 100644
--- a/src/controller/java/generated/java/matter/controller/cluster/structs/MessagesClusterMessageStruct.kt
+++ b/src/controller/java/generated/java/matter/controller/cluster/structs/MessagesClusterMessageStruct.kt
@@ -29,7 +29,7 @@ class MessagesClusterMessageStruct(
   val priority: UByte,
   val messageControl: UByte,
   val startTime: UInt?,
-  val duration: UShort?,
+  val duration: ULong?,
   val messageText: String,
   val responses: Optional<List<MessagesClusterMessageResponseOptionStruct>>
 ) {
@@ -97,7 +97,7 @@ class MessagesClusterMessageStruct(
         }
       val duration =
         if (!tlvReader.isNull()) {
-          tlvReader.getUShort(ContextSpecificTag(TAG_DURATION))
+          tlvReader.getULong(ContextSpecificTag(TAG_DURATION))
         } else {
           tlvReader.getNull(ContextSpecificTag(TAG_DURATION))
           null
diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
index 7a8aebe5b5c493..2400ba818c7cb9 100644
--- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
+++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp
@@ -23068,12 +23068,12 @@ jobject DecodeAttributeValue(const app::ConcreteAttributePath & aPath, TLV::TLVR
                 }
                 else
                 {
-                    std::string newElement_0_durationClassName     = "java/lang/Integer";
-                    std::string newElement_0_durationCtorSignature = "(I)V";
-                    jint jninewElement_0_duration                  = static_cast<jint>(entry_0.duration.Value());
-                    chip::JniReferences::GetInstance().CreateBoxedObject<jint>(newElement_0_durationClassName.c_str(),
-                                                                               newElement_0_durationCtorSignature.c_str(),
-                                                                               jninewElement_0_duration, newElement_0_duration);
+                    std::string newElement_0_durationClassName     = "java/lang/Long";
+                    std::string newElement_0_durationCtorSignature = "(J)V";
+                    jlong jninewElement_0_duration                 = static_cast<jlong>(entry_0.duration.Value());
+                    chip::JniReferences::GetInstance().CreateBoxedObject<jlong>(newElement_0_durationClassName.c_str(),
+                                                                                newElement_0_durationCtorSignature.c_str(),
+                                                                                jninewElement_0_duration, newElement_0_duration);
                 }
                 jobject newElement_0_messageText;
                 LogErrorOnFailure(
@@ -23163,11 +23163,10 @@ jobject DecodeAttributeValue(const app::ConcreteAttributePath & aPath, TLV::TLVR
                 }
 
                 jmethodID messageStructStructCtor_1;
-                err =
-                    chip::JniReferences::GetInstance().FindMethod(env, messageStructStructClass_1, "<init>",
-                                                                  "([BLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Long;Ljava/"
-                                                                  "lang/Integer;Ljava/lang/String;Ljava/util/Optional;)V",
-                                                                  &messageStructStructCtor_1);
+                err = chip::JniReferences::GetInstance().FindMethod(env, messageStructStructClass_1, "<init>",
+                                                                    "([BLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/"
+                                                                    "Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/Optional;)V",
+                                                                    &messageStructStructCtor_1);
                 if (err != CHIP_NO_ERROR || messageStructStructCtor_1 == nullptr)
                 {
                     ChipLogError(Zcl, "Could not find ChipStructs$MessagesClusterMessageStruct constructor");
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index 298c127feeb02d..bae1643f3beb39 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -8750,7 +8750,7 @@ static id _Nullable DecodeAttributeValueForMessagesCluster(AttributeId aAttribut
                 if (entry_0.duration.IsNull()) {
                     newElement_0.duration = nil;
                 } else {
-                    newElement_0.duration = [NSNumber numberWithUnsignedShort:entry_0.duration.Value()];
+                    newElement_0.duration = [NSNumber numberWithUnsignedLongLong:entry_0.duration.Value()];
                 }
                 newElement_0.messageText = AsString(entry_0.messageText);
                 if (newElement_0.messageText == nil) {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
index b2c13559d07aec..60757c92d0dfdb 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
@@ -15516,7 +15516,7 @@ - (CHIP_ERROR)_encodeToTLVReader:(chip::System::PacketBufferTLVReader &)reader
             encodableStruct.duration.SetNull();
         } else {
             auto & nonNullValue_0 = encodableStruct.duration.SetNonNull();
-            nonNullValue_0 = self.duration.unsignedShortValue;
+            nonNullValue_0 = self.duration.unsignedLongLongValue;
         }
     }
     {
diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
index 99e6e3bb1d63f7..dfdf2e691686f2 100644
--- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
+++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h
@@ -21506,7 +21506,7 @@ struct Type
     MessagePriorityEnum priority                       = static_cast<MessagePriorityEnum>(0);
     chip::BitMask<MessageControlBitmap> messageControl = static_cast<chip::BitMask<MessageControlBitmap>>(0);
     DataModel::Nullable<uint32_t> startTime;
-    DataModel::Nullable<uint16_t> duration;
+    DataModel::Nullable<uint64_t> duration;
     chip::CharSpan messageText;
     Optional<DataModel::List<const Structs::MessageResponseOptionStruct::Type>> responses;
 
@@ -21522,7 +21522,7 @@ struct DecodableType
     MessagePriorityEnum priority                       = static_cast<MessagePriorityEnum>(0);
     chip::BitMask<MessageControlBitmap> messageControl = static_cast<chip::BitMask<MessageControlBitmap>>(0);
     DataModel::Nullable<uint32_t> startTime;
-    DataModel::Nullable<uint16_t> duration;
+    DataModel::Nullable<uint64_t> duration;
     chip::CharSpan messageText;
     Optional<DataModel::DecodableList<Structs::MessageResponseOptionStruct::DecodableType>> responses;
 
@@ -21573,7 +21573,7 @@ struct Type
     MessagePriorityEnum priority                       = static_cast<MessagePriorityEnum>(0);
     chip::BitMask<MessageControlBitmap> messageControl = static_cast<chip::BitMask<MessageControlBitmap>>(0);
     DataModel::Nullable<uint32_t> startTime;
-    DataModel::Nullable<uint16_t> duration;
+    DataModel::Nullable<uint64_t> duration;
     chip::CharSpan messageText;
     Optional<DataModel::List<const Structs::MessageResponseOptionStruct::Type>> responses;
 
@@ -21594,7 +21594,7 @@ struct DecodableType
     MessagePriorityEnum priority                       = static_cast<MessagePriorityEnum>(0);
     chip::BitMask<MessageControlBitmap> messageControl = static_cast<chip::BitMask<MessageControlBitmap>>(0);
     DataModel::Nullable<uint32_t> startTime;
-    DataModel::Nullable<uint16_t> duration;
+    DataModel::Nullable<uint64_t> duration;
     chip::CharSpan messageText;
     Optional<DataModel::DecodableList<Structs::MessageResponseOptionStruct::DecodableType>> responses;
     CHIP_ERROR Decode(TLV::TLVReader & reader);
diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
index 3a7a4e981629b6..6191eb2aa3ec2d 100644
--- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h
@@ -6837,7 +6837,7 @@ class MessagesPresentMessagesRequest : public ClusterCommand
         AddArgument("Priority", 0, UINT8_MAX, &mRequest.priority);
         AddArgument("MessageControl", 0, UINT8_MAX, &mRequest.messageControl);
         AddArgument("StartTime", 0, UINT32_MAX, &mRequest.startTime);
-        AddArgument("Duration", 0, UINT16_MAX, &mRequest.duration);
+        AddArgument("Duration", 0, UINT64_MAX, &mRequest.duration);
         AddArgument("MessageText", &mRequest.messageText);
         AddArgument("Responses", &mComplex_Responses, "", Argument::kOptional);
         ClusterCommand::AddArguments();
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
index 9a1389e416deb4..60843e78e103e7 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -81043,7 +81043,7 @@ class MessagesPresentMessagesRequest : public ClusterCommand {
         AddArgument("StartTime", 0, UINT32_MAX, &mRequest.startTime);
 #endif // MTR_ENABLE_PROVISIONAL
 #if MTR_ENABLE_PROVISIONAL
-        AddArgument("Duration", 0, UINT16_MAX, &mRequest.duration);
+        AddArgument("Duration", 0, UINT64_MAX, &mRequest.duration);
 #endif // MTR_ENABLE_PROVISIONAL
 #if MTR_ENABLE_PROVISIONAL
         AddArgument("MessageText", &mRequest.messageText);
@@ -81085,7 +81085,7 @@ class MessagesPresentMessagesRequest : public ClusterCommand {
         if (mRequest.duration.IsNull()) {
             params.duration = nil;
         } else {
-            params.duration = [NSNumber numberWithUnsignedShort:mRequest.duration.Value()];
+            params.duration = [NSNumber numberWithUnsignedLongLong:mRequest.duration.Value()];
         }
 #endif // MTR_ENABLE_PROVISIONAL
 #if MTR_ENABLE_PROVISIONAL

From 2171bf12e583dd441b2fcc2975817697853f1d27 Mon Sep 17 00:00:00 2001
From: Hasty Granbery <hasty@granbery.org>
Date: Thu, 22 Feb 2024 08:47:32 +0900
Subject: [PATCH 2/3] Fixes to Java build

---
 examples/tv-app/android/java/MessagesManager.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/examples/tv-app/android/java/MessagesManager.cpp b/examples/tv-app/android/java/MessagesManager.cpp
index 4b853abb4e43e4..dbcb5c5994504b 100644
--- a/examples/tv-app/android/java/MessagesManager.cpp
+++ b/examples/tv-app/android/java/MessagesManager.cpp
@@ -183,10 +183,10 @@ CHIP_ERROR MessagesManager::HandleGetMessages(AttributeValueEncoder & aEncoder)
             }
 
             jfieldID durationField = env->GetFieldID(messageClass, "duration", "I");
-            jint jduration         = env->GetIntField(messageObject, durationField);
+            jlong jduration        = env->GetLongField(messageObject, durationField);
             if (jduration >= 0)
             {
-                message.duration = DataModel::Nullable<uint16_t>(static_cast<uint64_t>(jduration));
+                message.duration = DataModel::Nullable<uint64_t>(static_cast<uint64_t>(jduration));
             }
 
             jfieldID getResponseOptionsField =
@@ -336,11 +336,11 @@ CHIP_ERROR MessagesManager::HandlePresentMessagesRequest(
             return CHIP_ERROR_INTERNAL;
         }
 
-        jint jcontrol  = static_cast<jint>(messageControl.Raw());
-        jint jduration = -1;
+        jint jcontrol   = static_cast<jint>(messageControl.Raw());
+        jlong jduration = -1;
         if (!duration.IsNull())
         {
-            jduration = static_cast<jint>(duration.Value());
+            jduration = static_cast<jlong>(duration.Value());
         }
         jlong jstartTime = -1;
         if (!startTime.IsNull())

From d21b2430581e7f089e7441bc5ad3bf9ade233d90 Mon Sep 17 00:00:00 2001
From: Hasty Granbery <hasty@granbery.org>
Date: Thu, 22 Feb 2024 11:48:12 +0900
Subject: [PATCH 3/3] Missed a HandlePresentMessagesRequest signature

---
 examples/tv-app/tv-common/clusters/messages/MessagesManager.cpp | 2 +-
 examples/tv-app/tv-common/clusters/messages/MessagesManager.h   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/examples/tv-app/tv-common/clusters/messages/MessagesManager.cpp b/examples/tv-app/tv-common/clusters/messages/MessagesManager.cpp
index 6ffbb9a3476258..461e35524c0736 100644
--- a/examples/tv-app/tv-common/clusters/messages/MessagesManager.cpp
+++ b/examples/tv-app/tv-common/clusters/messages/MessagesManager.cpp
@@ -30,7 +30,7 @@ using MessageResponseOption = chip::app::Clusters::Messages::Structs::MessageRes
 // Commands
 CHIP_ERROR MessagesManager::HandlePresentMessagesRequest(
     const ByteSpan & messageId, const MessagePriorityEnum & priority, const BitMask<MessageControlBitmap> & messageControl,
-    const DataModel::Nullable<uint32_t> & startTime, const DataModel::Nullable<uint16_t> & duration, const CharSpan & messageText,
+    const DataModel::Nullable<uint32_t> & startTime, const DataModel::Nullable<uint64_t> & duration, const CharSpan & messageText,
     const Optional<DataModel::DecodableList<MessageResponseOption>> & responses)
 {
     ChipLogProgress(Zcl, "HandlePresentMessagesRequest message:%s", std::string(messageText.data(), messageText.size()).c_str());
diff --git a/examples/tv-app/tv-common/clusters/messages/MessagesManager.h b/examples/tv-app/tv-common/clusters/messages/MessagesManager.h
index 32c39b65ddd75d..777f202e28548a 100644
--- a/examples/tv-app/tv-common/clusters/messages/MessagesManager.h
+++ b/examples/tv-app/tv-common/clusters/messages/MessagesManager.h
@@ -126,7 +126,7 @@ class MessagesManager : public chip::app::Clusters::Messages::Delegate
     CHIP_ERROR HandlePresentMessagesRequest(
         const chip::ByteSpan & messageId, const chip::app::Clusters::Messages::MessagePriorityEnum & priority,
         const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> & messageControl,
-        const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint16_t> & duration,
+        const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint64_t> & duration,
         const chip::CharSpan & messageText,
         const chip::Optional<
             chip::app::DataModel::DecodableList<chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type>> &