Compare commits
153 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ac6fe3ed2 | |||
| b540b5250d | |||
| dd9d198c6f | |||
| cd9b03cf5c | |||
| 7257a3180d | |||
| 067677ecbf | |||
| 1420a4b7d9 | |||
| d1552e389e | |||
| 89a4eb9538 | |||
| 29b1c1e493 | |||
| d7babe8694 | |||
| 364ec0e88d | |||
| 76888c540d | |||
| 7e7257bf41 | |||
| 221595cb12 | |||
| 0a8425d540 | |||
| c22b20171d | |||
| 796bcec8e1 | |||
| bcdeff2870 | |||
| dc3f03c48e | |||
| 9313e8e37a | |||
| af46f8979a | |||
| cef9729ead | |||
| 80e2620aa3 | |||
| 6a843f51ce | |||
| b302786dab | |||
| 96d0a81ccf | |||
| 75538c61a4 | |||
| dc28d188f2 | |||
| b2c420c8bb | |||
| 8b18731e86 | |||
| fb14a8ed66 | |||
| 919b300246 | |||
| d1f7f4c31f | |||
| d4048efb52 | |||
| 5897711af5 | |||
| 39f17056d2 | |||
| e78e79a65e | |||
| f7dfb875a7 | |||
| d86d390fe7 | |||
| f54fcb6c2f | |||
| 1083e19356 | |||
| e7bacfc447 | |||
| ce93edf1a3 | |||
| 3cd1f3b8cc | |||
| 194b4d2497 | |||
| b33b421615 | |||
| 5a44d90f15 | |||
| 4194e094c1 | |||
| 5abb1b2d7b | |||
| a408adb805 | |||
| cd0350cc6d | |||
| 9e6b69c122 | |||
| 29e563f89b | |||
| 06b36fe35c | |||
| 50f6675d99 | |||
| 07d895594e | |||
| 5c57fbbd84 | |||
| 8eb78766ca | |||
| 7fcf6e4476 | |||
| 960666a1d2 | |||
| 1d1db84f10 | |||
| 40b7b201d7 | |||
| 0953e0b2f9 | |||
| b265c4975e | |||
| b87c57d482 | |||
| 997c8ed3b4 | |||
| dc82346612 | |||
| 1a8ad28211 | |||
| 95a9668c45 | |||
| 22f4e5b38f | |||
| ad9aa23bff | |||
| 101ab11db0 | |||
| c4f891349b | |||
| 7380d5319d | |||
| 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 |
@@ -14,8 +14,6 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Validate Fastlane Metadata
|
||||
uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
working-directory: jni/deltachat-core-rust
|
||||
|
||||
@@ -23,17 +23,16 @@ jobs:
|
||||
name: Upload Release APK
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
with:
|
||||
working-directory: jni/deltachat-core-rust
|
||||
- uses: actions/setup-java@v3
|
||||
- uses: actions/setup-java@v1.4.3
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
- uses: android-actions/setup-android@v3
|
||||
java-version: 11
|
||||
- uses: android-actions/setup-android@v2
|
||||
- uses: nttld/setup-ndk@v1
|
||||
id: setup-ndk
|
||||
with:
|
||||
@@ -54,13 +53,13 @@ jobs:
|
||||
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 assembleGplayRelease
|
||||
./gradlew --no-daemon assembleFossRelease
|
||||
|
||||
- name: Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
body: "DeltaLab release, download the APK file for your phone's CPU architecture, if you don't know your phone's architecture, use the universal APK which works for all architectures"
|
||||
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/gplay/release/*.apk
|
||||
files: build/outputs/apk/foss/release/*.apk
|
||||
|
||||
@@ -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/deltalab-org/deltalab-core
|
||||
url = https://github.com/adbenitez/deltalab-core
|
||||
|
||||
@@ -1,5 +1,27 @@
|
||||
# Delta Chat Android Changelog
|
||||
|
||||
## v1.46.5
|
||||
2024-06
|
||||
|
||||
* support webxdc apps with experimental realtime channels ("Settings / Advanced / Realtime Webxdc Channels")
|
||||
* fewer traffic in larger chatmail groups by allowing more than 50 recipients per time
|
||||
* log debug level (mostly foreign modules) only if "Settings / Advanced / Developer Mode" is enabled
|
||||
* fix: avoid asking to disable battery optimisations when creating the second profile
|
||||
* fix hangs on low/no network during onboarding
|
||||
* fix: cancel muting does not cancel selection in chatlist
|
||||
* fix migrated address losing verified status and key on experimental AEAP
|
||||
* fix: allow creation of groups by outgoing messages without recipients
|
||||
* fix: avoid group splits by preferring ID from encrypted header over references for new groups
|
||||
* fix: do not fail to send images with wrong extensions
|
||||
* fix: retry sending MDNs on temporary error
|
||||
* fix: do not miss new messages while expunging the folder
|
||||
* fix missing logging info lines
|
||||
* fix: remove group member locally even if sending fails
|
||||
* fix: revert group member addition if the corresponding message couldn't be sent
|
||||
* update translations and local help
|
||||
* update to core 1.140.2
|
||||
|
||||
|
||||
## v1.46.3
|
||||
2024-06
|
||||
|
||||
|
||||
@@ -1,46 +1,247 @@
|
||||
## DeltaLab Android Client
|
||||
## Delta Chat Android Client
|
||||
|
||||
DeltaLab is a [Delta Chat](https://delta.chat/) client for Android.
|
||||
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-IzzyOnDroid.png"
|
||||
alt="Get it on IzzyOnDroid"
|
||||
height="48">](https://apt.izzysoft.de/fdroid/index/apk/chat.delta.lite)
|
||||
[<img src="store/get-it-on-apklis.png"
|
||||
alt="Disponible en Apklis"
|
||||
height="48">](https://www.apklis.cu/application/chat.delta.lite)
|
||||
[<img src="store/get-it-on-github.png"
|
||||
alt="Get it on GitHub"
|
||||
height="48">](https://github.com/adbenitez/deltalab-android/releases/latest)
|
||||
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 Chat List" src="fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width="298" /> <img alt="Screenshot Chat View" src="fastlane/metadata/android/en-US/images/phoneScreenshots/04.jpg" width="298" />
|
||||
# Check Out Repository
|
||||
|
||||
# WebXDC
|
||||
When checking out _deltachat-android_, make sure also to check out the
|
||||
subproject _deltachat-core-rust_:
|
||||
|
||||
DeltaLab 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.deltalab` a string with the DeltaLab version and can be used by app developers
|
||||
to detect when they can use the DeltaLab-specific features.
|
||||
- `window.webxdc.isCommunity` true if the current account is a community account
|
||||
- `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
|
||||
|
||||
DeltaLab is based on the [official Delta Chat client](https://github.com/deltachat/deltachat-android) with some improvements.
|
||||
The user interface classes are based on the Signal messenger.
|
||||
|
||||
DeltaLab uses a [modified](https://github.com/adbenitez/deltalab-core) version of the [Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
|
||||
|
||||
# License
|
||||
|
||||
Licensed GPLv3+, see the LICENSE file for details.
|
||||
|
||||
Copyright © 2024 DeltaLab contributors.
|
||||
Copyright © 2022 Delta Chat contributors.
|
||||
|
||||
@@ -109,6 +109,16 @@ on <https://developer.amazon.com/dashboard>:
|
||||
f) on "Step 4" page: "Submit app"
|
||||
|
||||
|
||||
## Release on Huawei AppGallery
|
||||
|
||||
on <https://developer.huawei.com/consumer/en/appgallery>:
|
||||
|
||||
13. a) go to "Upload your app / Android / Delta Chat / Update", again "Update" upper right
|
||||
b) "Manage Packages / Upload", upload the APK from above, hit "Save"
|
||||
c) Update "App Information / New Features", hit "Save", then "Next"
|
||||
d) Hit "Submit"; on the next page, confirm version and language
|
||||
|
||||
|
||||
## Releases on Apklis, Passkoocheh
|
||||
|
||||
These stores are not under our control.
|
||||
|
||||
@@ -1,439 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Capa_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 384 384"
|
||||
style="enable-background:new 0 0 384 384;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="ic_launcher.svg"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/ic_launcher.png"
|
||||
inkscape:export-xdpi="49.038963"
|
||||
inkscape:export-ydpi="49.038963"><metadata
|
||||
id="metadata43"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs41"><linearGradient
|
||||
id="linearGradient4695"
|
||||
osb:paint="solid"><stop
|
||||
style="stop-color:#5743ff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4693" /></linearGradient><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866"><g
|
||||
style="fill:url(#linearGradient968);fill-opacity:1"
|
||||
id="use868"
|
||||
inkscape:label="Clip"><circle
|
||||
style="fill:url(#linearGradient966);fill-opacity:1;stroke-width:0.75687599"
|
||||
id="circle962"
|
||||
cx="125"
|
||||
cy="259"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
r="125" /></g></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath880"><g
|
||||
id="use882"
|
||||
inkscape:label="Clip"><g
|
||||
id="g4833"
|
||||
clip-path="url(#clipPath866-3)"><g
|
||||
inkscape:label="Clip"
|
||||
id="g4831"><circle
|
||||
r="125"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
cy="259"
|
||||
cx="125"
|
||||
id="circle4829"
|
||||
style="fill:#5a6f78;fill-opacity:1;stroke-width:0.75687599" /></g></g><g
|
||||
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
|
||||
transform="matrix(0.17680256,0,0,0.19688889,-101.30692,70.72311)"
|
||||
id="g4839"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/drawable-xxhdpi-v11/icon_notification.png"
|
||||
inkscape:export-xdpi="46.080002"
|
||||
inkscape:export-ydpi="46.080002"><g
|
||||
transform="translate(0,256.33)"
|
||||
id="g4837"><path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 1280,510.454 -202.69,364.022 477.87,130.194 H 855.796 L 1280,242.819 1704.2,1004.67 h -149.02 z"
|
||||
style="fill:#ffffff"
|
||||
id="path4835" /></g></g></g></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866-3"><g
|
||||
inkscape:label="Clip"
|
||||
id="use868-5"><circle
|
||||
r="125"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
cy="259"
|
||||
cx="125"
|
||||
id="circle4843"
|
||||
style="fill:#5a6f78;fill-opacity:1;stroke-width:0.75687599" /></g></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath955"><g
|
||||
id="use957"
|
||||
inkscape:label="Clip"><rect
|
||||
style="fill:#5a6f78;fill-opacity:1;stroke-width:0.83070838"
|
||||
id="rect101"
|
||||
width="324"
|
||||
height="324"
|
||||
x="0"
|
||||
y="60"
|
||||
inkscape:export-xdpi="128"
|
||||
inkscape:export-ydpi="128"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_foreground.png" /><g
|
||||
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
|
||||
transform="matrix(0.17680256,0,0,0.19688889,-64.306924,35.72311)"
|
||||
id="g107"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/drawable-xxhdpi-v11/icon_notification.png"
|
||||
inkscape:export-xdpi="46.080002"
|
||||
inkscape:export-ydpi="46.080002"><g
|
||||
transform="translate(0,256.33)"
|
||||
id="g105"><path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 1280,510.454 -202.69,364.022 477.87,130.194 H 855.796 L 1280,242.819 1704.2,1004.67 h -149.02 z"
|
||||
style="fill:#ffffff"
|
||||
id="path103" /></g></g></g></clipPath><linearGradient
|
||||
id="linearGradient4409"><stop
|
||||
style="stop-color:#f9f9f9;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4411" /><stop
|
||||
style="stop-color:#cccccc;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4413" /></linearGradient><linearGradient
|
||||
id="linearGradient4399"><stop
|
||||
style="stop-color:#f9f9f9;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4401" /><stop
|
||||
style="stop-color:#f9f9f9;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4403" /></linearGradient><linearGradient
|
||||
id="linearGradient4375"><stop
|
||||
style="stop-color:#364e59;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4377" /><stop
|
||||
style="stop-color:#364e59;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4379" /></linearGradient><linearGradient
|
||||
id="linearGradient4367"><stop
|
||||
style="stop-color:#dc000f;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4369" /><stop
|
||||
style="stop-color:#00ff00;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4371" /></linearGradient><linearGradient
|
||||
id="linearGradient4359"><stop
|
||||
style="stop-color:#dc000f;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4361" /><stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4363" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4409"
|
||||
id="linearGradient4415"
|
||||
x1="16.345125"
|
||||
y1="3.8388948"
|
||||
x2="36.001561"
|
||||
y2="24.359164"
|
||||
gradientUnits="userSpaceOnUse" /><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866-2"><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g862-6"
|
||||
id="use868-7"
|
||||
width="100%"
|
||||
height="100%" /></clipPath><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4695"
|
||||
id="linearGradient966"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="0"
|
||||
y1="259"
|
||||
x2="250"
|
||||
y2="259" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4695"
|
||||
id="linearGradient968"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="0"
|
||||
y1="259"
|
||||
x2="250"
|
||||
y2="259" /><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866-2-3"><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g862-6-3"
|
||||
id="use868-7-6"
|
||||
width="100%"
|
||||
height="100%" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866-2-3-0"><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g862-6-3-6"
|
||||
id="use868-7-6-9"
|
||||
width="100%"
|
||||
height="100%"
|
||||
transform="translate(46.974772,-79.626121)" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866-2-3-3"><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g862-6-3-8"
|
||||
id="use868-7-6-7"
|
||||
width="100%"
|
||||
height="100%" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath866-2-3-0-5"><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g862-6-3-6-3"
|
||||
id="use868-7-6-9-9"
|
||||
width="100%"
|
||||
height="100%"
|
||||
transform="translate(46.974772,-79.626121)" /></clipPath></defs><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="800"
|
||||
inkscape:window-height="835"
|
||||
id="namedview39"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.2291667"
|
||||
inkscape:cx="171.72731"
|
||||
inkscape:cy="164.26327"
|
||||
inkscape:window-x="800"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="Capa_1"
|
||||
inkscape:pagecheckerboard="true" /><g
|
||||
id="g8" /><g
|
||||
id="g10" /><g
|
||||
id="g12" /><g
|
||||
id="g14" /><g
|
||||
id="g16" /><g
|
||||
id="g18" /><g
|
||||
id="g20" /><g
|
||||
id="g22" /><g
|
||||
id="g24" /><g
|
||||
id="g26" /><g
|
||||
id="g28" /><g
|
||||
id="g30" /><g
|
||||
id="g32" /><g
|
||||
id="g34" /><g
|
||||
id="g36" /><g
|
||||
id="g916"
|
||||
transform="translate(-7.0058859,32.979264)"
|
||||
inkscape:export-filename="/home/DATA/Projects/deltalab-android/artwork/mipmap-xxxhdpi/ic_launcher_foreground.png"
|
||||
inkscape:export-xdpi="128"
|
||||
inkscape:export-ydpi="128"><g
|
||||
style="fill:#6200ed;fill-opacity:1"
|
||||
transform="translate(-722.44068,-167.59322)"
|
||||
id="g4704"><rect
|
||||
style="fill:#6200ed;fill-opacity:1;stroke-width:0.83070832"
|
||||
id="rect830-9-3"
|
||||
width="324"
|
||||
height="324"
|
||||
x="0"
|
||||
y="60"
|
||||
inkscape:export-xdpi="128"
|
||||
inkscape:export-ydpi="128"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_foreground.png" /></g><g
|
||||
transform="matrix(3.2309634,0,0,3.2309634,-639.59928,-24.75182)"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1-6"><path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 24.015625,1.2871094 c -12.549421,0 -22.7285156,10.1790936 -22.7285156,22.7285156 0,12.549422 10.1790946,22.728516 22.7285156,22.728516 14.337742,-0.342877 9.614062,-4.703116 23.697266,0.96875 -7.545453,-13.001555 -1.082562,-13.32935 -0.96875,-23.697266 0,-12.549422 -10.179094,-22.7285156 -22.728516,-22.7285156 z M 24,4.7636719 C 34.612549,4.6345328 43.220703,13.143938 43.220703,23.765625 43.078418,31.966952 36.761278,33.237209 42.871094,42.78125 31.717586,37.600152 34.090255,43.195768 24,43.236328 13.387453,43.365468 4.7792969,34.856059 4.7792969,24.234375 4.7792969,13.612691 13.387453,4.8928107 24,4.7636719 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.57405078;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.43921569"
|
||||
id="path3769-7" /><g
|
||||
id="text4383-5"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text4421-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text3797-5"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.10587311px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
transform="scale(1.1122373,0.89908874)"><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4161-6"
|
||||
style="font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman';fill:#ffffff;fill-opacity:1"
|
||||
d="m 21.688854,23.636251 q -1.027975,-1.151333 -2.857771,-2.754974 -2.014832,-1.768118 -2.713855,-2.775534 -0.699024,-1.027975 -0.699024,-2.240986 0,-1.809237 1.68588,-2.837212 1.68588,-1.048535 4.399735,-1.048535 2.713855,0 4.728687,0.925178 2.035391,0.925177 2.035391,2.549379 0,0.781261 -0.493428,1.295249 -0.493428,0.513987 -1.151333,0.513987 -0.945737,0 -2.220426,-1.418606 -1.295249,-1.439165 -2.199868,-2.014832 -0.884059,-0.596225 -2.07651,-0.596225 -1.521404,0 -2.50826,0.678463 -0.966297,0.678464 -0.966297,1.726999 0,0.986857 0.801821,1.850356 0.801821,0.863499 4.132461,3.145605 3.556795,2.446581 5.01652,3.824068 1.480285,1.377487 2.405462,3.3512 0.925178,1.973713 0.925178,4.17358 0,3.865188 -2.734414,6.825757 -2.713855,2.94001 -6.352888,2.94001 -3.310081,0 -5.592187,-2.364344 -2.282105,-2.364343 -2.282105,-6.311769 0,-3.803509 2.50826,-6.352888 2.528819,-2.549379 6.208971,-3.083926 z m 0.904619,0.945737 q -5.900579,0.966297 -5.900579,8.100447 0,3.680152 1.459725,5.715543 1.480285,2.035391 3.433438,2.035391 2.035391,0 3.3512,-1.953153 1.315808,-1.973713 1.315808,-5.324913 0,-4.852044 -3.659592,-8.573315 z" /></g></g></g><g
|
||||
id="g960"
|
||||
inkscape:export-filename="/home/DATA/Projects/deltalab-android/artwork/mipmap-hdpi/ic_launcher.png"
|
||||
inkscape:export-xdpi="27.647999"
|
||||
inkscape:export-ydpi="27.647999"
|
||||
transform="translate(-8.1355932,8.1355932)"><g
|
||||
transform="translate(-385.62712,-169.22034)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
clip-path="url(#clipPath866-2)"
|
||||
id="g864-3"><g
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
id="g862-6"
|
||||
inkscape:label="Clip"><circle
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero;stroke-width:0.75687599"
|
||||
id="path51-0"
|
||||
cx="125"
|
||||
cy="259"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
r="125" /></g></g><g
|
||||
transform="matrix(3.2309634,0,0,3.2309634,-339.78572,10.62106)"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1-62"><path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 24.015625,1.2871094 c -12.549421,0 -22.7285156,10.1790936 -22.7285156,22.7285156 0,12.549422 10.1790946,22.728516 22.7285156,22.728516 14.337742,-0.342877 9.614062,-4.703116 23.697266,0.96875 -7.545453,-13.001555 -1.082562,-13.32935 -0.96875,-23.697266 0,-12.549422 -10.179094,-22.7285156 -22.728516,-22.7285156 z M 24,4.7636719 C 34.612549,4.6345328 43.220703,13.143938 43.220703,23.765625 43.078418,31.966952 36.761278,33.237209 42.871094,42.78125 31.717586,37.600152 34.090255,43.195768 24,43.236328 13.387453,43.365468 4.7792969,34.856059 4.7792969,24.234375 4.7792969,13.612691 13.387453,4.8928107 24,4.7636719 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.57405078;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.43921569"
|
||||
id="path3769-6" /><g
|
||||
id="text4383-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text4421-8"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text3797-7"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.10587311px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
transform="scale(1.1122373,0.89908874)"><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4161-9"
|
||||
style="font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman';fill:#ffffff;fill-opacity:1"
|
||||
d="m 21.688854,23.636251 q -1.027975,-1.151333 -2.857771,-2.754974 -2.014832,-1.768118 -2.713855,-2.775534 -0.699024,-1.027975 -0.699024,-2.240986 0,-1.809237 1.68588,-2.837212 1.68588,-1.048535 4.399735,-1.048535 2.713855,0 4.728687,0.925178 2.035391,0.925177 2.035391,2.549379 0,0.781261 -0.493428,1.295249 -0.493428,0.513987 -1.151333,0.513987 -0.945737,0 -2.220426,-1.418606 -1.295249,-1.439165 -2.199868,-2.014832 -0.884059,-0.596225 -2.07651,-0.596225 -1.521404,0 -2.50826,0.678463 -0.966297,0.678464 -0.966297,1.726999 0,0.986857 0.801821,1.850356 0.801821,0.863499 4.132461,3.145605 3.556795,2.446581 5.01652,3.824068 1.480285,1.377487 2.405462,3.3512 0.925178,1.973713 0.925178,4.17358 0,3.865188 -2.734414,6.825757 -2.713855,2.94001 -6.352888,2.94001 -3.310081,0 -5.592187,-2.364344 -2.282105,-2.364343 -2.282105,-6.311769 0,-3.803509 2.50826,-6.352888 2.528819,-2.549379 6.208971,-3.083926 z m 0.904619,0.945737 q -5.900579,0.966297 -5.900579,8.100447 0,3.680152 1.459725,5.715543 1.480285,2.035391 3.433438,2.035391 2.035391,0 3.3512,-1.953153 1.315808,-1.973713 1.315808,-5.324913 0,-4.852044 -3.659592,-8.573315 z" /></g></g></g><g
|
||||
id="g214"
|
||||
inkscape:export-xdpi="384"
|
||||
inkscape:export-ydpi="384"
|
||||
transform="translate(-380.83094,180.63582)"><g
|
||||
transform="matrix(0.54438354,0,0,0.55505241,77.882295,0.71067353)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
clip-path="url(#clipPath866-2-3)"
|
||||
id="g864-3-5"><g
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
id="g862-6-3"
|
||||
inkscape:label="Clip"><circle
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero;stroke-width:0.75687599"
|
||||
id="path51-0-5"
|
||||
cx="125"
|
||||
cy="259"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
r="125" /></g></g><g
|
||||
inkscape:transform-center-y="4.1811826"
|
||||
inkscape:transform-center-x="5.0611235"
|
||||
transform="matrix(0.09576995,0,0,0.23533009,182.58194,121.9428)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
clip-path="url(#clipPath866-2-3-0)"
|
||||
id="g864-3-5-3"><g
|
||||
transform="matrix(0.7789728,-0.36970944,1.0635416,0.7789728,-294.80364,183.08585)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
id="g862-6-3-6"
|
||||
inkscape:label="Clip"><circle
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero;stroke-width:0.75687599"
|
||||
id="path51-0-5-0"
|
||||
cx="125"
|
||||
cy="259"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
r="125" /></g></g><g
|
||||
transform="matrix(3.2309634,0,0,3.2309634,64.084451,63.801879)"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1-62-6"><path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 24.015625,1.2871094 c -12.549421,0 -22.7285156,10.1790936 -22.7285156,22.7285156 0,12.549422 10.1790946,22.728516 22.7285156,22.728516 14.337742,-0.342877 9.614062,-4.703116 23.697266,0.96875 -7.545453,-13.001555 -1.082562,-13.32935 -0.96875,-23.697266 0,-12.549422 -10.179094,-22.7285156 -22.728516,-22.7285156 z M 24,4.7636719 C 34.612549,4.6345328 43.220703,13.143938 43.220703,23.765625 43.078418,31.966952 36.761278,33.237209 42.871094,42.78125 31.717586,37.600152 34.090255,43.195768 24,43.236328 13.387453,43.365468 4.7792969,34.856059 4.7792969,24.234375 4.7792969,13.612691 13.387453,4.8928107 24,4.7636719 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.57405078;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.43921569"
|
||||
id="path3769-6-2" /><g
|
||||
id="text4383-1-9"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text4421-8-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text3797-7-2"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.10587311px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
transform="scale(1.1122373,0.89908874)"><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4161-9-7"
|
||||
style="font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman';fill:#ffffff;fill-opacity:1"
|
||||
d="m 21.688854,23.636251 q -1.027975,-1.151333 -2.857771,-2.754974 -2.014832,-1.768118 -2.713855,-2.775534 -0.699024,-1.027975 -0.699024,-2.240986 0,-1.809237 1.68588,-2.837212 1.68588,-1.048535 4.399735,-1.048535 2.713855,0 4.728687,0.925178 2.035391,0.925177 2.035391,2.549379 0,0.781261 -0.493428,1.295249 -0.493428,0.513987 -1.151333,0.513987 -0.945737,0 -2.220426,-1.418606 -1.295249,-1.439165 -2.199868,-2.014832 -0.884059,-0.596225 -2.07651,-0.596225 -1.521404,0 -2.50826,0.678463 -0.966297,0.678464 -0.966297,1.726999 0,0.986857 0.801821,1.850356 0.801821,0.863499 4.132461,3.145605 3.556795,2.446581 5.01652,3.824068 1.480285,1.377487 2.405462,3.3512 0.925178,1.973713 0.925178,4.17358 0,3.865188 -2.734414,6.825757 -2.713855,2.94001 -6.352888,2.94001 -3.310081,0 -5.592187,-2.364344 -2.282105,-2.364343 -2.282105,-6.311769 0,-3.803509 2.50826,-6.352888 2.528819,-2.549379 6.208971,-3.083926 z m 0.904619,0.945737 q -5.900579,0.966297 -5.900579,8.100447 0,3.680152 1.459725,5.715543 1.480285,2.035391 3.433438,2.035391 2.035391,0 3.3512,-1.953153 1.315808,-1.973713 1.315808,-5.324913 0,-4.852044 -3.659592,-8.573315 z" /></g></g></g><path
|
||||
style="fill:#ffffff;stroke-width:0.57527333"
|
||||
d="M 0,222.06056 V 60.121123 H 161.93945 323.87889 V 222.06056 384 H 161.93945 0 Z"
|
||||
id="path223"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/dc/projects/deltalab-android/artwork/mipmap-xxxhdpi/ic_launcher_foreground.png"
|
||||
inkscape:export-xdpi="128.04787"
|
||||
inkscape:export-ydpi="128.04787" /><g
|
||||
transform="matrix(1.1866667,0,0,1.1866667,-10.73076,53.100552)"
|
||||
id="g214-2"
|
||||
inkscape:export-xdpi="384"
|
||||
inkscape:export-ydpi="384"
|
||||
inkscape:export-filename="/home/dc/projects/deltalab-android/artwork/mipmap-xxhdpi/ic_launcher_foreground.png"><g
|
||||
transform="matrix(0.54438354,0,0,0.55505241,77.882295,0.71067353)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
clip-path="url(#clipPath866-2-3-3)"
|
||||
id="g864-3-5-2"><g
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
id="g862-6-3-8"
|
||||
inkscape:label="Clip"><circle
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero;stroke-width:0.75687599"
|
||||
id="path51-0-5-9"
|
||||
cx="125"
|
||||
cy="259"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
r="125" /></g></g><g
|
||||
inkscape:transform-center-y="4.1811826"
|
||||
inkscape:transform-center-x="5.0611235"
|
||||
transform="matrix(0.09576995,0,0,0.23533009,182.58194,121.9428)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
clip-path="url(#clipPath866-2-3-0-5)"
|
||||
id="g864-3-5-3-7"><g
|
||||
transform="matrix(0.7789728,-0.36970944,1.0635416,0.7789728,-294.80364,183.08585)"
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero"
|
||||
id="g862-6-3-6-3"
|
||||
inkscape:label="Clip"><circle
|
||||
style="fill:#6200ed;fill-opacity:1;fill-rule:nonzero;stroke-width:0.75687599"
|
||||
id="path51-0-5-0-6"
|
||||
cx="125"
|
||||
cy="259"
|
||||
inkscape:export-xdpi="71.111115"
|
||||
inkscape:export-ydpi="71.111115"
|
||||
inkscape:export-filename="/home/adb/projects/deltachat-android/ic_launcher/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||
r="125" /></g></g><g
|
||||
transform="matrix(3.2309634,0,0,3.2309634,64.084451,63.801879)"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1-62-6-1"><path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 24.015625,1.2871094 c -12.549421,0 -22.7285156,10.1790936 -22.7285156,22.7285156 0,12.549422 10.1790946,22.728516 22.7285156,22.728516 14.337742,-0.342877 9.614062,-4.703116 23.697266,0.96875 -7.545453,-13.001555 -1.082562,-13.32935 -0.96875,-23.697266 0,-12.549422 -10.179094,-22.7285156 -22.728516,-22.7285156 z M 24,4.7636719 C 34.612549,4.6345328 43.220703,13.143938 43.220703,23.765625 43.078418,31.966952 36.761278,33.237209 42.871094,42.78125 31.717586,37.600152 34.090255,43.195768 24,43.236328 13.387453,43.365468 4.7792969,34.856059 4.7792969,24.234375 4.7792969,13.612691 13.387453,4.8928107 24,4.7636719 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.57405078;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.43921569"
|
||||
id="path3769-6-2-2" /><g
|
||||
id="text4383-1-9-9"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text4421-8-1-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" /><g
|
||||
id="text3797-7-2-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.10587311px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
transform="scale(1.1122373,0.89908874)"><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4161-9-7-9"
|
||||
style="font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman';fill:#ffffff;fill-opacity:1"
|
||||
d="m 21.688854,23.636251 q -1.027975,-1.151333 -2.857771,-2.754974 -2.014832,-1.768118 -2.713855,-2.775534 -0.699024,-1.027975 -0.699024,-2.240986 0,-1.809237 1.68588,-2.837212 1.68588,-1.048535 4.399735,-1.048535 2.713855,0 4.728687,0.925178 2.035391,0.925177 2.035391,2.549379 0,0.781261 -0.493428,1.295249 -0.493428,0.513987 -1.151333,0.513987 -0.945737,0 -2.220426,-1.418606 -1.295249,-1.439165 -2.199868,-2.014832 -0.884059,-0.596225 -2.07651,-0.596225 -1.521404,0 -2.50826,0.678463 -0.966297,0.678464 -0.966297,1.726999 0,0.986857 0.801821,1.850356 0.801821,0.863499 4.132461,3.145605 3.556795,2.446581 5.01652,3.824068 1.480285,1.377487 2.405462,3.3512 0.925178,1.973713 0.925178,4.17358 0,3.865188 -2.734414,6.825757 -2.713855,2.94001 -6.352888,2.94001 -3.310081,0 -5.592187,-2.364344 -2.282105,-2.364343 -2.282105,-6.311769 0,-3.803509 2.50826,-6.352888 2.528819,-2.549379 6.208971,-3.083926 z m 0.904619,0.945737 q -5.900579,0.966297 -5.900579,8.100447 0,3.680152 1.459725,5.715543 1.480285,2.035391 3.433438,2.035391 2.035391,0 3.3512,-1.953153 1.315808,-1.973713 1.315808,-5.324913 0,-4.852044 -3.659592,-8.573315 z" /></g></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 27 KiB |
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id 'com.android.application' version '8.1.4'
|
||||
id 'com.google.gms.google-services' version '4.4.1'
|
||||
// id 'com.google.gms.google-services' version '4.4.1'
|
||||
}
|
||||
|
||||
repositories {
|
||||
@@ -15,12 +15,6 @@ repositories {
|
||||
}
|
||||
|
||||
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 34
|
||||
@@ -35,8 +29,8 @@ android {
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
|
||||
defaultConfig {
|
||||
versionCode 679
|
||||
versionName "1.46.3"
|
||||
versionCode 688
|
||||
versionName "1.46.5"
|
||||
|
||||
applicationId "com.b44t.messenger"
|
||||
multiDexEnabled true
|
||||
@@ -56,9 +50,6 @@ android {
|
||||
buildConfigField("String", "TEST_ADDR", buildConfigProperty("TEST_ADDR"))
|
||||
buildConfigField("String", "TEST_MAIL_PW", buildConfigProperty("TEST_MAIL_PW"))
|
||||
buildConfigField("String", "NDK_ARCH", getNdkArch())
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@@ -76,6 +67,12 @@ android {
|
||||
|
||||
|
||||
signingConfigs {
|
||||
debug {
|
||||
// add `DC_DEBUG_STORE_FILE=/path/to/debug.keystore` to `~/.gradle/gradle.properties`
|
||||
if(project.hasProperty("DC_DEBUG_STORE_FILE" )) {
|
||||
storeFile file(DC_DEBUG_STORE_FILE )
|
||||
}
|
||||
}
|
||||
release {
|
||||
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
|
||||
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
|
||||
@@ -89,7 +86,7 @@ android {
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
applicationIdSuffix ".lite"
|
||||
applicationIdSuffix ".lite2"
|
||||
// minification and proguard disabled for now.
|
||||
//
|
||||
// when enabled, it can cut down apk size about 6%,
|
||||
@@ -100,7 +97,8 @@ 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'
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
|
||||
'proguard-rules.pro'
|
||||
|
||||
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
|
||||
signingConfig signingConfigs.release
|
||||
@@ -116,7 +114,7 @@ android {
|
||||
gplay {
|
||||
dimension "none"
|
||||
applicationId "chat.delta"
|
||||
apply plugin: "com.google.gms.google-services"
|
||||
//apply plugin: "com.google.gms.google-services"
|
||||
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
|
||||
}
|
||||
}
|
||||
@@ -125,23 +123,23 @@ android {
|
||||
abi {
|
||||
enable true
|
||||
reset()
|
||||
include "armeabi-v7a", "arm64-v8a", "x86"
|
||||
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
|
||||
universalApk true
|
||||
}
|
||||
}
|
||||
|
||||
project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 3, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 9, 'x86_64': 9]
|
||||
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("deltalab-android", "deltalab")
|
||||
.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), 3) * 10000000 + android.defaultConfig.versionCode
|
||||
com.android.build.OutputFile.ABI), 0) * 10000000 + android.defaultConfig.versionCode
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,15 +158,7 @@ android {
|
||||
|
||||
}
|
||||
|
||||
final def markwon_version = '4.6.2'
|
||||
|
||||
dependencies {
|
||||
// DeltaLab-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.
|
||||
|
||||
implementation 'androidx.sharetarget:sharetarget:1.2.0'
|
||||
implementation 'androidx.webkit:webkit:1.8.0'
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
@@ -205,15 +195,11 @@ dependencies {
|
||||
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.
|
||||
// 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.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'
|
||||
}
|
||||
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'
|
||||
}
|
||||
@@ -225,11 +211,11 @@ dependencies {
|
||||
// <https://github.com/cketti/SafeContentResolver>
|
||||
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v14:1.0.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'
|
||||
}
|
||||
// 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.1'
|
||||
testImplementation 'org.assertj:assertj-core:1.7.1'
|
||||
|
||||
@@ -2,22 +2,22 @@
|
||||
|
||||
- <https://f-droid.org/en/packages/com.b44t.messenger/>
|
||||
is the Delta Chat page on F-Droid.org,
|
||||
the F-Droid-app will show similar information.
|
||||
the F-Droid app will show similar information.
|
||||
|
||||
- <https://github.com/deltachat/deltachat-android/tree/master/metadata>
|
||||
- <https://github.com/deltachat/deltachat-android/tree/main/metadata>
|
||||
contains the description, icon, screenshots and all meta data shown for Delta Chat on F-Droid
|
||||
in the [fastlane format](https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#fastlane-structure).
|
||||
|
||||
- <https://gitlab.com/fdroid/fdroiddata/blob/master/metadata/com.b44t.messenger.yml> and
|
||||
<https://gitlab.com/fdroid/fdroiddata/-/tree/master/metadata/com.b44t.messenger>
|
||||
contain [additional F-Droid-specific metadata](https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-f-droid-repo)
|
||||
- <https://gitlab.com/fdroid/fdroiddata/blob/master/metadata/com.b44t.messenger.yml>
|
||||
contains [additional F-Droid-specific metadata](https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-f-droid-repo)
|
||||
and build instructions that do not fit the fastlane format.
|
||||
F-Droid adds new versions automatically to the end of `.yml` file.
|
||||
|
||||
- new versions are recognized by tags in the form `v1.2.3` -
|
||||
before adding tags like that, have a look at `docs/release-checklist.md`
|
||||
the build and distribution is expected to take
|
||||
[up to 5 days](https://gitlab.com/fdroid/wiki/-/wikis/FAQ#how-long-does-it-take-for-my-app-to-show-up-on-website-and-client).
|
||||
- New versions are recognized by tags in the form `v1.2.3` -
|
||||
before adding tags like that, have a look at
|
||||
<https://github.com/deltachat/deltachat-android/blob/main/RELEASE.md#release-on-f-droid>.
|
||||
The build and distribution is expected to take
|
||||
[up to 7 days](https://gitlab.com/fdroid/wiki/-/wikis/FAQ#how-long-does-it-take-for-my-app-to-show-up-on-website-and-client).
|
||||
|
||||
|
||||
# F-Droid Build status
|
||||
@@ -25,7 +25,7 @@
|
||||
- <https://monitor.f-droid.org/builds>
|
||||
shows F-Droid's overall build status,
|
||||
if Delta Chat shows up at "Need updating" or "Running",
|
||||
things are working as expected :)
|
||||
things are working as expected. :)
|
||||
|
||||
- <https://f-droid.org/repo/com.b44t.messenger_VERSIONCODE.apk>
|
||||
(with VERSIONCODE = 537 or so) links to successfully built apk
|
||||
@@ -41,22 +41,22 @@ $ git clone https://gitlab.com/fdroid/fdroiddata
|
||||
$ git clone https://gitlab.com/fdroid/fdroidserver
|
||||
$ cd fdroiddata
|
||||
|
||||
now, metadata/com.b44t.messenger.yml can be modified.
|
||||
for testing, one can change the repo to a branch
|
||||
Now, metadata/com.b44t.messenger.yml can be modified.
|
||||
For testing, one can change the repo to a branch
|
||||
by adding the line `Update Check Mode:RepoManifest/BRANCH` to the file.
|
||||
|
||||
set some path to ndk etc:
|
||||
Set some path to ndk etc:
|
||||
$ cp ../fdroidserver/examples/config.py . # adapt file as needed
|
||||
|
||||
checkout repo as f-droid would do:
|
||||
Checkout repo as F-Droid would do:
|
||||
$ ../fdroidserver/fdroid checkupdates -v com.b44t.messenger
|
||||
(for testing with uncommitted changes, add --allow-dirty)
|
||||
|
||||
build repo as f-droid would do:
|
||||
Build repo as F-Droid would do:
|
||||
$ ../froidserver/fdroid build -v com.b44t.messenger:<versionCode>
|
||||
|
||||
(via https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools/
|
||||
and https://f-droid.org/docs/Building_Applications/ -
|
||||
(via <https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools/>
|
||||
and <https://f-droid.org/docs/Building_Applications/> -
|
||||
might require `pip install pyasn1 pyasn1_modules pyaml requests`)
|
||||
|
||||
|
||||
@@ -66,14 +66,14 @@ might require `pip install pyasn1 pyasn1_modules pyaml requests`)
|
||||
and `metadata/en-US/full_description.txt`
|
||||
in <https://github.com/deltachat/deltachat-android/> repository.
|
||||
|
||||
- make sure there is a "newline" at the end of the description
|
||||
(see <https://gitlab.com/fdroid/fdroiddata/merge_requests/3580>)
|
||||
- Make sure there is a "newline" at the end of the description
|
||||
(see <https://gitlab.com/fdroid/fdroiddata/merge_requests/3580>).
|
||||
|
||||
|
||||
# Changing F-Droid metadata
|
||||
|
||||
- the file `com.b44t.messenger.yml` can be changed via a PR to the <https://gitlab.com/fdroid/fdroiddata/> repository
|
||||
- The file `com.b44t.messenger.yml` can be changed via a PR to the <https://gitlab.com/fdroid/fdroiddata/> repository.
|
||||
|
||||
- reformat the metadata using
|
||||
- Reformat the metadata using
|
||||
$ ../fdroidserver/fdroid rewritemeta com.b44t.messenger # called from fdroiddata dir
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
<i>DeltaLab</i> is a friendly fork of <i>Delta Chat</i> messenger, a chat app compatible with the existing e-mail infrastructure.
|
||||
|
||||
DeltaLab was created with a focus on usability, good user experience, and saving data plan and comes with some different default settings than Delta Chat. Also the app usually experiments with new features and alternative paths of development that eventually might get added to the official Delta Chat client.
|
||||
|
||||
<b>Main differences with official Delta Chat client:</b>
|
||||
|
||||
<ul>
|
||||
<li>Basic markdown support (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 enable/disable accounts</li>
|
||||
<li>A videochat instance is set by default</li>
|
||||
<li>Replies to your messages in muted groups trigger notifications</li>
|
||||
<li>Quote-reply a message with a single emoji to set it as reaction</li>
|
||||
<li>Location streaming feature enabled by default and have extra option to share location for 12 hours</li>
|
||||
<li>Verified icon is shown in the chat list for the "Device Messages" chat</li>
|
||||
<li>Videos are played in loop, useful for short GIF videos</li>
|
||||
<li>It is possible to click <b>OPENPGP4FPR:</b> and <b>mumble:</b> links in messages</li>
|
||||
<li>Voice messages have more aggressive compression in "worse quality" mode to save data plan</li>
|
||||
<li>Default configuration changed: automatic download of messages limited to 640KB</li>
|
||||
<li>Account's display name is shown in the app's title bar instead of the name of the app</li>
|
||||
<li>Your avatar is visible to other users in Mailing Lists</li>
|
||||
<li>Can be selected as application when clicking/opening links, this is useful to share the link with web grabber bots</li>
|
||||
<li>Can be selected as app to open .xdc files</li>
|
||||
<li>For mini-apps developers: there are some differences in the WebXDC API, check https://github.com/deltalab-org/deltalab-android/#webxdc</li>
|
||||
<li>Better settings organization with additional "Privacy" section</li>
|
||||
</ul>
|
||||
|
||||
<b>WARNING:</b> Be careful when running WebXDC apps in DeltaLab, the sandboxed webview can't currently prevent WebRTC connections, so in theory information inside the WebXDC app could be leaked and also your IP, the risk is low, for most people this is not even important, but if you are a person at risk, only use trusted apps, or use official Delta Chat.
|
||||
|
Before Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 94 KiB |
@@ -1 +0,0 @@
|
||||
Encrypted chat over e-mail (Delta Chat client)
|
||||
@@ -1 +0,0 @@
|
||||
DeltaLab
|
||||
@@ -43,25 +43,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:922391085500:android:aff82fbc40c8172e3e2bb9",
|
||||
"android_client_info": {
|
||||
"package_name": "chat.delta.lite"
|
||||
}
|
||||
},
|
||||
"oauth_client": [],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "AIzaSyBYH8Iznh8btYX7g_udv_bu68VH30zzxho"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": []
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:922391085500:android:92b4cf12669cc2083e2bb9",
|
||||
@@ -102,4 +83,4 @@
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 32 KiB |
@@ -1,5 +1,5 @@
|
||||
APP_PLATFORM := android-16
|
||||
APP_ABI := armeabi-v7a arm64-v8a x86
|
||||
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
|
||||
APP_STL := none
|
||||
|
||||
ifneq ($(NDK_DEBUG),1)
|
||||
|
||||
@@ -250,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));
|
||||
}
|
||||
@@ -1420,16 +1420,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getId(JNIEnv *env, jobject obj)
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isOutgoing(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return (jboolean)(dc_msg_is_outgoing(get_dc_msg(env, obj))!=0);
|
||||
}
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getSenderColor(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_get_sender_color(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getText(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_msg_get_text(get_dc_msg(env, obj));
|
||||
@@ -1472,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));
|
||||
}
|
||||
@@ -1676,14 +1666,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getVideochatType(JNIEnv *env, jobje
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setSubject(JNIEnv *env, jobject obj, jstring text)
|
||||
{
|
||||
CHAR_REF(text);
|
||||
dc_msg_set_subject(get_dc_msg(env, obj), textPtr);
|
||||
CHAR_UNREF(text);
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setText(JNIEnv *env, jobject obj, jstring text)
|
||||
{
|
||||
CHAR_REF(text);
|
||||
@@ -1692,14 +1674,6 @@ 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 void Java_com_b44t_messenger_DcMsg_setFile(JNIEnv *env, jobject obj, jstring file, jstring filemime)
|
||||
{
|
||||
CHAR_REF(file);
|
||||
@@ -1871,11 +1845,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isBlocked(JNIEnv *env, jobj
|
||||
return (jboolean)(dc_contact_is_blocked(get_dc_contact(env, obj))!=0);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isBot(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return (jboolean)(dc_contact_is_bot(get_dc_contact(env, obj))!=0);
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isVerified(JNIEnv *env, jobject obj)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
Delta Chat es una aplicación de mensajería totalmente compatible con
|
||||
infraestructura de correo electrónico.
|
||||
|
||||
Por lo tanto, con Delta Chat se obtiene la facilidad de conocidos mensajeros con el alcance de
|
||||
e-mail. Además, eres independiente de otras empresas o servicios, ya que tu
|
||||
Los datos no están relacionados con Delta Chat, ni siquiera agregará nuevas dependencias aquí.
|
||||
|
||||
Algunas características de un vistazo:
|
||||
|
||||
* Seguro con cifrado automático de extremo a extremo, compatible con el nuevo estándar <a href="https://autocrypt.org">Autocrypt</a>
|
||||
* Rápido mediante el uso de Push-IMAP
|
||||
* Mayor base de usuarios -- también se puede llegar a los receptores que no usan Delta Chat
|
||||
* Compatible -- no sólo consigo mismo
|
||||
* Interfaz de usuario elegante y sencilla
|
||||
* Sistema distribuido
|
||||
* Sin spam -- sólo los mensajes de usuarios conocidos se muestran por defecto
|
||||
* Fiable -- seguro para uso profesional
|
||||
* Confiable -- incluso se puede utilizar para mensajes de negocios
|
||||
* Totalmente OpenSource y basado en estándares
|
||||
@@ -1 +1 @@
|
||||
Chatta via e-mail. Elegantemente Retrò, Decentralizzato e Aperto. Privacy da Progettazione.
|
||||
Chatta via e-mail. Elegantemente Retrò, Decentralizzato e Aperto. Riservatezza da Progettazione.
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
当传统电子邮件用户向群组发送邮件并添加新收件人时,这些新收件人将成为群组成员。
|
||||
将来自传统电子邮件用户的附带PGP密钥视为倾向于互相加密的信号。
|
||||
将来自传统电子邮件用户的加密或签名消息视为倾向于互相加密的信号。
|
||||
修复旧数据库的迁移问题。
|
||||
修复:仅在聊天已被其他成员知晓的情况下发送临时计时器变更消息。
|
||||
修复:使用相对路径访问数据库,以避免在迁移到其他设备或路径时出现问题。
|
||||
修复通过SOCKS5的IMAP连接的读写超时问题。
|
||||
修复:如果没有修改任何字符,则不发送“群组名称变更”信息。
|
||||
新增希腊语翻译,更新其他语言翻译。
|
||||
更新至core104版本。
|
||||
@@ -0,0 +1,13 @@
|
||||
修复:使归档的对话可见,这些对话不会自动解除归档(静音的对话):添加未读计数器并将归档移至顶部
|
||||
修复:直接发送AVIF、HEIC、TXT、PPT、XLS、XML等格式的文件,不进行转换
|
||||
修复:当获取现有消息失败时触发重新连接
|
||||
修复:在消息获取失败后不再重试,以防止无限重新连接循环
|
||||
修复:如果消息已加密但未签名,不再添加错误提示
|
||||
修复:不再从消息行首删除前导空格
|
||||
修复发送引用文本时的边缘情况问题
|
||||
修复STARTTLS连接问题
|
||||
修复:不将无效的电子邮件地址视为异常处理
|
||||
修复:及时清理在1.34.8版本中引入的相对数据库路径问题
|
||||
加快聊天列表和联系人列表的更新速度
|
||||
更新翻译
|
||||
更新至core106版本
|
||||
@@ -0,0 +1,5 @@
|
||||
* 在“添加账户”和“配置”中增加SOCKS5代理选项
|
||||
* 引入DNS缓存功能:如果网络中的DNS服务停止工作,Delta Chat仍能通过使用先前的IP地址成功连接到IMAP服务器
|
||||
* 显示完整邮件内容:不自动加载远程内容以请求
|
||||
* 修复多种错误并增强日志记录功能
|
||||
* 更新翻译内容
|
||||
@@ -0,0 +1,8 @@
|
||||
* 添加第二台设备到账号的新简便方法:安装后选择“作为第二台设备添加”,然后扫描第一台设备上的二维码
|
||||
* 查看所有聊天中的“所有媒体”
|
||||
* 新增“清空聊天”选项
|
||||
* 为所有账号显示通知
|
||||
* 在“显示完整消息”中更好地利用深色/浅色模式
|
||||
* 在应用信息消息旁显示图标
|
||||
* 通过缓存SMTP和IMAP连接的DNS结果以提高对解析中断的处理能力
|
||||
* 加速并提升了可靠性的改进与修复
|
||||
@@ -0,0 +1,8 @@
|
||||
* 在使用“设置/添加第二台设备”设置好第二台设备后,添加一条设备添加消息
|
||||
* 显著加快“作为第二台设备添加”在接收端的连接时间
|
||||
* 如有可能,在扫描“添加第二台设备”二维码后直接显示Wi-Fi名称
|
||||
* 修复“添加第二台设备”立即重启的问题
|
||||
* 修复:在“所有媒体”视图中不只显示已删除的媒体
|
||||
* 修复:在“添加第二台设备”后如有需要则更新数据库
|
||||
* 更新翻译内容和本地帮助文档
|
||||
* 更新至core112.6版本
|
||||
@@ -0,0 +1,6 @@
|
||||
* 根据系统主题自动选择浅色/深色模式启动
|
||||
* 修复一对一聊天中的验证图标问题
|
||||
* 修正因在长IMAP响应中错误的EOF检测导致的获取错误
|
||||
* 更多错误修复
|
||||
* 更新翻译内容和本地帮助文档
|
||||
* 更新至core112.7版本
|
||||
@@ -0,0 +1,4 @@
|
||||
* 将SOCKS5配置来也用来加载HTML邮件中的远程图片
|
||||
* 错误修复
|
||||
* 更新翻译内容和本地帮助文档
|
||||
* 更新至core112.8版本
|
||||
@@ -0,0 +1,6 @@
|
||||
* 新的Webxdc API:importFiles()和sendToChat()
|
||||
* 移除附件的大小限制
|
||||
* 节省流量和存储空间:对大的PNG及其他受支持的图像格式进行重新编码(大的JPEG文件一直都会被重新编码;以“文件”形式发送的图像仍不会被重新编码或以其他方式改变)
|
||||
* 节省本地存储空间:对数据库中的HTML邮件进行压缩
|
||||
* 提升群组成员身份一致性
|
||||
* 大量错误修复
|
||||
@@ -0,0 +1,5 @@
|
||||
* 在可能的情况下,使用图像编辑器来选择头像
|
||||
* 改进深色模式下的加载屏幕显示效果
|
||||
* 更新“已验证图标”
|
||||
* 添加卢尔语(Luri) 巴克提尔利语(Bakhtiari)语翻译,更新其他语言翻译
|
||||
* 大量错误修复
|
||||
@@ -0,0 +1,5 @@
|
||||
* 在可能的情况下,使用图像编辑器来选择头像
|
||||
* 改进深色模式下的加载屏幕显示效果
|
||||
* 更新“已验证图标”
|
||||
* 添加卢尔语(Luri) 巴克提尔利语(Bakhtiari)语翻译,更新其他语言翻译
|
||||
* 大量错误修复
|
||||
@@ -0,0 +1,6 @@
|
||||
- 现在一对一聊天为保证了端到端的加密的联系人使用绿色对勾标记
|
||||
- 为了简化每个人的体验,我们也用绿色对勾标记这些聊天
|
||||
- 如有可能,群聊会自动创建并尽可能保证端到端的加密
|
||||
- 接受/屏蔽、已存档、置顶、静音状态在您所有设备间同步
|
||||
- 相机、语音消息、备份全部、屏幕阅读器、每个账户单独的壁纸、相册全选、Webxdc横屏模式等方面有更多的改进
|
||||
- 大量的错误修复
|
||||
@@ -0,0 +1,6 @@
|
||||
- 现在一对一聊天为保证了端到端的加密的联系人使用绿色对勾标记
|
||||
- 为了简化每个人的体验,我们也用绿色对勾标记这些聊天
|
||||
- 如有可能,群聊会自动创建并尽可能保证端到端的加密
|
||||
- 接受/屏蔽、已存档、置顶、静音状态在您所有设备间同步
|
||||
- 相机、语音消息、备份全部、屏幕阅读器、每个账户单独的壁纸、相册全选、Webxdc横屏模式等方面有更多的改进
|
||||
- 大量的错误修复
|
||||
@@ -0,0 +1,6 @@
|
||||
- 在设备间同步“您的个人资料名称”、“显示组邮件”和“阅读回执”选项的更改
|
||||
- 取消对.xdc文件大小的接收方限制
|
||||
- 修复针对如163.com等提供商的登录错误
|
||||
- 修复在使用多个私钥时的解密错误
|
||||
- 修复在webxdc更新时的数据库锁定错误
|
||||
- 更新翻译内容
|
||||
@@ -0,0 +1,8 @@
|
||||
- "反应功能":长按消息以作出回应
|
||||
- 如果无法扫描二维码,可以将它们分享为“邀请链接”
|
||||
- 现在,所有账户的未读消息会被计数并在标题中显示
|
||||
- 移除了Webxdc的发送限制
|
||||
- 长按聊天列表项现在可以直接使聊天静音/取消静音
|
||||
- 在打开“密码与账户”前,会要求输入系统解锁密码
|
||||
- 新选项:“设置/高级/读取系统通讯录”
|
||||
- 大量错误修复
|
||||
@@ -0,0 +1,16 @@
|
||||
Delta Chat 是一款完全兼容现有电子邮件基础设施的即时通讯应用程序。
|
||||
|
||||
因此,使用 Delta Chat,您既能享受到知名即时通讯软件的便捷性,又能拥有电子邮件的广泛可达性。此外,您将独立于其他公司或服务——因为您的数据不依赖于 Delta Chat,您在这里也不会增加新的依赖关系。
|
||||
|
||||
部分功能亮点包括:
|
||||
|
||||
* 安全性:自动端到端加密,并支持最新的<a href="https://autocrypt.org">Autocrypt</a>标准
|
||||
* 速度:通过Push-IMAP技术实现快速通信
|
||||
* 最大用户基数:未使用 Delta Chat 的接收者也能顺利接收到信息
|
||||
* 兼容性强:不仅限于 Delta Chat 用户之间的交流
|
||||
* 优雅且简单的用户界面
|
||||
* 分布式系统
|
||||
* 无垃圾邮件:默认仅显示已知联系人的消息
|
||||
* 可靠性高:适合专业用途
|
||||
* 值得信赖:可用于商业信息交流
|
||||
* 完全开源且基于标准构建
|
||||
@@ -1 +1 @@
|
||||
通过电子邮件进行即时通信
|
||||
通过电子邮件进行即时通信。经典优雅,去中心化且开源。保护隐私。
|
||||
|
||||
@@ -1 +1 @@
|
||||
通過電子郵件即時通信
|
||||
透過電子郵件聊天。優雅復古、去中心化而且開源。隱私設計。
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Delta Chat
|
||||
@@ -1,20 +1,9 @@
|
||||
# native methods
|
||||
-keep class com.b44t.messenger.** { * ; }
|
||||
|
||||
# Gson uses generic type information stored in a class file when working with
|
||||
# fields. Proguard removes such information by default, keep it.
|
||||
-keepattributes Signature
|
||||
# This is also needed for R8 in compat mode since multiple
|
||||
# optimizations will remove the generic signature such as class
|
||||
# merging and argument removal. See:
|
||||
# https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson
|
||||
-keep class com.google.gson.reflect.TypeToken { *; }
|
||||
-keep class * extends com.google.gson.reflect.TypeToken
|
||||
-keep class com.b44t.messenger.** { *; }
|
||||
-keep class org.thoughtcrime.securesms.util.FileUtils* { *; }
|
||||
|
||||
# bug with video recoder
|
||||
-keep class com.coremedia.iso.** { *; }
|
||||
|
||||
# unused SealedData constructor needed by JsonUtils
|
||||
-keep class org.thoughtcrime.securesms.crypto.KeyStoreHelper* { *; }
|
||||
|
||||
-dontwarn com.google.firebase.analytics.connector.AnalyticsConnector
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
# deploy DeltaChat from the jni/deltachat-core-rust directory by
|
||||
# typing `nmake`:
|
||||
#
|
||||
# nmake() {(cd ../..; scripts/ndk-make.sh arm64-v8a && ./gradlew installFatDebug; notify-send "install finished")}
|
||||
# nmake() {(cd ../..; scripts/ndk-make.sh arm64-v8a && ./gradlew installFossDebug; notify-send "install finished")}
|
||||
#
|
||||
#
|
||||
# If anything doesn't work, please open an issue!!
|
||||
@@ -141,14 +141,14 @@ if test -z $1 || test $1 = x86; then
|
||||
cp target/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
|
||||
fi
|
||||
|
||||
# if test -z $1 || test $1 = x86_64; then
|
||||
# echo "-- cross compiling to x86_64-linux-android (x86_64) --"
|
||||
# TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
|
||||
# TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
# TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
# cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi --features jsonrpc
|
||||
# cp target/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
|
||||
# fi
|
||||
if test -z $1 || test $1 = x86_64; then
|
||||
echo "-- cross compiling to x86_64-linux-android (x86_64) --"
|
||||
TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi --features jsonrpc
|
||||
cp target/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
|
||||
fi
|
||||
|
||||
rm -fr "$TMPLIB"
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ if [[ ${VERSION:0:1} == "v" ]]; then
|
||||
fi
|
||||
|
||||
APKGPLAY="gplay/release/deltachat-gplay-release-$VERSION.apk"
|
||||
APKDEV="build/outputs/apk/fat/debug/deltachat-fat-debug-$VERSION.apk"
|
||||
APKDEV="build/outputs/apk/foss/debug/deltachat-foss-debug-$VERSION.apk"
|
||||
ls -l $APKGPLAY
|
||||
ls -l $APKDEV
|
||||
read -p "upload these apks to download.delta.chat/android/beta? ENTER to continue, CTRL-C to abort."
|
||||
@@ -28,7 +28,7 @@ echo "upload done."
|
||||
echo ""
|
||||
echo "and now: here is Delta Chat $VERSION - choose your flavour and mind your backups:"
|
||||
echo "- 🍋 https://download.delta.chat/android/beta/deltachat-gplay-release-$VERSION.apk (android, overwrites existing gplay installs, should keep data)"
|
||||
echo "- 🍉 https://download.delta.chat/android/beta/deltachat-fat-debug-$VERSION.apk (android, can be installed beside gplay)"
|
||||
echo "- 🍉 https://download.delta.chat/android/beta/deltachat-foss-debug-$VERSION.apk (android, fully FOSS, can be installed beside gplay)"
|
||||
echo "- 🍏 https://testflight.apple.com/join/uEMc1NxS (ios, update to $VERSION may take a day or so)"
|
||||
echo ""
|
||||
echo "what to test: PLEASE_FILL_OUT"
|
||||
|
||||
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 25 KiB |
@@ -74,17 +74,6 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||
android:exported="true">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<action android:name="android.intent.action.GET_CONTENT"/>
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="content"/>
|
||||
<data android:scheme="file"/>
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:mimeType="application/octet-stream" />
|
||||
</intent-filter>
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
@@ -220,8 +209,6 @@
|
||||
|
||||
<intent-filter>
|
||||
<data android:scheme="mailto"/>
|
||||
<data android:scheme="http"/>
|
||||
<data android:scheme="https"/>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
|
||||
@@ -545,7 +545,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1214,7 +1214,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
|
||||
@@ -507,7 +507,7 @@ anstelle von proprietärem Google-Code auf dem Telefon.</p>
|
||||
Und nein, es gibt für Apple-Telefonen keine Alternative, Push-Benachrichten zuzustellen;
|
||||
Apple-Geräte erlauben es Delta Chat nicht, Daten im Hintergrund abzurufen.
|
||||
Push-Benachrichtigungen werden für iOS-Nutzer automatisch aktiviert, da
|
||||
<a href="#privacy-notifications">Delta Chats datenschutzminimierendes Push-Benachrichtigungssystem</a>
|
||||
<a href="#privacy-notifications">Delta Chats datenschutzwahrendes Push-Benachrichtigungssystem</a>
|
||||
keine Daten an Apple weitergibt, die Apple nicht bereits hat.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -556,47 +556,46 @@ können sicher ausprobiert werden, wenn Sie feststellen, dass Nachrichten nur mi
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat Push Notification support avoids leakage of private information.
|
||||
It does not leak e-mail, IP address or message content (not even encrypted)
|
||||
to any system involved in the delivery of Push Notifications.</p>
|
||||
<p>Delta Chats Vorgehensweise, Push-Benachrichtigungen zu verwenden, vermeidet die Weitergabe privater Informationen.
|
||||
Es werden keine E-Mail- oder IP-Adressen oder Nachrichteninhalte (auch nicht verschlüsselt)
|
||||
an irgendein System, das an der Zustellung von Push-Benachrichtigungen beteiligt ist, weitergegeben.</p>
|
||||
|
||||
<p>Here is how Delta Chat apps perform Push Notification delivery:</p>
|
||||
<p>So verwendet Delta Chat Push-Benachrichtigungen:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>A Delta Chat app obtains a “device token” locally and stores it
|
||||
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
|
||||
<p>Eine Delta-Chat-Anwendung erhält lokal ein „Geräte-Token“ (eine zufällige Zahl) und speichert es
|
||||
auf dem <a href="https://delta.chat/chatmail">Chatmail</a>-Server.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
|
||||
it forwards the “device token” to the central Delta Chat notification proxy.</p>
|
||||
<p>Wenn ein <a href="https://delta.chat/chatmail">Chatmail</a>-Server eine E-Mail für einen Delta Chat-Benutzer erhält
|
||||
erhält, leitet er den „Geräte-Token“ an den zentralen Delta-Chat-Benachrichtigungs-Proxy weiter.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The central Delta Chat notification proxy forwards
|
||||
the “device token” to the respective Push service (Apple, Google, etc.),
|
||||
without ever knowing the IP or e-mail address of Delta Chat users.</p>
|
||||
<p>Der zentrale Delta-Chat-Benachrichtigungs-Proxy leitet
|
||||
das „Geräte-Token“ an den jeweiligen Push-Dienst (Apple, Google, etc.) weiter,
|
||||
ohne jemals die IP- oder E-Mail-Adresse des Delta-Chat-Benutzers zu kennen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The central Push Service (Apple, Google, etc.)
|
||||
wakes up the Delta Chat app on your device
|
||||
to check for new messages in the background.
|
||||
It does not know about the chatmail or e-mail address of the device it wakes up.
|
||||
The central Apple/Google Push services never see an e-mail address (sender or receiver)
|
||||
and also never see any message content (also not in encrypted forms).</p>
|
||||
<p>Der zentrale Push-Dienst (Apple, Google, etc.)
|
||||
weckt die Delta-Chat-App auf Ihrem Gerät auf
|
||||
um im Hintergrund nach neuen Nachrichten zu suchen.
|
||||
Der zentrale Push-Dienst weiß nichts über die Chatmail- oder E-Mail-Adresse des Geräts, das er aufweckt und sieht nie eine E-Mail-Adresse (Absender oder Empfänger)
|
||||
und auch nie den Inhalt einer Nachricht (auch nicht in verschlüsselter Form).</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>As of May 2024, chatmail servers know about “device tokens”
|
||||
but we plan to encrypt this information to the notification proxy
|
||||
such that the chatmail server never learns the device token.</p>
|
||||
<p>Stand Mai 2024 kennen die Chatmail-Server die Geräte-Token,
|
||||
aber wir planen, diese Informationen an den Benachrichtigungs-Proxy zu verschlüsseln
|
||||
zu verschlüsseln, so dass der Chatmail-Server niemals das „Geräte-Token“ erfährt.</p>
|
||||
|
||||
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
|
||||
and forgets about device-tokens as soon as Apple/Google/etc processed them,
|
||||
usually in a matter of milliseconds.</p>
|
||||
<p>Der zentrale Delta-Chat-Benachrichtigungs-Proxy <a href="https://github.com/deltachat/notifiers">ist klein und vollständig in Rust implementiert</a>
|
||||
und vergisst die Geräte-Token, sobald Apple/Google/etc. sie verarbeitet hat,
|
||||
normalerweise innerhalb weniger Millisekunden.</p>
|
||||
|
||||
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
|
||||
or the full seizure of the central Delta Chat notification proxy
|
||||
would not reveal private information that Push services do not already have.</p>
|
||||
<p>Aufgrund dieses umfassenden Datenschutzkonzepts würde sogar die Beschlagnahmung eines Chatmail-Servers,
|
||||
oder die vollständige Beschlagnahmung des zentralen Delta-Chat-Benachrichtigungsproxys
|
||||
keine privaten Informationen preisgeben, die den zentralen Push-Diensten nicht bereits vorliegen.</p>
|
||||
|
||||
<h3 id="warum-integriert-sich-delta-chat-in-zentralisierte-proprietäre-applegoogle-push-dienste">
|
||||
|
||||
@@ -1151,7 +1150,7 @@ Für andere Programme können Sie online eine Lösung finden.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Im März 2024 erhielten wir von der Forschungsgruppe “Applied Cryptography” der ETH Zürich eine umfassende Sicherheitsanalyse und haben alle aufgeworfenen Fragen adressiert.
|
||||
Weitere Informationen finden Sie in unserem Blogbeitrag über <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a>.</p>
|
||||
Weitere Informationen finden Sie in unserem Blogbeitrag über <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> und in der hinterher publizierten <a href="https://eprint.iacr.org/2024/918.pdf">Kryptografischen Analyse von Delta Chat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Im April 2023 haben wir Sicherheits- und Datenschutzprobleme mit den “In Chats geteilten Apps”-Feature behoben, die mit Fehlern beim Sandboxing, insbesondere mit Chromium zusammenhängen. Wir haben daraufhin eine unabhängige Sicherheitsprüfung von Cure53 durchführen lassen, und alle gefundenen Probleme wurden mit den im April 2023 veröffentlichten 1.36 Releases behoben. Siehe <a href="https://delta.chat/en/2023-05-22-webxdc-security">hier für die vollständige Hintergrundgeschichte</a>.</p>
|
||||
|
||||
@@ -549,7 +549,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1220,7 +1220,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
|
||||
@@ -542,7 +542,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1182,7 +1182,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
|
||||
@@ -523,7 +523,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1186,7 +1186,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Début 2023, nous avons réparé les failles de sécurité et de confidentialité de la fonctionnalité “partage d’appli web dans une discussion” liées à des dysfonctionnements en mode bac à sable, en particulier avec Chromium. Après quoi, nous avons soumis Delta Chat à un nouvel audit de sécurité indépendant par Cure53, puis effectué les réparations de toutes les failles découvertes pour la version 1.36 de nos applications, publiée en avril 2023.
|
||||
|
||||
@@ -549,7 +549,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1220,7 +1220,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
|
||||
@@ -538,11 +538,11 @@ per gli utenti di Delta Chat.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sì, Delta Chat utilizza automaticamente le Notifiche Push per i profili <a href="https://delta.chat/chatmail">chatmail</a>.
|
||||
<p>Sì, Delta Chat utilizza automaticamente le notifiche push per i profili <a href="https://delta.chat/chatmail">chatmail</a>.
|
||||
E no, non esiste alcuna alternativa sui telefoni Apple per ottenere la consegna dei messaggi istantanei
|
||||
perché i dispositivi Apple non consentono a Delta Chat di recuperare i dati in background.
|
||||
Le Notifiche Push vengono attivate automaticamente per gli utenti iOS perché
|
||||
<a href="#privacy-notifications">Sistema di Notifiche Push per ridurre al minimo la privacy di Delta Chat</a>
|
||||
Le notifiche push vengono attivate automaticamente per gli utenti iOS perché
|
||||
<a href="#privacy-notifications">Sistema di notifiche push che tutela la privacy di Delta Chat</a>
|
||||
non espone ad Apple i dati che non possiede già.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1205,9 +1205,11 @@ un’analisi di sicurezza indipendente, dal più recente al più vecchio:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Marzo 2024, abbiamo ricevuto un’analisi approfondita della sicurezza dalla Crittografia Applicata
|
||||
gruppo di ricerca dell’ETH di Zurigo e ha affrontato tutte i problemi emersi.
|
||||
Consulta il nostro post sul blog sul <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">rafforzamento della crittografia end-to-end garantita</a> per informazioni più dettagliate.</p>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A partire dal 2023, abbiamo risolto i problemi di sicurezza e privacy con il servizio “web
|
||||
|
||||
@@ -542,7 +542,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1212,7 +1212,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sinds begin 2023 hebben we diverse beveiligings- en privacyproblemen met ‘webapps
|
||||
|
||||
@@ -459,7 +459,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
</h3>
|
||||
|
||||
<p>Tak, Delta Chat automatycznie korzysta z powiadomień push dla profili <a href="https://delta.chat/chatmail">chatmail</a>
|
||||
. I nie, w telefonach Apple nie ma alternatywy umożliwiającej natychmiastowe dostarczanie wiadomości, ponieważ urządzenia Apple nie pozwalają Delta Chat na pobieranie danych w tle. Powiadomienia push są automatycznie aktywowane dla użytkowników iOS, ponieważ <a href="#privacy-notifications">minimalizujący prywatność system powiadomień push Delta Chat</a> nie udostępnia Apple danych, których jeszcze nie posiada.</p>
|
||||
. I nie, w telefonach Apple nie ma alternatywy umożliwiającej natychmiastowe dostarczanie wiadomości, ponieważ urządzenia Apple nie pozwalają Delta Chat na pobieranie danych w tle. Powiadomienia push są automatycznie aktywowane dla użytkowników iOS, ponieważ <a href="#privacy-notifications">system prywatności powiadomień Delta Chat</a> nie udostępnia Apple danych, których jeszcze nie posiada.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
|
||||
@@ -575,32 +575,22 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you have a second communication channel with your chat partner,
|
||||
like a video chat or a different messenger,
|
||||
you can generate an invite link.</p>
|
||||
<p>Jeśli masz drugi kanał komunikacji ze swoim partnerem na czacie, np. czat wideo lub inny komunikator, możesz wygenerować link zaproszenia.</p>
|
||||
|
||||
<p>If you are together in person,
|
||||
you can show a QR code to your chat partner.</p>
|
||||
<p>Jeśli jesteście razem osobiście, możesz pokazać kod QR swojemu rozmówcy.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>For <strong>Group invitations</strong>,
|
||||
tap the chat group title to see its member list,
|
||||
and select “QR Invite code”.</p>
|
||||
<p>W przypadku <strong>zaproszeń grupowych</strong> dotknij tytułu czatu grupy, aby wyświetlić listę jej członków, i wybierz „Kod QR zaproszenia”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For <strong>direct 1:1 chat invitations</strong>,
|
||||
tap the QR Code icon <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
on the Delta Chat app main screen.</p>
|
||||
<p>Aby uzyskać <strong>bezpośrednie zaproszenia na czat 1:1</strong>, dotknij ikony kodu QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> na ekranie głównym aplikacji Delta Chat.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Let your chat partner scan the QR image
|
||||
with their Delta Chat app,
|
||||
or click “Copy” or “Share” to create an invite link
|
||||
and share it with your chat partner.</p>
|
||||
<p>Pozwól swojemu partnerowi czatu zeskanować obraz QR za pomocą aplikacji Delta Chat lub dotknij „Kopiuj” lub „Udostępnij”, aby utworzyć link zaproszenia i udostępnić go swojemu partnerowi czatu.</p>
|
||||
|
||||
<p>Now wait while <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">Secure-Join network messages are exchanged</a> between both devices.</p>
|
||||
<p>Teraz poczekaj, aż między obydwoma urządzeniami <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">nastąpi wymiana wiadomości sieciowych Secure-Join</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -886,9 +876,14 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
|
||||
|
||||
<p>Projekt Delta Chat przeszedł cztery niezależne audyty bezpieczeństwa i jedną niezależną analizę bezpieczeństwa, od najnowszego do najstarszego:</p>
|
||||
|
||||
<p>W marcu 2024 r. otrzymaliśmy dogłębną analizę bezpieczeństwa od grupy badawczej ds. kryptografii stosowanej w ETH Zuerich i zajęliśmy się wszystkimi poruszonymi kwestiami. Bardziej szczegółowe informacje można znaleźć w naszym poście na blogu na temat <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">szyfrowania typu „end-to-end” z gwarancją hartowania</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>W kwietniu 2023 r. naprawiliśmy problemy z bezpieczeństwem i prywatnością w funkcji „aplikacje internetowe udostępniane na czacie”, związane z awariami piaskownicy, szczególnie w przypadku Chromium. Następnie przeprowadziliśmy niezależny audyt bezpieczeństwa od Cure53 i wszystkie wykryte problemy zostały naprawione w aplikacji z serii 1.36 wydanej w kwietniu 2023 r. <a href="https://delta.chat/en/2023-05-22-webxdc-security">Pełną historię bezpieczeństwa end-to-end w sieci można znaleźć tutaj</a>.</p>
|
||||
</li>
|
||||
|
||||
@@ -543,7 +543,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1214,7 +1214,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
|
||||
@@ -549,7 +549,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1220,7 +1220,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
|
||||
@@ -550,7 +550,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1221,7 +1221,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Në fillim të 2023-shit, ndreqëm probleme sigurie dhe privatësie me
|
||||
|
||||
@@ -457,7 +457,12 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Так, Delta Chat автоматично використовує push-повідомлення для <a href="https://delta.chat/chatmail">chatmail</a>-профілів. І ні, на телефонах Apple немає альтернативи миттєвій доставці повідомлень тому що пристрої Apple не дозволяють Delta Chat отримувати дані у фоновому режимі. Push-сповіщення автоматично активуються для користувачів iOS, тому що <a href="#privacy-notifications">система push-сповіщень Delta Chat, що мінімізує конфіденційність</a> не передає Apple дані, яких у неї ще немає.</p>
|
||||
<p>Yes, Delta Chat automatically uses Push Notifications for <a href="https://delta.chat/chatmail">chatmail</a> profiles.
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
|
||||
@@ -877,7 +882,11 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>2024 березня ми отримали глибокий аналіз безпеки від дослідницької групи Applied Cryptography з прикладної криптографії в ETH Zuerich і вирішили всі порушені питання. Більш детальну інформацію можна знайти в нашому блозі в статті <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-end encryption</a>.</p>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Починаючи з 2023 року, ми виправили проблеми з безпекою та конфіденційністю у функції “веб застосунків, що поширені у чаті”, пов’язані зі збоями в роботі пісочниці особливо в Chromium. Згодом ми отримали незалежний аудит безпеки аудит безпеки від Cure53, і всі знайдені проблеми були виправлені в серії додатків 1.36, випущених у квітні 2023 року. Повну історію про наскрізну безпеку в Інтернеті дивіться <a href="https://delta.chat/en/2023-05-22-webxdc-security">тут</a>.</p>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<li><a href="#与其他通信软件相比delta-chat-有哪些优势">与其他通信软件相比,Delta Chat 有哪些优势?</a></li>
|
||||
<li><a href="#如果希望收到我从未发送过消息的人的消息该怎么办">如果希望收到我从未发送过消息的人的消息,该怎么办?</a></li>
|
||||
<li><a href="#delta-chat-支持图像视频和其他附件吗">Delta Chat 支持图像、视频和其他附件吗?</a></li>
|
||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||
<li><a href="#multiple-accounts">什么是账户资料?如何在它们之间切换?</a></li>
|
||||
<li><a href="#谁会看见我的个人资料图片">谁会看见我的个人资料图片?</a></li>
|
||||
<li><a href="#signature">我可以为 Delta Chat 设置签名文本/状态/格言吗?</a></li>
|
||||
<li><a href="#固定静音归档是什么意思">固定、静音、归档是什么意思?</a></li>
|
||||
@@ -115,14 +115,14 @@
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Delta Chat is a reliable, decentralized and secure messaging app,
|
||||
available for mobile and desktop platforms.</p>
|
||||
<p>Delta Chat 是一款可靠、去中心化和安全的消息应用程序、
|
||||
适用于移动和桌面平台。</p>
|
||||
|
||||
<p>Delta Chat feels like Whatsapp or Telegram but you can also use and regard it as an e-mail app.
|
||||
You can signup anonymously to a variety of <a href="https://delta.chat/chatmail">interoperable chatmail servers</a>
|
||||
which are minimal e-mail servers optimized for fast and secure operations.
|
||||
Or you may use classic e-mail servers and an existing e-mail account
|
||||
in which case Delta Chat acts as an e-mail app.</p>
|
||||
<p>Delta Chat 感觉就像 Whatsapp 或 Telegram,但你也可以把它当作电子邮件应用程序来使用。
|
||||
你可以匿名注册到各种<a href="https://delta.chat/chatmail">可互操作的聊天邮件服务器</a>
|
||||
这些都是为快速安全运行而优化的最小电子邮件服务器。
|
||||
您也可以使用传统的电子邮件服务器和现有的电子邮件账户
|
||||
在这种情况下, Delta Chat 可充当邮件客户端。</p>
|
||||
|
||||
<p><img style="float:right; width:50%; max-width:360%; margin:1em;" src="../delta-what-optim.png" /></p>
|
||||
|
||||
@@ -134,15 +134,15 @@ in which case Delta Chat acts as an e-mail app.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>To securely setup contact with others <a href="#howtoe2ee">scan an invite QR code
|
||||
or share an invite link</a>.
|
||||
This is required when using a (default) chatmail-based chat profile
|
||||
because chatmail servers reject un-encrypted outgoing messages.</p>
|
||||
<p>要安全地与他人建立联系[扫描邀请二维码
|
||||
或分享邀请链接](#howtoe2ee)。
|
||||
使用(默认的)基于chatmail的聊天账户时需要这样做
|
||||
因为chatmail会拒绝未加密的发送信息。</p>
|
||||
|
||||
<p>If you create a chat profile with a classic e-mail address
|
||||
you may manually create a contact if you know their e-mail address
|
||||
and then write a message to them
|
||||
even if the recipient is not using Delta Chat.</p>
|
||||
<p>当使用经典电子邮件地址创建聊天配置文件时
|
||||
如果您知道联系人的电子邮件地址,您可以手动创建联系人
|
||||
然后给他们写信息
|
||||
即使收件人没有使用Delta Chat 。</p>
|
||||
|
||||
<h3 id="与其他通信软件相比delta-chat-有哪些优势">
|
||||
|
||||
@@ -154,23 +154,23 @@ even if the recipient is not using Delta Chat.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Anonymous chat profiles with fast, secure and interoperable <a href="https://delta.chat/chatmail">chatmail servers</a>
|
||||
which offer instant Push Notifications for iOS and Android devices.</p>
|
||||
<p>使用快速、安全、可互操作的 <a href="https://delta.chat/chatmail">chatmail 服务器</a> 创建匿名聊天账户
|
||||
为 iOS 和 Android 设备提供即时推送通知。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and multi-device support on all platforms.</p>
|
||||
<p>跨平台支持 [多配置文件](#多账户)和多设备。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Interactive <a href="https://webxdc.org/apps">web apps in chats</a> for gaming and collaboration</p>
|
||||
<p>交互性 <a href="https://webxdc.org/apps">聊天中的网页小程序</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="#security-audits">Audited end-to-end encryption</a>
|
||||
safe against network and server attacks.</p>
|
||||
<p><a href="#security-audits">经审计的端到端加密</a>
|
||||
安全地抵御网络和服务器攻击。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Free and Open Source software, both app and server side.
|
||||
Built on <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">E-mail and Web Internet Standards</a>,
|
||||
<a href="https://xkcd.com/927/">to avoid “yet another standard syndrome (xkcd 927)”</a></p>
|
||||
<p>免费开源软件,包括应用程序和服务器端。
|
||||
基于<a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">电子邮件和网络互联网标准</a>、
|
||||
<a href="https://xkcd.com/927/">避免 “又一个标准综合症(xkcd 927)”</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -208,25 +208,25 @@ Built on <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/s
|
||||
<h3 id="multiple-accounts">
|
||||
|
||||
|
||||
What are profiles? How can I switch between them? <a href="#multiple-accounts" class="anchor"></a>
|
||||
什么是账户资料?如何在它们之间切换? <a href="#multiple-accounts" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
|
||||
A profile lives on your device(s) only
|
||||
and uses a chatmail or a classic e-mail server to transport messages.</p>
|
||||
<p>一份账户资料包括<strong>姓名、照片</strong>和一些额外的加密信息。
|
||||
个人配置只存在于您的设备(们)中
|
||||
并使用聊天邮件或传统电子邮件服务器传输信息。</p>
|
||||
|
||||
<p>On first installation of Delta Chat a first profile is created.</p>
|
||||
<p>首次安装Delta Chat 时,会创建第一个账户资料文件。</p>
|
||||
|
||||
<p>Later, you can tap your profile image in the upper left corner to <strong>Add Profiles</strong>
|
||||
or to <strong>Switch Profiles</strong>.</p>
|
||||
<p>之后,您可以点击左上角的个人资料图像,<strong>添加个人账户</strong>
|
||||
或<strong>切换账户</strong>。</p>
|
||||
|
||||
<p>You may want to use separate profiles for political, family or work related activities,
|
||||
or e. g. for a dedicated “spam-profile” with which you register at websites and platforms
|
||||
that tend to cause unsolicited messages (“spam”) sooner or later.</p>
|
||||
<p>您可能希望为政治、家庭或工作相关的活动使用不同的账户资料,
|
||||
或者例如,为专门用于注册网站和平台的“垃圾邮件账户资料”,
|
||||
这些网站和平台往往会早晚导致未经请求的消息(即“垃圾邮件”)</p>
|
||||
|
||||
<p>You may also wish to learn <a href="#multiclient">how to use the same profile on multiple devices</a>.</p>
|
||||
<p>您可能还想了解 <a href="#multiclient">如何在多台设备上使用同一账户资料</a>。</p>
|
||||
|
||||
<h3 id="谁会看见我的个人资料图片">
|
||||
|
||||
@@ -438,16 +438,18 @@ They will most likely also not be decryptable anymore
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>默认情况下,Delta Chat 会在本地设备上存储您的所有消息。如果您,例如,想要节省邮件提供商处的存储空间,那么可以选择开启自动删除旧消息。这些消息还将保存在您的设备上(除非您在设备上删除它们)。</p>
|
||||
<p>默认情况下,Delta Chat 会在本地设备上存储您的所有消息。
|
||||
如果您,例如,想要节省邮件提供商处的存储空间,
|
||||
那么可以选择配置Delta Chat 以开启服务端自动删除旧消息。
|
||||
这些消息还将保存在您的设备上,除非您在设备上删除它们。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>To turn it on, go to <strong>Delete Old Messages → Delete Messages from Server</strong>
|
||||
in the “Chats and Media” settings.
|
||||
You can set a timeframe between “At once” and “After 1 year”.
|
||||
All e-mails received by Delta Chat will be deleted from the server after this timeframe.</p>
|
||||
<p>要打开它,请转到 “聊天和媒体 “设置中的<strong>删除旧信息 → 从服务器删除信息</strong>。
|
||||
您可以在 “立即 “和 “1 年后 “之间设置时限。
|
||||
Delta Chat 收到的所有电子邮件都将在此期限后从服务器中删除。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>注意:如果在多台设备上使用 Delta Chat,请将消息在服务器上保存足够长的时间,以便其他设备能够下载消息。在这种情况下,您应当根据其他设备的使用频率,将自动删除设置到“一天后”或相似的选项上。</p>
|
||||
<p>注意:如果在多台设备上使用 Delta Chat,请将消息在服务器上保存足够长的时间,以便其他设备能够下载消息。在这种情况下,您应当根据其他设备(们)的使用频率,将自动删除设置到“一天后”或相似的选项上。</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -512,7 +514,7 @@ for Delta Chat users.</p>
|
||||
And no, there is no alternative on Apple’s phones to achieve instant message delivery
|
||||
because Apple devices do not allow Delta Chat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-minimizing Push Notification system</a>
|
||||
<a href="#privacy-notifications">Delta Chat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
@@ -1173,7 +1175,9 @@ independent security analysis, from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 March, we received a deep security analysis from the Applied Cryptography
|
||||
research group at ETH Zuerich and addressed all raised issues.
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information.</p>
|
||||
See our blog post about <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> for more detailed information and the
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>
|
||||
research paper published afterwards.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 April, we fixed security and privacy issues with the “web
|
||||
@@ -1725,7 +1729,7 @@ if you set a <a href="#signature">signature text</a>.</p>
|
||||
|
||||
<p>副本会被发送到收件箱,然后会被移动到 DeltaChat 文件夹;它不会被放到“已发送”文件夹里。Delta Chat <em>从不</em> 将东西上传到已发送文件夹,因为这意味着上传一条消息两次(一次通过 SMTP,一次通过 IMAP 到已发送文件夹)。</p>
|
||||
|
||||
<p>The default setting for “Send Copy to Self” is “on”.</p>
|
||||
<p>“给自己发送副本”的默认设置为 “开”。</p>
|
||||
|
||||
<h3 id="为什么我可以选择监视已发送文件夹">
|
||||
|
||||
@@ -1735,7 +1739,7 @@ if you set a <a href="#signature">signature text</a>.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>监视已发送文件夹的唯一原因是:您在同时使用其他的邮件应用程序(比如 Thunderbird),并且想让邮件分发代理参与聊天对话。</p>
|
||||
<p>监视已发送文件夹的唯一原因是:您在使用Delta Chat软件的同时也使用其他的邮件应用程序(比如 Thunderbird),并且想让邮件分发代理参与聊天对话。</p>
|
||||
|
||||
<p>不过,我们推荐使用 Delta Chat 桌面客户端;您可以在 <a href="https://get.delta.chat">get.delta.chat</a> 下载它。监视“已发送”文件夹的选项是在还没有 Delta Chat 桌面客户端的时候引入的,这个选项可能会在未来消失。</p>
|
||||
|
||||
@@ -1807,48 +1811,31 @@ it is recommended to leave any group chat before uninstalling Delta Chat.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat 没有接受风险投资,也没有负债累累,更没有承受产生巨额利润或将用户及其朋友和家人卖给广告商(或更糟)的压力。我们宁愿使用(目前来自欧盟和美国的)公共资金,来帮助我们努力建立一个基于自由开源社区开发的、去中心化的、多样化的聊天消息(软件)生态系统。</p>
|
||||
<p>Delta Chat 没有接受风险投资,也没有负债累累,更没有承受产生巨额利润或将用户及其朋友和家人卖给广告商(或更糟)的压力。我们宁愿使用目前来自欧盟和美国的公共资金,来帮助我们努力建立一个基于自由开源社区开发的、去中心化的、多样化的聊天消息软件生态系统。</p>
|
||||
|
||||
<p>具体来说,到目前为止,对 Delta Chat 开发的资助有这些来源:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
<p><a href="https://nextleap.eu">NEXTLEAP</a>欧盟项目资助了以下研究和实施工作:在 2017 年和 2018 年实施的验证组和设置联系协议和通过 <a href="https://autocrypt.org">Autocrypt</a>整合了端到端加密。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在<a href="https://opentechfund.org">开放技术基金</a> 2018/2019 年提供的第一笔赠款(约 20 万美元)期间,我们显著改善了安卓应用,发布了第一个桌面测试版,并根据人权方面的用户体验研究进行了功能开发,请参阅我们的结论<a href="https://delta.chat/en/2019-07-19-uxreport">《需求发现与用户体验报告》</a>。2019/2020 年的第二笔赠款(约 30 万美元)对发布 Delta/iOS 版本,将核心库转换到 Rust ,以及为所有平台开发新功能提供了帮助。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p><a href="https://nlnet.nl/">NLnet 基金会</a> 2019/2020 年拨款 4.6 万欧元,用于完成 Rust/Python 绑定并建立聊天机器人生态系统。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在 2021 年,我们从两项下一代互联网提案收到了欧盟的进一步资助,即 <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - 电子邮件提供商可移植性目录</a>(约 9.7 万欧元)和 <a href="https://nlnet.nl/project/EmailPorting/">AEAP - 电子邮件地址移植</a>(约 9 万欧元)。这带来了更好的多账户支持,改进的二维码联系人和群组设置,和所有平台上的多处网络改进。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of e-mail servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>从 2021 年底到 2023 年 3 月,我们从美国民主、人权和劳工局(DRL)获得了<em>互联网自由</em>资金(50 万美元)。这笔资金支持了我们的长期目标,即让Delta Chat 更好用,并与全球范围内的各种电子邮件服务器兼容,而且在经常受到互联网审查制度影响的地方更具弹性和安全性。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Beginning 2023 we got accepted in the Next Generation Internet (NGI)
|
||||
Entrust program for our “Private Decentralized Apps” proposals.
|
||||
Exact amount is to be determined (around 100K EUR).
|
||||
This funding supports further developments of <a href="https://webxdc.org">webxdc “apps shared in a chat”</a>.</p>
|
||||
<p>从 2023 年开始,我们的 “私有去中心化应用程序 “提案获得了 下一代互联网(NGI)托付计划的青睐。 具体金额待定(约 10 万欧元)。这笔资金将支持<a href="https://webxdc.org">webxdc “聊天共享应用程序”</a>的进一步开发。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
For example, in 2021 a generous individual bank-wired us 4K EUR
|
||||
with the subject “keep up the good developments!”. 💜
|
||||
We use such money to fund development gatherings or to care for ad-hoc expenses
|
||||
that can not easily be predicted for, or reimbursed from, public funding grants.
|
||||
Receiving more donations also helps us to become more independent and long-term viable
|
||||
as a contributor community.</p>
|
||||
<p>我们有时会收到个人的一次性捐款。 例如,2021 年,一位慷慨的人士以 “继续保持良好的发展态势!”为主题通过银行向我们捐赠了4千欧元💜。 我们用这些钱来资助发展活动或支付不容易预测或从公共基金中报销的临时费用。收到更多的捐款也有助于我们作为一个贡献者社区变得更加独立和长期可持续。</p>
|
||||
|
||||
|
||||
</li>
|
||||
@@ -1859,8 +1846,8 @@ as a contributor community.</p>
|
||||
|
||||
<p>上面提到的钱款资助主要是由在弗赖堡(德国)的 merlinux GmbH 组织的,分发给了来自世界各地的十多位贡献者。</p>
|
||||
|
||||
<p>Please see <a href="https://delta.chat/zh_CN/contribute">Delta Chat Contribution channels</a>
|
||||
for both monetary and and other contribution possibilities.</p>
|
||||
<p>请参阅 [Delta Chat 捐款渠道](捐款)
|
||||
以了解货币捐款和其他捐款的可能性。</p>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -21,15 +21,7 @@ public class DcAccounts {
|
||||
|
||||
public DcEventEmitter getEventEmitter () { return new DcEventEmitter(getEventEmitterCPtr()); }
|
||||
public DcJsonrpcInstance getJsonrpcInstance () { return new DcJsonrpcInstance(getJsonrpcInstanceCPtr()); }
|
||||
public void startIo () {
|
||||
for (int accountId : getAll()) {
|
||||
DcContext acc = getAccount(accountId);
|
||||
if (acc.isEnabled()) {
|
||||
acc.startIo();
|
||||
}
|
||||
}
|
||||
};
|
||||
public native void startIo2 ();
|
||||
public native void startIo ();
|
||||
public native void stopIo ();
|
||||
public native void maybeNetwork ();
|
||||
public native void setPushDeviceToken (String token);
|
||||
|
||||
@@ -56,7 +56,6 @@ public class DcContact {
|
||||
public native long getLastSeen ();
|
||||
public native boolean wasSeenRecently();
|
||||
public native boolean isBlocked ();
|
||||
public native boolean isBot ();
|
||||
public native boolean isVerified ();
|
||||
public native int getVerifierId ();
|
||||
|
||||
|
||||
@@ -88,8 +88,6 @@ public class DcContext {
|
||||
public final static int DC_CONNECTIVITY_WORKING = 3000;
|
||||
public final static int DC_CONNECTIVITY_CONNECTED = 4000;
|
||||
|
||||
private static final String CONFIG_ACCOUNT_ENABLED = "ui.enabled";
|
||||
|
||||
// when using DcAccounts, use DcAccounts.addAccount() instead
|
||||
public DcContext(String osName, String dbfile) {
|
||||
contextCPtr = createContextCPtr(osName, dbfile);
|
||||
@@ -216,19 +214,6 @@ public class DcContext {
|
||||
public native boolean isSendingLocationsToChat(int chat_id);
|
||||
public DcProvider getProviderFromEmailWithDns (String email) { long cptr = getProviderFromEmailWithDnsCPtr(email); return cptr!=0 ? new DcProvider(cptr) : null; }
|
||||
|
||||
public boolean isEnabled() {
|
||||
return !"0".equals(getConfig(CONFIG_ACCOUNT_ENABLED));
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
setConfigInt(CONFIG_ACCOUNT_ENABLED, enabled? 1 : 0);
|
||||
if (enabled) {
|
||||
startIo();
|
||||
} else {
|
||||
stopIo();
|
||||
}
|
||||
}
|
||||
|
||||
public String getNameNAddr() {
|
||||
String displayname = getConfig("displayname");
|
||||
String addr = getConfig("addr");
|
||||
@@ -247,27 +232,25 @@ public class DcContext {
|
||||
return ret.trim();
|
||||
}
|
||||
|
||||
public boolean isCommunity() {
|
||||
return getConfigInt("is_community") == 1;
|
||||
}
|
||||
|
||||
public void setCommunityMode(boolean enable) {
|
||||
setConfig("is_community", enable? "1" : null);
|
||||
}
|
||||
|
||||
public String getCommunityUser() {
|
||||
String name = getConfig("ui.community.selfname");
|
||||
return name == null? "" : name;
|
||||
}
|
||||
|
||||
public void setCommunityUser(String name) {
|
||||
setConfig("ui.community.selfname", name);
|
||||
}
|
||||
|
||||
public boolean isChatmail() {
|
||||
return getConfigInt("is_chatmail") == 1;
|
||||
}
|
||||
|
||||
// Called for new profiles on chatmail servers that are "single device" initially;
|
||||
// to save server disk space, we make use of that delete all messages immediately after download.
|
||||
public void assumeSingleDevice() {
|
||||
if (isChatmail()) {
|
||||
setConfigInt("delete_server_after", 1 /*at once*/);
|
||||
}
|
||||
}
|
||||
|
||||
// Called when we get a hint that another device may be set up.
|
||||
public void assumeMultiDevice() {
|
||||
if (isChatmail() && getConfigInt("delete_server_after") == 1 /*at once*/) {
|
||||
setConfigInt("delete_server_after", 0 /*never/automatic*/);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if at least one chat has location streaming enabled
|
||||
*/
|
||||
|
||||
@@ -120,8 +120,7 @@ public class DcMsg {
|
||||
public native long getSortTimestamp ();
|
||||
public native boolean hasDeviatingTimestamp();
|
||||
public native boolean hasLocation ();
|
||||
private native int getViewType ();
|
||||
public int getType () { return getDownloadState()==DC_DOWNLOAD_DONE? getViewType() : DC_MSG_TEXT; }
|
||||
public native int getType ();
|
||||
public native int getInfoType ();
|
||||
public native int getState ();
|
||||
public native int getDownloadState ();
|
||||
@@ -157,8 +156,6 @@ public class DcMsg {
|
||||
public native int getVideochatType ();
|
||||
public native boolean isIncreation ();
|
||||
public native void setText (String text);
|
||||
public native void setSubject (String text);
|
||||
public native void setHtml (String text);
|
||||
public native void setFile (String file, String filemime);
|
||||
public native void setDimension (int width, int height);
|
||||
public native void setDuration (int duration);
|
||||
@@ -167,8 +164,6 @@ public class DcMsg {
|
||||
public native String getQuotedText ();
|
||||
public native String getError ();
|
||||
public native String getOverrideSenderName();
|
||||
public native boolean isOutgoing();
|
||||
public native int getSenderColor();
|
||||
|
||||
public String getSenderName(DcContact dcContact, boolean markOverride) {
|
||||
String overrideName = getOverrideSenderName();
|
||||
@@ -208,6 +203,10 @@ public class DcMsg {
|
||||
return ids;
|
||||
}
|
||||
|
||||
public boolean isOutgoing() {
|
||||
return getFromId() == DcContact.DC_CONTACT_ID_SELF;
|
||||
}
|
||||
|
||||
public String getDisplayBody() {
|
||||
return getText();
|
||||
}
|
||||
|
||||
@@ -126,6 +126,18 @@ public class Rpc {
|
||||
return getResult("draft_self_report", accountId).getAsInt();
|
||||
}
|
||||
|
||||
public void sendWebxdcRealtimeData(Integer accountId, Integer instanceMsgId, List<Integer> data) throws RpcException {
|
||||
getResult("send_webxdc_realtime_data", accountId, instanceMsgId, data);
|
||||
}
|
||||
|
||||
public void sendWebxdcRealtimeAdvertisement(Integer accountId, Integer instanceMsgId) throws RpcException {
|
||||
getResult("send_webxdc_realtime_advertisement", accountId, instanceMsgId);
|
||||
}
|
||||
|
||||
public void leaveWebxdcRealtime(Integer accountId, Integer instanceMessageId) throws RpcException {
|
||||
getResult("leave_webxdc_realtime", accountId, instanceMessageId);
|
||||
}
|
||||
|
||||
private static class Request {
|
||||
private final String jsonrpc = "2.0";
|
||||
public final String method;
|
||||
|
||||
@@ -27,7 +27,6 @@ import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcEventEmitter;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
|
||||
import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
@@ -50,8 +49,6 @@ import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
//import com.squareup.leakcanary.LeakCanary;
|
||||
|
||||
@@ -79,26 +76,6 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
throwable.printStackTrace(new PrintWriter(stringWriter, true));
|
||||
String errorMsg = "Android " + Build.VERSION.RELEASE +":\n" + stringWriter.getBuffer().toString();
|
||||
String subject = "DeltaLab " + BuildConfig.VERSION_NAME + " Crash Report";
|
||||
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
|
||||
intent.putExtra(android.content.Intent.EXTRA_TEXT, subject + "\n\n" + errorMsg);
|
||||
intent.putExtra(Intent.EXTRA_EMAIL, "adb@merlinux.eu");
|
||||
Intent chooser = Intent.createChooser(intent, subject);
|
||||
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
chooser.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||
startActivity(chooser);
|
||||
|
||||
try {
|
||||
ApplicationContext.this.finalize();
|
||||
} catch (Throwable e) {}
|
||||
});
|
||||
|
||||
// if (LeakCanary.isInAnalyzerProcess(this)) {
|
||||
// // This process is dedicated to LeakCanary for heap analysis.
|
||||
// // You should not init your app in this process.
|
||||
@@ -108,11 +85,6 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
|
||||
Log.i("DeltaChat", "++++++++++++++++++ ApplicationContext.onCreate() ++++++++++++++++++");
|
||||
|
||||
// The first call to `getInstance` takes about 100ms-300ms, so, do it on a background thread
|
||||
Thread t = new Thread(() -> EmojiProvider.getInstance(this), "InitEmojiProviderThread");
|
||||
t.setPriority(Thread.MIN_PRIORITY);
|
||||
t.start();
|
||||
|
||||
System.loadLibrary("native-utils");
|
||||
|
||||
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
|
||||
@@ -132,9 +104,6 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if ("deltafans@nine.testrun.org".equals(ac.getConfig("configured_addr")) && !ac.isCommunity()) {
|
||||
ac.setCommunityMode(true);
|
||||
}
|
||||
}
|
||||
if (allAccounts.length == 0) {
|
||||
dcAccounts.addAccount();
|
||||
@@ -246,11 +215,10 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
TimeUnit.MILLISECONDS)
|
||||
.setConstraints(constraints)
|
||||
.build();
|
||||
try {
|
||||
// in Android 4 this throws exception due to R8/shrinking
|
||||
WorkManager.getInstance(this)
|
||||
.enqueueUniquePeriodicWork("FetchWorker", ExistingPeriodicWorkPolicy.KEEP, fetchWorkRequest);
|
||||
} catch (Throwable e) {}
|
||||
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
|
||||
"FetchWorker",
|
||||
ExistingPeriodicWorkPolicy.KEEP,
|
||||
fetchWorkRequest);
|
||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
||||
|
||||
if (BuildConfig.USE_PLAY_SERVICES) {
|
||||
|
||||
@@ -47,7 +47,6 @@ import org.thoughtcrime.securesms.permissions.Permissions;
|
||||
import org.thoughtcrime.securesms.preferences.AdvancedPreferenceFragment;
|
||||
import org.thoughtcrime.securesms.preferences.AppearancePreferenceFragment;
|
||||
import org.thoughtcrime.securesms.preferences.ChatsPreferenceFragment;
|
||||
import org.thoughtcrime.securesms.preferences.PrivacyPreferenceFragment;
|
||||
import org.thoughtcrime.securesms.preferences.CorrectedPreferenceFragment;
|
||||
import org.thoughtcrime.securesms.preferences.NotificationsPreferenceFragment;
|
||||
import org.thoughtcrime.securesms.preferences.widgets.ProfilePreference;
|
||||
@@ -70,7 +69,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
private static final String PREFERENCE_CATEGORY_NOTIFICATIONS = "preference_category_notifications";
|
||||
private static final String PREFERENCE_CATEGORY_APPEARANCE = "preference_category_appearance";
|
||||
private static final String PREFERENCE_CATEGORY_CHATS = "preference_category_chats";
|
||||
private static final String PREFERENCE_CATEGORY_PRIVACY = "preference_category_privacy";
|
||||
private static final String PREFERENCE_CATEGORY_MULTIDEVICE = "preference_category_multidevice";
|
||||
private static final String PREFERENCE_CATEGORY_ADVANCED = "preference_category_advanced";
|
||||
private static final String PREFERENCE_CATEGORY_CONNECTIVITY = "preference_category_connectivity";
|
||||
@@ -148,8 +146,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_APPEARANCE));
|
||||
this.findPreference(PREFERENCE_CATEGORY_CHATS)
|
||||
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_CHATS));
|
||||
this.findPreference(PREFERENCE_CATEGORY_PRIVACY)
|
||||
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_PRIVACY));
|
||||
this.findPreference(PREFERENCE_CATEGORY_MULTIDEVICE)
|
||||
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_MULTIDEVICE));
|
||||
this.findPreference(PREFERENCE_CATEGORY_ADVANCED)
|
||||
@@ -201,8 +197,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
.setSummary(AppearancePreferenceFragment.getSummary(getActivity()));
|
||||
this.findPreference(PREFERENCE_CATEGORY_CHATS)
|
||||
.setSummary(ChatsPreferenceFragment.getSummary(getActivity()));
|
||||
this.findPreference(PREFERENCE_CATEGORY_PRIVACY)
|
||||
.setSummary(PrivacyPreferenceFragment.getSummary(getActivity()));
|
||||
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY)
|
||||
.setSummary(DcHelper.getConnectivitySummary(getActivity(), R.string.connectivity_connected));
|
||||
this.findPreference(PREFERENCE_CATEGORY_HELP)
|
||||
@@ -215,7 +209,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
Drawable swap = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_swap_vert_white_24dp));
|
||||
Drawable appearance = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_brightness_6_white_24dp));
|
||||
Drawable chats = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_forum_white_24dp));
|
||||
Drawable privacy = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_lock_white_24dp));
|
||||
Drawable advanced = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_advanced_white_24dp));
|
||||
Drawable help = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_help_white_24dp));
|
||||
|
||||
@@ -228,7 +221,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
DrawableCompat.setTint(swap, color);
|
||||
DrawableCompat.setTint(appearance, color);
|
||||
DrawableCompat.setTint(chats, color);
|
||||
DrawableCompat.setTint(privacy, color);
|
||||
DrawableCompat.setTint(advanced, color);
|
||||
DrawableCompat.setTint(help, color);
|
||||
|
||||
@@ -236,7 +228,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY).setIcon(swap);
|
||||
this.findPreference(PREFERENCE_CATEGORY_APPEARANCE).setIcon(appearance);
|
||||
this.findPreference(PREFERENCE_CATEGORY_CHATS).setIcon(chats);
|
||||
this.findPreference(PREFERENCE_CATEGORY_PRIVACY).setIcon(privacy);
|
||||
this.findPreference(PREFERENCE_CATEGORY_ADVANCED).setIcon(advanced);
|
||||
this.findPreference(PREFERENCE_CATEGORY_HELP).setIcon(help);
|
||||
}
|
||||
@@ -275,9 +266,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
case PREFERENCE_CATEGORY_CHATS:
|
||||
fragment = new ChatsPreferenceFragment();
|
||||
break;
|
||||
case PREFERENCE_CATEGORY_PRIVACY:
|
||||
fragment = new PrivacyPreferenceFragment();
|
||||
break;
|
||||
case PREFERENCE_CATEGORY_MULTIDEVICE:
|
||||
if (!ScreenLockUtil.applyScreenLock(getActivity(), getString(R.string.multidevice_title),
|
||||
getString(R.string.multidevice_this_creates_a_qr_code) + "\n\n" + getString(R.string.enter_system_secret_to_continue),
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
@@ -17,8 +16,6 @@ import com.b44t.messenger.DcMsg;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
|
||||
@@ -64,20 +61,11 @@ public abstract class BaseConversationItem extends LinearLayout
|
||||
}
|
||||
|
||||
protected void setInteractionState(DcMsg messageRecord, boolean pulseHighlight) {
|
||||
final int[] attributes = new int[] {
|
||||
R.attr.conversation_item_background,
|
||||
R.attr.conversation_item_background_animated,
|
||||
};
|
||||
|
||||
if (batchSelected.contains(messageRecord)) {
|
||||
final TypedArray attrs = context.obtainStyledAttributes(attributes);
|
||||
ViewUtil.setBackground(this, attrs.getDrawable(0));
|
||||
attrs.recycle();
|
||||
setBackgroundResource(R.drawable.conversation_item_background);
|
||||
setSelected(true);
|
||||
} else if (pulseHighlight) {
|
||||
final TypedArray attrs = context.obtainStyledAttributes(attributes);
|
||||
ViewUtil.setBackground(this, attrs.getDrawable(1));
|
||||
attrs.recycle();
|
||||
setBackgroundResource(R.drawable.conversation_item_background_animated);
|
||||
setSelected(true);
|
||||
postDelayed(() -> setSelected(false), PULSE_HIGHLIGHT_MILLIS);
|
||||
} else {
|
||||
|
||||
@@ -165,14 +165,31 @@ public abstract class BaseConversationListFragment extends Fragment implements A
|
||||
for (long chatId : selectedConversations) {
|
||||
dcContext.setChatMuteDuration((int)chatId, duration);
|
||||
}
|
||||
|
||||
if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
actionMode = null;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// unmute
|
||||
for (long chatId : selectedConversations) {
|
||||
dcContext.setChatMuteDuration((int)chatId, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
actionMode = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMarknoticedSelected() {
|
||||
final DcContext dcContext = DcHelper.getContext(requireActivity());
|
||||
final Set<Long> selectedConversations = new HashSet<Long>(getListAdapter().getBatchSelections());
|
||||
for (long chatId : selectedConversations) {
|
||||
dcContext.marknoticedChat((int)chatId);
|
||||
}
|
||||
if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
actionMode = null;
|
||||
@@ -348,6 +365,7 @@ public abstract class BaseConversationListFragment extends Fragment implements A
|
||||
case R.id.menu_pin_selected: handlePinAllSelected(); return true;
|
||||
case R.id.menu_archive_selected: handleArchiveAllSelected(); return true;
|
||||
case R.id.menu_mute_selected: handleMuteAllSelected(); return true;
|
||||
case R.id.menu_marknoticed_selected: handleMarknoticedSelected(); return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -17,10 +17,7 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import static org.thoughtcrime.securesms.TransportOption.Type;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedHtml;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedSubject;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedType;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
|
||||
|
||||
@@ -93,7 +90,6 @@ import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout.OnKeyboar
|
||||
import org.thoughtcrime.securesms.components.ScaleStableImageView;
|
||||
import org.thoughtcrime.securesms.components.SendButton;
|
||||
import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
|
||||
import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
|
||||
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
@@ -154,9 +150,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String FROM_ARCHIVED_CHATS_EXTRA = "from_archived";
|
||||
public static final String TEXT_EXTRA = "draft_text";
|
||||
public static final String MSG_TYPE_EXTRA = "msg_type";
|
||||
public static final String MSG_HTML_EXTRA = "msg_html";
|
||||
public static final String MSG_SUBJECT_EXTRA = "msg_subject";
|
||||
public static final String STARTING_POSITION_EXTRA = "starting_position";
|
||||
|
||||
private static final int PICK_GALLERY = 1;
|
||||
@@ -506,6 +499,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
Log.e(TAG, "cannot set up in-chat-search: ", e);
|
||||
}
|
||||
|
||||
if (!dcChat.canSend()) {
|
||||
MenuItem attachItem = menu.findItem(R.id.menu_add_attachment);
|
||||
if (attachItem!=null) {
|
||||
attachItem.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
return true;
|
||||
}
|
||||
@@ -514,6 +514,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
switch (item.getItemId()) {
|
||||
case R.id.menu_add_attachment: handleAddAttachment(); return true;
|
||||
case R.id.menu_leave: handleLeaveGroup(); return true;
|
||||
case R.id.menu_archive_chat: handleArchiveChat(); return true;
|
||||
case R.id.menu_clear_chat: fragment.handleClearChat(); return true;
|
||||
@@ -695,11 +696,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
.setPositiveButton(R.string.menu_send, (dialog, which) -> SendRelayedMessageUtil.immediatelyRelay(this, chatId))
|
||||
.show();
|
||||
} else {
|
||||
if (getSharedHtml(this) != null || getSharedSubject(this) != null || ("sticker".equals(getSharedType(this)) && !uriList.isEmpty())) {
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
if (uriList.isEmpty()) {
|
||||
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, null, getSharedText(this)));
|
||||
} else {
|
||||
Uri uri = uriList.isEmpty()? null : uriList.get(0);
|
||||
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, getSharedType(this), null, null, getSharedText(this)));
|
||||
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uriList.get(0), getSharedText(this)));
|
||||
}
|
||||
initializeDraft();
|
||||
}
|
||||
@@ -718,7 +718,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
if (draft == null) {
|
||||
if (TextUtils.isEmpty(sharedText)) {
|
||||
composeText.setText("");
|
||||
future.set(false);
|
||||
} else {
|
||||
composeText.setText(sharedText);
|
||||
@@ -732,8 +731,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
if(!text.isEmpty()) {
|
||||
composeText.setText(text);
|
||||
composeText.setSelection(composeText.getText().length());
|
||||
} else {
|
||||
composeText.setText("");
|
||||
}
|
||||
|
||||
DcMsg quote = draft.getQuotedMsg();
|
||||
@@ -870,6 +867,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
if(!backgroundImagePath.isEmpty()) {
|
||||
background = Drawable.createFromPath(backgroundImagePath);
|
||||
}
|
||||
else if(DynamicTheme.isDarkTheme(this)) {
|
||||
background = getResources().getDrawable(R.drawable.background_hd_dark);
|
||||
}
|
||||
else {
|
||||
background = getResources().getDrawable(R.drawable.background_hd);
|
||||
}
|
||||
@@ -993,14 +993,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
protected static final int ACTION_SEND_OUT = 1;
|
||||
protected static final int ACTION_SAVE_DRAFT = 2;
|
||||
|
||||
private String getSelfReaction(int msgId) {
|
||||
try {
|
||||
final String [] selfReactions = rpc.getMsgReactions(dcContext.getAccountId(), msgId).getReactionsByContact().get(DcContact.DC_CONTACT_ID_SELF);
|
||||
if (selfReactions != null && selfReactions.length > 0) return selfReactions[0];
|
||||
} catch(Exception e) { e.printStackTrace(); }
|
||||
return null;
|
||||
}
|
||||
|
||||
protected ListenableFuture<Integer> processComposeControls(int action) {
|
||||
return processComposeControls(action, composeText.getTextTrimmed(),
|
||||
attachmentManager.isAttachmentPresent() ?
|
||||
@@ -1058,18 +1050,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
else if (action == ACTION_SEND_OUT && quote.isPresent() && EmojiProvider.getInstance(this).maybeEmoji(body)){
|
||||
int quotedMsg = quote.get().getQuotedMsg().getId();
|
||||
try {
|
||||
rpc.sendReaction(dcContext.getAccountId(), quotedMsg, body.equals(getSelfReaction(quotedMsg))? "" : body);
|
||||
future.set(chatId);
|
||||
return future;
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setText(body);
|
||||
}
|
||||
}
|
||||
else if (!body.isEmpty()){
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setText(body);
|
||||
@@ -1448,8 +1428,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
} else if ((eventId == DcContext.DC_EVENT_INCOMING_MSG
|
||||
|| eventId == DcContext.DC_EVENT_MSG_READ)
|
||||
&& event.getData1Int() == chatId) {
|
||||
dcChat = dcContext.getChat(chatId);
|
||||
titleView.setTitle(glideRequests, dcChat);
|
||||
DcContact contact = recipient.getDcContact();
|
||||
titleView.setSeenRecently(contact!=null? dcContext.getContact(contact.getId()).wasSeenRecently() : false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -338,7 +338,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
menu.findItem(R.id.menu_context_share).setVisible(messageRecord.hasFile());
|
||||
boolean canReply = canReplyToMsg(messageRecord);
|
||||
menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply);
|
||||
boolean showReplyPrivately = !dcContext.isCommunity() && chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
|
||||
boolean showReplyPrivately = chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
|
||||
menu.findItem(R.id.menu_context_reply_privately).setVisible(showReplyPrivately);
|
||||
menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC);
|
||||
}
|
||||
@@ -363,22 +363,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
}
|
||||
|
||||
static boolean canReplyToMsg(DcMsg dcMsg) {
|
||||
boolean canReply = dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION;
|
||||
if (canReply && dcMsg.isInfo()) {
|
||||
switch (dcMsg.getInfoType()) {
|
||||
case DcMsg.DC_INFO_GROUP_NAME_CHANGED:
|
||||
case DcMsg.DC_INFO_GROUP_IMAGE_CHANGED:
|
||||
case DcMsg.DC_INFO_MEMBER_ADDED_TO_GROUP:
|
||||
case DcMsg.DC_INFO_MEMBER_REMOVED_FROM_GROUP:
|
||||
case DcMsg.DC_INFO_LOCATIONSTREAMING_ENABLED:
|
||||
case DcMsg.DC_INFO_EPHEMERAL_TIMER_CHANGED:
|
||||
case DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE:
|
||||
break;
|
||||
default:
|
||||
canReply = false;
|
||||
}
|
||||
}
|
||||
return canReply;
|
||||
return !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION;
|
||||
}
|
||||
|
||||
public void handleClearChat() {
|
||||
@@ -834,9 +819,6 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
list.getAdapter().notifyDataSetChanged();
|
||||
|
||||
actionMode = ((AppCompatActivity)getActivity()).startSupportActionMode(actionModeCallback);
|
||||
|
||||
if (dcContext.isCommunity()) return;
|
||||
|
||||
addReactionView.show(messageRecord, view, () -> {
|
||||
if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
|
||||
@@ -23,7 +23,7 @@ import android.graphics.Color;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
@@ -70,7 +70,6 @@ import org.thoughtcrime.securesms.mms.VcardSlide;
|
||||
import org.thoughtcrime.securesms.reactions.ReactionsConversationView;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
|
||||
import org.thoughtcrime.securesms.util.MarkdownUtil;
|
||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -181,7 +180,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
bind(messageRecord, dcChat, batchSelected, pulseHighlight, recipients);
|
||||
this.locale = locale;
|
||||
this.glideRequests = glideRequests;
|
||||
this.showSender = dcContext.isCommunity() || (dcChat.isMultiUser() && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
|
||||
this.showSender = (dcChat.isMultiUser() && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
|
||||
|
||||
if (showSender) {
|
||||
this.dcContact = dcContext.getContact(messageRecord.getFromId());
|
||||
@@ -401,7 +400,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
bodyText.setVisibility(View.GONE);
|
||||
}
|
||||
else {
|
||||
Spannable spannable = (Spannable) MarkdownUtil.toMarkdown(context, text);
|
||||
SpannableString spannable = new SpannableString(text);
|
||||
if (batchSelected.isEmpty()) {
|
||||
spannable = EmojiTextView.linkify(spannable);
|
||||
}
|
||||
@@ -433,10 +432,10 @@ public class ConversationItem extends BaseConversationItem
|
||||
} else if (messageRecord.getType() == DcMsg.DC_MSG_WEBXDC) {
|
||||
msgActionButton.setVisibility(View.VISIBLE);
|
||||
msgActionButton.setEnabled(true);
|
||||
msgActionButton.setText(webxdcViewStub.get().isCommunity()? R.string.join: R.string.start_app);
|
||||
msgActionButton.setText(R.string.start_app);
|
||||
msgActionButton.setOnClickListener(view -> {
|
||||
if (batchSelected.isEmpty()) {
|
||||
DcHelper.openWebxdc(getContext(), messageRecord);
|
||||
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord);
|
||||
} else {
|
||||
passthroughClickListener.onClick(view);
|
||||
}
|
||||
@@ -680,9 +679,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
if (!showSender || dcContact ==null) {
|
||||
contactPhoto.setVisibility(View.GONE);
|
||||
} else {
|
||||
int color = messageRecord.getSenderColor();
|
||||
Recipient recipient = new Recipient(context, dcContact, messageRecord.getSenderName(dcContact, !dcContext.isCommunity()), color);
|
||||
contactPhoto.setAvatar(glideRequests, recipient, true);
|
||||
contactPhoto.setAvatar(glideRequests, new Recipient(context, dcContact), true);
|
||||
contactPhoto.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
@@ -707,7 +704,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
Recipient author = null;
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
if (msg != null) {
|
||||
author = new Recipient(context, dcContext.getContact(msg.getFromId()), msg.getSenderColor());
|
||||
author = new Recipient(context, dcContext.getContact(msg.getFromId()));
|
||||
if (msg.getType() != DcMsg.DC_MSG_TEXT) {
|
||||
Slide slide = MediaUtil.getSlideForMsg(context, msg);
|
||||
if (slide != null) {
|
||||
@@ -814,8 +811,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
}
|
||||
else if (showSender && dcContact !=null) {
|
||||
this.groupSender.setText(messageRecord.getSenderName(dcContact, true));
|
||||
int color = messageRecord.getSenderColor();
|
||||
this.groupSender.setTextColor(Util.rgbToArgbColor(color!=0? color : dcContact.getColor()));
|
||||
this.groupSender.setTextColor(Util.rgbToArgbColor(dcContact.getColor()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -898,7 +894,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty()) {
|
||||
performClick();
|
||||
} else if (slide.isWebxdcDocument()) {
|
||||
msgActionButton.performClick();
|
||||
WebxdcActivity.openWebxdcActivity(context, messageRecord);
|
||||
} else if (slide.isVcard()) {
|
||||
try {
|
||||
String path = slide.asAttachment().getRealPath(context);
|
||||
|
||||
@@ -27,10 +27,8 @@ import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.resetRelayingMessageContent;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
@@ -47,7 +45,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.appcompat.widget.TooltipCompat;
|
||||
import androidx.core.view.MenuCompat;
|
||||
|
||||
import com.amulyakhare.textdrawable.TextDrawable;
|
||||
import com.b44t.messenger.DcAccounts;
|
||||
@@ -57,7 +54,7 @@ import com.b44t.messenger.DcMsg;
|
||||
import com.google.zxing.integration.android.IntentIntegrator;
|
||||
import com.google.zxing.integration.android.IntentResult;
|
||||
|
||||
import org.thoughtcrime.securesms.components.AvatarView;
|
||||
import org.thoughtcrime.securesms.components.AvatarImageView;
|
||||
import org.thoughtcrime.securesms.components.SearchToolbar;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
@@ -87,7 +84,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
private ConversationListFragment conversationListFragment;
|
||||
public TextView title;
|
||||
private AvatarView selfAvatar;
|
||||
private AvatarImageView selfAvatar;
|
||||
private ImageView unreadIndicator;
|
||||
private SearchFragment searchFragment;
|
||||
private SearchToolbar searchToolbar;
|
||||
@@ -107,8 +104,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
// it is not needed to keep all past update messages, however, when deleted, also the strings should be deleted.
|
||||
try {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final String deviceMsgId = "update_1_46_0l_android";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgId)) {
|
||||
final String deviceMsgLabel = "update_1_46_0l_android";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
|
||||
DcMsg msg = null;
|
||||
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
@@ -120,15 +117,15 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
msg.setText(getString(R.string.update_1_46_android, "https://get.delta.chat/#changelogs"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgId, msg);
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
if (Prefs.getStringPreference(this, Prefs.LAST_DEVICE_MSG_ID, "").equals(deviceMsgId)) {
|
||||
if (Prefs.getStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, "").equals(deviceMsgLabel)) {
|
||||
int deviceChatId = dcContext.getChatIdByContactId(DcContact.DC_CONTACT_ID_DEVICE);
|
||||
if (deviceChatId != 0) {
|
||||
dcContext.marknoticedChat(deviceChatId);
|
||||
}
|
||||
}
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_ID, deviceMsgId);
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
@@ -264,14 +261,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
}
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
} else {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
DcContact self = dcContext.getContact(DcContact.DC_CONTACT_ID_SELF);
|
||||
String name = dcContext.getConfig("displayname");
|
||||
if (TextUtils.isEmpty(name)) {
|
||||
name = self.getAddr();
|
||||
}
|
||||
title.setText(name);
|
||||
selfAvatar.setConnectivity(DcHelper.getContext(this).getConnectivity());
|
||||
title.setText(DcHelper.getConnectivitySummary(this, R.string.app_name));
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||
}
|
||||
}
|
||||
@@ -304,23 +294,14 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
if(unreadCount == 0) {
|
||||
unreadIndicator.setVisibility(View.GONE);
|
||||
} else {
|
||||
boolean isDarkTheme = DynamicTheme.isDarkTheme(this);
|
||||
int badgeColor = Color.WHITE;
|
||||
if (isDarkTheme) {
|
||||
final TypedArray attrs = obtainStyledAttributes(new int[] {
|
||||
R.attr.conversation_list_item_unreadcount_color,
|
||||
});
|
||||
badgeColor = attrs.getColor(0, Color.BLACK);
|
||||
}
|
||||
String label = unreadCount>99? "99+" : String.valueOf(unreadCount);
|
||||
unreadIndicator.setImageDrawable(TextDrawable.builder()
|
||||
.beginConfig()
|
||||
.width(ViewUtil.dpToPx(this, 20))
|
||||
.height(ViewUtil.dpToPx(this, 20))
|
||||
.textColor(isDarkTheme? Color.WHITE : Color.BLACK)
|
||||
.width(ViewUtil.dpToPx(this, 24))
|
||||
.height(ViewUtil.dpToPx(this, 24))
|
||||
.textColor(Color.WHITE)
|
||||
.bold()
|
||||
.endConfig()
|
||||
.buildRound(label, badgeColor));
|
||||
.buildRound(String.valueOf(unreadCount), getResources().getColor(R.color.unread_count)));
|
||||
unreadIndicator.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
@@ -328,7 +309,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
refreshTitle();
|
||||
DirectShareUtil.triggerRefreshDirectShare(this);
|
||||
}
|
||||
|
||||
@@ -347,12 +327,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
if (!Prefs.isLocationStreamingEnabled(this)) {
|
||||
menu.findItem(R.id.menu_global_map).setVisible(false);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
MenuCompat.setGroupDividerEnabled(menu, true);
|
||||
} else{
|
||||
menu.setGroupVisible(R.id.extra_services, false);
|
||||
}
|
||||
}
|
||||
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
@@ -403,6 +377,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case R.id.menu_new_chat:
|
||||
createChat();
|
||||
return true;
|
||||
case R.id.menu_settings:
|
||||
startActivity(new Intent(this, ApplicationPreferencesActivity.class));
|
||||
return true;
|
||||
@@ -421,12 +398,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
case R.id.menu_all_media:
|
||||
startActivity(new Intent(this, ProfileActivity.class));
|
||||
return true;
|
||||
case R.id.menu_webxdc_apps_store:
|
||||
handleShowBot("xstore@testrun.org", "OPENPGP4FPR:37DC2B704A2AE2F6A96235CE0C3A0EBCA4F5801D#a=xstore%40testrun.org&n=&i=-1IGtynaivZ&s=JqHsvvcDmnW");
|
||||
return true;
|
||||
case R.id.menu_public_bots:
|
||||
handleShowBot("publicbots@testrun.org", "OPENPGP4FPR:4DB8117591B27184A903FF7E9F469E00D40E13E7#a=publicbots%40testrun.org&n=Public%20Bots&i=zSuQpFtBa_Q&s=weLMu1-o1o1");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -455,21 +426,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
private void handleShowBot(String addr, String qrdata) {
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
int contactId = dcContext.lookupContactIdByAddr(addr);
|
||||
int chatId = 0;
|
||||
if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) {
|
||||
chatId = dcContext.createChatByContactId(contactId);
|
||||
}
|
||||
if (chatId != 0 && dcContext.getChat(chatId).isProtected()) {
|
||||
openConversation(chatId, -1);
|
||||
} else {
|
||||
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
|
||||
qrCodeHandler.handleQrData(qrdata);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateConversation(int chatId) {
|
||||
openConversation(chatId, -1);
|
||||
|
||||
@@ -42,7 +42,6 @@ import com.b44t.messenger.DcMsg;
|
||||
import org.thoughtcrime.securesms.ConversationListAdapter.ItemClickListener;
|
||||
import org.thoughtcrime.securesms.components.recyclerview.DeleteItemAnimator;
|
||||
import org.thoughtcrime.securesms.components.reminder.DozeReminder;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
@@ -114,9 +113,7 @@ public class ConversationListFragment extends BaseConversationListFragment
|
||||
if (archive) {
|
||||
fab.setVisibility(View.GONE);
|
||||
TextView emptyTitle = ViewUtil.findById(view, R.id.empty_title);
|
||||
TextView emptySubtitle = ViewUtil.findById(view, R.id.empty_subtitle);
|
||||
emptyTitle.setText(R.string.archive_empty_hint);
|
||||
emptySubtitle.setVisibility(View.GONE);
|
||||
} else {
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@@ -167,12 +167,10 @@ public class ConversationListItem extends RelativeLayout
|
||||
DcContact contact = recipient.getDcContact();
|
||||
avatar.setSeenRecently(contact!=null? contact.wasSeenRecently() : false);
|
||||
|
||||
boolean isProtected = thread.isProtected() || DcHelper.getContext(getContext()).getChat((int)chatId).isDeviceTalk();
|
||||
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
thread.isMuted()? R.drawable.ic_volume_off_grey600_18dp : 0,
|
||||
0,
|
||||
isProtected? R.drawable.ic_verified : 0,
|
||||
thread.isProtected()? R.drawable.ic_verified : 0,
|
||||
0);
|
||||
}
|
||||
|
||||
@@ -186,7 +184,7 @@ public class ConversationListItem extends RelativeLayout
|
||||
this.glideRequests = glideRequests;
|
||||
|
||||
fromView.setText(getHighlightedSpan(locale, contact.getDisplayName(), highlightSubstring));
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, contact.isVerified()? R.drawable.ic_verified : 0, 0);
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
subjectView.setText(getHighlightedSpan(locale, contact.getAddr(), highlightSubstring));
|
||||
dateView.setText("");
|
||||
dateView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
@@ -290,15 +288,7 @@ public class ConversationListItem extends RelativeLayout
|
||||
if(unreadCount==0 || isContactRequest) {
|
||||
unreadIndicator.setVisibility(View.GONE);
|
||||
} else {
|
||||
final int color;
|
||||
if(isMuted){
|
||||
color = getResources().getColor(ThemeUtil.isDarkTheme(getContext()) ? R.color.unread_count_muted_dark : R.color.unread_count_muted);
|
||||
} else {
|
||||
final TypedArray attrs = getContext().obtainStyledAttributes(new int[] {
|
||||
R.attr.conversation_list_item_unreadcount_color,
|
||||
});
|
||||
color = attrs.getColor(0, Color.BLACK);
|
||||
}
|
||||
final int color = getResources().getColor(isMuted ? (ThemeUtil.isDarkTheme(getContext()) ? R.color.unread_count_muted_dark : R.color.unread_count_muted) : R.color.unread_count);
|
||||
unreadIndicator.setImageDrawable(TextDrawable.builder()
|
||||
.beginConfig()
|
||||
.width(ViewUtil.dpToPx(getContext(), 24))
|
||||
|
||||
@@ -19,12 +19,8 @@ import org.thoughtcrime.securesms.components.AvatarView;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
import org.thoughtcrime.securesms.util.DynamicLanguage;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class ConversationTitleView extends RelativeLayout {
|
||||
|
||||
private View content;
|
||||
@@ -78,20 +74,17 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
if (dcChat.isMuted()) {
|
||||
imgLeft = R.drawable.ic_volume_off_white_18dp;
|
||||
}
|
||||
if (dcChat.isProtected() || dcChat.isDeviceTalk()) {
|
||||
if (dcChat.isProtected()) {
|
||||
imgRight = R.drawable.ic_verified;
|
||||
}
|
||||
|
||||
boolean isOnline = false;
|
||||
int[] chatContacts = dcContext.getChatContacts(chatId);
|
||||
if (dcChat.isMailingList()) {
|
||||
subtitleStr = dcChat.getMailinglistAddr();
|
||||
if (!profileView) {
|
||||
if (TextUtils.isEmpty(subtitleStr)) {
|
||||
subtitleStr = context.getString(R.string.channel);
|
||||
} else {
|
||||
subtitleStr = context.getString(R.string.super_group);
|
||||
}
|
||||
if (profileView) {
|
||||
subtitleStr = dcChat.getMailinglistAddr();
|
||||
} else {
|
||||
subtitleStr = context.getString(R.string.mailing_list);
|
||||
}
|
||||
} else if (dcChat.isBroadcast()) {
|
||||
if (!profileView) {
|
||||
@@ -99,10 +92,7 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
}
|
||||
} else if( dcChat.isMultiUser() ) {
|
||||
if (!profileView) {
|
||||
if (dcContext.isCommunity() && chatContacts.length == 1)
|
||||
subtitleStr = context.getString(R.string.super_group);
|
||||
else
|
||||
subtitleStr = context.getResources().getQuantityString(R.plurals.n_members, chatContacts.length, chatContacts.length);
|
||||
subtitleStr = context.getResources().getQuantityString(R.plurals.n_members, chatContacts.length, chatContacts.length);
|
||||
}
|
||||
} else if( chatContacts.length>=1 ) {
|
||||
if( dcChat.isSelfTalk() ) {
|
||||
@@ -113,22 +103,10 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
}
|
||||
else {
|
||||
DcContact dcContact = dcContext.getContact(chatContacts[0]);
|
||||
isOnline = dcContact.wasSeenRecently();
|
||||
if (profileView) {
|
||||
if (profileView || !dcChat.isProtected()) {
|
||||
subtitleStr = dcContact.getAddr();
|
||||
} else if (dcContact.isBot()) {
|
||||
subtitleStr = context.getString(R.string.bot);
|
||||
} else if (isOnline) {
|
||||
subtitleStr = context.getString(R.string.online);
|
||||
} else {
|
||||
long timestamp = dcContact.getLastSeen();
|
||||
if (timestamp == 0) {
|
||||
subtitleStr = dcContact.getAddr();
|
||||
} else {
|
||||
Locale locale = DynamicLanguage.getSelectedLocale(context);
|
||||
subtitleStr = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, locale, timestamp));
|
||||
}
|
||||
}
|
||||
isOnline = dcContact.wasSeenRecently();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
@@ -26,11 +25,9 @@ import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
import com.bumptech.glide.request.target.SimpleTarget;
|
||||
import com.bumptech.glide.request.transition.Transition;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.soundcloud.android.crop.Crop;
|
||||
|
||||
import org.thoughtcrime.securesms.components.AvatarSelector;
|
||||
@@ -65,7 +62,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
|
||||
private InputAwareLayout container;
|
||||
private ImageView avatar;
|
||||
private EditText name;
|
||||
private EditText overridenName;
|
||||
private MediaKeyboard emojiDrawer;
|
||||
private EditText statusView;
|
||||
|
||||
@@ -205,28 +201,16 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
|
||||
TextView loginSuccessText = ViewUtil.findById(this, R.id.login_success_text);
|
||||
this.avatar = ViewUtil.findById(this, R.id.avatar);
|
||||
this.name = ViewUtil.findById(this, R.id.name_text);
|
||||
this.overridenName = ViewUtil.findById(this, R.id.overriden_name);
|
||||
this.emojiDrawer = ViewUtil.findById(this, R.id.emoji_drawer);
|
||||
this.container = ViewUtil.findById(this, R.id.container);
|
||||
this.statusView = ViewUtil.findById(this, R.id.status_text);
|
||||
|
||||
if (fromWelcome) {
|
||||
if (DcHelper.getContext(this).isCommunity()) {
|
||||
ViewUtil.findById(this, R.id.community_user_container).setVisibility(View.VISIBLE);
|
||||
loginSuccessText.setText(R.string.community_set_name_explain);
|
||||
ViewUtil.findById(this, R.id.avatar_and_name).setVisibility(View.GONE);
|
||||
} else {
|
||||
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
|
||||
}
|
||||
String addr = DcHelper.get(this, "addr");
|
||||
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
|
||||
ViewUtil.findById(this, R.id.status_text_layout).setVisibility(View.GONE);
|
||||
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
|
||||
} else {
|
||||
if (DcHelper.getContext(this).isCommunity()) {
|
||||
ViewUtil.findById(this, R.id.community_user_container).setVisibility(View.VISIBLE);
|
||||
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
|
||||
((TextInputLayout)ViewUtil.findById(this, R.id.name)).setHint(R.string.community);
|
||||
((TextInputLayout)ViewUtil.findById(this, R.id.status_text_layout)).setHint(R.string.description);
|
||||
}
|
||||
loginSuccessText.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
@@ -237,10 +221,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
|
||||
name.setText(profileName);
|
||||
name.setSelection(profileName.length(), profileName.length());
|
||||
}
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
if (dcContext.isCommunity()) {
|
||||
overridenName.setText(dcContext.getCommunityUser());
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeProfileAvatar() {
|
||||
@@ -294,22 +274,16 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
|
||||
}
|
||||
|
||||
private void updateProfile() {
|
||||
boolean isCommunity = DcHelper.getContext(this).isCommunity();
|
||||
if (TextUtils.isEmpty(this.name.getText()) && !(isCommunity && fromWelcome)) {
|
||||
if (TextUtils.isEmpty(this.name.getText())) {
|
||||
Toast.makeText(this, R.string.please_enter_name, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
final String name = this.name.getText().toString();
|
||||
final String ovName = this.overridenName.getText().toString().trim();
|
||||
|
||||
new AsyncTask<Void, Void, Boolean>() {
|
||||
@Override
|
||||
protected Boolean doInBackground(Void... params) {
|
||||
Context context = CreateProfileActivity.this;
|
||||
if (isCommunity) {
|
||||
DcHelper.getContext(context).setCommunityUser(ovName);
|
||||
}
|
||||
DcHelper.set(context, DcHelper.CONFIG_DISPLAY_NAME, name);
|
||||
setStatusText();
|
||||
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
import android.webkit.WebResourceResponse;
|
||||
import android.webkit.WebSettings;
|
||||
import android.webkit.WebView;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
@@ -28,7 +24,6 @@ public class FullMsgActivity extends WebViewActivity
|
||||
{
|
||||
public static final String MSG_ID_EXTRA = "msg_id";
|
||||
public static final String BLOCK_LOADING_REMOTE = "block_loading_remote";
|
||||
private String imageUrl;
|
||||
private int msgId;
|
||||
private DcContext dcContext;
|
||||
private Rpc rpc;
|
||||
@@ -51,7 +46,6 @@ public class FullMsgActivity extends WebViewActivity
|
||||
protected void onCreate(Bundle state, boolean ready) {
|
||||
super.onCreate(state, ready);
|
||||
|
||||
registerForContextMenu(webView);
|
||||
blockLoadingRemote = getIntent().getBooleanExtra(BLOCK_LOADING_REMOTE, false);
|
||||
loadRemoteContent = !blockLoadingRemote && Prefs.getAlwaysLoadRemoteContent(this);
|
||||
webView.getSettings().setBlockNetworkLoads(!loadRemoteContent);
|
||||
@@ -83,41 +77,6 @@ public class FullMsgActivity extends WebViewActivity
|
||||
loadHtmlAsync(new WeakReference<>(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
|
||||
if (v instanceof WebView) {
|
||||
WebView.HitTestResult result = ((WebView) v).getHitTestResult();
|
||||
if (result != null) {
|
||||
int type = result.getType();
|
||||
if (type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
|
||||
imageUrl = result.getExtra();
|
||||
if (!imageUrl.startsWith("data:")) {
|
||||
super.onCreateContextMenu(menu, v, menuInfo);
|
||||
this.getMenuInflater().inflate(R.menu.web_view_context, menu);
|
||||
menu.setHeaderIcon(android.R.drawable.ic_menu_gallery);
|
||||
menu.setHeaderTitle(imageUrl);
|
||||
menu.findItem(R.id.action_export_image).setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_export_image:
|
||||
// TODO: extract image from "data:" link or download URL
|
||||
return true;
|
||||
case R.id.action_copy_link:
|
||||
Util.writeTextToClipboard(this, imageUrl);
|
||||
Toast.makeText(this, getString(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
default:
|
||||
return super.onContextItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
private static void loadHtmlAsync(final WeakReference<FullMsgActivity> activityReference) {
|
||||
Util.runOnBackground(() -> {
|
||||
try {
|
||||
|
||||
@@ -17,7 +17,6 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
@@ -221,22 +220,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
updateGroup(groupName);
|
||||
} else {
|
||||
verified = !broadcast && allMembersVerified();
|
||||
if (verified && getAdapter().getContacts().size() == 1) {
|
||||
new AlertDialog.Builder(this)
|
||||
.setMessage(R.string.create_verified_group_ask)
|
||||
.setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(this, "#e2eeguarantee"))
|
||||
.setPositiveButton(R.string.yes, (d, w) -> {
|
||||
createGroup(groupName);
|
||||
})
|
||||
.setNegativeButton(R.string.no, (d, w) -> {
|
||||
verified = false;
|
||||
createGroup(groupName);
|
||||
})
|
||||
.setCancelable(true)
|
||||
.show();
|
||||
} else {
|
||||
createGroup(groupName);
|
||||
}
|
||||
createGroup(groupName);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -50,6 +50,7 @@ import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
|
||||
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
|
||||
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.views.ProgressDialog;
|
||||
|
||||
import java.io.File;
|
||||
@@ -329,7 +330,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
privacyPolicyBtn.setText(getString(R.string.qrlogin_ask_login, providerHost));
|
||||
} else {
|
||||
signUpBtn.setText(R.string.instant_onboarding_create);
|
||||
privacyPolicyBtn.setTextColor(getResources().getColor(R.color.def_accent));
|
||||
privacyPolicyBtn.setTextColor(getResources().getColor(R.color.delta_accent));
|
||||
if (DEFAULT_CHATMAIL_HOST.equals(providerHost)) {
|
||||
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_default2, providerHost));
|
||||
} else {
|
||||
@@ -372,6 +373,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
progressUpdate((int)progress);
|
||||
} else if (progress==1000/*done*/) {
|
||||
DcHelper.getAccounts(this).startIo();
|
||||
dcContext.assumeSingleDevice();
|
||||
progressSuccess();
|
||||
}
|
||||
}
|
||||
@@ -394,7 +396,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
finishAffinity();
|
||||
}
|
||||
|
||||
public static void maybeShowConfigurationError(Activity activity, String data2) {
|
||||
@@ -472,12 +474,16 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
DcHelper.getEventCenter(this).captureNextError();
|
||||
|
||||
if (!dcContext.setConfigFromQr(qrCode)) {
|
||||
progressError(dcContext.getLastError());
|
||||
return;
|
||||
}
|
||||
DcHelper.getAccounts(this).stopIo();
|
||||
dcContext.configure();
|
||||
new Thread(() -> {
|
||||
if (!dcContext.setConfigFromQr(qrCode)) {
|
||||
Util.runOnMain(() -> {
|
||||
progressError(dcContext.getLastError());
|
||||
});
|
||||
return;
|
||||
}
|
||||
DcHelper.getAccounts(this).stopIo();
|
||||
dcContext.configure();
|
||||
}).start();
|
||||
}
|
||||
|
||||
private class AvatarSelectedListener implements AvatarSelector.AttachmentClickedListener {
|
||||
|
||||
@@ -127,21 +127,27 @@ public class LogViewFragment extends Fragment {
|
||||
return logFile;
|
||||
}
|
||||
|
||||
private static String grabLogcat() {
|
||||
private static String grabLogcat(LogViewFragment fragment) {
|
||||
try {
|
||||
final Process process = Runtime.getRuntime().exec("logcat -v threadtime -d -t 1000");
|
||||
final Process process = Runtime.getRuntime().exec("logcat -v threadtime -d");
|
||||
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
final StringBuilder log = new StringBuilder();
|
||||
final String separator = System.getProperty("line.separator");
|
||||
final boolean devMode = Prefs.isDeveloperModeEnabled(fragment.getActivity());
|
||||
|
||||
String line;
|
||||
while ((line = bufferedReader.readLine()) != null) {
|
||||
line = line.replaceFirst(" (\\d+) E ", " $1 \uD83D\uDD34 ");
|
||||
line = line.replaceFirst(" (\\d+) W ", " $1 \uD83D\uDFE0 ");
|
||||
line = line.replaceFirst(" (\\d+) I ", " $1 \uD83D\uDD35 ");
|
||||
line = line.replaceFirst(" (\\d+) D ", " $1 \uD83D\uDFE2 ");
|
||||
log.append(line);
|
||||
log.append(separator);
|
||||
String debugLine = line.replaceFirst(" (\\d+) D ", " $1 \uD83D\uDFE2 ");
|
||||
if (debugLine.equals(line)) { // not a debug entry
|
||||
log.append(line);
|
||||
log.append(separator);
|
||||
} else if (devMode) {
|
||||
log.append(debugLine);
|
||||
log.append(separator);
|
||||
}
|
||||
}
|
||||
return log.toString();
|
||||
} catch (Exception e) {
|
||||
@@ -162,7 +168,7 @@ public class LogViewFragment extends Fragment {
|
||||
if (fragment == null) return null;
|
||||
|
||||
return "**This log may contain sensitive information. If you want to post it publicly you may examine and edit it beforehand.**\n\n" +
|
||||
buildDescription(fragment) + "\n" + grabLogcat();
|
||||
buildDescription(fragment) + "\n" + grabLogcat(fragment);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -104,6 +104,7 @@ public abstract class MessageSelectorFragment
|
||||
}
|
||||
SaveAttachmentTask saveTask = new SaveAttachmentTask(getContext());
|
||||
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, attachments);
|
||||
if (actionMode != null) actionMode.finish();
|
||||
}
|
||||
|
||||
protected void handleShowInChat(final DcMsg dcMsg) {
|
||||
|
||||
@@ -81,11 +81,6 @@ public class NewConversationActivity extends ContactSelectionActivity {
|
||||
startActivity(shareIntent);
|
||||
finish();
|
||||
}
|
||||
} else if(scheme != null && scheme.startsWith("http")) {
|
||||
Intent shareIntent = new Intent(this, ShareActivity.class);
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, uri.toString());
|
||||
startActivity(shareIntent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,12 @@ import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import androidx.loader.content.Loader;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
@@ -15,13 +21,6 @@ import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import androidx.loader.content.Loader;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
@@ -180,7 +179,7 @@ public class ProfileDocumentsFragment
|
||||
}
|
||||
|
||||
if (dcMsg.getType() == DcMsg.DC_MSG_WEBXDC) {
|
||||
DcHelper.openWebxdc(context, dcMsg);
|
||||
WebxdcActivity.openWebxdcActivity(context, dcMsg);
|
||||
} else {
|
||||
DcHelper.openForViewOrShare(getActivity(), dcMsg.getId(), Intent.ACTION_VIEW);
|
||||
}
|
||||
|
||||
@@ -334,7 +334,7 @@ public class ProfileSettingsAdapter extends RecyclerView.Adapter
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_LAST_SEEN, lastSeenTxt, 0, 0));
|
||||
|
||||
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_SEND_MESSAGE_BUTTON, context.getString(R.string.send_message), R.color.def_accent, 0));
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_SEND_MESSAGE_BUTTON, context.getString(R.string.send_message), R.color.delta_accent, 0));
|
||||
}
|
||||
|
||||
itemDataStatusText = dcContact.getStatus();
|
||||
|
||||