Compare commits
80 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ac6fe3ed2 | |||
| b540b5250d | |||
| af94274987 | |||
| 08b052aa93 | |||
| c4b0b6d9c7 | |||
| 6a4c73c0e6 | |||
| 78e1d11801 | |||
| 2178e555ca | |||
| a3393d43c0 | |||
| f63eb3e57f | |||
| 8ea9cfe7a1 | |||
| 092fd9603f | |||
| ed1ba1dce9 | |||
| 58b35519cb | |||
| 07bfa48588 | |||
| 96851c458a | |||
| 56a26a561d | |||
| cf6db57cb8 | |||
| 1da9fdc6b4 | |||
| 1c13a564ec | |||
| cc2f1f2270 | |||
| 3bdd16d224 | |||
| 141f326fec | |||
| 94c4e0aa92 | |||
| fc4d9df3ac | |||
| 2590b82f0e | |||
| 943d40b92e | |||
| acf840c05b | |||
| 05f7d6cd98 | |||
| 0b4d36f0cf | |||
| ee5ce97779 | |||
| f32b1f3d95 | |||
| 122de0e3ad | |||
| 8180aa9b0d | |||
| 0bfcfa1444 | |||
| 34a369fa49 | |||
| ccb8b417a6 | |||
| 8d16baed11 | |||
| 81f7022957 | |||
| b1dd60607b | |||
| 557053a25d | |||
| aa61597804 | |||
| 1fbf04ed28 | |||
| 06420e032d | |||
| 86d1350c64 | |||
| d896955077 | |||
| 9a42c26697 | |||
| 8db5e2ce01 | |||
| d4d5655e72 | |||
| 91c53ab5cf | |||
| e02674b2ca | |||
| 360dcf5bc7 | |||
| 17a5f9a266 | |||
| 46df7e5ab2 | |||
| 33ff464028 | |||
| c6c49da1f2 | |||
| c7912a0df7 | |||
| 459e57f56c | |||
| a0ff8043b0 | |||
| 9d75045fec | |||
| b8b3deaad0 | |||
| df82368327 | |||
| 377060afe1 | |||
| 06800d24ab | |||
| 030b08ddd1 | |||
| 67cc39b648 | |||
| 34d20b6c78 | |||
| 3e64619ec5 | |||
| f167e6d1d8 | |||
| 0f3d00abfa | |||
| f5932f7d42 | |||
| 912fb3e595 | |||
| b5c688232b | |||
| 4cbf12068b | |||
| 97ad251cd9 | |||
| bdc71b965e | |||
| 4f84efbfff | |||
| e91bc5d3b7 | |||
| dc08de5b3f | |||
| df03a7456f |
@@ -1,3 +0,0 @@
|
||||
ko_fi: adbenitez
|
||||
liberapay: adbenitez
|
||||
custom: "https://arcanechat.me/#contribute"
|
||||
@@ -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.
|
||||
-->
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
name: Other
|
||||
about: Start with a new blank issue.
|
||||
title: ''
|
||||
assignees: ''
|
||||
---
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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') }}
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -1,6 +0,0 @@
|
||||
rules:
|
||||
unpinned-uses:
|
||||
config:
|
||||
policies:
|
||||
actions/*: ref-pin
|
||||
dependabot/*: ref-pin
|
||||
@@ -46,6 +46,4 @@ jni/armeabi
|
||||
jni/armeabi-v7a
|
||||
jni/arm64-v8a
|
||||
|
||||
artwork/drawable*/
|
||||
artwork/mipmap-*/
|
||||
*~
|
||||
*~
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 433 KiB |
|
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>
|
||||
|
Before Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 446 KiB |
|
Before Width: | Height: | Size: 173 KiB |
|
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
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.enableJetifier=true
|
||||
android.nonFinalResIds=false
|
||||
android.nonTransitiveRClass=false
|
||||
android.useAndroidX=true
|
||||
org.gradle.jvmargs=-Xmx4608m
|
||||
|
||||
@@ -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
|
||||
|
||||
|
After Width: | Height: | Size: 41 KiB |
@@ -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,4 +1,4 @@
|
||||
APP_PLATFORM := android-21
|
||||
APP_PLATFORM := android-16
|
||||
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
|
||||
APP_STL := none
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
التواصل الفوري عبر البريد الكتروني
|
||||
@@ -0,0 +1 @@
|
||||
Okamžitá komunikace prostřednictvím e-mailu
|
||||
@@ -0,0 +1 @@
|
||||
Sofort über E-Mail kommunizieren
|
||||
@@ -0,0 +1 @@
|
||||
Delta Chat
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 292 KiB |
|
After Width: | Height: | Size: 818 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 287 KiB |
|
After Width: | Height: | Size: 648 KiB |
|
After Width: | Height: | Size: 494 KiB |
|
After Width: | Height: | Size: 556 KiB |
@@ -0,0 +1 @@
|
||||
Chat over e-mail. Elegantly Retro, Decentralized and Open. Privacy by Design.
|
||||
@@ -0,0 +1 @@
|
||||
Delta Chat
|
||||
@@ -0,0 +1 @@
|
||||
Tujmesaĝilo uzanta retpoŝton
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
Comuníquese al instante mediante correo electrónico
|
||||
@@ -0,0 +1 @@
|
||||
Delta Chat
|
||||
@@ -0,0 +1 @@
|
||||
Kiire suhtlus e-posti kaudu
|
||||
@@ -0,0 +1 @@
|
||||
Bat bateko mezularitza e-mail bidez
|
||||
@@ -0,0 +1 @@
|
||||
برقراری ارتباط فوری از طریق ایمیل
|
||||
@@ -0,0 +1 @@
|
||||
Communiquez instantanément par courriel
|
||||
@@ -0,0 +1 @@
|
||||
Dèan conaltradh sa bhad le post-d
|
||||
@@ -0,0 +1 @@
|
||||
התקשרות ישירה דרך דוא״ל
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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à
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||