Commits by Nikka
9 subscribers
164 links
Owned by @NikkaGameS
Download Telegram
πŸ”¨ 7 new commits to ComuCompose:master:

f0b6a83: Refactor socket request handling and optimize username update logic
Implement input validation and character limit counters for Profile bio and username
Improve chat scrolling behavior and customize runtime message animations
Add text cleanup utility for Latin-only input restrictions

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
1cf06ad: Push latest changes

- Update server IP address in SocketService.
- Clean up dependencies in app/build.gradle: remove unused libs (ACRA, SafetyNet, debug tooling) and reformat.
- Update deployment target timestamp.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
eba7bdf: Push latest changes

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
240c272: Fix infinite scroll pagination logic in ChatActivity

The LaunchedEffect collecting the visible item index was previously checking if (index > 16 || isLoadingMore.value) return@collect, which allowed multiple redundant load operations to fire or fail to reset properly.

This change introduces a loadTriggered state variable to debounce the loading mechanism. It now explicitly checks if (index <= 16 && !loadTriggered && !isLoadingMore.value) to start loading, setting loadTriggered = true. The flag is only reset when the user scrolls back down (index > 16), ensuring a cleaner cycle for fetching older messages.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
38c63e4: Integrate Opus audio codec via JNI

- Add native C++ implementation for Opus encoding and decoding, including CodecOpus wrapper and JNI bridge.
- Include prebuilt libopus and libopusenc shared libraries and headers for multiple ABIs.
- Add Kotlin wrapper class Opus.kt and configuration constants.
- Configure CMake and NDK support in app/build.gradle.
- Update server IP address in SocketService.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
a328a7e: Refactor socket connection to race between local and public IPs

- Update SocketService.kt to simultaneously attempt connections to both a local IP and a public IP, using the first successful connection.
- Define LOCAL_IP and PUBLIC_IP constants in SocketService.
- Adjust CallActivity.kt to set status bar appearance and color, and assign the current activity to Handlers.
- Switch deployment target selection mode to dialog in .idea/deploymentTargetSelector.xml.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
14e4cc5: Simplify socket connection and update chat pagination

- SocketService.kt: Remove the concurrent race logic for connecting via local vs. public IP; simplify to directly connecting to the public IP.
- ChatActivity.kt: Refactor scroll listener logic to better trigger message pagination when the list reaches the top (index 0) or the threshold, ensuring history loads correctly.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 4 new commits to ComuServer:main:

e28802e: Refactor servers and improve BSON handling

Refactored TCPServer to use IPAddress for IP handling and improved BSON document processing. Enhanced UdpRelayServer with structured ClientState, binary parsing, and better relay logic. Removed legacy code and improved readability with consistent naming and updated console messages. by NikkaGames
40078d7: Add call handling, registries, and UDP enhancements

Introduced call handling in TCPServer.cs with new methods for
call events and integration with CallRegistry. Added CallRegistry
and CallSession to manage call sessions. Enhanced UdpServer.cs
for real-time call handling, including packet parsing, client
association, and cleanup logic. Introduced RealtimeClient and
RealtimeRegistry for managing real-time clients. Refactored
UdpServer.cs for improved packet handling and room management.
General improvements include better cleanup logic and streamlined
access to CallRegistry. by NikkaGames
95f328f: Refactor session handling to include TcpClient details

Enhanced DeviceSession to store TcpClient for connection
details. Updated DispatchCore and all handler methods to
accept TcpClient as a parameter, ensuring client context
is available during event handling. Improved LoadCert
logging and removed redundant debug messages. Replaced
PrintUsersExt logic to display detailed per-device info
(IP and port). Adjusted handler invocations and session
creation to integrate TcpClient seamlessly. by NikkaGames
07298d2: Improve null checks, flow control, and exception handling

Added a condition to handle cases where the total number of
devices is zero, ensuring no unnecessary output. Introduced
null checks for session and session.client to prevent
null reference errors. Refactored the infinite loop to include
a try block for message processing, handling IOException
gracefully by breaking the loop. Adjusted continue
statements for better flow control and to avoid redundant
iterations during exceptions. by NikkaGames
πŸ”¨ 2 new commits to ComuCompose:master:

49aeeab: Refactor message handling to use a sequential operation queue

This commit introduces a sequential operation queue (opQueue) to process message-related actions (add, delete) in order. This prevents race conditions and ConcurrentModificationException errors.

Key changes:
- `Handlers.kt`:
- Implemented a Channel`-based queue (`opQueue) to handle message operations (AddFront, AddBack, RemoveById) sequentially.
- Added addMessageFront, addMessage, and deleteMessageByMid to enqueue operations.
- A new startOpWorker coroutine processes the queue.
- The EVENT_MSG_DELETE_RESULT event is now handled directly within the main event loop, using the new deleteMessageByMid function.
- Old message deletion logic and associated error handling have been removed.

- `ChatActivity.kt`:
- The opWorker is started in onCreate.
- All direct modifications to the messages list (messages.add, messages.add(0, ...)) are replaced with calls to the new queue functions (Handlers.addMessage, Handlers.addMessageFront).

- `SocketService.kt`:
- The messagesCache is now cleared during reconnection to ensure fresh data.
- Minor adjustments to Thread.sleep durations.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
f2d1bde: Refactor incoming message handling

Move notification logic from ComuFirebaseService to Handlers.
Remove messageCheck polling thread and handle messages directly in socket listener.
Update references for stacked notifications and remove obsolete background checks.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 1 new commit to ComuServer:main:

a277693: Refactor payload delivery logic for TCP and FCM fallback

Refactored the logic for sending payloads to user sessions, introducing sentTcp and selfTcp flags to track TCP delivery success. Added fallback to FCM if TCP delivery fails for all sessions. Improved thread management by replacing thread creation with ThreadPool.QueueUserWorkItem for FCM notifications. Ensured SslStream authentication before TCP data transmission. Streamlined exception handling, replaced for loops with foreach for clarity, and restructured code for better readability and maintainability. by NikkaGames
πŸ”¨ 1 new commit to ComuServer:main:

288c8c2: Add async servers and enhanced debug logging

Replaced direct server invocations with asynchronous `Task`-based
execution for TCPServer and UdpServer, ensuring concurrent
operation. Introduced Task.WaitAll to synchronize completion.

Enhanced debug logging across RealtimeRegistry, TCPServer,
and UdpServer, controlled by the static TCPServer.sr flag.
Logs now include detailed insights into client registration,
packet handling, and room management.

Refactored UdpServer.Main into Run for task-based execution
and added a Dbg method for conditional logging. Improved
maintainability and debugging for real-time communication. by NikkaGames
πŸ”¨ 1 new commit to ComuServer:main:

c465a4e: Add call termination methods and handle user disconnection

Added TryEnd and EndCallsByUser methods in CallRegistry
to safely terminate calls by callId or user uid. Introduced
a thread-safe ConcurrentDictionary to manage active calls.

Updated TCPServer to invoke EndCallsByUser and ensure all
user-associated calls are terminated on disconnection. Also
added a call to RealtimeRegistry.Remove to clean up the
user's device from the real-time registry. by NikkaGames
πŸ”¨ 3 new commits to ComuCompose:master:

678c36e: Update notification logic and main item updates

- Refactor shouldNotify logic in message handlers to correctly account for chat focus and user ID comparisons.
- Move updateMainItems call for stickers to occur immediately upon handling, splitting based on isSelf.
- Remove redundant updateMainItems calls in other message handling flows to avoid duplication or incorrect timing.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
c5611ad: Implement UDP voice calling functionality

- Add UdpCallService for handling audio recording, playback, and Opus encoding/decoding.
- Rewrite CallActivity to manage call UI states (Incoming, Outgoing, Active).
- Implement call signaling events (request, accept, reject, end) in Handlers.
- Update ChatActivity to initiate calls via profile interaction.
- Modify AppVisibility to prevent service termination during active calls.
- Add RECORD_AUDIO and foreground service permissions to Manifest.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
70151fc: Implement in-call speakerphone toggle and audio routing

- Add speaker toggle button to ActiveUI and handle state changes.
- Implement proper audio device selection and AudioFocus management in UdpCallService, including support for Android 31+ APIs.
- Fix incorrect UID passing when starting UdpCallService.
- Refine CallActivity UI layout, padding, and call state updates.
- Improve socket error handling and resource cleanup in service lifecycle.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 1 new commit to ComuServer:main:

9ff2713: Add user call status checks to CallRegistry and TCPServer

Added IsUserInCall methods to CallRegistry for checking if a user is in an active call, with or without retrieving the callId. Declared Calls as a ConcurrentDictionary to manage active call sessions.

Updated TCPServer to prevent initiating calls with users already in a call by using CallRegistry.IsUserInCall. Sends a "call.busy" message if the target user is busy.

These changes improve concurrency handling and user experience. by NikkaGames
πŸ”¨ 1 new commit to ComuCompose:master:

5611986: Refactor Call UI and enhance call state management

- Consolidate call UI states (incoming, outgoing, active) into a single composable and replace text buttons with icons in CallActivity.
- Implement handling for BUSY call state in Handlers and update UI to reflect it.
- Add PendingIntent to UdpCallService notification to allow users to return to the active call screen.
- Improve service lifecycle logic: check if running before starting and add a delay before finishing the activity on call end.
- Fix callId assignment in EVENT_CALL_ACCEPTED handler.
- Remove invalid permission request invocation from UdpCallService.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 2 new commits to ComuServer:main:

c475812: Include uid in call.busy message payload

Previously, the call.busy message only included the name
property with the value "call.busy". This change adds a
uid property to the message, set to the value of targetUid.

This enhancement provides additional context to the recipient
of the message, which can be useful for debugging, logging,
or other purposes. by NikkaGames
e84766e: Improve call handling, cleanup, and logging

Refactored EndCallsByUser in CallRegistry.cs to return ended CallSession objects. Enhanced EndCallsByUser in TCPServer.cs to notify other parties and close UDP rooms. Improved NextCallId to ensure unique call IDs.

Enabled debugging in TCPServer.cs and added UdpServer.CloseRoom calls for proper cleanup. Introduced CloseRoom in UdpServer.cs for resource management. Enhanced error handling and logging in UdpServer.cs to prevent crashes and improve visibility. by NikkaGames
πŸ”¨ 2 new commits to ComuCompose:master:

b45847e: Refactor login and background service cleanup

- In AppVisibility, wait for UdpCallService to finish before stopping SocketService.
- In LoginActivity, refactor auto-login logic into relaunchLogin and remove the retry loop in login.
- Check if the user profile picture exists in LoginActivity to skip directly to MainActivity.
- Replace finish() with finishAndRemoveTask() in ChatActivity and LoginActivity.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
de34d02: Implement call duration timer and optimize service lifecycle

- Add call timer logic and display elapsed time in CallActivity
- Update call notification to show chronometer
- Auto-stop UdpCallService when call state becomes ENDED
- Refactor FCM token registration and clean up JSON handling
- Optimize LoginActivity startup flow and navigation logic

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 1 new commit to ComuCompose:master:

841729b: Add ongoing call banner to Chat and Main activities

- Expose UdpCallService.runningFlow to track call service state reactively.
- Display a clickable green banner in ChatActivity and MainActivity when a call is active, showing the elapsed duration.
- Clicking the banner navigates to the active CallActivity.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 2 new commits to ComuServer:main:

fb6764f: Refactor to use PeerId and simplify client handling

Replaced uid/device keys with PeerId (ulong) across RealtimeClient,
RealtimeRegistry, and UdpServer for improved efficiency and clarity.
Updated TCPServer to handle specific user.getinfo case. Removed
UdpServer cleanup logic and refactored related code. General cleanup
and debug message updates to align with PeerId-based implementation. by NikkaGames
3ae8d79: Add call sync method and improve call state handling

Added SendCallSync to TCPServer to synchronize call status
with users, sending call details or inactive status via SslStream.
Integrated SendCallSync in two key points after user registration
in RealtimeRegistry. Updated call state logic to include Ringing
state for further processing, enhancing handling of pending calls. by NikkaGames
πŸ”¨ 4 new commits to ComuCompose:master:

d5bf16e: * Utils: Added id helper function to generate a unique 64-bit hash from UID and device ID.
* UdpCallService: Refactored packet header structure to use a fixed-size 12-byte header (8 bytes for hashed peer ID, 4 bytes for call ID) instead of variable-length string fields, simplifying packet parsing and construction.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
3bda294: Update CallActivity finish logic and handling of incoming calls

- In CallActivity.kt, stop the service immediately when the call ends or is busy, reduce the delay before finishing the task from 2000ms to 1200ms, and clean up imports.
- In Handlers.kt, wrap the incoming call event handling in a coroutine that waits until the previous call state is no longer ENDED before initializing the new incoming call and starting CallActivity.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
d7913a5: Add microphone mute toggle and call reconnection monitoring

- Implement microphone muting in UdpCallService and add a toggle button in CallActivity.
- Add connection monitoring: switch to RECON state ("Reconnecting…") if no packets are received for 1 second.
- Handle EVENT_CALL_REJECTED with a new REJECTED state in CallWrapper.
- Update CallActivity to display UI for new states and cleanup resources on rejection.
- Wrap UDP socket send operations in runCatching to prevent crashes.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
9ed44b2: Update Call UI and implement call state synchronization

- Redesign the call screen layout in CallActivity with a new profile icon placeholder, updated typography, and adjusted spacing.
- Change the active call status text from "Call active" to "Connected".
- Implement handling for the call.sync event in Handlers to correctly update the local call state (active/ended) and call ID based on server data.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 2 new commits to ComuServer:main:

8a202c7: Add validation for Ievent.data in HandleMsgSendAsync

A new validation check ensures that the Ievent.data property
is not null, empty, or improperly formatted (must be exactly
24 characters long). If the validation fails, the method
returns DispatchResult.Break to prevent further processing.

This change improves input validation and prevents potential
issues caused by invalid or malformed data. by NikkaGames
e48cdfa: Update methods for picture links, responses, and dispatch

Modified GetPictureLinkById to support an optional full
parameter for returning full or truncated picture links.
Updated HandleUserIconAsync to use this parameter based
on Ievent.value. Changed HandleUserGetInfoAsync to set
r field to 1L in the response. Adjusted
HandlePresenceGetAsync to return DispatchResult.Continue
instead of DispatchResult.Break when TryGetMe fails. by NikkaGames
πŸ”¨ 4 new commits to ComuCompose:master:

2857331: Revamp Call UI and persist UID

- Update CallActivity with a new layout, including a TopAppBar and Scaffold
- Expand call banner visibility in MainActivity and ChatActivity to include incoming and outgoing states
- Persist Singleton UID using SharedPreferences
- Fix blocking pointer input loop in MainActivity
- Remove explicit cleanup call in SocketService

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
4ada7dd: Implement SharedPreferences persistence for Singleton properties

- Update getters and setters to read and write values (UIDs, names, bio, notification settings) using SharedPreferences.
- Ensure cleanUp() resets persisted values.
- Refactor field declarations to single lines and convert simple getters to expression bodies.
- Reorder methods for logical grouping.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
1a636cb: Load profile icon and average color asynchronously in ProfileActivity

* ProfileActivity.kt:
* Convert avgProfileColor to a mutableState to trigger recompositions on update.
* Implement LaunchedEffect to fetch the full resolution profile icon and calculate its average color asynchronously.
* Update UI to show a shimmer placeholder while the profile icon is loading.
* Use the fetched icon bitmap instead of the cached low-res version.

* Handlers.kt:
* Update getIconLink to support fetching the full-size image link via a boolean flag, parsing the result from a JSON object.
* Improve getIcon by setting connection timeouts and user-agent headers.

* LoginActivity.kt:
* Add a check for Handlers.isReconnected loop during login to ensure socket stability.
* Fix context usage for cache directory access when loading the user's own profile picture.

* .idea/deploymentTargetSelector.xml: Update deployment target configuration.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
9366551: Implement expandable profile header and update service startup

- ProfileActivity: Add expanding animation to the profile image when pulling down. Refactor header offset, avatar scaling, and name positioning logic. Move back and edit buttons in the layout hierarchy to ensure proper layering.
- UdpCallService: Move startForegroundCall to onCreate to ensure immediate foreground promotion.
- LoginActivity: Change debug logging level to Info.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 1 new commit to ComuServer:main:

bbc6611: Refactor presence handling; add status subscriptions

Replaced presence handlers with stat handlers to manage
status updates, subscriptions, and unsubscriptions. Added
ConcurrentDictionary structures for statusSubs and
streamIndex to track subscriptions and streams.

Implemented HandleStatusSetAsync, HandleStatusSubAsync,
and HandleStatusUnsubAsync methods for status management.
Added NotifyStatus helper to notify subscribers of status
changes. Updated disconnection logic to clean up statuses
and subscriptions. Ensured subscribers are notified when a
user's status is cleared. by NikkaGames
πŸ”¨ 1 new commit to ComuCompose:master:

8d3ef6c: Refactor user status to subscription model and enhance Profile UI

- Switch user status handling from polling to a subscription-based event system in Handlers and ChatActivity.
- Remove startStatusPolling and implement subscribeStatus and unsubscribeStatus methods.
- Handle EVENT_STATUS_RECV events to update UI status asynchronously.
- Add top and bottom vertical gradient fades to the profile image in ProfileActivity when expanded.
- Animate navigation icon tint brightness based on the profile expansion progress.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames
πŸ”¨ 1 new commit to ComuServer:main:

0d0ee2c: Add secure key exchange mechanism for call setup

Introduced xorKey field in CallRegistry for cryptographic key storage. Updated TCPServer to generate a 32-byte random key during call acceptance, Base64-encode it, and distribute it securely to the caller and callee. Ensured messages are sent only to authenticated SSL streams. Added state checks to activate calls only when in Ringing state. Enhanced security of call setup process. by NikkaGames
πŸ”¨ 2 new commits to ComuServer:main:

9778646: Update TCPServer to notify on non-Ringing call state

Enhanced the TCPServer class to send a notification when
call.state is not CallState.Ringing. Previously, the method
would simply return DispatchResult.Continue in this case.

The new logic sends a message to the stream via SendObj,
including an object with name: "call.taken" and the callId
property. This ensures additional feedback is provided for
non-Ringing call states before returning DispatchResult.Continue. by NikkaGames
02d47ca: Refactor call handling and encapsulate call termination

Centralized call termination logic in CallRegistry.EndCall to
improve maintainability and reduce duplication. Updated methods
in TCPServer to use EndCall instead of direct calls to
UdpServer.CloseRoom. Refined IsUserInCall logic to check
call states. Removed redundant code and ensured consistent
handling of call termination across the codebase. by NikkaGames
πŸ”¨ 1 new commit to ComuCompose:master:

1f3a6b3: Implement XOR encryption for voice calls and handle 'taken' state

- Add XOR-based payload obfuscation in UdpCallService for incoming and outgoing audio packets.
- Implement key exchange logic in Handlers via call.accepted and call.handsh events.
- Introduce State.TAKEN in CallWrapper to handle calls answered on other devices, closing the activity when received.
- Remove redundant incoming boolean from CallWrapper.
- Reset encryption keys and call state properly upon service destruction.

Signed-off-by: NikkaGames <[email protected]> by NikkaGames