From 632ef70a5a3b7d350a7d5d2f11b8dc77ab055bfe Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Thu, 10 Jul 2025 16:58:45 +0200 Subject: [PATCH 01/18] build pipeline test --- .github/workflows/android-build.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/android-build.yml diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml new file mode 100644 index 00000000..daf86061 --- /dev/null +++ b/.github/workflows/android-build.yml @@ -0,0 +1,29 @@ +name: Android Build + +on: + push: + branches: + - '**' + pull_request: + branches: + - '**' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - name: Build with Gradle + run: ./gradlew build From f5f3c04dda4955a377d052fa286d8feb25771473 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:05:02 +0200 Subject: [PATCH 02/18] use newer java --- .github/workflows/android-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index daf86061..b174f6f5 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -16,10 +16,10 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'temurin' - name: Setup Gradle From 85f23c23fda54070302ab46152db57285f39848b Mon Sep 17 00:00:00 2001 From: alpermelkeli <108495629+alpermelkeli@users.noreply.github.com> Date: Thu, 10 Jul 2025 18:56:55 +0300 Subject: [PATCH 03/18] implement channel password management at local and /pass command handling. --- .../com/bitchat/android/ui/ChannelManager.kt | 18 +++++-- .../bitchat/android/ui/CommandProcessor.kt | 50 ++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt b/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt index f0d6b4c1..641c65ef 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt @@ -284,9 +284,21 @@ class ChannelManager( state.setShowPasswordPrompt(false) state.setPasswordPromptChannel(null) } - - fun setChannelPassword(channel: String, password: String): Boolean { - return verifyChannelPassword(channel, password) + + fun setChannelPassword(channel: String, password: String) { + + channelPasswords[channel] = password + + channelKeys[channel] = deriveChannelKey(password, channel) + + state.setPasswordProtectedChannels( + state.getPasswordProtectedChannelsValue().toMutableSet().apply { add(channel) } + ) + + dataManager.saveChannelData( + state.getJoinedChannelsValue(), + state.getPasswordProtectedChannelsValue() + ) } // MARK: - Emergency Clear diff --git a/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt b/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt index 616cf3c4..286c0934 100644 --- a/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt +++ b/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt @@ -39,6 +39,7 @@ class CommandProcessor( "/m", "/msg" -> handleMessageCommand(parts, meshService) "/w" -> handleWhoCommand() "/clear" -> handleClearCommand() + "/pass" -> handlePassCommand(parts, myPeerID) "/block" -> handleBlockCommand(parts, meshService) "/unblock" -> handleUnblockCommand(parts, meshService) "/hug" -> handleActionCommand(parts, "gives", "a warm hug 🫂", meshService, myPeerID, onSendMessage) @@ -54,7 +55,8 @@ class CommandProcessor( if (parts.size > 1) { val channelName = parts[1] val channel = if (channelName.startsWith("#")) channelName else "#$channelName" - val success = channelManager.joinChannel(channel, null, myPeerID) + val password = if (parts.size > 2) parts[2] else null + val success = channelManager.joinChannel(channel, password, myPeerID) if (success) { val systemMessage = BitchatMessage( sender = "system", @@ -165,6 +167,52 @@ class CommandProcessor( } } } + + private fun handlePassCommand(parts: List, peerID: String) { + val currentChannel = state.getCurrentChannelValue() + + if (currentChannel == null) { + val systemMessage = BitchatMessage( + sender = "system", + content = "you must be in a channel to set a password.", + timestamp = Date(), + isRelay = false + ) + messageManager.addMessage(systemMessage) + return + } + + if (parts.size == 2){ + if(!channelManager.isChannelCreator(channel = currentChannel, peerID = peerID)){ + val systemMessage = BitchatMessage( + sender = "system", + content = "you must be the channel creator to set a password.", + timestamp = Date(), + isRelay = false + ) + channelManager.addChannelMessage(currentChannel,systemMessage,null) + return + } + val newPassword = parts[1] + channelManager.setChannelPassword(currentChannel, newPassword) + val systemMessage = BitchatMessage( + sender = "system", + content = "password changed for channel $currentChannel", + timestamp = Date(), + isRelay = false + ) + channelManager.addChannelMessage(currentChannel,systemMessage,null) + } + else{ + val systemMessage = BitchatMessage( + sender = "system", + content = "usage: /pass ", + timestamp = Date(), + isRelay = false + ) + channelManager.addChannelMessage(currentChannel,systemMessage,null) + } + } private fun handleBlockCommand(parts: List, meshService: Any) { if (parts.size > 1) { From 1098970810c97e48cc4a1f272e0e407c9acc4c1a Mon Sep 17 00:00:00 2001 From: Gaurav Vashisth Date: Thu, 10 Jul 2025 23:20:14 +0530 Subject: [PATCH 04/18] fixes vertical padding in permission explanation --- .../bitchat/android/onboarding/PermissionExplanationScreen.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt b/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt index 802e6ab2..f09d9783 100644 --- a/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt +++ b/app/src/main/java/com/bitchat/android/onboarding/PermissionExplanationScreen.kt @@ -30,10 +30,11 @@ fun PermissionExplanationScreen( Column( modifier = Modifier .fillMaxSize() - .padding(24.dp) + .padding(horizontal = 24.dp) .verticalScroll(scrollState), verticalArrangement = Arrangement.spacedBy(16.dp) ) { + Spacer(modifier = Modifier.height(24.dp)) // Header Column( modifier = Modifier.fillMaxWidth(), @@ -164,6 +165,7 @@ fun PermissionExplanationScreen( ) } } + Spacer(modifier = Modifier.height(24.dp)) } } From 3941fe1f7e9e583949bb20a5945f47f47735c25d Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Thu, 10 Jul 2025 14:05:29 -0700 Subject: [PATCH 05/18] feat: add monochrome/themed icon for Android 12+ --- .../res/drawable/ic_launcher_monochrome.xml | 60 +++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 3 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 3 +- 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.xml diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 00000000..c531b643 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6b78462d..a79cb4c6 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,6 @@ - + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6b78462d..a79cb4c6 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,6 @@ - + + From 6c51fe46f68fd82ebb9e0f5e008f9ccf79b20bbd Mon Sep 17 00:00:00 2001 From: Ranch Camal Date: Thu, 10 Jul 2025 23:36:57 -0400 Subject: [PATCH 06/18] Update README.md Updated the git clone URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd52e086..0ddfb1ac 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ This project is released into the public domain. See the [LICENSE](LICENSE.md) f 1. **Clone the repository:** ```bash - git clone https://github.com/your-username/bitchat-android.git + git clone https://github.com/permissionlesstech/bitchat-android.git cd bitchat-android ``` From dd022fc22f8a12a047527af5fa2d9a9431f1fc69 Mon Sep 17 00:00:00 2001 From: Arjun Adhikari <33110520+theArjun@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:03:19 +0545 Subject: [PATCH 07/18] fix: update repo path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd52e086..0ddfb1ac 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ This project is released into the public domain. See the [LICENSE](LICENSE.md) f 1. **Clone the repository:** ```bash - git clone https://github.com/your-username/bitchat-android.git + git clone https://github.com/permissionlesstech/bitchat-android.git cd bitchat-android ``` From 622ba5b7871331e876b2a1f06fa66766e8d7a3aa Mon Sep 17 00:00:00 2001 From: prudhvir3ddy Date: Fri, 11 Jul 2025 16:58:18 +0530 Subject: [PATCH 08/18] release mode to be minified and shrinked --- app/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8aad3797..ce8717bd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,7 +23,8 @@ android { buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true + isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" From 5b2cbe951692070194ead0d517900b98587429d6 Mon Sep 17 00:00:00 2001 From: Shubert Munthali Date: Fri, 11 Jul 2025 14:50:59 +0200 Subject: [PATCH 09/18] Add unit tests package and migrate test_color.kt to unit testing --- app/src/test/kotlin/com/bitchat/ColorTest.kt | 78 ++++++++++++++++++++ test_color.kt | 51 ------------- 2 files changed, 78 insertions(+), 51 deletions(-) create mode 100644 app/src/test/kotlin/com/bitchat/ColorTest.kt delete mode 100644 test_color.kt diff --git a/app/src/test/kotlin/com/bitchat/ColorTest.kt b/app/src/test/kotlin/com/bitchat/ColorTest.kt new file mode 100644 index 00000000..f21a571c --- /dev/null +++ b/app/src/test/kotlin/com/bitchat/ColorTest.kt @@ -0,0 +1,78 @@ +package com.bitchat + +import androidx.compose.ui.graphics.Color +import org.junit.Assert.assertEquals +import org.junit.Test + +/** + * Generate a consistent color for a username based on their peer ID or nickname + * Returns colors that work well on both light and dark backgrounds + */ + +class ColorTest { + fun getUsernameColor(identifier: String): Color { + // Hash the identifier to get a consistent number + val hash = identifier.hashCode().toUInt() + + // Terminal-friendly colors that work on both black and white backgrounds + val colors = listOf( + Color(0xFF00FF00), // Bright Green + Color(0xFF00FFFF), // Cyan + Color(0xFFFFFF00), // Yellow + Color(0xFFFF00FF), // Magenta + Color(0xFF0080FF), // Bright Blue + Color(0xFFFF8000), // Orange + Color(0xFF80FF00), // Lime Green + Color(0xFF8000FF), // Purple + Color(0xFFFF0080), // Pink + Color(0xFF00FF80), // Spring Green + Color(0xFF80FFFF), // Light Cyan + Color(0xFFFF8080), // Light Red + Color(0xFF8080FF), // Light Blue + Color(0xFFFFFF80), // Light Yellow + Color(0xFFFF80FF), // Light Magenta + Color(0xFF80FF80), // Light Green + ) + + // Use modulo to get consistent color for same identifier + return colors[(hash % colors.size.toUInt()).toInt()] + } + + @Test + fun is_username_derived_color_consistent() { + + println("Testing username color function:") + + val testUsers = listOf("alice", "bob", "charlie", "diana", "eve") + + testUsers.forEach { user -> + val color = getUsernameColor(user) + println("User '$user' gets color: ${color.value.toString(16).uppercase()}") + } + + val `alice'sColor` = getUsernameColor(testUsers[0]) + val `bob'sColor` = getUsernameColor(testUsers[1]) + val `charlie'sColor` = getUsernameColor(testUsers[2]) + val `diana'sColor` = getUsernameColor(testUsers[3]) + val `eve'sColor` = getUsernameColor(testUsers[4]) + + // Test consistency - same user should always get same color + println("\nTesting consistency:") + repeat(3) { + val `alice's_color` = getUsernameColor(testUsers[0]) + val `bob's_color` = getUsernameColor(testUsers[1]) + val `charlie's_color` = getUsernameColor(testUsers[2]) + val `diana's_color` = getUsernameColor(testUsers[3]) + val `eve's_color` = getUsernameColor(testUsers[4]) + + + assertEquals(`alice'sColor`, `alice's_color`) + assertEquals(`bob'sColor`, `bob's_color`) + assertEquals(`charlie'sColor`, `charlie's_color`) + assertEquals(`diana'sColor`, `diana's_color`) + assertEquals(`eve'sColor`, `eve's_color`) + + println("Alice color (test ${it + 1}): ${`alice'sColor`.value.toString(16).uppercase()}") + } + } +} \ No newline at end of file diff --git a/test_color.kt b/test_color.kt deleted file mode 100644 index f13cc7d2..00000000 --- a/test_color.kt +++ /dev/null @@ -1,51 +0,0 @@ -import androidx.compose.ui.graphics.Color - -/** - * Generate a consistent color for a username based on their peer ID or nickname - * Returns colors that work well on both light and dark backgrounds - */ -fun getUsernameColor(identifier: String): Color { - // Hash the identifier to get a consistent number - val hash = identifier.hashCode().toUInt() - - // Terminal-friendly colors that work on both black and white backgrounds - val colors = listOf( - Color(0xFF00FF00), // Bright Green - Color(0xFF00FFFF), // Cyan - Color(0xFFFFFF00), // Yellow - Color(0xFFFF00FF), // Magenta - Color(0xFF0080FF), // Bright Blue - Color(0xFFFF8000), // Orange - Color(0xFF80FF00), // Lime Green - Color(0xFF8000FF), // Purple - Color(0xFFFF0080), // Pink - Color(0xFF00FF80), // Spring Green - Color(0xFF80FFFF), // Light Cyan - Color(0xFFFF8080), // Light Red - Color(0xFF8080FF), // Light Blue - Color(0xFFFFFF80), // Light Yellow - Color(0xFFFF80FF), // Light Magenta - Color(0xFF80FF80), // Light Green - ) - - // Use modulo to get consistent color for same identifier - return colors[(hash % colors.size.toUInt()).toInt()] -} - -fun main() { - println("Testing username color function:") - - val testUsers = listOf("alice", "bob", "charlie", "diana", "eve") - - testUsers.forEach { user -> - val color = getUsernameColor(user) - println("User '$user' gets color: ${color.value.toString(16).uppercase()}") - } - - // Test consistency - same user should always get same color - println("\nTesting consistency:") - repeat(3) { - val aliceColor = getUsernameColor("alice") - println("Alice color (test ${it + 1}): ${aliceColor.value.toString(16).uppercase()}") - } -} From 75c4b758b63063f7a357599dffb1aa64419a09fe Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:27:24 +0200 Subject: [PATCH 10/18] fix: /w shows usernames now --- .../main/java/com/bitchat/android/ui/CommandProcessor.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt b/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt index 616cf3c4..65063d9d 100644 --- a/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt +++ b/app/src/main/java/com/bitchat/android/ui/CommandProcessor.kt @@ -37,7 +37,7 @@ class CommandProcessor( when (cmd) { "/j", "/join" -> handleJoinCommand(parts, myPeerID) "/m", "/msg" -> handleMessageCommand(parts, meshService) - "/w" -> handleWhoCommand() + "/w" -> handleWhoCommand(meshService) "/clear" -> handleClearCommand() "/block" -> handleBlockCommand(parts, meshService) "/unblock" -> handleUnblockCommand(parts, meshService) @@ -127,11 +127,11 @@ class CommandProcessor( } } - private fun handleWhoCommand() { + private fun handleWhoCommand(meshService: Any) { val connectedPeers = state.getConnectedPeersValue() val peerList = connectedPeers.joinToString(", ") { peerID -> - // This would need mesh service access for nicknames - peerID // For now just use peer ID + // Convert peerID to nickname using the mesh service + getPeerNickname(peerID, meshService) } val systemMessage = BitchatMessage( From 5b5792c379ec3ac859a0d7e213b991e59fb35101 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:30:37 +0200 Subject: [PATCH 11/18] changelog --- CHANGELOG.md | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..c586165d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,91 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Fixed +- `/w` command now displays user nicknames instead of peer IDs + +## [0.5.1] - 2025-07-10 + +### Added +- Bluetooth startup check with user prompt to enable Bluetooth if disabled + +### Fixed +- Improved Bluetooth initialization reliability on first app launch + +## [0.5] - 2025-07-10 + +### Added +- New user onboarding screen with permission explanations +- Educational content explaining why each permission is required +- Privacy assurance messaging (no tracking, no servers, local-only data) + +### Fixed +- Comprehensive permission validation - ensures all required permissions are granted +- Proper Bluetooth stack initialization on first app load +- Eliminated need for manual app restart after installation +- Enhanced permission request coordination and error handling + +### Changed +- Improved first-time user experience with guided setup flow + +## [0.4] - 2025-07-10 + +### Added +- Push notifications for direct messages +- Enhanced notification system with proper click handling and grouping + +### Improved +- Direct message (DM) view with better user interface +- Enhanced private messaging experience + +### Known Issues +- Favorite peer functionality currently broken + +## [0.3] - 2025-07-09 + +### Added +- Battery-aware scanning policies for improved power management +- Dynamic scan behavior based on device battery state + +### Fixed +- Android-to-Android Bluetooth Low Energy connections +- Peer discovery reliability between Android devices +- Connection stability improvements + +## [0.2] - 2025-07-09 + +### Added +- Initial Android implementation of bitchat protocol +- Bluetooth Low Energy mesh networking +- End-to-end encryption for private messages +- Channel-based messaging with password protection +- Store-and-forward message delivery +- IRC-style commands (/msg, /join, /clear, etc.) +- RSSI-based signal quality indicators + +### Fixed +- Various Bluetooth handling improvements +- User interface refinements +- Connection reliability enhancements + +## [0.1] - 2025-07-08 + +### Added +- Initial release of bitchat Android client +- Basic mesh networking functionality +- Core messaging features +- Protocol compatibility with iOS bitchat client + +[Unreleased]: https://github.com/permissionlesstech/bitchat-android/compare/0.5.1...HEAD +[0.5.1]: https://github.com/permissionlesstech/bitchat-android/compare/0.5...0.5.1 +[0.5]: https://github.com/permissionlesstech/bitchat-android/compare/0.4...0.5 +[0.4]: https://github.com/permissionlesstech/bitchat-android/compare/0.3...0.4 +[0.3]: https://github.com/permissionlesstech/bitchat-android/compare/0.2...0.3 +[0.2]: https://github.com/permissionlesstech/bitchat-android/compare/0.1...0.2 +[0.1]: https://github.com/permissionlesstech/bitchat-android/releases/tag/0.1 From e0065115d679e68989999fe4a3690f701f87e607 Mon Sep 17 00:00:00 2001 From: asmogo Date: Fri, 11 Jul 2025 22:31:38 +0200 Subject: [PATCH 12/18] Update references to new GitHub organization in project files. --- .github/DISCUSSION_TEMPLATE/question.yml | 4 ++-- .github/ISSUE_TEMPLATE/bug_report.yml | 6 +++--- .github/ISSUE_TEMPLATE/feature_request.yml | 4 ++-- .github/pull_request_template.md | 2 +- README.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/question.yml index 0344e2f0..bb0c1a53 100644 --- a/.github/DISCUSSION_TEMPLATE/question.yml +++ b/.github/DISCUSSION_TEMPLATE/question.yml @@ -9,11 +9,11 @@ body: attributes: label: "Checklist" options: - - label: "I made sure that there are *no existing issues or discussions* - [open](https://github.com/callebtc/bitchat-android/issues) or [closed](https://github.com/callebtc/bitchat-android/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." + - label: "I made sure that there are *no existing issues or discussions* - [open](https://github.com/permissionlesstech/bitchat-android/issues) or [closed](https://github.com/permissionlesstech/bitchat-android/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true - label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise." required: true - - label: "I have read and understood the [technical architecture](https://github.com/callebtc/bitchat-android/blob/main/README.md#technical-architecture)." + - label: "I have read and understood the [technical architecture](https://github.com/permissionlesstech/bitchat-android/blob/main/README.md#technical-architecture)." required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7e582683..cd10e3b0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -14,15 +14,15 @@ body: attributes: label: "Checklist" options: - - label: "I am able to reproduce the bug with the latest version given here: [CLICK THIS LINK](https://github.com/callebtc/bitchat-android/releases/latest)." + - label: "I am able to reproduce the bug with the latest version given here: [CLICK THIS LINK](https://github.com/permissionlesstech/bitchat-android/releases/latest)." required: true - - label: "I made sure that there are *no existing issues* - [open](https://github.com/callebtc/bitchat-android/issues) or [closed](https://github.com/callebtc/bitchat-android/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." + - label: "I made sure that there are *no existing issues* - [open](https://github.com/permissionlesstech/bitchat-android/issues) or [closed](https://github.com/permissionlesstech/bitchat-android/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true - label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise." required: true - label: "This issue contains only one bug." required: true - - label: "I have read and understood the [contribution guidelines](https://github.com/callebtc/bitchat-android/blob/main/README.md#contributing)." + - label: "I have read and understood the [contribution guidelines](https://github.com/permissionlesstech/bitchat-android/blob/main/README.md#contributing)." required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 095cdf1f..9a33e6ca 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -7,9 +7,9 @@ body: attributes: label: Checklist options: - - label: I have used the search function for [**OPEN**](https://github.com/callebtc/bitchat-android/issues) issues to see if someone else has already submitted the same feature request. + - label: I have used the search function for [**OPEN**](https://github.com/permissionlesstech/bitchat-android/issues) issues to see if someone else has already submitted the same feature request. required: true - - label: I have **also** used the search function for [**CLOSED**](https://github.com/callebtc/bitchat-android/issues?q=is%3Aissue+is%3Aclosed) issues to see if the feature was already implemented and is just waiting to be released, or if the feature was rejected. + - label: I have **also** used the search function for [**CLOSED**](https://github.com/permissionlesstech/bitchat-android/issues?q=is%3Aissue+is%3Aclosed) issues to see if the feature was already implemented and is just waiting to be released, or if the feature was rejected. required: true - label: I will describe the problem with as much detail as possible. required: true diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index acc00ae4..5c31bf9c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -6,7 +6,7 @@ please make sure that you have done all of the following. You can tick the boxes below by placing an x inside the brackets like this: [x] --> -- [ ] I have read the contribution guidelines: +- [ ] I have read the contribution guidelines: - [ ] I have performed a self-review of my code - [ ] I have mentioned the corresponding issue and the relevant keyword (e.g., "Closes: #xy") in the description (see ) diff --git a/README.md b/README.md index 0ddfb1ac..b7a8a15e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This is the **Android port** of the original [bitchat iOS app](https://github.co ## Install bitchat -You can download the latest version of bitchat for Android from the [GitHub Releases page](https://github.com/callebtc/bitchat-android/releases). +You can download the latest version of bitchat for Android from the [GitHub Releases page](https://github.com/permissionlesstech/bitchat-android/releases). **Instructions:** From 83da8f3b1b1877762df339fa4e01be0c87de164b Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:34:56 +0200 Subject: [PATCH 13/18] input --- .../java/com/bitchat/android/ui/ChatHeader.kt | 13 ++++++++++-- .../com/bitchat/android/ui/InputComponents.kt | 20 ++++++++----------- .../bitchat/android/ui/SidebarComponents.kt | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt index e76dba4c..f7b85f0e 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt @@ -278,7 +278,15 @@ private fun ChannelHeader( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - IconButton(onClick = onBackClick) { + // Use same back button style as DM header (Button instead of IconButton) + Button( + onClick = onBackClick, + colors = ButtonDefaults.buttonColors( + containerColor = Color.Transparent, + contentColor = colorScheme.primary + ), + contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp) + ) { Row( verticalAlignment = Alignment.CenterVertically ) { @@ -299,10 +307,11 @@ private fun ChannelHeader( Spacer(modifier = Modifier.weight(1f)) + // Centered title with orange color to match DM input field Text( text = "channel: $channel", style = MaterialTheme.typography.titleMedium, - color = Color(0xFF0080FF), // Blue + color = Color(0xFFFF8C00), // Orange to match input field modifier = Modifier.clickable { onSidebarClick() } ) diff --git a/app/src/main/java/com/bitchat/android/ui/InputComponents.kt b/app/src/main/java/com/bitchat/android/ui/InputComponents.kt index cc25dc4f..e7706218 100644 --- a/app/src/main/java/com/bitchat/android/ui/InputComponents.kt +++ b/app/src/main/java/com/bitchat/android/ui/InputComponents.kt @@ -44,17 +44,13 @@ fun MessageInput( modifier = modifier.padding(horizontal = 12.dp, vertical = 8.dp), // Reduced padding verticalAlignment = Alignment.CenterVertically ) { - // Fixed: Remove arrow from private message input + // Remove arrow from both private and channel inputs to match DM style Text( - text = when { - selectedPrivatePeer != null -> "<@$nickname>" // Removed arrow for private - currentChannel != null -> "<@$nickname> →" // Keep arrow for channels - else -> "<@$nickname>" - }, + text = "<@$nickname>", // No arrow for both private and channel style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Medium), color = when { selectedPrivatePeer != null -> Color(0xFFFF8C00) // Orange for private - currentChannel != null -> Color(0xFFFF8C00) // Orange if encrypted channel + currentChannel != null -> Color(0xFFFF8C00) // Orange for channels too else -> colorScheme.primary }, fontFamily = FontFamily.Monospace @@ -78,7 +74,7 @@ fun MessageInput( Spacer(modifier = Modifier.width(8.dp)) // Reduced spacing - // Fixed: Make send button orange in private mode to match nickname color + // Update send button to match input field colors IconButton( onClick = onSend, modifier = Modifier.size(32.dp) @@ -87,8 +83,8 @@ fun MessageInput( modifier = Modifier .size(30.dp) .background( - color = if (selectedPrivatePeer != null) { - // Orange for private messages to match nickname color + color = if (selectedPrivatePeer != null || currentChannel != null) { + // Orange for both private messages and channels to match nickname color Color(0xFFFF8C00).copy(alpha = 0.75f) } else if (colorScheme.background == Color.Black) { Color(0xFF00FF00).copy(alpha = 0.75f) // Bright green for dark theme @@ -103,8 +99,8 @@ fun MessageInput( imageVector = Icons.Filled.KeyboardArrowUp, contentDescription = "Send message", modifier = Modifier.size(20.dp), - tint = if (selectedPrivatePeer != null) { - // Black arrow on orange in private mode + tint = if (selectedPrivatePeer != null || currentChannel != null) { + // Black arrow on orange for both private and channel modes Color.Black } else if (colorScheme.background == Color.Black) { Color.Black // Black arrow on bright green in dark theme diff --git a/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt b/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt index e97b6446..b32821cc 100644 --- a/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt +++ b/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt @@ -193,7 +193,7 @@ fun ChannelsSection( verticalAlignment = Alignment.CenterVertically ) { Text( - text = "#$channel", + text = channel, // Channel already contains the # prefix style = MaterialTheme.typography.bodyMedium, color = if (isSelected) colorScheme.primary else colorScheme.onSurface, fontWeight = if (isSelected) FontWeight.Medium else FontWeight.Normal, From 006ac7e78a88d2def8e813f582cefe9165c19642 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:37:51 +0200 Subject: [PATCH 14/18] buttons --- .../java/com/bitchat/android/ui/ChatHeader.kt | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt index f7b85f0e..ffe0807b 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt @@ -201,19 +201,16 @@ private fun PrivateChatHeader( val colorScheme = MaterialTheme.colorScheme val peerNickname = peerNicknames[peerID] ?: peerID - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - // Fixed: Make back button wider to prevent text cropping + Box(modifier = Modifier.fillMaxWidth()) { + // Back button - positioned on the left Button( onClick = onBackClick, colors = ButtonDefaults.buttonColors( containerColor = Color.Transparent, contentColor = colorScheme.primary ), - contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp) + contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp), + modifier = Modifier.align(Alignment.CenterStart) ) { Row( verticalAlignment = Alignment.CenterVertically @@ -233,9 +230,11 @@ private fun PrivateChatHeader( } } - Spacer(modifier = Modifier.weight(1f)) - - Row(verticalAlignment = Alignment.CenterVertically) { + // Title - perfectly centered regardless of other elements + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.align(Alignment.Center) + ) { Icon( imageVector = Icons.Filled.Lock, contentDescription = "Private chat", @@ -250,10 +249,11 @@ private fun PrivateChatHeader( ) } - Spacer(modifier = Modifier.weight(1f)) - - // Favorite button with proper filled/outlined star - IconButton(onClick = onToggleFavorite) { + // Favorite button - positioned on the right + IconButton( + onClick = onToggleFavorite, + modifier = Modifier.align(Alignment.CenterEnd) + ) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.Star, contentDescription = if (isFavorite) "Remove from favorites" else "Add to favorites", @@ -273,19 +273,16 @@ private fun ChannelHeader( ) { val colorScheme = MaterialTheme.colorScheme - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - // Use same back button style as DM header (Button instead of IconButton) + Box(modifier = Modifier.fillMaxWidth()) { + // Back button - positioned on the left Button( onClick = onBackClick, colors = ButtonDefaults.buttonColors( containerColor = Color.Transparent, contentColor = colorScheme.primary ), - contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp) + contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp), + modifier = Modifier.align(Alignment.CenterStart) ) { Row( verticalAlignment = Alignment.CenterVertically @@ -305,19 +302,21 @@ private fun ChannelHeader( } } - Spacer(modifier = Modifier.weight(1f)) - - // Centered title with orange color to match DM input field + // Title - perfectly centered regardless of other elements Text( text = "channel: $channel", style = MaterialTheme.typography.titleMedium, color = Color(0xFFFF8C00), // Orange to match input field - modifier = Modifier.clickable { onSidebarClick() } + modifier = Modifier + .align(Alignment.Center) + .clickable { onSidebarClick() } ) - Spacer(modifier = Modifier.weight(1f)) - - TextButton(onClick = onLeaveChannel) { + // Leave button - positioned on the right + TextButton( + onClick = onLeaveChannel, + modifier = Modifier.align(Alignment.CenterEnd) + ) { Text( text = "leave", style = MaterialTheme.typography.bodySmall, From a9995ebfc1d48ae0f4db3df7ed4afcc35cdefa09 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:45:59 +0200 Subject: [PATCH 15/18] like --- .../main/java/com/bitchat/android/ui/ChatHeader.kt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt index ffe0807b..ee674796 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt @@ -216,12 +216,11 @@ private fun PrivateChatHeader( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = Icons.Filled.ArrowBack, + imageVector = Icons.Filled.ArrowBackIos, contentDescription = "Back", - modifier = Modifier.size(16.dp), + modifier = Modifier.size(14.dp), tint = colorScheme.primary ) - Spacer(modifier = Modifier.width(4.dp)) Text( text = "back", style = MaterialTheme.typography.bodyMedium, @@ -281,19 +280,17 @@ private fun ChannelHeader( containerColor = Color.Transparent, contentColor = colorScheme.primary ), - contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp), modifier = Modifier.align(Alignment.CenterStart) ) { Row( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = Icons.Filled.ArrowBack, + imageVector = Icons.Filled.ArrowBackIos, contentDescription = "Back", - modifier = Modifier.size(16.dp), + modifier = Modifier.size(14.dp), tint = colorScheme.primary - ) - Spacer(modifier = Modifier.width(4.dp)) + ) Text( text = "back", style = MaterialTheme.typography.bodyMedium, From 759ebaec93613c3bd661db8672589e1c0d9f84e9 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:49:49 +0200 Subject: [PATCH 16/18] buttons --- .../java/com/bitchat/android/ui/ChatHeader.kt | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt index ee674796..537d4afb 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt @@ -202,25 +202,28 @@ private fun PrivateChatHeader( val peerNickname = peerNicknames[peerID] ?: peerID Box(modifier = Modifier.fillMaxWidth()) { - // Back button - positioned on the left + // Back button - positioned all the way to the left with minimal margin Button( onClick = onBackClick, colors = ButtonDefaults.buttonColors( containerColor = Color.Transparent, contentColor = colorScheme.primary ), - contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp), - modifier = Modifier.align(Alignment.CenterStart) + contentPadding = PaddingValues(horizontal = 4.dp, vertical = 4.dp), // Reduced horizontal padding + modifier = Modifier + .align(Alignment.CenterStart) + .offset(x = (-8).dp) // Move even further left to minimize margin ) { Row( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = Icons.Filled.ArrowBackIos, + imageVector = Icons.Filled.ArrowBack, contentDescription = "Back", - modifier = Modifier.size(14.dp), + modifier = Modifier.size(16.dp), tint = colorScheme.primary ) + Spacer(modifier = Modifier.width(4.dp)) Text( text = "back", style = MaterialTheme.typography.bodyMedium, @@ -273,24 +276,28 @@ private fun ChannelHeader( val colorScheme = MaterialTheme.colorScheme Box(modifier = Modifier.fillMaxWidth()) { - // Back button - positioned on the left + // Back button - positioned all the way to the left with minimal margin Button( onClick = onBackClick, colors = ButtonDefaults.buttonColors( containerColor = Color.Transparent, contentColor = colorScheme.primary ), - modifier = Modifier.align(Alignment.CenterStart) + contentPadding = PaddingValues(horizontal = 4.dp, vertical = 4.dp), // Reduced horizontal padding + modifier = Modifier + .align(Alignment.CenterStart) + .offset(x = (-8).dp) // Move even further left to minimize margin ) { Row( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = Icons.Filled.ArrowBackIos, + imageVector = Icons.Filled.ArrowBack, contentDescription = "Back", - modifier = Modifier.size(14.dp), + modifier = Modifier.size(16.dp), tint = colorScheme.primary - ) + ) + Spacer(modifier = Modifier.width(4.dp)) Text( text = "back", style = MaterialTheme.typography.bodyMedium, From 50995c670f34a0e5197fe463eb45da52334221d4 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:55:14 +0200 Subject: [PATCH 17/18] orange --- app/src/main/java/com/bitchat/android/ui/ChatHeader.kt | 8 ++++---- app/src/main/java/com/bitchat/android/ui/ChatUIUtils.kt | 2 +- .../main/java/com/bitchat/android/ui/InputComponents.kt | 6 +++--- .../main/java/com/bitchat/android/ui/SidebarComponents.kt | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt index 537d4afb..d4372157 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatHeader.kt @@ -103,7 +103,7 @@ fun PeerCounter( imageVector = Icons.Filled.Email, contentDescription = "Unread private messages", modifier = Modifier.size(16.dp), - tint = Color(0xFFFF8C00) // Orange to match private message theme + tint = Color(0xFFFF9500) // Orange to match private message theme ) Spacer(modifier = Modifier.width(6.dp)) } @@ -241,13 +241,13 @@ private fun PrivateChatHeader( imageVector = Icons.Filled.Lock, contentDescription = "Private chat", modifier = Modifier.size(16.dp), - tint = Color(0xFFFF8C00) // Orange to match private message theme + tint = Color(0xFFFF9500) // Orange to match private message theme ) Spacer(modifier = Modifier.width(4.dp)) Text( text = peerNickname, style = MaterialTheme.typography.titleMedium, - color = Color(0xFFFF8C00) // Orange + color = Color(0xFFFF9500) // Orange ) } @@ -310,7 +310,7 @@ private fun ChannelHeader( Text( text = "channel: $channel", style = MaterialTheme.typography.titleMedium, - color = Color(0xFFFF8C00), // Orange to match input field + color = Color(0xFFFF9500), // Orange to match input field modifier = Modifier .align(Alignment.Center) .clickable { onSidebarClick() } diff --git a/app/src/main/java/com/bitchat/android/ui/ChatUIUtils.kt b/app/src/main/java/com/bitchat/android/ui/ChatUIUtils.kt index 6972106f..9d0a1476 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatUIUtils.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatUIUtils.kt @@ -139,7 +139,7 @@ private fun appendFormattedContent( } "mention" -> { builder.pushStyle(SpanStyle( - color = Color(0xFFFF8C00), // Orange + color = Color(0xFFFF9500), // Orange fontSize = 14.sp, fontWeight = FontWeight.SemiBold )) diff --git a/app/src/main/java/com/bitchat/android/ui/InputComponents.kt b/app/src/main/java/com/bitchat/android/ui/InputComponents.kt index e7706218..ede412bf 100644 --- a/app/src/main/java/com/bitchat/android/ui/InputComponents.kt +++ b/app/src/main/java/com/bitchat/android/ui/InputComponents.kt @@ -49,8 +49,8 @@ fun MessageInput( text = "<@$nickname>", // No arrow for both private and channel style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Medium), color = when { - selectedPrivatePeer != null -> Color(0xFFFF8C00) // Orange for private - currentChannel != null -> Color(0xFFFF8C00) // Orange for channels too + selectedPrivatePeer != null -> Color(0xFFFF9500) // Orange for private + currentChannel != null -> Color(0xFFFF9500) // Orange for channels too else -> colorScheme.primary }, fontFamily = FontFamily.Monospace @@ -85,7 +85,7 @@ fun MessageInput( .background( color = if (selectedPrivatePeer != null || currentChannel != null) { // Orange for both private messages and channels to match nickname color - Color(0xFFFF8C00).copy(alpha = 0.75f) + Color(0xFFFF9500).copy(alpha = 0.75f) } else if (colorScheme.background == Color.Black) { Color(0xFF00FF00).copy(alpha = 0.75f) // Bright green for dark theme } else { diff --git a/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt b/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt index b32821cc..a7ee2c4f 100644 --- a/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt +++ b/app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt @@ -320,7 +320,7 @@ private fun PeerItem( imageVector = Icons.Filled.Email, contentDescription = "Unread messages", modifier = Modifier.size(16.dp), - tint = Color(0xFFFF8C00) // Orange to match private message theme + tint = Color(0xFFFF9500) // Orange to match private message theme ) } else { // Signal strength indicators From 8e93500823df31f2e04210d868882dba82109562 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:58:30 +0200 Subject: [PATCH 18/18] nice --- app/src/main/java/com/bitchat/android/ui/InputComponents.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/ui/InputComponents.kt b/app/src/main/java/com/bitchat/android/ui/InputComponents.kt index ede412bf..761b502b 100644 --- a/app/src/main/java/com/bitchat/android/ui/InputComponents.kt +++ b/app/src/main/java/com/bitchat/android/ui/InputComponents.kt @@ -53,7 +53,8 @@ fun MessageInput( currentChannel != null -> Color(0xFFFF9500) // Orange for channels too else -> colorScheme.primary }, - fontFamily = FontFamily.Monospace + fontFamily = FontFamily.Monospace, + fontSize = 14.sp ) Spacer(modifier = Modifier.width(8.dp)) @@ -96,7 +97,7 @@ fun MessageInput( contentAlignment = Alignment.Center ) { Icon( - imageVector = Icons.Filled.KeyboardArrowUp, + imageVector = Icons.Filled.KeyboardArrowRight, contentDescription = "Send message", modifier = Modifier.size(20.dp), tint = if (selectedPrivatePeer != null || currentChannel != null) {