Compare commits

..

80 Commits

Author SHA1 Message Date
adbenitez 5ac6fe3ed2 add allow to enable location streaming again, remove dead code 2024-07-07 21:37:51 +02:00
adbenitez b540b5250d Merge remote-tracking branch 'upstream/main' into lite 2024-07-07 21:25:07 +02:00
adbenitez af94274987 update core 2023-11-19 13:51:41 +01:00
adbenitez 08b052aa93 add back 40KiB download limit 2023-11-19 13:18:01 +01:00
adbenitez c4b0b6d9c7 update core 2023-11-17 20:45:46 +01:00
adbenitez 6a4c73c0e6 fix BaseConversationItem 2023-11-17 20:44:39 +01:00
adbenitez 78e1d11801 Merge remote-tracking branch 'upstream/main' into lite 2023-11-17 19:26:07 +01:00
adbenitez 2178e555ca Merge remote-tracking branch 'upstream/main' into lite 2023-10-28 01:41:57 +02:00
adbenitez a3393d43c0 modify release message 2023-10-12 23:24:57 +02:00
adbenitez f63eb3e57f Merge remote-tracking branch 'upstream/main' into lite 2023-10-12 23:11:40 +02:00
adbenitez 8ea9cfe7a1 remove built-in camera 2023-10-11 13:54:21 +02:00
adbenitez 092fd9603f update proguard-rules.pro 2023-10-11 13:25:08 +02:00
adbenitez ed1ba1dce9 remove emoji picker 2023-10-11 13:24:24 +02:00
adbenitez 58b35519cb fix merging bug 2023-10-11 12:58:10 +02:00
adbenitez 07bfa48588 Merge remote-tracking branch 'upstream/feat/verified-1to1' into lite 2023-10-10 18:50:57 +02:00
adbenitez 96851c458a Merge remote-tracking branch 'upstream/main' into lite 2023-10-10 18:44:09 +02:00
adbenitez 56a26a561d update release workflow 2023-07-26 20:21:31 +02:00
adbenitez cf6db57cb8 update submodule 2023-07-26 20:16:47 +02:00
adbenitez 1da9fdc6b4 remove old ndk-make.sh 2023-07-26 20:15:13 +02:00
adbenitez 1c13a564ec remove stickers in the image editor 2023-07-26 20:14:43 +02:00
adbenitez cc2f1f2270 add proguard-rules.pro 2023-07-26 18:43:02 +02:00
adbenitez 3bdd16d224 Merge remote-tracking branch 'upstream/master' into lite 2023-07-26 18:24:39 +02:00
adbenitez 141f326fec Merge remote-tracking branch 'upstream/master' into lite 2022-11-17 01:07:04 -05:00
adbenitez 94c4e0aa92 Merge remote-tracking branch 'upstream/master' into lite 2022-08-25 18:01:12 -04:00
adbenitez fc4d9df3ac Merge remote-tracking branch 'upstream/master' into lite 2022-08-24 02:20:20 -04:00
adbenitez 2590b82f0e Merge remote-tracking branch 'upstream/master' into lite 2022-07-15 03:11:09 -04:00
adbenitez 943d40b92e Merge remote-tracking branch 'upstream/master' into lite 2022-05-17 21:20:40 -04:00
adbenitez acf840c05b Merge remote-tracking branch 'upstream/master' into lite 2022-05-05 02:44:40 -04:00
adbenitez 05f7d6cd98 update submodule 2022-05-05 02:44:11 -04:00
adbenitez 0b4d36f0cf Merge remote-tracking branch 'upstream/master' into lite 2022-05-01 20:25:53 -04:00
adbenitez ee5ce97779 Merge remote-tracking branch 'upstream/master' into lite 2022-04-07 17:44:28 -04:00
adbenitez f32b1f3d95 Merge remote-tracking branch 'upstream/master' into lite 2022-01-29 02:07:06 -05:00
adbenitez 122de0e3ad Merge remote-tracking branch 'upstream/master' into lite 2022-01-18 14:57:26 -05:00
adbenitez 8180aa9b0d tweak release 2021-12-16 14:03:03 -05:00
adbenitez 0bfcfa1444 test release 2021-12-16 13:51:26 -05:00
adbenitez 34a369fa49 test release 2021-12-16 13:43:31 -05:00
adbenitez ccb8b417a6 test release 2021-12-16 13:31:55 -05:00
adbenitez 8d16baed11 test release 2021-12-16 13:25:12 -05:00
adbenitez 81f7022957 test release 2021-12-16 13:16:47 -05:00
adbenitez b1dd60607b tweak release 2021-12-16 13:07:06 -05:00
adbenitez 557053a25d tweak release 2021-12-16 12:57:29 -05:00
adbenitez aa61597804 tweak release 2021-12-16 12:38:45 -05:00
adbenitez 1fbf04ed28 tweak release 2021-12-16 12:25:43 -05:00
adbenitez 06420e032d try to fix CI 2021-12-16 12:13:11 -05:00
adbenitez 86d1350c64 fix release.yml 2021-12-16 01:31:56 -05:00
adbenitez d896955077 fix release.yml 2021-12-16 00:27:54 -05:00
adbenitez 9a42c26697 update version name 2021-12-16 00:14:59 -05:00
adbenitez 8db5e2ce01 improve release process, generate split apks for each arch 2021-12-16 00:14:16 -05:00
adbenitez d4d5655e72 Merge remote-tracking branch 'upstream/master' into lite 2021-12-15 12:31:19 -05:00
adbenitez 91c53ab5cf tweak CI 2021-11-12 15:52:54 -05:00
adbenitez e02674b2ca fix CI 2021-11-12 15:49:52 -05:00
adbenitez 360dcf5bc7 Merge remote-tracking branch 'upstream/master' into lite 2021-11-12 01:17:05 -05:00
adbenitez 17a5f9a266 fix crash when opening Advanced settings 2021-11-08 20:00:15 -05:00
adbenitez 46df7e5ab2 update build.gradle 2021-11-08 19:37:38 -05:00
adbenitez 33ff464028 Merge remote-tracking branch 'upstream/master' into lite 2021-11-08 17:30:58 -05:00
adbenitez c6c49da1f2 Merge remote-tracking branch 'upstream/master' into lite 2021-10-24 02:59:52 -04:00
adbenitez c7912a0df7 Merge remote-tracking branch 'upstream/master' into lite 2021-10-15 16:25:12 -04:00
adbenitez 459e57f56c Merge remote-tracking branch 'upstream/master' into lite 2021-10-03 02:32:27 -04:00
adbenitez a0ff8043b0 update version number 2021-09-13 21:56:05 -04:00
adbenitez 9d75045fec Merge remote-tracking branch 'upstream/master' into lite 2021-09-13 21:45:32 -04:00
adbenitez b8b3deaad0 update version name 2021-08-20 16:30:49 -04:00
adbenitez df82368327 add missing import 2021-08-20 16:29:08 -04:00
adbenitez 377060afe1 Merge remote-tracking branch 'upstream/master' into lite 2021-08-20 16:19:17 -04:00
adbenitez 06800d24ab Merge remote-tracking branch 'upstream/master' into lite 2021-06-25 19:11:16 -04:00
adbenitez 030b08ddd1 update submodule 2021-05-22 18:33:22 -04:00
adbenitez 67cc39b648 Merge remote-tracking branch 'upstream/master' into lite 2021-05-22 18:27:28 -04:00
adbenitez 34d20b6c78 Merge remote-tracking branch 'upstream/master' into lite 2021-05-22 15:08:22 -04:00
adbenitez 3e64619ec5 Merge remote-tracking branch 'upstream/master' into lite 2021-04-22 15:13:46 -04:00
adbenitez f167e6d1d8 update version name 2021-04-15 14:02:41 -04:00
adbenitez 0f3d00abfa remove APNG and animated webp support 2021-04-15 13:59:34 -04:00
adbenitez f5932f7d42 Merge remote-tracking branch 'upstream/master' into lite 2021-04-15 13:58:56 -04:00
adbenitez 912fb3e595 update release.yml 2021-04-15 13:56:21 -04:00
adbenitez b5c688232b don't requests location permission 2021-03-27 23:18:27 -04:00
adbenitez 4cbf12068b delete maps 2021-03-27 00:01:11 -04:00
adbenitez 97ad251cd9 update version number 2021-03-26 15:46:32 -04:00
adbenitez bdc71b965e update release.yml 2021-03-26 15:44:02 -04:00
adbenitez 4f84efbfff tweak AudioCodec.java 2021-03-26 15:15:26 -04:00
adbenitez e91bc5d3b7 Merge remote-tracking branch 'upstream/master' into lite 2021-03-26 14:41:32 -04:00
adbenitez dc08de5b3f update submodule 2021-02-06 19:47:38 -05:00
adbenitez df03a7456f Merge remote-tracking branch 'upstream/master' into lite 2021-02-06 19:46:33 -05:00
1317 changed files with 64139 additions and 89870 deletions
-3
View File
@@ -1,3 +0,0 @@
ko_fi: adbenitez
liberapay: adbenitez
custom: "https://arcanechat.me/#contribute"
+7 -2
View File
@@ -7,12 +7,14 @@ labels: bug
---
<!--
This is a bug report tracker. New features are discussed in the forum: https://support.delta.chat
Please fill out as much of this form as you can (leaving out stuff that is not applicable is ok).
-->
- Android version:
- Device:
- ArcaneChat version:
- Delta Chat version:
- Expected behavior:
- Actual behavior:
- Steps to reproduce the problem:
@@ -20,9 +22,12 @@ Please fill out as much of this form as you can (leaving out stuff that is not a
- Logs:
<!--
Debug logs can be copied from within the app with
Debug logs can be copied from within the Delta Chat app with
Settings menu -> Advanced -> View log
Alternatively from the Android system log:
`adb logcat -v time -s DeltaChat`
Logs may contain private data
which shall be removed or anonymised prior to posting.
-->
+8 -1
View File
@@ -1 +1,8 @@
blank_issues_enabled: false
blank_issues_enabled: true
contact_links:
- name: Feature requests
url: https://support.delta.chat/c/features/6
about: Please discuss feature requests on our Community forum.
- name: General Questions
url: https://support.delta.chat/c/help/5
about: Please ask general Questions on our Community forum.
-15
View File
@@ -1,15 +0,0 @@
---
name: Feature request
about: Request a new feature.
title: ''
assignees: ''
labels: enhancement
---
<!--
Please fill out as much of this form as you can (leaving out stuff that is not applicable is ok).
-->
### Describe your feature:
### Why do you think it is useful:
-6
View File
@@ -1,6 +0,0 @@
---
name: Other
about: Start with a new blank issue.
title: ''
assignees: ''
---
-314
View File
@@ -1,314 +0,0 @@
# GitHub Copilot Instructions for ArcaneChat Android
## Project Overview
ArcaneChat is a Delta Chat Android client built on top of the official Delta Chat client with several improvements. It is a messenger app that uses email infrastructure for secure communication.
**Technology Stack:**
- **Language:** Java (Java 8 compatibility)
- **Build System:** Gradle with Android Gradle Plugin 8.11.1
- **Min SDK:** 21 (Android 5.0)
- **Target SDK:** 36 (Android 16)
- **NDK Version:** 27.0.12077973
- **Native Components:** Rust (deltachat-core-rust submodule)
- **UI Framework:** Android SDK, Material Design Components
- **Testing:** JUnit 4, Espresso, Mockito, PowerMock, AssertJ
## Repository Structure
- `src/main/` - Main application source code
- `src/main/java/org/thoughtcrime/securesms/` - Main UI components
- `src/main/java/com/b44t/messenger/` - Delta Chat core integration
- `src/main/java/chat/delta/rpc/` - JSON-RPC bindings (generated, don't edit manually)
- `src/main/res/` - Android resources (layouts, strings, drawables)
- `src/androidTest/` - Instrumented tests (UI tests, benchmarks)
- `src/androidTest/java/com/b44t/messenger/uitests/` - UI tests
- `src/androidTest/java/com/b44t/messenger/uibenchmarks/` - Performance benchmarks
- `src/gplay/` - Google Play flavor-specific code
- `src/foss/` - F-Droid/FOSS flavor-specific code
- `jni/deltachat-core-rust/` - Native Rust core library (submodule, **don't edit directly**)
- `scripts/` - Build and helper scripts
- `scripts/ndk-make.sh` - Build native libraries
- `scripts/install-toolchains.sh` - Install Rust cross-compilation toolchains
- `scripts/generate-rpc-bindings.sh` - Generate JSON-RPC bindings
- `docs/` - Documentation
- `fastlane/` - App store metadata and screenshots
- `.github/workflows/` - CI/CD workflows (GitHub Actions)
## Build Instructions
### Prerequisites
1. **Initialize submodules:**
```bash
git submodule update --init --recursive
```
This MUST be done first before any build attempts.
2. **Set up environment variables:**
```bash
export ANDROID_NDK_ROOT=/path/to/ndk/27.0.12077973
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
Note: Path format varies by OS (linux-x86_64, darwin-x86_64, etc.)
3. **Install Rust toolchains:**
```bash
scripts/install-toolchains.sh
```
Required for building the native Rust components.
4. **Build native libraries:**
```bash
scripts/ndk-make.sh
```
**IMPORTANT:** First run takes 30-60 minutes as it builds for all architectures (armeabi-v7a, arm64-v8a, x86, x86_64).
For faster development builds, build for a single architecture:
```bash
scripts/ndk-make.sh armeabi-v7a
```
5. **Build APK:**
```bash
./gradlew assembleDebug
```
Build time: ~2-5 minutes after native libraries are built.
### Build Flavors
- **gplay:** Google Play version with Firebase Cloud Messaging (applicationId: `com.github.arcanechat`)
- **foss:** F-Droid version without proprietary services (applicationId: `chat.delta.lite`)
### Build Outputs
- Debug APKs: `build/outputs/apk/gplay/debug/` and `build/outputs/apk/fat/debug/`
- Release APKs require signing configuration in `~/.gradle/gradle.properties`
### Common Build Issues
1. **Missing NDK or incorrect version:**
- Error: `ANDROID_NDK_ROOT not set` or native library missing
- Solution: Install NDK 27.0.12077973 and set ANDROID_NDK_ROOT environment variable
2. **Submodules not initialized:**
- Error: Missing deltachat-core-rust files
- Solution: Run `git submodule update --init --recursive`
3. **Gradle wrapper validation:**
- Always validate gradle wrapper before building: `./gradlew wrapper --gradle-version=current`
- Wrapper is validated in CI via `gradle/actions/wrapper-validation@v4`
4. **Clean build issues:**
- If build fails, try: `./gradlew clean && scripts/ndk-make.sh && ./gradlew assembleDebug`
- Remove `build/` directory if clean doesn't work
## Testing
### Running Unit Tests
```bash
./gradlew test
```
Expected duration: 1-3 minutes
### Running Instrumented Tests
1. **Disable animations** on your device/emulator:
- Developer Options → Set "Window animation scale", "Transition animation scale", and "Animator duration scale" to 0x
- **CRITICAL:** Tests will fail if animations are enabled
2. **Run tests:**
```bash
./gradlew connectedAndroidTest
```
Expected duration: 10-30 minutes depending on device/emulator
### Online Tests
Some tests require real email credentials. Configure in `~/.gradle/gradle.properties`:
```properties
TEST_ADDR=youraccount@yourdomain.org
TEST_MAIL_PW=yourpassword
```
### UI Tests and Benchmarks
- Located in `src/androidTest/java/com/b44t/messenger/`
- Test categories: `uitests/online/`, `uitests/offline/`, `uibenchmarks/`
- Run via Android Studio: Run → Edit Configurations → Android Instrumented Test
## Coding Conventions
### General Guidelines
1. **Embrace existing style:** Match the coding style of the file you're editing
2. **Minimize changes:** Don't refactor or rename in the same PR as bug fixes/features
3. **Readable over paradigmatic:** Favor readability over strict Java patterns
4. **Avoid premature optimization:** Keep things simple and on point
5. **No excessive abstraction:** Avoid unnecessary factories, one-liner functions, or abstraction layers
6. **Comments:** Only add comments if they match existing style or explain complex logic
### Architecture
- **UI/Model Separation:** Delta Chat Core (Rust) handles the model layer
- **High-level interface:** Core provides data in UI-ready form; avoid additional transformations in UI layer
- **Direct approach:** Prefer direct implementation over excessive class hierarchies
### Key Principles
- Work hard to avoid options and up-front choices
- Avoid speaking about keys/encryption in primary UI
- App must work offline and with poor network
- Users don't read much text
- Consistency matters
- Primary UI should only show highly useful features
## Common Development Tasks
### Adding New Features
1. Consider the UX philosophy (minimal options, offline-first, simplicity)
2. Check if core library changes are needed before implementing in UI
3. Match existing code style in modified files
4. Add instrumented tests for UI changes when appropriate
5. Update relevant documentation
### Modifying Core Integration
- Core library is in `jni/deltachat-core-rust/` submodule
- Java bindings are in `src/main/java/com/b44t/messenger/Dc*.java`
- JSON-RPC bindings in `chat.delta.rpc.*` package (generated via dcrpcgen)
### Generating JSON-RPC Bindings
To regenerate JSON-RPC bindings after core changes:
```bash
./scripts/generate-rpc-bindings.sh
```
**Note:** Requires Rust tooling and [dcrpcgen tool](https://github.com/chatmail/dcrpcgen) installed
### Working with Translations
- Translations managed via Transifex (not in repository)
- English source strings: `res/values/strings.xml`
- Don't mix string changes with refactoring
### Debugging Native Code
Decode crash symbols:
```bash
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
```
## Validation and Quality Checks
### Pre-commit Checks
Before committing changes, always run:
1. **Gradle wrapper validation:**
```bash
./gradlew wrapper --gradle-version=current
```
2. **Build verification:**
```bash
./gradlew assembleDebug
```
3. **Unit tests:**
```bash
./gradlew test
```
4. **Code style:** Match existing code style in modified files (no automatic formatter configured)
### When to Rebuild Native Libraries
Rebuild native libraries (`scripts/ndk-make.sh`) when:
- Updating deltachat-core-rust submodule
- Modifying anything in `jni/` directory
- Changing NDK version
- After `git clean -fdx` or fresh clone
**DO NOT** rebuild native libraries for:
- Pure Java/Kotlin code changes
- Resource file changes
- Gradle configuration changes (unless changing native library linking)
- Documentation updates
## WebXDC Support
ArcaneChat has extended WebXDC support:
- `window.webxdc.arcanechat` - Version detection
- `sendToChat()` - Extra properties: `subject`, `html`, `type` (sticker/image/audio/video/file)
- External link support in apps
- `manifest.toml` - `orientation` field for landscape mode
## Important Files
- `build.gradle` - Main build configuration (Android Gradle Plugin 8.11.1, Java 8 compatibility)
- `CONTRIBUTING.md` - Contribution guidelines
- `BUILDING.md` - Detailed build setup instructions
- `RELEASE.md` - Release process
- `proguard-rules.pro` - ProGuard configuration (enabled for both debug and release)
- `google-services.json` - Firebase configuration (gplay flavor only)
- `settings.gradle` - Gradle settings
- `.github/workflows/` - CI/CD configuration
## Dependencies and Constraints
- **Java Version:** Java 8 compatibility (do not use Java 9+ features)
- **Gradle:** Use wrapper (`./gradlew`) to ensure correct Gradle version
- **NDK:** Must use version 27.0.12077973 (specified in build.gradle)
- **Min SDK:** 21 (Android 5.0) - code must be compatible
- **Target SDK:** 36 (Android 16) - test on this API level when possible
- **ProGuard:** Always enabled - ensure ProGuard rules are correct for new dependencies
- **Multi-dex:** Enabled - app exceeds 65k method limit
## Package Structure
- `org.thoughtcrime.securesms.*` - Main UI components (legacy namespace from Signal)
- `com.b44t.messenger.*` - Delta Chat core integration
- `chat.delta.rpc.*` - JSON-RPC bindings (generated)
## Notes for AI Assistants
- This is a fork of Delta Chat Android with ArcaneChat-specific improvements
- Maintain compatibility with Delta Chat core library
- Test on both gplay and foss flavors when making changes
- Native library must be rebuilt after core changes
- ProGuard is enabled in both debug and release builds
- Multi-dex is enabled due to app size
## CI/CD Workflows
### Preview APK Workflow (.github/workflows/preview-apk.yml)
Runs on every pull request to build and upload a preview APK:
1. **Setup steps:**
- Checks out repository with submodules
- Validates Fastlane metadata
- Sets up Rust cache (working-directory: jni/deltachat-core-rust)
- Sets up Java 17 (Temurin distribution)
- Sets up Android SDK
- Caches Gradle dependencies
- Sets up NDK r27
2. **Build process:**
```bash
scripts/install-toolchains.sh && scripts/ndk-make.sh armeabi-v7a
./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
```
Note: Builds only armeabi-v7a for faster CI builds
3. **Output:** Uploads APK artifact to GitHub Actions
### Important CI Considerations
- Always validate Gradle wrapper before committing changes
- Fastlane metadata must be valid (validated in CI)
- Use `--no-daemon` flag for Gradle in CI environments
- CI builds use FOSS flavor to avoid Google Services dependencies
- Expected CI build time: 15-25 minutes for full workflow
-22
View File
@@ -1,22 +0,0 @@
version: 2
mergeable:
- when: pull_request.*
name: "Changelog check"
validate:
- do: or
validate:
- do: description
must_include:
regex: '#skip-changelog'
- do: and
validate:
- do: dependent
changed:
file: '**/*.java'
required: ['CHANGELOG.md']
fail:
- do: checks
status: 'action_required'
payload:
title: CHANGELOG.md might need an update
summary: "Please update CHANGELOG.md or add #skip-changelog to the description"
+20
View File
@@ -0,0 +1,20 @@
name: add artifact links to pull request
on:
workflow_run:
workflows: ["Upload Preview APK"]
types: [completed]
jobs:
artifacts-url-comments:
name: add artifact links to pull request
runs-on: windows-2019
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- name: add artifact links to pull request
uses: tonyhallett/artifacts-url-comments@v1.1.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
prefix: "**To test the changes in this pull request, install this apk:**"
format: "[📦 {name}]({url})"
addTo: pull
-53
View File
@@ -1,53 +0,0 @@
name: Core Cache
on:
push:
branches: [main]
paths:
- 'jni/deltachat-core-rust'
- 'jni/Android.mk'
- 'jni/Application.mk'
- 'jni/dc_wrapper.c'
- 'scripts/ndk-make.sh'
permissions: {}
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: recursive
persist-credentials: false
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
id: setup-ndk
with:
ndk-version: "r29"
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
with:
workspaces: jni/deltachat-core-rust
- name: Get deltachat-core-rust submodule hash
id: core-hash
run: echo "hash=$(git rev-parse HEAD:jni/deltachat-core-rust)" >> $GITHUB_OUTPUT
- name: Cache compiled core
id: cache-core
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
jni/arm64-v8a
libs/arm64-v8a
key: core-arm64-v8a-${{ steps.core-hash.outputs.hash }}-${{ hashFiles('jni/Android.mk', 'jni/Application.mk', 'jni/dc_wrapper.c', 'scripts/ndk-make.sh') }}-ndk-r27
- name: Compile core
if: steps.cache-core.outputs.cache-hit != 'true'
env:
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
run: |
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
scripts/install-toolchains.sh && scripts/ndk-make.sh arm64-v8a
-49
View File
@@ -1,49 +0,0 @@
name: Code Format
on:
push:
branches: [main]
pull_request:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
jobs:
spotless:
name: Check code format (Spotless)
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with:
java-version: 17
distribution: temurin
- name: Restore Gradle cache
id: gradle-cache
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
- name: Check formatting
run: ./gradlew spotlessCheck
- name: Save Gradle cache
if: github.event_name == 'push' && steps.gradle-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+20 -64
View File
@@ -2,34 +2,27 @@ name: Upload Preview APK
on: pull_request
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
permissions: {}
jobs:
build:
name: Upload Preview APK
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.1
with:
access_token: ${{ github.token }}
- uses: actions/checkout@v3
with:
submodules: recursive
persist-credentials: false
- name: Validate Fastlane Metadata
uses: ashutoshgngwr/validate-fastlane-supply-metadata@c8857fdbbd3e00f9a5cbe8604bcecfa95ce8fef8 # v2.1.0
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
- uses: Swatinem/rust-cache@v2
with:
working-directory: jni/deltachat-core-rust
- uses: actions/setup-java@v3
with:
java-version: 17
distribution: 'temurin'
- uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
- uses: android-actions/setup-android@v3
- uses: actions/cache@v3
with:
path: |
~/.gradle/caches
@@ -37,63 +30,26 @@ jobs:
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: "r29"
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
with:
workspaces: jni/deltachat-core-rust
- name: Get deltachat-core-rust submodule hash
id: core-hash
run: echo "hash=$(git rev-parse HEAD:jni/deltachat-core-rust)" >> $GITHUB_OUTPUT
- name: Restore compiled core
id: core-cache
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
jni/arm64-v8a
libs/arm64-v8a
key: core-arm64-v8a-${{ steps.core-hash.outputs.hash }}-${{ hashFiles('jni/Android.mk', 'jni/Application.mk', 'jni/dc_wrapper.c', 'scripts/ndk-make.sh') }}-ndk-r27
ndk-version: r23c
- name: Compile core
if: steps.core-cache.outputs.cache-hit != 'true'
env:
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
run: |
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
scripts/install-toolchains.sh && scripts/ndk-make.sh arm64-v8a
scripts/install-toolchains.sh && scripts/ndk-make.sh
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Build APK
run: ./gradlew --no-daemon -PABI_FILTER=arm64-v8a assembleFossDebug
run: ./gradlew --no-daemon assembleGplayDebug
- name: Upload APK
id: upload
if: github.event.pull_request.head.repo.full_name == github.repository
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@v3
with:
name: app-preview.apk
path: 'build/outputs/apk/foss/debug/*.apk'
- name: Add artifact links to PR
if: github.event.pull_request.head.repo.full_name == github.repository
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env:
ARTIFACT_URL: ${{ steps.upload.outputs.artifact-url }}
with:
script: |
const url = process.env.ARTIFACT_URL;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `**To test the changes in this pull request, install this apk:**\n\n[📦 app-preview.apk](${url})`,
});
path: 'build/outputs/apk/gplay/debug/*.apk'
+17 -26
View File
@@ -23,21 +23,20 @@ jobs:
name: Upload Release APK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v2
with:
submodules: recursive
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
- uses: Swatinem/rust-cache@v1
with:
working-directory: jni/deltachat-core-rust
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
- uses: actions/setup-java@v1.4.3
with:
java-version: 17
distribution: 'temurin'
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
java-version: 11
- uses: android-actions/setup-android@v2
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r27
ndk-version: r23c
- name: Compile core
env:
@@ -49,26 +48,18 @@ jobs:
- name: Build APK
run: |
mkdir -p ~/.gradle
echo -n ${{ secrets.KEYSTORE_FILE }} | base64 -d >> ~/keystore.jks
echo "DC_RELEASE_STORE_FILE=$HOME/keystore.jks" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_STORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS_FDROID=${{ secrets.ALIAS_FDROID }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS_GPLAY=${{ secrets.ALIAS_GPLAY }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> ~/.gradle/gradle.properties
./gradlew assembleFossRelease
rm build/outputs/apk/foss/release/*universal*
./gradlew assembleGplayRelease
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
mv build/outputs/mapping/fossRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-foss.txt
mv build/outputs/mapping/gplayRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-gplay.txt
echo -n ${{ secrets.SIGNING_KEY }} | base64 -d >> ~/app.keystore
echo "DC_RELEASE_STORE_FILE=$HOME/app.keystore" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_STORE_PASSWORD=${{ secrets.KEY_STORE_PASSWORD }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS=${{ secrets.ALIAS }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> ~/.gradle/gradle.properties
./gradlew --no-daemon assembleFossRelease
- name: Release on GitHub
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
- name: Release
uses: softprops/action-gh-release@v1
with:
token: "${{ secrets.GITHUB_TOKEN }}"
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
body: "WARNING: DeltaChat Lite is not DeltaLab! it is a lightweight version of Delta Chat"
prerelease: ${{ contains(github.event.ref, '-beta') }}
fail_on_unmatched_files: true
files: |
build/outputs/apk/foss/release/*.apk
build/outputs/mapping/fossRelease/mapping-*.txt
files: build/outputs/apk/foss/release/*.apk
-26
View File
@@ -1,26 +0,0 @@
name: GitHub Actions Security Analysis with zizmor
on:
push:
branches: ["main"]
pull_request:
branches: ["**"]
permissions: {}
jobs:
zizmor:
name: Run zizmor
runs-on: ubuntu-latest
permissions:
security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files.
contents: read
actions: read
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Run zizmor
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
-6
View File
@@ -1,6 +0,0 @@
rules:
unpinned-uses:
config:
policies:
actions/*: ref-pin
dependabot/*: ref-pin
+1 -3
View File
@@ -46,6 +46,4 @@ jni/armeabi
jni/armeabi-v7a
jni/arm64-v8a
artwork/drawable*/
artwork/mipmap-*/
*~
*~
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "jni/deltachat-core-rust"]
path = jni/deltachat-core-rust
url = https://github.com/ArcaneChat/core
url = https://github.com/adbenitez/deltalab-core
-257
View File
@@ -1,257 +0,0 @@
# Building and Testing
This document describes how to set up the build environment,
build and test the app. Before diving into developing, please
first read [CONTRIBUTING.md](./CONTRIBUTING.md) for general
contribution hints and conventions.
Please follow all steps precisely.
If you run into troubles,
ask on one of the [communication channels](https://delta.chat/contribute) for help
## Check Out Repository
When checking out _deltachat-android_, make sure also to check out the
subproject _deltachat-core-rust_:
- When using Git, you can do this initially by
`$ git clone --recursive https://github.com/deltachat/deltachat-android`
or later by `git submodule update --init --recursive`. If you do this in your
home directory, this results in the folder `~/deltachat-android` which is just fine.
## Generate JSON-RPC bindings
To generate/update the JSON-RPC bindings (ex. `chat.delta.rpc.*` package)
install Rust tooling (read sections below) and the [dcrpcgen tool](https://github.com/chatmail/dcrpcgen)
then generate the code running the script:
```
./scripts/update-rpc-bindings.sh
```
## Build Using Nix
The repository contains [Nix](https://nixos.org/) development environment
described in `flake.nix` file.
If you don't have Nix installed,
the easiest way is to follow the [Lix installation instructions](https://lix.systems/install/)
as this results in a setup with [Flakes](https://nixos.wiki/wiki/Flakes) feature enabled out of the box
and can be cleanly uninstalled with `/nix/nix-installer uninstall` once you don't need it anymore.
Once you have Nix with Flakes feature set up start the development environment shell:
```
nix develop
```
Nix development environment contains Rust with cross-compilation toolchains and Android SDK.
To [build an APK](https://developer.android.com/studio/build/building-cmdline) run the following 2 steps.
Note that the first step may take some time to build for all architectures. You can optionally read
[the first comment block in the `ndk-make.sh` script](./scripts/ndk-make.sh)
for pointers on how to build for a specific architecture.
```
$ scripts/ndk-make.sh
$ ./gradlew assembleDebug
```
Resulting APK files can be found in
`build/outputs/apk/gplay/debug/` and
`build/outputs/apk/foss/debug/`.
## Build Using Dockerfile
Another way to build APK is to use provided `Dockerfile`
with [Docker](https://www.docker.com/) or [Podman](https://podman.io/).
Podman is a drop-in replacement for Docker that does not require root privileges.
If you don't have Docker or Podman setup yet, read [how to setup Podman](#setup-podman)
below. If you don't want to use Docker or Podman, read [how to manually install the
build environment](#install-build-environment).
First, build the image `deltachat-android` by running
```
podman build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
```
or
```
docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
```
Then, run the image:
```
podman run --userns=keep-id -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
```
or
```
docker run -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
```
You can leave the container with Ctrl+D or by typing `exit` and re-enter it with
`docker start -ia deltachat` or `podman start -ia deltachat`.
Within the container, install toolchains and build the native library:
```
deltachat@6012dcb974fe:/home/app$ scripts/install-toolchains.sh
deltachat@6012dcb974fe:/home/app$ scripts/ndk-make.sh
```
Then, [build an APK](https://developer.android.com/studio/build/building-cmdline):
```
deltachat@6012dcb974fe:/home/app$ ./gradlew assembleDebug
```
### Troubleshooting
- Executing `./gradlew assembleDebug` inside the container fails with `The SDK directory '/home/user/Android/Sdk' does not exist.`:
The problem is that Android Studio (outside the container) automatically creates a file `local.properties` with a content like `sdk.dir=/home/username/Android/Sdk`,
so, Gradle-inside-the-container looks for the Sdk at `/home/username/Android/Sdk`, where it can't find it.
You could:
- either: remove the file or just the line starting with `sdk.dir`
- or: run `./gradlew assembleDebug` from outside the container (however, there may be incompatibility issues if different versions are installed inside and outside the container)
- Running the image fails with `ERRO[0000] The storage 'driver' option must be set in /etc/containers/storage.conf, guarantee proper operation.`:
In /etc/containers/storage.conf, replace the line: `driver = ""` with: `driver = "overlay"`.
You can also set the `driver` option to something else, you just need to set it to _something_.
[Read about possible options here](https://github.com/containers/storage/blob/main/docs/containers-storage.conf.5.md#storage-table).
## <a name="setup-podman"></a>Setup Podman
These instructions were only tested on a Manjaro machine so far. If anything doesn't work, please open an issue.
First, [Install Podman](https://podman.io/getting-started/installation).
Then, if you want to run Podman without root, run:
```
sudo touch /etc/subgid
sudo touch /etc/subuid
sudo usermod --add-subuids 165536-231072 --add-subgids 165536-231072 yourusername
```
(replace `yourusername` with your username).
See https://wiki.archlinux.org/index.php/Podman#Rootless_Podman for more information.
## <a name="install-build-environment"></a>Install Build Environment (without Docker or Podman)
To setup build environment manually:
- _Either_, in Android Studio, go to "Tools / SDK Manager / SDK Tools", enable "Show Package Details",
select "CMake" and the desired NDK (install the same NDK version as the [Dockerfile](./Dockerfile)), hit "Apply".
- _Or_ read [Dockerfile](./Dockerfile) and mimic what it does.
Then, in both cases, install Rust using [rustup](https://rustup.rs/)
and Rust toolchains for cross-compilation by executing `scripts/install-toolchains.sh`.
Then, configure `ANDROID_NDK_ROOT` environment variable to point to the Android NDK
installation directory e.g. by adding this to your `.bashrc`:
```bash
export ANDROID_NDK_ROOT=${HOME}/Android/Sdk/ndk/[version] # (or wherever your NDK is) Note that there is no `/` at the end!
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
After that, call `scripts/ndk-make.sh` in the root directory to build core-rust.
Afterwards run the project in Android Studio. The project requires API 25.
With chance, that's it :) - if not, read on how to set up a proper development
environment.
## Install Development Environment
1. Some libs required by Android Studio may be missing on 64 bit Linux machines
[Source](https://developer.android.com/studio/install.html)], so for Ubuntu execute
`$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386`
and for Fedora execute
`$ sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686`.
2. Download Android Studio from <https://developer.android.com> (android-studio-ide-...-linux.zip)
and unpack the archive which contains a single folder called `android-studio`;
move this folder e.g. to `~/android-studio`.
3. To launch Android Studio for the first time, open a terminal, navigate to
`~/android-studio/bin`, execute `./studio.sh` and use all the standard values
from the wizard.
4. Android Studio now asks you if you want to open an existing project;
choose `~/deltachat-android` as created in the "Build" chapter (Android Studio starts to
build the project, however, there are some steps missing before this will
succeed).
5. If components are missing, click on the corresponding error
message and install eg. required SDKs and the "Build-Tools" (you should
also find the option at "Tools / Android / SDK Manager / SDK Platforms").
Now the build should succeed - but the app still misses the native part.
6. Download Android NDK from
[NDK Archives](https://developer.android.com/ndk/downloads)
and extract the archive containing a single folder
called something like `android-ndk-r23b-linux`; move this folder e.g. to `~/android-ndk`.
7. Export the folder path to your environment as `ANDROID_NDK_ROOT` and add it to `PATH`.
You can achieve this e.g. by adding this to your `.bashrc`
```bash
export ANDROID_NDK_ROOT=${HOME}/android-ndk
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
## Run UI Tests and Benchmarks
- You don't necessarily need a dedicated testing device.
Backup your current account first, maybe there are some bugs in switching accounts.
- You can run benchmarks on either an emulated device or a real device.
You need at least Android 9. For better benchmark results,
you should run the benchmark on a real device and make sure that the core is compiled in release mode.
- Disable animations on your device, otherwise the test may fail:
at "Developer options"
set all of "Window animation scale", "Transition animation scale" and "Animator duration scale" to 0x
- In Android Studio: "File" / "Sync project with gradle files"
- In Android Studio: "Run" / "Edit configurations" / "+" / "Android Instrumented test":
Either select a specific class or select "All in Module" / "OK" /
Select your configuration in the toolbar / Click on the green "run" button in the toolbar to run the tests
### Get the benchmark results
When the benchmark is done, you will get a result like
`MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: 11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`.
You can paste `11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`
into a cell in a LibreOffice spreadsheet, do "Data" / "Text to columns",
choose `,` as a separator, hit "OK", and create a diagram.
### Run online tests
For some tests, you need to provide the credentials to an actual email account.
You have 2 ways to do this:
1. (Recommended): Put them into the file ~/.gradle/gradle.properties (create it if it doesn't exist):
```
TEST_ADDR=youraccount@yourdomain.org
TEST_MAIL_PW=youpassword
```
2. Or set them via environment variables.
## Decoding Symbols in Crash Reports
```
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
```
`obj/local/armeabi-v7a` is the extracted path from `deltachat-gplay-release-X.X.X.apk-symbols.zip` file from https://download.delta.chat/android/symbols/
Replace `armeabi-v7a` by the correct architecture the logs come from (can be guessed by trial and error)
### Deobfuscating Java Stack Traces
Because the app uses code minification (ProGuard/R8), Java stack traces in crash reports are obfuscated.
To decode them, use `retrace` with the `mapping.txt` file that is included in the symbols zip:
```
retrace mapping.txt crash.txt > decoded-crash.txt
```
`mapping.txt` is extracted from the same `deltachat-gplay-release-X.X.X.apk-symbols.zip` file available at https://download.delta.chat/android/symbols/
+1 -658
View File
@@ -1,662 +1,5 @@
# Delta Chat Android Changelog
## Unreleased
* Allow to select multiple files for sending
* Add notifications for missed calls
* Video call preview now accurately shows what is sent to remote
* Fix: properly hide draft attachment during in-chat search
* Fix: close mini-apps and chats if they are deleted
* Fix: cancel in-chat search when back is pressed, instead of directly returning to chatlist
## v2.53.0
2026-06
* Use message style notifications for longer message previews
* Remove notification after audio playback ends
* Fix: do not allow blocked contacts to use our invite links
* Fix sending mini-app that was used/prepared before sending
* Some more small fixes and updated translations
* Update to core 2.53.0
## v2.52.0
2026-06
* Fix: avoid crashes in Media preview sometimes
* Fix: Incorrect total time when attaching audio files as draft
* Fix: Audio files in draft showing total time from wrong file
* Fix: Update the channel title after joining if the QR code had an outdated title
* Voice recording will be automatically saved as draft when interrupted
* Update to core 2.52.0
## v2.51.0
2026-06
* Better incoming call system integration
* Calls are not experimental anymore and don't need to be manually enabled
* Calls can be answered by tapping messages
* Notify the user when they try to make a call while the device is offline
* Channels are no longer experimental and are available by default
* Display a permanent notification when doing location streaming and get rid of dangerous "Access Location in Background" permission
* Autoplay all voice messages in a chat
* Allow to share location for 24 hours
* Allow mini-apps to play audio without user interaction
* Allow to paste and open invitation links from search
* Mark chats as unread (long tap a chat and select the corresponding option from the three-dot-menu)
* Add "Mark all as read" option to profile menu in the profile switcher
* Fix process of upgrading from a very old version of the app
* Show more recent added stickers at the top of the sticker picker
* Allow to open links in messages via actions in TalkBack menu
* Allow to open map if user clicks "Location streaming enabled" system message
* Allow to disable incoming calls notifications
* Add an option to process unencrypted messages; by default, only encrypted messages can be sent or received
* Fix: do not accidentally set draft in chats that don't allow sending messages
* Fix swipe navigation between tabs in RTL languages
* Remove "Move to DeltaChat folder", in case you are using the option, a device message shows how to proceed
* Remove "Only fetch from DeltaChat folder" option, the functionality is preserved for existing profiles
* Remove "Delete Messages from Server" option, this is now up to the server:
Chatmail handles that automatically, classic email servers used as relay often have lots of storage or options themselves
* Remove "Show Email" options, all messages are shown by default, shared usage of email account is not supported
* Allow otherwise invalid TLS connections if the key is unchanged
* Adapt quota warning to automatic cleanup.
* Don't show non-delivery-notfications in broadcast channels
* Resend the last 10 messages to new broadcast channel member
* Enable PQC (Post-Quantum Cryptography) support. We do not generate PQC keys yet, this step is needed for forward compatibility
* Improve avatar quality
* Add new webxdc.isAppSender and webxdc.isBroadcast APIs for mini-apps
* Fix: avoid invalid empty "~" notifications when some peer is streaming location
* Fix: Improve detection of stickers
* Fix text direction issues for RTL languages in "Show full message" view
* Fix: Reconnect when removing a relay
* Fix: Location streaming now works correctly with multiple accounts
* Fix debouncing in chatlist and search
* Fix sharing contact across profiles
* Fix: Reset scroll location after switching account
* Update to core 2.51.0
## v2.49.0
2026-04
* Fix file sharing to certain apps (e.g. Material Files, etc.)
* Fix problem with calls when microphone permission is not granted
* Fix taking pictures and videos in devices with SD cards
* Fix flipped orientation for some images
* Fix: avoid empty contact request chats when using invite links in a multi-device setup
* Remove proxy toggle from profile editing to avoid confusion
* Updated translations
* Update to core 2.49.0
## v2.48.0
2026-03
* Add a warning when editing relays
* Fix message reordering problems in multi-relay setups
* Some more bug fixes and updated translations
* Update to core 2.48.0
## v2.47.0
2026-03
* Allow to set chat description
* Unified date display in call bubbles
* Explain at "Settings / Chats / Outgoing Media Quality" how to send original quality
* Add a basic sticker picker
* Leave groups and channels before deletion
* Further minimize metadata in messages and while getting in contact.
* Increase resilience of multi-relay usage: if on relay goes down, messages are still received in the others.
* Allow to hide a relay from contacts instead of removing, allowing smoother relay changes
* HTML emails: allow to review and copy links before opening them
* Mark call message as seen when accepting/declining a call
* Fix: keep original sent timestamp for resent messages
* Fix: make clicking on broadcast member-added messages work always
* Fix: remove notification when a message is deleted by sender
* Fix: avoid "reply privately" not quoting the selected message sometimes
* Fix: properly hide the calls button
* Some more bug fixes and updated translations
* Update to core 2.47.0
## v2.43.0
2026-02
* Improve switch speed when changing profiles
* Allow to switch profile when sharing or forwarding
* Display message views count for channel owners
* Don't notify notification-to-all from in-chat apps if the chat is muted
* Allow to see inbox quota for all relays in connectivity screen
* Truncate file names in the middle, not at the end; important information are more often at the end
* Remove email address from user profile
* Mark external links with " ↗" to make them clear
* Make QR code larger on "Add Second Device" screen
* Add indication for blocked contacts in user profile
* Allow to start calls with video disabled
* Show hint for empty contact search results
* Add background playing for voice messages and other audio files
* Allow scanning Invitation Code when creating a new profile
* Add context menu in long-pressing relays items instead of showing buttons
* Enhanced video player UI
* Fix: Show dialog if pasted QR codes are invalid
* Fix: Refresh chat list when returning from conversation if selected profile changed
* Fix: Update menu when using "select all" in contact selection
* Fix: Avoid empty profiles after using "add as second device" from welcome screen
* Fix: Remove from group deselected members in the contact selection list
* Fix multi-device seen messages synchronization when using multiple relays
* Fix mailto handling
* Fix layout problems inside in-chat apps
* Fix real-time for in-chat apps that need it
* Avoid crash when the app is minimized with profile switcher or reactions dialogs open
* Remove "trash icon" option from contact selection list when adding members to group
* Update to core 2.43.0
## v2.35.0
2026-01
* Protect profile deletion and relays management with system lock/pin
* Fix: Remove address from profile switcher
* Fix: Avoid crash if the system doesn't allow to start foreground service
* Remove deprecated "real-time apps" switch
* Update to core 2.35.0
## v2.34.0
2025-12
* Allow to add relay from clipboard or image if camera permission is not granted
* Avoid crash in the "View Log" screen
* Update to core 2.34.0
## v2.33.1
2025-12
* Target Android 16
* Change color of links in text messages
* Improve edge-to-edge support
* Add the option (opt-in) to send anonymous statistics to Delta Chat's developers
* Metadata protection: protect message recipients
* Allow to withdraw channel invite links and QR codes
* Allow to open externally links clicked inside in-chat apps
* Do not show "1 member" when the process of joining the group is not finished
* Make search case-insensitive for non-ASCII chat and contact names
* Improve handling of video recoding
* Send .webm videos as file, they are not supported by all platforms
* Tweak advanced section and wording of some advanced options
* Fix: avoid crash in push notifications handling
* Fix: avoid freezing in background
* Fix: clean up web storage of deleted in-chat apps
* Fix: avoid crash when exporting some files with wrong image MIME type
* Expose new "Multi-device mode" option instead of "Delete from server" for chatmail profiles
* Opened in-chat apps got a 'About Apps' menu item
* Avoid gray avatar on profile creation
* Avoid last item in chat list being covered by the floating button
* Add disk usage statistics to log
* New experimental feature: several addresses per profile
* Update to core 2.33.0
## v2.25.0
2025-11
* Make it possible to invite members into a channel via a QR code,
and make channels more secure
* metadata protection: protect Date header
* metadata protection: protect Autocrypt header
* better multi-device: synchronize group creation across devices
* data saving: do not send Autocrypt header in read receipts
* improve onboarding speed
* allow to save to storage files shared from inside in-chat apps
* reduce app size
* don't show badge counter in app icon for the permanent background notification
* fix sorting of old media in gallery
* fix text direction in "x members" subtitle for RTL languages
* fix group invite QR screen's layout
* tweak text hints in advanced classic e-mail configuration
* remove deprecated "companion app" code
* remove deprecated "Watch Sent Folder" preference
* remove deprecated "send self-report" preference
* don't show email address in shared vcard
* update to core 2.25.0
## v2.22.0
2025-10
* target Android 15
* improve readability of info messages in dark mode
* drop too short disappearing messages options
* fix Direct Share shortcuts
* fix: don't show error message when cancelling profile creation
* enable permanent notification by default if push notifications are not available
* hide "clone chat" and member list for incoming channels
* show warning if background notifications will be unreliable
* warn if the app has not been updated after 6 months instead of 1 year
* avoid "unknown sender for this chat" error
* properly display "Messages are end-to-end encrypted." in all encrypted groups
* show dialog if user has permanently denied camera permission and tries to take picture for group avatar
* several small fixes and improvements
* add experimental built-in calls
* update to core 2.22.0
## v2.11.0
2025-08
* add "After 1 year" option to disappearing messages
* improve image quality when setting group avatars
* add Estonian translation, update other translations
* allow to clone email chats
* fix some small bugs
* update to core 2.11.0
## v2.10.0
2025-08
* fix "Archived" item's layout in chat-list
* don't enlarge "Saved Messages" and "Devices Messages" avatars on click
* share email address for email contacts instead of vCard
* open existing encrypted chat when opening a mailto link or clicking an email address in a message bubble
* update to core 2.10.0
## v2.9.0
2025-07
* hide contact email addresses in search results
* disable non-functional message editing and ephemeral messages timer settings in classic email thread chat
* don't enlarge email chats avatar placeholder
* improve message date/status footer layout, also in RTL languages
* display correct text when receiving a "Disappearing messages enabled" system message
* Update to core 2.9.0
## v2.8.0
2025-07
* Profiles focus on recognizing contacts
* See the number of media directly in the profile, no need to tap around
* Clearer app lists by removing redundant "App" subtitle
* New button for quick access to the apps sent in current chat
* New icon for the in-chat apps button
* Improve hint for app drafts
* Add Text-To-Speech (TTS) support for in-chat apps
* New icon for the QR icon
* Start rebuilding the experimental broadcast lists
into proper channels - note that this is work-in-progress
* Improved separation between unencrypted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat
* Removed padlocks, as encrypted is the default "normal" state. Instead, unencrypted email is marked with a small email / letter (✉️) icon
* Classic email chats/threads get a big email / letter icon making it easy to recognize
* After some time, add a device message asking to donate. Can't wait? Donate today at https://delta.chat/donate
* Allow to sort profiles up in the profile switcher
* Add new option to create unencrypted email thread
* Green checkmarks are removed where they mostly refer to guaranteed encryption, which is the default now. They are still used for profile's "Introduced by"
* Update to core 2.8.0
## v1.58.4
2025-05
* make in-chat apps properly work when they are not sent yet, in draft mode
* better avatar quality
* some more bug fixes and updated translations
* update to core 1.159.5
## v1.58.3
2025-05
* fix: webxdc.selfName uses the name otherwise displayed
* fix potential crash on startup
* add donation link to app settings
* update to core 1.159.3
## v1.58.2
2025-04
* fix draft writing area disappearing for some chats
* update to core 1.159.2
## v1.58.1
2025-04
* tapping info messages with contacts open the contact's profile
* hide superfluous "Show Classic E-mails" advanced setting for chatmail
* show profile bio/status under name in main settings screen
* remove mostly non-telling transport addresses when referring to a contact;
the contact's profile gives a much better overview
* Disable AEAP to enable us to overhaul some things - there are big changes underway in this area, which will come in a few months
* don't display email address in contact list and member list for contacts with green-checkmark
* avoid crash in Notifications preferences if ringtone title can't be read
* don't display forwarded messages as "edited" if original message was edited
* support importing contact from ProtonMail vCard attachments received in chats
* send encrypted in the experimental broadcast lists feature
* wait for QR scan (or invite link click) process to complete before allowing to send messages
* show connectivity status dot when profile is connecting or not connected
* never send Autocrypt-Gossip in broadcast lists.
* update to core 1.159.1
## v1.56.1
2025-03
* ignore click in info-messages from deleted in-chat apps
* data saving: do not send messages to the server if user is the only member of the chat in single-device usage
* protect metadata: encrypt message's sent date
* do not fail to send messages in groups if some encryption keys are missing
* synchronize contact name changes across devices
* fix changing group names that was not working in some situations
* fix: do not show outdated message text in "Message Info" of an edited message
* some more small bug fixes and updated translations
* update to core 1.158.0
## v1.56.0
2025-03
* allow to edit messages
* allow to delete messages for everyone
* add mute option "8 hours"
* add menu option to easily save/unsave selected message
* improve deletion confirmation for "Device Messages"
* remove dangerous encryption options
* always paste as plain text in message draft area
* some small bug fixes and updated translations
* update to core 1.157.2
## v1.54.4
2025-03
* allow better avatar (profile picture) quality
* remove notifications from chat that was deleted from other device
* when a chat is deleted, also delete its messages from server
* avoid freezing when opening the app for the first time after install
* avoid crash when adding chat shortcut to home screen
* some small bug fixes and updated translations
* update to core 1.156.3
## v1.54.3
2025-03
* allow to add any chat to the home screen
* update "forward message" icon and organize the messages actions bar
* do not allow non-members to change ephemeral timer settings of groups
* properly display padlock when the message is not sent over the network
* sync message deletion to other devices
* sync chat deletion across devices
* Show sender in "Saved Messages"
* allow scanning multiple QR-invitation codes without needing to wait for completion to scan the next one
* when reactions are seen in one device, remove notification from your other devices
* don't disturb with notification when someone leave a group
* detect incompatible profiles from newer app version when importing them
* prepare the app for receiving edited messages
* prepare the app for receiving message deletion requests
* do some small bug fixes
* update translations
* update to core 1.156.2
## v1.54.0
2025-02
* enhanced "Saved Messages" feature, now when forwarding a message to "Saved Messages" chat, it retains the sender information and a button to jump to the original message
* Saved messages are marked by a bookmark sign
* improve explanation when blocking a contact
* improve wording in empty "apps" and "files" tabs in chat media screen
* remove deprecated/legacy built-in "half-camera"
* UI improvement: keep avatars aligned to message bubble when message has reactions
* fix problems when opening attachments in external apps
* fix a bug with some big images appearing as blank/transparent
* some other small bug fixes
* update translations
* update to core 1.155.4
## v1.52.1
2025-01
* the app now requires less storage on your SD card by deduplicating newly received/sent files
* some small bug fixes
* update translations
* update to core 1.155.1
## v1.52.0
2025-01
* new group consistency algorithm
* fix: don't show animated .webp stickers as static stickers
* fix the chat shortcuts (created via long-press in launcher) to properly support multi-profile
* fix some small bugs in certain android versions and special situations
* avoid the app freezing in slow phones in some situations
* improve menu in the help screen
* update translations
* update to core 1.155.0
## v1.50.5
2025-01
* fix push-notifications handling for certain devices where it was not working correctly
* update translations
* using core 1.153.0
## v1.50.4
2025-01
* properly send as animated stickers GIF files selected from keyboard
* improve emoji picker in landscape mode and when changing from landscape to portrait
* avoid crash when receiving push notifications if the user restricted the app from working in background
* improve UI when attaching a file or image to easily recognize it is attached but not sent yet
* avoid slow loading of in-chat apps in some devices when quickly re-opening an app after closing it
* allow to select multiple images at once in the media picker via "Gallery" button
* mark holiday notice messages as bot-generated
* don't mark contacts as bot when receiving location-only and sync messages
* prefer to encrypt even if peers have their preference to "no preference"
* start ephemeral messages timers when the chat is archived or noticed
* several bug fixes and updated translations
* update to core 1.153.0
## v1.50.3
2024-12
* Add in-chat apps picker to attachments options
* Notify replies and reactions to your messages in muted chats (can be disabled in settings)
* Cache HTTP GET requests (ex. when loading images from HTML messages)
* update to core 1.152.0
## v1.50.2
2024-12
* Encrypt notification tokens
* update to core 1.151.5
## v1.50.0
2024-12
* New emoji picker with support for more emojis
* Webxdc apps can now trigger notifications
* Webxdc apps can now deep-link to internal sections when you click their info-messages in chat
* Add "Show in Chat" to the menu of opened Webxdc apps
* Reverse order of messages in the notification group
* Notify reactions to own messages
* Improve the button to start Webxdc apps
* Make account deletion confirmation dialog faster
* Rename "Back up Chats to External Storage" to "Export Backup"
* Improve compatibility with classic email clients in the outgoing messages
* Removed internal font scaling setting in favor of the better system settings
* Use privacy-preserving webxdc addresses
* Use Rustls for connections with strict TLS
* QR codes for adding contacts and joining groups provide help when opened in a normal browser
* Mark Saved Messages chat as protected
* Allow the user to replace maps integration
* fix: Trim whitespace from scanned QR codes
* fix quotes: Line-before-quote may be up to 120 character long instead of 80
* fix: Prevent accidental wrong-password-notifications
* fix: Remove footers from "Show Full Message..."
* fix: Only add "member added/removed" messages if they actually do that
* fix: Update state of message when fully downloading it
* fix: send message: Do not fail if the message does not exist anymore
* fix: Do not percent-encode dot when passing to autoconfig server (so, fix handling of some servers)
* fix displaynames not being updated when intially scanned by a QR code
* several bug fixes
* update to core 1.151.3
## v1.48.3
2024-10
* new Proxy settings screen available at "Advanced / Proxy"
* manage a list of HTTP(S), SOCKS5 or Shadowsocks Proxies
* Proxies icon shown on the chatlist if proxies are used
* share Proxies by showing a QR code
* scan Proxies' QR code and use them
* make Proxy URLs inside Delta Chat tappable
* open Delta Chat when tapping Proxy URLs in other apps
* support for realtime webxdc apps moved out of experimental and enabled by default
* realtime webxdc apps can be disabled at "Settings / Advanced"
* "New Contact / Link" button to view, share or copy the invite line
* "New Contact / Scan" button to easier access the scanner functionality
* open "New Contact" scan/show activities directly, do not try to be too smart and open the last active tab
* allow to attach multiple images in one step
* to easier differ between multiple profiles, set a "Private Tag" (long tap profile switcher)
* "Private Tag" is shown in notifications
* improve profile deletion dialog: show name, size and avatar of the profile being deleted
* show profile name in title bar when the user has multiple profiles
* improve profile switcher layout
* improve notification: allow to "Mark Read" from the notification
* search for unread chats in the search's three-dot-menu
* allow pasting QR codes from "Add As Second Device" screen
* save traffic by supporting "IMAP COMPRESS"
* automatic reconfiguration, e.g. switching to implicit TLS if STARTTLS port stops working
* parallelize IMAP and SMTP connection attempts
* improve DNS caching
* always use preloaded DNS results
* prioritize cached results if DNS resolver returns many results
* always move auto-generated messages to DeltaChat folder
* ignore invalid securejoin messages silently
* delete messages from a chatmail server immediately by default
* make resending pending messages possible
* don't SMTP-send messages to self-chat if BccSelf is disabled
* HTTP(S) tunneling
* don't put displayname into From/To/Sender if it equals to address
* hide sync messages from INBOX (use IMAP APPEND command to upload sync messages)
* more verbose SMTP connection establishment errors
* add "Learn More" button to "Manage keys"
* visual feedback when tapping the action button of a message
* log unexpected message state when resending fails
* smoother backup and "Add Second Device" progress bars
* assign messages to ad-hoc group with matching name and members
* use stricter TLS checks for HTTPS downloads (images in HTML mails, Autoconfig)
* improve logging for failed QR code scans, AEAP, Autocrypt, notification permissions and sending errors
* improve logging of multi account setup (log account ID)
* show more context for the "Cannot establish guaranteed..." info message
* show file name in "Message Info"
* show root SMTP connection failure in connectivity view
* fix: Sort received outgoing message down if it's fresher than all non fresh messages
* fix: avoid app being killed when processing a PUSH notification
* fix crash when refreshing avatar
* fix crash in gallery
* fix: shorten message text in locally sent messages too
* fix: Set http I/O timeout to 1 minute rather than whole request timeout
* fix: don't sync QR code token before populating the group
* fix: do not get stuck if the message to download does not exist anymore
* fix: do not attempt to reference info messages
* fix: do not get stuck if there is an error transferring backup
* fix: make it possible to cancel ongoing backup transfer
* fix: reset quota when entering a new address
* fix: better detection of file extensions
* fix: "database locked" errors
* fix: never initialize realtime channels if realtime is disabled
* fix reception of realtime channels
* fix: normalize proxy URLs
* fix connections getting stuck in "Updating..." sometimes
* fix scanning "add second device" QR code from scanner above chatlist
* fix warning about wrong password
* fix app getting stale when receiving a PUSH notifications takes longer
* fix app getting stale on network changes
* fix: skip IDLE if we got unsolicited FETCH
* update translations and local help
* update to core 1.148.6
## v1.46.14
2024-09
* add monochrome/themed launcher icon support
* allow to remove the selected profile in "Switch Profile" dialog
* improve display of selected profile in "Switch Profile" dialog
* improve the hit/tap area to open "Switch Profile" dialog in the main screen's toolbar
* add support for system per-app language and remove in-app language selector
* remove the experimental "encrypt database" checkbox in classic registration screen
* fix various bugs
* update to core 1.142.12
## v1.46.13
2024-08
* improve contact profile's "Edit Name" dialog
* upgrade the status bar to modern Android look and feel
* add direct support for android14, required to be able to continue shipping to Google Play
* increase minimal supported android to 5; as required by updating several outdated dependencies
* drop support for gmail oauth2, gmail can still be used using "App Passwords", you'll get hints as needed
(reason for dropping was unmaintainable bureaucracy and costs added by google)
* update various dependencies for added security and stability
* jcenter (a dependency origin) is closing, move dependencies to other origins
* when SOCKS5 is enabled, route autoconfig and oauth2 config there
* fix encryption compatibility with old Delta Chat clients
* fix crashes when opening log view with many lines
* fix: hide copy to clipboard while QR is not ready
* fix moving outgoing auto-generated messages to the "DeltaChat" folder
* fix: try to create "INBOX.DeltaChat" if "DeltaChat" is not possible for some provider
* fix receiving messages with "DeltaChat" folder cannot be selected
* fix: do not crash on unknown "Certificate Checks" values
* update provider database
* update to core 1.142.8
## v1.46.10
2024-08
* mark bots in chat titles and profiles as such
* if the experimental videochat is enabled, invitations can be sent via the "Attach" menu now
* show potentially dangerous buttons with red color
* focus on name and profile images in reaction details; the address is available on tap
* focus on name and profile image in profile switcher; the address is still shown for classic e-mail profiles
* add device message about new placement of "Switch Profile" if more than one profile is in use before update
* update translations
* using core 1.142.2
## v1.46.8
2024-08
* "Share Contact" directly from a contact's profile
* add "Share Invite Link" to "New Contact" screen
* add "Invite Friends" to main menu
* cleanup "Profile Switcher", long tap to delete profiles
* "Mute Notifications" via a long tap directly from "Profile Switcher"
* search non-english messages case-insensitive
* display attached contact's names in summaries and quotes
* protect From: and To: metadata where possible
* do not reveal sender's language metadata in read receipts
* allow importing contacts exported by Proton Mail
* for chatmail profile, hide error prone "add contact manually" in favor to invite links
* automatically expand "Password and Account / Advanced" if there were advanced options set before
* show potentially dangerous menu entries with red color
* remove "Switch Profile" from main menu, as this very often used option causes confusion with finger memory and other menus;
instead, just tap your profile image in the upper left corner to add or to switch profiles
* prevent creating contact without encryption in chatmail profiles via mailto:-links
* no unarchiving of groups on member removal messages
* improve caching of DNS results
* focus on name for QR code titles
* report first error instead of the last on connection failure
* long tap email address in contact's profile for copying to clipboard
* fix battery drain due to endless IMAP loop
* fix: remove push notification toggle, it is not needed as raised false expectations
* fix: keep "chatmail" state after failed reconfiguration
* fix issues with failed backup imports
* fix: avoid group creation on member removal messages
* fix downloading partially downloaded messages
* fix various networking bugs
* update translations and local help
* update to core 1.142.2
## v1.46.7
2024-07
* add option to mark all selected chats as being "Read" (long tap a chat to start select mode)
* new, single-device chatmail profiles default to "Delete Messages after Download"
* when using a chatmail profile on multiple devices, deletion is changed to "Automatic"
(deletion strategy is up to the server then)
* fix back-button behaviour in the welcome screen
* update translations and local help
* using core 1.140.2
## v1.46.5
2024-06
@@ -1263,7 +606,7 @@
* fix sending status updates of private apps
* show full messages: do not load remote content for requests automatically
* using core107.1
* using to core107.1
## v1.34.12
+9 -6
View File
@@ -45,7 +45,7 @@ Some rough ideas, that may be helpful when thinking about how to enhance things:
## Contributing Code
The [BUILDING.md](./BUILDING.md) file explains in detail how to set up the build environment.
The [README](./README.md) explains in detail how to set up the build environment.
Please follow all steps precisely.
If you run into troubles,
ask on one of the [communication channels](https://delta.chat/contribute) for help.
@@ -73,15 +73,18 @@ esp. before/after screenshots.
### Coding Conventions
Project language is Java.
Source files are partly derived from different other open source projects
and may follow different coding styles and conventions.
Code formatting is enforced via [Spotless](https://github.com/diffplug/spotless) Gradle plugin.
Auto-format all files by running `./gradlew spotlessApply` before opening a PR.
CI will fail if files are not formatted correctly so make sure to run the formatter before pushing.
If you do a PR fixing a bug or adding a feature,
please embrace the coding convention you see in the corresponding files,
so that the result fits well together.
If you do a PR fixing a bug or adding a feature, do not refactor or rename things in the same PR
Do not refactor or rename things in the same PR
to make the diff small and the PR easy to review.
Project language is Java.
By using [Delta Chat Core](https://github.com/deltachat/deltachat-core-rust)
there is already a strong separation between "UI" and "Model".
Further separations and abstraction layers are often not helpful
+3 -3
View File
@@ -34,10 +34,10 @@ ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/bin
# Install NDK manually. Other SDK parts are installed automatically by gradle.
#
# If you change the NDK version here, also change it in `flake.nix`.
# NDK version r27 LTS aka 27.0.11902837
RUN sdkmanager --sdk_root=${ANDROID_SDK_ROOT} 'ndk;27.0.11902837'
# NDK version r23c LTS aka 23.2.8568313
RUN sdkmanager --sdk_root=${ANDROID_SDK_ROOT} 'ndk;23.2.8568313'
ENV ANDROID_NDK_ROOT ${ANDROID_SDK_ROOT}/ndk/27.0.11902837
ENV ANDROID_NDK_ROOT ${ANDROID_SDK_ROOT}/ndk/23.2.8568313
ENV PATH ${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none
+236 -22
View File
@@ -1,33 +1,247 @@
## ArcaneChat Android Client
## Delta Chat Android Client
A [Delta Chat](https://delta.chat/) client for Android. Learn more at: https://arcanechat.me
This is the Android client for [Delta Chat](https://delta.chat/).
It is available on [F-Droid](https://f-droid.org/app/com.b44t.messenger) and
the [Google Play Store](https://play.google.com/store/apps/details?id=chat.delta).
The APK can also be downloaded from [get.delta.chat](https://get.delta.chat).
[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat)
[<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite)
[<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)
For the core library and other common info, please refer to the
[Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
For general contribution hints, please refer to [CONTRIBUTING.md](./CONTRIBUTING.md).
<img alt="Screenshot Chat List" src="docs/images/2019-01-chatlist.png" width="298" /> <img alt="Screenshot Chat View" src="docs/images/2019-01-chat.png" width="298" />
<img alt="Screenshot" src="fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" width="298" /> <img alt="Screenshot" src="fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" width="298" />
# Check Out Repository
# WebXDC
When checking out _deltachat-android_, make sure also to check out the
subproject _deltachat-core-rust_:
This app has some extended support for WebXDC apps:
- When using Git, you can do this initially by
`$ git clone --recursive https://github.com/deltachat/deltachat-android`
or later by `git submodule update --init --recursive`. If you do this in your
home directory, this results in the folder `~/deltachat-android` which is just fine.
- `window.webxdc.arcanechat` a string with the ArcaneChat version and can be used by app developers
to detect when they can use the ArcaneChat-specific features.
- `sendToChat()`: extra property `subject` can be set to a text string to set message/email's subject.
- `sendToChat()`: extra property `html` can be set to a string of html markup to set the HTML part of the email/message.
- `sendToChat()`: the file object parameter also accepts a `type` field that can be one of:
* `"sticker"`
* `"image"`
* `"audio"`
* `"video"`
* `"file"` (default if `type` field is not present)
- Inside apps, clicking external links is supported, ex. to open in browser, so you can include links to your website or donation pages.
- `manifest.toml` field: `orientation`, if you set it to `"landscape"` your app will be launched in landscape mode.
# Build Using Nix
The repository contains [Nix](https://nixos.org/) development environment
described in `flake.nix` file.
If you don't have Nix installed,
the easiest way is to use [The Determinate Nix Installer](https://github.com/DeterminateSystems/nix-installer)
which installs Nix with [Flakes](https://nixos.wiki/wiki/Flakes) feature enabled out of the box
and can be cleanly uninstalled with `/nix/nix-installer uninstall` once you don't need it anymore.
Once you have Nix with Flakes feature set up start the development environment shell:
```
nix develop
```
Nix development environment contains Rust with cross-compilation toolchains and Android SDK.
To [build an APK](https://developer.android.com/studio/build/building-cmdline) run the following 2 steps.
Note that the first step may take some time to build for all architectures. You can optionally read
[the first comment block in the `ndk-make.sh` script](https://github.com/deltachat/deltachat-android/blob/master/scripts/ndk-make.sh)
for pointers on how to build for a specific architecture.
```
$ scripts/ndk-make.sh
$ ./gradlew assembleDebug
```
Resulting APK files can be found in
`build/outputs/apk/gplay/debug/` and
`build/outputs/apk/fat/debug/`.
# Build Using Dockerfile
Another way to build APK is to use provided `Dockerfile`
with [Docker](https://www.docker.com/) or [Podman](https://podman.io/).
Podman is a drop-in replacement for Docker that does not require root privileges.
If you don't have Docker or Podman setup yet, read [how to setup Podman](#setup-podman)
below. If you don't want to use Docker or Podman, read [how to manually install the
build environment](#install-build-environment).
First, build the image `deltachat-android` by running
```
podman build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
```
or
```
docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
```
Then, run the image:
```
podman run --userns=keep-id -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
```
or
```
docker run -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
```
You can leave the container with Ctrl+D or by typing `exit` and re-enter it with
`docker start -ia deltachat` or `podman start -ia deltachat`.
Within the container, install toolchains and build the native library:
```
deltachat@6012dcb974fe:/home/app$ scripts/install-toolchains.sh
deltachat@6012dcb974fe:/home/app$ scripts/ndk-make.sh
```
Then, [build an APK](https://developer.android.com/studio/build/building-cmdline):
```
deltachat@6012dcb974fe:/home/app$ ./gradlew assembleDebug
```
## Troubleshooting
- Executing `./gradlew assembleDebug` inside the container fails with `The SDK directory '/home/user/Android/Sdk' does not exist.`:
The problem is that Android Studio (outside the container) automatically creates a file `local.properties` with a content like `sdk.dir=/home/username/Android/Sdk`,
so, Gradle-inside-the-container looks for the Sdk at `/home/username/Android/Sdk`, where it can't find it.
You could:
- either: remove the file or just the line starting with `sdk.dir`
- or: run `./gradlew assembleDebug` from outside the container (however, there may be incompatibility issues if different versions are installed inside and outside the container)
- Running the image fails with `ERRO[0000] The storage 'driver' option must be set in /etc/containers/storage.conf, guarantee proper operation.`:
In /etc/containers/storage.conf, replace the line: `driver = ""` with: `driver = "overlay"`.
You can also set the `driver` option to something else, you just need to set it to _something_.
[Read about possible options here](https://github.com/containers/storage/blob/master/docs/containers-storage.conf.5.md#storage-table).
# <a name="setup-podman"></a>Setup Podman
These instructions were only tested on a Manjaro machine so far. If anything doesn't work, please open an issue.
First, [Install Podman](https://podman.io/getting-started/installation).
Then, if you want to run Podman without root, run:
```
sudo touch /etc/subgid
sudo touch /etc/subuid
sudo usermod --add-subuids 165536-231072 --add-subgids 165536-231072 yourusername
```
(replace `yourusername` with your username).
See https://wiki.archlinux.org/index.php/Podman#Rootless_Podman for more information.
# <a name="install-build-environment"></a>Install Build Environment (without Docker or Podman)
To setup build environment manually:
- _Either_, in Android Studio, go to "Tools / SDK Manager / SDK Tools", enable "Show Package Details",
select "CMake" and the desired NDK (install the same NDK version as the [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile)), hit "Apply".
- _Or_ read [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile) and mimic what it does.
Then, in both cases, install Rust using [rustup](https://rustup.rs/)
and Rust toolchains for cross-compilation by executing `scripts/install-toolchains.sh`.
Then, configure `ANDROID_NDK_ROOT` environment variable to point to the Android NDK
installation directory e.g. by adding this to your `.bashrc`:
```bash
export ANDROID_NDK_ROOT=${HOME}/Android/Sdk/ndk/[version] # (or wherever your NDK is) Note that there is no `/` at the end!
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
After that, call `scripts/ndk-make.sh` in the root directory to build core-rust.
Afterwards run the project in Android Studio. The project requires API 25.
With chance, that's it :) - if not, read on how to set up a proper development
environment.
# Install Development Environment
1. Some libs required by Android Studio may be missing on 64 bit Linux machines
[Source](https://developer.android.com/studio/install.html)], so for Ubuntu execute
`$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386`
and for Fedora execute
`$ sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686`.
2. Download Android Studio from <https://developer.android.com> (android-studio-ide-...-linux.zip)
and unpack the archive which contains a single folder called `android-studio`;
move this folder e.g. to `~/android-studio`.
3. To launch Android Studio for the first time, open a terminal, navigate to
`~/android-studio/bin`, execute `./studio.sh` and use all the standard values
from the wizard.
4. Android Studio now asks you if you want to open an existing project;
choose `~/deltachat-android` as created in the "Build" chapter (Android Studio starts to
build the project, however, there are some steps missing before this will
succeed).
5. If components are missing, click on the corresponding error
message and install eg. required SDKs and the "Build-Tools" (you should
also find the option at "Tools / Android / SDK Manager / SDK Platforms").
Now the build should succeed - but the app still misses the native part.
6. Download Android NDK from
[NDK Archives](https://developer.android.com/ndk/downloads)
and extract the archive containing a single folder
called something like `android-ndk-r23b-linux`; move this folder e.g. to `~/android-ndk`.
7. Export the folder path to your environment as `ANDROID_NDK_ROOT` and add it to `PATH`.
You can achieve this e.g. by adding this to your `.bashrc`
```bash
export ANDROID_NDK_ROOT=${HOME}/android-ndk
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
# Run UI Tests and Benchmarks
- You don't necessarily need a dedicated testing device.
Backup your current account first, maybe there are some bugs in switching accounts.
- You can run benchmarks on either an emulated device or a real device.
You need at least Android 9. For better benchmark results,
you should run the benchmark on a real device and make sure that the core is compiled in release mode.
- Disable animations on your device, otherwise the test may fail:
at "Developer options"
set all of "Window animation scale", "Transition animation scale" and "Animator duration scale" to 0x
- In Android Studio: "File" / "Sync project with gradle files"
- In Android Studio: "Run" / "Edit configurations" / "+" / "Android Instrumented test":
Either select a specific class or select "All in Module" / "OK" /
Select your configuration in the toolbar / Click on the green "run" button in the toolbar to run the tests
## Get the benchmark results
When the benchmark is done, you will get a result like
`MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: 11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`.
You can paste `11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`
into a cell in a LibreOffice spreadsheet, do "Data" / "Text to columns",
choose `,` as a separator, hit "OK", and create a diagram.
## Run online tests
For some tests, you need to provide the credentials to an actual email account.
You have 2 ways to do this:
1. (Recommended): Put them into the file ~/.gradle/gradle.properties (create it if it doesn't exist):
```
TEST_ADDR=youraccount@yourdomain.org
TEST_MAIL_PW=youpassword
```
2. Or set them via environment variables.
# Translations
Android metadata and changelogs are translated using [Weblate](https://hosted.weblate.org/projects/deltachat/android-metadata/).
<a href="https://hosted.weblate.org/engage/deltachat/">
<img src="https://hosted.weblate.org/widget/deltachat/android-metadata/svg-badge.svg" alt="Translation status" />
</a>
# Credits
This app is based on the [official Delta Chat client](https://github.com/deltachat/deltachat-android) with several improvements.
The user interface classes are based on the Signal messenger.
This app uses a [modified](https://github.com/ArcaneChat/core) version of the [Chatmail Core Library](https://github.com/chatmail/core).
# License
Licensed GPLv3+, see the LICENSE file for details.
Copyright © 2022 Delta Chat contributors.
+36 -45
View File
@@ -3,10 +3,6 @@
## Generate APKs
### Update core and translations
on the command-line, in a PR called "update-core-and-stuff-DATE":
1. update core:
```
./scripts/update-core.sh # shows used branch
@@ -15,35 +11,22 @@ on the command-line, in a PR called "update-core-and-stuff-DATE":
./scripts/ndk-make.sh
```
a) Update `CHANGELOG.md`
from <https://github.com/chatmail/core/blob/main/CHANGELOG.md>,
do not just copy and avoid technical terms.
The changelog is for the end user and shall show impacts form that angle.
Add used core version to end of changelog entry
as `update to core 1.2.3` or `using core 1.2.3`
2. update JSON-RPC bindings:
```
./scripts/update-rpc-bindings.sh
```
3. update translations and local help:
2. update translations and local help:
```
./scripts/tx-pull-translations.sh
./scripts/create-local-help.sh # requires deltachat-pages checked out at ../deltachat-pages
```
### Prepare release
the following steps are done in a PR called `prep-VERSION` (no leading "v"):
3. Update `CHANGELOG.md`:
Rename header with version number and add date as `YYYY-MM`
3. update `CHANGELOG.md`
from <https://github.com/deltachat/deltachat-core-rust/blob/main/CHANGELOG.md>
and <https://github.com/deltachat/deltachat-android/pulls?q=is%3Apr+is%3Aclosed+sort%3Aupdated-desc>.
avoid technical terms, library versions etc. the changelog is for the end user.
do not forget to update/mention used core version and release month.
in case previous entries of the changelog refer to betas or to not officially released versions,
the entries can be summarized.
this makes it easier for the end user to follow changes by showing major changes atop.
this makes it easier for the end user to follow changes by showing major changes atop
4. add a device message to `ConversationListActivity::onCreate()` or remove the old one.
do not repeat the CHANGELOG here: write what really is the ux outcome
@@ -56,8 +39,7 @@ the following steps are done in a PR called `prep-VERSION` (no leading "v"):
6. build APKs:
a) generate debug APK at "Build / Build Bundle(s)/APK / Build APK(s)"
b) generate release APK at "Build / Generate Signed Bundle or APK",
select "APK", add keys, flavor `gplayRelease`.
this APK will go to the stores and is located at `gplay/release`
select "APK", add keys, flavor `gplayRelease`
## Push Test Releases
@@ -88,34 +70,43 @@ only afterwards, push the APK to stores. **consider a blog post.**
on <https://play.google.com/apps/publish/>:
9. a) open "Delta Chat / Test and release / Production"
then "Create new release" and upload APK from above
9. a) open "Delta Chat/Release/Production"
then "Create new release" and upload APK from above
b) fill out "Release details/Release notes" (500 chars), add the line
"These features will roll out over the coming days. Thanks for using Delta Chat!";
release name should be default ("123 (1.2.3)")
c) click "Next", set "Rollout Percentage" to 50%, click "Save"
d) Go to "Publishing Overview", "Managed publishing" is usually off;
click "Send change for review", confirm
2 days later, change "Rollout Percentage" to 99%. Two more days later to 100%.
Rollout is anyways slower in practise, however,
only as long as we do not enter 100%, we can retract the version
(Once we reach 100%, we have to submit a new version for approval.
During these up to 4 days, sometimes longer, we cannot do anything on existing rollout)
c) click "Next", set "Rollout Percentage" to 1% (later 2%, 5%, 10%, 20%, 50%, 100%),
click "Start rollout to Production"
## Tag for F-Droid and create Github release
## Release on F-Droid
10. make sure, everything is pushed, then:
$ git tag v1.2.1 COMMIT; git push --tags
10. Add "4" at the end of versionCode to calculate F-Droid version code number.
E.g. for versionCode 456 you get number 4564
(this version conversion is due to `VercodeOperation` in
<https://gitlab.com/fdroid/fdroiddata/blob/master/metadata/com.b44t.messenger.yml>
metadata file, see <https://f-droid.org/docs/Build_Metadata_Reference/#VercodeOperation> for
documentation)
Add `metadata/en-US/changelogs/4564.txt` file with a changelog for F-Droid.
The changelog must not be longer than 500 characters.
11. make sure, everything is pushed, then:
$ git tag v1.2.1; git push --tags
F-Droid picks on the tags starting with "v" and builds the version.
This may take some days.
11. a) on <https://github.com/deltachat/deltachat-android/releases>,
tap "Draft a new Release", choose just created tag, fill changelog
b) add APK from above using "Attach binary".
c) tap "Publish release"
## Release on Amazon Appstore
on <https://developer.amazon.com/dashboard>:
12. a) for "Delta Chat", select "Add upcoming version" on the left
b) at "Step 1 / Existing file(s)" hit "Replace", upload the APK from above
c) on the "Step 1" page, add "Release notes" from CHANGELOG.md, hit "Next"
d) on "Step 2" page: "Does your app collect or transfer user data to third parties?" -> No, then "Next"
e) on "Step 3" page: "Next"
f) on "Step 4" page: "Submit app"
## Release on Huawei AppGallery
@@ -128,7 +119,7 @@ on <https://developer.huawei.com/consumer/en/appgallery>:
d) Hit "Submit"; on the next page, confirm version and language
## Releases on other stores (ex. Passkoocheh)
## Releases on Apklis, Passkoocheh
These stores are not under our control.
On important updates **ping store maintainers** and ask to update.
+96 -188
View File
@@ -1,28 +1,23 @@
plugins {
id 'com.android.application' version '8.11.1'
id 'com.google.gms.google-services' version '4.4.1'
id 'com.diffplug.spotless' version '8.3.0'
id 'com.android.application' version '8.1.4'
// id 'com.google.gms.google-services' version '4.4.1'
}
repositories {
google()
mavenCentral()
maven {
// Used only for PhotoView
url "https://www.jitpack.io"
name 'JitPack Github wrapper'
}
jcenter()
}
android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
namespace "org.thoughtcrime.securesms"
flavorDimensions "none"
compileSdk 36
compileSdk 34
// Set NDK version to strip native libraries.
// Even though we compile our libraries outside Gradle with `scripts/ndk-make.sh`,
@@ -30,18 +25,18 @@ android {
// > Task :stripFatDebugDebugSymbols
// Unable to strip the following libraries, packaging them as they are: libanimation-decoder-gif.so, libnative-utils.so.
// See <https://issuetracker.google.com/issues/237187538> for details.
ndkVersion "27.0.12077973"
ndkVersion "23.2.8568313"
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000746
versionName "2.53.0"
versionCode 688
versionName "1.46.5"
applicationId "chat.delta.lite"
applicationId "com.b44t.messenger"
multiDexEnabled true
minSdkVersion 21
targetSdkVersion 36
minSdkVersion 16
targetSdkVersion 33
vectorDrawables.useSupportLibrary = true
@@ -50,15 +45,6 @@ android {
buildConfigField "boolean", "DEV_BUILD", "false"
ndk {
if(project.hasProperty("ABI_FILTER")) {
abiFilters ABI_FILTER
} else {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "TEST_ADDR", buildConfigProperty("TEST_ADDR"))
@@ -72,21 +58,10 @@ android {
}
packagingOptions {
jniLibs {
doNotStrip '**/*.so'
keepDebugSymbols += [
'*/mips/*.so',
'*/mips64/*.so'
]
keepDebugSymbols += ['*/mips/*.so', '*/mips64/*.so']
}
resources {
excludes += [
'LICENSE.txt',
'LICENSE',
'NOTICE',
'asm-license.txt',
'META-INF/LICENSE',
'META-INF/NOTICE'
]
excludes += ['LICENSE.txt', 'LICENSE', 'NOTICE', 'asm-license.txt', 'META-INF/LICENSE', 'META-INF/NOTICE']
}
}
@@ -98,55 +73,20 @@ android {
storeFile file(DC_DEBUG_STORE_FILE )
}
}
releaseFdroid {
release {
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
storeFile file(DC_RELEASE_STORE_FILE)
storePassword DC_RELEASE_STORE_PASSWORD
keyAlias DC_RELEASE_KEY_ALIAS_FDROID
keyAlias DC_RELEASE_KEY_ALIAS
keyPassword DC_RELEASE_KEY_PASSWORD
}
}
releaseApk {
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
storeFile file(DC_RELEASE_STORE_FILE)
storePassword DC_RELEASE_STORE_PASSWORD
keyAlias DC_RELEASE_KEY_ALIAS_GPLAY
keyPassword DC_RELEASE_KEY_PASSWORD
}
}
releaseBundle {
if(project.hasProperty("DC_BUNDLE_STORE_FILE")) {
storeFile file(DC_BUNDLE_STORE_FILE)
storePassword DC_BUNDLE_STORE_PASSWORD
keyAlias DC_BUNDLE_KEY_ALIAS
keyPassword DC_BUNDLE_STORE_PASSWORD
}
}
}
productFlavors {
foss {
dimension "none"
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
}
gplay {
dimension "none"
apply plugin: "com.google.gms.google-services"
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
applicationId "com.github.arcanechat"
}
}
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
testProguardFiles 'test-proguard-rules.pro'
applicationIdSuffix ".beta"
}
release {
applicationIdSuffix ".lite2"
// minification and proguard disabled for now.
//
// when enabled, it can cut down apk size about 6%,
@@ -157,39 +97,49 @@ android {
// nb: it is highly recommended to use the same settings in debug+release -
// otherwise problems might be noticed delayed only
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
testProguardFiles 'test-proguard-rules.pro'
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
productFlavors.gplay.signingConfig signingConfigs.releaseApk
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
signingConfig signingConfigs.release
}
}
}
if(!project.hasProperty("ABI_FILTER")) {
splits {
abi {
enable true
reset()
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
universalApk true
}
productFlavors {
foss {
dimension "none"
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
}
gplay {
dimension "none"
applicationId "chat.delta"
//apply plugin: "com.google.gms.google-services"
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
}
}
project.ext.versionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
splits {
abi {
enable true
reset()
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
universalApk true
}
}
project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName
.replace("android", "ArcaneChat")
.replace("-release", "")
.replace(".apk", "-${variant.versionName}.apk")
if(project.hasProperty("ABI_FILTER")) {
output.versionCodeOverride =
variant.versionCode * 10 + project.ext.versionCodes.get(ABI_FILTER)
} else {
output.versionCodeOverride =
variant.versionCode * 10 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 4)
}
.replace("deltalab-android", "deltachat-lite")
.replace("-gplay", "")
.replace("-release", "")
.replace(".apk", "-${variant.versionName}.apk")
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(
com.android.build.OutputFile.ABI), 0) * 10000000 + android.defaultConfig.versionCode
}
}
@@ -198,11 +148,6 @@ android {
jniLibs.srcDirs = ['libs']
}
}
androidResources {
generateLocaleConfig true
}
lint {
abortOnError false
}
@@ -210,121 +155,84 @@ android {
renderScript true
aidl true
}
}
spotless {
java {
target 'src/*/java/**/*.java'
targetExclude 'src/main/java/chat/delta/**' // ignore auto-generated code
googleJavaFormat() // Google style = 2-space indent, matches Android Studio defaults
removeUnusedImports()
trimTrailingWhitespace()
endWithNewline()
}
format 'xml', {
target 'src/*/res/**/*.xml', 'src/*/AndroidManifest.xml'
targetExclude 'src/*/res/values*/strings*.xml' // line-break changes invalidate translations
eclipseWtp('xml').configFile('spotless/eclipse-wtp-xml.prefs')
trimTrailingWhitespace()
endWithNewline()
}
groovyGradle {
target '*.gradle'
greclipse()
leadingTabsToSpaces(4)
trimTrailingWhitespace()
endWithNewline()
}
}
final def markwon_version = '4.6.2'
dependencies {
// ArcaneChat-only dependencies:
implementation "io.noties.markwon:core:$markwon_version"
implementation "io.noties.markwon:ext-strikethrough:$markwon_version"
implementation "io.noties.markwon:inline-parser:$markwon_version"
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
def media3_version = "1.8.0" // 1.9.0 need minSdkVersion 23
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
implementation 'androidx.core:core:1.17.0'
implementation 'androidx.core:core-telecom:1.0.1'
implementation 'im.conversations.webrtc:webrtc-android:129.0.0'
// For Kotlin->Java interpolation
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.9.4'
implementation 'androidx.sharetarget:sharetarget:1.2.0'
implementation 'androidx.webkit:webkit:1.14.0'
implementation 'androidx.webkit:webkit:1.8.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.10.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation ('androidx.preference:preference:1.2.1') {
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel'
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
}
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
implementation 'androidx.exifinterface:exifinterface:1.4.1'
implementation 'androidx.exifinterface:exifinterface:1.3.6'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
implementation 'androidx.work:work-runtime:2.9.1'
implementation 'androidx.emoji2:emoji2-emojipicker:1.5.0'
implementation 'com.google.guava:guava:31.1-android'
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // FIXME: exoplayer dependencies kept for Video, but we shall migrate them at some point
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
implementation "androidx.media3:media3-exoplayer:$media3_version"
implementation "androidx.media3:media3-session:$media3_version"
implementation "androidx.media3:media3-ui:$media3_version"
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
implementation 'androidx.work:work-runtime:2.8.1'
implementation 'androidx.emoji2:emoji2-emojipicker:1.4.0'
implementation 'com.google.guava:guava:29.0-android'
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6' // plays video and audio
implementation 'com.google.android.exoplayer:exoplayer-ui:2.9.6'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.journeyapps:zxing-android-embedded:3.4.0' // QR Code scanner
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
implementation 'com.github.Baseflow:PhotoView:2.3.0' // does the zooming on photos / media
implementation 'com.google.code.gson:gson:2.9.1' // used as JSON library. Don't upgrade to 2.10.1: https://github.com/deltachat/deltachat-android/pull/2610
implementation "me.leolin:ShortcutBadger:1.1.16" // display messagecount on the home screen icon.
implementation 'com.jpardogo.materialtabstrip:library:1.0.9' // used in the emoji selector for the tab selection.
implementation 'com.github.chrisbanes:PhotoView:2.1.3' // does the zooming on photos / media
implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.25.0' // APNG & animated webp support.
implementation 'com.caverock:androidsvg-aar:1.4' // SVG support.
implementation 'com.github.bumptech.glide:glide:4.16.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
annotationProcessor 'androidx.annotation:annotation:1.9.1'
implementation 'com.makeramen:roundedimageview:2.3.0' // crops the avatars to circles
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
annotationProcessor 'androidx.annotation:annotation:1.7.0'
implementation 'com.makeramen:roundedimageview:2.1.0' // crops the avatars to circles
implementation 'com.pnikosis:materialish-progress:1.5' // used only in the "Progress Wheel" in Share Activity.
implementation 'com.soundcloud.android:android-crop:1.0.1@aar' // used for profile and group avatar selection in Android SDK<19
//implementation 'com.nineoldandroids:library:2.4.0' // DEPRECATED! Used to slide in the half-camera.
implementation 'mobi.upod:time-duration-picker:1.1.3' // Used to pick the time for inactivity.
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' // number of unread messages,
// the one-letter circle for the contacts (when there is not avatar) and a white background.
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') {
// for the zooming on photos / media
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') { // for the zooming on photos / media
exclude group: 'com.android.support', module: 'support-annotations'
}
implementation 'com.annimon:stream:1.1.8' // brings future java streams api to SDK Version < 24
implementation 'com.codewaves.stickyheadergrid:stickyheadergrid:0.9.4' // glues the current time segment text in the gallery to the top.
// Replacement for ContentResolver
// that protects against the Surreptitious Sharing attack.
// <https://github.com/cketti/SafeContentResolver>
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v14:1.0.0'
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') {
// for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
}
gplayImplementation 'com.google.android.gms:play-services-location:21.3.0'
// gplayImplementation('com.google.firebase:firebase-messaging:23.4.1') { // for PUSH notifications
// exclude group: 'com.google.firebase', module: 'firebase-core'
// exclude group: 'com.google.firebase', module: 'firebase-analytics'
// exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
// }
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.assertj:assertj-core:3.27.3'
testImplementation 'org.mockito:mockito-core:5.18.0'
testImplementation 'org.powermock:powermock-api-mockito:1.7.4'
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9'
testImplementation 'org.powermock:powermock-classloading-xstream:2.0.9'
testImplementation 'junit:junit:4.13.1'
testImplementation 'org.assertj:assertj-core:1.7.1'
testImplementation 'org.mockito:mockito-core:1.9.5'
testImplementation 'org.powermock:powermock-api-mockito:1.6.1'
testImplementation 'org.powermock:powermock-module-junit4:1.6.1'
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
androidTestImplementation 'androidx.test:runner:1.7.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.7.0'
androidTestImplementation 'androidx.test:rules:1.7.0'
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
androidTestImplementation ('org.assertj:assertj-core:3.27.3') {
androidTestImplementation ('org.assertj:assertj-core:1.7.1') {
exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

@@ -1,38 +0,0 @@
ArcaneChat is a decentralized and secure instant messenger that is easy to use for friends and family.
• Private. Instant on-boarding without a phone number or other private data.
• Friends & Family: Only chat with people you know. Unknown users cannot message or follow you without mutual consent.
• Flexible. Supports multiple chat profiles and is easy to setup on multiple devices.
• Extensible. Use mini-apps in chats like shopping lists, calendars or games.
• Reliable. Works under bad and adversarial network conditions.
• Secure. Audited End-to-End encryption safe against network and server attacks.
• Sovereign. Can be run with your own e-mail address or server.
ArcaneChat is a Delta Chat client and was created with a focus on usability, good user experience, and saving data plan. Also the app usually experiments with new features that eventually might get added to the official Delta Chat client.
<b>Main differences with official Delta Chat client:</b>
<ul>
<li>Support for some markdown styles in text messages (bold, italic, strike, etc.)</li>
<li>Support for displaying Telegram's animated stickers (.tgs files)</li>
<li>Support for SVG images previews</li>
<li>Multiple color themes/skins</li>
<li>It is possible to disable profiles to completely disconnect them saving data/bandwidth</li>
<li>You can easily see the connection status of all your profiles in the profile switcher</li>
<li>Extra option to share location for 24 hours</li>
<li>Clicking on a message with a POI location, will open the POI on the map</li>
<li>Last-seen status of contacts is shown in your contact list, like in WhatsApp, Telegram, etc.</li>
<li>Videos are played in loop, useful for short GIF videos</li>
<li>Verified icon is shown in the chat list for the "Device Messages" and "Saved Messages" chat to avoid fishing attempts by scammer pretending to be the official chats</li>
<li>Voice messages have more aggressive compression in "worse quality" mode to save data plan</li>
<li>Automatic download of messages limited to 640KB by default</li>
<li>Profile's display name is always shown in the app's title bar instead of the name of the app</li>
<li>For mini-apps developers: there are some extra features in the WebXDC API, check https://github.com/ArcaneChat/android/#webxdc</li>
<li>Better settings organization with additional "Privacy" section</li>
</ul>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

@@ -1 +0,0 @@
⚡ Fast encrypted chats for the family 🎉
@@ -1 +0,0 @@
ArcaneChat
@@ -1,36 +0,0 @@
ArcaneChat — децентрализованный и защищённый мессенджер, удобный для друзей и семьи.
• Анонимность. Мгновенный вход без номера телефона, e-mail или других личных данных.
• Гибкость. Поддерживает несколько профилей чатов и легко настраивается на нескольких устройствах.
• Расширяемость. В чатах можно использовать мини-приложения: списки покупок, календари или игры.
• Надёжность. Работает даже при плохом соединении и в сложных сетевых условиях.
• Безопасность. Проверенное сквозное шифрование, защищённое от сетевых и серверных атак.
• Самостоятельность. Может работать с вашим собственным e-mail-адресом или сервером.
ArcaneChat — клиент Delta Chat, разработанный с акцентом на удобство, качественный UX и экономию трафика. Также приложение часто экспериментирует с новыми функциями, которые со временем могут быть добавлены в официальный клиент Delta Chat.
<b>Основные отличия от официального клиента Delta Chat:</b>
<ul>
<li>Поддержка некоторых стилей markdown в текстовых сообщениях (жирный, курсив, зачёркнутый и т.д.)</li>
<li>Поддержка отображения анимированных стикеров Telegram (.tgs-файлы)</li>
<li>Поддержка предпросмотра SVG-изображений</li>
<li>Несколько цветовых тем/скинов</li>
<li>Возможность отключать профили, полностью отключая им доступ в сеть для экономии трафика</li>
<li>На панели переключения профилей видно состояние подключения каждого профиля</li>
<li>Дополнительная опция для обмена местоположением на 12 часов</li>
<li>Нажатие на сообщение с POI открывает его на карте</li>
<li>Статус «был(а) в сети» отображается в списке контактов, как в WhatsApp, Telegram и т.д.</li>
<li>Видео воспроизводятся по кругу — удобно для коротких GIF-видео</li>
<li>У чата «Device Messages» в списке чатов отображается значок подтверждения</li>
<li>В режиме «низкое качество» голосовые сообщения сжимаются сильнее для экономии трафика</li>
<li>Автоматическая загрузка сообщений по умолчанию ограничена 640KB</li>
<li>Отображаемое имя профиля всегда видно в заголовке приложения вместо названия приложения</li>
<li>Для разработчиков мини-приложений: доступны дополнительные возможности WebXDC API, см. https://github.com/ArcaneChat/android/#webxdc</li>
<li>Более удобная организация настроек с дополнительным разделом «Privacy»</li>
</ul>
@@ -1 +0,0 @@
⚡ Быстрые зашифрованные чаты для семьи 🎉
@@ -1 +0,0 @@
ArcaneChat
Generated
+94 -26
View File
@@ -3,15 +3,15 @@
"android": {
"inputs": {
"devshell": "devshell",
"flake-utils": "flake-utils",
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1775939535,
"narHash": "sha256-Zq1U7Vhw5ctvhJQy+3ShqIv7Mplf3XkgJY+QJnhfUGQ=",
"lastModified": 1710633978,
"narHash": "sha256-yemnwSvW7cdWtXGpivFA5jDO35rGPs6fqxlQ4l6ODXs=",
"owner": "tadfisher",
"repo": "android-nixpkgs",
"rev": "d2e16192309bf3101e4998ffa62e914819dee077",
"rev": "e91fb3d8517538e5ad9b422c9a4f604b56008a9e",
"type": "github"
},
"original": {
@@ -22,17 +22,18 @@
},
"devshell": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"android",
"nixpkgs"
]
},
"locked": {
"lastModified": 1768818222,
"narHash": "sha256-460jc0+CZfyaO8+w8JNtlClB2n4ui1RbHfPTLkpwhU8=",
"lastModified": 1708939976,
"narHash": "sha256-O5+nFozxz2Vubpdl1YZtPrilcIXPcRAjqNdNE8oCRoA=",
"owner": "numtide",
"repo": "devshell",
"rev": "255a2b1725a20d060f566e4755dbf571bbbb5f76",
"rev": "5ddecd67edbd568ebe0a55905273e56cc82aabe3",
"type": "github"
},
"original": {
@@ -46,11 +47,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"lastModified": 1701680307,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
"type": "github"
},
"original": {
@@ -64,11 +65,47 @@
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"lastModified": 1709126324,
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_3": {
"inputs": {
"systems": "systems_3"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_4": {
"inputs": {
"systems": "systems_4"
},
"locked": {
"lastModified": 1705309234,
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
"type": "github"
},
"original": {
@@ -79,11 +116,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1775710090,
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
"lastModified": 1709237383,
"narHash": "sha256-cy6ArO4k5qTx+l5o+0mL9f5fa86tYUX3ozE1S+Txlds=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4c1018dae018162ec878d42fec712642d214fdfa",
"rev": "1536926ef5621b09bba54035ae2bb6d806d72ac8",
"type": "github"
},
"original": {
@@ -95,11 +132,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1775823930,
"narHash": "sha256-ALT447J7FcxP/97J01A/gp/hgdO5lXRsm+zLMt+gIjc=",
"lastModified": 1710889954,
"narHash": "sha256-Pr6F5Pmd7JnNEMHHmspZ0qVqIBVxyZ13ik1pJtm2QXk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "8c11f88bb9573a10a7d6bf87161ef08455ac70b9",
"rev": "7872526e9c5332274ea5932a0c3270d6e4724f3b",
"type": "github"
},
"original": {
@@ -111,11 +148,11 @@
},
"nixpkgs_3": {
"locked": {
"lastModified": 1744536153,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
"lastModified": 1706487304,
"narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
"rev": "90f456026d284c22b3e3497be980b2e47d0b28ac",
"type": "github"
},
"original": {
@@ -128,21 +165,22 @@
"root": {
"inputs": {
"android": "android",
"flake-utils": "flake-utils_2",
"flake-utils": "flake-utils_3",
"nixpkgs": "nixpkgs_2",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": "flake-utils_4",
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1775877051,
"narHash": "sha256-wpSQm2PD/w4uRo2wb8utk0b5hOBkkg/CZ1xICY+qB7M=",
"lastModified": 1711073443,
"narHash": "sha256-PpNb4xq7U5Q/DdX40qe7CijUsqhVVM3VZrhN0+c6Lcw=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "08b4f3633471874c8894632ade1b78d75dbda002",
"rev": "eec55ba9fcde6be4c63942827247e42afef7fafe",
"type": "github"
},
"original": {
@@ -180,6 +218,36 @@
"repo": "default",
"type": "github"
}
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_4": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
+7 -11
View File
@@ -15,27 +15,23 @@
pkgs = import nixpkgs { inherit system overlays; };
android-sdk = android.sdk.${system} (sdkPkgs:
with sdkPkgs; [
build-tools-35-0-0
build-tools-33-0-1
cmdline-tools-latest
ndk-bundle
platform-tools
platforms-android-36
ndk-27-2-12479018
platforms-android-34
ndk-23-2-8568313
]);
rust-version = pkgs.lib.removeSuffix "\n"
(builtins.readFile ./scripts/rust-toolchain);
in
{
formatter = pkgs.nixpkgs-fmt;
devShells.default = pkgs.mkShell rec {
in {
devShells.default = pkgs.mkShell {
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
ANDROID_NDK_ROOT =
"${android-sdk}/share/android-sdk/ndk/27.2.12479018";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/35.0.0/aapt2";
"${android-sdk}/share/android-sdk/ndk/23.2.8568313";
buildInputs = [
android-sdk
pkgs.openjdk17
pkgs.perl
(pkgs.buildPackages.rust-bin.stable."${rust-version}".minimal.override {
targets = [
"armv7-linux-androideabi"
+4 -23
View File
@@ -28,26 +28,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:6f54e2c4e49405673e2bb9",
"android_client_info": {
"package_name": "com.github.arcanechat.beta"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyBYH8Iznh8btYX7g_udv_bu68VH30zzxho"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:aff82fbc40c8172e3e2bb9",
"android_client_info": {
"package_name": "com.github.arcanechat"
"package_name": "chat.delta.beta"
}
},
"oauth_client": [],
@@ -66,7 +47,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:92b4cf12669cc2083e2bb9",
"android_client_info": {
"package_name": "chat.delta.lite"
"package_name": "com.b44t.messenger"
}
},
"oauth_client": [],
@@ -85,7 +66,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:228a205b8aa2bacc3e2bb9",
"android_client_info": {
"package_name": "chat.delta.lite.beta"
"package_name": "com.b44t.messenger.beta"
}
},
"oauth_client": [],
@@ -102,4 +83,4 @@
}
],
"configuration_version": "1"
}
}
+1
View File
@@ -1,5 +1,6 @@
android.defaults.buildfeatures.buildconfig=true
android.enableJetifier=true
android.nonFinalResIds=false
android.nonTransitiveRClass=false
android.useAndroidX=true
org.gradle.jvmargs=-Xmx4608m
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
distributionSha256Sum=ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

-1
View File
@@ -31,6 +31,5 @@ LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT
LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS
LOCAL_SRC_FILES := dc_wrapper.c
LOCAL_LDFLAGS += -Wl,--build-id=none
include $(BUILD_SHARED_LIBRARY)
+1 -1
View File
@@ -1,4 +1,4 @@
APP_PLATFORM := android-21
APP_PLATFORM := android-16
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
APP_STL := none
+159 -165
View File
@@ -7,6 +7,57 @@
#include "deltachat-core-rust/deltachat-ffi/deltachat.h"
#if __ANDROID_API__ == 16
unsigned long getauxval(unsigned long type) {
return 0;
}
#include <sys/socket.h>
#include <unistd.h>
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
int flags)
{
if (flags != 0) {
// Not supported by the fallback.
return -1;
}
if (vlen == 0) {
return 0;
}
ssize_t n = sendmsg(sockfd, &msgvec->msg_hdr, flags);
if (n == -1) {
return -1;
}
(*msgvec).msg_len = n;
return 1;
}
int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
int flags, struct timespec *timeout)
{
if (flags != 0) {
// Not supported by the fallback.
return -1;
}
if (vlen == 0) {
return 0;
}
int n = recvmsg(sockfd, &msgvec->msg_hdr, flags);
if (n == -1) {
return -1;
}
(*msgvec).msg_len = n;
return 1;
}
#endif
static dc_msg_t* get_dc_msg(JNIEnv *env, jobject obj);
@@ -153,42 +204,6 @@ static uint32_t* jintArray2uint32Pointer(JNIEnv* env, jintArray ja, int* ret_icn
}
/************************************************************
* DcEventChannel
************************************************************/
static dc_event_channel_t* get_dc_event_channel(JNIEnv *env, jobject obj)
{
static jfieldID fid = 0;
if (fid==0) {
jclass cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, cls, "eventChannelCPtr", "J" /*Signature, J=long*/);
}
if (fid) {
return (dc_event_channel_t*)(*env)->GetLongField(env, obj, fid);
}
return NULL;
}
JNIEXPORT jlong Java_com_b44t_messenger_DcEventChannel_createEventChannelCPtr(JNIEnv *env, jobject obj)
{
return (jlong)dc_event_channel_new();
}
JNIEXPORT void Java_com_b44t_messenger_DcEventChannel_unrefEventChannelCPtr(JNIEnv *env, jobject obj)
{
dc_event_channel_unref(get_dc_event_channel(env, obj));
}
JNIEXPORT jlong Java_com_b44t_messenger_DcEventChannel_getEventEmitterCPtr(JNIEnv *env, jobject obj)
{
return (jlong)dc_event_channel_get_event_emitter(get_dc_event_channel(env, obj));
}
/*******************************************************************************
* DcAccounts
******************************************************************************/
@@ -208,11 +223,11 @@ static dc_accounts_t* get_dc_accounts(JNIEnv *env, jobject obj)
}
JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir, jobject chanObj)
JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir)
{
CHAR_REF(dir);
int writable = 1;
jlong accountsCPtr = (jlong)dc_accounts_new_with_event_channel(dirPtr, writable, get_dc_event_channel(env, chanObj));
jlong accountsCPtr = (jlong)dc_accounts_new(dirPtr, writable);
CHAR_UNREF(dir);
return accountsCPtr;
}
@@ -235,7 +250,7 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_getJsonrpcInstanceCPtr(JNIEnv
}
JNIEXPORT void Java_com_b44t_messenger_DcAccounts_startIo2(JNIEnv *env, jobject obj)
JNIEXPORT void Java_com_b44t_messenger_DcAccounts_startIo(JNIEnv *env, jobject obj)
{
dc_accounts_start_io(get_dc_accounts(env, obj));
}
@@ -261,15 +276,15 @@ JNIEXPORT void Java_com_b44t_messenger_DcAccounts_setPushDeviceToken(JNIEnv *env
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcAccounts_backgroundFetch(JNIEnv *env, jobject obj, jint timeout_seconds)
JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_addAccount(JNIEnv *env, jobject obj)
{
return dc_accounts_background_fetch(get_dc_accounts(env, obj), timeout_seconds) != 0;
return dc_accounts_add_account(get_dc_accounts(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_DcAccounts_stopBackgroundFetch(JNIEnv *env, jobject obj)
JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_addClosedAccount(JNIEnv *env, jobject obj)
{
dc_accounts_stop_background_fetch(get_dc_accounts(env, obj));
return dc_accounts_add_closed_account(get_dc_accounts(env, obj));
}
@@ -578,10 +593,10 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_createChatByContactId(JNIEnv *e
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jstring name)
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jboolean verified, jstring name)
{
CHAR_REF(name);
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), 0, namePtr);
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), verified, namePtr);
CHAR_UNREF(name);
return ret;
}
@@ -695,14 +710,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgInfo(JNIEnv *env, jobj
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_sendEditRequest(JNIEnv *env, jobject obj, jint msg_id, jstring text)
{
CHAR_REF(text);
dc_send_edit_request(get_dc_context(env, obj), msg_id, textPtr);
CHAR_UNREF(text);
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgHtml(JNIEnv *env, jobject obj, jint msg_id)
{
char* temp = dc_get_msg_html(get_dc_context(env, obj), msg_id);
@@ -727,15 +734,6 @@ JNIEXPORT void Java_com_b44t_messenger_DcContext_deleteMsgs(JNIEnv *env, jobject
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_sendDeleteRequest(JNIEnv *env, jobject obj, jintArray msg_ids)
{
int msg_ids_cnt = 0;
uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
dc_send_delete_request(get_dc_context(env, obj), msg_ids_ptr, msg_ids_cnt);
free(msg_ids_ptr);
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_forwardMsgs(JNIEnv *env, jobject obj, jintArray msg_ids, jint chat_id)
{
int msg_ids_cnt = 0;
@@ -744,13 +742,6 @@ JNIEXPORT void Java_com_b44t_messenger_DcContext_forwardMsgs(JNIEnv *env, jobjec
free(msg_ids_ptr);
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_saveMsgs(JNIEnv *env, jobject obj, jintArray msg_ids)
{
int msg_ids_cnt = 0;
uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
dc_save_msgs(get_dc_context(env, obj), msg_ids_ptr, msg_ids_cnt);
free(msg_ids_ptr);
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_resendMsgs(JNIEnv *env, jobject obj, jintArray msg_ids)
{
@@ -762,6 +753,12 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_resendMsgs(JNIEnv *env, job
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_prepareMsg(JNIEnv *env, jobject obj, jint chat_id, jobject msg)
{
return dc_prepare_msg(get_dc_context(env, obj), chat_id, get_dc_msg(env, msg));
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendMsg(JNIEnv *env, jobject obj, jint chat_id, jobject msg)
{
return dc_send_msg(get_dc_context(env, obj), chat_id, get_dc_msg(env, msg));
@@ -777,10 +774,18 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendTextMsg(JNIEnv *env, jobjec
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_sendWebxdcStatusUpdate(JNIEnv *env, jobject obj, jint msg_id, jstring payload)
JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendVideochatInvitation(JNIEnv *env, jobject obj, jint chat_id)
{
return (jint)dc_send_videochat_invitation(get_dc_context(env, obj), chat_id);
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_sendWebxdcStatusUpdate(JNIEnv *env, jobject obj, jint msg_id, jstring payload, jstring descr)
{
CHAR_REF(payload);
jboolean ret = dc_send_webxdc_status_update(get_dc_context(env, obj), msg_id, payloadPtr, NULL) != 0;
CHAR_REF(descr);
jboolean ret = dc_send_webxdc_status_update(get_dc_context(env, obj), msg_id, payloadPtr, descrPtr) != 0;
CHAR_UNREF(descr);
CHAR_UNREF(payload);
return ret;
}
@@ -849,7 +854,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getConfig(JNIEnv *env, jobje
}
dc_str_unref(temp);
CHAR_UNREF(key);
return ret;
return ret; /* returns NULL only if key is unset and "def" is NULL */
}
@@ -879,16 +884,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getSecurejoinQrSvg(JNIEnv *e
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_createQrSvg(JNIEnv *env, jobject obj, jstring payload)
{
CHAR_REF(payload);
char* temp = dc_create_qr_svg(payloadPtr);
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
CHAR_UNREF(payload);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_joinSecurejoin(JNIEnv *env, jobject obj, jstring qr)
{
CHAR_REF(qr);
@@ -946,6 +941,27 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getContactEncrInfo(JNIEnv *e
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_initiateKeyTransfer(JNIEnv *env, jobject obj)
{
jstring setup_code = NULL;
char* temp = dc_initiate_key_transfer(get_dc_context(env, obj));
if (temp) {
setup_code = JSTRING_NEW(temp);
dc_str_unref(temp);
}
return setup_code;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_continueKeyTransfer(JNIEnv *env, jobject obj, jint msg_id, jstring setupCode)
{
CHAR_REF(setupCode);
jboolean ret = dc_continue_key_transfer(get_dc_context(env, obj), msg_id, setupCodePtr);
CHAR_UNREF(setupCode);
return ret;
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_imex(JNIEnv *env, jobject obj, jint what, jstring dir)
{
CHAR_REF(dir);
@@ -1261,12 +1277,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcChat_getColor(JNIEnv *env, jobject obj)
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isEncrypted(JNIEnv *env, jobject obj)
{
return dc_chat_is_encrypted(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isUnpromoted(JNIEnv *env, jobject obj)
{
return dc_chat_is_unpromoted(get_dc_chat(env, obj))!=0;
@@ -1291,6 +1301,16 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_canSend(JNIEnv *env, jobject o
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtected(JNIEnv *env, jobject obj)
{
return dc_chat_is_protected(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtectionBroken(JNIEnv *env, jobject obj)
{
return dc_chat_is_protection_broken(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isSendingLocations(JNIEnv *env, jobject obj)
{
@@ -1311,6 +1331,12 @@ JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMedia(JNIEnv *env,
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_getNextMedia(JNIEnv *env, jobject obj, jint msg_id, jint dir, jint type1, jint type2, jint type3)
{
return dc_get_next_media(get_dc_context(env, obj), msg_id, dir, type1, type2, type3);
}
JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMsgs(JNIEnv *env, jobject obj, jint chat_id, jint flags, jint marker1before)
{
dc_array_t* ca = dc_get_chat_msgs(get_dc_context(env, obj), chat_id, flags, marker1before);
@@ -1436,7 +1462,7 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_hasLocation(JNIEnv *env, jobjec
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getViewType(JNIEnv *env, jobject obj)
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getType(JNIEnv *env, jobject obj)
{
return dc_msg_get_viewtype(get_dc_msg(env, obj));
}
@@ -1448,12 +1474,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getInfoType(JNIEnv *env, jobject ob
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getInfoContactId(JNIEnv *env, jobject obj)
{
return dc_msg_get_info_contact_id(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getState(JNIEnv *env, jobject obj)
{
return dc_msg_get_state(get_dc_msg(env, obj));
@@ -1592,38 +1612,57 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getWebxdcInfoJson(JNIEnv *env, j
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getWebxdcHref(JNIEnv *env, jobject obj)
{
char* temp = dc_msg_get_webxdc_href(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isForwarded(JNIEnv *env, jobject obj)
{
return dc_msg_is_forwarded(get_dc_msg(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isIncreation(JNIEnv *env, jobject obj)
{
return dc_msg_is_increation(get_dc_msg(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isInfo(JNIEnv *env, jobject obj)
{
return dc_msg_is_info(get_dc_msg(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isSetupMessage(JNIEnv *env, jobject obj)
{
return dc_msg_is_setupmessage(get_dc_msg(env, obj));
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_hasHtml(JNIEnv *env, jobject obj)
{
return dc_msg_has_html(get_dc_msg(env, obj))!=0;
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setSubject(JNIEnv *env, jobject obj, jstring text)
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getSetupCodeBegin(JNIEnv *env, jobject obj)
{
CHAR_REF(text);
dc_msg_set_subject(get_dc_msg(env, obj), textPtr);
CHAR_UNREF(text);
char* temp = dc_msg_get_setupcodebegin(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getVideochatUrl(JNIEnv *env, jobject obj)
{
char* temp = dc_msg_get_videochat_url(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getVideochatType(JNIEnv *env, jobject obj)
{
return (jint)dc_msg_get_videochat_type(get_dc_msg(env, obj));
}
@@ -1635,37 +1674,12 @@ JNIEXPORT void Java_com_b44t_messenger_DcMsg_setText(JNIEnv *env, jobject obj, j
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setHtml(JNIEnv *env, jobject obj, jstring text)
{
CHAR_REF(text);
dc_msg_set_html(get_dc_msg(env, obj), textPtr);
CHAR_UNREF(text);
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobject obj)
{
char* temp = dc_msg_get_poi_location(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isEdited(JNIEnv *env, jobject obj)
{
return dc_msg_is_edited(get_dc_msg(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFileAndDeduplicate(JNIEnv *env, jobject obj, jstring file, jstring name, jstring filemime)
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFile(JNIEnv *env, jobject obj, jstring file, jstring filemime)
{
CHAR_REF(file);
CHAR_REF(name);
CHAR_REF(filemime);
dc_msg_set_file_and_deduplicate(get_dc_msg(env, obj), filePtr, namePtr, filemimePtr);
dc_msg_set_file(get_dc_msg(env, obj), filePtr, filemimePtr);
CHAR_UNREF(filemime);
CHAR_UNREF(name);
CHAR_UNREF(file);
}
@@ -1714,15 +1728,6 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcMsg_getParentCPtr(JNIEnv *env, jobject
return (jlong)dc_msg_get_parent(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getOriginalMsgId(JNIEnv *env, jobject obj)
{
return (jint)dc_msg_get_original_msg_id(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getSavedMsgId(JNIEnv *env, jobject obj)
{
return (jint)dc_msg_get_saved_msg_id(get_dc_msg(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getError(JNIEnv *env, jobject obj)
{
@@ -1773,15 +1778,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getName(JNIEnv *env, jobject
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getAuthName(JNIEnv *env, jobject obj)
{
char* temp = dc_contact_get_auth_name(get_dc_contact(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getDisplayName(JNIEnv *env, jobject obj)
{
char* temp = dc_contact_get_display_name(get_dc_contact(env, obj));
@@ -1800,6 +1796,15 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getAddr(JNIEnv *env, jobject
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getNameNAddr(JNIEnv *env, jobject obj)
{
char* temp = dc_contact_get_name_n_addr(get_dc_contact(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getProfileImage(JNIEnv *env, jobject obj)
{
char* temp = dc_contact_get_profile_image(get_dc_contact(env, obj));
@@ -1847,22 +1852,11 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isVerified(JNIEnv *env, job
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isKeyContact(JNIEnv *env, jobject obj)
{
return dc_contact_is_key_contact(get_dc_contact(env, obj))==1;
}
JNIEXPORT jint Java_com_b44t_messenger_DcContact_getVerifierId(JNIEnv *env, jobject obj)
{
return dc_contact_get_verifier_id(get_dc_contact(env, obj));
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isBot(JNIEnv *env, jobject obj)
{
return dc_contact_is_bot(get_dc_contact(env, obj)) != 0;
}
/*******************************************************************************
* DcLot
@@ -1967,7 +1961,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQr(JNIEnv *env, jo
JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQrSvg(JNIEnv *env, jobject obj)
{
char* temp = dc_create_qr_svg(dc_backup_provider_get_qr(get_dc_backup_provider(env, obj)));
char* temp = dc_backup_provider_get_qr_svg(get_dc_backup_provider(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
-83
View File
@@ -1,83 +0,0 @@
.PHONY: apk
apk:
./scripts/rebrand.sh
./gradlew --offline assembleGplayRelease
./scripts/undo_rebrand.sh
.PHONY: aab
aab:
./scripts/rebrand.sh
sed -i 's/signingConfigs.releaseApk/signingConfigs.releaseBundle/g' build.gradle
./gradlew --offline bundleGplayRelease
sed -i 's/signingConfigs.releaseBundle/signingConfigs.releaseApk/g' build.gradle
./scripts/undo_rebrand.sh
.PHONY: foss
foss:
./scripts/rebrand.sh
./gradlew --offline assembleFossRelease
./scripts/undo_rebrand.sh
.PHONY: install
install:
adb -d install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: emulator-install
emulator-install:
adb install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: fetch
fetch:
git fetch upstream
.PHONY: clean
clean:
./gradlew --offline clean
# CORE:
.PHONY: fetch-core
fetch-core:
cd ../core && git fetch upstream
.PHONY: core
core:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-fast
core-fast:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh arm64-v8a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-v7
core-v7:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh armeabi-v7a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-x86
core-x86:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh x86; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: link
link:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
.PHONY: unlink
unlink:
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
+1
View File
@@ -0,0 +1 @@
التواصل الفوري عبر البريد الكتروني
+1
View File
@@ -0,0 +1 @@
Okamžitá komunikace prostřednictvím e-mailu
+1
View File
@@ -0,0 +1 @@
Sofort über E-Mail kommunizieren
+1
View File
@@ -0,0 +1 @@
Delta Chat
+10
View File
@@ -0,0 +1,10 @@
If a classical-email-user sends an email to a group and adds new recipients, the new recipients will become group members.
Treat attached PGP keys from classical-email-user as a signal to prefer mutual encryption.
Treat encrypted or signed messages from classical-email-user as a signal to prefer mutual encryption.
Fix migration of old databases.
Fix: send ephemeral timer change messages only of the chat is already known by other members.
Fix: use relative paths to database and avoid problems eg. on migration to other devices or paths.
Fix read/write timeouts for IMAP over SOCKS5.
Fix: do not send "group name changes" if no character was modified.
Add Greek translation, update other translations.
Update to core104.
+13
View File
@@ -0,0 +1,13 @@
fix: make archived chats visible that don't get unarchived automatically (muted chats): add an unread counter and move the archive to the top
fix: send AVIF, HEIC, TXT, PPT, XLS, XML files as such
fix: trigger reconnection when failing to fetch existing messages
fix: do not retry fetching existing messages after failure, prevents infinite reconnection loop
fix: do not add an error if the message is encrypted but not signed
fix: do not strip leading spaces from message lines
fix corner cases on sending quoted texts
fix STARTTLS connection
fix: do not treat invalid email addresses as an exception
fix: flush relative database paths introduced in 1.34.8 in time
faster updates of chat lists and contact list
update translations
update to core106
+5
View File
@@ -0,0 +1,5 @@
* add SOCKS5 options to "Add Account" and "Configure"
* introduce DNS cache: if DNS stops working on a network, Delta Chat will still be able to connect to IMAP by using previous IP addresses
* show full messages: do not load remote content for requests automatically
* fix various bugs and improve logging
* update translations
+8
View File
@@ -0,0 +1,8 @@
* new, easy way to add a second device to your account: select "Add as a Second Device" after installation and scan a QR code from the first device
* view "All Media" of all chats
* new "Clear Chat" option
* show notifications for all accounts
* make better use of dark/light mode in "Show full message"
* show icon beside info messages of apps
* resilience against outages by caching DNS results for SMTP and IMAP connections
* speed and reliability improvements, fixes
+9
View File
@@ -0,0 +1,9 @@
* add a device message after setting up a second device using "Settings / Add Second Device"
* speed up "Add as Second Device" connection time significantly on the getter side
* if possible, show Wi-Fi-name directly after scanning an "Add Second Device" QR code
* fix immediate restarts of "Add Second Device"
* fix: do not show just trashed media in "All Media" view
* fix: update database if needed after "Add Second Device"
* update translations and local help
* update to core112.6
+6
View File
@@ -0,0 +1,6 @@
* start with light/dark theme depending on system theme
* fix verification icons for one-to-one chats
* fix fetch errors due to erroneous EOF detection in long IMAP responses
* more bug fixes
* update translations and local help
* update to core112.7
+4
View File
@@ -0,0 +1,4 @@
* use SOCKS5 configuration also for loading remote images in HTML mails
* bug fixes
* update translations and local help
* update to core112.8
+6
View File
@@ -0,0 +1,6 @@
* new webxdc APIs: importFiles() and sendToChat()
* remove upper size limit of attachments
* save traffic and storage: recode large PNG and other supported image formats (large JPEG were always recoded; images send as "File" are still not recorded or changed otherwise)
* save local storage: compress HTML emails in the database
* improve group membership consistency
* lots of bug fixes
+5
View File
@@ -0,0 +1,5 @@
* use image editor for avatar selection when possible
* improve loading screen in dark mode
* update "verified icon"
* add Luri Bakhtiari translation, update other translations
* lots of bug fixes
+5
View File
@@ -0,0 +1,5 @@
* use image editor for avatar selection when possible
* improve loading screen in dark mode
* update "verified icon"
* add Luri Bakhtiari translation, update other translations
* lots of bug fixes
+6
View File
@@ -0,0 +1,6 @@
- One-to-one chats guarantee end-to-end encryption for contacts with a green checkmark now
- For everyone\'s simplicity, we also mark these chats with green checkmarks
- Groups are created automatically with guaranteed end-to-end encryption if possible
- Accept/Blocked, Archived, Pinned, Mute is synced across all your devices
- More improvements in camera, voice messages, backup-all, screen reader, per-account wallpapers, gallery select-all, webxdc landscape
- Tons of bug fixes
+6
View File
@@ -0,0 +1,6 @@
- One-to-one chats guarantee end-to-end encryption for contacts with a green checkmark now
- For everyone\'s simplicity, we also mark these chats with green checkmarks
- Groups are created automatically with guaranteed end-to-end encryption if possible
- Accept/Blocked, Archived, Pinned, Mute is synced across all your devices
- More improvements in camera, voice messages, backup-all, screen reader, per-account wallpapers, gallery select-all, webxdc landscape
- Tons of bug fixes
+6
View File
@@ -0,0 +1,6 @@
- sync changes on "Your Profile Name", "Show Class Mails", "Read Receipts" options across devices
- remove receiver limit on .xdc size
- fix log in errors for providers as 163.com
- fix decryption errors when using multiple private keys
- fix database locked errors on webxdc updates
- update translations
+8
View File
@@ -0,0 +1,8 @@
- "Reactions": long tap a message to react to it
- If you cannot scan QR codes, share them as "invite links"
- Unread messages of all accounts are counted and shown in title now
- Webxdc sending limit removed
- Long-tapping chatlist items now allow to mute/unmute chats directly
- Ask for system unlock secret before opening "Password & Account"
- New option "Settings / Advanced / Read System Address Book"
- Tons of bug fixes
+7
View File
@@ -0,0 +1,7 @@
- new onboarding: you can create a new profile with one tap on "Create New Profile" - or use an existing login or second-device-setup as usual
- contacts can be attached as "Cards" at "Attach / Contact"; when the receiver taps the cards, guaranteed end-to-end encrypted can be established
- add contacts manually at "New Chat / New Contact / Add Contact Manually"
- send any emoji as reaction
- show reactions in summaries
- pin/archive/etc chats directly from search result
- bug fixed and more
+20
View File
@@ -0,0 +1,20 @@
Delta Chat is a messaging app that is completely compatible with the existing
e-mail infrastructure.
So, with Delta Chat you get the ease of well-known messengers with the reach of
e-mail. Moreover, you're independent from other companies or services -- as your
data are not related to Delta Chat, you won't even add new dependencies here.
Some features at a glance:
* Secure with automatic end-to-end-encryption, supporting the new <a href="https://autocrypt.org">Autocrypt</a> standard
* Fast by the use of Push-IMAP
* Largest userbase -- receivers not using Delta Chat can be reached as well
* Compatible -- not only to itself
* Elegant and simple user interface
* Distributed system
* No Spam -- only messages of known users are shown by default
* Reliable -- safe for professional use
* Trustworthy -- can even be used for business messages
* Fully OpenSource and Standards based
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

+1
View File
@@ -0,0 +1 @@
Chat over e-mail. Elegantly Retro, Decentralized and Open. Privacy by Design.
+1
View File
@@ -0,0 +1 @@
Delta Chat
+1
View File
@@ -0,0 +1 @@
Tujmesaĝilo uzanta retpoŝton
+19
View File
@@ -0,0 +1,19 @@
Delta Chat es una aplicación de mensajería totalmente compatible con
infraestructura de correo electrónico.
Por lo tanto, con Delta Chat se obtiene la facilidad de conocidos mensajeros con el alcance de
e-mail. Además, eres independiente de otras empresas o servicios, ya que tu
Los datos no están relacionados con Delta Chat, ni siquiera agregará nuevas dependencias aquí.
Algunas características de un vistazo:
* Seguro con cifrado automático de extremo a extremo, compatible con el nuevo estándar <a href="https://autocrypt.org">Autocrypt</a>
* Rápido mediante el uso de Push-IMAP
* Mayor base de usuarios -- también se puede llegar a los receptores que no usan Delta Chat
* Compatible -- no sólo consigo mismo
* Interfaz de usuario elegante y sencilla
* Sistema distribuido
* Sin spam -- sólo los mensajes de usuarios conocidos se muestran por defecto
* Fiable -- seguro para uso profesional
* Confiable -- incluso se puede utilizar para mensajes de negocios
* Totalmente OpenSource y basado en estándares
+1
View File
@@ -0,0 +1 @@
Comuníquese al instante mediante correo electrónico
+1
View File
@@ -0,0 +1 @@
Delta Chat
+1
View File
@@ -0,0 +1 @@
Kiire suhtlus e-posti kaudu
+1
View File
@@ -0,0 +1 @@
Bat bateko mezularitza e-mail bidez
+1
View File
@@ -0,0 +1 @@
برقراری ارتباط فوری از طریق ایمیل
+1
View File
@@ -0,0 +1 @@
Communiquez instantanément par courriel
+1
View File
@@ -0,0 +1 @@
Dèan conaltradh sa bhad le post-d
+1
View File
@@ -0,0 +1 @@
התקשרות ישירה דרך דוא״ל
+10
View File
@@ -0,0 +1,10 @@
Se un utente e-mail classica invia un'e-mail a un gruppo e aggiunge nuovi destinatari, i nuovi destinatari diventeranno membri del gruppo.
Tratta le chiavi PGP allegate dall'utente di posta elettronica classica come un segnale per preferire la crittografia reciproca.
Tratta i messaggi crittografati o firmati provenienti dall'utente di posta elettronica classica come un segnale per preferire la crittografia reciproca.
Corretta la migrazione dei vecchi database.
Correzione: invia messaggi di modifica temporanei del timer solo nella chat già conosciuta da altri membri.
Correzione: utilizza percorsi relativi al database ed evita problemi ad es. sulla migrazione verso altri dispositivi o percorsi.
Correzione: timeout di lettura/scrittura per IMAP su SOCKS5.
Correzione: non inviare "modifiche al nome del gruppo" se nessun carattere è stato modificato.
Aggiungi la traduzione greca, aggiornate altre traduzioni.
Aggiornamento al core104.
+13
View File
@@ -0,0 +1,13 @@
correzione: rendere visibili le chat archiviate che non vengono annullate automaticamente (chat disattivate): aggiunge un contatore non letto e sposta l'archivio in alto
correzione: invia file AVIF, HEIC, TXT, PPT, XLS, XML come tali
correzione: attiva la riconnessione quando non si riesce a recuperare i messaggi esistenti
correzione: non riprova a recuperare i messaggi esistenti dopo un errore, impedisce il ciclo infinito di riconnessione
correzione: non aggiunge un errore se il messaggio è crittografato ma non firmato
correzione: non rimuove gli spazi iniziali dalle righe del messaggio
risolvere i casi limite relativi all'invio di testi citati
corretta la connessione STARTTLS
correzione: non trattare gli indirizzi email non validi come un'eccezione
correzione: svuotamento dei percorsi relativi del database introdotti in 1.34.8 in tempo
aggiornamenti rapidi degli elenchi di chat e dell'elenco dei contatti
aggiornare le traduzioni
aggiornamento al core106
+5
View File
@@ -0,0 +1,5 @@
* aggiunge le opzioni SOCKS5 a "Aggiungi Account" e "Configura"
* introdurre la cache DNS: se il DNS smette di funzionare su una rete, Delta Chat sarà comunque in grado di connettersi ad IMAP utilizzando gli indirizzi IP precedenti
* mostra messaggi completi: non carica automaticamente il contenuto remoto per le richieste
* Corretti vari bug e migliorata la registrazione
* aggiornate le traduzioni
+8
View File
@@ -0,0 +1,8 @@
* nuovo e semplice modo per aggiungere un secondo dispositivo al tuo account: seleziona "Aggiungi Secondo Dispositivo" dopo l'installazione e scansiona un codice QR dal primo dispositivo
* visualizza "Tutti i Media" di tutte le chat
* nuova opzione "Cancella Chat".
* mostra le notifiche per tutti gli account
* utilizza meglio la modalità buio/luce in "Mostra messaggio completo"
* mostra l'icona accanto ai messaggi informativi delle app
* resilienza contro le interruzioni memorizzando nella cache i risultati DNS per le connessioni SMTP e IMAP
* Miglioramenti e correzioni velocità e affidabilità
+8
View File
@@ -0,0 +1,8 @@
* aggiungi un messaggio sul dispositivo dopo aver configurato un secondo dispositivo utilizzando "Impostazioni/Aggiungi Secondo Dispositivo"
* velocizza significativamente il tempo di connessione "Aggiungi come Secondo Dispositivo" dal lato intermediario
* se possibile, mostra il nome Wi-Fi direttamente dopo aver scansionato il codice QR "Aggiungi Secondo Dispositivo".
* risolto il riavvio immediato di "Aggiungi Secondo Dispositivo"
* correzione: non vengono visualizzati solo i media cestinati nella vista "Tutti i Media".
* correzione: aggiornamento del database se necessario dopo "Aggiungi Secondo Dispositivo"
* aggiornate traduzioni e aiuto locale
* aggiornamento al core112.6
+6
View File
@@ -0,0 +1,6 @@
* inizia con un tema chiaro/scuro a seconda del tema del sistema
* corrette le icone di verifica per le chat individuali
* corretti gli errori di recupero dovuti al rilevamento EOF errato nelle risposte IMAP lunghe
* ulteriori correzioni di bug
* aggiornate le traduzioni e aiuto locale
* aggiornamento al core112.7
+4
View File
@@ -0,0 +1,4 @@
* utilizza la configurazione SOCKS5 anche per caricare immagini remote nelle mail HTML
* correzioni di bug
* aggiornate le traduzioni e aiuto locale
* aggiornamento al core112.8
+6
View File
@@ -0,0 +1,6 @@
* nuove API webxdc: importFiles() e sendToChat()
* rimosso il limite di dimensione superiore degli allegati
* risparmia traffico e spazio di archiviazione: ricodifica PNG di grandi dimensioni e altri formati di immagine supportati (i JPEG di grandi dimensioni venivano sempre ricodificati; le immagini inviate come "File" non vengono ancora registrate o modificate in altro modo)
* salva spazio di archiviazione locale: comprimi le email HTML nel database
* migliorata coerenza dell'appartenenza al gruppo
* molte correzioni di bug
+5
View File
@@ -0,0 +1,5 @@
* usa l'editor immagini per la selezione dell'avatar quando possibile
* migliora la schermata di caricamento in modalità oscura
* aggiornamento "icona verificata"
* aggiunta la traduzione di Luri Bakhtiari, aggiornate altre traduzioni
* molte correzioni di bug
+5
View File
@@ -0,0 +1,5 @@
* usa l'editor immagini per la selezione dell'avatar quando possibile
* migliora la schermata di caricamento in modalità oscura
* aggiornamento "icona verificata"
* aggiunta la traduzione di Luri Bakhtiari, aggiornate altre traduzioni
* molte correzioni di bug

Some files were not shown because too many files have changed in this diff Show More