Compare commits
222 Commits
rename-app
...
v1.46.20
| Author | SHA1 | Date | |
|---|---|---|---|
| 5627f5f123 | |||
| 7a66085107 | |||
| aa45a9082e | |||
| 3955f4d505 | |||
| 74dd4c0d9a | |||
| 23eb418591 | |||
| edcfa80d92 | |||
| 5ff1f3d915 | |||
| b0ae2da439 | |||
| 8487c286e6 | |||
| ffa9177094 | |||
| 6f3d8a4414 | |||
| 9bbee2db10 | |||
| 30580366fd | |||
| ec4bffdabe | |||
| ca2d8f4b6e | |||
| a7f0f753fd | |||
| 4025fd5e0b | |||
| 577959a51a | |||
| 776dc05755 | |||
| 28141bf942 | |||
| 3431163c24 | |||
| 45cb3a953c | |||
| 3080313568 | |||
| f13251bc07 | |||
| 6a7c498481 | |||
| b72a1ec7d8 | |||
| 5fd06f2b9d | |||
| 899b075349 | |||
| 1c0dc91f03 | |||
| a76762f321 | |||
| 86ebb6e1a8 | |||
| ecf87c58e1 | |||
| 0bef0b3501 | |||
| bc6d676fcd | |||
| 8aa615157a | |||
| 9ffa76c0f4 | |||
| 9fc4bfb970 | |||
| 1bc40837fe | |||
| ba3ea172e5 | |||
| 3a4c02c8cd | |||
| 4b9d521c13 | |||
| df9e3007b2 | |||
| 117f144858 | |||
| e17d37ebb7 | |||
| 08200d8443 | |||
| 9809e3edd6 | |||
| 2255c267ef | |||
| 4a83f4005a | |||
| 8ea78b1930 | |||
| 9d4b5e8fed | |||
| ca74afb229 | |||
| 1757c417fa | |||
| 4e6119b85d | |||
| 91467e5c65 | |||
| 2870ad988f | |||
| a35da9ac7c | |||
| e4543be71c | |||
| b1e4d4dbe5 | |||
| e6f9eda787 | |||
| 12b5f0767c | |||
| 0bd2c2f825 | |||
| 5c9afb910d | |||
| e41e3374e8 | |||
| 0be6457cd1 | |||
| f3fa1d5e7c | |||
| 5f2b4590c0 | |||
| be4bc8259e | |||
| 529842ad60 | |||
| 78bd221fdf | |||
| 054902eb67 | |||
| ef578da78d | |||
| 884cce3e1a | |||
| fc6bdc2fea | |||
| e441a582dd | |||
| 3e3a01dd62 | |||
| 1cda594e02 | |||
| 357e6de031 | |||
| 30ac01a57e | |||
| de5d45d04d | |||
| c599fc8e79 | |||
| 295e1b50d2 | |||
| ef8838cbe3 | |||
| eed124a0f2 | |||
| 18974ff023 | |||
| e666bbf610 | |||
| 0330485123 | |||
| 56717d3f44 | |||
| 958bdddacf | |||
| 6375b85ef9 | |||
| e076691f2a | |||
| 4635cbbe4f | |||
| 71311d43e8 | |||
| 6efe540310 | |||
| 1843c29b7c | |||
| 653d940242 | |||
| 2f3a730be7 | |||
| 7a2401a3d5 | |||
| 6690add48f | |||
| ace1c99daa | |||
| 125ac5e7b3 | |||
| b3248c9f6d | |||
| 00d1803631 | |||
| 0482889dfa | |||
| 6113195977 | |||
| 4a02d6c73d | |||
| a252eec698 | |||
| b89e094f9f | |||
| 6fa725e8ff | |||
| efb38db3ef | |||
| 8ef136d6b2 | |||
| 3412dc8a0f | |||
| 6cb1c0fad4 | |||
| bfb1fc0281 | |||
| bc511d6100 | |||
| 1ae69feb80 | |||
| 19fac45062 | |||
| 8c7d1da9d9 | |||
| 2376777bba | |||
| 21d6c3c3b8 | |||
| a3976846f6 | |||
| f9d21b75ee | |||
| fd8311cfc9 | |||
| 54f487b33d | |||
| 973e278d71 | |||
| ed7f3db2a4 | |||
| 2ce614dc55 | |||
| 8a044221b1 | |||
| e9317ab641 | |||
| a278121498 | |||
| c060810a82 | |||
| 95f09a67f5 | |||
| 78ad04bd7b | |||
| b4c15ad45f | |||
| 744414baeb | |||
| cda7bcb247 | |||
| 24e8fc7d25 | |||
| 59435e8975 | |||
| bc94eba1da | |||
| 088494ea86 | |||
| 4c4c2e248c | |||
| 60588ab8e4 | |||
| 228a5cf4f7 | |||
| 7075fb39e1 | |||
| da15be4739 | |||
| 6427e62ed9 | |||
| 1eb733e80f | |||
| 130cdfe838 | |||
| fadcb51d7c | |||
| cea5b6ec84 | |||
| 6c9d1592f8 | |||
| 56b925f600 | |||
| 5a5ea83fa0 | |||
| 3033000e4e | |||
| 9f8da69b25 | |||
| aa52f8172d | |||
| 82ddcd0839 | |||
| 8d99b36347 | |||
| 589fa8e3dd | |||
| 434b40e51e | |||
| 755c346d82 | |||
| b13defdf9c | |||
| fbe533c701 | |||
| 13ebad4942 | |||
| f9539c160e | |||
| 0195f2f78f | |||
| 64553b5655 | |||
| ce38181502 | |||
| 4c58f31dc6 | |||
| e5a2bde5c4 | |||
| d984bf15a0 | |||
| ab2904e274 | |||
| c751d7015c | |||
| eef3be840b | |||
| fed96377f5 | |||
| 774bee1e28 | |||
| c0b3d87ff9 | |||
| e72eed807f | |||
| cd1821f6a7 | |||
| e79f4ef84e | |||
| 8071f64669 | |||
| fd2d3a5b5a | |||
| 2e500ce97b | |||
| 997d03829e | |||
| 67d6a2aed3 | |||
| 884481fa9e | |||
| 4c90890643 | |||
| 1209ec02f9 | |||
| 63e4b25cbf | |||
| acdde4c0a0 | |||
| a9fba59386 | |||
| 4ef7fc0401 | |||
| 148f07729c | |||
| 529f46f226 | |||
| 7ad8a48255 | |||
| 3d7d3157fc | |||
| 6b34438958 | |||
| 31bc04d190 | |||
| c1c2aa4930 | |||
| 78a9bd98b0 | |||
| c058eb2927 | |||
| 6180397f8f | |||
| b4bb2e2b5d | |||
| e717837e6c | |||
| b7ae41b249 | |||
| 270e31fc58 | |||
| 5900b340e4 | |||
| 066d794360 | |||
| c9d9d915a1 | |||
| d397f7f16e | |||
| d1d379b9b1 | |||
| a4abc0181b | |||
| 7c762bbb6c | |||
| 0d3e009500 | |||
| d16d58b77a | |||
| f4bbb61313 | |||
| a38a29167e | |||
| cf954d0970 | |||
| 7ded91d8af | |||
| 27d7e3b27d | |||
| 669e21b6f1 | |||
| b7e4dda6f5 |
@@ -48,7 +48,7 @@ jobs:
|
||||
uses: gradle/wrapper-validation-action@v1
|
||||
|
||||
- name: Build APK
|
||||
run: ./gradlew --no-daemon assembleFossDebug
|
||||
run: ./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
|
||||
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v3
|
||||
|
||||
@@ -54,13 +54,16 @@ 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 assembleFossRelease
|
||||
./gradlew assembleFossRelease
|
||||
rm build/outputs/apk/foss/release/*universal*
|
||||
./gradlew assembleGplayRelease
|
||||
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
|
||||
|
||||
- name: Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
body: "Auto-generated release"
|
||||
body: '[<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-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/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
||||
prerelease: ${{ contains(github.event.ref, '-beta') }}
|
||||
fail_on_unmatched_files: true
|
||||
files: build/outputs/apk/foss/release/*.apk
|
||||
|
||||
@@ -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/ArcaneChat/core
|
||||
|
||||
@@ -1,4 +1,47 @@
|
||||
# Delta Chat Android Changelog
|
||||
# ArcaneChat Android Changelog
|
||||
|
||||
## v1.46.15
|
||||
2024-09
|
||||
|
||||
* new proxy settings screen available at "Advanced / Proxy"
|
||||
* manage a list of HTTP(S), SOCKS5 or Shadowsocks proxies
|
||||
* proxies icon shown on the chatlist if proxies are used
|
||||
* improve profile deletion dialog: show name, size and avatar of the profile being deleted
|
||||
* improve notification: allow to "Mark Read" from the notification
|
||||
* automatic reconfiguration, e.g. switching to implicit TLS if STARTTLS port stops working
|
||||
* parallelize IMAP and SMTP connection attempts
|
||||
* always use preloaded DNS results
|
||||
* always move auto-generated messages to DeltaChat folder
|
||||
* ignore invalid securejoin messages silently
|
||||
* delete messages from a chatmail server immediately by default
|
||||
* make resending pending messages possible
|
||||
* don't SMTP-send messages to self-chat if BccSelf is disabled
|
||||
* HTTP(S) tunneling
|
||||
* don't put displayname into From/To/Sender if it equals to address
|
||||
* hide sync messages from INBOX (use IMAP APPEND command to upload sync messages)
|
||||
* more verbose SMTP connection establishment errors
|
||||
* log unexpected message state when resending fails
|
||||
* fix: avoid app being killed when processing a PUSH notification
|
||||
* fix crash when refreshing avatar
|
||||
* fix crash in gallery
|
||||
* fix: shorten message text in locally sent messages too
|
||||
* fix: Set http I/O timeout to 1 minute rather than whole request timeout
|
||||
* fix: don't sync QR code token before populating the group
|
||||
* update to core 1.145.0
|
||||
|
||||
|
||||
## v1.46.14
|
||||
2024-09
|
||||
|
||||
* add monochrome/themed launcher icon support
|
||||
* allow to remove the selected profile in "Switch Profile" dialog
|
||||
* improve display of selected profile in "Switch Profile" dialog
|
||||
* improve the hit/tap area to open "Switch Profile" dialog in the main screen's toolbar
|
||||
* add support for system per-app language and remove in-app language selector
|
||||
* remove the experimental "encrypt database" checkbox in classic registration screen
|
||||
* fix various bugs
|
||||
* update to core 1.142.12
|
||||
|
||||
|
||||
## v1.46.13
|
||||
2024-08
|
||||
|
||||
@@ -2,15 +2,10 @@
|
||||
|
||||
A [Delta Chat](https://delta.chat/) client for Android.
|
||||
|
||||
[<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/deltalab-org/deltalab-android/releases/latest)
|
||||
[<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite)
|
||||
[<img src="store/get-it-on-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/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)
|
||||
|
||||
|
||||
<img alt="Screenshot" src="fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" width="298" /> <img alt="Screenshot" src="fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" width="298" />
|
||||
@@ -37,4 +32,4 @@ This app has some extended support for WebXDC apps:
|
||||
|
||||
This app is based on the [official Delta Chat client](https://github.com/deltachat/deltachat-android) with several improvements.
|
||||
|
||||
This app uses a [modified](https://github.com/deltalab-org/deltalab-core) version of the [Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
|
||||
This app uses a [modified](https://github.com/ArcaneChat/core) version of the [Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
|
||||
|
||||
@@ -33,8 +33,8 @@ android {
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
|
||||
defaultConfig {
|
||||
versionCode 30000685
|
||||
versionName "1.46.13"
|
||||
versionCode 30000692
|
||||
versionName "1.46.20"
|
||||
|
||||
applicationId "chat.delta.lite"
|
||||
multiDexEnabled true
|
||||
@@ -50,7 +50,11 @@ android {
|
||||
buildConfigField "boolean", "DEV_BUILD", "false"
|
||||
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
|
||||
if(project.hasProperty("ABI_FILTER")) {
|
||||
abiFilters ABI_FILTER
|
||||
} else {
|
||||
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +71,7 @@ android {
|
||||
}
|
||||
packagingOptions {
|
||||
jniLibs {
|
||||
doNotStrip '**/*.so'
|
||||
keepDebugSymbols += ['*/mips/*.so', '*/mips64/*.so']
|
||||
}
|
||||
resources {
|
||||
@@ -126,12 +131,32 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
if(!project.hasProperty("ABI_FILTER")) {
|
||||
splits {
|
||||
abi {
|
||||
enable true
|
||||
reset()
|
||||
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
|
||||
universalApk true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
project.ext.versionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
|
||||
|
||||
android.applicationVariants.all { variant ->
|
||||
variant.outputs.all {
|
||||
outputFileName = outputFileName
|
||||
.replace("deltalab-android", "deltalab")
|
||||
variant.outputs.all { output ->
|
||||
output.outputFileName = output.outputFileName
|
||||
.replace("android", "ArcaneChat")
|
||||
.replace("-release", "")
|
||||
.replace(".apk", "-${variant.versionName}.apk")
|
||||
if(project.hasProperty("ABI_FILTER")) {
|
||||
output.versionCodeOverride =
|
||||
variant.versionCode * 10 + project.ext.versionCodes.get(ABI_FILTER)
|
||||
} else {
|
||||
output.versionCodeOverride =
|
||||
variant.versionCode * 10 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 4)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,21 @@
|
||||
<i>ArcaneChat</i> is a friendly fork of <i>Delta Chat</i> messenger, a chat app compatible with the existing e-mail infrastructure.
|
||||
ArcaneChat is a decentralized and secure messenger app that is
|
||||
completely compatible with the existing e-mail infrastructure.
|
||||
|
||||
ArcaneChat 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.
|
||||
Some features at a glance:
|
||||
|
||||
💬 Reliable instant messaging with multi-profile and multi-device support.
|
||||
|
||||
⚡️ Sign-up easily using secure fast chatmail servers. You don’t need a phone number or any private data.
|
||||
|
||||
📧 Alternatively, use your existing classic e-mail address to read your inbox as chats.
|
||||
|
||||
🎮 Interactive mini-apps in chats for gaming and collaboration.
|
||||
|
||||
🔒 Audited end-to-end encryption safe against network and server attacks.
|
||||
|
||||
ArcaneChat is a Delta Chat client and was created with a focus on usability,
|
||||
good user experience, and saving data plan. Also the app usually experiments with
|
||||
new features that eventually might get added to the official Delta Chat client.
|
||||
|
||||
<b>Main differences with official Delta Chat client:</b>
|
||||
|
||||
@@ -12,19 +27,14 @@ ArcaneChat was created with a focus on usability, good user experience, and savi
|
||||
<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>Verified icon is shown in the chat list for the "Device Messages" chat</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>Automatic download of messages limited to 640KB by default</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>For mini-apps developers: there are some differences in the WebXDC API, check https://github.com/ArcaneChat/android/#webxdc</li>
|
||||
<li>Better settings organization with additional "Privacy" section</li>
|
||||
</ul>
|
||||
|
||||
<b>WARNING:</b> Be careful when running WebXDC apps in ArcaneChat, 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.
|
||||
|
||||
@@ -1 +1 @@
|
||||
Encrypted chat over e-mail (Delta Chat client)
|
||||
⚡ Fast encrypted chats for the family 🎉
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:922391085500:android:92b4cf12669cc2083e2bb9",
|
||||
"android_client_info": {
|
||||
"package_name": "com.b44t.messenger"
|
||||
"package_name": "com.github.arcanechat"
|
||||
}
|
||||
},
|
||||
"oauth_client": [],
|
||||
@@ -85,7 +85,7 @@
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:922391085500:android:228a205b8aa2bacc3e2bb9",
|
||||
"android_client_info": {
|
||||
"package_name": "com.b44t.messenger.beta"
|
||||
"package_name": "com.github.arcanechat.beta"
|
||||
}
|
||||
},
|
||||
"oauth_client": [],
|
||||
|
||||
@@ -31,5 +31,6 @@ LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT
|
||||
LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS
|
||||
|
||||
LOCAL_SRC_FILES := dc_wrapper.c
|
||||
LOCAL_LDFLAGS += -Wl,--build-id=none
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
@@ -276,6 +276,12 @@ JNIEXPORT void Java_com_b44t_messenger_DcAccounts_setPushDeviceToken(JNIEnv *env
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcAccounts_backgroundFetch(JNIEnv *env, jobject obj, jint timeout_seconds)
|
||||
{
|
||||
return dc_accounts_background_fetch(get_dc_accounts(env, obj), timeout_seconds) != 0;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_addAccount(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_accounts_add_account(get_dc_accounts(env, obj));
|
||||
@@ -1325,12 +1331,6 @@ JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMedia(JNIEnv *env,
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcContext_getNextMedia(JNIEnv *env, jobject obj, jint msg_id, jint dir, jint type1, jint type2, jint type3)
|
||||
{
|
||||
return dc_get_next_media(get_dc_context(env, obj), msg_id, dir, type1, type2, type3);
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMsgs(JNIEnv *env, jobject obj, jint chat_id, jint flags, jint marker1before)
|
||||
{
|
||||
dc_array_t* ca = dc_get_chat_msgs(get_dc_context(env, obj), chat_id, flags, marker1before);
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
- nuovo inserimento: puoi creare un nuovo profilo con un tocco su "Crea Nuovo Profilo" - oppure utilizzare un accesso esistente o la configurazione del secondo dispositivo come al solito
|
||||
i contatti possono essere allegati come "Schede" in "Allega/Contatto"; quando il destinatario tocca le carte, è possibile stabilire la crittografia end-to-end garantita
|
||||
- aggiungi contatti manualmente in "Nuova Chat / Nuovo Contatto / Aggiungi Contatto Manualmente"
|
||||
- invia qualsiasi emoji come reazione
|
||||
- mostrare le reazioni nei riepiloghi
|
||||
- blocca/archivia/ecc. le chat direttamente dai risultati di ricerca
|
||||
- Risolti bug e altro ancora
|
||||
@@ -0,0 +1,4 @@
|
||||
- aggiungi un'opzione per contrassegnare tutte le chat selezionate come "Lette" (tocca a lungo una chat per avviare la modalità di selezione)
|
||||
- i nuovi profili chatmail per dispositivo singolo hanno come impostazione predefinita "Elimina Messaggi Dopo il Download"
|
||||
- quando si utilizza un profilo chatmail su più dispositivi, la cancellazione viene modificata in "Automatica" (la strategia di cancellazione dipende quindi dal server)
|
||||
- Risolti bug e altro ancora
|
||||
@@ -50,6 +50,15 @@ if test -z "$ANDROID_NDK_ROOT"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# for reproducible build:
|
||||
export RUSTFLAGS="-C link-args=-Wl,--build-id=none --remap-path-prefix=$HOME/.cargo= --remap-path-prefix=$(realpath $(dirname $(dirname "$0")))="
|
||||
export SOURCE_DATE_EPOCH=1
|
||||
export CARGO_TARGET_DIR=/tmp/arcanechat-build
|
||||
# always use the same path to NDK:
|
||||
rm -f /tmp/android-ndk-root
|
||||
ln -s "$ANDROID_NDK_ROOT" /tmp/android-ndk-root
|
||||
ANDROID_NDK_ROOT=/tmp/android-ndk-root
|
||||
|
||||
echo Setting CARGO_TARGET environment variables.
|
||||
|
||||
if test -z "$NDK_HOST_TAG"; then
|
||||
@@ -65,8 +74,6 @@ if test -z "$NDK_HOST_TAG"; then
|
||||
NDK_HOST_TAG="$KERNEL-$ARCH"
|
||||
fi
|
||||
|
||||
unset RUSTFLAGS
|
||||
|
||||
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG"
|
||||
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang"
|
||||
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android21-clang"
|
||||
@@ -120,7 +127,7 @@ if test -z $1 || test $1 = armeabi-v7a; then
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi --features jsonrpc
|
||||
cp target/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
|
||||
cp $CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
|
||||
fi
|
||||
|
||||
if test -z $1 || test $1 = arm64-v8a; then
|
||||
@@ -129,7 +136,7 @@ if test -z $1 || test $1 = arm64-v8a; then
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi --features jsonrpc
|
||||
cp target/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
|
||||
cp $CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
|
||||
fi
|
||||
|
||||
if test -z $1 || test $1 = x86; then
|
||||
@@ -138,7 +145,7 @@ if test -z $1 || test $1 = x86; then
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi --features jsonrpc
|
||||
cp target/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
|
||||
cp $CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
|
||||
fi
|
||||
|
||||
if test -z $1 || test $1 = x86_64; then
|
||||
@@ -147,11 +154,9 @@ fi
|
||||
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
|
||||
cp $CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
|
||||
fi
|
||||
|
||||
rm -fr "$TMPLIB"
|
||||
|
||||
echo -- ndk-build --
|
||||
|
||||
cd ../..
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.google.firebase.messaging.RemoteMessage;
|
||||
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.BuildConfig;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.service.FetchForegroundService;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
public class FcmReceiveService extends FirebaseMessagingService {
|
||||
@@ -92,18 +92,17 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
||||
return prefixedToken;
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
@Override
|
||||
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||
Log.i(TAG, "FCM push notification received");
|
||||
// the app is running (again) now and fetching and notifications should be processed as usual.
|
||||
// to support accounts that do not send PUSH notifications and for simplicity,
|
||||
// we just let the app run as long as possible.
|
||||
FetchForegroundService.start(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeletedMessages() {
|
||||
Log.i(TAG, "FCM push notifications dropped");
|
||||
// nothing special to do as we're running now and notifications should be processed as usual.
|
||||
FetchForegroundService.start(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -262,6 +262,26 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity android:name=".proxy.ProxySettingsActivity"
|
||||
android:label="@string/proxy_settings"
|
||||
android:windowSoftInputMode="stateHidden"
|
||||
android:exported="true"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
||||
<data android:scheme="ss" />
|
||||
<data android:scheme="socks5" />
|
||||
<data android:scheme="SOCKS5" tools:ignore="AppLinkUrlError" />
|
||||
<data android:scheme="SS" tools:ignore="AppLinkUrlError" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
|
||||
|
||||
<activity android:name=".LogViewActivity"
|
||||
android:label="@string/pref_log_header"
|
||||
android:windowSoftInputMode="stateHidden"
|
||||
@@ -388,6 +408,10 @@
|
||||
android:name=".service.GenericForegroundService"
|
||||
android:foregroundServiceType="dataSync" />
|
||||
|
||||
<service
|
||||
android:name=".service.FetchForegroundService"
|
||||
android:foregroundServiceType="dataSync" />
|
||||
|
||||
<service
|
||||
android:name=".service.IPCAddAccountsService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#lze-znovu-použít-můj-stávající-soukromý-klíč">Lze znovu použít můj stávající soukromý klíč?</a></li>
|
||||
<li><a href="#importkey">Lze znovu použít můj stávající soukromý klíč?</a></li>
|
||||
<li><a href="#nemohu-do-delta-chatu-zavést-můj-stávající-pgp-klíč">Nemohu do ArcaneChatu zavést můj stávající PGP klíč.</a></li>
|
||||
<li><a href="#security-audits">Was ArcaneChat independently audited for security vulnerabilities?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#proč-můžu-nastavit-sledování-složky-odeslané">Proč můžu nastavit sledování složky Odeslané?</a></li>
|
||||
<li><a href="#proč-mohu-zvolit-nesledovat-složku-deltachat">Proč mohu zvolit nesledovat složku DeltaChat?</a></li>
|
||||
<li><a href="#lze-delta-chat-používat-s-protonmail--tutanota--criptext">Lze ArcaneChat používat s Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#how-can-i-delete-my-account">How can I delete my account?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my account?</a></li>
|
||||
<li><a href="#mám-zájem-o-technické-podrobnosti-kde-najdu-víc">Mám zájem o technické podrobnosti. Kde najdu víc?</a></li>
|
||||
<li><a href="#jak-je-financován-vývoj-delta-chatu">Jak je financován vývoj ArcaneChatu?</a></li>
|
||||
</ul>
|
||||
@@ -1146,10 +1146,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="lze-znovu-použít-můj-stávající-soukromý-klíč">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Lze znovu použít můj stávající soukromý klíč? <a href="#lze-znovu-použít-můj-stávající-soukromý-klíč" class="anchor"></a>
|
||||
Lze znovu použít můj stávající soukromý klíč? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1277,7 +1277,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, <a href="https://get.delta.chat">install ArcaneChat</a></p>
|
||||
<p>On the second device, <a href="https://github.com/ArcaneChat">install ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1379,7 +1379,7 @@ V tuto chvíli jsme zaměřeni na poskytování stabilní verze jako nativní ap
|
||||
významných obchodech (Google Play / iOS / Windows / macOS / Linux repositories) .</li>
|
||||
<li>Pokud nemáš dostatečná práva instalovat programy na svůj pracovní počítač, můžeš použít
|
||||
přenosnou verzi pro Windows nebo AppImage pro Linux.
|
||||
Všechny softwarové balíčky jsou na <a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
Všechny softwarové balíčky jsou na <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1791,7 +1791,7 @@ pro složku Odeslané přes IMAP).</p>
|
||||
programu (např. Thunderbird) spolu s ArcaneChatem, a chtít z tohoto programu také
|
||||
psát zprávy do hovorů ArcaneChatu.</p>
|
||||
|
||||
<p>Nicméně doporučujeme používat ArcaneChat Desktop Client; ten lze stáhnout z <a href="https://get.delta.chat">get.delta.chat</a>. Možnost sledování složky “Odeslané”
|
||||
<p>Nicméně doporučujeme používat ArcaneChat Desktop Client; ten lze stáhnout z <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. Možnost sledování složky “Odeslané”
|
||||
může být v budoucnu zrušena. Byla totiž vytvořena v době, kdy ArcaneChat Desktop
|
||||
nebyl dostupný na všech platformách.</p>
|
||||
|
||||
@@ -1829,22 +1829,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-delete-my-account">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my account? <a href="#how-can-i-delete-my-account" class="anchor"></a>
|
||||
How can I delete my account? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As you use an e-mail account for ArcaneChat,
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/cs/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over your e-mail account,
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to keep the account,
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.</p>
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="mám-zájem-o-technické-podrobnosti-kde-najdu-víc">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen">Wie kann ich Ende-zu-Ende-Verschlüsselung und Löschen von Nachrichten sicherstellen?</a></li>
|
||||
<li><a href="#pfs">Unterstützt ArcaneChat “Perfect Forward Secrecy”?</a></li>
|
||||
<li><a href="#ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal">Ist die Ende-zu-Ende-Verschlüsselung von ArcaneChat genauso sicher wie die von Signal?</a></li>
|
||||
<li><a href="#kann-ich-meinen-existierenden-privaten-schlüssel-weiter-verwenden">Kann ich meinen existierenden privaten Schlüssel weiter verwenden?</a></li>
|
||||
<li><a href="#importkey">Kann ich meinen existierenden privaten Schlüssel weiter verwenden?</a></li>
|
||||
<li><a href="#ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren">Ich kann meinen existierenden PGP-Schlüssel nicht in ArcaneChat importieren.</a></li>
|
||||
<li><a href="#security-audits">Wurde ArcaneChat unabhängig auf Sicherheitslücken geprüft?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#warum-gibt-es-die-funktion-gesendet-ordner-beobachten">Warum gibt es die Funktion “Gesendet-Ordner beobachten”?</a></li>
|
||||
<li><a href="#warum-kann-ich-deltachat-ordner-beobachten-ausschalten">Warum kann ich “DeltaChat-Ordner beobachten” ausschalten?</a></li>
|
||||
<li><a href="#ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext">Ist ArcaneChat kompatibel mit Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#wie-kann-ich-mein-konto-löschen">Wie kann ich mein Konto löschen?</a></li>
|
||||
<li><a href="#remove-account">Wie kann ich mein Konto löschen?</a></li>
|
||||
<li><a href="#ich-bin-an-technischen-details-interessiert-gibt-es-hierzu-weitere-infos">Ich bin an technischen Details interessiert. Gibt es hierzu weitere Infos?</a></li>
|
||||
<li><a href="#wie-wird-delta-chat-finanziert">Wie wird ArcaneChat finanziert?</a></li>
|
||||
</ul>
|
||||
@@ -1081,10 +1081,10 @@ vergangenen verschlüsselten Nachrichten hat.</p>
|
||||
<p>In jedem Fall verwendet die Ende-zu-Ende-Verschlüsselung von ArcaneChat eine <a href="#openpgp-secure">sichere Untermenge von OpenPGP</a>
|
||||
das [unabhängig sicherheitsgeprüft] wurde (../assets/blog/2019-first-security-review.pdf).</p>
|
||||
|
||||
<h3 id="kann-ich-meinen-existierenden-privaten-schlüssel-weiter-verwenden">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Kann ich meinen existierenden privaten Schlüssel weiter verwenden? <a href="#kann-ich-meinen-existierenden-privaten-schlüssel-weiter-verwenden" class="anchor"></a>
|
||||
Kann ich meinen existierenden privaten Schlüssel weiter verwenden? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1186,7 +1186,7 @@ Es wurden keine kritischen Probleme gefunden, aber zwei Probleme mit hohem Schwe
|
||||
<p>Gehen Sie auf dem ersten Gerät zu <strong>Einstellungen → Zweites Gerät hinzufügen</strong>, entsperren Sie den Bildschirm, falls erforderlich und warten Sie einen Moment, bis ein QR-Code angezeigt wird</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Auf dem zweiten Gerät <a href="https://get.delta.chat">ArcaneChat installieren</a></p>
|
||||
<p>Auf dem zweiten Gerät <a href="https://github.com/ArcaneChat">ArcaneChat installieren</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Auf dem zweiten Gerät ArcaneChat starten, “Als Zweitgerät hinzufügen” wählen und den QR-Code vom ersten Gerät scannen</p>
|
||||
@@ -1267,7 +1267,7 @@ Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf de
|
||||
<ul>
|
||||
<li>Es gibt keine direkten Pläne, aber einige vorläufige Gedanken.</li>
|
||||
<li>Es gibt 2-3 Möglichkeiten, einen ArcaneChat Web-Client einzuführen, aber sie bedeuten alle immense Arbeit. Im Moment fokussieren wir uns darauf, stabile native Apps in den Appstores (Google Play/iOS/Windows/macOS/Linux repositories) anzubieten.</li>
|
||||
<li>Sollten Sie einen Web-Client benötigen, weil Sie auf Ihrem Arbeitsrechner keine Software installieren dürfen, können Sie den Windows Desktop-Client bzw. Applmage für Linux nutzen. Sie finden diese unter <a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<li>Sollten Sie einen Web-Client benötigen, weil Sie auf Ihrem Arbeitsrechner keine Software installieren dürfen, können Sie den Windows Desktop-Client bzw. Applmage für Linux nutzen. Sie finden diese unter <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1612,7 +1612,7 @@ wenn Sie eine <a href="#signature">Signaturtext</a> einfügen.</p>
|
||||
|
||||
<p>Der einzige Grund, den Gesendet-Ordner zu beobachten, ist, wenn Sie ein weiteres E-Mail-Programm (wie Thunderbird) mit demselben E-Mail-Account verwenden und die von dort versendeten Nachrichten in der Chat-Historie aufgeführt werden sollen.</p>
|
||||
|
||||
<p>Wir empfehlen für diesen Zweck aber “ArcaneChat Desktop”; Sie können die App unter <a href="https://get.delta.chat">get.delta.chat</a> herunterladen. Möglicherweise wird die Option “Gesendet-Ordner beobachten” zukünftig wegfallen; sie kommt aus einer Zeit, als ArcaneChat Desktop noch nicht auf allen Plattformen zur Verfügung stand.</p>
|
||||
<p>Wir empfehlen für diesen Zweck aber “ArcaneChat Desktop”; Sie können die App unter <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a> herunterladen. Möglicherweise wird die Option “Gesendet-Ordner beobachten” zukünftig wegfallen; sie kommt aus einer Zeit, als ArcaneChat Desktop noch nicht auf allen Plattformen zur Verfügung stand.</p>
|
||||
|
||||
<h3 id="warum-kann-ich-deltachat-ordner-beobachten-ausschalten">
|
||||
|
||||
@@ -1640,17 +1640,38 @@ wenn Sie eine <a href="#signature">Signaturtext</a> einfügen.</p>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-fähige E-Mail-Anwendung</a> herstellen</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="wie-kann-ich-mein-konto-löschen">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Wie kann ich mein Konto löschen? <a href="#wie-kann-ich-mein-konto-löschen" class="anchor"></a>
|
||||
Wie kann ich mein Konto löschen? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Da Sie ein E-Mail-Konto für ArcaneChat verwenden, hängt von Ihrem E-Mail-Anbieter ab, wie Sie Ihr Konto löschen können. Wir haben keine Kontrolle über Ihr E-Mail-Konto, daher können wir Ihnen dabei leider nicht helfen.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/de/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Wenn Sie das Konto behalten, aber ArcaneChat deinstallieren möchten, ist es ratsam, aktive Gruppen zu verlassen, bevor Sie ArcaneChat deinstallieren.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="ich-bin-an-technischen-details-interessiert-gibt-es-hierzu-weitere-infos">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#can-i-reuse-my-existing-private-key">Can I reuse my existing private key?</a></li>
|
||||
<li><a href="#importkey">Can I reuse my existing private key?</a></li>
|
||||
<li><a href="#i-cant-import-my-existing-pgp-key-into-delta-chat">I can’t import my existing PGP key into ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Was ArcaneChat independently audited for security vulnerabilities?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#why-can-i-choose-to-watch-the-sent-folder">Why can I choose to watch the “Sent” folder?</a></li>
|
||||
<li><a href="#why-can-i-choose-not-to-watch-the-deltachat-folder">Why can I choose not to watch the DeltaChat folder?</a></li>
|
||||
<li><a href="#is-delta-chat-compatible-with-protonmail--tutanota--criptext">Is ArcaneChat compatible with Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#how-can-i-delete-my-account">How can I delete my account?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my account?</a></li>
|
||||
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">I’m interested in the technical details. Can you tell me more?</a></li>
|
||||
<li><a href="#how-are-delta-chat-developments-funded">How are ArcaneChat developments funded?</a></li>
|
||||
</ul>
|
||||
@@ -1150,10 +1150,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="can-i-reuse-my-existing-private-key">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Can I reuse my existing private key? <a href="#can-i-reuse-my-existing-private-key" class="anchor"></a>
|
||||
Can I reuse my existing private key? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1283,7 +1283,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, <a href="https://get.delta.chat">install ArcaneChat</a></p>
|
||||
<p>On the second device, <a href="https://github.com/ArcaneChat">install ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1386,7 +1386,7 @@ app stores (Google Play/iOS/Windows/macOS/Linux repositories) as native apps.</l
|
||||
<li>If you need a Web Client, because you are not allowed to install software on
|
||||
the computer you work with, you can use the portable Windows Desktop Client,
|
||||
or the AppImage for Linux. You can find them on
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1800,7 +1800,7 @@ mail program (like Thunderbird) next to your ArcaneChat app, and want your MUA
|
||||
to participate in chat conversations.</p>
|
||||
|
||||
<p>However, we recommend using the ArcaneChat Desktop Client; you can download it
|
||||
on <a href="https://get.delta.chat">get.delta.chat</a>. The option to watch the “Sent”
|
||||
on <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. The option to watch the “Sent”
|
||||
folder might go away in the future. It was introduced at a time where there was
|
||||
no ArcaneChat Desktop client available on all platforms.</p>
|
||||
|
||||
@@ -1838,22 +1838,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-delete-my-account">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my account? <a href="#how-can-i-delete-my-account" class="anchor"></a>
|
||||
How can I delete my account? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As you use an e-mail account for ArcaneChat,
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/en/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over your e-mail account,
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to keep the account,
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.</p>
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#cómo-puedo-asegurar-el-cifrado-de-extremo-a-extremo-y-la-eliminación-de-mensajes">¿Cómo puedo asegurar el cifrado de extremo a extremo y la eliminación de mensajes?</a></li>
|
||||
<li><a href="#pfs">¿Soporta ArcaneChat Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#es-el-cifrado-de-extremo-a-extremo-de-delta-chat-tan-seguro-como-el-de-signal">¿Es el cifrado de extremo a extremo de ArcaneChat tan seguro como el de Signal?</a></li>
|
||||
<li><a href="#puedo-reutilizar-mi-clave-privada-existente">¿Puedo reutilizar mi clave privada existente?</a></li>
|
||||
<li><a href="#importkey">¿Puedo reutilizar mi clave privada existente?</a></li>
|
||||
<li><a href="#no-puedo-importar-mi-clave-pgp-existente-en-delta-chat">No puedo importar mi clave PGP existente en ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">¿Se auditó ArcaneChat de forma independiente en busca de vulnerabilidades de seguridad?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#por-qué-puedo-elegir-monitorear-la-carpeta-enviados">¿Por qué puedo elegir monitorear la carpeta “Enviados”?</a></li>
|
||||
<li><a href="#por-qué-puedo-elegir-no-monitorear-la-carpeta-deltachat">¿Por qué puedo elegir no monitorear la carpeta DeltaChat?</a></li>
|
||||
<li><a href="#delta-chat-es-compatible-con-protonmail--tutanota--criptext">¿ArcaneChat es compatible con Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#cómo-puedo-eliminar-mi-cuenta">¿Cómo puedo eliminar mi cuenta?</a></li>
|
||||
<li><a href="#remove-account">¿Cómo puedo eliminar mi cuenta?</a></li>
|
||||
<li><a href="#estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">Estoy interesado en los detalles técnicos. ¿Pueden decirme más?</a></li>
|
||||
<li><a href="#cómo-se-financia-el-desarrollo-de-delta-chat">¿Cómo se financia el desarrollo de ArcaneChat?</a></li>
|
||||
</ul>
|
||||
@@ -1110,10 +1110,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="puedo-reutilizar-mi-clave-privada-existente">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
¿Puedo reutilizar mi clave privada existente? <a href="#puedo-reutilizar-mi-clave-privada-existente" class="anchor"></a>
|
||||
¿Puedo reutilizar mi clave privada existente? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1245,7 +1245,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>En el otro dispositivo, <a href="https://get.delta.chat">instala ArcaneChat</a></p>
|
||||
<p>En el otro dispositivo, <a href="https://github.com/ArcaneChat">instala ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1348,7 +1348,7 @@ tiendas de aplicaciones (Google Play/iOS/Windows/macOS/Linux repositorios) como
|
||||
<li>Si necesitas un cliente web, porque no tienes permiso para instalar software en
|
||||
el ordenador con que trabajas, puedes utilizar el cliente portátil Windows Desktop Client
|
||||
o el AppImage para Linux. Puedes encontrarlos en
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1746,7 +1746,7 @@ programa de correo (como Thunderbird) a la vez que su aplicación ArcaneChat, y
|
||||
también participe en conversaciones de chat.</p>
|
||||
|
||||
<p>No obstante, recomendamos utilizar el cliente de escritorio ArcaneChat; puede descargarlo
|
||||
en <a href="https://get.delta.chat">get.delta.chat</a>. La opción de observar la carpeta “Enviados”
|
||||
en <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. La opción de observar la carpeta “Enviados”
|
||||
podría desaparecer en el futuro. Se introdujo en un momento en que no había
|
||||
cliente ArcaneChat Desktop disponible en todas las plataformas.</p>
|
||||
|
||||
@@ -1782,20 +1782,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="cómo-puedo-eliminar-mi-cuenta">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
¿Cómo puedo eliminar mi cuenta? <a href="#cómo-puedo-eliminar-mi-cuenta" class="anchor"></a>
|
||||
¿Cómo puedo eliminar mi cuenta? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Al utilizar una cuenta de correo electrónico para ArcaneChat,
|
||||
La forma de eliminar tu cuenta depende de tu proveedor de correo electrónico.
|
||||
No tenemos ningún control sobre su cuenta de correo electrónico,
|
||||
Lamentablemente no podemos ayudarte con eso.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/es/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Si quieres mantener la cuenta, pero desinstalar ArcaneChat, se recomienda salir de cualquier chat grupal antes de desinstalar ArcaneChat.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#puis-je-ré-utiliser-ma-clé-privée-existante-">Puis-je ré-utiliser ma clé privée existante ?</a></li>
|
||||
<li><a href="#importkey">Puis-je ré-utiliser ma clé privée existante ?</a></li>
|
||||
<li><a href="#je-narrive-pas-à-importer-ma-clé-pgp-existante-dans-delta-chat">Je n’arrive pas à importer ma clé PGP existante dans ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Est-ce qu’un audit indépendant des failles de sécurité a été réalisé sur ArcaneChat ?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#pourquoi-puis-je-choisir-de-regarder-le-dossier-envoyés">Pourquoi puis-je choisir de regarder le dossier “Envoyés”?</a></li>
|
||||
<li><a href="#pourquoi-puis-je-choisir-de-ne-pas-regarder-le-dossier-delta-chat">Pourquoi puis-je choisir de ne pas regarder le dossier ArcaneChat?</a></li>
|
||||
<li><a href="#delta-chat-est-il-compatible-avec-protonmail--tutanota--criptext-">ArcaneChat est-il compatible avec Protonmail / Tutanota / Criptext ?</a></li>
|
||||
<li><a href="#comment-supprimer-mon-compte-">Comment supprimer mon compte ?</a></li>
|
||||
<li><a href="#remove-account">Comment supprimer mon compte ?</a></li>
|
||||
<li><a href="#les-détails-techniques-mintéressent-pouvez-vous-men-dire-plus-">Les détails techniques m’intéressent. Pouvez-vous m’en dire plus ?</a></li>
|
||||
<li><a href="#comment-est-financé-le-développement-de-delta-chat-">Comment est financé le développement de ArcaneChat ?</a></li>
|
||||
</ul>
|
||||
@@ -1124,10 +1124,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="puis-je-ré-utiliser-ma-clé-privée-existante-">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Puis-je ré-utiliser ma clé privée existante ? <a href="#puis-je-ré-utiliser-ma-clé-privée-existante-" class="anchor"></a>
|
||||
Puis-je ré-utiliser ma clé privée existante ? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1231,7 +1231,7 @@ Le rapport complet <a href="https://delta.chat/assets/blog/2019-first-security-r
|
||||
<p>Sur le premier appareil, allez dans <strong>Paramètres → Ajouter un deuxième appareil</strong>, déverrouillez l’écran si nécessaire, et patientez un peu jusqu’à ce qu’un code QR s’affiche.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sur le deuxième appareil, <a href="https://get.delta.chat">installez ArcaneChat</a>.</p>
|
||||
<p>Sur le deuxième appareil, <a href="https://github.com/ArcaneChat">installez ArcaneChat</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sur le deuxième appareil, ouvrez ArcaneChat, sélectionnez <strong>Ajouter comme deuxième appareil</strong>, et scannez le code QR du premier appareil.</p>
|
||||
@@ -1329,7 +1329,7 @@ end-to-end encrypted messages with your communication partners.</li>
|
||||
<li>Il y a 2-3 façons d’introduire un client Web ArcaneChat, mais toutes représentent
|
||||
un travail conséquent. Pour l’instant, nous nous concentrons à sortir des versions stables dans tous les magasins d’applications (Google Play/iOS/Windows/macOS/centre de paquets Linux) en tant qu’applications natives.</li>
|
||||
<li>Si vous avez besoin d’un client Web parce que vous n’êtes pas autorisé à installer des logiciels sur l’ordinateur sur lequel vous travaillez, vous pouvez utiliser le Client Portable pour bureaux Windows ou l’AppImage pour Linux. Vous pouvez les trouver sur
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1710,7 +1710,7 @@ if you set a <a href="#signature">signature text</a>.</p>
|
||||
|
||||
<p>La seule raison de regarder le dossier Envoyés est si vous utilisez un autre programme de courriel (tel que Thunderbird) en parallèle de votre application ArcaneChat, et que vous voulez que votre client de messagerie participe aux discussions.</p>
|
||||
|
||||
<p>Cependant, nous recommandons d’utiliser le client de bureau ArcaneChat; vous pouvez le télécharger sur <a href="https://get.delta.chat">get.delta.chat</a>. L’option de regarder le dossier “Envoyés” pourrait disparaître dans le futur. Elle a été introduite à une époque où il n’y avait pas de client de bureau ArcaneChat disponible sur toutes les plateformes.</p>
|
||||
<p>Cependant, nous recommandons d’utiliser le client de bureau ArcaneChat; vous pouvez le télécharger sur <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. L’option de regarder le dossier “Envoyés” pourrait disparaître dans le futur. Elle a été introduite à une époque où il n’y avait pas de client de bureau ArcaneChat disponible sur toutes les plateformes.</p>
|
||||
|
||||
<h3 id="pourquoi-puis-je-choisir-de-ne-pas-regarder-le-dossier-delta-chat">
|
||||
|
||||
@@ -1744,18 +1744,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="comment-supprimer-mon-compte-">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Comment supprimer mon compte ? <a href="#comment-supprimer-mon-compte-" class="anchor"></a>
|
||||
Comment supprimer mon compte ? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Étant donné que vous utilisez ArcaneChat à travers un compte courriel, la façon dont vous pouvez supprimer votre compte dépend de votre fournisseur de courriel.
|
||||
Comme nous n’exerçons aucun contrôle sur votre compte courriel, nous ne sommes pas en mesure de vous aider à le supprimer.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/fr/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Si vous souhaitez conserver votre compte mais désinstaller ArcaneChat, nous vous recommandons de quitter toutes les discussions de groupe avant de procéder à la désinstallation.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="les-détails-techniques-mintéressent-pouvez-vous-men-dire-plus-">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#can-i-reuse-my-existing-private-key">Can I reuse my existing private key?</a></li>
|
||||
<li><a href="#importkey">Can I reuse my existing private key?</a></li>
|
||||
<li><a href="#i-cant-import-my-existing-pgp-key-into-delta-chat">I can’t import my existing PGP key into ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Was ArcaneChat independently audited for security vulnerabilities?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#why-can-i-choose-to-watch-the-sent-folder">Why can I choose to watch the “Sent” folder?</a></li>
|
||||
<li><a href="#why-can-i-choose-not-to-watch-the-deltachat-folder">Why can I choose not to watch the DeltaChat folder?</a></li>
|
||||
<li><a href="#is-delta-chat-compatible-with-protonmail--tutanota--criptext">Is ArcaneChat compatible with Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#how-can-i-delete-my-account">How can I delete my account?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my account?</a></li>
|
||||
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">I’m interested in the technical details. Can you tell me more?</a></li>
|
||||
<li><a href="#how-are-delta-chat-developments-funded">How are ArcaneChat developments funded?</a></li>
|
||||
</ul>
|
||||
@@ -1150,10 +1150,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="can-i-reuse-my-existing-private-key">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Can I reuse my existing private key? <a href="#can-i-reuse-my-existing-private-key" class="anchor"></a>
|
||||
Can I reuse my existing private key? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1283,7 +1283,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, <a href="https://get.delta.chat">install ArcaneChat</a></p>
|
||||
<p>On the second device, <a href="https://github.com/ArcaneChat">install ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1386,7 +1386,7 @@ app stores (Google Play/iOS/Windows/macOS/Linux repositories) as native apps.</l
|
||||
<li>If you need a Web Client, because you are not allowed to install software on
|
||||
the computer you work with, you can use the portable Windows Desktop Client,
|
||||
or the AppImage for Linux. You can find them on
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1800,7 +1800,7 @@ mail program (like Thunderbird) next to your ArcaneChat app, and want your MUA
|
||||
to participate in chat conversations.</p>
|
||||
|
||||
<p>However, we recommend using the ArcaneChat Desktop Client; you can download it
|
||||
on <a href="https://get.delta.chat">get.delta.chat</a>. The option to watch the “Sent”
|
||||
on <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. The option to watch the “Sent”
|
||||
folder might go away in the future. It was introduced at a time where there was
|
||||
no ArcaneChat Desktop client available on all platforms.</p>
|
||||
|
||||
@@ -1838,22 +1838,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-delete-my-account">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my account? <a href="#how-can-i-delete-my-account" class="anchor"></a>
|
||||
How can I delete my account? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As you use an e-mail account for ArcaneChat,
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/id/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over your e-mail account,
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to keep the account,
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.</p>
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#come-posso-garantire-la-crittografia-e-leliminazione-end-to-end-dei-messaggi">Come posso garantire la crittografia e l’eliminazione end-to-end dei messaggi?</a></li>
|
||||
<li><a href="#pfs">ArcaneChat supporta Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#la-crittografia-end-to-end-di-delta-chat-è-sicura-quanto-quella-di-signal">La crittografia end-to-end di ArcaneChat è sicura quanto quella di Signal?</a></li>
|
||||
<li><a href="#posso-riutilizzare-la-mia-chiave-privata-esistente">Posso riutilizzare la mia chiave privata esistente?</a></li>
|
||||
<li><a href="#importkey">Posso riutilizzare la mia chiave privata esistente?</a></li>
|
||||
<li><a href="#non-riesco-a-importare-la-mia-chiave-pgp-esistente-in-delta-chat">Non riesco a importare la mia chiave PGP esistente in ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">ArcaneChat è stata verificata in modo indipendente per le vulnerabilità di sicurezza?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#perché-posso-scegliere-di-guardare-la-cartella-inviata">Perché posso scegliere di guardare la cartella “Inviata”?</a></li>
|
||||
<li><a href="#perché-posso-scegliere-di-non-guardare-la-cartella-deltachat">Perché posso scegliere di non guardare la cartella DeltaChat?</a></li>
|
||||
<li><a href="#delta-chat-è-compatibile-con-protonmail--tutanota--criptext">ArcaneChat è compatibile con Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#come-posso-eliminare-il-mio-profilo">Come posso eliminare il mio profilo?</a></li>
|
||||
<li><a href="#remove-account">Come posso eliminare il mio profilo?</a></li>
|
||||
<li><a href="#sono-interessato-ai-dettagli-tecnici-mi-puoi-dire-di-più">Sono interessato ai dettagli tecnici. Mi puoi dire di più?</a></li>
|
||||
<li><a href="#come-viene-finanziato-lo-sviluppo-di-delta-chat">Come viene finanziato lo sviluppo di ArcaneChat?</a></li>
|
||||
</ul>
|
||||
@@ -1137,10 +1137,10 @@ messaggi crittografati precedenti.</p>
|
||||
<p>In ogni caso, la crittografia end-to-end di ArcaneChat utilizza un <a href="#openpgp-secure">sottoinsieme sicuro di OpenPGP</a>
|
||||
che è stato <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">controllato in modo indipendente sulla sicurezza</a>.</p>
|
||||
|
||||
<h3 id="posso-riutilizzare-la-mia-chiave-privata-esistente">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Posso riutilizzare la mia chiave privata esistente? <a href="#posso-riutilizzare-la-mia-chiave-privata-esistente" class="anchor"></a>
|
||||
Posso riutilizzare la mia chiave privata esistente? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1270,7 +1270,7 @@ Puoi leggere il <a href="https://delta.chat/assets/blog/2019-first-security-revi
|
||||
e attendere un attimo fino a quando non viene visualizzato un codice QR</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sul secondo dispositivo, <a href="https://get.delta.chat">installare ArcaneChat</a></p>
|
||||
<p>Sul secondo dispositivo, <a href="https://github.com/ArcaneChat">installare ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sul secondo dispositivo, avviare ArcaneChat, selezionare <strong>Aggiungi Come Secondo Dispositivo</strong> e scansionare il codice QR del vecchio dispositivo.</p>
|
||||
@@ -1370,7 +1370,7 @@ gli app store (repository Google Play/iOS/Windows/macOS/Linux) come app native.<
|
||||
<li>Se hai bisogno di un Client Web, perché non sei autorizzato a installare software sul
|
||||
computer con cui lavori, puoi utilizzare il client Desktop Windows Portatile,
|
||||
o l’AppImage per Linux. Le trovi su
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1762,7 +1762,7 @@ programma di posta (come Thunderbird) accanto alla tua app ArcaneChat e desideri
|
||||
per partecipare a conversazioni in chat.</p>
|
||||
|
||||
<p>Tuttavia, consigliamo di utilizzare il client desktop ArcaneChat; puoi scaricarlo
|
||||
su <a href="https://get.delta.chat">get.delta.chat</a>. L’opzione per guardare la cartella
|
||||
su <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. L’opzione per guardare la cartella
|
||||
“Inviata” potrebbe scomparire in futuro. È stato introdotto in un momento in cui non c’era
|
||||
nessun client ArcaneChat Desktop disponibile su tutte le piattaforme.</p>
|
||||
|
||||
@@ -1800,22 +1800,38 @@ che usa.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">App di posta elettronica abilitata per Autocrypt</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="come-posso-eliminare-il-mio-profilo">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Come posso eliminare il mio profilo? <a href="#come-posso-eliminare-il-mio-profilo" class="anchor"></a>
|
||||
Come posso eliminare il mio profilo? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Poiché utilizzi un profilo e-mail per ArcaneChat,
|
||||
il modo in cui puoi eliminare il tuo profilo dipende dal tuo provider e-mail.
|
||||
Non abbiamo alcun controllo sul tuo profilo e-mail,
|
||||
quindi purtroppo non possiamo aiutarti in questo.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/it/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Se vuoi mantenere il profilo,
|
||||
ma disinstallare ArcaneChat,
|
||||
si consiglia di uscire da qualsiasi chat di gruppo prima di disinstallare ArcaneChat.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="sono-interessato-ai-dettagli-tecnici-mi-puoi-dire-di-più">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#kan-ik-mijn-bestaande-privésleutel-hergebruiken">Kan ik mijn bestaande privésleutel hergebruiken?</a></li>
|
||||
<li><a href="#importkey">Kan ik mijn bestaande privésleutel hergebruiken?</a></li>
|
||||
<li><a href="#ik-kan-mijn-bestaande-pgp-sleutel-niet-importeren">Ik kan mijn bestaande PGP-sleutel niet importeren</a></li>
|
||||
<li><a href="#security-audits">Heeft ArcaneChat ooit onafhankelijke beveiligingscontroles ondergaan?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#waarom-kan-ik-kiezen-om-de-map-verzonden-te-controleren">Waarom kan ik kiezen om de map ‘Verzonden’ te controleren?</a></li>
|
||||
<li><a href="#waarom-kan-ik-kiezen-om-de-deltachat-map-te-negeren">Waarom kan ik kiezen om de DeltaChat-map te negeren?</a></li>
|
||||
<li><a href="#is-delta-chat-compatibel-met-protonmailtutanotacriptext">Is ArcaneChat compatibel met Protonmail/Tutanota/Criptext?</a></li>
|
||||
<li><a href="#hoe-kan-ik-mijn-account-verwijderen">Hoe kan ik mijn account verwijderen?</a></li>
|
||||
<li><a href="#remove-account">Hoe kan ik mijn account verwijderen?</a></li>
|
||||
<li><a href="#ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">Ik wil graag meer weten over de gebruikte technieken. Waar kan ik meer informatie vinden?</a></li>
|
||||
<li><a href="#hoe-wordt-de-ontwikkeling-van-delta-chat-gefinancierd">Hoe wordt de ontwikkeling van ArcaneChat gefinancierd?</a></li>
|
||||
</ul>
|
||||
@@ -1143,10 +1143,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="kan-ik-mijn-bestaande-privésleutel-hergebruiken">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Kan ik mijn bestaande privésleutel hergebruiken? <a href="#kan-ik-mijn-bestaande-privésleutel-hergebruiken" class="anchor"></a>
|
||||
Kan ik mijn bestaande privésleutel hergebruiken? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1275,7 +1275,7 @@ Het <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">voll
|
||||
en wacht totdat de QR-code in beeld verschijnt.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://get.delta.chat">Installeer ArcaneChat</a> op het tweede apparaat.</p>
|
||||
<p><a href="https://github.com/ArcaneChat">Installeer ArcaneChat</a> op het tweede apparaat.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Start ArcaneChat op het tweede apparaat, kies <strong>Toevoegen als tweede apparaat</strong> en scan de QR-code met het eerste apparaat.</p>
|
||||
@@ -1377,7 +1377,7 @@ inspanningen. Momenteel ligt voor ons de focus op stabiele uitgaven maken voor a
|
||||
<li>Als je een webclient nodig hebt omdat je geen software mag installeren op
|
||||
je computer, dan kun je de meeneembare (portable) versie gebruiken van de Windows-client,
|
||||
of de AppImage van de Linux-client. Deze kun je downloaden op
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1785,7 +1785,7 @@ en eenmaal middels imap naar de map ‘Verzonden’).</p>
|
||||
ArcaneChat-app gebruikt en wilt dat je andere apparaten deel uitmaken van gesprekken.</p>
|
||||
|
||||
<p>Wij raden echter aan om in dat geval de ArcaneChat-app te installeren op je computer:
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>. De optie om de map ‘Verzonden’ te controleren
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. De optie om de map ‘Verzonden’ te controleren
|
||||
wordt in de toekomst mogelijk verwijderd. De functie deed zijn intrede toen er nog niet
|
||||
op alle platformen een ArcaneChat-client beschikbaar was.</p>
|
||||
|
||||
@@ -1823,22 +1823,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="hoe-kan-ik-mijn-account-verwijderen">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Hoe kan ik mijn account verwijderen? <a href="#hoe-kan-ik-mijn-account-verwijderen" class="anchor"></a>
|
||||
Hoe kan ik mijn account verwijderen? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>ArcaneChat maakt gebruik van je e-mailaccount,
|
||||
dus de verwijderprocedure is afhankelijk van je provider.
|
||||
We hebben geen zeggenschap over je account,
|
||||
dus helaas kunnen we je daar niet bij helpen.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/nl/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Als je je account wilt behouden maar ArcaneChat
|
||||
niet wilt verwijderen, verlaat dan groeps-
|
||||
gesprekken voordat je ArcaneChat verwijdert.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości">Jak mogę zapewnić kompleksowe szyfrowanie i usuwanie wiadomości?</a></li>
|
||||
<li><a href="#pfs">Czy ArcaneChat obsługuje funkcję Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal">Czy szyfrowanie end-to-end ArcaneChat jest tak samo bezpieczne jak Signal?</a></li>
|
||||
<li><a href="#czy-mogę-ponownie-wykorzystać-mój-istniejący-klucz-prywatny">Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?</a></li>
|
||||
<li><a href="#importkey">Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?</a></li>
|
||||
<li><a href="#nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat">Nie mogę zaimportować istniejącego klucza PGP do ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Czy ArcaneChat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#po-co-mam-wybrać-opcję-oglądania-folderu-wysłane">Po co mam wybrać opcję oglądania folderu „Wysłane”?</a></li>
|
||||
<li><a href="#dlaczego-mogę-nie-widzieć-folderu-deltachat">Dlaczego mogę nie widzieć folderu DeltaChat?</a></li>
|
||||
<li><a href="#czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext">Czy ArcaneChat jest kompatybilny z Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#jak-mogę-usunąć-swoje-konto">Jak mogę usunąć swoje konto?</a></li>
|
||||
<li><a href="#remove-account">Jak mogę usunąć swoje konto?</a></li>
|
||||
<li><a href="#interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">Interesują mnie szczegóły techniczne. Możesz powiedzieć mi coś więcej?</a></li>
|
||||
<li><a href="#w-jaki-sposób-finansowany-jest-rozwój-delta-chat">W jaki sposób finansowany jest rozwój ArcaneChat?</a></li>
|
||||
</ul>
|
||||
@@ -824,10 +824,10 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
<p>W każdym razie szyfrowanie end-to-end ArcaneChat wykorzystuje <a href="#openpgp-secure">bezpieczny podzbiór OpenPGP</a>, który został poddany <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">niezależnemu audytowi bezpieczeństwa</a>.</p>
|
||||
|
||||
<h3 id="czy-mogę-ponownie-wykorzystać-mój-istniejący-klucz-prywatny">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Czy mogę ponownie wykorzystać mój istniejący klucz prywatny? <a href="#czy-mogę-ponownie-wykorzystać-mój-istniejący-klucz-prywatny" class="anchor"></a>
|
||||
Czy mogę ponownie wykorzystać mój istniejący klucz prywatny? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -914,7 +914,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
|
||||
<p>Na pierwszym urządzeniu przejdź do <strong>Ustawienia → Dodaj kolejne urządzenie</strong>, w razie potrzeby odblokuj ekran i poczekaj chwilę, aż pojawi się kod QR</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Na drugim urządzeniu <a href="https://get.delta.chat">zainstaluj ArcaneChat</a></p>
|
||||
<p>Na drugim urządzeniu <a href="https://github.com/ArcaneChat">zainstaluj ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Na drugim urządzeniu uruchom ArcaneChat, wybierz <strong>Dodaj jako kolejne urządzenie</strong> i zeskanuj kod QR z pierwszego urządzenia</p>
|
||||
@@ -993,7 +993,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
|
||||
<ul>
|
||||
<li>Nie ma bezpośrednich planów, ale wstępne przemyślenia.</li>
|
||||
<li>Istnieją 2-3 możliwości wprowadzenia klienta Web ArcaneChat, ale wszystkie wymagają znaczącej pracy. Na razie skupiamy się na udostępnianiu stabilnych wersji we wszystkich sklepach z aplikacjami (repozytoria Google Play/iOS/Windows/macOS/Linux) jako aplikacji natywnych.</li>
|
||||
<li>Jeśli potrzebujesz klienta Web, ponieważ nie możesz instalować oprogramowania na komputerze, na którym pracujesz, możesz użyć przenośnego klienta Windows Desktop lub AppImage dla Linuxa. Możesz je znaleźć na <a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<li>Jeśli potrzebujesz klienta Web, ponieważ nie możesz instalować oprogramowania na komputerze, na którym pracujesz, możesz użyć przenośnego klienta Windows Desktop lub AppImage dla Linuxa. Możesz je znaleźć na <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1299,7 +1299,7 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
|
||||
|
||||
<p>Jedynym powodem, dla którego ktoś chce oglądać folder Wysłane, jest to, że używa innego programu pocztowego (takiego jak Thunderbird) razem z aplikacją ArcaneChat i chce, aby jego program pocztowy „uczestniczył” w rozmowach na czacie.</p>
|
||||
|
||||
<p>Jednak zalecamy używanie klienta ArcaneChat Desktop; możesz go pobrać z <a href="https://get.delta.chat">get.delta.chat</a>. Opcja oglądania folderu „Wysłane” może w przyszłości zniknąć. Została wprowadzona w czasie, gdy na żadnej platformie nie był dostępny klient ArcaneChat Desktop.</p>
|
||||
<p>Jednak zalecamy używanie klienta ArcaneChat Desktop; możesz go pobrać z <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. Opcja oglądania folderu „Wysłane” może w przyszłości zniknąć. Została wprowadzona w czasie, gdy na żadnej platformie nie był dostępny klient ArcaneChat Desktop.</p>
|
||||
|
||||
<h3 id="dlaczego-mogę-nie-widzieć-folderu-deltachat">
|
||||
|
||||
@@ -1326,18 +1326,38 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
|
||||
<li>ArcaneChat może zaszyfrować metodą end-to-end za pośrednictwem dowolnego dostawcy poczty e-mail z dowolną <a href="https://autocrypt.org/dev-status.html">aplikacją e-mail z włączoną funkcją Autocrypt</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="jak-mogę-usunąć-swoje-konto">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Jak mogę usunąć swoje konto? <a href="#jak-mogę-usunąć-swoje-konto" class="anchor"></a>
|
||||
Jak mogę usunąć swoje konto? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Gdy korzystasz z konta e-mail w ArcaneChat, sposób usunięcia konta zależy od dostawcy poczty e-mail.
|
||||
Nie mamy żadnej kontroli nad twoim kontem e-mail, więc niestety nie możemy ci w tym pomóc.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/pl/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Jeśli chcesz zachować konto, ale odinstalować ArcaneChat, zaleca się opuszczenie każdego czatu grupowego przed odinstalowaniem ArcaneChat.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#posso-reutilizar-minha-chave-privada-existente">Posso reutilizar minha chave privada existente?</a></li>
|
||||
<li><a href="#importkey">Posso reutilizar minha chave privada existente?</a></li>
|
||||
<li><a href="#eu-não-posso-importar-minha-chave-pgp-existente-para-o-delta-chat">Eu não posso importar minha chave PGP existente para o ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Was ArcaneChat independently audited for security vulnerabilities?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#por-que-eu-posso-escolher-assistir-à-pasta-enviado">Por que eu posso escolher assistir à pasta “Enviado”?</a></li>
|
||||
<li><a href="#por-que-eu-posso-escolher-não-observar-a-pasta-deltachat">Por que eu posso escolher não observar a pasta DeltaChat?</a></li>
|
||||
<li><a href="#o-delta-chat-é-compatível-com-protonmail--tutanota--criptext">O ArcaneChat é compatível com Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#how-can-i-delete-my-account">How can I delete my account?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my account?</a></li>
|
||||
<li><a href="#estou-interessado-nos-detalhes-técnicos-pode-me-dizer-mais">Estou interessado nos detalhes técnicos. Pode me dizer mais?</a></li>
|
||||
<li><a href="#como-são-os-desenvolvimentos-do-delta-chat-financiados">Como são os desenvolvimentos do ArcaneChat financiados?</a></li>
|
||||
</ul>
|
||||
@@ -1144,10 +1144,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="posso-reutilizar-minha-chave-privada-existente">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Posso reutilizar minha chave privada existente? <a href="#posso-reutilizar-minha-chave-privada-existente" class="anchor"></a>
|
||||
Posso reutilizar minha chave privada existente? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1277,7 +1277,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, <a href="https://get.delta.chat">install ArcaneChat</a></p>
|
||||
<p>On the second device, <a href="https://github.com/ArcaneChat">install ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1380,7 +1380,7 @@ app stores (Google Play/iOS/Windows/macOS/Linux repositórios) como aplicativos
|
||||
<li>Se você precisa de um Cliente Web, porque não está autorizado a instalar software em
|
||||
o computador com o qual você trabalha, você pode usar o Windows Desktop Client portátil,
|
||||
ou o AppImage para Linux. Você pode encontrá-los em
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1786,7 +1786,7 @@ programa de correio (como Thunderbird) ao lado de seu aplicativo ArcaneChat, e q
|
||||
para participar numa conversa de chat.</p>
|
||||
|
||||
<p>No entanto, recomendamos o uso do ArcaneChat cliente Desktop; você pode baixá-lo
|
||||
no <a href="https://get.delta.chat">get.delta.chat</a>. A opção de observar o “Enviado
|
||||
no <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. A opção de observar o “Enviado
|
||||
pasta pode ir embora no futuro. Ela foi introduzida num momento em que havia
|
||||
nenhum cliente ArcaneChat no desktop disponível em todas as plataformas.</p>
|
||||
|
||||
@@ -1824,22 +1824,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-delete-my-account">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my account? <a href="#how-can-i-delete-my-account" class="anchor"></a>
|
||||
How can I delete my account? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As you use an e-mail account for ArcaneChat,
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/pt/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over your e-mail account,
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to keep the account,
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.</p>
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="estou-interessado-nos-detalhes-técnicos-pode-me-dizer-mais">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#как-я-могу-обеспечить-сквозное-шифрование-и-удаление-сообщений">Как я могу обеспечить сквозное шифрование и удаление сообщений?</a></li>
|
||||
<li><a href="#pfs">Поддерживает ли ArcaneChat Совершенную Прямую Секретность?</a></li>
|
||||
<li><a href="#является-ли-сквозное-шифрование-delta-chat-таким-же-безопасным-как-signal">Является ли сквозное шифрование ArcaneChat таким же безопасным как Signal?</a></li>
|
||||
<li><a href="#можно-ли-повторно-использовать-существующий-секретный-ключ">Можно ли повторно использовать существующий секретный ключ?</a></li>
|
||||
<li><a href="#importkey">Можно ли повторно использовать существующий секретный ключ?</a></li>
|
||||
<li><a href="#я-не-могу-импортировать-мой-существующий-ключ-pgp-в-delta-chat">Я не могу импортировать мой существующий ключ PGP в ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Проходил ли ArcaneChat независимую проверку на наличие уязвимостей безопасности?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#для-чего-нужен-параметр-следить-за-папкой-отправлено">Для чего нужен параметр “следить за папкой Отправлено”?</a></li>
|
||||
<li><a href="#почему-я-могу-отключить-следить-за-папкой-delta-chat">Почему я могу отключить “следить за папкой ArcaneChat”?</a></li>
|
||||
<li><a href="#совместим-ли-delta-chat-с-protonmail--tutanota--criptext">Совместим ли ArcaneChat с Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#как-я-могу-удалить-аккаунт">Как я могу удалить аккаунт?</a></li>
|
||||
<li><a href="#remove-account">Как я могу удалить аккаунт?</a></li>
|
||||
<li><a href="#меня-интересуют-технические-детали-можете-рассказать-больше">Меня интересуют технические детали. Можете рассказать больше?</a></li>
|
||||
<li><a href="#как-финансируются-разработки-delta-chat">Как финансируются разработки ArcaneChat?</a></li>
|
||||
</ul>
|
||||
@@ -543,12 +543,12 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Yes, ArcaneChat 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 ArcaneChat to fetch data in the background.
|
||||
Push notifications are automatically activated for iOS users because
|
||||
<a href="#privacy-notifications">ArcaneChat’s privacy-preserving Push Notification system</a>
|
||||
does not expose data to Apple that it doesn’t already have.</p>
|
||||
<p>Да, ArcaneChat автоматически использует Push-уведомления для профилей <a href="https://delta.chat/chatmail">chatmail</a>.
|
||||
И нет, на устройствах Apple нет альтернативы для обеспечения мгновенной доставки сообщений,
|
||||
поскольку устройства Apple не позволяют ArcaneChat запрашивать данные в фоновом режиме.
|
||||
Push-уведомления автоматически активируются для пользователей iOS, потому что
|
||||
<a href="#privacy-notifications">Система Push-уведомлений ArcaneChat, обеспечивающая конфиденциальность</a>
|
||||
не передает данные Apple, которых у нее еще нет.</p>
|
||||
|
||||
<h3 id="android-push">
|
||||
|
||||
@@ -1150,10 +1150,10 @@ Signal и большинство других мессенджеров, подд
|
||||
<p>В любом случае, сквозное шифрование ArcaneChat использует <a href="#openpgp-secure">безопасное подмножество OpenPGP</a>
|
||||
которое прошло <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">независимую проверку безопасности</a>.</p>
|
||||
|
||||
<h3 id="можно-ли-повторно-использовать-существующий-секретный-ключ">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Можно ли повторно использовать существующий секретный ключ? <a href="#можно-ли-повторно-использовать-существующий-секретный-ключ" class="anchor"></a>
|
||||
Можно ли повторно использовать существующий секретный ключ? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1204,11 +1204,11 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
<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
|
||||
<p>В марте 2024 года мы получили подробный анализ безопасности от исследовательской группы
|
||||
Applied Cryptography в ETH Цюрихе и устранили все выявленные проблемы.
|
||||
Читайте наш пост в блоге о <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-End encryption</a> для более подробной информации и
|
||||
<a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of ArcaneChat</a>
|
||||
research paper published afterwards.</p>
|
||||
научной статьи, опубликованной позже.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>В Апреле 2023 г. мы исправили проблемы безопасности и конфиденциальности в веб-интерфейсе,
|
||||
@@ -1279,7 +1279,7 @@ Chat Rust <a href="https://github.com/deltachat/deltachat-core-rust/">ядро</
|
||||
и подождите немного, пока не появится QR-код</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>На втором устройстве, <a href="https://get.delta.chat">установите ArcaneChat</a></p>
|
||||
<p>На втором устройстве, <a href="https://github.com/ArcaneChat">установите ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>На втором устройстве запустите ArcaneChat, выберите <strong>Добавить как второе устройство</strong> и отсканируйте QR-код со старого устройства</p>
|
||||
@@ -1378,7 +1378,7 @@ PIN-код разблокировки экрана, графический кл
|
||||
<li>Если вам нужен веб-клиент, поскольку вы не можете устанавливать программное обеспечение на
|
||||
компьютере, на которым вы работаете, вы можете использовать портативный настольный клиент Windows
|
||||
или AppImage для Linux. Вы можете найти их на
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1767,7 +1767,7 @@ PIN-код разблокировки экрана, графический кл
|
||||
почтовую программу (например, Thunderbird) вместе с приложением ArcaneChat.</p>
|
||||
|
||||
<p>Однако мы рекомендуем использовать настольный клиент ArcaneChat; вы можете скачать его
|
||||
на <a href="https://get.delta.chat">get.delta.chat</a>. Опция для слежения за папкой “Отправлено”
|
||||
на <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. Опция для слежения за папкой “Отправлено”
|
||||
может быть убрана в будущем. Эта функция была представлена в то время, когда не было
|
||||
настольного клиента ArcaneChat доступного на всех платформах.</p>
|
||||
|
||||
@@ -1803,22 +1803,38 @@ Protonmail, Tutanota или Criptext. Однако, эти сообщения н
|
||||
<a href="https://autocrypt.org/dev-status.html">Приложением эл.почты с поддержкой Autocrypt</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="как-я-могу-удалить-аккаунт">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Как я могу удалить аккаунт? <a href="#как-я-могу-удалить-аккаунт" class="anchor"></a>
|
||||
Как я могу удалить аккаунт? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Поскольку вы используете учётную запись эл.почты для ArcaneChat,
|
||||
способ удаления своей учетной записи зависит от вашего провайдера эл.почты.
|
||||
Мы не имеем никакого контроля над вашей учётной записью эл.почты,
|
||||
поэтому, к сожалению, мы не можем вам с этим помочь.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/ru/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Если вы хотите сохранить учётную запись,
|
||||
но удаляете ArcaneChat,
|
||||
перед удалением ArcaneChat рекомендуется выйти из группового чата.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="меня-интересуют-технические-детали-можете-рассказать-больше">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#môžem-znova-použiť-svoj-existujúci-súkromný-kľúč">Môžem znova použiť svoj existujúci súkromný kľúč?</a></li>
|
||||
<li><a href="#importkey">Môžem znova použiť svoj existujúci súkromný kľúč?</a></li>
|
||||
<li><a href="#nemôžem-importovať-môj-existujúci-pgp-kľúč-do-delta-chat">Nemôžem importovať môj existujúci PGP kľúč do ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Was ArcaneChat independently audited for security vulnerabilities?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#prečo-si-môžem-vybrať-sledovanie-priečinka-odoslané">Prečo si môžem vybrať sledovanie priečinka „Odoslané“?</a></li>
|
||||
<li><a href="#prečo-sa-môžem-rozhodnúť-nesledovať-priečinok-deltachat">Prečo sa môžem rozhodnúť nesledovať priečinok DeltaChat?</a></li>
|
||||
<li><a href="#je-delta-chat-kompatibilný-s-protonmail--tutanota--criptext">Je ArcaneChat kompatibilný s Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#how-can-i-delete-my-account">How can I delete my account?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my account?</a></li>
|
||||
<li><a href="#zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">Zaujímajú ma technické detaily. Môžete mi povedať viac?</a></li>
|
||||
<li><a href="#ako-sa-financuje-vývoj-delta-chat">Ako sa financuje vývoj ArcaneChat?</a></li>
|
||||
</ul>
|
||||
@@ -1150,10 +1150,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="môžem-znova-použiť-svoj-existujúci-súkromný-kľúč">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Môžem znova použiť svoj existujúci súkromný kľúč? <a href="#môžem-znova-použiť-svoj-existujúci-súkromný-kľúč" class="anchor"></a>
|
||||
Môžem znova použiť svoj existujúci súkromný kľúč? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1283,7 +1283,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, <a href="https://get.delta.chat">install ArcaneChat</a></p>
|
||||
<p>On the second device, <a href="https://github.com/ArcaneChat">install ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1386,7 +1386,7 @@ obchodov s aplikáciami (repozitáre Google Play/iOS/Windows/macOS/Linux) ako na
|
||||
<li>Ak potrebujete webového klienta, pretože nemáte povolené inštalovať softvér
|
||||
na počítač, s ktorým pracujete, môžete použiť prenosného klienta Windows Desktop Client,
|
||||
alebo AppImage pre Linux. Nájdete ich na
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1796,7 +1796,7 @@ poštový program (napríklad Thunderbird) vedľa vašej aplikácie ArcaneChat a
|
||||
aby sa zúčastňoval chatových konverzácií.</p>
|
||||
|
||||
<p>Odporúčame však použiť ArcaneChat Desktop Client; môžete si ho stiahnuť
|
||||
na <a href="https://get.delta.chat">get.delta.chat</a>. Možnosť sledovať „Odoslané“
|
||||
na <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. Možnosť sledovať „Odoslané“
|
||||
priečinok môže v budúcnosti zmiznúť. Bolo to zavedené v čase, kedy nebol
|
||||
ArcaneChat Desktop dostupný na všetkých platformách.</p>
|
||||
|
||||
@@ -1834,22 +1834,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-delete-my-account">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my account? <a href="#how-can-i-delete-my-account" class="anchor"></a>
|
||||
How can I delete my account? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As you use an e-mail account for ArcaneChat,
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/sk/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over your e-mail account,
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to keep the account,
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.</p>
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#a-mund-të-ripërdor-kyçin-tim-ekzistues-privat">A mund të ripërdor kyçin tim ekzistues privat?</a></li>
|
||||
<li><a href="#importkey">A mund të ripërdor kyçin tim ekzistues privat?</a></li>
|
||||
<li><a href="#seksportoj-dot-kyçet-e-mi-ekzistues-pgp-në-delta-chat">S’eksportoj dot kyçet e mi ekzistues PGP në ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">A është bërë auditim i pavarur i ArcaneChat-it për cenueshmëri sigurie?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#pse-mund-të-zgjedh-të-vëzhgoj-dosjen-të-dërguar">Pse mund të zgjedh të vëzhgoj dosjen “Të dërguar”?</a></li>
|
||||
<li><a href="#pse-mund-të-zgjedh-të-mos-e-vëzhgoj-dosjen-deltachat">Pse mund të zgjedh të mos e vëzhgoj dosjen DeltaChat?</a></li>
|
||||
<li><a href="#a-është-i-përputhshëm-delta-chat-i-me-protonmail-in--tutanota-n--criptext-in">A është i përputhshëm ArcaneChat-i me Protonmail-in / Tutanota-n / Criptext-in?</a></li>
|
||||
<li><a href="#si-mund-ta-fshij-llogarinë-time">Si mund ta fshij llogarinë time?</a></li>
|
||||
<li><a href="#remove-account">Si mund ta fshij llogarinë time?</a></li>
|
||||
<li><a href="#më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">Më interesojnë hollësitë teknike. Mund të më tregoni diçka më tepër?</a></li>
|
||||
<li><a href="#si-financohet-zhvillimi-i-delta-chat-it">Si financohet zhvillimi i ArcaneChat-it?</a></li>
|
||||
</ul>
|
||||
@@ -1151,10 +1151,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="a-mund-të-ripërdor-kyçin-tim-ekzistues-privat">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
A mund të ripërdor kyçin tim ekzistues privat? <a href="#a-mund-të-ripërdor-kyçin-tim-ekzistues-privat" class="anchor"></a>
|
||||
A mund të ripërdor kyçin tim ekzistues privat? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1283,7 +1283,7 @@ Mund të lexoni <a href="https://delta.chat/assets/blog/2019-first-security-revi
|
||||
dhe prisni një çast sa të shfaqet një kod QR</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Te pajisja e dytë, <a href="https://get.delta.chat">instaloni ArcaneChat-in</a></p>
|
||||
<p>Te pajisja e dytë, <a href="https://github.com/ArcaneChat">instaloni ArcaneChat-in</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Në pajisjen e dytë, nisni ArcaneChat-in, përzgjidhni <strong>Shtoje si Pajisje të Dytë</strong> dhe skanoni kodin QR që nga pajisja e vjetër</p>
|
||||
@@ -1388,7 +1388,7 @@ përkatës.</li>
|
||||
<li>Nëse ju duhet një Klient Web, ngaqë s’keni leje të instaloni software në
|
||||
kompjuterin me të cilin punoni, mund të përdorni Klientin e bartshëm për
|
||||
Windows Desktop, ose AppImage për Linux. Mund t’i gjeni te
|
||||
<a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1806,7 +1806,7 @@ përdoret tjetër program email-sh (bie fjala, Thunderbird-i) në krah të
|
||||
aplikacionit tuaj ArcaneChat, dhe doni që MUA juaj të marrë pjesë në biseda.</p>
|
||||
|
||||
<p>Sidoqoftë, rekomandojmë të përdoret Klienti Desktop i ArcaneChat-it; mund ta
|
||||
shkarkoni që nga <a href="https://get.delta.chat">get.delta.chat</a>. Mundësia për vëzhgim
|
||||
shkarkoni që nga <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. Mundësia për vëzhgim
|
||||
të dosjes “Të dërguar” mund të hiqet në të ardhmen. Qe prurë në kohët kur s’kish
|
||||
klient Desktop ArcaneChat për krejt platformat.</p>
|
||||
|
||||
@@ -1845,22 +1845,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="si-mund-ta-fshij-llogarinë-time">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Si mund ta fshij llogarinë time? <a href="#si-mund-ta-fshij-llogarinë-time" class="anchor"></a>
|
||||
Si mund ta fshij llogarinë time? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ngaqë për ArcaneChat-in përdorni një llogari email,
|
||||
se si mund të fshini llogarinë tuaj, varet nga shërbimi juaj email.
|
||||
Nuk kemi fuqi mbi llogarinë tuaj email,
|
||||
ndaj, mjerisht, s’mund t’ju ndihmojmë për këtë.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/sq/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Nëse doni ta mbani llogarinë,
|
||||
por të çinstaloni ArcaneChat-in,
|
||||
rekomandohet të braktisni çfarëdo grupi fjalosjeje, para çinstalimit të ArcaneChat-it.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">Як забезпечити наскрізне шифрування та видалення повідомлень?</a></li>
|
||||
<li><a href="#pfs">Чи підтримує ArcaneChat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
|
||||
<li><a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">Чи є наскрізне шифрування ArcaneChat таким же безпечним, як Signal?</a></li>
|
||||
<li><a href="#чи-можна-повторно-використовувати-існуючий-закритий-ключ">Чи можна повторно використовувати існуючий закритий ключ?</a></li>
|
||||
<li><a href="#importkey">Чи можна повторно використовувати існуючий закритий ключ?</a></li>
|
||||
<li><a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">Я не можу імпортувати свій існуючий PGP ключ у ArcaneChat.</a></li>
|
||||
<li><a href="#security-audits">Чи проходив ArcaneChat незалежний аудит на наявність вразливостей у безпеці?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#чому-я-можу-обрати-стеження-за--папкою-надіслані">Чому я можу обрати стеження за папкою “Надіслані”?</a></li>
|
||||
<li><a href="#чому-я-можу-відмовитись-від-стеження-за--папкою-deltachat">Чому я можу відмовитись від стеження за папкою DeltaChat?</a></li>
|
||||
<li><a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">Чи сумісний ArcaneChat із Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#як-мені-видалити-свій-обліковий-запис">Як мені видалити свій обліковий запис?</a></li>
|
||||
<li><a href="#remove-account">Як мені видалити свій обліковий запис?</a></li>
|
||||
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
|
||||
<li><a href="#як-фінансується-розробка-delta-chat">Як фінансується розробка ArcaneChat?</a></li>
|
||||
</ul>
|
||||
@@ -831,10 +831,10 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
|
||||
|
||||
<p>У будь-якому випадку, наскрізне шифрування ArcaneChat використовує <a href="#openpgp-secure">безпечну підмножину OpenPGP</a> який пройшов <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">незалежний аудит безпеки</a>.</p>
|
||||
|
||||
<h3 id="чи-можна-повторно-використовувати-існуючий-закритий-ключ">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
Чи можна повторно використовувати існуючий закритий ключ? <a href="#чи-можна-повторно-використовувати-існуючий-закритий-ключ" class="anchor"></a>
|
||||
Чи можна повторно використовувати існуючий закритий ключ? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -917,7 +917,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<p>На першому пристрої перейдіть до <strong>Налаштування → Додати другий пристрій</strong>, розблокуйте екран, якщо потрібно і трохи зачекайте, поки не з’явиться QR-код</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>На другому пристрої <a href="https://get.delta.chat">встановіть ArcaneChat</a></p>
|
||||
<p>На другому пристрої <a href="https://github.com/ArcaneChat">встановіть ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>На другому пристрої запустіть ArcaneChat, виберіть <strong>Додати як другий пристрій</strong> і відскануйте QR-код зі старого пристрою</p>
|
||||
@@ -995,7 +995,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<ul>
|
||||
<li>Немає найближчих планів, крім попередніх думок.</li>
|
||||
<li>Є 2-3 способи створити веб-клієнт ArcaneChat, але всі вони вимагають значної роботи. На даний момент ми зосереджені на отриманні стабільних релізів в усіх магазини додатків (Google Play / IOS / Windows / MacOS / репозитаріїв Linux), як нативних додатків.</li>
|
||||
<li>Якщо вам потрібен веб-клієнт, через заборону встановлювати програмне забезпечення на комп’ютері, з яким ви працюєте, ви можете використовувати портативний клієнт Windows Desktop або AppImage для Linux. Ви можете знайти їх на <a href="https://get.delta.chat">get.delta.chat</a>.</li>
|
||||
<li>Якщо вам потрібен веб-клієнт, через заборону встановлювати програмне забезпечення на комп’ютері, з яким ви працюєте, ви можете використовувати портативний клієнт Windows Desktop або AppImage для Linux. Ви можете знайти їх на <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1316,7 +1316,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
<p>Єдина причина, через яку захочеться стежити за папкою Надіслане, полягає в тому, що якщо ви використовуєте іншу поштову програму (наприклад, Thunderbird) разом із вашим додатком ArcaneChat і хочете, щоб ваш поштовий клієнт брав участь у розмовах.</p>
|
||||
|
||||
<p>Однак ми рекомендуємо використовувати клієнт ArcaneChat Desktop; Ви можете завантажити його на <a href="https://get.delta.chat">get.delta.chat</a>. Можливість стеження папки “Надіслане” може зникнути в майбутньому. Вона був представлена у той час, коли на всіх платформах ще не було клієнта ArcaneChat Desktop.</p>
|
||||
<p>Однак ми рекомендуємо використовувати клієнт ArcaneChat Desktop; Ви можете завантажити його на <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a>. Можливість стеження папки “Надіслане” може зникнути в майбутньому. Вона був представлена у той час, коли на всіх платформах ще не було клієнта ArcaneChat Desktop.</p>
|
||||
|
||||
<h3 id="чому-я-можу-відмовитись-від-стеження-за--папкою-deltachat">
|
||||
|
||||
@@ -1344,17 +1344,38 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<li>ArcaneChat може наскрізно шифрувати через будь-якого провайдера електронної пошти з будь-якою <a href="https://autocrypt.org/dev-status.html">поштовою програмою з підтримкою автошифрування</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="як-мені-видалити-свій-обліковий-запис">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
Як мені видалити свій обліковий запис? <a href="#як-мені-видалити-свій-обліковий-запис" class="anchor"></a>
|
||||
Як мені видалити свій обліковий запис? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Оскільки ви використовуєте обліковий запис електронної пошти для ArcaneChat, спосіб видалення облікового запису залежить від вашого постачальника послуг електронної пошти. Ми не маємо жодного контролю над вашим обліковим записом електронної пошти, тому, на жаль, ми не можемо вам у цьому допомогти.</p>
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/uk/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>Якщо ви хочете зберегти обліковий запис, але видалити ArcaneChat, перед видаленням ArcaneChat рекомендується покинути будь-які групові чати.</p>
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</a></li>
|
||||
<li><a href="#pfs">Does ArcaneChat support Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of ArcaneChat as safe as Signal?</a></li>
|
||||
<li><a href="#我可以重复使用现有的私钥吗">我可以重复使用现有的私钥吗?</a></li>
|
||||
<li><a href="#importkey">我可以重复使用现有的私钥吗?</a></li>
|
||||
<li><a href="#我无法将现有的-pgp-密钥导入-delta-chat">我无法将现有的 PGP 密钥导入 ArcaneChat。</a></li>
|
||||
<li><a href="#security-audits">Was ArcaneChat independently audited for security vulnerabilities?</a></li>
|
||||
</ul>
|
||||
@@ -97,7 +97,7 @@
|
||||
<li><a href="#为什么我可以选择监视已发送文件夹">为什么我可以选择监视“已发送”文件夹?</a></li>
|
||||
<li><a href="#为什么我可以选择不监视-deltachat-文件夹">为什么我可以选择不监视 DeltaChat 文件夹?</a></li>
|
||||
<li><a href="#delta-chat-与-protonmail--tutanota--criptext-兼容吗">ArcaneChat 与 Protonmail / Tutanota / Criptext 兼容吗?</a></li>
|
||||
<li><a href="#如何删除我的账户">如何删除我的账户?</a></li>
|
||||
<li><a href="#remove-account">如何删除我的账户?</a></li>
|
||||
<li><a href="#我对技术细节很感兴趣能告诉我更多吗">我对技术细节很感兴趣。能告诉我更多吗?</a></li>
|
||||
<li><a href="#delta-chat-的开发是如何被资助的">ArcaneChat 的开发是如何被资助的?</a></li>
|
||||
</ul>
|
||||
@@ -1117,10 +1117,10 @@ past encrypted messages.</p>
|
||||
<p>In any case, ArcaneChat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="我可以重复使用现有的私钥吗">
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
我可以重复使用现有的私钥吗? <a href="#我可以重复使用现有的私钥吗" class="anchor"></a>
|
||||
我可以重复使用现有的私钥吗? <a href="#importkey" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1240,7 +1240,7 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
||||
and wait a moment until a QR code is shown</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, <a href="https://get.delta.chat">install ArcaneChat</a></p>
|
||||
<p>On the second device, <a href="https://github.com/ArcaneChat">install ArcaneChat</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>On the second device, start ArcaneChat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
||||
@@ -1338,7 +1338,7 @@ end-to-end encrypted messages with your communication partners.</li>
|
||||
<ul>
|
||||
<li>目前没有计划,但有一些初步的想法。</li>
|
||||
<li>有 2-3 种途径来实现 ArcaneChat Web 客户端,但是它们都需要巨大的工作量。目前,我们专注于将稳定的版本作为本地应用程序发布到所有应用程序商店(Google Play/iOS/Windows/macOS/Linux 仓库)。</li>
|
||||
<li>如果是因为不能在工作的电脑上安装软件而需要一个 Web 客户端,您可以使用便携版的 Windows 桌面客户端,或者在 Linux 上使用 AppImage 版。您可以在 <a href="https://get.delta.chat">get.delta.chat</a> 找到它们。</li>
|
||||
<li>如果是因为不能在工作的电脑上安装软件而需要一个 Web 客户端,您可以使用便携版的 Windows 桌面客户端,或者在 Linux 上使用 AppImage 版。您可以在 <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a> 找到它们。</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="webxdc">
|
||||
@@ -1716,7 +1716,7 @@ if you set a <a href="#signature">signature text</a>.</p>
|
||||
|
||||
<p>监视已发送文件夹的唯一原因是:您在使用ArcaneChat软件的同时也使用其他的邮件应用程序(比如 Thunderbird),并且想让邮件分发代理参与聊天对话。</p>
|
||||
|
||||
<p>不过,我们推荐使用 ArcaneChat 桌面客户端;您可以在 <a href="https://get.delta.chat">get.delta.chat</a> 下载它。监视“已发送”文件夹的选项是在还没有 ArcaneChat 桌面客户端的时候引入的,这个选项可能会在未来消失。</p>
|
||||
<p>不过,我们推荐使用 ArcaneChat 桌面客户端;您可以在 <a href="https://github.com/ArcaneChat">github.com/ArcaneChat</a> 下载它。监视“已发送”文件夹的选项是在还没有 ArcaneChat 桌面客户端的时候引入的,这个选项可能会在未来消失。</p>
|
||||
|
||||
<h3 id="为什么我可以选择不监视-deltachat-文件夹">
|
||||
|
||||
@@ -1749,22 +1749,38 @@ uses.</li>
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="如何删除我的账户">
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
如何删除我的账户? <a href="#如何删除我的账户" class="anchor"></a>
|
||||
如何删除我的账户? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As you use an e-mail account for ArcaneChat,
|
||||
<p>If you use a default chat profile
|
||||
you can simply uninstall the app.
|
||||
This will automatically trigger deletion of all associated account data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> for the default onboarding server,
|
||||
or the respective page from your chosen <a href="https://delta.chat/zh_CN/chatmail">3rd party chatmail server</a>.</p>
|
||||
|
||||
<p>If you have set up your chat profile on multiple devices
|
||||
you need to remove it from all devices.</p>
|
||||
|
||||
<p>If you are using more than one account,
|
||||
but don’t want to get rid of all of them,
|
||||
you can remove it in the account switcher menu (on android and iOS),
|
||||
or in the sidebar with a right click (in the desktop client).</p>
|
||||
|
||||
<p>Accounts on <a href="https://providers.delta.chat">classic e-mail providers</a>
|
||||
will not be deleted automatically;
|
||||
how you can delete your account depends on your e-mail provider.
|
||||
We don’t have any control over your e-mail account,
|
||||
We don’t have any control over e-mail accounts at those providers,
|
||||
so unfortunately we can’t help you with that.</p>
|
||||
|
||||
<p>If you want to keep the account,
|
||||
<p>If you want to continue using a classic e-mail account with other apps,
|
||||
but uninstall ArcaneChat,
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.</p>
|
||||
it is recommended to leave any group chat before uninstalling ArcaneChat.
|
||||
Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
|
||||
<h3 id="我对技术细节很感兴趣能告诉我更多吗">
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ public class DcAccounts {
|
||||
public native void stopIo ();
|
||||
public native void maybeNetwork ();
|
||||
public native void setPushDeviceToken (String token);
|
||||
public native boolean backgroundFetch (int timeoutSeconds);
|
||||
|
||||
public native int addAccount ();
|
||||
public native int migrateAccount (String dbfile);
|
||||
|
||||
@@ -31,6 +31,7 @@ public class DcContext {
|
||||
public final static int DC_EVENT_WEBXDC_STATUS_UPDATE = 2120;
|
||||
public final static int DC_EVENT_WEBXDC_INSTANCE_DELETED = 2121;
|
||||
public final static int DC_EVENT_WEBXDC_REALTIME_DATA = 2150;
|
||||
public final static int DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE = 2200;
|
||||
|
||||
public final static int DC_IMEX_EXPORT_SELF_KEYS = 1;
|
||||
public final static int DC_IMEX_IMPORT_SELF_KEYS = 2;
|
||||
@@ -55,6 +56,7 @@ public class DcContext {
|
||||
public final static int DC_QR_BACKUP = 251;
|
||||
public final static int DC_QR_BACKUP2 = 252;
|
||||
public final static int DC_QR_WEBRTC = 260;
|
||||
public final static int DC_QR_PROXY = 271;
|
||||
public final static int DC_QR_ADDR = 320;
|
||||
public final static int DC_QR_TEXT = 330;
|
||||
public final static int DC_QR_URL = 332;
|
||||
@@ -182,7 +184,6 @@ public class DcContext {
|
||||
public native int[] searchMsgs (int chat_id, String query);
|
||||
public native int[] getFreshMsgs ();
|
||||
public native int[] getChatMedia (int chat_id, int type1, int type2, int type3);
|
||||
public native int getNextMedia (int msg_id, int dir, int type1, int type2, int type3);
|
||||
public native int[] getChatContacts (int chat_id);
|
||||
public native int getChatEphemeralTimer (int chat_id);
|
||||
public native boolean setChatEphemeralTimer (int chat_id, int timer);
|
||||
@@ -248,6 +249,14 @@ public class DcContext {
|
||||
return ret.trim();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
String displayname = getConfig("displayname");
|
||||
if (displayname.isEmpty()) {
|
||||
displayname = getContact(DcContact.DC_CONTACT_ID_SELF).getAddr();
|
||||
}
|
||||
return displayname;
|
||||
}
|
||||
|
||||
public boolean isCommunity() {
|
||||
return getConfigInt("is_community") == 1;
|
||||
}
|
||||
@@ -277,21 +286,6 @@ public class DcContext {
|
||||
setConfigInt("is_muted", muted? 1 : 0);
|
||||
}
|
||||
|
||||
// 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*/);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isGmailOauth2Addr(String addr) {
|
||||
final String oauth2url = getOauth2Url(addr, "chat.delta:/foo");
|
||||
return isGmailOauth2Url(oauth2url);
|
||||
@@ -301,6 +295,12 @@ public class DcContext {
|
||||
return oauth2url.startsWith("https://accounts.google.com/");
|
||||
}
|
||||
|
||||
public void restartIo() {
|
||||
if (!isEnabled()) return;
|
||||
stopIo();
|
||||
startIo();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if at least one chat has location streaming enabled
|
||||
*/
|
||||
|
||||
@@ -138,6 +138,10 @@ public class Rpc {
|
||||
getResult("leave_webxdc_realtime", accountId, instanceMessageId);
|
||||
}
|
||||
|
||||
public int getAccountFileSize(int accountId) throws RpcException {
|
||||
return getResult("get_account_file_size", accountId).getAsInt();
|
||||
}
|
||||
|
||||
private static class Request {
|
||||
private final String jsonrpc = "2.0";
|
||||
public final String method;
|
||||
|
||||
@@ -186,7 +186,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
if (event.getId() == DcContext.DC_EVENT_CONNECTIVITY_CHANGED) {
|
||||
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY)
|
||||
.setSummary(DcHelper.getConnectivitySummary(getActivity(), R.string.connectivity_connected));
|
||||
.setSummary(DcHelper.getConnectivitySummary(getActivity(), getString(R.string.connectivity_connected)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
this.findPreference(PREFERENCE_CATEGORY_PRIVACY)
|
||||
.setSummary(PrivacyPreferenceFragment.getSummary(getActivity()));
|
||||
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY)
|
||||
.setSummary(DcHelper.getConnectivitySummary(getActivity(), R.string.connectivity_connected));
|
||||
.setSummary(DcHelper.getConnectivitySummary(getActivity(), getString(R.string.connectivity_connected)));
|
||||
this.findPreference(PREFERENCE_CATEGORY_HELP)
|
||||
.setSummary(AdvancedPreferenceFragment.getVersion(getActivity()));
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.PowerManager;
|
||||
import android.os.Vibrator;
|
||||
import android.provider.Browser;
|
||||
import android.text.Editable;
|
||||
@@ -302,12 +301,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId);
|
||||
|
||||
attachmentManager.onResume();
|
||||
|
||||
// action bar might be hidden by workaround in onStop()
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar != null && !supportActionBar.isShowing()) {
|
||||
supportActionBar.show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -322,23 +315,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
AudioSlidePlayer.stopAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
|
||||
// hack/workaround to fix https://github.com/deltachat/deltachat-android/issues/2798
|
||||
// the real cause of the problem is still unknown but hiding the action bar here fixes it
|
||||
if ( Build.VERSION.SDK_INT >= 34) {
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar != null && container.isKeyboardOpen()) {
|
||||
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||
if (!pm.isInteractive()) {
|
||||
supportActionBar.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
Log.i(TAG, "onConfigurationChanged(" + newConfig.orientation + ")");
|
||||
@@ -1056,18 +1032,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);
|
||||
|
||||
@@ -20,6 +20,7 @@ import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
|
||||
import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ADDRESS;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SERVER_FLAGS;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId;
|
||||
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedTitle;
|
||||
@@ -66,6 +67,7 @@ import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.connect.DirectShareUtil;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
|
||||
import org.thoughtcrime.securesms.qr.QrActivity;
|
||||
import org.thoughtcrime.securesms.qr.QrCodeHandler;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
@@ -121,7 +123,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
// Util.copy(inputStream, new FileOutputStream(outputFile));
|
||||
// msg.setFile(outputFile, "image/jpeg");
|
||||
|
||||
msg.setText(getString(R.string.update_1_46_android, "https://get.delta.chat/#changelogs"));
|
||||
msg.setText(getString(R.string.update_1_46_android, "https://raw.githubusercontent.com/ArcaneChat/android/refs/heads/main/CHANGELOG.md"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
@@ -186,7 +188,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
TooltipCompat.setTooltipText(selfAvatar, getText(R.string.switch_account));
|
||||
selfAvatar.setOnClickListener(v -> AccountManager.getInstance().showSwitchAccountMenu(this));
|
||||
title.setOnClickListener(v -> {
|
||||
findViewById(R.id.avatar_and_title).setOnClickListener(v -> {
|
||||
if (!isRelayingMessageContent(this)) {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this);
|
||||
}
|
||||
@@ -265,7 +267,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
if (getIntent().getBooleanExtra(CLEAR_NOTIFICATIONS, false)) {
|
||||
DcHelper.getNotificationCenter(this).removeAllNotifiations(accountId);
|
||||
DcHelper.getNotificationCenter(this).removeAllNotifications(accountId);
|
||||
}
|
||||
if (accountId != dcContext.getAccountId()) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, accountId);
|
||||
@@ -299,19 +301,15 @@ 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);
|
||||
title.setText(DcHelper.getContext(this).getName());
|
||||
selfAvatar.setConnectivity(DcHelper.getContext(this).getConnectivity());
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshAvatar() {
|
||||
if (selfAvatarContainer == null) return;
|
||||
|
||||
if (isRelayingMessageContent(this)) {
|
||||
selfAvatarContainer.setVisibility(View.GONE);
|
||||
} else {
|
||||
@@ -377,20 +375,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
if (!isRelayingMessageContent(this)) {
|
||||
inflater.inflate(R.menu.text_secure_normal, menu);
|
||||
MenuItem item = menu.findItem(R.id.menu_global_map);
|
||||
if (Prefs.isLocationStreamingEnabled(this)) {
|
||||
item.setVisible(true);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
menu.findItem(R.id.menu_global_map).setVisible(Prefs.isLocationStreamingEnabled(this));
|
||||
menu.findItem(R.id.menu_proxy_settings).setVisible(!TextUtils.isEmpty(DcHelper.get(this, CONFIG_PROXY_URL)));
|
||||
MenuCompat.setGroupDividerEnabled(menu, true);
|
||||
}
|
||||
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
@@ -453,6 +440,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
case R.id.menu_global_map:
|
||||
WebxdcActivity.openMaps(this, 0);
|
||||
return true;
|
||||
case R.id.menu_proxy_settings:
|
||||
startActivity(new Intent(this, ProxySettingsActivity.class));
|
||||
return true;
|
||||
case android.R.id.home:
|
||||
onBackPressed();
|
||||
return true;
|
||||
@@ -460,10 +450,10 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
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");
|
||||
handleShowBot("juegos@buzon.uy", "OPENPGP4FPR:d3d403a734be71fe9293a00311fef80dbe5dbc89#a=juegos%40buzon.uy&n=&i=WQZY-8FODS3&s=ZQBkaclFzao");
|
||||
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");
|
||||
handleShowBot("puente@buzon.uy", "OPENPGP4FPR:4B41E5AFAF78A0C71DB56138D5BEFED00A45F97A#a=puente%40buzon.uy&n=Public%20Bots&i=ZC_oaJtuvJP&s=5SE96rRovsK");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,9 @@ import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
@@ -13,6 +15,7 @@ import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.text.util.Linkify;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
@@ -47,6 +50,7 @@ import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||
import org.thoughtcrime.securesms.profiles.AvatarHelper;
|
||||
import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
|
||||
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
|
||||
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
|
||||
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
@@ -132,13 +136,29 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
handleIntent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
menu.clear();
|
||||
getMenuInflater().inflate(R.menu.instant_onboarding_menu, menu);
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
case R.id.menu_proxy_settings:
|
||||
startActivity(new Intent(this, ProxySettingsActivity.class));
|
||||
return true;
|
||||
case R.id.menu_view_log:
|
||||
startActivity(new Intent(this, LogViewActivity.class));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -290,32 +310,15 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
signUpBtn.setOnClickListener(view -> createProfile());
|
||||
|
||||
Button otherOptionsBtn = findViewById(R.id.other_options_button);
|
||||
otherOptionsBtn.setOnClickListener(view -> showOtherOptionsDialog());
|
||||
}
|
||||
|
||||
private void showOtherOptionsDialog() {
|
||||
View view = View.inflate(this, R.layout.signup_options_view, null);
|
||||
AlertDialog signUpDialog = new AlertDialog.Builder(this)
|
||||
.setView(view)
|
||||
.setTitle(R.string.instant_onboarding_show_more_instances)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.create();
|
||||
|
||||
view.findViewById(R.id.use_other_server).setOnClickListener((v) -> {
|
||||
findViewById(R.id.use_other_server).setOnClickListener((v) -> {
|
||||
WebViewActivity.openUrlInBrowser(this, INSTANCES_URL);
|
||||
signUpDialog.dismiss();
|
||||
});
|
||||
view.findViewById(R.id.login_button).setOnClickListener((v) -> {
|
||||
findViewById(R.id.login_button).setOnClickListener((v) -> {
|
||||
startRegistrationActivity();
|
||||
signUpDialog.dismiss();
|
||||
});
|
||||
view.findViewById(R.id.scan_qr_button).setOnClickListener((v) -> {
|
||||
findViewById(R.id.scan_qr_button).setOnClickListener((v) -> {
|
||||
new IntentIntegrator(this).setCaptureActivity(RegistrationQrActivity.class).initiateScan();
|
||||
signUpDialog.dismiss();
|
||||
});
|
||||
|
||||
signUpDialog.show();
|
||||
}
|
||||
|
||||
private void startRegistrationActivity() {
|
||||
@@ -330,7 +333,11 @@ 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));
|
||||
|
||||
try (TypedArray typedArray = obtainStyledAttributes(new int[]{R.attr.colorAccent})) {
|
||||
privacyPolicyBtn.setTextColor(typedArray.getColor(0, Color.BLACK));
|
||||
}
|
||||
|
||||
if (DEFAULT_CHATMAIL_HOST.equals(providerHost)) {
|
||||
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_default2, providerHost));
|
||||
} else {
|
||||
@@ -373,7 +380,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
progressUpdate((int)progress);
|
||||
} else if (progress==1000/*done*/) {
|
||||
DcHelper.getAccounts(this).startIo();
|
||||
dcContext.assumeSingleDevice();
|
||||
progressSuccess();
|
||||
}
|
||||
}
|
||||
@@ -386,7 +392,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
private void progressError(String data2) {
|
||||
progressDialog.dismiss();
|
||||
maybeShowConfigurationError(this, data2);
|
||||
WelcomeActivity.maybeShowConfigurationError(this, data2);
|
||||
}
|
||||
|
||||
private void progressSuccess() {
|
||||
@@ -399,22 +405,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
finishAffinity();
|
||||
}
|
||||
|
||||
public static void maybeShowConfigurationError(Activity activity, String data2) {
|
||||
if (data2 != null && !data2.isEmpty()) {
|
||||
AlertDialog d = new AlertDialog.Builder(activity)
|
||||
.setMessage(data2)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.create();
|
||||
d.show();
|
||||
try {
|
||||
//noinspection ConstantConditions
|
||||
Linkify.addLinks((TextView) d.findViewById(android.R.id.message), Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES);
|
||||
} catch(NullPointerException e) {
|
||||
Log.e(TAG, "Linkify failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private void createProfile() {
|
||||
if (TextUtils.isEmpty(this.name.getText())) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActivityManager;
|
||||
import android.content.Context;
|
||||
@@ -35,6 +36,7 @@ import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.content.PermissionChecker;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
@@ -255,6 +257,13 @@ public class LogViewFragment extends Fragment {
|
||||
builder.append("rtl=").append(isRtl).append("\n");
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
boolean notifPermGranted = PermissionChecker.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PermissionChecker.PERMISSION_GRANTED;
|
||||
builder.append("post-notifications-granted=").append(notifPermGranted).append("\n");
|
||||
} else {
|
||||
builder.append("post-notifications-granted=<not needed>").append("\n");
|
||||
}
|
||||
|
||||
final String token = FcmReceiveService.getToken();
|
||||
builder.append("push-enabled=").append(Prefs.isPushEnabled(context)).append("\n");
|
||||
builder.append("push-token=").append(token == null ? "<empty>" : token).append("\n");
|
||||
|
||||
@@ -12,11 +12,7 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_SECURITY;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_SERVER;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_USER;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SERVER_FLAGS;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_ENABLED;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_HOST;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PASSWORD;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PORT;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_USER;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.getContext;
|
||||
import static org.thoughtcrime.securesms.service.IPCAddAccountsService.ACCOUNT_DATA;
|
||||
|
||||
@@ -59,6 +55,7 @@ import com.google.android.material.textfield.TextInputEditText;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
|
||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||
import org.thoughtcrime.securesms.util.IntentUtils;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -96,7 +93,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
Spinner certCheck;
|
||||
|
||||
private SwitchCompat proxySwitch;
|
||||
private Group proxyGroup;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
@@ -127,15 +123,11 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
authMethod = findViewById(R.id.auth_method);
|
||||
certCheck = findViewById(R.id.cert_check);
|
||||
|
||||
proxyGroup = findViewById(R.id.socks5_group);
|
||||
proxySwitch = findViewById(R.id.socks5_switch);
|
||||
proxySwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
proxyGroup.setVisibility(isChecked? advancedGroup.getVisibility() : View.GONE);
|
||||
proxySwitch = findViewById(R.id.proxy_settings);
|
||||
proxySwitch.setOnClickListener(l -> {
|
||||
proxySwitch.setChecked(!proxySwitch.isChecked()); // revert toggle
|
||||
startActivity(new Intent(this, ProxySettingsActivity.class));
|
||||
});
|
||||
TextInputEditText proxyHostInput = findViewById(R.id.socks5_host_text);
|
||||
TextInputEditText proxyPortInput = findViewById(R.id.socks5_port_text);
|
||||
proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER));
|
||||
proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT));
|
||||
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
@@ -161,7 +153,16 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
advancedIcon.setOnClickListener(l -> onAdvancedSettings());
|
||||
advancedIcon.setRotation(45);
|
||||
viewLogText.setOnClickListener((view) -> showLog());
|
||||
|
||||
boolean isConfigured = DcHelper.isConfigured(getApplicationContext());
|
||||
boolean expandAdvanced = false;
|
||||
String strVal;
|
||||
int intVal;
|
||||
|
||||
intVal = DcHelper.getInt(this, CONFIG_PROXY_ENABLED);
|
||||
proxySwitch.setChecked(intVal == 1);
|
||||
expandAdvanced = expandAdvanced || intVal == 1;
|
||||
|
||||
if (isConfigured) {
|
||||
String email = DcHelper.get(this, CONFIG_ADDRESS);
|
||||
emailInput.setText(email);
|
||||
@@ -170,10 +171,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
}
|
||||
passwordInput.setText(DcHelper.get(this, CONFIG_MAIL_PASSWORD));
|
||||
|
||||
boolean expandAdvanced = false;
|
||||
String strVal;
|
||||
int intVal;
|
||||
|
||||
TextInputEditText imapLoginInput = findViewById(R.id.imap_login_text);
|
||||
strVal = DcHelper.get(this, CONFIG_MAIL_USER);
|
||||
imapLoginInput.setText(strVal);
|
||||
@@ -213,17 +210,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
smtpSecurity.setSelection(intVal);
|
||||
expandAdvanced = expandAdvanced || intVal != 0;
|
||||
|
||||
intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED);
|
||||
proxySwitch.setChecked(intVal == 1);
|
||||
expandAdvanced = expandAdvanced || intVal == 1;
|
||||
|
||||
proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST));
|
||||
proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT));
|
||||
TextInputEditText proxyUserInput = findViewById(R.id.socks5_user_text);
|
||||
TextInputEditText proxyPasswordInput = findViewById(R.id.socks5_password_text);
|
||||
proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER));
|
||||
proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD));
|
||||
|
||||
int serverFlags = DcHelper.getInt(this, CONFIG_SERVER_FLAGS);
|
||||
int sel = 0;
|
||||
if((serverFlags&DcContext.DC_LP_AUTH_OAUTH2)!=0) {
|
||||
@@ -242,8 +228,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
int certCheckFlags = DcHelper.getInt(this, "imap_certificate_checks");
|
||||
certCheck.setSelection(certCheckFlags);
|
||||
expandAdvanced = expandAdvanced || certCheckFlags != 0;
|
||||
|
||||
if (expandAdvanced) { onAdvancedSettings(); }
|
||||
} else if (getIntent() != null && getIntent().getBundleExtra(ACCOUNT_DATA) != null) {
|
||||
// Companion app might have sent account data
|
||||
Bundle b = getIntent().getBundleExtra(ACCOUNT_DATA);
|
||||
@@ -261,6 +245,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
}
|
||||
}
|
||||
|
||||
if (expandAdvanced) { onAdvancedSettings(); }
|
||||
registerForEvents();
|
||||
}
|
||||
|
||||
@@ -272,6 +257,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
dynamicTheme.onResume(this);
|
||||
proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1);
|
||||
}
|
||||
|
||||
private void showLog() {
|
||||
@@ -574,12 +560,10 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
private void onAdvancedSettings() {
|
||||
boolean advancedViewVisible = advancedGroup.getVisibility() == View.VISIBLE;
|
||||
if (advancedViewVisible) {
|
||||
proxyGroup.setVisibility(View.GONE);
|
||||
advancedGroup.setVisibility(View.GONE);
|
||||
advancedIcon.setRotation(45);
|
||||
} else {
|
||||
advancedGroup.setVisibility(View.VISIBLE);
|
||||
if (proxySwitch.isChecked()) proxyGroup.setVisibility(View.VISIBLE);
|
||||
advancedIcon.setRotation(0);
|
||||
}
|
||||
}
|
||||
@@ -621,15 +605,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
setConfig(R.id.smtp_port_text, CONFIG_SEND_PORT, true);
|
||||
setConfig(R.id.smtp_login_text, CONFIG_SEND_USER, false);
|
||||
setConfig(R.id.smtp_password_text, CONFIG_SEND_PASSWORD, false);
|
||||
if (proxySwitch.isChecked()) {
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 1);
|
||||
setConfig(R.id.socks5_host_text, CONFIG_SOCKS5_HOST, true);
|
||||
setConfig(R.id.socks5_port_text, CONFIG_SOCKS5_PORT, true);
|
||||
setConfig(R.id.socks5_user_text, CONFIG_SOCKS5_USER, true);
|
||||
setConfig(R.id.socks5_password_text, CONFIG_SOCKS5_PASSWORD, false);
|
||||
} else {
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 0);
|
||||
}
|
||||
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_MAIL_SECURITY, imapSecurity.getSelectedItemPosition());
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_SEND_SECURITY, smtpSecurity.getSelectedItemPosition());
|
||||
|
||||
@@ -69,26 +69,9 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
super.onCreate(bundle);
|
||||
setContentView(R.layout.welcome_activity);
|
||||
|
||||
Button signUpButton = findViewById(R.id.signup_button);
|
||||
Button signInButton = findViewById(R.id.signin_button);
|
||||
|
||||
View view = View.inflate(this, R.layout.login_options_view, null);
|
||||
AlertDialog signInDialog = new AlertDialog.Builder(this)
|
||||
.setView(view)
|
||||
.setTitle(R.string.onboarding_alternative_logins)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.create();
|
||||
view.findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> {
|
||||
startAddAsSecondDeviceActivity();
|
||||
signInDialog.dismiss();
|
||||
});
|
||||
view.findViewById(R.id.backup_button).setOnClickListener((v) -> {
|
||||
startImportBackup();
|
||||
signInDialog.dismiss();
|
||||
});
|
||||
|
||||
signUpButton.setOnClickListener((v) -> startInstantOnboardingActivity());
|
||||
signInButton.setOnClickListener((v) -> signInDialog.show());
|
||||
findViewById(R.id.signup_button).setOnClickListener((v) -> startInstantOnboardingActivity());
|
||||
findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> startAddAsSecondDeviceActivity());
|
||||
findViewById(R.id.backup_button).setOnClickListener((v) -> startImportBackup());
|
||||
|
||||
registerForEvents();
|
||||
initializeActionBar();
|
||||
@@ -296,6 +279,8 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
}
|
||||
|
||||
public static void maybeShowConfigurationError(Activity activity, String data2) {
|
||||
if (activity.isFinishing()) return; // avoid android.view.WindowManager$BadTokenException
|
||||
|
||||
if (data2 != null && !data2.isEmpty()) {
|
||||
AlertDialog d = new AlertDialog.Builder(activity)
|
||||
.setMessage(data2)
|
||||
@@ -342,7 +327,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
}
|
||||
DcHelper.getAccounts(this).startIo();
|
||||
progressSuccess();
|
||||
dcContext.assumeMultiDevice();
|
||||
notificationController.close();
|
||||
cleanupTempBackupFile();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package org.thoughtcrime.securesms.accounts;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
@@ -11,7 +10,6 @@ import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.b44t.messenger.DcAccounts;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
@@ -92,7 +90,7 @@ public class AccountSelectionListAdapter extends RecyclerView.Adapter
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
|
||||
int id = accountList[i];
|
||||
DcContext dcContext = (id == DcContact.DC_CONTACT_ID_ADD_ACCOUNT)? null : accounts.getAccount(id);
|
||||
DcContext dcContext = accounts.getAccount(id);
|
||||
|
||||
ViewHolder holder = (ViewHolder) viewHolder;
|
||||
holder.unbind(glideRequests);
|
||||
|
||||
@@ -4,10 +4,12 @@ import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -16,15 +18,20 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.b44t.messenger.DcAccounts;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
|
||||
import org.thoughtcrime.securesms.ConnectivityActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.AvatarView;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
@@ -100,11 +107,7 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
int accountId = listItem.getAccountId();
|
||||
DcAccounts dcAccounts = DcHelper.getAccounts(getActivity());
|
||||
|
||||
if (accountId == dcAccounts.getSelectedAccount().getAccountId()) {
|
||||
menu.findItem(R.id.delete).setVisible(false);
|
||||
} else {
|
||||
Util.redMenuItem(menu, R.id.delete);
|
||||
}
|
||||
Util.redMenuItem(menu, R.id.delete);
|
||||
|
||||
if (dcAccounts.getAccount(accountId).isMuted()) {
|
||||
menu.findItem(R.id.menu_mute_notifications).setTitle(R.string.menu_unmute);
|
||||
@@ -138,14 +141,45 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
AccountSelectionListFragment.this.dismiss();
|
||||
if (activity == null) return;
|
||||
DcAccounts accounts = DcHelper.getAccounts(activity);
|
||||
Rpc rpc = DcHelper.getRpc(activity);
|
||||
|
||||
View dialogView = View.inflate(activity, R.layout.dialog_delete_profile, null);
|
||||
AvatarView avatar = dialogView.findViewById(R.id.avatar);
|
||||
TextView nameView = dialogView.findViewById(R.id.name);
|
||||
TextView addrView = dialogView.findViewById(R.id.address);
|
||||
TextView sizeView = dialogView.findViewById(R.id.size_label);
|
||||
TextView description = dialogView.findViewById(R.id.description);
|
||||
DcContext dcContext = accounts.getAccount(accountId);
|
||||
String name = dcContext.getConfig("displayname");
|
||||
DcContact contact = dcContext.getContact(DcContact.DC_CONTACT_ID_SELF);
|
||||
if (TextUtils.isEmpty(name)) {
|
||||
name = contact.getAddr();
|
||||
}
|
||||
Recipient recipient = new Recipient(getContext(), contact, name);
|
||||
avatar.setAvatar(GlideApp.with(activity), recipient, false);
|
||||
nameView.setText(name);
|
||||
addrView.setText(contact.getAddr());
|
||||
try {
|
||||
sizeView.setText(Util.getPrettyFileSize(rpc.getAccountFileSize(accountId)));
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
description.setText(activity.getString(R.string.delete_account_explain_with_name, name));
|
||||
|
||||
AlertDialog dialog = new AlertDialog.Builder(activity)
|
||||
.setTitle(accounts.getAccount(accountId).getNameNAddr())
|
||||
.setMessage(R.string.forget_login_confirmation_desktop)
|
||||
.setTitle(R.string.delete_account)
|
||||
.setView(dialogView)
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> AccountManager.getInstance().showSwitchAccountMenu(activity))
|
||||
.setPositiveButton(R.string.delete, (d2, which2) -> {
|
||||
DcHelper.getNotificationCenter(activity).removeAllNotifiations(accountId);
|
||||
boolean selected = accountId == accounts.getSelectedAccount().getAccountId();
|
||||
DcHelper.getNotificationCenter(activity).removeAllNotifications(accountId);
|
||||
accounts.removeAccount(accountId);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(activity);
|
||||
if (selected) {
|
||||
DcContext selAcc = accounts.getSelectedAccount();
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(activity, selAcc.isOk()? selAcc.getAccountId() : 0);
|
||||
} else {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(activity);
|
||||
}
|
||||
})
|
||||
.show();
|
||||
Util.redPositiveButton(dialog);
|
||||
|
||||
@@ -68,15 +68,24 @@ public class AccountSelectionListItem extends LinearLayout {
|
||||
String name;
|
||||
String addr = null;
|
||||
int unreadCount = 0;
|
||||
boolean isMuted = dcContext != null && dcContext.isMuted();
|
||||
boolean isMuted = dcContext.isMuted();
|
||||
|
||||
Recipient recipient;
|
||||
if (accountId != DcContact.DC_CONTACT_ID_ADD_ACCOUNT) {
|
||||
if (accountId == DcContact.DC_CONTACT_ID_ADD_ACCOUNT) {
|
||||
name = getContext().getString(R.string.add_account);
|
||||
enableSwitch.setVisibility(View.INVISIBLE);
|
||||
recipient = null;
|
||||
this.contactPhotoImage.setSeenRecently(false); // hide connectivity dot
|
||||
} else {
|
||||
self = dcContext.getContact(DcContact.DC_CONTACT_ID_SELF);
|
||||
addr = dcContext.isCommunity()? getContext().getString(R.string.community) : self.getAddr();
|
||||
name = dcContext.getConfig("displayname");
|
||||
if (TextUtils.isEmpty(name)) {
|
||||
name = addr;
|
||||
name = self.getAddr();
|
||||
}
|
||||
if (dcContext.isCommunity()) {
|
||||
addr = getContext().getString(R.string.community);
|
||||
} else if (!dcContext.isChatmail()) {
|
||||
addr = self.getAddr();
|
||||
}
|
||||
unreadCount = dcContext.getFreshMsgs().length;
|
||||
|
||||
@@ -84,17 +93,12 @@ public class AccountSelectionListItem extends LinearLayout {
|
||||
enableSwitch.setVisibility(View.VISIBLE);
|
||||
recipient = new Recipient(getContext(), self, name);
|
||||
this.contactPhotoImage.setConnectivity(dcContext.getConnectivity());
|
||||
} else {
|
||||
name = getContext().getString(R.string.add_account);
|
||||
enableSwitch.setVisibility(View.INVISIBLE);
|
||||
recipient = null;
|
||||
this.contactPhotoImage.setSeenRecently(false); // hide connectivity dot
|
||||
}
|
||||
this.contactPhotoImage.setAvatar(glideRequests, recipient, false);
|
||||
|
||||
setSelected(selected);
|
||||
nameView.setCompoundDrawablesWithIntrinsicBounds(isMuted? R.drawable.ic_volume_off_grey600_18dp : 0, 0, 0, 0);
|
||||
|
||||
setSelected(selected);
|
||||
if (selected) {
|
||||
addrView.setTypeface(null, Typeface.BOLD);
|
||||
nameView.setTypeface(null, Typeface.BOLD);
|
||||
|
||||
@@ -214,6 +214,7 @@ public class EmojiTextView extends AppCompatTextView {
|
||||
|
||||
private static final Pattern CMD_PATTERN = Pattern.compile("(?<=^|\\s)/[a-zA-Z][a-zA-Z@\\d_/.-]{0,254}");
|
||||
private static final Pattern CUSTOM_PATTERN = Pattern.compile("(?<=^|\\s)(OPENPGP4FPR|openpgp4fpr|mumble):[^ \\n]+");
|
||||
private static final Pattern PROXY_PATTERN = Pattern.compile("(?<=^|\\s)(SOCKS5|socks5|ss|SS):[^ \\n]+");
|
||||
|
||||
private static void replaceURLSpan(Spannable messageBody) {
|
||||
URLSpan[] urlSpans = messageBody.getSpans(0, messageBody.length(), URLSpan.class);
|
||||
@@ -234,6 +235,10 @@ public class EmojiTextView extends AppCompatTextView {
|
||||
Linkify.addLinks(messageBody, CUSTOM_PATTERN, null, null, null);
|
||||
EmojiTextView.replaceURLSpan(messageBody);
|
||||
|
||||
if (Linkify.addLinks(messageBody, PROXY_PATTERN, null, null, null)) {
|
||||
EmojiTextView.replaceURLSpan(messageBody); // replace URLSpan so that it is not removed on the next addLinks() call
|
||||
}
|
||||
|
||||
// linkyfiy urls etc., this removes all existing URLSpan
|
||||
if (Linkify.addLinks(messageBody, Linkify.EMAIL_ADDRESSES|Linkify.WEB_URLS|Linkify.PHONE_NUMBERS)) {
|
||||
EmojiTextView.replaceURLSpan(messageBody);
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.b44t.messenger.DcEvent;
|
||||
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.service.FetchForegroundService;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -177,6 +178,10 @@ public class DcEventCenter {
|
||||
DcHelper.getNotificationCenter(context).removeNotifications(accountId, event.getData1Int());
|
||||
break;
|
||||
|
||||
case DcContext.DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE:
|
||||
FetchForegroundService.stop(context);
|
||||
break;
|
||||
|
||||
case DcContext.DC_EVENT_IMEX_PROGRESS:
|
||||
sendToCurrentAccountObservers(event);
|
||||
return 0;
|
||||
|
||||
@@ -75,11 +75,8 @@ public class DcHelper {
|
||||
public static final String CONFIG_SHOW_EMAILS = "show_emails";
|
||||
public static final String CONFIG_MEDIA_QUALITY = "media_quality";
|
||||
public static final String CONFIG_WEBRTC_INSTANCE = "webrtc_instance";
|
||||
public static final String CONFIG_SOCKS5_ENABLED = "socks5_enabled";
|
||||
public static final String CONFIG_SOCKS5_HOST = "socks5_host";
|
||||
public static final String CONFIG_SOCKS5_PORT = "socks5_port";
|
||||
public static final String CONFIG_SOCKS5_USER = "socks5_user";
|
||||
public static final String CONFIG_SOCKS5_PASSWORD = "socks5_password";
|
||||
public static final String CONFIG_PROXY_ENABLED = "proxy_enabled";
|
||||
public static final String CONFIG_PROXY_URL = "proxy_url";
|
||||
public static final String CONFIG_VERIFIED_ONE_ON_ONE_CHATS = "verified_one_on_one_chats";
|
||||
public static final String CONFIG_WEBXDC_REALTIME_ENABLED = "webxdc_realtime_enabled";
|
||||
|
||||
@@ -452,13 +449,14 @@ public class DcHelper {
|
||||
* Gets a string you can show to the user with basic information about connectivity.
|
||||
* @param context
|
||||
* @param connectedString Usually "Connected", but when using this as the title in
|
||||
* ConversationListActivity, we want to write "ArcaneChat" there instead.
|
||||
* ConversationListActivity, we want to write "ArcaneChat"
|
||||
* or the user's display name there instead.
|
||||
* @return
|
||||
*/
|
||||
public static String getConnectivitySummary(Context context, int connectedString) {
|
||||
public static String getConnectivitySummary(Context context, String connectedString) {
|
||||
int connectivity = getContext(context).getConnectivity();
|
||||
if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTED) {
|
||||
return context.getString(connectedString);
|
||||
return connectedString;
|
||||
} else if (connectivity >= DcContext.DC_CONNECTIVITY_WORKING) {
|
||||
return context.getString(R.string.connectivity_updating);
|
||||
} else if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTING) {
|
||||
|
||||
@@ -638,14 +638,12 @@ public class AttachmentManager {
|
||||
private class EditButtonListener implements View.OnClickListener {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
Uri imgUri = getSlideUri();
|
||||
if (imgUri != null) {
|
||||
Intent intent = new Intent(context, ScribbleActivity.class);
|
||||
intent.setData(getSlideUri());
|
||||
intent.setData(imgUri);
|
||||
((Activity) context).startActivityForResult(intent, ScribbleActivity.SCRIBBLE_REQUEST_CODE);
|
||||
}
|
||||
else {
|
||||
Toast.makeText(context, "Image editing requires Android 4.4 KitKat or newer.", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
@@ -16,6 +18,7 @@ public class MarkReadReceiver extends BroadcastReceiver {
|
||||
public static final String CANCEL_ACTION = "org.thoughtcrime.securesms.notifications.CANCEL";
|
||||
public static final String ACCOUNT_ID_EXTRA = "account_id";
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String MSG_ID_EXTRA = "msg_id";
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, Intent intent) {
|
||||
@@ -26,6 +29,7 @@ public class MarkReadReceiver extends BroadcastReceiver {
|
||||
|
||||
final int accountId = intent.getIntExtra(ACCOUNT_ID_EXTRA, 0);
|
||||
final int chatId = intent.getIntExtra(CHAT_ID_EXTRA, DC_CHAT_NO_CHAT);
|
||||
final int msgId = intent.getIntExtra(MSG_ID_EXTRA, 0);
|
||||
if (accountId == 0 || chatId == DC_CHAT_NO_CHAT) {
|
||||
return;
|
||||
}
|
||||
@@ -33,7 +37,9 @@ public class MarkReadReceiver extends BroadcastReceiver {
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcHelper.getNotificationCenter(context).removeNotifications(accountId, chatId);
|
||||
if (markNoticed) {
|
||||
DcHelper.getAccounts(context).getAccount(accountId).marknoticedChat(chatId);
|
||||
DcContext dcContext = DcHelper.getAccounts(context).getAccount(accountId);
|
||||
dcContext.marknoticedChat(chatId);
|
||||
dcContext.markseenMsgs(new int[]{msgId});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -128,22 +128,24 @@ public class NotificationCenter {
|
||||
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | IntentUtils.FLAG_MUTABLE());
|
||||
}
|
||||
|
||||
private PendingIntent getRemoteReplyIntent(ChatData chatData) {
|
||||
private PendingIntent getRemoteReplyIntent(ChatData chatData, int msgId) {
|
||||
Intent intent = new Intent(RemoteReplyReceiver.REPLY_ACTION);
|
||||
intent.setClass(context, RemoteReplyReceiver.class);
|
||||
intent.setData(Uri.parse("custom://"+chatData.accountId+"."+chatData.chatId));
|
||||
intent.putExtra(RemoteReplyReceiver.ACCOUNT_ID_EXTRA, chatData.accountId);
|
||||
intent.putExtra(RemoteReplyReceiver.CHAT_ID_EXTRA, chatData.chatId);
|
||||
intent.putExtra(RemoteReplyReceiver.MSG_ID_EXTRA, msgId);
|
||||
intent.setPackage(context.getPackageName());
|
||||
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | IntentUtils.FLAG_MUTABLE());
|
||||
}
|
||||
|
||||
private PendingIntent getMarkAsReadIntent(ChatData chatData, boolean markNoticed) {
|
||||
private PendingIntent getMarkAsReadIntent(ChatData chatData, int msgId, boolean markNoticed) {
|
||||
Intent intent = new Intent(markNoticed? MarkReadReceiver.MARK_NOTICED_ACTION : MarkReadReceiver.CANCEL_ACTION);
|
||||
intent.setClass(context, MarkReadReceiver.class);
|
||||
intent.setData(Uri.parse("custom://"+chatData.accountId+"."+chatData.chatId));
|
||||
intent.putExtra(MarkReadReceiver.ACCOUNT_ID_EXTRA, chatData.accountId);
|
||||
intent.putExtra(MarkReadReceiver.CHAT_ID_EXTRA, chatData.chatId);
|
||||
intent.putExtra(MarkReadReceiver.MSG_ID_EXTRA, msgId);
|
||||
intent.setPackage(context.getPackageName());
|
||||
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | IntentUtils.FLAG_MUTABLE());
|
||||
}
|
||||
@@ -166,6 +168,7 @@ public class NotificationCenter {
|
||||
public static final int ID_PERMANENT = 1;
|
||||
public static final int ID_MSG_SUMMARY = 2;
|
||||
public static final int ID_GENERIC = 3;
|
||||
public static final int ID_FETCH = 4;
|
||||
public static final int ID_MSG_OFFSET = 0; // msgId is added - as msgId start at 10, there are no conflicts with lower numbers
|
||||
|
||||
|
||||
@@ -379,7 +382,7 @@ public class NotificationCenter {
|
||||
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
||||
.setOnlyAlertOnce(!signal)
|
||||
.setContentText(line)
|
||||
.setDeleteIntent(getMarkAsReadIntent(chatData, false))
|
||||
.setDeleteIntent(getMarkAsReadIntent(chatData, msgId, false))
|
||||
.setContentIntent(getOpenChatIntent(chatData));
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
@@ -450,11 +453,11 @@ public class NotificationCenter {
|
||||
// if privacy options are enabled, the buttons are not added.
|
||||
if (privacy.isDisplayContact() && privacy.isDisplayMessage()) {
|
||||
try {
|
||||
PendingIntent inNotificationReplyIntent = getRemoteReplyIntent(chatData);
|
||||
PendingIntent markReadIntent = getMarkAsReadIntent(chatData, true);
|
||||
PendingIntent inNotificationReplyIntent = getRemoteReplyIntent(chatData, msgId);
|
||||
PendingIntent markReadIntent = getMarkAsReadIntent(chatData, msgId, true);
|
||||
|
||||
NotificationCompat.Action markAsReadAction = new NotificationCompat.Action(R.drawable.check,
|
||||
context.getString(R.string.notify_dismiss),
|
||||
context.getString(R.string.mark_as_read_short),
|
||||
markReadIntent);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
@@ -567,7 +570,7 @@ public class NotificationCenter {
|
||||
} catch (Exception e) { Log.w(TAG, e); }
|
||||
}
|
||||
|
||||
public void removeAllNotifiations(int accountId) {
|
||||
public void removeAllNotifications(int accountId) {
|
||||
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
|
||||
String tag = String.valueOf(accountId);
|
||||
synchronized (inboxes) {
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.os.Bundle;
|
||||
import androidx.core.app.RemoteInput;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -41,6 +42,7 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
|
||||
public static final String REPLY_ACTION = "org.thoughtcrime.securesms.notifications.WEAR_REPLY";
|
||||
public static final String ACCOUNT_ID_EXTRA = "account_id";
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String MSG_ID_EXTRA = "msg_id";
|
||||
public static final String EXTRA_REMOTE_REPLY = "extra_remote_reply";
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
@@ -50,6 +52,7 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
|
||||
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
|
||||
final int accountId = intent.getIntExtra(ACCOUNT_ID_EXTRA, 0);
|
||||
final int chatId = intent.getIntExtra(CHAT_ID_EXTRA, DC_CHAT_NO_CHAT);
|
||||
final int msgId = intent.getIntExtra(MSG_ID_EXTRA, 0);
|
||||
|
||||
if (remoteInput == null || chatId == DC_CHAT_NO_CHAT || accountId == 0) return;
|
||||
|
||||
@@ -58,10 +61,17 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
|
||||
if (responseText != null) {
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcContext dcContext = DcHelper.getAccounts(context).getAccount(accountId);
|
||||
dcContext.marknoticedChat(chatId);
|
||||
dcContext.markseenMsgs(new int[]{msgId});
|
||||
if (dcContext.getChat(chatId).isContactRequest()) {
|
||||
dcContext.acceptChat(chatId);
|
||||
}
|
||||
dcContext.sendTextMsg(chatId, responseText.toString());
|
||||
|
||||
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setText(responseText.toString());
|
||||
msg.setQuote(dcContext.getMsg(msgId));
|
||||
dcContext.sendMsg(chatId, msg);
|
||||
|
||||
DcHelper.getNotificationCenter(context).removeNotifications(accountId, chatId);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ import com.b44t.messenger.rpc.RpcException;
|
||||
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
|
||||
import org.thoughtcrime.securesms.ConversationActivity;
|
||||
import org.thoughtcrime.securesms.LogViewActivity;
|
||||
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.RegistrationActivity;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
@@ -157,6 +158,11 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
||||
return true;
|
||||
}));
|
||||
|
||||
this.findPreference("proxy_settings_button").setOnPreferenceClickListener((preference) -> {
|
||||
startActivity(new Intent(getActivity(), ProxySettingsActivity.class));
|
||||
return true;
|
||||
});
|
||||
|
||||
Preference passwordAndAccount = this.findPreference("password_account_settings_button");
|
||||
passwordAndAccount.setOnPreferenceClickListener(((preference) -> {
|
||||
boolean result = ScreenLockUtil.applyScreenLock(getActivity(), getString(R.string.pref_password_and_account_settings), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT);
|
||||
@@ -389,6 +395,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
||||
}
|
||||
)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(getActivity(), "#importkey"))
|
||||
.show();
|
||||
})
|
||||
.execute();
|
||||
|
||||
@@ -138,7 +138,6 @@ public abstract class ListSummaryPreferenceFragment extends CorrectedPreferenceF
|
||||
protected void startImexInner(int accountId, int what, String imexPath, String pathAsDisplayedToUser)
|
||||
{
|
||||
DcContext dcContext = DcHelper.getAccounts(getActivity()).getAccount(accountId);
|
||||
dcContext.assumeMultiDevice();
|
||||
this.pathAsDisplayedToUser = pathAsDisplayedToUser;
|
||||
progressWhat = what;
|
||||
dcContext.imex(progressWhat, imexPath);
|
||||
@@ -200,7 +199,7 @@ public abstract class ListSummaryPreferenceFragment extends CorrectedPreferenceF
|
||||
imexProgress.put(event.getAccountId(), (int) progress);
|
||||
int totalProgress = getTotalProgress();
|
||||
int percent = totalProgress / (10 * imexAccounts.length);
|
||||
String formattedPercent = String.format(" %d%%", percent);
|
||||
String formattedPercent = percent > 0 ? String.format(" %d%%", percent) : "";
|
||||
progressDialog.setMessage(getResources().getString(R.string.one_moment) + formattedPercent);
|
||||
notifController.setProgress(1000L * imexAccounts.length, totalProgress, formattedPercent);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
package org.thoughtcrime.securesms.proxy;
|
||||
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcLot;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class ProxyListAdapter extends BaseAdapter {
|
||||
private enum ProxyState {
|
||||
CONNECTED,
|
||||
CONNECTING,
|
||||
NOT_CONNECTED,
|
||||
}
|
||||
|
||||
@NonNull private final Context context;
|
||||
@NonNull private final DcContext dcContext;
|
||||
@NonNull private final List<String> proxies = new LinkedList<>();
|
||||
@Nullable private ItemClickListener itemClickListener;
|
||||
@Nullable private ProxyState proxyState;
|
||||
@Nullable private String selectedProxy;
|
||||
|
||||
public ProxyListAdapter(@NonNull Context context)
|
||||
{
|
||||
this.context = context;
|
||||
this.dcContext = DcHelper.getContext(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return proxies.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return proxies.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(final int position, View v, final ViewGroup parent) {
|
||||
if (v == null) {
|
||||
v = LayoutInflater.from(context).inflate(R.layout.proxy_list_item, parent, false);
|
||||
}
|
||||
|
||||
TextView host = v.findViewById(R.id.host);
|
||||
TextView protocol = v.findViewById(R.id.protocol);
|
||||
ImageView checkmark = v.findViewById(R.id.checkmark);
|
||||
TextView status = v.findViewById(R.id.status);
|
||||
|
||||
final String proxyUrl = (String)getItem(position);
|
||||
final DcLot qrParsed = dcContext.checkQr(proxyUrl);
|
||||
if (qrParsed.getState() == DcContext.DC_QR_PROXY) {
|
||||
host.setText(qrParsed.getText1());
|
||||
protocol.setText(proxyUrl.split(":", 2)[0]);
|
||||
} else {
|
||||
host.setText(proxyUrl);
|
||||
protocol.setText(R.string.unknown);
|
||||
}
|
||||
if (proxyUrl.equals(selectedProxy)) {
|
||||
checkmark.setVisibility(View.VISIBLE);
|
||||
if(dcContext.isConfigured() == 1 && dcContext.getConfigInt(CONFIG_PROXY_ENABLED) == 1) {
|
||||
status.setVisibility(View.VISIBLE);
|
||||
status.setText(getConnectivityString());
|
||||
} else {
|
||||
status.setVisibility(View.GONE);
|
||||
}
|
||||
} else {
|
||||
checkmark.setVisibility(View.GONE);
|
||||
status.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
v.setOnClickListener(view -> {
|
||||
if (itemClickListener != null) {
|
||||
itemClickListener.onItemClick(proxyUrl);
|
||||
}
|
||||
});
|
||||
v.findViewById(R.id.share).setOnClickListener(view -> {
|
||||
if (itemClickListener != null) {
|
||||
itemClickListener.onItemShare(proxyUrl);
|
||||
}
|
||||
});
|
||||
v.findViewById(R.id.delete).setOnClickListener(view -> {
|
||||
if (itemClickListener != null) {
|
||||
itemClickListener.onItemDelete(proxyUrl);
|
||||
}
|
||||
});
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
public void changeData(String newProxies) {
|
||||
proxies.clear();
|
||||
if (!TextUtils.isEmpty(newProxies)) {
|
||||
Collections.addAll(proxies, newProxies.split("\n"));
|
||||
}
|
||||
selectedProxy = proxies.isEmpty()? null : proxies.get(0);
|
||||
proxyState = null; // to force notifyDataSetChanged() in refreshConnectivity()
|
||||
refreshConnectivity();
|
||||
}
|
||||
|
||||
public void setSelectedProxy(String proxyUrl) {
|
||||
selectedProxy = proxyUrl;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private String getConnectivityString() {
|
||||
if (proxyState == ProxyState.CONNECTED) {
|
||||
return context.getString(R.string.connectivity_connected);
|
||||
}
|
||||
if (proxyState == ProxyState.CONNECTING) {
|
||||
return context.getString(R.string.connectivity_connecting);
|
||||
}
|
||||
return context.getString(R.string.connectivity_not_connected);
|
||||
}
|
||||
|
||||
public void refreshConnectivity() {
|
||||
if (DcHelper.getInt(context, CONFIG_PROXY_ENABLED) != 1) {
|
||||
if (proxyState != ProxyState.NOT_CONNECTED) {
|
||||
proxyState = ProxyState.NOT_CONNECTED;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int connectivity = dcContext.getConnectivity();
|
||||
if (connectivity >= DcContext.DC_CONNECTIVITY_WORKING) {
|
||||
if (proxyState != ProxyState.CONNECTED) {
|
||||
proxyState = ProxyState.CONNECTED;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
} else if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTING) {
|
||||
if (proxyState != ProxyState.CONNECTING) {
|
||||
proxyState = ProxyState.CONNECTING;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
} else if (proxyState != ProxyState.NOT_CONNECTED) {
|
||||
proxyState = ProxyState.NOT_CONNECTED;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public void setItemClickListener(@Nullable ItemClickListener listener) {
|
||||
itemClickListener = listener;
|
||||
}
|
||||
|
||||
public interface ItemClickListener {
|
||||
void onItemClick(String proxyUrl);
|
||||
void onItemShare(String proxyUrl);
|
||||
void onItemDelete(String proxyUrl);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
package org.thoughtcrime.securesms.proxy;
|
||||
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.SwitchCompat;
|
||||
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcLot;
|
||||
|
||||
import org.thoughtcrime.securesms.BaseActionBarActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
public class ProxySettingsActivity extends BaseActionBarActivity
|
||||
implements ProxyListAdapter.ItemClickListener, DcEventCenter.DcEventDelegate {
|
||||
|
||||
private final DynamicTheme dynamicTheme = new DynamicTheme();
|
||||
private SwitchCompat proxySwitch;
|
||||
private ProxyListAdapter adapter;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
dynamicTheme.onCreate(this);
|
||||
setContentView(R.layout.proxy_settings_activity);
|
||||
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setTitle(R.string.proxy_settings);
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
adapter = new ProxyListAdapter(this);
|
||||
adapter.setItemClickListener(this);
|
||||
|
||||
proxySwitch = findViewById(R.id.proxy_switch);
|
||||
proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1);
|
||||
proxySwitch.setOnClickListener(l -> {
|
||||
if (proxySwitch.isChecked() && adapter.getCount() == 0) {
|
||||
showAddProxyDialog();
|
||||
} else {
|
||||
DcHelper.set(this, CONFIG_PROXY_ENABLED, proxySwitch.isChecked()? "1" : "0");
|
||||
DcHelper.getContext(this).restartIo();
|
||||
}
|
||||
});
|
||||
|
||||
ListView proxyList = findViewById(R.id.proxy_list);
|
||||
proxyList.setAdapter(adapter);
|
||||
proxyList.addHeaderView(View.inflate(this, R.layout.proxy_list_header, null), null, false);
|
||||
View footer = View.inflate(this, R.layout.proxy_list_footer, null);
|
||||
footer.setOnClickListener(l -> showAddProxyDialog());
|
||||
proxyList.addFooterView(footer);
|
||||
adapter.changeData(DcHelper.get(this, CONFIG_PROXY_URL));
|
||||
DcHelper.getEventCenter(this).addObserver(DcContext.DC_EVENT_CONNECTIVITY_CHANGED, this);
|
||||
|
||||
handleOpenProxyUrl();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
handleOpenProxyUrl();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
dynamicTheme.onResume(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
DcHelper.getEventCenter(this).removeObservers(this);
|
||||
}
|
||||
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
if (id == android.R.id.home) {
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(String proxyUrl) {
|
||||
if (DcHelper.getContext(this).setConfigFromQr(proxyUrl)) {
|
||||
DcHelper.getContext(this).restartIo();
|
||||
adapter.setSelectedProxy(proxyUrl);
|
||||
proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.proxy_invalid, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemShare(String proxyUrl) {
|
||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(Intent.EXTRA_TEXT, proxyUrl);
|
||||
startActivity(Intent.createChooser(intent, getString(R.string.chat_share_with_title)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemDelete(String proxyUrl) {
|
||||
String host = DcHelper.getContext(this).checkQr(proxyUrl).getText1();
|
||||
AlertDialog dialog = new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.proxy_delete)
|
||||
.setMessage(getString(R.string.proxy_delete_explain, host))
|
||||
.setPositiveButton(R.string.delete, (dlg, btn) -> deleteProxy(proxyUrl))
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show();
|
||||
Util.redPositiveButton(dialog);
|
||||
}
|
||||
|
||||
private void deleteProxy(String proxyUrl) {
|
||||
final LinkedList<String> proxies = new LinkedList<>();
|
||||
for (String proxy: DcHelper.get(this, CONFIG_PROXY_URL).split("\n")) {
|
||||
if (!proxy.equals(proxyUrl)) {
|
||||
proxies.add(proxy);
|
||||
}
|
||||
}
|
||||
if (proxies.isEmpty()) {
|
||||
DcHelper.set(this, CONFIG_PROXY_ENABLED, "0");
|
||||
proxySwitch.setChecked(false);
|
||||
}
|
||||
String proxyUrls = String.join("\n", proxies);
|
||||
DcHelper.set(this, CONFIG_PROXY_URL, proxyUrls);
|
||||
DcHelper.getContext(this).restartIo();
|
||||
adapter.changeData(proxyUrls);
|
||||
}
|
||||
|
||||
private void showAddProxyDialog() {
|
||||
View view = View.inflate(this, R.layout.single_line_input, null);
|
||||
EditText inputField = view.findViewById(R.id.input_field);
|
||||
inputField.setHint(R.string.proxy_add_url_hint);
|
||||
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.proxy_add)
|
||||
.setMessage(R.string.proxy_add_explain)
|
||||
.setView(view)
|
||||
.setPositiveButton(R.string.proxy_use_proxy, (dialog, whichButton) -> {
|
||||
String newProxy = inputField.getText().toString().trim();
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final DcLot qrParsed = dcContext.checkQr(newProxy);
|
||||
if (qrParsed.getState() == DcContext.DC_QR_PROXY) {
|
||||
dcContext.setConfigFromQr(newProxy);
|
||||
DcHelper.getContext(this).restartIo();
|
||||
adapter.changeData(DcHelper.get(this, CONFIG_PROXY_URL));
|
||||
} else {
|
||||
Toast.makeText(this, R.string.proxy_invalid, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1);
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, (dialog, whichButton) -> {
|
||||
if (proxySwitch.isChecked() && adapter.getCount() == 0) {
|
||||
// user enabled switch without having proxies yet, revert
|
||||
proxySwitch.setChecked(false);
|
||||
}
|
||||
})
|
||||
.setCancelable(false)
|
||||
.show();
|
||||
}
|
||||
|
||||
private void handleOpenProxyUrl() {
|
||||
if (getIntent() != null && Intent.ACTION_VIEW.equals(getIntent().getAction())) {
|
||||
Uri uri = getIntent().getData();
|
||||
if (uri == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final DcLot qrParsed = dcContext.checkQr(uri.toString());
|
||||
if (qrParsed.getState() == DcContext.DC_QR_PROXY) {
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.proxy_use_proxy)
|
||||
.setMessage(getString(R.string.proxy_use_proxy_confirm, qrParsed.getText1()))
|
||||
.setPositiveButton(R.string.proxy_use_proxy, (dlg, btn) -> {
|
||||
dcContext.setConfigFromQr(uri.toString());
|
||||
dcContext.restartIo();
|
||||
adapter.changeData(DcHelper.get(this, CONFIG_PROXY_URL));
|
||||
proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setCancelable(false)
|
||||
.show();
|
||||
} else {
|
||||
Toast.makeText(this, R.string.proxy_invalid, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
if (event.getId() == DcContext.DC_EVENT_CONNECTIVITY_CHANGED) {
|
||||
adapter.refreshConnectivity();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -64,7 +64,6 @@ public class BackupProviderFragment extends Fragment implements DcEventCenter.Dc
|
||||
progressBar.setIndeterminate(true);
|
||||
|
||||
dcContext = DcHelper.getContext(getActivity());
|
||||
dcContext.assumeMultiDevice();
|
||||
DcHelper.getEventCenter(getActivity()).addObserver(DcContext.DC_EVENT_IMEX_PROGRESS, this);
|
||||
|
||||
prepareThread = new Thread(() -> {
|
||||
@@ -174,17 +173,8 @@ public class BackupProviderFragment extends Fragment implements DcEventCenter.Dc
|
||||
if (permille == 0) {
|
||||
getTransferActivity().setTransferError("Sending Error");
|
||||
hideQrCode = true;
|
||||
} else if(permille <= 350) {
|
||||
statusLineText = getString(R.string.preparing_account);
|
||||
} else if(permille <= 400) {
|
||||
statusLine.setVisibility(View.GONE);
|
||||
progressBar.setVisibility(View.GONE);
|
||||
statusLineText = getString(R.string.waiting_for_receiver);
|
||||
} else if(permille <= 450) {
|
||||
statusLineText = getString(R.string.receiver_connected);
|
||||
hideQrCode = true;
|
||||
} else if (permille < 1000) {
|
||||
percent = (permille-450)/5;
|
||||
percent = permille/10;
|
||||
percentMax = 100;
|
||||
statusLineText = getString(R.string.transferring);
|
||||
hideQrCode = true;
|
||||
|
||||
@@ -81,20 +81,14 @@ public class BackupReceiverFragment extends Fragment implements DcEventCenter.Dc
|
||||
Log.i(TAG,"DC_EVENT_IMEX_PROGRESS, " + permille);
|
||||
if (permille == 0) {
|
||||
getTransferActivity().setTransferError("Receiving Error");
|
||||
} else if (permille <= 100) {
|
||||
statusLineText = getString(R.string.preparing_account);
|
||||
hideSameNetworkHint = true;
|
||||
} else if (permille <= 950 ) {
|
||||
percent = ((permille-100)*100)/850;
|
||||
} else if (permille < 1000) {
|
||||
percent = permille/10;
|
||||
percentMax = 100;
|
||||
statusLineText = getString(R.string.transferring) + String.format(Util.getLocale(), " %d%%", percent);
|
||||
hideSameNetworkHint = true;
|
||||
} else if (permille < 1000) {
|
||||
statusLineText = "Finishing..."; // range not used, should not happen
|
||||
} else if (permille == 1000) {
|
||||
getTransferActivity().setTransferState(BackupTransferActivity.TransferState.TRANSFER_SUCCESS);
|
||||
getTransferActivity().doFinish();
|
||||
dcContext.assumeMultiDevice();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -89,6 +89,17 @@ public class QrCodeHandler {
|
||||
BackupTransferActivity.appendSSID(activity, alertDialog.findViewById(android.R.id.message));
|
||||
return;
|
||||
|
||||
case DcContext.DC_QR_PROXY:
|
||||
builder.setTitle(R.string.proxy_use_proxy);
|
||||
builder.setMessage(activity.getString(R.string.proxy_use_proxy_confirm, qrParsed.getText1()));
|
||||
builder.setPositiveButton(R.string.proxy_use_proxy, (dlg, btn) -> {
|
||||
dcContext.setConfigFromQr(rawString);
|
||||
dcContext.restartIo();
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel, null);
|
||||
builder.setCancelable(false);
|
||||
break;
|
||||
|
||||
case DcContext.DC_QR_WEBRTC:
|
||||
builder.setMessage(activity.getString(R.string.videochat_instance_from_qr, qrParsed.getText1()));
|
||||
builder.setPositiveButton(R.string.ok, (dialog, which) -> {
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
package org.thoughtcrime.securesms.service;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.notifications.FcmReceiveService;
|
||||
import org.thoughtcrime.securesms.notifications.NotificationCenter;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
public final class FetchForegroundService extends Service {
|
||||
private static final String TAG = FcmReceiveService.class.getSimpleName();
|
||||
private static final Object SERVICE_LOCK = new Object();
|
||||
private static Intent service;
|
||||
|
||||
public static void start(Context context) {
|
||||
GenericForegroundService.createFgNotificationChannel(context);
|
||||
synchronized (SERVICE_LOCK) {
|
||||
if (service == null) {
|
||||
service = new Intent(context, FetchForegroundService.class);
|
||||
ContextCompat.startForegroundService(context, service);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void stop(Context context) {
|
||||
synchronized (SERVICE_LOCK) {
|
||||
if (service != null) {
|
||||
context.stopService(service);
|
||||
service = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
Log.i(TAG, "Creating fetch service");
|
||||
super.onCreate();
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(this, NotificationCenter.CH_GENERIC)
|
||||
.setContentTitle(getString(R.string.connectivity_updating))
|
||||
.setSmallIcon(R.drawable.notification_permanent)
|
||||
.build();
|
||||
|
||||
startForeground(NotificationCenter.ID_FETCH, notification);
|
||||
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
Log.i(TAG, "Starting fetch");
|
||||
if (!ApplicationContext.dcAccounts.backgroundFetch(300)) { // as startForeground() was called, there is time
|
||||
FetchForegroundService.stop(this);
|
||||
} // else we stop FetchForegroundService on DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
stopForeground(true);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -185,7 +185,7 @@ public final class GenericForegroundService extends Service {
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.O)
|
||||
static private void createFgNotificationChannel(Context context) {
|
||||
static public void createFgNotificationChannel(Context context) {
|
||||
if(!CHANNEL_CREATED.get() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
CHANNEL_CREATED.set(true);
|
||||
NotificationChannel channel = new NotificationChannel(NotificationCenter.CH_GENERIC,
|
||||
|
||||
@@ -81,7 +81,14 @@ public class LongClickCopySpan extends ClickableSpan {
|
||||
QrCodeHandler qrCodeHandler = new QrCodeHandler((Activity) widget.getContext());
|
||||
qrCodeHandler.handleQrData(url);
|
||||
} else {
|
||||
IntentUtils.showBrowserIntent(widget.getContext(), url);
|
||||
Activity activity = (Activity) widget.getContext();
|
||||
DcContext dcContext = DcHelper.getContext(activity);
|
||||
if (dcContext.checkQr(url).getState() == DcContext.DC_QR_PROXY) {
|
||||
QrCodeHandler qrCodeHandler = new QrCodeHandler(activity);
|
||||
qrCodeHandler.handleQrData(url);
|
||||
} else {
|
||||
IntentUtils.showBrowserIntent(widget.getContext(), url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="228"
|
||||
android:viewportHeight="280"
|
||||
android:tint="#FFFFFF"
|
||||
android:alpha="0.5">
|
||||
<group android:scaleX="0.7491429"
|
||||
android:scaleY="0.92"
|
||||
android:translateX="28.597713"
|
||||
android:translateY="11.2">>
|
||||
|
||||
<path android:fillColor="#ffffff" android:pathData="m10.03,234.14c0.3,-0.01 0.6,-0.02 0.9,-0.04 -0.07,-0.49 -0.14,-0.97 -0.2,-1.46 -0.15,-1.34 -0.26,-2.69 -0.25,-4.04 -0.02,-0.86 -0.05,-1.71 -0.07,-2.57 -0.09,-0.06 -0.18,-0.13 -0.27,-0.19 -0.02,-0.02 -0.04,-0.03 -0.07,-0.05zM44.87,232.95c11.71,-8.35 26.86,-14.79 46.21,-15.9 0,0 39.93,-0.27 47.91,-3.53 7.98,-3.26 68.68,-14.69 82.94,-98.43 14.26,-83.74 -1.06,-115.09 -1.06,-115.09 0,0 -21.14,55.68 -81.02,59.81 0,0 -14.5,1.03 -38.82,1.42 -24.32,0.39 -75.77,20.65 -90.55,85.62l-0.22,43.44c2.5,4.22 5.49,8.12 8.91,11.66 3.99,4.11 8.11,8.12 12.79,11.45 2.26,1.65 4.65,3.2 6.51,5.33 1.94,2.34 3.33,5 4.2,7.93 0.71,2.1 1.45,4.2 2.2,6.28z"/>
|
||||
|
||||
<path android:fillColor="#ffffff" android:pathData="m217.97,45.86c-0.3,0.01 -0.6,0.02 -0.9,0.04 0.07,0.49 0.14,0.97 0.2,1.46 0.15,1.34 0.26,2.69 0.25,4.04 0.02,0.86 0.05,1.71 0.07,2.57 0.09,0.06 0.18,0.13 0.27,0.19 0.02,0.02 0.04,0.03 0.07,0.05zM183.13,47.05c-11.71,8.35 -26.86,14.79 -46.21,15.9 0,0 -39.93,0.27 -47.91,3.53 -7.98,3.26 -68.68,14.69 -82.94,98.43 -14.26,83.74 1.06,115.09 1.06,115.09 0,0 21.14,-55.68 81.02,-59.81 0,0 14.5,-1.03 38.82,-1.42 24.32,-0.39 75.77,-20.65 90.55,-85.62l0.22,-43.44c-2.5,-4.22 -5.49,-8.12 -8.91,-11.66 -3.99,-4.11 -8.11,-8.12 -12.79,-11.45 -2.26,-1.65 -4.65,-3.2 -6.51,-5.33 -1.94,-2.34 -3.33,-5 -4.2,-7.93 -0.71,-2.1 -1.45,-4.2 -2.2,-6.28z"/>
|
||||
|
||||
</group>
|
||||
</vector>
|
||||
|
Before Width: | Height: | Size: 956 B After Width: | Height: | Size: 432 B |
|
Before Width: | Height: | Size: 740 B After Width: | Height: | Size: 287 B |
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<stroke android:width="2dp" android:color="@color/gray50"/>
|
||||
<stroke android:width="1dp" android:color="@color/gray50"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 552 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 822 B |
@@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M20,5V4c0,-0.55 -0.45,-1 -1,-1h-2c-0.55,0 -1,0.45 -1,1v1h-1v4c0,0.55 0.45,1 1,1h1v7c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2V7c0,-2.21 -1.79,-4 -4,-4S5,4.79 5,7v7H4c-0.55,0 -1,0.45 -1,1v4h1v1c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-1h1v-4c0,-0.55 -0.45,-1 -1,-1H7V7c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v10c0,2.21 1.79,4 4,4s4,-1.79 4,-4v-7h1c0.55,0 1,-0.45 1,-1V5H20z"/>
|
||||
</vector>
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/def_primary_lite"/>
|
||||
<solid android:color="?attr/fab_color"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/blue_primary_lite"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/gray_primary_lite"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/green_primary_lite"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/pink_primary_lite"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/purple_primary_lite"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<solid android:color="@color/red_primary_lite"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- TODO - Consolidate using attr if we move away from API 19 -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
|
||||
<stroke android:width="2px" android:color="@color/def_primary"/>
|
||||
<stroke android:width="2px" android:color="?attr/fab_color"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
android:shape="rectangle">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/blue_primary" />
|
||||
<solid android:color="@color/delete_account_item_bg" />
|
||||
<corners android:radius="8dp" />
|
||||
</shape>
|
||||
@@ -0,0 +1,15 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="44"
|
||||
android:viewportHeight="44">
|
||||
<group android:scaleX="0.43"
|
||||
android:scaleY="0.43"
|
||||
android:translateX="13.2"
|
||||
android:translateY="13.2">
|
||||
<path
|
||||
android:pathData="M22,0.002C9.852,0.149 0,10.127 0,22.275 0,34.423 9.852,44.146 22,43.998 34.851,41.825 30.778,38.561 43.633,43.485 36.973,31.766 43.857,30.986 44,21.725 44,9.577 34.148,-0.146 22,0.002ZM21.853,4.515c2.535,0 4.766,0.33 6.648,1.027 1.247,0.457 2.032,1.04 2.461,1.725 0.008,0.006 0.029,-0.006 0.037,0 0.736,0.564 1.102,1.217 1.102,1.982 -0,0.589 -0.237,1.08 -0.698,1.468 -0.461,0.387 -0.965,0.55 -1.579,0.55 -0.883,0 -1.931,-0.509 -3.122,-1.578C25.491,8.604 24.461,7.848 23.616,7.414 22.79,6.965 21.828,6.717 20.715,6.717c-1.421,0 -2.604,0.259 -3.526,0.771 -0.903,0.511 -1.359,1.155 -1.359,1.945 -0,0.534 0.234,1.019 0.624,1.504 0.865,0.678 2.652,1.796 5.509,3.376 3.322,1.844 5.688,3.255 7.052,4.293 0.648,0.487 1.229,1.029 1.763,1.615 0.036,0.039 0.075,0.071 0.11,0.11 0.013,0.012 0.024,0.025 0.037,0.037 0.865,0.826 1.591,1.771 2.204,2.825 0.864,1.487 1.322,3.076 1.322,4.734 -0,2.913 -1.303,5.475 -3.856,7.706 -2.535,2.216 -5.489,3.339 -8.888,3.339 -3.092,-0 -5.692,-0.897 -7.823,-2.679 -0.382,-0.32 -0.715,-0.668 -1.028,-1.027 -1.962,-1.756 -2.938,-4.045 -2.938,-6.899 -0,-2.866 1.146,-5.271 3.489,-7.192 2.318,-1.886 5.167,-3.026 8.521,-3.449 -0.846,-0.699 -1.807,-1.471 -3.048,-2.348 -1.825,-1.292 -3.041,-2.328 -3.71,-3.082 -0.024,-0.022 -0.05,-0.052 -0.073,-0.073 -0.31,-0.282 -0.574,-0.541 -0.771,-0.771 -0.653,-0.775 -0.992,-1.618 -0.992,-2.532 -0,-1.363 0.776,-2.454 2.351,-3.229 1.575,-0.79 3.636,-1.174 6.17,-1.174zM24.167,19.56c-5.511,0.728 -8.264,3.761 -8.264,9.137 -0,2.618 0.587,4.688 1.8,6.201 0.013,0.012 0.024,0.025 0.037,0.037 1.249,1.151 2.644,1.761 4.224,1.761 1.901,0 3.472,-0.766 4.701,-2.238 1.229,-1.487 1.836,-3.492 1.836,-6.018 -0,-2.979 -1.148,-5.66 -3.416,-8.073 -0.293,-0.273 -0.594,-0.542 -0.918,-0.807z"
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeColor="#00000000"/>
|
||||
</group>
|
||||
</vector>
|
||||
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 630 KiB |
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/def_primary" />
|
||||
<solid android:color="?attr/fab_color" />
|
||||
</shape>
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/gray_primary" />
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/green_primary" />
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/pink_primary" />
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/purple_primary" />
|
||||
</shape>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<!-- read issue: https://github.com/deltachat/deltachat-android/issues/480 before introducing an attr here. -->
|
||||
<solid android:color="@color/red_primary" />
|
||||
</shape>
|
||||
@@ -126,7 +126,7 @@
|
||||
android:layout_height="40dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"
|
||||
android:background="?attr/send_button_bg"
|
||||
android:background="@drawable/send_button_bg"
|
||||
android:layout_gravity="center_vertical">
|
||||
|
||||
<ImageButton
|
||||
|
||||
@@ -1,97 +1,112 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@id/container"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@id/container"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:minHeight="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
app:contentInsetStart="14dp"
|
||||
app:contentInsetLeft="14dp"
|
||||
android:elevation="4dp"
|
||||
android:theme="?attr/actionBarStyle">
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:minHeight="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
app:contentInsetStart="0dp"
|
||||
app:contentInsetLeft="0dp"
|
||||
android:elevation="4dp"
|
||||
android:theme="?attr/actionBarStyle">
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/self_avatar_container"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="45dp">
|
||||
<org.thoughtcrime.securesms.components.AvatarView
|
||||
android:id="@+id/self_avatar"
|
||||
android:layout_width="35dp"
|
||||
android:layout_height="35dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:clickable="true"
|
||||
app:inverted="true"
|
||||
android:contentDescription="@string/pref_profile_info_headline" />
|
||||
<ImageView android:id="@+id/unread_indicator"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginStart="20dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:contentDescription="@null"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/avatar_and_title"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:paddingStart="14dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginEnd="10dp">
|
||||
|
||||
<org.thoughtcrime.securesms.components.emoji.EmojiTextView style="@style/TextSecure.TitleTextStyle"
|
||||
android:id="@+id/toolbar_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/app_name"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingRight="10dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"/>
|
||||
<RelativeLayout
|
||||
android:id="@+id/self_avatar_container"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="45dp">
|
||||
<org.thoughtcrime.securesms.components.AvatarView
|
||||
android:id="@+id/self_avatar"
|
||||
android:layout_width="35dp"
|
||||
android:layout_height="35dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:clickable="true"
|
||||
app:inverted="true"
|
||||
android:contentDescription="@string/pref_profile_info_headline" />
|
||||
<ImageView
|
||||
android:id="@+id/unread_indicator"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginStart="20dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:contentDescription="@null"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
|
||||
<ImageView android:id="@+id/search_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_search_white_24dp"
|
||||
android:paddingRight="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingStart="12dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:contentDescription="@string/search"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
|
||||
<FrameLayout android:id="@+id/fragment_container"
|
||||
android:layout_below="@id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<org.thoughtcrime.securesms.components.SearchToolbar
|
||||
android:id="@+id/search_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
|
||||
style="@style/TextSecure.TitleTextStyle"
|
||||
android:id="@+id/toolbar_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:elevation="4dp"
|
||||
android:visibility="invisible"
|
||||
tools:visibility="visible"/>
|
||||
android:text="@string/app_name"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingRight="10dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"/>
|
||||
</LinearLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/search_action"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_search_white_24dp"
|
||||
android:paddingRight="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingStart="12dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:contentDescription="@string/search"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/fragment_container"
|
||||
android:layout_below="@id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<org.thoughtcrime.securesms.components.SearchToolbar
|
||||
android:id="@+id/search_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:elevation="4dp"
|
||||
android:visibility="invisible"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="20dp"
|
||||
android:paddingRight="20dp"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="10dp"
|
||||
android:text="@string/delete_account_ask" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:background="@drawable/delete_account_item_background">
|
||||
|
||||
<org.thoughtcrime.securesms.components.AvatarView
|
||||
android:id="@+id/avatar"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="marquee"
|
||||
android:singleLine="true"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textSize="16sp"
|
||||
tools:text="Frieeeeeeedrich Nieeeeeeeeeetzsche" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/address"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textDirection="ltr"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
|
||||
android:textSize="14sp"
|
||||
android:fontFamily="sans-serif-light"
|
||||
tools:text="me@example.com" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/size_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textSize="12sp"
|
||||
android:fontFamily="sans-serif-light"
|
||||
tools:text="150 MB" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="10dp"
|
||||
android:text="@string/delete_account_explain_with_name"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
@@ -7,13 +7,14 @@
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView android:id="@+id/avatar"
|
||||
@@ -42,8 +43,6 @@
|
||||
android:id="@+id/information_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:gravity="start"
|
||||
android:text="@string/set_name_and_avatar_explain"
|
||||
@@ -54,11 +53,9 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text=""
|
||||
android:textColor="@color/def_accent"
|
||||
android:textColor="?attr/colorAccent"
|
||||
android:textSize="16sp"/>
|
||||
|
||||
<Button
|
||||
@@ -68,20 +65,38 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:text="@string/instant_onboarding_create"/>
|
||||
|
||||
<Button
|
||||
style="@style/ButtonSecondary"
|
||||
android:id="@+id/other_options_button"
|
||||
android:id="@+id/use_other_server"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_margin="16dp"
|
||||
android:text="@string/instant_onboarding_show_more_instances" />
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/instant_onboarding_other_server"/>
|
||||
|
||||
<Button
|
||||
style="@style/ButtonSecondary"
|
||||
android:id="@+id/login_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/manual_account_setup_option"/>
|
||||
|
||||
<Button
|
||||
style="@style/ButtonSecondary"
|
||||
android:id="@+id/scan_qr_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/scan_invitation_code"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:background="?attr/conversation_list_item_background"
|
||||
>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:text="@string/proxy_add"
|
||||
android:drawablePadding="5dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textSize="16sp"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:text="@string/proxy_list_header"
|
||||
android:textColor="?attr/colorAccent"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
android:typeface="sans"
|
||||
/>
|
||||
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:background="?attr/conversation_list_item_background"
|
||||
android:paddingEnd="6dp"
|
||||
>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/host"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_toStartOf="@id/share"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingTop="10dp"
|
||||
android:drawablePadding="5dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textSize="16sp"
|
||||
tools:text="127.0.0.1:1080"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_below="@+id/host"
|
||||
android:layout_toStartOf="@id/share"
|
||||
android:layout_marginTop="5dp"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:gravity="center_vertical"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/checkmark"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_delivery_status_sent"
|
||||
app:tint="?attr/conversation_list_item_date_color"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textSize="14sp"
|
||||
android:fontFamily="sans-serif-light"
|
||||
tools:text="@string/connectivity_connected"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/protocol"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="5dp"
|
||||
android:paddingRight="5dp"
|
||||
android:paddingTop="1dp"
|
||||
android:paddingBottom="1dp"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="?attr/conversation_list_item_date_color"
|
||||
android:background="@drawable/archived_indicator_background"
|
||||
style="@style/Signal.Text.Caption"
|
||||
tools:text="socks5"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/share"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="60dp"
|
||||
android:layout_toStartOf="@id/delete"
|
||||
android:layout_centerVertical="true"
|
||||
android:contentDescription="@string/menu_share"
|
||||
android:background="@drawable/touch_highlight_background"
|
||||
android:src="@drawable/ic_share_white_24dp"
|
||||
app:tint="?attr/conversation_list_item_date_color"
|
||||
/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/delete"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="60dp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:contentDescription="@string/delete"
|
||||
android:background="@drawable/touch_highlight_background"
|
||||
android:src="@drawable/ic_delete_white_24dp"
|
||||
app:tint="?attr/conversation_list_item_date_color"
|
||||
/>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
tools:context=".proxy.ProxySettingsActivity">
|
||||
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:id="@+id/proxy_switch"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
android:text="@string/proxy_use_proxy" />
|
||||
|
||||
<ListView
|
||||
android:id="@+id/proxy_list"
|
||||
android:paddingTop="10dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -123,7 +123,7 @@
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
app:constraint_referenced_ids="inbox, imap_login, imap_server, imap_port, imap_security_label, imap_security, outbox_view_spacer_top,
|
||||
outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, auth_method_label, auth_method, cert_check_label, cert_check, view_log_button, socks5_switch" />
|
||||
outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, auth_method_label, auth_method, cert_check_label, cert_check, view_log_button, proxy_settings" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/advanced_icon"
|
||||
@@ -151,6 +151,17 @@
|
||||
app:layout_constraintStart_toEndOf="@id/advanced_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/no_servers_hint" />
|
||||
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:id="@+id/proxy_settings"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="16dp"
|
||||
android:text="@string/proxy_use_proxy"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/advanced_text" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/inbox"
|
||||
android:layout_width="wrap_content"
|
||||
@@ -159,7 +170,7 @@
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/login_inbox"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/advanced_text" />
|
||||
app:layout_constraintTop_toBottomOf="@id/proxy_settings" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/imap_login"
|
||||
@@ -378,110 +389,6 @@
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/cert_check_label" />
|
||||
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:id="@+id/socks5_switch"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:text="@string/login_socks5_use_socks5"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/cert_check" />
|
||||
|
||||
<androidx.constraintlayout.widget.Group
|
||||
android:id="@+id/socks5_group"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
tools:visibility="gone"
|
||||
app:constraint_referenced_ids="socks5_experimental_warning, socks5_host, socks5_port, socks5_user, socks5_password" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/socks5_experimental_warning"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="left"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingTop="1dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:text="@string/login_socks5_experimental_warning"
|
||||
android:textColor="@color/gray50"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/socks5_switch" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/socks5_host"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="58dp"
|
||||
app:errorEnabled="true"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/socks5_experimental_warning">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/socks5_host_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/login_socks5_host"
|
||||
android:inputType="textUri|textNoSuggestions" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/socks5_port"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="58dp"
|
||||
app:errorEnabled="true"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/socks5_host">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/socks5_port_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/login_socks5_port"
|
||||
android:inputType="number" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/socks5_user"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/socks5_port">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/socks5_user_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textNoSuggestions"
|
||||
android:hint="@string/login_socks5_user" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/socks5_password"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/socks5_user"
|
||||
app:passwordToggleEnabled="true">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/socks5_password_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/login_socks5_password"
|
||||
android:inputType="textPassword" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/view_log_button"
|
||||
android:layout_width="0dp"
|
||||
@@ -495,7 +402,7 @@
|
||||
android:paddingBottom="32dp"
|
||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||
app:layout_constraintTop_toBottomOf="@id/socks5_password" />
|
||||
app:layout_constraintTop_toBottomOf="@id/cert_check" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sub_header"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="7dp"
|
||||
android:background="?attr/send_button_bg"
|
||||
android:background="@drawable/send_button_bg"
|
||||
android:contentDescription="@string/menu_send"
|
||||
tools:src="@drawable/ic_send_push_white_24dp" />
|
||||
|
||||
|
||||
@@ -53,14 +53,23 @@
|
||||
|
||||
<Button
|
||||
style="@style/ButtonSecondary"
|
||||
android:id="@+id/signin_button"
|
||||
android:id="@+id/add_as_second_device_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="24dp"
|
||||
android:paddingRight="24dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:text="@string/onboarding_alternative_logins"/>
|
||||
android:text="@string/multidevice_receiver_title"/>
|
||||
|
||||
<Button
|
||||
style="@style/ButtonSecondary"
|
||||
android:id="@+id/backup_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="24dp"
|
||||
android:paddingRight="24dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:text="@string/import_backup_title"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<menu
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<item android:title="@string/proxy_settings"
|
||||
android:id="@+id/menu_proxy_settings"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
<item android:title="@string/pref_view_log"
|
||||
android:id="@+id/menu_view_log"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
</menu>
|
||||
@@ -5,7 +5,7 @@
|
||||
<item android:title="@string/qr_code"
|
||||
android:id="@+id/menu_qr"
|
||||
android:icon="@drawable/baseline_qr_code_24"
|
||||
app:showAsAction="always"/>
|
||||
app:showAsAction="ifRoom"/>
|
||||
|
||||
<item android:title="@string/invite_friends"
|
||||
android:id="@+id/menu_invite_friends" />
|
||||
@@ -18,6 +18,13 @@
|
||||
android:visible="false"
|
||||
/>
|
||||
|
||||
<item android:title="@string/proxy_settings"
|
||||
android:id="@+id/menu_proxy_settings"
|
||||
android:icon="@drawable/baseline_proxy_24"
|
||||
app:showAsAction="always"
|
||||
android:visible="false"
|
||||
/>
|
||||
|
||||
<item android:title="@string/menu_settings"
|
||||
android:id="@+id/menu_settings" />
|
||||
|
||||
|
||||
@@ -321,6 +321,7 @@
|
||||
<string name="videochat_tap_to_open">Докоснете, за да отворите</string>
|
||||
<string name="videochat_instance">Сървър за видеочат</string>
|
||||
<string name="videochat_instance_placeholder">Вашият сървър за видеочат</string>
|
||||
<!-- Do not translate "$ROOM", since it is a fixed token ArcaneChat will replace with a generated room ID like "aOclju5eCky" -->
|
||||
<string name="videochat_instance_example">Примери: https://meet.jit.si/$ROOM или basicwebrtc:https://вашият-сървър</string>
|
||||
<string name="videochat_instance_explain_2">Ако настройката е разрешена, можете да започвате видеочат от всеки чат. Изисква съвместимо приложение или браузър и от двете страни.</string>
|
||||
<string name="videochat_instance_from_qr">Да се използва ли \"%1$s\" за поканване на други към видеочатове?\n\nСлед като тази настройка бъде зададена, ще можете да започвате видеочат от всеки чат. Тя ще замени предишната настройка за видеочатове, ако има такава.</string>
|
||||
@@ -496,7 +497,7 @@
|
||||
<string name="multidevice_title">Добавяне на допълнително устройство</string>
|
||||
<string name="multidevice_same_network_hint">Уверете се, че и двете устройства са свързани към една и съща Wi-Fi или друга мрежа</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Ще бъде създаден QR код, чрез сканиране на който другото устройство може да копира акаунта.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Инсталирайте ArcaneChat на другото Ви устройство (https://get.delta.chat)</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Инсталирайте ArcaneChat на другото Ви устройство (https://github.com/ArcaneChat)</string>
|
||||
<!-- "I Already Have a Profile / Add as Second Device” should be the same text as defined by the keys onboarding_alternative_logins and multidevice_receiver_title -->
|
||||
<string name="multidevice_tap_scan_on_other_device">Стартирайте ArcaneChat, докоснете \"Добавяне като допълнително устройство\" и сканирайте кода, показан тук</string>
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by name and/or address eg. "Scan to set up second device for Alice (alice@example.org)" -->
|
||||
@@ -591,13 +592,14 @@
|
||||
<string name="login_smtp_port">SMTP порт</string>
|
||||
<string name="login_smtp_security">Сигурност на SMTP връзката</string>
|
||||
<string name="login_auth_method">Метод за оторизация</string>
|
||||
<!-- the word "SOCKS5" here and in the following strings should not be translated in most cases -->
|
||||
<!-- deprecated -->
|
||||
<string name="login_socks5">SOCKS5</string>
|
||||
<string name="login_socks5_use_socks5">Да се използва SOCKS5</string>
|
||||
<string name="login_socks5_host">SOCKS5 хост</string>
|
||||
<string name="login_socks5_port">SOCKS5 порт</string>
|
||||
<string name="login_socks5_user">SOCKS5 потребител</string>
|
||||
<string name="login_socks5_password">SOCKS5 парола</string>
|
||||
|
||||
<string name="login_info_oauth2_title">Да се продължи ли с опростената настройка?</string>
|
||||
<string name="login_info_oauth2_text">Въведеният адрес за електронна поща поддържа опростена настройка (OAuth 2.0).\n\nНа следващата стъпка, моля позволете на ArcaneChat да действа в качеството си на избраното от Вас приложение за чат върху електронна поща.\n\nArcaneChat няма сървъри, Вашите данни стоят на Вашето устройство.</string>
|
||||
<string name="login_certificate_checks">Проверки на сертификатите</string>
|
||||
@@ -907,7 +909,7 @@
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Мястото за съхранение, предоставено от Вашия доставчик, скоро ще бъде изчерпано:%1$s%% вече са използвани.\n\nМоже да нямате възможност да получавате съобщения, ако мястото за съхранение е заето напълно.\n\n👉 Моля, проверете дали не бихте могли да изтриете стари данни през уеб интерфейса на доставчика и обмислете дали да не включите \"Настройки / Изтриване на старите съобщения\". Можете по всяко време да проверите текущо използваното място за съхранение в \"Настройки / Свързаност\".</string>
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
<string name="devicemsg_bad_time">⚠️ Изглежда датата и часът на Вашето устройство са неточни (%1$s).\n\nНастройте часовника ⏰🔧, за да имате сигурност, че Вашите съобщения се получават правилно.</string>
|
||||
<string name="devicemsg_update_reminder">⚠️ Възможно е версията на Вашия ArcaneChat да е неактуална.\n\nТова може да създаде проблеми, тъй като Вашите чат партньори използват по-нови версии; освен това Ви липсват най-новите възможности.😳\nМоля, проверете за актуализации на https://get.delta.chat или в ползвания от Вас магазин за приложения.</string>
|
||||
<string name="devicemsg_update_reminder">⚠️ Възможно е версията на Вашия ArcaneChat да е неактуална.\n\nТова може да създаде проблеми, тъй като Вашите чат партньори използват по-нови версии; освен това Ви липсват най-новите възможности.😳\nМоля, проверете за актуализации на https://github.com/ArcaneChat или в ползвания от Вас магазин за приложения.</string>
|
||||
|
||||
<!-- Some options as "Add Second Device" or "Backup" may require the system PIN/Fingerprint/Gesture/Etc. to be entered in a system dialog. This hint is added to the system dialog, below a title as "Add Second Device" or "Backup". -->
|
||||
<string name="enter_system_secret_to_continue">Отключете, за да продължите</string>
|
||||
@@ -974,6 +976,7 @@
|
||||
<string name="mailto_link_could_not_be_decoded">Неуспешно декодиране на mailto връзка: %1$s</string>
|
||||
|
||||
<!-- notifications -->
|
||||
<!-- deprecated, use mark_as_read or mark_as_read_short -->
|
||||
<string name="notify_dismiss">Затваряне</string>
|
||||
<string name="notify_reply_button">Отговор</string>
|
||||
<string name="notify_new_message">Ново съобщение</string>
|
||||
|
||||