Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6fb0195
Add Bluetooth support for WearOS devices
Dec 10, 2025
ef58386
Fix bugs reported by code review: thread safety, socket leaks, file l…
Dec 11, 2025
f663ea8
Fix bugs: race conditions, NPE, missing flush (Round 2)
Dec 11, 2025
febb05c
Refactor: Use standard MessageHandler for full protocol support (Roun…
Dec 11, 2025
5cf84de
Feat: Add basic Wearable UI for managing connections
Dec 11, 2025
7b4047c
Fix: Clear static impl reference on service destroy
Dec 11, 2025
ece85ec
Fix: TOCTOU race condition in WearableSettingsActivity
Dec 11, 2025
80ee65f
Fix: Socket leak on handshake failure and incomplete Connect message
Dec 11, 2025
ff4c1a9
Fix: Thread-safety for static impl and missing null check in Connecti…
Dec 11, 2025
fcba2eb
Fix: Define undefined adapter variable in ConnectionThread
Dec 11, 2025
1c4933f
Fix: Sync race condition in activeConnections access
Dec 11, 2025
725e7d4
Fix: Remove duplicate ACCESS_NETWORK_STATE permission
Dec 11, 2025
882fa2f
Docs: Add comments to handshake logic
Dec 11, 2025
0ffc9c2
Feat: UI/UX Improvements (Material Design, Scan, Disconnect)
Dec 11, 2025
6631713
Fix: Perms, Connection Race, and UI Status Logic
Dec 11, 2025
9149be9
Fix variable shadowing and connection race condition
Dec 12, 2025
b1d1aaa
Fix compilation error: remove duplicate closing brace
Dec 12, 2025
09f6146
Fix: Resolve all compilation errors for WearOS Bluetooth support
Dec 14, 2025
2b9c0be
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Dec 14, 2025
c59523d
Fix: Add missing BLUETOOTH_CONNECT permission
Dec 15, 2025
eda5727
Merge branch 'wearos-bluetooth-support' of https://github.com/SBALAVI…
Dec 15, 2025
9440651
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Dec 16, 2025
22b8895
Fix: Add runtime permission checks for BLUETOOTH_CONNECT
Dec 16, 2025
48c962e
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Jan 6, 2026
7f8a5d0
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Jan 10, 2026
8d491c9
feat(rcs): Implement God-Level RCS Support 🚀
Feb 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
21 changes: 10 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
*.iml
gen/
bin/
build/
# Gradle
.gradle/
.idea/
user.gradle
local.properties
.directory
build/
**/build/

.settings
.classpath
.project
# Build logs
build_log*.txt
*.log

# IntelliJ
.idea/
*.iml
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ buildscript {
// Ignore
}

ext.hasModule = (String name, boolean enabledByDefault) -> {
ext.hasModule = { String name, boolean enabledByDefault ->
return ext.localProperties.getProperty("modules." + name, enabledByDefault.toString()).toBoolean()
}

Expand All @@ -71,7 +71,7 @@ def execResult(... args) {
providers.exec { commandLine args }.standardOutput.asText.get()
}

def ignoreGit = providers.environmentVariable('GRADLE_MICROG_VERSION_WITHOUT_GIT').getOrElse('0') == '1'
def ignoreGit = true // providers.environmentVariable('GRADLE_MICROG_VERSION_WITHOUT_GIT').getOrElse('0') == '1'
def gmsVersion = "25.09.32"
def gmsVersionCode = Integer.parseInt(gmsVersion.replaceAll('\\.', ''))
def vendingVersion = "40.2.26"
Expand Down
169 changes: 169 additions & 0 deletions build_error_log.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
Reusing configuration cache.
> Task :play-services-rcs:preBuild UP-TO-DATE
> Task :play-services-basement:preBuild UP-TO-DATE
> Task :play-services-rcs:preReleaseBuild UP-TO-DATE
> Task :play-services-basement:preReleaseBuild UP-TO-DATE
> Task :play-services-rcs:mergeReleaseJniLibFolders UP-TO-DATE
> Task :play-services-rcs:mergeReleaseNativeLibs NO-SOURCE
> Task :play-services-rcs:stripReleaseDebugSymbols NO-SOURCE
> Task :play-services-rcs:copyReleaseJniLibsProjectAndLocalJars UP-TO-DATE
> Task :play-services-rcs:generateReleaseResValues UP-TO-DATE
> Task :play-services-rcs:extractDeepLinksForAarRelease UP-TO-DATE
> Task :safe-parcel-processor:processResources UP-TO-DATE
> Task :play-services-basement:generateReleaseBuildConfig UP-TO-DATE
> Task :play-services-basement:generateReleaseResValues UP-TO-DATE
> Task :play-services-basement:generateReleaseResources UP-TO-DATE
> Task :play-services-basement:packageReleaseResources UP-TO-DATE
> Task :play-services-base:preBuild UP-TO-DATE
> Task :play-services-base:preReleaseBuild UP-TO-DATE
> Task :play-services-basement:parseReleaseLocalResources UP-TO-DATE
> Task :play-services-base:generateReleaseResValues UP-TO-DATE
> Task :play-services-base:generateReleaseResources UP-TO-DATE
> Task :play-services-base:packageReleaseResources UP-TO-DATE
> Task :play-services-base:parseReleaseLocalResources UP-TO-DATE
> Task :play-services-basement:processReleaseManifest UP-TO-DATE
> Task :play-services-basement:generateReleaseRFile UP-TO-DATE
> Task :play-services-tasks:preBuild UP-TO-DATE
> Task :play-services-tasks:preReleaseBuild UP-TO-DATE
> Task :play-services-tasks:generateReleaseResValues UP-TO-DATE
> Task :play-services-tasks:generateReleaseResources UP-TO-DATE
> Task :play-services-tasks:packageReleaseResources UP-TO-DATE
> Task :play-services-tasks:parseReleaseLocalResources UP-TO-DATE
> Task :play-services-tasks:processReleaseManifest UP-TO-DATE
> Task :play-services-tasks:generateReleaseRFile UP-TO-DATE
> Task :play-services-tasks:javaPreCompileRelease UP-TO-DATE
> Task :safe-parcel-processor:checkKotlinGradlePluginConfigurationErrors

> Task :play-services-basement:compileReleaseAidl UP-TO-DATE
WARNING: We recommend using a newer Android Gradle plugin to use compileSdk = 35

This Android Gradle plugin (8.2.2) was tested up to compileSdk = 34.

You are strongly encouraged to update your project to use a newer
Android Gradle plugin that has been tested with compileSdk = 35.

If you are already using the latest version of the Android Gradle plugin,
you may need to wait until a newer version with support for compileSdk = 35 is available.

To suppress this warning, add/update
android.suppressUnsupportedCompileSdk=35
to this project's gradle.properties.

> Task :play-services-base:processReleaseManifest UP-TO-DATE
> Task :play-services-base:compileReleaseAidl UP-TO-DATE
> Task :play-services-base:generateReleaseRFile UP-TO-DATE
> Task :safe-parcel-processor:compileKotlin UP-TO-DATE
> Task :play-services-rcs:compileReleaseAidl UP-TO-DATE
> Task :play-services-core-proto:processResources NO-SOURCE
> Task :play-services-core-proto:generateMainProtos UP-TO-DATE
> Task :safe-parcel-processor:compileJava NO-SOURCE
> Task :safe-parcel-processor:classes UP-TO-DATE
> Task :play-services-base-core:checkKotlinGradlePluginConfigurationErrors
> Task :play-services-base-core:preBuild UP-TO-DATE
> Task :play-services-base-core:preReleaseBuild UP-TO-DATE
> Task :safe-parcel-processor:jar UP-TO-DATE
> Task :play-services-base:javaPreCompileRelease UP-TO-DATE
> Task :play-services-basement:javaPreCompileRelease UP-TO-DATE
> Task :play-services-base-core:generateReleaseResValues UP-TO-DATE
> Task :play-services-base-core:generateReleaseResources UP-TO-DATE
> Task :play-services-base-core:packageReleaseResources UP-TO-DATE
> Task :play-services-base-core:parseReleaseLocalResources UP-TO-DATE
> Task :play-services-basement-ktx:preBuild UP-TO-DATE
> Task :play-services-basement-ktx:preReleaseBuild UP-TO-DATE
> Task :play-services-basement:compileReleaseJavaWithJavac UP-TO-DATE
> Task :play-services-basement-ktx:generateReleaseResValues UP-TO-DATE
> Task :play-services-basement-ktx:generateReleaseResources UP-TO-DATE
> Task :play-services-basement:bundleLibCompileToJarRelease UP-TO-DATE
> Task :play-services-basement-ktx:packageReleaseResources UP-TO-DATE
> Task :play-services-basement-ktx:parseReleaseLocalResources UP-TO-DATE
> Task :play-services-tasks:compileReleaseJavaWithJavac UP-TO-DATE
> Task :play-services-tasks:bundleLibCompileToJarRelease UP-TO-DATE
> Task :play-services-basement-ktx:processReleaseManifest UP-TO-DATE
> Task :play-services-core-proto:checkKotlinGradlePluginConfigurationErrors
> Task :play-services-base-core:dataBindingMergeDependencyArtifactsRelease UP-TO-DATE
> Task :play-services-core-proto:compileKotlin UP-TO-DATE
> Task :play-services-base:compileReleaseJavaWithJavac UP-TO-DATE
> Task :play-services-base-core:dataBindingTriggerRelease UP-TO-DATE
> Task :play-services-core-proto:compileJava NO-SOURCE
> Task :play-services-core-proto:classes UP-TO-DATE
> Task :play-services-base:bundleLibCompileToJarRelease UP-TO-DATE
> Task :play-services-base-core:generateReleaseBuildConfig UP-TO-DATE
> Task :play-services-basement-ktx:checkKotlinGradlePluginConfigurationErrors
> Task :play-services-core-proto:jar UP-TO-DATE
> Task :play-services-basement-ktx:javaPreCompileRelease UP-TO-DATE
> Task :play-services-base-core:javaPreCompileRelease UP-TO-DATE
> Task :play-services-rcs:checkKotlinGradlePluginConfigurationErrors
> Task :play-services-rcs:generateReleaseResources UP-TO-DATE
> Task :play-services-base-core:processReleaseManifest UP-TO-DATE
> Task :play-services-rcs:generateReleaseBuildConfig UP-TO-DATE
> Task :play-services-rcs:packageReleaseResources UP-TO-DATE
> Task :play-services-base-core:generateReleaseRFile UP-TO-DATE
> Task :play-services-rcs:processReleaseManifest UP-TO-DATE
> Task :play-services-rcs:javaPreCompileRelease UP-TO-DATE
> Task :play-services-rcs:mergeReleaseShaders UP-TO-DATE
> Task :play-services-rcs:prepareLintJarForPublish UP-TO-DATE
> Task :play-services-rcs:compileReleaseShaders NO-SOURCE
> Task :play-services-rcs:generateReleaseAssets UP-TO-DATE
> Task :play-services-rcs:prepareReleaseArtProfile UP-TO-DATE
> Task :play-services-rcs:parseReleaseLocalResources UP-TO-DATE
> Task :play-services-rcs:writeReleaseAarMetadata UP-TO-DATE
> Task :play-services-rcs:packageReleaseAssets UP-TO-DATE
> Task :play-services-base:compileReleaseLibraryResources UP-TO-DATE
> Task :play-services-base-core:compileReleaseLibraryResources UP-TO-DATE
> Task :play-services-basement:compileReleaseLibraryResources UP-TO-DATE
> Task :play-services-rcs:generateReleaseRFile UP-TO-DATE
> Task :play-services-basement-ktx:compileReleaseLibraryResources UP-TO-DATE
> Task :play-services-tasks:compileReleaseLibraryResources UP-TO-DATE
> Task :play-services-rcs:mergeReleaseResources UP-TO-DATE
> Task :play-services-rcs:mapReleaseSourceSetPaths UP-TO-DATE
> Task :play-services-basement-ktx:generateReleaseRFile UP-TO-DATE
> Task :play-services-basement-ktx:compileReleaseKotlin UP-TO-DATE
> Task :play-services-basement-ktx:compileReleaseJavaWithJavac NO-SOURCE
> Task :play-services-basement-ktx:bundleLibCompileToJarRelease UP-TO-DATE
> Task :play-services-base-core:dataBindingGenBaseClassesRelease UP-TO-DATE
> Task :play-services-base-core:compileReleaseKotlin UP-TO-DATE
> Task :play-services-base-core:compileReleaseJavaWithJavac UP-TO-DATE
> Task :play-services-base-core:bundleLibCompileToJarRelease UP-TO-DATE

> Task :play-services-rcs:kaptGenerateStubsReleaseKotlin
e: file:///D:/Project%20321/MicroG-WearOS/play-services-rcs/src/main/kotlin/org/microg/gms/rcs/RcsProvisioningManager.kt:411:1 Expecting a top level declaration

> Task :play-services-rcs:kaptGenerateStubsReleaseKotlin FAILED
> Task :play-services-rcs:verifyReleaseResources
> Task :play-services-rcs:verifyReleaseResources FAILED

FAILURE: Build completed with 2 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':play-services-rcs:kaptGenerateStubsReleaseKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
> Compilation error. See log for more details

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':play-services-rcs:verifyReleaseResources'.
> A failure occurred while executing com.android.build.gradle.tasks.VerifyLibraryResourcesTask$Action
> Android resource linking failed
ERROR: D:\Project 321\MicroG-WearOS\play-services-rcs\build\intermediates\merged_res\release\values\values.xml:6833: AAPT: error: style attribute 'android:attr/windowOptOutEdgeToEdgeEnforcement' not found.


* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================

BUILD FAILED in 41s
84 actionable tasks: 7 executed, 77 up-to-date
Configuration cache entry reused.
2 changes: 2 additions & 0 deletions local.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Auto-generated by microG RCS build script
sdk.dir=C:\\Users\\selva\\AppData\\Local\\Android\\Sdk
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source: com.google.android.gms.locationsharingreporter.service.LocationSharingInfo in locationsharingreporter/reporting.proto
@file:Suppress("DEPRECATION")

package com.google.android.gms.locationsharingreporter.service

import com.squareup.wire.FieldEncoding
import com.squareup.wire.Message
import com.squareup.wire.ProtoAdapter
import com.squareup.wire.ProtoReader
import com.squareup.wire.ProtoWriter
import com.squareup.wire.ReverseProtoWriter
import com.squareup.wire.Syntax.PROTO_2
import com.squareup.wire.WireField
import com.squareup.wire.`internal`.JvmField
import com.squareup.wire.`internal`.JvmSynthetic
import kotlin.Any
import kotlin.Boolean
import kotlin.Int
import kotlin.Long
import kotlin.String
import kotlin.Suppress
import kotlin.Unit
import okio.ByteString

public class LocationSharingInfo(
@field:WireField(
tag = 5,
adapter = "com.squareup.wire.ProtoAdapter#INT64",
schemaIndex = 0,
)
@JvmField
public val createdTimestamp: Long? = null,
unknownFields: ByteString = ByteString.EMPTY,
) : Message<LocationSharingInfo, LocationSharingInfo.Builder>(ADAPTER, unknownFields) {
override fun newBuilder(): Builder {
val builder = Builder()
builder.createdTimestamp = createdTimestamp
builder.addUnknownFields(unknownFields)
return builder
}

override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is LocationSharingInfo) return false
if (unknownFields != other.unknownFields) return false
if (createdTimestamp != other.createdTimestamp) return false
return true
}

override fun hashCode(): Int {
var result = super.hashCode
if (result == 0) {
result = unknownFields.hashCode()
result = result * 37 + (createdTimestamp?.hashCode() ?: 0)
super.hashCode = result
}
return result
}

override fun toString(): String {
val result = mutableListOf<String>()
if (createdTimestamp != null) result += """createdTimestamp=$createdTimestamp"""
return result.joinToString(prefix = "LocationSharingInfo{", separator = ", ", postfix = "}")
}

public fun copy(createdTimestamp: Long? = this.createdTimestamp, unknownFields: ByteString =
this.unknownFields): LocationSharingInfo = LocationSharingInfo(createdTimestamp,
unknownFields)

public class Builder : Message.Builder<LocationSharingInfo, Builder>() {
@JvmField
public var createdTimestamp: Long? = null

public fun createdTimestamp(createdTimestamp: Long?): Builder {
this.createdTimestamp = createdTimestamp
return this
}

override fun build(): LocationSharingInfo = LocationSharingInfo(
createdTimestamp = createdTimestamp,
unknownFields = buildUnknownFields()
)
}

public companion object {
@JvmField
public val ADAPTER: ProtoAdapter<LocationSharingInfo> = object :
ProtoAdapter<LocationSharingInfo>(
FieldEncoding.LENGTH_DELIMITED,
LocationSharingInfo::class,
"type.googleapis.com/com.google.android.gms.locationsharingreporter.service.LocationSharingInfo",

PROTO_2,
null,
"locationsharingreporter/reporting.proto"
) {
override fun encodedSize(`value`: LocationSharingInfo): Int {
var size = value.unknownFields.size
size += ProtoAdapter.INT64.encodedSizeWithTag(5, value.createdTimestamp)
return size
}

override fun encode(writer: ProtoWriter, `value`: LocationSharingInfo) {
ProtoAdapter.INT64.encodeWithTag(writer, 5, value.createdTimestamp)
writer.writeBytes(value.unknownFields)
}

override fun encode(writer: ReverseProtoWriter, `value`: LocationSharingInfo) {
writer.writeBytes(value.unknownFields)
ProtoAdapter.INT64.encodeWithTag(writer, 5, value.createdTimestamp)
}

override fun decode(reader: ProtoReader): LocationSharingInfo {
var createdTimestamp: Long? = null
val unknownFields = reader.forEachTag { tag ->
when (tag) {
5 -> createdTimestamp = ProtoAdapter.INT64.decode(reader)
else -> reader.readUnknownField(tag)
}
}
return LocationSharingInfo(
createdTimestamp = createdTimestamp,
unknownFields = unknownFields
)
}

override fun redact(`value`: LocationSharingInfo): LocationSharingInfo = value.copy(
unknownFields = ByteString.EMPTY
)
}

private const val serialVersionUID: Long = 0L

@JvmSynthetic
public inline fun build(body: Builder.() -> Unit): LocationSharingInfo =
Builder().apply(body).build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Code generated by Wire protocol buffer compiler, do not edit.
// Source: com.google.android.gms.locationsharingreporter.service.NetworkConnectivityState in locationsharingreporter/reporting.proto
@file:Suppress("DEPRECATION")

package com.google.android.gms.locationsharingreporter.service

import com.squareup.wire.EnumAdapter
import com.squareup.wire.ProtoAdapter
import com.squareup.wire.Syntax.PROTO_2
import com.squareup.wire.WireEnum
import com.squareup.wire.`internal`.JvmField
import com.squareup.wire.`internal`.JvmStatic
import kotlin.Int
import kotlin.Suppress

public enum class NetworkConnectivityState(
override val `value`: Int,
) : WireEnum {
CONNECTIVITY_UNKNOWN(0),
CONNECTIVITY_DISCONNECTED(1),
CONNECTIVITY_CONNECTED(2),
;

public companion object {
@JvmField
public val ADAPTER: ProtoAdapter<NetworkConnectivityState> = object :
EnumAdapter<NetworkConnectivityState>(
NetworkConnectivityState::class,
PROTO_2,
NetworkConnectivityState.CONNECTIVITY_UNKNOWN
) {
override fun fromValue(`value`: Int): NetworkConnectivityState? =
NetworkConnectivityState.fromValue(`value`)
}

@JvmStatic
public fun fromValue(`value`: Int): NetworkConnectivityState? = when (`value`) {
0 -> CONNECTIVITY_UNKNOWN
1 -> CONNECTIVITY_DISCONNECTED
2 -> CONNECTIVITY_CONNECTED
else -> null
}
}
}
Loading
Loading