From a99e8cc21a6c409e019ae2cb907b29b94bb3c2ad Mon Sep 17 00:00:00 2001 From: James Rich Date: Sat, 30 May 2026 12:33:06 -0500 Subject: [PATCH] Replace :core:proto with org.meshtastic:protobufs:2.7.25-SNAPSHOT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the local Wire codegen module in favor of the published KMP protobufs SDK from meshtastic/protobufs. This removes: - The git submodule (core/proto/src/main/proto) - The Wire plugin dependency - All local .proto → Kotlin code generation The TAKPacket-SDK api() export moves to :core:model which already served as the primary transitive provider of proto types. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitmodules | 4 - androidApp/build.gradle.kts | 2 +- .../src/main/kotlin/RootConventionPlugin.kt | 8 +- core/data/build.gradle.kts | 2 +- core/database/build.gradle.kts | 2 +- core/datastore/build.gradle.kts | 2 +- core/domain/build.gradle.kts | 2 +- core/model/build.gradle.kts | 6 +- core/network/build.gradle.kts | 2 +- core/proto/README.md | 44 - core/proto/build.gradle.kts | 145 --- core/proto/src/main/proto | 1 - .../google/protobuf/descriptor.proto | 921 ------------------ core/repository/build.gradle.kts | 2 +- core/service/build.gradle.kts | 2 +- core/takserver/build.gradle.kts | 6 +- core/ui/build.gradle.kts | 2 +- desktopApp/build.gradle.kts | 2 +- feature/connections/build.gradle.kts | 2 +- feature/firmware/build.gradle.kts | 2 +- feature/map/build.gradle.kts | 2 +- feature/messaging/build.gradle.kts | 2 +- feature/node/build.gradle.kts | 2 +- feature/settings/build.gradle.kts | 2 +- gradle/libs.versions.toml | 7 +- settings.gradle.kts | 1 - 26 files changed, 31 insertions(+), 1144 deletions(-) delete mode 100644 .gitmodules delete mode 100644 core/proto/README.md delete mode 100644 core/proto/build.gradle.kts delete mode 160000 core/proto/src/main/proto delete mode 100644 core/proto/src/main/wire-includes/google/protobuf/descriptor.proto diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c7adfe346f..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "app proto submodule"] - path = core/proto/src/main/proto - url = https://github.com/meshtastic/protobufs.git - branch = master diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 480989d8a1..a7ddb75196 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -209,7 +209,7 @@ dependencies { implementation(projects.core.network) implementation(projects.core.nfc) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.service) implementation(projects.core.resources) implementation(projects.core.ui) diff --git a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt index 45cc867bab..73f91da84e 100644 --- a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt @@ -95,7 +95,6 @@ private val ALL_MODULES_FULL = ":core:network", ":core:nfc", ":core:prefs", - ":core:proto", ":core:repository", ":core:service", ":core:resources", @@ -118,11 +117,10 @@ private val ALL_MODULES_FULL = private val ANDROID_ONLY_MODULES = setOf(":androidApp", ":core:api", ":core:barcode", ":feature:widget") /** - * Modules excluded from Dokka aggregation. :core:proto contains only auto-generated Wire classes (no KDoc value) and - * its TAKPacket-SDK dependency doesn't publish iOS metadata JARs, causing `transformCommonMainDependenciesMetadata` to - * fail during Dokka resolution. + * Modules excluded from Dokka aggregation. Empty now that :core:proto has been replaced by + * the external org.meshtastic:protobufs SDK. */ -private val DOKKA_EXCLUDED_MODULES = setOf(":core:proto") +private val DOKKA_EXCLUDED_MODULES = emptySet() private fun allModules(): List = ALL_MODULES_FULL diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index 6f35b5d5ff..853a8afad6 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -35,7 +35,7 @@ kotlin { implementation(projects.core.model) implementation(projects.core.network) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.takserver) implementation(libs.jetbrains.lifecycle.runtime) diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index 69ed36b5d6..625dee59ba 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -38,7 +38,7 @@ kotlin { api(projects.core.common) implementation(projects.core.di) api(projects.core.model) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.resources) implementation(libs.androidx.room.paging) implementation(libs.kotlinx.serialization.json) diff --git a/core/datastore/build.gradle.kts b/core/datastore/build.gradle.kts index 2f401fb847..72dedbe0c7 100644 --- a/core/datastore/build.gradle.kts +++ b/core/datastore/build.gradle.kts @@ -28,7 +28,7 @@ kotlin { commonMain.dependencies { implementation(projects.core.common) implementation(projects.core.model) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) api(libs.androidx.datastore) api(libs.androidx.datastore.preferences) implementation(libs.kotlinx.serialization.json) diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts index 2515332873..610898407b 100644 --- a/core/domain/build.gradle.kts +++ b/core/domain/build.gradle.kts @@ -27,7 +27,7 @@ kotlin { commonMain.dependencies { implementation(projects.core.repository) implementation(projects.core.model) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.common) implementation(projects.core.database) implementation(projects.core.datastore) diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index cb3d908d2a..309ac40fca 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -31,7 +31,11 @@ kotlin { sourceSets { commonMain.dependencies { - api(projects.core.proto) + api(libs.meshtastic.protobufs) + api(libs.takpacket.sdk.kmp.get().toString()) { + exclude(group = "com.github.luben", module = "zstd-jni") + exclude(group = "org.ogce", module = "xpp3") + } api(projects.core.common) api(projects.core.resources) diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 4d0380ac65..d35a7994b9 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -31,7 +31,7 @@ kotlin { implementation(projects.core.common) implementation(projects.core.di) implementation(projects.core.model) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.ble) implementation(libs.okio) diff --git a/core/proto/README.md b/core/proto/README.md deleted file mode 100644 index 35d276b205..0000000000 --- a/core/proto/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# `:core:proto` - -## Overview - -**Targets:** Android · JVM (Desktop) · iOS - -This module contains the generated Kotlin and Java code from the Meshtastic Protobuf definitions. It uses the [Wire](https://github.com/square/wire) library for efficient and clean model generation. - -## Key Components - -- **`PortNum`**: Defines the identification for different types of data payloads. -- **`MeshPacket`**: The core protocol message definition. -- **Protobuf Modules**: Definitions for telemetry, position, administration, and more. - -## Usage -This module is a low-level dependency for any module that needs to encode or decode Meshtastic protocol data. - -```kotlin -implementation(projects.core.proto) -``` - - -## Dependency Graph - - -```mermaid -graph TB - :core:proto[proto]:::kmp-library - -classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000; -classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000; -classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000; -classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000; -classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000; -classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000; -classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000; -classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000; -classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000; -classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000; -classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000; -classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000; - -``` - diff --git a/core/proto/build.gradle.kts b/core/proto/build.gradle.kts deleted file mode 100644 index 29a67f87d3..0000000000 --- a/core/proto/build.gradle.kts +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -plugins { - alias(libs.plugins.meshtastic.kmp.library) - alias(libs.plugins.wire) - id("meshtastic.publishing") -} - -kotlin { - // Override minSdk for ATAK compatibility (standard is 26) - androidLibrary { minSdk = 21 } - - sourceSets { - commonMain.dependencies { - api(libs.wire.runtime) - - // TAKPacket-SDK owns atak.proto Wire codegen (see - // https://github.com/meshtastic/TAKPacket-SDK/issues/6). - // The prune directives below stop this module from emitting - // those classes; the SDK ships them and we re-export via api() - // so every consumer of :core:proto gets TAKPacketV2, GeoChat, - // etc. transitively. No dual codegen, no R8 duplicates, no - // cross-repo ABI drift. - // - // Team and MemberRole are NOT pruned — they are used as fields - // in ModuleConfig.TAKConfig and the SDK deliberately strips - // them from its JVM JAR so our codegen is the single source. - // - // Excludes: - // zstd-jni — Android needs the @aar variant; :core:takserver - // re-adds it per-target. - // xpp3 — Android provides XmlPullParser as a platform - // class; :core:takserver re-adds for desktop. - api(libs.takpacket.sdk.kmp.get().toString()) { - exclude(group = "com.github.luben", module = "zstd-jni") - exclude(group = "org.ogce", module = "xpp3") - } - } - } -} - -wire { - sourcePath { - srcDir("src/main/proto") - srcDir("src/main/wire-includes") - // Upstream added packages/kmp/ with symlinks back to root protos. - // Without filtering, Wire follows the symlinks and loads duplicates. - include("meshtastic/**/*.proto") - include("nanopb.proto") - include("google/**/*.proto") - } - kotlin { - // Wire 6 optimization: Avoid unnecessary immutable copies of repeated/map fields. - // Improves performance by reducing allocations when decoding/creating messages. - makeImmutableCopies = false - - // Flattens 'oneof' fields into nullable properties on the parent class. - // This removes the intermediate sealed classes, simplifying usage and reducing method count/binary size. - // Codebase is already written to use the nullable properties (e.g. packet.decoded vs - // packet.payload_variant.decoded). - boxOneOfsMinSize = 5000 - } - root("meshtastic.*") - prune("meshtastic.MeshPacket#delayed") - prune("meshtastic.MeshPacket.Delayed") - - // ── atak.proto types ──────────────────────────────────────────────────── - // Owned by TAKPacket-SDK (v0.2.3+), which ships the Wire-generated - // classes in its KMP artifacts. The api() dep above re-exports them. - // Wire prune() does not cascade to nested types — each must be explicit. - // - // Team and MemberRole are NOT pruned — they are used as fields in - // ModuleConfig.TAKConfig and the SDK strips them from its JVM JAR so - // our codegen remains the single source for those two enums. - prune("meshtastic.TAKPacket") - prune("meshtastic.TAKPacketV2") - prune("meshtastic.GeoChat") - prune("meshtastic.GeoChat.ReceiptType") - prune("meshtastic.Group") - prune("meshtastic.Status") - prune("meshtastic.Contact") - prune("meshtastic.PLI") - prune("meshtastic.AircraftTrack") - prune("meshtastic.CotGeoPoint") - prune("meshtastic.DrawnShape") - prune("meshtastic.DrawnShape.Kind") - prune("meshtastic.DrawnShape.StyleMode") - prune("meshtastic.Marker") - prune("meshtastic.Marker.Kind") - prune("meshtastic.RangeAndBearing") - prune("meshtastic.Route") - prune("meshtastic.Route.Method") - prune("meshtastic.Route.Direction") - prune("meshtastic.Route.Link") - prune("meshtastic.CasevacReport") - prune("meshtastic.CasevacReport.Precedence") - prune("meshtastic.CasevacReport.HlzMarking") - prune("meshtastic.CasevacReport.Security") - prune("meshtastic.ZMistEntry") - prune("meshtastic.EmergencyAlert") - prune("meshtastic.EmergencyAlert.Type") - prune("meshtastic.TaskRequest") - prune("meshtastic.TaskRequest.Priority") - prune("meshtastic.TaskRequest.Status") - prune("meshtastic.TAKEnvironment") - prune("meshtastic.SensorFov") - prune("meshtastic.SensorFov.SensorType") - prune("meshtastic.CotHow") - prune("meshtastic.CotType") - prune("meshtastic.GeoPointSource") - prune("meshtastic.TakTalkMessage") - prune("meshtastic.TakTalkRoomData") - // Marti is also shipped by the TAKPacket-SDK jar (org.meshtastic.proto.Marti), - // so it must be pruned here too or R8 fails with a duplicate-class error at - // release minify. (Team/MemberRole are NOT shipped by the SDK, so they stay.) - prune("meshtastic.Marti") -} - -// Modern KMP publication uses the project name as the artifactId by default. -// We rename the publications to include the 'core-' prefix for consistency. -publishing { - publications.withType().configureEach { - val baseId = artifactId - if (baseId == "proto") { - artifactId = "meshtastic-android-proto" - } else if (baseId.startsWith("proto-")) { - artifactId = baseId.replace("proto-", "meshtastic-android-proto-") - } - } -} diff --git a/core/proto/src/main/proto b/core/proto/src/main/proto deleted file mode 160000 index a0a2239c6f..0000000000 --- a/core/proto/src/main/proto +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a0a2239c6fc08bc70499dd04a5c72b78d6e9b265 diff --git a/core/proto/src/main/wire-includes/google/protobuf/descriptor.proto b/core/proto/src/main/wire-includes/google/protobuf/descriptor.proto deleted file mode 100644 index f8eb216cdc..0000000000 --- a/core/proto/src/main/wire-includes/google/protobuf/descriptor.proto +++ /dev/null @@ -1,921 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Author: kenton@google.com (Kenton Varda) -// Based on original Protocol Buffers design by -// Sanjay Ghemawat, Jeff Dean, and others. -// -// The messages in this file describe the definitions found in .proto files. -// A valid .proto file can be translated directly to a FileDescriptorProto -// without any other information (e.g. without reading its imports). - - -syntax = "proto2"; - -package google.protobuf; - -option go_package = "google.golang.org/protobuf/types/descriptorpb"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "DescriptorProtos"; -option csharp_namespace = "Google.Protobuf.Reflection"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; - -// descriptor.proto must be optimized for speed because reflection-based -// algorithms don't work during bootstrapping. -option optimize_for = SPEED; - -// The protocol compiler can output a FileDescriptorSet containing the .proto -// files it parses. -message FileDescriptorSet { - repeated FileDescriptorProto file = 1; -} - -// Describes a complete .proto file. -message FileDescriptorProto { - optional string name = 1; // file name, relative to root of source tree - optional string package = 2; // e.g. "foo", "foo.bar", etc. - - // Names of files imported by this file. - repeated string dependency = 3; - // Indexes of the public imported files in the dependency list above. - repeated int32 public_dependency = 10; - // Indexes of the weak imported files in the dependency list. - // For Google-internal migration only. Do not use. - repeated int32 weak_dependency = 11; - - // All top-level definitions in this file. - repeated DescriptorProto message_type = 4; - repeated EnumDescriptorProto enum_type = 5; - repeated ServiceDescriptorProto service = 6; - repeated FieldDescriptorProto extension = 7; - - optional FileOptions options = 8; - - // This field contains optional information about the original source code. - // You may safely remove this entire field without harming runtime - // functionality of the descriptors -- the information is needed only by - // development tools. - optional SourceCodeInfo source_code_info = 9; - - // The syntax of the proto file. - // The supported values are "proto2" and "proto3". - optional string syntax = 12; -} - -// Describes a message type. -message DescriptorProto { - optional string name = 1; - - repeated FieldDescriptorProto field = 2; - repeated FieldDescriptorProto extension = 6; - - repeated DescriptorProto nested_type = 3; - repeated EnumDescriptorProto enum_type = 4; - - message ExtensionRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Exclusive. - - optional ExtensionRangeOptions options = 3; - } - repeated ExtensionRange extension_range = 5; - - repeated OneofDescriptorProto oneof_decl = 8; - - optional MessageOptions options = 7; - - // Range of reserved tag numbers. Reserved tag numbers may not be used by - // fields or extension ranges in the same message. Reserved ranges may - // not overlap. - message ReservedRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Exclusive. - } - repeated ReservedRange reserved_range = 9; - // Reserved field names, which may not be used by fields in the same message. - // A given name may only be reserved once. - repeated string reserved_name = 10; -} - -message ExtensionRangeOptions { - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -// Describes a field within a message. -message FieldDescriptorProto { - enum Type { - // 0 is reserved for errors. - // Order is weird for historical reasons. - TYPE_DOUBLE = 1; - TYPE_FLOAT = 2; - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if - // negative values are likely. - TYPE_INT64 = 3; - TYPE_UINT64 = 4; - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if - // negative values are likely. - TYPE_INT32 = 5; - TYPE_FIXED64 = 6; - TYPE_FIXED32 = 7; - TYPE_BOOL = 8; - TYPE_STRING = 9; - // Tag-delimited aggregate. - // Group type is deprecated and not supported in proto3. However, Proto3 - // implementations should still be able to parse the group wire format and - // treat group fields as unknown fields. - TYPE_GROUP = 10; - TYPE_MESSAGE = 11; // Length-delimited aggregate. - - // New in version 2. - TYPE_BYTES = 12; - TYPE_UINT32 = 13; - TYPE_ENUM = 14; - TYPE_SFIXED32 = 15; - TYPE_SFIXED64 = 16; - TYPE_SINT32 = 17; // Uses ZigZag encoding. - TYPE_SINT64 = 18; // Uses ZigZag encoding. - } - - enum Label { - // 0 is reserved for errors - LABEL_OPTIONAL = 1; - LABEL_REQUIRED = 2; - LABEL_REPEATED = 3; - } - - optional string name = 1; - optional int32 number = 3; - optional Label label = 4; - - // If type_name is set, this need not be set. If both this and type_name - // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. - optional Type type = 5; - - // For message and enum types, this is the name of the type. If the name - // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping - // rules are used to find the type (i.e. first the nested types within this - // message are searched, then within the parent, on up to the root - // namespace). - optional string type_name = 6; - - // For extensions, this is the name of the type being extended. It is - // resolved in the same manner as type_name. - optional string extendee = 2; - - // For numeric types, contains the original text representation of the value. - // For booleans, "true" or "false". - // For strings, contains the default text contents (not escaped in any way). - // For bytes, contains the C escaped value. All bytes >= 128 are escaped. - optional string default_value = 7; - - // If set, gives the index of a oneof in the containing type's oneof_decl - // list. This field is a member of that oneof. - optional int32 oneof_index = 9; - - // JSON name of this field. The value is set by protocol compiler. If the - // user has set a "json_name" option on this field, that option's value - // will be used. Otherwise, it's deduced from the field's name by converting - // it to camelCase. - optional string json_name = 10; - - optional FieldOptions options = 8; - - // If true, this is a proto3 "optional". When a proto3 field is optional, it - // tracks presence regardless of field type. - // - // When proto3_optional is true, this field must be belong to a oneof to - // signal to old proto3 clients that presence is tracked for this field. This - // oneof is known as a "synthetic" oneof, and this field must be its sole - // member (each proto3 optional field gets its own synthetic oneof). Synthetic - // oneofs exist in the descriptor only, and do not generate any API. Synthetic - // oneofs must be ordered after all "real" oneofs. - // - // For message fields, proto3_optional doesn't create any semantic change, - // since non-repeated message fields always track presence. However it still - // indicates the semantic detail of whether the user wrote "optional" or not. - // This can be useful for round-tripping the .proto file. For consistency we - // give message fields a synthetic oneof also, even though it is not required - // to track presence. This is especially important because the parser can't - // tell if a field is a message or an enum, so it must always create a - // synthetic oneof. - // - // Proto2 optional fields do not set this flag, because they already indicate - // optional with `LABEL_OPTIONAL`. - optional bool proto3_optional = 17; -} - -// Describes a oneof. -message OneofDescriptorProto { - optional string name = 1; - optional OneofOptions options = 2; -} - -// Describes an enum type. -message EnumDescriptorProto { - optional string name = 1; - - repeated EnumValueDescriptorProto value = 2; - - optional EnumOptions options = 3; - - // Range of reserved numeric values. Reserved values may not be used by - // entries in the same enum. Reserved ranges may not overlap. - // - // Note that this is distinct from DescriptorProto.ReservedRange in that it - // is inclusive such that it can appropriately represent the entire int32 - // domain. - message EnumReservedRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Inclusive. - } - - // Range of reserved numeric values. Reserved numeric values may not be used - // by enum values in the same enum declaration. Reserved ranges may not - // overlap. - repeated EnumReservedRange reserved_range = 4; - - // Reserved enum value names, which may not be reused. A given name may only - // be reserved once. - repeated string reserved_name = 5; -} - -// Describes a value within an enum. -message EnumValueDescriptorProto { - optional string name = 1; - optional int32 number = 2; - - optional EnumValueOptions options = 3; -} - -// Describes a service. -message ServiceDescriptorProto { - optional string name = 1; - repeated MethodDescriptorProto method = 2; - - optional ServiceOptions options = 3; -} - -// Describes a method of a service. -message MethodDescriptorProto { - optional string name = 1; - - // Input and output type names. These are resolved in the same way as - // FieldDescriptorProto.type_name, but must refer to a message type. - optional string input_type = 2; - optional string output_type = 3; - - optional MethodOptions options = 4; - - // Identifies if client streams multiple client messages - optional bool client_streaming = 5 [default = false]; - // Identifies if server streams multiple server messages - optional bool server_streaming = 6 [default = false]; -} - - -// =================================================================== -// Options - -// Each of the definitions above may have "options" attached. These are -// just annotations which may cause code to be generated slightly differently -// or may contain hints for code that manipulates protocol messages. -// -// Clients may define custom options as extensions of the *Options messages. -// These extensions may not yet be known at parsing time, so the parser cannot -// store the values in them. Instead it stores them in a field in the *Options -// message called uninterpreted_option. This field must have the same name -// across all *Options messages. We then use this field to populate the -// extensions when we build a descriptor, at which point all protos have been -// parsed and so all extensions are known. -// -// Extension numbers for custom options may be chosen as follows: -// * For options which will only be used within a single application or -// organization, or for experimental options, use field numbers 50000 -// through 99999. It is up to you to ensure that you do not use the -// same number for multiple options. -// * For options which will be published and used publicly by multiple -// independent entities, e-mail protobuf-global-extension-registry@google.com -// to reserve extension numbers. Simply provide your project name (e.g. -// Objective-C plugin) and your project website (if available) -- there's no -// need to explain how you intend to use them. Usually you only need one -// extension number. You can declare multiple options with only one extension -// number by putting them in a sub-message. See the Custom Options section of -// the docs for examples: -// https://developers.google.com/protocol-buffers/docs/proto#options -// If this turns out to be popular, a web service will be set up -// to automatically assign option numbers. - -message FileOptions { - - // Sets the Java package where classes generated from this .proto will be - // placed. By default, the proto package is used, but this is often - // inappropriate because proto packages do not normally start with backwards - // domain names. - optional string java_package = 1; - - - // Controls the name of the wrapper Java class generated for the .proto file. - // That class will always contain the .proto file's getDescriptor() method as - // well as any top-level extensions defined in the .proto file. - // If java_multiple_files is disabled, then all the other classes from the - // .proto file will be nested inside the single wrapper outer class. - optional string java_outer_classname = 8; - - // If enabled, then the Java code generator will generate a separate .java - // file for each top-level message, enum, and service defined in the .proto - // file. Thus, these types will *not* be nested inside the wrapper class - // named by java_outer_classname. However, the wrapper class will still be - // generated to contain the file's getDescriptor() method as well as any - // top-level extensions defined in the file. - optional bool java_multiple_files = 10 [default = false]; - - // This option does nothing. - optional bool java_generate_equals_and_hash = 20 [deprecated=true]; - - // If set true, then the Java2 code generator will generate code that - // throws an exception whenever an attempt is made to assign a non-UTF-8 - // byte sequence to a string field. - // Message reflection will do the same. - // However, an extension field still accepts non-UTF-8 byte sequences. - // This option has no effect on when used with the lite runtime. - optional bool java_string_check_utf8 = 27 [default = false]; - - - // Generated classes can be optimized for speed or code size. - enum OptimizeMode { - SPEED = 1; // Generate complete code for parsing, serialization, - // etc. - CODE_SIZE = 2; // Use ReflectionOps to implement these methods. - LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. - } - optional OptimizeMode optimize_for = 9 [default = SPEED]; - - // Sets the Go package where structs generated from this .proto will be - // placed. If omitted, the Go package will be derived from the following: - // - The basename of the package import path, if provided. - // - Otherwise, the package statement in the .proto file, if present. - // - Otherwise, the basename of the .proto file, without extension. - optional string go_package = 11; - - - - - // Should generic services be generated in each language? "Generic" services - // are not specific to any particular RPC system. They are generated by the - // main code generators in each language (without additional plugins). - // Generic services were the only kind of service generation supported by - // early versions of google.protobuf. - // - // Generic services are now considered deprecated in favor of using plugins - // that generate code specific to your particular RPC system. Therefore, - // these default to false. Old code which depends on generic services should - // explicitly set them to true. - optional bool cc_generic_services = 16 [default = false]; - optional bool java_generic_services = 17 [default = false]; - optional bool py_generic_services = 18 [default = false]; - optional bool php_generic_services = 42 [default = false]; - - // Is this file deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for everything in the file, or it will be completely ignored; in the very - // least, this is a formalization for deprecating files. - optional bool deprecated = 23 [default = false]; - - // Enables the use of arenas for the proto messages in this file. This applies - // only to generated classes for C++. - optional bool cc_enable_arenas = 31 [default = true]; - - - // Sets the objective c class prefix which is prepended to all objective c - // generated classes from this .proto. There is no default. - optional string objc_class_prefix = 36; - - // Namespace for generated classes; defaults to the package. - optional string csharp_namespace = 37; - - // By default Swift generators will take the proto package and CamelCase it - // replacing '.' with underscore and use that to prefix the types/symbols - // defined. When this options is provided, they will use this value instead - // to prefix the types/symbols defined. - optional string swift_prefix = 39; - - // Sets the php class prefix which is prepended to all php generated classes - // from this .proto. Default is empty. - optional string php_class_prefix = 40; - - // Use this option to change the namespace of php generated classes. Default - // is empty. When this option is empty, the package name will be used for - // determining the namespace. - optional string php_namespace = 41; - - // Use this option to change the namespace of php generated metadata classes. - // Default is empty. When this option is empty, the proto file name will be - // used for determining the namespace. - optional string php_metadata_namespace = 44; - - // Use this option to change the package of ruby generated classes. Default - // is empty. When this option is not set, the package name will be used for - // determining the ruby package. - optional string ruby_package = 45; - - - // The parser stores options it doesn't recognize here. - // See the documentation for the "Options" section above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. - // See the documentation for the "Options" section above. - extensions 1000 to max; - - reserved 38; -} - -message MessageOptions { - // Set true to use the old proto1 MessageSet wire format for extensions. - // This is provided for backwards-compatibility with the MessageSet wire - // format. You should not use this for any other reason: It's less - // efficient, has fewer features, and is more complicated. - // - // The message must be defined exactly as follows: - // message Foo { - // option message_set_wire_format = true; - // extensions 4 to max; - // } - // Note that the message cannot have any defined fields; MessageSets only - // have extensions. - // - // All extensions of your type must be singular messages; e.g. they cannot - // be int32s, enums, or repeated messages. - // - // Because this is an option, the above two restrictions are not enforced by - // the protocol compiler. - optional bool message_set_wire_format = 1 [default = false]; - - // Disables the generation of the standard "descriptor()" accessor, which can - // conflict with a field of the same name. This is meant to make migration - // from proto1 easier; new code should avoid fields named "descriptor". - optional bool no_standard_descriptor_accessor = 2 [default = false]; - - // Is this message deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the message, or it will be completely ignored; in the very least, - // this is a formalization for deprecating messages. - optional bool deprecated = 3 [default = false]; - - reserved 4, 5, 6; - - // Whether the message is an automatically generated map entry type for the - // maps field. - // - // For maps fields: - // map map_field = 1; - // The parsed descriptor looks like: - // message MapFieldEntry { - // option map_entry = true; - // optional KeyType key = 1; - // optional ValueType value = 2; - // } - // repeated MapFieldEntry map_field = 1; - // - // Implementations may choose not to generate the map_entry=true message, but - // use a native map in the target language to hold the keys and values. - // The reflection APIs in such implementations still need to work as - // if the field is a repeated message field. - // - // NOTE: Do not set the option in .proto files. Always use the maps syntax - // instead. The option should only be implicitly set by the proto compiler - // parser. - optional bool map_entry = 7; - - reserved 8; // javalite_serializable - reserved 9; // javanano_as_lite - - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message FieldOptions { - // The ctype option instructs the C++ code generator to use a different - // representation of the field than it normally would. See the specific - // options below. This option is not yet implemented in the open source - // release -- sorry, we'll try to include it in a future version! - optional CType ctype = 1 [default = STRING]; - enum CType { - // Default mode. - STRING = 0; - - CORD = 1; - - STRING_PIECE = 2; - } - // The packed option can be enabled for repeated primitive fields to enable - // a more efficient representation on the wire. Rather than repeatedly - // writing the tag and type for each element, the entire array is encoded as - // a single length-delimited blob. In proto3, only explicit setting it to - // false will avoid using packed encoding. - optional bool packed = 2; - - // The jstype option determines the JavaScript type used for values of the - // field. The option is permitted only for 64 bit integral and fixed types - // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING - // is represented as JavaScript string, which avoids loss of precision that - // can happen when a large value is converted to a floating point JavaScript. - // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to - // use the JavaScript "number" type. The behavior of the default option - // JS_NORMAL is implementation dependent. - // - // This option is an enum to permit additional types to be added, e.g. - // goog.math.Integer. - optional JSType jstype = 6 [default = JS_NORMAL]; - enum JSType { - // Use the default type. - JS_NORMAL = 0; - - // Use JavaScript strings. - JS_STRING = 1; - - // Use JavaScript numbers. - JS_NUMBER = 2; - } - - // Should this field be parsed lazily? Lazy applies only to message-type - // fields. It means that when the outer message is initially parsed, the - // inner message's contents will not be parsed but instead stored in encoded - // form. The inner message will actually be parsed when it is first accessed. - // - // This is only a hint. Implementations are free to choose whether to use - // eager or lazy parsing regardless of the value of this option. However, - // setting this option true suggests that the protocol author believes that - // using lazy parsing on this field is worth the additional bookkeeping - // overhead typically needed to implement it. - // - // This option does not affect the public interface of any generated code; - // all method signatures remain the same. Furthermore, thread-safety of the - // interface is not affected by this option; const methods remain safe to - // call from multiple threads concurrently, while non-const methods continue - // to require exclusive access. - // - // - // Note that implementations may choose not to check required fields within - // a lazy sub-message. That is, calling IsInitialized() on the outer message - // may return true even if the inner message has missing required fields. - // This is necessary because otherwise the inner message would have to be - // parsed in order to perform the check, defeating the purpose of lazy - // parsing. An implementation which chooses not to check required fields - // must be consistent about it. That is, for any particular sub-message, the - // implementation must either *always* check its required fields, or *never* - // check its required fields, regardless of whether or not the message has - // been parsed. - // - // As of 2021, lazy does no correctness checks on the byte stream during - // parsing. This may lead to crashes if and when an invalid byte stream is - // finally parsed upon access. - // - // TODO(b/211906113): Enable validation on lazy fields. - optional bool lazy = 5 [default = false]; - - // unverified_lazy does no correctness checks on the byte stream. This should - // only be used where lazy with verification is prohibitive for performance - // reasons. - optional bool unverified_lazy = 15 [default = false]; - - // Is this field deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for accessors, or it will be completely ignored; in the very least, this - // is a formalization for deprecating fields. - optional bool deprecated = 3 [default = false]; - - // For Google-internal migration only. Do not use. - optional bool weak = 10 [default = false]; - - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; - - reserved 4; // removed jtype -} - -message OneofOptions { - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message EnumOptions { - - // Set this option to true to allow mapping different tag names to the same - // value. - optional bool allow_alias = 2; - - // Is this enum deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum, or it will be completely ignored; in the very least, this - // is a formalization for deprecating enums. - optional bool deprecated = 3 [default = false]; - - reserved 5; // javanano_as_lite - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message EnumValueOptions { - // Is this enum value deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum value, or it will be completely ignored; in the very least, - // this is a formalization for deprecating enum values. - optional bool deprecated = 1 [default = false]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message ServiceOptions { - - // Note: Field numbers 1 through 32 are reserved for Google's internal RPC - // framework. We apologize for hoarding these numbers to ourselves, but - // we were already using them long before we decided to release Protocol - // Buffers. - - // Is this service deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the service, or it will be completely ignored; in the very least, - // this is a formalization for deprecating services. - optional bool deprecated = 33 [default = false]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message MethodOptions { - - // Note: Field numbers 1 through 32 are reserved for Google's internal RPC - // framework. We apologize for hoarding these numbers to ourselves, but - // we were already using them long before we decided to release Protocol - // Buffers. - - // Is this method deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the method, or it will be completely ignored; in the very least, - // this is a formalization for deprecating methods. - optional bool deprecated = 33 [default = false]; - - // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, - // or neither? HTTP based RPC implementation may choose GET verb for safe - // methods, and PUT verb for idempotent methods instead of the default POST. - enum IdempotencyLevel { - IDEMPOTENCY_UNKNOWN = 0; - NO_SIDE_EFFECTS = 1; // implies idempotent - IDEMPOTENT = 2; // idempotent, but may have side effects - } - optional IdempotencyLevel idempotency_level = 34 - [default = IDEMPOTENCY_UNKNOWN]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - - -// A message representing a option the parser does not recognize. This only -// appears in options protos created by the compiler::Parser class. -// DescriptorPool resolves these when building Descriptor objects. Therefore, -// options protos in descriptor objects (e.g. returned by Descriptor::options(), -// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions -// in them. -message UninterpretedOption { - // The name of the uninterpreted option. Each string represents a segment in - // a dot-separated name. is_extension is true iff a segment represents an - // extension (denoted with parentheses in options specs in .proto files). - // E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents - // "foo.(bar.baz).moo". - message NamePart { - required string name_part = 1; - required bool is_extension = 2; - } - repeated NamePart name = 2; - - // The value of the uninterpreted option, in whatever type the tokenizer - // identified it as during parsing. Exactly one of these should be set. - optional string identifier_value = 3; - optional uint64 positive_int_value = 4; - optional int64 negative_int_value = 5; - optional double double_value = 6; - optional bytes string_value = 7; - optional string aggregate_value = 8; -} - -// =================================================================== -// Optional source code info - -// Encapsulates information about the original source file from which a -// FileDescriptorProto was generated. -message SourceCodeInfo { - // A Location identifies a piece of source code in a .proto file which - // corresponds to a particular definition. This information is intended - // to be useful to IDEs, code indexers, documentation generators, and similar - // tools. - // - // For example, say we have a file like: - // message Foo { - // optional string foo = 1; - // } - // Let's look at just the field definition: - // optional string foo = 1; - // ^ ^^ ^^ ^ ^^^ - // a bc de f ghi - // We have the following locations: - // span path represents - // [a,i) [ 4, 0, 2, 0 ] The whole field definition. - // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). - // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). - // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). - // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). - // - // Notes: - // - A location may refer to a repeated field itself (i.e. not to any - // particular index within it). This is used whenever a set of elements are - // logically enclosed in a single code segment. For example, an entire - // extend block (possibly containing multiple extension definitions) will - // have an outer location whose path refers to the "extensions" repeated - // field without an index. - // - Multiple locations may have the same path. This happens when a single - // logical declaration is spread out across multiple places. The most - // obvious example is the "extend" block again -- there may be multiple - // extend blocks in the same scope, each of which will have the same path. - // - A location's span is not always a subset of its parent's span. For - // example, the "extendee" of an extension declaration appears at the - // beginning of the "extend" block and is shared by all extensions within - // the block. - // - Just because a location's span is a subset of some other location's span - // does not mean that it is a descendant. For example, a "group" defines - // both a type and a field in a single declaration. Thus, the locations - // corresponding to the type and field and their components will overlap. - // - Code which tries to interpret locations should probably be designed to - // ignore those that it doesn't understand, as more types of locations could - // be recorded in the future. - repeated Location location = 1; - message Location { - // Identifies which part of the FileDescriptorProto was defined at this - // location. - // - // Each element is a field number or an index. They form a path from - // the root FileDescriptorProto to the place where the definition occurs. - // For example, this path: - // [ 4, 3, 2, 7, 1 ] - // refers to: - // file.message_type(3) // 4, 3 - // .field(7) // 2, 7 - // .name() // 1 - // This is because FileDescriptorProto.message_type has field number 4: - // repeated DescriptorProto message_type = 4; - // and DescriptorProto.field has field number 2: - // repeated FieldDescriptorProto field = 2; - // and FieldDescriptorProto.name has field number 1: - // optional string name = 1; - // - // Thus, the above path gives the location of a field name. If we removed - // the last element: - // [ 4, 3, 2, 7 ] - // this path refers to the whole field declaration (from the beginning - // of the label to the terminating semicolon). - repeated int32 path = 1 [packed = true]; - - // Always has exactly three or four elements: start line, start column, - // end line (optional, otherwise assumed same as start line), end column. - // These are packed into a single field for efficiency. Note that line - // and column numbers are zero-based -- typically you will want to add - // 1 to each before displaying to a user. - repeated int32 span = 2 [packed = true]; - - // If this SourceCodeInfo represents a complete declaration, these are any - // comments appearing before and after the declaration which appear to be - // attached to the declaration. - // - // A series of line comments appearing on consecutive lines, with no other - // tokens appearing on those lines, will be treated as a single comment. - // - // leading_detached_comments will keep paragraphs of comments that appear - // before (but not connected to) the current element. Each paragraph, - // separated by empty lines, will be one comment element in the repeated - // field. - // - // Only the comment content is provided; comment markers (e.g. //) are - // stripped out. For block comments, leading whitespace and an asterisk - // will be stripped from the beginning of each line other than the first. - // Newlines are included in the output. - // - // Examples: - // - // optional int32 foo = 1; // Comment attached to foo. - // // Comment attached to bar. - // optional int32 bar = 2; - // - // optional string baz = 3; - // // Comment attached to baz. - // // Another line attached to baz. - // - // // Comment attached to moo. - // // - // // Another line attached to moo. - // optional double moo = 4; - // - // // Detached comment for corge. This is not leading or trailing comments - // // to moo or corge because there are blank lines separating it from - // // both. - // - // // Detached comment for corge paragraph 2. - // - // optional string corge = 5; - // /* Block comment attached - // * to corge. Leading asterisks - // * will be removed. */ - // /* Block comment attached to - // * grault. */ - // optional int32 grault = 6; - // - // // ignored detached comments. - optional string leading_comments = 3; - optional string trailing_comments = 4; - repeated string leading_detached_comments = 6; - } -} - -// Describes the relationship between generated code and its original source -// file. A GeneratedCodeInfo message is associated with only one generated -// source file, but may contain references to different source .proto files. -message GeneratedCodeInfo { - // An Annotation connects some span of text in generated code to an element - // of its generating .proto file. - repeated Annotation annotation = 1; - message Annotation { - // Identifies the element in the original source .proto file. This field - // is formatted the same as SourceCodeInfo.Location.path. - repeated int32 path = 1 [packed = true]; - - // Identifies the filesystem path to the original source .proto. - optional string source_file = 2; - - // Identifies the starting offset in bytes in the generated code - // that relates to the identified object. - optional int32 begin = 3; - - // Identifies the ending offset in bytes in the generated code that - // relates to the identified offset. The end offset should be one past - // the last relevant byte (so the length of the text = end - begin). - optional int32 end = 4; - } -} diff --git a/core/repository/build.gradle.kts b/core/repository/build.gradle.kts index 6d1185c41b..f68ba94dd0 100644 --- a/core/repository/build.gradle.kts +++ b/core/repository/build.gradle.kts @@ -26,7 +26,7 @@ kotlin { sourceSets { commonMain.dependencies { api(projects.core.model) - api(projects.core.proto) + api(libs.meshtastic.protobufs) implementation(projects.core.common) implementation(projects.core.database) diff --git a/core/service/build.gradle.kts b/core/service/build.gradle.kts index 59f7d3f959..eccfba5452 100644 --- a/core/service/build.gradle.kts +++ b/core/service/build.gradle.kts @@ -35,7 +35,7 @@ kotlin { implementation(projects.core.network) implementation(projects.core.ble) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.takserver) implementation(libs.jetbrains.lifecycle.runtime) diff --git a/core/takserver/build.gradle.kts b/core/takserver/build.gradle.kts index a89201ec3e..686d530717 100644 --- a/core/takserver/build.gradle.kts +++ b/core/takserver/build.gradle.kts @@ -32,13 +32,13 @@ kotlin { implementation(projects.core.common) implementation(projects.core.di) implementation(projects.core.model) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) - // TAKPacket-SDK is api()-exported by :core:proto (see + // TAKPacket-SDK is api()-exported by :core:model (see // https://github.com/meshtastic/TAKPacket-SDK/issues/6). // Provides org.meshtastic.proto.TAKPacketV2 and friends, plus // the SDK's own org.meshtastic.tak.* parser/builder/compressor. - // zstd-jni and xpp3 are excluded at the dep site in :core:proto + // zstd-jni and xpp3 are excluded at the dep site in :core:model // and re-added per-target below. implementation(libs.okio) diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index b381dc9722..a018720063 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -37,7 +37,7 @@ kotlin { implementation(projects.core.model) implementation(projects.core.navigation) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.repository) implementation(projects.core.resources) implementation(projects.core.service) diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index d684fafaef..9c13749464 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -259,7 +259,7 @@ dependencies { implementation(projects.core.resources) implementation(projects.core.service) implementation(projects.core.ui) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.ble) // Feature modules (JVM variants for real composable wiring) diff --git a/feature/connections/build.gradle.kts b/feature/connections/build.gradle.kts index 94aafd44d3..e6a3fd8314 100644 --- a/feature/connections/build.gradle.kts +++ b/feature/connections/build.gradle.kts @@ -31,7 +31,7 @@ kotlin { implementation(projects.core.model) implementation(projects.core.navigation) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.resources) implementation(projects.core.service) implementation(projects.core.ui) diff --git a/feature/firmware/build.gradle.kts b/feature/firmware/build.gradle.kts index f15ed141eb..f1e66cbf3c 100644 --- a/feature/firmware/build.gradle.kts +++ b/feature/firmware/build.gradle.kts @@ -35,7 +35,7 @@ kotlin { implementation(projects.core.navigation) implementation(projects.core.network) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.service) implementation(projects.core.resources) implementation(projects.core.ui) diff --git a/feature/map/build.gradle.kts b/feature/map/build.gradle.kts index 2830fed6ee..8742758b16 100644 --- a/feature/map/build.gradle.kts +++ b/feature/map/build.gradle.kts @@ -31,7 +31,7 @@ kotlin { implementation(projects.core.model) implementation(projects.core.navigation) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.service) implementation(projects.core.resources) implementation(projects.core.ui) diff --git a/feature/messaging/build.gradle.kts b/feature/messaging/build.gradle.kts index aeef8ca141..7b6b3b3939 100644 --- a/feature/messaging/build.gradle.kts +++ b/feature/messaging/build.gradle.kts @@ -27,7 +27,7 @@ kotlin { implementation(projects.core.model) implementation(projects.core.navigation) implementation(projects.core.prefs) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.resources) implementation(projects.core.service) implementation(projects.core.ui) diff --git a/feature/node/build.gradle.kts b/feature/node/build.gradle.kts index 12ed4d8799..6625b4a3aa 100644 --- a/feature/node/build.gradle.kts +++ b/feature/node/build.gradle.kts @@ -33,7 +33,7 @@ kotlin { implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.navigation) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.repository) implementation(projects.core.resources) implementation(projects.core.service) diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index 83175f1441..2a24cc537b 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -32,7 +32,7 @@ kotlin { implementation(projects.core.model) implementation(projects.core.navigation) implementation(projects.core.network) - implementation(projects.core.proto) + implementation(libs.meshtastic.protobufs) implementation(projects.core.repository) implementation(projects.core.service) implementation(projects.core.resources) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 926272e0d4..5f6b3e94ab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -82,13 +82,13 @@ okio = "3.17.0" uri-kmp = "0.0.21" osmdroid-android = "6.1.20" spotless = "8.6.0" -wire = "6.4.0" vico = "3.2.0-next.5" kable = "0.43.0" mqttastic = "0.3.6" jmdns = "3.6.3" qrcode-kotlin = "4.5.0" takpacket-sdk = "0.5.1" +meshtastic-protobufs = "2.7.25-SNAPSHOT" # Gradle Plugins develocity = "4.4.2" @@ -179,7 +179,6 @@ maps-compose-widgets = { module = "com.google.maps.android:maps-compose-widgets" mlkit-barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "mlkit-barcode-scanning" } mlkit-translate = { module = "com.google.mlkit:translate", version.ref = "mlkit-translate" } play-services-maps = { module = "com.google.android.gms:play-services-maps", version = "20.0.0" } -wire-runtime = { module = "com.squareup.wire:wire-runtime", version.ref = "wire" } zxing-core = { module = "com.google.zxing:core", version = "3.5.4" } qrcode-kotlin = { module = "io.github.g0dkar:qrcode-kotlin", version.ref = "qrcode-kotlin" } @@ -286,6 +285,9 @@ jna = { module = "net.java.dev.jna:jna", version = "5.18.1" } takpacket-sdk-kmp = { module = "org.meshtastic:takpacket-sdk", version.ref = "takpacket-sdk" } takpacket-sdk-jvm = { module = "org.meshtastic:takpacket-sdk-jvm", version.ref = "takpacket-sdk" } +# Meshtastic Protobufs SDK (Wire-generated KMP models from meshtastic/protobufs) +meshtastic-protobufs = { module = "org.meshtastic:protobufs", version.ref = "meshtastic-protobufs" } + [plugins] # Android @@ -318,7 +320,6 @@ aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "abo datadog = { id = "com.datadoghq.dd-sdk-android-gradle-plugin", version.ref = "datadog-gradle" } detekt = { id = "dev.detekt", version.ref = "detekt" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -wire = { id = "com.squareup.wire", version.ref = "wire" } room = { id = "androidx.room3", version.ref = "room" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } test-retry = { id = "org.gradle.test-retry", version.ref = "testRetry" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 1f6629f922..b9c476c96e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -111,7 +111,6 @@ include( ":core:network", ":core:nfc", ":core:prefs", - ":core:proto", ":core:repository", ":core:service", ":core:resources",