Compare commits

...

152 Commits

Author SHA1 Message Date
B. Petersen 27a4b7637d Update messenger-backend submodule. 2018-02-27 12:07:30 +01:00
B. Petersen de524cc9f5 changelog 2018-02-27 11:56:24 +01:00
B. Petersen 274d9b0b8f update Albanian translation 2018-02-27 11:43:13 +01:00
B. Petersen 7af947189b wording 2018-02-27 11:01:54 +01:00
B. Petersen ffce932eb9 add links to the issues that are the reason why we stuck on ndk r14b currently 2018-02-25 17:40:13 +01:00
Ampli-fier 3ecb5a4330 mentioned dependency on NDK Revision 14b 2018-02-25 07:50:55 +01:00
B. Petersen 90cd8838f3 remove dead code 2018-02-23 17:29:56 +01:00
B. Petersen ed5c7e549e Update messenger-backend submodule. 2018-02-23 11:55:28 +01:00
B. Petersen a036d892c5 changelog 2018-02-23 11:54:56 +01:00
B. Petersen de1d3ef2bf bump version 2018-02-23 11:52:03 +01:00
B. Petersen 57f58c5619 typo 2018-02-20 16:09:34 +01:00
B. Petersen fcf2b8c20a changelog 2018-02-20 16:01:48 +01:00
B. Petersen ca1a16671a Update messenger-backend submodule. 2018-02-20 15:57:25 +01:00
B. Petersen 1c52ead6bc Update messenger-backend submodule. 2018-02-20 14:39:51 +01:00
B. Petersen a9e0f6c8c4 bump version 2018-02-20 14:39:34 +01:00
B. Petersen 7d7d2acf76 hide retry button on successful setup code entry 2018-02-20 01:13:52 +01:00
B. Petersen ed6e16581d Update messenger-backend submodule. 2018-02-20 00:54:47 +01:00
B. Petersen 083ecdde1a enable setup message parsing (continue key transfer) 2018-02-20 00:54:11 +01:00
B. Petersen 4e862134ee update Turkish translation 2018-02-15 00:34:20 +01:00
B. Petersen 806574ff8d Update messenger-backend submodule. 2018-02-15 00:33:30 +01:00
B. Petersen d0571160c4 Update messenger-backend submodule. 2018-02-14 15:03:01 +01:00
B. Petersen 5a54cd4b8a Update messenger-backend submodule. 2018-02-12 22:48:51 +01:00
Björn Petersen d1f163050c Merge pull request #251 from Hocceruser/contacts-dialog
Show the PermissionContact dialog only once
2018-02-12 22:33:22 +01:00
Hocceruser 81041c8e89 Revert "Do not show the StoragePermission dialog on startup as this permission is not needed yet (only for chats)"
This reverts commit f3508787b8.
2018-02-12 20:51:35 +01:00
Hocceruser f3508787b8 Do not show the StoragePermission dialog on startup as this permission is not needed yet (only for chats) 2018-02-12 20:49:27 +01:00
Hocceruser 6fec2424db Renamed shared preference "general" to "mainconfig". 2018-02-12 20:29:10 +01:00
Björn Petersen e991a209ea Merge pull request #250 from Hocceruser/patch-1
Do not send messages when there is an access error
2018-02-12 18:53:38 +01:00
Hocceruser 8a85c02aba Show the PermissionContact dialog only once 2018-02-11 19:35:04 +01:00
Hocceruser b9edf88093 Do not send messages when there is an access error 2018-02-11 12:39:05 +01:00
B. Petersen f01fa02082 mention the problems with NDK r16b 2018-02-10 19:40:29 +01:00
B. Petersen 5e495c4757 Update french and Turkish translations 2018-02-08 18:21:08 +01:00
B. Petersen dd21632e35 do not flood the log with errors about missing teslacoilsw-URIs 2018-02-08 18:19:22 +01:00
Ampli-fier 5c4898fff7 minor change 2018-01-23 09:08:41 +01:00
B. Petersen c13a5e9b68 changelog 2018-01-18 17:45:55 +01:00
B. Petersen 3a21f4a6c4 Update messenger-backend submodule. 2018-01-18 17:37:05 +01:00
B. Petersen c02aa85cab bump copyright year 2018-01-18 17:36:42 +01:00
B. Petersen 0e731a954c Update messenger-backend submodule. 2018-01-18 17:27:06 +01:00
B. Petersen 271ff3cbb8 bump version 2018-01-18 17:12:58 +01:00
B. Petersen 5ebebc9c43 update Russian and Turkish translations 2018-01-18 16:21:35 +01:00
B. Petersen 091a31d975 Merge branch 'master' of https://github.com/deltachat/deltachat-android 2018-01-18 16:16:38 +01:00
B. Petersen a505f24aa0 Update messenger-backend submodule. 2018-01-18 16:16:23 +01:00
Ampli-fier c58f2017f6 Add IRC channel info 2018-01-14 22:58:54 +01:00
B. Petersen dc6b32d389 update ilya's intro2 2018-01-11 23:46:38 +01:00
B. Petersen ca23b6e2c5 update ilya's intro icons 2018-01-10 23:16:47 +01:00
B. Petersen c8a0d268f9 add new graphics from ilya 2018-01-10 16:35:33 +01:00
B. Petersen 9110ed7c6c update Norwegian and Russian translations 2018-01-09 22:31:49 +01:00
B. Petersen ecf3330e4c Update messenger-backend submodule. 2018-01-07 22:02:45 +01:00
B. Petersen 6b3ce880c0 changelog 2018-01-07 22:01:14 +01:00
B. Petersen 0bbc7677f6 adapt to new api 2018-01-07 21:30:37 +01:00
Björn Petersen ee185d0f87 Merge pull request #241 from Ampli-fier/master
Notification clickable
2018-01-06 23:29:22 +01:00
Ampli-fier 877ca293a0 Notification clickable
Click on Notification opens Delta Chat
2018-01-06 22:36:21 +01:00
B. Petersen 809185769a Wording 2018-01-06 19:39:14 +01:00
Björn Petersen fac34140e9 Merge pull request #238 from Ampli-fier/master
Update the Notification after import
2018-01-05 15:24:49 +01:00
Ampli-fier ec0fd48a1e Update the Notification after import
"Account not configured" was shown instead of the configured mail address.
2018-01-05 14:50:18 +01:00
B. Petersen 0d6d08b911 show links in system command messages, fixes #237 2018-01-04 18:12:39 +01:00
B. Petersen fd8fb3bd55 Update Italian and Polish translations 2018-01-04 14:12:18 +01:00
B. Petersen 1faaab1f9c changelog 2018-01-03 21:38:46 +01:00
B. Petersen 52b6346f08 Update messenger-backend submodule. 2018-01-03 21:34:51 +01:00
B. Petersen 036cc8a9fa adapt to new c-api 2018-01-03 21:32:46 +01:00
B. Petersen 5db22aa4ad remove superfluous to_id 2018-01-03 14:18:42 +01:00
Björn Petersen 2e1e804e8c Merge pull request #232 from staviss/master
Russian translation correction
2017-12-31 15:00:37 +01:00
B. Petersen 78a865166c Update French, Norwegian, Russian, Albanian, Turkish 2017-12-31 14:58:32 +01:00
staviss 35c9a96c18 Update strings.xml 2017-12-31 15:45:56 +03:00
staviss 3b39ff6649 Update strings.xml 2017-12-30 14:31:38 +03:00
B. Petersen 90722b5ac4 changelog 2017-12-25 23:58:27 +01:00
B. Petersen 12e0ecf347 Bump version 2017-12-19 18:38:14 +01:00
B. Petersen da664bc881 update gradle to avoid error about missing forTask() function, do _not_ update version in build.gradle 2017-12-19 18:37:46 +01:00
B. Petersen ce37da0084 Changelog 2017-12-19 18:17:39 +01:00
B. Petersen fb874d5359 Update messenger-backend submodule. 2017-12-19 18:16:16 +01:00
B. Petersen bdc86b0285 revert gradle changes, this should fix #219 2017-12-19 18:15:59 +01:00
B. Petersen a6d8386b08 take more care on JavaArray<->CArray conversions 2017-12-19 13:11:23 +01:00
B. Petersen b69ca46485 protecting c-pointer-handles from being freed twice. 2017-12-18 17:49:49 +01:00
B. Petersen cb30257b83 Update Albanian, Portuguese, Russian, Turkish and Ukrainian translations 2017-12-18 08:31:06 +01:00
B. Petersen 9123210f69 bump version 2017-12-15 17:27:07 +01:00
B. Petersen 630a259a5a add missing MrLotUnref() function, fixes #218 2017-12-15 17:26:54 +01:00
B. Petersen f0183064ed show a 'not yet implemented' message when trying to enter the setup code 2017-12-15 17:08:28 +01:00
B. Petersen 11bca87a47 update gradle 2017-12-15 08:22:56 +01:00
B. Petersen 3863b74fbd Update messenger-backend submodule. 2017-12-15 01:04:56 +01:00
B. Petersen 8216ce7d20 bump version 2017-12-15 01:02:46 +01:00
B. Petersen a7a06ce26b wording 2017-12-15 00:05:37 +01:00
B. Petersen e9e4c01e54 Update messenger-backend submodule. 2017-12-14 23:59:26 +01:00
B. Petersen 47e2fa4a22 disable entering the setup code, for now 2017-12-14 23:59:07 +01:00
B. Petersen 90fad460a6 changelog 2017-12-14 23:54:41 +01:00
B. Petersen 929962c228 bump version 2017-12-14 23:47:52 +01:00
B. Petersen a55edf0ba0 update gradle, simplify versionCode, add flavorDimensions, fixed #217 2017-12-14 23:40:54 +01:00
B. Petersen e255926e10 allow self talk chats 2017-12-14 23:39:06 +01:00
B. Petersen 21ed3e06e6 update german and polish translations 2017-12-11 22:21:53 +01:00
B. Petersen 2ceffb283f update translations 2017-12-09 16:29:50 +01:00
B. Petersen 2e52bacfba wording 2017-12-09 16:28:13 +01:00
B. Petersen 6c624e93b3 Update messenger-backend submodule. 2017-12-07 16:13:49 +01:00
B. Petersen ee5b2371e0 update jni makefile 2017-12-07 16:13:34 +01:00
B. Petersen 18297213f2 update translations 2017-12-06 16:39:31 +01:00
B. Petersen 1373e46d04 regarding cancel/move events on setup message clicks 2017-12-06 12:58:11 +01:00
B. Petersen d7c6bac301 add a little margin below the last setup code row (for kitkat) 2017-12-06 12:48:27 +01:00
B. Petersen b9e3a5454e update Russian translation 2017-12-06 12:26:21 +01:00
B. Petersen 3decd485ea add an option to retry entering the setup code 2017-12-06 12:24:21 +01:00
B. Petersen 285fcf3df3 Update messenger-backend submodule. 2017-12-06 11:27:10 +01:00
B. Petersen 0312960e93 show a message after entering the setup code 2017-12-06 00:39:07 +01:00
B. Petersen cfee7400c9 update Italian 2017-12-06 00:20:03 +01:00
B. Petersen e113fb0902 add layout file for displaying the setup code entry fields 2017-12-06 00:19:18 +01:00
B. Petersen deedd1acac add ui for entering the setup code 2017-12-06 00:17:40 +01:00
B. Petersen e1d912158d detect clicks on setup messages 2017-12-05 17:30:44 +01:00
B. Petersen 373e15b08a changelog 2017-12-05 16:10:57 +01:00
B. Petersen e2bdb0bf13 do not use a symbol for the enter key; while a good idea, in practise, this creates too much confusion and problems with translations. 2017-12-05 16:03:01 +01:00
B. Petersen 19de16887c fix some string escapes 2017-12-05 15:50:07 +01:00
B. Petersen 8609892116 update Albanian 2017-12-05 15:45:08 +01:00
B. Petersen 76717b908d connect after importing a backup, fixes #213 2017-12-05 15:33:52 +01:00
B. Petersen c57ae9861f do the key transfer in a separate thread 2017-12-05 14:01:48 +01:00
B. Petersen 63a2899fdc hilite setup message 2017-12-04 17:44:05 +01:00
B. Petersen 2d86c5b10b update Albanian translation 2017-12-04 16:31:33 +01:00
B. Petersen bd5ba8ebaf Add Setup Message text 2017-12-03 23:52:51 +01:00
B. Petersen 0e90ea1308 add albanian translation 2017-12-03 16:49:25 +01:00
B. Petersen ec05602bb1 update german translation 2017-12-03 16:47:36 +01:00
B. Petersen 2c55c93367 add ui for initiating autocrypt key transfer 2017-12-03 15:53:59 +01:00
B. Petersen b37a91cdd9 adapt to new imex api 2017-11-30 23:44:46 +01:00
B. Petersen 223c39d26a comment 2017-11-30 14:16:56 +01:00
B. Petersen 0a46073552 comment 2017-11-29 17:55:40 +01:00
B. Petersen 0325c9531f Update messenger-backend submodule. 2017-11-29 17:30:21 +01:00
B. Petersen c4ec5c6e1a comment 2017-11-29 17:21:03 +01:00
B. Petersen b00e35f341 Update Portuguese and Turkish translations 2017-11-29 12:05:27 +01:00
B. Petersen a935425e5d typo 2017-11-29 12:03:29 +01:00
B. Petersen 46fc46ee4f switch to Semantic Versioning, https://semver.org/ 2017-11-26 18:00:38 +01:00
B. Petersen d7fcf9433d Update messenger-backend submodule. 2017-11-26 17:59:10 +01:00
B. Petersen ec921e22e8 adapt to new mrlot_t api 2017-11-24 14:42:56 +01:00
B. Petersen 55bc139c72 adapt to new send api 2017-11-23 17:32:58 +01:00
B. Petersen a5187ed1a2 adapt to new late filing api 2017-11-23 13:31:48 +01:00
B. Petersen a79cbe9804 adapt to new api 2017-11-23 11:44:02 +01:00
B. Petersen dd9d10a991 adapt duration/width to new api 2017-11-22 21:59:04 +01:00
Björn Petersen 3c78f6a82f Update ISSUE_TEMPLATE.md 2017-11-22 20:03:03 +01:00
Björn Petersen 4a30940d54 Merge pull request #206 from Ampli-fier/master
Contributing guidelines and Issue template
2017-11-22 19:54:45 +01:00
B. Petersen 0c0e1a35e2 fix memory leak 2017-11-22 16:52:02 +01:00
B. Petersen 0fe4827214 use core function to get the mime type 2017-11-22 16:45:02 +01:00
B. Petersen 80c8b7ef20 use mrmsg_get_file() function 2017-11-22 15:38:43 +01:00
B. Petersen 93a99cdd2c fix weird return values 2017-11-22 15:29:05 +01:00
B. Petersen 76dfa1fca5 adapt to new forward-check-c-api 2017-11-22 15:18:20 +01:00
B. Petersen ba1c32fe05 adapt to new c-api 2017-11-22 14:34:41 +01:00
B. Petersen 1c77b0bf4e Update messenger-backend submodule. 2017-11-21 23:47:14 +01:00
B. Petersen 31331b958f fix usage of jobject and jclass 2017-11-21 23:46:46 +01:00
B. Petersen 80fc718ec8 adapt to new c-api 2017-11-21 23:42:56 +01:00
B. Petersen 823a1e2197 adapt to new C-API 2017-11-21 23:06:11 +01:00
Ampli-fier 8fad2d0226 Update ISSUE_TEMPLATE.md 2017-11-21 22:29:24 +01:00
Ampli-fier ad69dc4ad4 Update CONTRIBUTING.md 2017-11-21 22:19:38 +01:00
B. Petersen f8f89497a9 Adapt to new C-API 2017-11-21 17:01:34 +01:00
B. Petersen 4272ac7619 Adapt to new C-API. 2017-11-21 16:32:40 +01:00
B. Petersen 3e5da102a5 Update checklist 2017-11-20 23:57:35 +01:00
B. Petersen 51742716ec Changelog 2017-11-20 23:43:59 +01:00
B. Petersen fb7a106617 Update messenger-backend submodule. 2017-11-20 18:19:17 +01:00
B. Petersen c016c728d3 Adapt to new C-API. 2017-11-20 16:24:23 +01:00
Ampli-fier b6c1d4b768 Created CONTRIBUTING.md 2017-11-19 19:48:59 +01:00
Ampli-fier 21cb85ce39 Create ISSUE_TEMPLATE.md 2017-11-19 19:48:09 +01:00
B. Petersen fa9f13bba8 Adapt to new API, use mrarray_t instead of carray 2017-11-19 11:41:20 +01:00
B. Petersen 7feda6323a Bump version 2017-11-18 17:15:16 +01:00
59 changed files with 1779 additions and 671 deletions
+25
View File
@@ -0,0 +1,25 @@
# Thank you for contributing to Delta Chat.
Delta Chat is divided in two parts: Android and [Core](https://github.com/deltachat/deltachat-core).
In short, the Android part is about the User Interface. The Interface is translated using [Transifex](https://www.transifex.com/delta-chat/delta-chat-android). The Core part is about handling the connection to the mail server and the chat or e-mail messages as well as providing secure communication by using [Autocrypt](https://autocrypt.org/en/latest/).
Delta Chat Core is used in the Android and in the [iOS](https://github.com/deltachat/deltachat-ios) version.
Please try to create your issue to the respective Issue tracker: Here, or in [Core](https://github.com/deltachat/deltachat-core/issues). Don't worry, if you are not sure. The issue will be handled anyway.
If you intend to create a **feature request** for Delta Chat, please check the exiting requests for
* [Android](https://github.com/deltachat/deltachat-android/issues?q=is%3Aissue+label%3A%22feature+request%22+sort%3Aupdated-desc) and
* [Core](https://github.com/deltachat/deltachat-core/issues?q=is%3Aissue+label%3A%22feature+request%22+sort%3Aupdated-desc)
first.
If you intend to send a **bug report** for Delta Chat, search for bugs (including closed) in
* [Android](https://github.com/deltachat/deltachat-android/issues?&q=is%3Aissue) and
* [Core](https://github.com/deltachat/deltachat-core/issues?&q=is%3Aissue)
A **bug** is a reproducable misbehaviour, when something happens but something else should happen instead.
Did you know there is a [Help](https://delta.chat/en/help) page for Delta Chat?
To ask questions, you are invited to join our IRC channel **#deltachat** on [Freenode](https://webchat.freenode.net/?uio=MTE9MjA16a&channels=%23deltachat).
+34
View File
@@ -0,0 +1,34 @@
_Please read the guidelines linked above, especially when you are a first time contributor. Remove this text and provide some basic informations below, if applicable. Remove template content that is not applicable._
**Delta Chat version**
See settings dialog …
**Expected behavior**
What is the expected output?
**Actual behavior**
What do you see instead?
**Steps to reproduce the problem**
1.
2.
**Screen snapshots**
If applicable …
**Debug logs**
If applicable, debug logs can be copied from within the Delta Chat app:
Open the _Settings_ menu -> _About_ -> _version number|Info_.
Alternatively from the Android system log:
` adb logcat -v time -s DeltaChat `
This log contains private data (e.g. mail address, provider information) which shall be removed or anonymised prior to posting.
+58
View File
@@ -1,5 +1,63 @@
# Delta Chat Changelog
## v0.15.0
2018-02-27
* Render the waveform for voice messages
* Fix problems with voice messages on various devices
* Improve deletion of message that were moved around by another e-mail client
* Really delete messages on the server, do not only mark them for deletion
* Ignore subsequent keys or blocks in OpenPGP files
* Leave incoming Autocrypt Setup Messages in the inbox so that any number of other e-mail-clients can process them
* Avoid messages sent to the "Me" chat appearing twice in other e-mail clients
* Update Albanian translation
## v0.14.0
2018-02-20
* Evaluate gossiped keys
* Option to transfer the Autocrypt Setup to another device or e-mail client
* Accept Autocrypt Setup transferred from other devices or e-mail client
* Send any data from device to device using the chat "Me - Messages I sent to myself"
* Do not send messages when there is an access error
* Request for contact permissions only once
* Bug fixes
* Update French and Turkish translations
## v0.13.0
2018-01-18
* Reply encrypted if the sender has enabled encryption manually (esp. useful when chatting with clients as K-9 or Enigmail)
* Update welcome screen graphics
* Update Norwegian, Russian and Turkish translations
## v0.12.0
2018-01-07
* Gossip keys of other group members in the encrypted payload (will also be evaluated in one of the next versions)
* Use SHA-256 instead of SHA-1 in signatures
* Make the permanent notification clickable
* Update permanent notification after import
* Fix rendering of system messages
* Various bug fixes
* Update Albanian, French, Italian, Norwegian, Polish, Russian and Turkish translations
## v0.11.4
2017-12-17
* Add option to initiate Autocrypt Key Transfer
* Connect after importing a backup
* Reading memory hole headers
* Add Albanian translation
* Update German, Italian, Polish, Portuguese, Russian, Turkish and Ukrainian translations
## v0.10.0
2017-11-29
* Fix usage of multiple private keys
* Fix various memory leaks
* Update English, Portuguese and Turkish translations
## v0.9.9
2017-11-18
+10 -8
View File
@@ -31,8 +31,8 @@ dependencies {
}
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
compileSdkVersion 25 // should be ...
buildToolsVersion '25.0.2' // ... in sync unless you know exactly what you're doing
useLibrary 'org.apache.http.legacy'
defaultConfig.applicationId = "com.b44t.messenger"
@@ -79,13 +79,12 @@ android {
}
}
defaultConfig.versionCode = 48
sourceSets.main {
jniLibs.srcDir 'libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
flavorDimensions "none"
productFlavors {
/*
x86 {
@@ -108,19 +107,22 @@ android {
}
*/
fat {
versionCode = 3
dimension "none"
//versionCode = 3
}
}
applicationVariants.all { variant ->
/*applicationVariants.all { variant ->
def abiVersion = variant.productFlavors.get(0).versionCode
variant.mergedFlavor.versionCode = defaultConfig.versionCode * 10 + abiVersion;
}
}*/
defaultConfig {
minSdkVersion 14 // 14: Android 4.0 Ice Cream Sandwich 2011 (Telegram default), 21: Android 5.0 Lollipop 2014 (recommended for InstantRun)
targetSdkVersion 25 // 25: Nougat. CAVE: Do NOT target "Andoid O" without checking the background tasks carefully, see https://developer.android.com/preview/behavior-changes.html#back-all . As long as we target "Nougat", everything works as expected even for "Andoid O" or later
// in general, we should not change the target without reason; eg. after the switch to Nougat, the camera stops working (see https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en )
versionName "0.9.9" // do NOT forget to increase defaultConfig.versionCode!
versionName "0.15.0" // do NOT forget to increase defaultConfig.versionCode!
versionCode 513
}
}
+3 -1
View File
@@ -1633,15 +1633,18 @@ LOCAL_SRC_FILES += \
./messenger-backend/libs/netpgp/src/writer.c \
./messenger-backend/src/mraheader.c \
./messenger-backend/src/mrapeerstate.c \
./messenger-backend/src/mrarray.c \
./messenger-backend/src/mrchat.c \
./messenger-backend/src/mrchatlist.c \
./messenger-backend/src/mrcontact.c \
./messenger-backend/src/mrdehtml.c \
./messenger-backend/src/mrhash.c \
./messenger-backend/src/mrimap.c \
./messenger-backend/src/mrjob.c \
./messenger-backend/src/mrkey.c \
./messenger-backend/src/mrkeyring.c \
./messenger-backend/src/mrloginparam.c \
./messenger-backend/src/mrlot.c \
./messenger-backend/src/mrmailbox.c \
./messenger-backend/src/mrmailbox_configure.c \
./messenger-backend/src/mrmailbox_e2ee.c \
@@ -1653,7 +1656,6 @@ LOCAL_SRC_FILES += \
./messenger-backend/src/mrmsg.c \
./messenger-backend/src/mrparam.c \
./messenger-backend/src/mrpgp.c \
./messenger-backend/src/mrpoortext.c \
./messenger-backend/src/mrsaxparser.c \
./messenger-backend/src/mrsimplify.c \
./messenger-backend/src/mrsmtp.c \
+296 -220
View File
@@ -117,15 +117,17 @@ void mrosnative_unsetup_thread(mrmailbox_t* mailbox)
/* tools */
static jintArray carray2jintArray_n_carray_free(JNIEnv *env, const carray* ca)
static jintArray mrarray2jintArray_n_mrarray_unref(JNIEnv *env, mrarray_t* ca)
{
int i, icnt = ca? carray_count(ca) : 0;
/* takes a C-array of type mrarray_t and converts it it a Java-Array.
then the C-array is freed and the Java-Array is returned. */
int i, icnt = ca? mrarray_get_cnt(ca) : 0;
jintArray ret = (*env)->NewIntArray(env, icnt); if (ret == NULL) { return NULL; }
if( ca ) {
if( icnt ) {
void** ca_data = carray_data(ca);
if( sizeof(void*)==sizeof(jint) ) {
uintptr_t* ca_data = mrarray_get_raw(ca);
if( sizeof(uintptr_t)==sizeof(jint) ) {
(*env)->SetIntArrayRegion(env, ret, 0, icnt, (jint*)ca_data);
}
else {
@@ -137,7 +139,7 @@ static jintArray carray2jintArray_n_carray_free(JNIEnv *env, const carray* ca)
free(temp);
}
}
carray_free(ca);
mrarray_unref(ca);
}
return ret;
@@ -146,7 +148,10 @@ static jintArray carray2jintArray_n_carray_free(JNIEnv *env, const carray* ca)
static uint32_t* jintArray2uint32Pointer(JNIEnv* env, jintArray ja, int* ret_icnt)
{
/* takes a Java-Array and converts it to a C-Array. */
uint32_t* ret = NULL;
if( ret_icnt ) { *ret_icnt = 0; }
if( env && ja && ret_icnt )
{
int i, icnt = (*env)->GetArrayLength(env, ja);
@@ -167,6 +172,7 @@ static uint32_t* jintArray2uint32Pointer(JNIEnv* env, jintArray ja, int* ret_icn
}
}
}
return ret;
}
@@ -247,8 +253,10 @@ JNIEXPORT void Java_com_b44t_messenger_MrMailbox_close(JNIEnv *env, jclass cls)
JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_getBlobdir(JNIEnv *env, jclass cls)
{
mrmailbox_t* ths = get_mrmailbox_t(env, cls); if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_blobdir);
char* temp = mrmailbox_get_blobdir(get_mrmailbox_t(env, cls));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
@@ -258,9 +266,9 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_configureAndConnect(JNIEnv *env
}
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_configureCancel(JNIEnv *env, jclass cls)
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_stopOngoingProcess(JNIEnv *env, jclass cls)
{
mrmailbox_configure_cancel(get_mrmailbox_t(env, cls));
mrmailbox_stop_ongoing_process(get_mrmailbox_t(env, cls));
}
@@ -287,9 +295,9 @@ JNIEXPORT void Java_com_b44t_messenger_MrMailbox_disconnect(JNIEnv *env, jclass
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_getKnownContacts(JNIEnv *env, jclass cls, jstring query)
{
CHAR_REF(query);
carray* ca = mrmailbox_get_known_contacts(get_mrmailbox_t(env, cls), queryPtr);
mrarray_t* ca = mrmailbox_get_known_contacts(get_mrmailbox_t(env, cls), queryPtr);
CHAR_UNREF(query);
return carray2jintArray_n_carray_free(env, ca);
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
@@ -301,8 +309,8 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_getBlockedCount(JNIEnv *env, jc
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_getBlockedContacts(JNIEnv *env, jclass cls)
{
carray* ca = mrmailbox_get_blocked_contacts(get_mrmailbox_t(env, cls));
return carray2jintArray_n_carray_free(env, ca);
mrarray_t* ca = mrmailbox_get_blocked_contacts(get_mrmailbox_t(env, cls));
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
@@ -366,7 +374,7 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_getChatIdByContactId(JNIEnv *en
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_markseenMsgs(JNIEnv *env, jclass cls, jintArray msg_ids)
{
int msg_ids_cnt;
int msg_ids_cnt = 0;
const uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
mrmailbox_markseen_msgs(get_mrmailbox_t(env, cls), msg_ids_ptr, msg_ids_cnt);
free(msg_ids_ptr);
@@ -433,10 +441,10 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_setChatName(JNIEnv *env, jclass
}
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_setChatImage(JNIEnv *env, jclass cls, jint chat_id, jstring image/*NULL=delete*/)
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_setChatProfileImage(JNIEnv *env, jclass cls, jint chat_id, jstring image/*NULL=delete*/)
{
CHAR_REF(image);
jint ret = (jint)mrmailbox_set_chat_image(get_mrmailbox_t(env, cls), chat_id, imagePtr/*CHAR_REF() preserves NULL*/);
jint ret = (jint)mrmailbox_set_chat_profile_image(get_mrmailbox_t(env, cls), chat_id, imagePtr/*CHAR_REF() preserves NULL*/);
CHAR_UNREF(image);
return ret;
}
@@ -474,7 +482,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_MrMailboxGetMsgInfo(JNIEnv *
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_deleteMsgs(JNIEnv *env, jclass cls, jintArray msg_ids)
{
int msg_ids_cnt;
int msg_ids_cnt = 0;
const uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
mrmailbox_delete_msgs(get_mrmailbox_t(env, cls), msg_ids_ptr, msg_ids_cnt);
free(msg_ids_ptr);
@@ -483,7 +491,7 @@ JNIEXPORT void Java_com_b44t_messenger_MrMailbox_deleteMsgs(JNIEnv *env, jclass
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_forwardMsgs(JNIEnv *env, jclass cls, jintArray msg_ids, jint chat_id)
{
int msg_ids_cnt;
int msg_ids_cnt = 0;
const uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
mrmailbox_forward_msgs(get_mrmailbox_t(env, cls), msg_ids_ptr, msg_ids_cnt, chat_id);
free(msg_ids_ptr);
@@ -499,33 +507,30 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_sendTextMsg(JNIEnv *env, jclass
}
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_sendVcardMsg(JNIEnv *env, jobject obj, jint chat_id, jint contact_id)
{
return mrmailbox_send_vcard_msg(get_mrmailbox_t(env, obj), chat_id, contact_id);
}
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_sendMediaMsg(JNIEnv *env, jclass cls, jint chat_id, jint type, jstring file, jstring mime, jint w, jint h, jint ms, jstring author, jstring trackname)
{
mrmsg_t* msg = mrmsg_new();
msg->m_type = type;
CHAR_REF(mime);
mrparam_set(msg->m_param, 'm', mimePtr);
CHAR_UNREF(mime);
CHAR_REF(file);
mrparam_set(msg->m_param, 'f', filePtr);
CHAR_UNREF(file);
if( type == MR_MSG_IMAGE || type == MR_MSG_GIF || type == MR_MSG_VIDEO ) {
mrparam_set_int(msg->m_param, 'w', w);
mrparam_set_int(msg->m_param, 'h', h);
}
if( type == MR_MSG_AUDIO || type == MR_MSG_VOICE || type == MR_MSG_VIDEO ) {
mrparam_set_int(msg->m_param, 'd', ms);
}
if( type == MR_MSG_AUDIO ) {
CHAR_REF(author);
mrparam_set(msg->m_param, 'N', authorPtr);
CHAR_UNREF(author);
CHAR_REF(trackname);
mrparam_set(msg->m_param, 'n', tracknamePtr);
CHAR_UNREF(trackname);
}
jint msg_id = mrmailbox_send_msg(get_mrmailbox_t(env, cls), chat_id, msg);
mrmsg_unref(msg);
jint msg_id = 0;
CHAR_REF(file);
CHAR_REF(mime);
CHAR_REF(author);
CHAR_REF(trackname);
switch( type ) {
case MR_MSG_IMAGE: msg_id = (jint)mrmailbox_send_image_msg(get_mrmailbox_t(env, cls), chat_id, filePtr, mimePtr, w, h); break;
case MR_MSG_VIDEO: msg_id = (jint)mrmailbox_send_video_msg(get_mrmailbox_t(env, cls), chat_id, filePtr, mimePtr, w, h, ms); break;
case MR_MSG_VOICE: msg_id = (jint)mrmailbox_send_voice_msg(get_mrmailbox_t(env, cls), chat_id, filePtr, mimePtr, ms); break;
case MR_MSG_AUDIO: msg_id = (jint)mrmailbox_send_audio_msg(get_mrmailbox_t(env, cls), chat_id, filePtr, mimePtr, ms, authorPtr, tracknamePtr); break;
default: msg_id = (jint)mrmailbox_send_file_msg (get_mrmailbox_t(env, cls), chat_id, filePtr, mimePtr); break;
}
CHAR_UNREF(trackname);
CHAR_UNREF(author);
CHAR_UNREF(mime);
CHAR_UNREF(file);
return msg_id;
}
@@ -606,11 +611,33 @@ JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_cmdline(JNIEnv *env, jclass
}
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_imex(JNIEnv *env, jclass cls, jint what, jstring dir)
JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_initiateKeyTransfer(JNIEnv *env, jclass cls)
{
jstring setup_code = NULL;
char* temp = mrmailbox_initiate_key_transfer(get_mrmailbox_t(env, cls));
if( temp ) {
setup_code = JSTRING_NEW(temp);
free(temp);
}
return setup_code;
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrMailbox_continueKeyTransfer(JNIEnv *env, jclass cls, jint msg_id, jstring setupCode)
{
CHAR_REF(setupCode);
jboolean ret = mrmailbox_continue_key_transfer(get_mrmailbox_t(env, cls), msg_id, setupCodePtr);
CHAR_UNREF(setupCode);
return ret;
}
JNIEXPORT int Java_com_b44t_messenger_MrMailbox_imex(JNIEnv *env, jclass cls, jint what, jstring dir)
{
CHAR_REF(dir);
mrmailbox_imex(get_mrmailbox_t(env, cls), what, dirPtr, "");
jint ret = mrmailbox_imex(get_mrmailbox_t(env, cls), what, dirPtr, "");
CHAR_UNREF(dir);
return ret;
}
@@ -672,13 +699,15 @@ JNIEXPORT jint Java_com_b44t_messenger_MrChatlist_MrChatlistGetCnt(JNIEnv *env,
JNIEXPORT jlong Java_com_b44t_messenger_MrChatlist_MrChatlistGetChatByIndex(JNIEnv *env, jclass c, jlong hChatlist, jint index)
{
return (jlong)mrchatlist_get_chat_by_index((mrchatlist_t*)hChatlist, index);
mrchatlist_t* chatlist = (mrchatlist_t*)hChatlist;
return (jlong)mrmailbox_get_chat(mrchatlist_get_mailbox(chatlist), mrchatlist_get_chat_id(chatlist, index));
}
JNIEXPORT jlong Java_com_b44t_messenger_MrChatlist_MrChatlistGetMsgByIndex(JNIEnv *env, jclass c, jlong hChatlist, jint index)
{
return (jlong)mrchatlist_get_msg_by_index((mrchatlist_t*)hChatlist, index);
mrchatlist_t* chatlist = (mrchatlist_t*)hChatlist;
return (jlong)mrmailbox_get_msg(mrchatlist_get_mailbox(chatlist), mrchatlist_get_msg_id(chatlist, index));
}
@@ -713,93 +742,82 @@ JNIEXPORT void Java_com_b44t_messenger_MrChat_MrChatUnref(JNIEnv *env, jclass c,
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getId(JNIEnv *env, jclass cls)
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getId(JNIEnv *env, jobject obj)
{
mrchat_t* ths = get_mrchat_t(env, cls); if( ths == NULL ) { return 0; }
return ths->m_id;
return mrchat_get_id(get_mrchat_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getType(JNIEnv *env, jclass cls)
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getType(JNIEnv *env, jobject obj)
{
mrchat_t* ths = get_mrchat_t(env, cls); if( ths == NULL ) { return 0; }
return ths->m_type;
return mrchat_get_type(get_mrchat_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getArchived(JNIEnv *env, jclass cls)
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getArchived(JNIEnv *env, jobject obj)
{
mrchat_t* ths = get_mrchat_t(env, cls); if( ths == NULL ) { return 0; }
return ths->m_archived;
return mrchat_get_archived(get_mrchat_t(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_getName(JNIEnv *env, jclass cls)
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_getName(JNIEnv *env, jobject obj)
{
mrchat_t* ths = get_mrchat_t(env, cls); if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_name);
}
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_getSubtitle(JNIEnv *env, jclass cls)
{
const char* temp = mrchat_get_subtitle(get_mrchat_t(env, cls));
const char* temp = mrchat_get_name(get_mrchat_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getParam(JNIEnv *env, jclass cls, jint key, jstring def)
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_getSubtitle(JNIEnv *env, jobject obj)
{
mrchat_t* ths = get_mrchat_t(env, cls);
jstring ret = NULL;
CHAR_REF(def);
char* temp = mrparam_get(ths? ths->m_param:NULL, key, defPtr);
if( temp ) {
ret = JSTRING_NEW(temp);
free(temp);
}
CHAR_UNREF(def);
return ret; /* returns NULL only if key is unset and "def" is NULL */
const char* temp = mrchat_get_subtitle(get_mrchat_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_getParamInt(JNIEnv *env, jclass cls, jint key, jint def)
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_getProfileImage(JNIEnv *env, jobject obj)
{
mrchat_t* ths = get_mrchat_t(env, cls);
return mrparam_get_int(ths? ths->m_param:NULL, key, def);
const char* temp = mrchat_get_profile_image(get_mrchat_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_MrChatGetDraft(JNIEnv *env, jclass c, jlong hChat) /* returns NULL for "no draft" */
JNIEXPORT jboolean Java_com_b44t_messenger_MrChat_isUnpromoted(JNIEnv *env, jobject obj)
{
mrchat_t* ths = (mrchat_t*)hChat;
if( ths && ths->m_draft_text ) {
return JSTRING_NEW(ths->m_draft_text);
}
return NULL; /* no draft */
return mrchat_is_unpromoted(get_mrchat_t(env, obj)) != 0;
}
JNIEXPORT jlong Java_com_b44t_messenger_MrChat_MrChatGetDraftTimestamp(JNIEnv *env, jclass c, jlong hChat)
JNIEXPORT jboolean Java_com_b44t_messenger_MrChat_isSelfTalk(JNIEnv *env, jobject obj)
{
mrchat_t* ths = (mrchat_t*)hChat; if( ths == NULL ) { return 0; }
return ths->m_draft_timestamp;
return mrchat_is_self_talk(get_mrchat_t(env, obj)) != 0;
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_MrChatGetDraftReplyToMsgId(JNIEnv *env, jclass c, jlong hChat)
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_getDraft(JNIEnv *env, jobject obj) /* returns NULL for "no draft" */
{
mrchat_t* ths = (mrchat_t*)hChat; if( ths == NULL ) { return 0; }
return 0;
const char* temp = mrchat_get_draft(get_mrchat_t(env, obj));
jstring ret = temp? JSTRING_NEW(temp) : NULL;
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_MrChatSetDraft(JNIEnv *env, jclass c, jlong hChat, jstring draft /* NULL=delete */, jint replyToMsgId)
JNIEXPORT jlong Java_com_b44t_messenger_MrChat_getDraftTimestamp(JNIEnv *env, jobject obj)
{
return (jlong)mrchat_get_draft_timestamp(get_mrchat_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrChat_setDraft(JNIEnv *env, jobject obj, jstring draft /* NULL=delete */, jint replyToMsgId)
{
CHAR_REF(draft);
jint ret = (jint)mrchat_set_draft((mrchat_t*)hChat, draftPtr /* NULL=delete */);
jint ret = (jint)mrchat_set_draft(get_mrchat_t(env, obj), draftPtr /* NULL=delete */);
CHAR_UNREF(draft);
return ret;
}
@@ -807,8 +825,8 @@ JNIEXPORT jint Java_com_b44t_messenger_MrChat_MrChatSetDraft(JNIEnv *env, jclass
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_getChatMedia(JNIEnv *env, jclass cls, jint chat_id, jint msg_type, jint or_msg_type)
{
carray* ca = mrmailbox_get_chat_media(get_mrmailbox_t(env, cls), chat_id, msg_type, or_msg_type);
return carray2jintArray_n_carray_free(env, ca);
mrarray_t* ca = mrmailbox_get_chat_media(get_mrmailbox_t(env, cls), chat_id, msg_type, or_msg_type);
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
@@ -820,31 +838,31 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_getNextMedia(JNIEnv *env, jclas
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_getChatMsgs(JNIEnv *env, jclass cls, jint chat_id, jint flags, jint marker1before)
{
carray* ca = mrmailbox_get_chat_msgs(get_mrmailbox_t(env, cls), chat_id, flags, marker1before);
return carray2jintArray_n_carray_free(env, ca);
mrarray_t* ca = mrmailbox_get_chat_msgs(get_mrmailbox_t(env, cls), chat_id, flags, marker1before);
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_searchMsgs(JNIEnv *env, jclass cls, jint chat_id, jstring query)
{
CHAR_REF(query);
carray* ca = mrmailbox_search_msgs(get_mrmailbox_t(env, cls), chat_id, queryPtr);
mrarray_t* ca = mrmailbox_search_msgs(get_mrmailbox_t(env, cls), chat_id, queryPtr);
CHAR_UNREF(query);
return carray2jintArray_n_carray_free(env, ca);
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_getFreshMsgs(JNIEnv *env, jclass cls)
{
carray* ca = mrmailbox_get_fresh_msgs(get_mrmailbox_t(env, cls));
return carray2jintArray_n_carray_free(env, ca);
mrarray_t* ca = mrmailbox_get_fresh_msgs(get_mrmailbox_t(env, cls));
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
JNIEXPORT jintArray Java_com_b44t_messenger_MrMailbox_getChatContacts(JNIEnv *env, jclass cls, jint chat_id)
{
carray* ca = mrmailbox_get_chat_contacts(get_mrmailbox_t(env, cls), chat_id);
return carray2jintArray_n_carray_free(env, ca);
mrarray_t* ca = mrmailbox_get_chat_contacts(get_mrmailbox_t(env, cls), chat_id);
return mrarray2jintArray_n_mrarray_unref(env, ca);
}
@@ -873,109 +891,80 @@ JNIEXPORT void Java_com_b44t_messenger_MrMsg_MrMsgUnref(JNIEnv *env, jclass c, j
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_MrMsgGetId(JNIEnv *env, jclass c, jlong hMsg)
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getId(JNIEnv *env, jobject obj)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_id;
return mrmsg_get_id(get_mrmsg_t(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_MrMsgGetText(JNIEnv *env, jclass c, jlong hMsg)
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getText(JNIEnv *env, jobject obj)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_text);
}
JNIEXPORT jlong Java_com_b44t_messenger_MrMsg_MrMsgGetTimestamp(JNIEnv *env, jclass c, jlong hMsg)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_timestamp;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_MrMsgGetType(JNIEnv *env, jclass c, jlong hMsg)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_type;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_MrMsgGetState(JNIEnv *env, jclass c, jlong hMsg)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_state;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_MrMsgGetChatId(JNIEnv *env, jclass c, jlong hMsg)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_chat_id;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_MrMsgGetFromId(JNIEnv *env, jclass c, jlong hMsg)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_from_id;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_MrMsgGetToId(JNIEnv *env, jclass c, jlong hMsg)
{
mrmsg_t* ths = (mrmsg_t*)hMsg; if( ths == NULL ) { return 0; }
return ths->m_to_id;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getParam(JNIEnv *env, jobject obj, jint key, jstring def)
{
mrmsg_t* ths = get_mrmsg_t(env, obj);
jstring ret = NULL;
CHAR_REF(def);
char* temp = mrparam_get(ths? ths->m_param:NULL, key, defPtr);
if( temp ) {
ret = JSTRING_NEW(temp);
free(temp);
}
CHAR_UNREF(def);
char* temp = mrmsg_get_text(get_mrmsg_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getParamInt(JNIEnv *env, jobject obj, jint key, jint def)
JNIEXPORT jlong Java_com_b44t_messenger_MrMsg_getTimestamp(JNIEnv *env, jobject obj)
{
mrmsg_t* ths = get_mrmsg_t(env, obj);
return mrparam_get_int(ths? ths->m_param:NULL, key, def);
return (jlong)mrmsg_get_timestamp(get_mrmsg_t(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_MrMsg_setParamInt(JNIEnv *env, jobject obj, jint key, jint value)
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getType(JNIEnv *env, jobject obj)
{
mrmsg_t* ths = get_mrmsg_t(env, obj);
mrparam_set_int(ths? ths->m_param:NULL, key, value);
return mrmsg_get_type(get_mrmsg_t(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_MrMsg_saveParamToDisk(JNIEnv *env, jobject obj)
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getState(JNIEnv *env, jobject obj)
{
mrmsg_save_param_to_disk(get_mrmsg_t(env, obj));
return mrmsg_get_state(get_mrmsg_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getChatId(JNIEnv *env, jobject obj)
{
return mrmsg_get_chat_id(get_mrmsg_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getFromId(JNIEnv *env, jobject obj)
{
return mrmsg_get_from_id(get_mrmsg_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getWidth(JNIEnv *env, jobject obj, jint def)
{
jint ret = (jint)mrmsg_get_width(get_mrmsg_t(env, obj));
return ret? ret : def;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getHeight(JNIEnv *env, jobject obj, jint def)
{
jint ret = (jint)mrmsg_get_height(get_mrmsg_t(env, obj));
return ret? ret : def;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getDuration(JNIEnv *env, jobject obj)
{
return mrmsg_get_duration(get_mrmsg_t(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_MrMsg_lateFilingMediaSize(JNIEnv *env, jobject obj, jint width, jint height, jint duration)
{
mrmsg_latefiling_mediasize(get_mrmsg_t(env, obj), width, height, duration);
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getBytes(JNIEnv *env, jobject obj)
{
jint ret = 0;
mrmsg_t* ths = get_mrmsg_t(env, obj);
if( ths ) {
const char* file = mrparam_get(ths->m_param, 'f', NULL);
if( file ) {
ret = mr_get_filebytes(file);
free(file);
}
}
return ret;
return (jint)mrmsg_get_filebytes(get_mrmsg_t(env, obj));
}
@@ -985,21 +974,45 @@ JNIEXPORT jlong Java_com_b44t_messenger_MrMsg_getSummaryCPtr(JNIEnv *env, jobjec
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getSummarytext(JNIEnv *env, jobject obj, jint approx_characters)
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getSummarytext(JNIEnv *env, jobject obj, jint approx_characters)
{
return JSTRING_NEW(mrmsg_get_summarytext(get_mrmsg_t(env, obj), approx_characters));
char* temp = mrmsg_get_summarytext(get_mrmsg_t(env, obj), approx_characters);
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_showPadlock(JNIEnv *env, jobject obj)
{
return mrmsg_show_padlock(get_mrmsg_t(env, obj));
return mrmsg_get_showpadlock(get_mrmsg_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_getFilename(JNIEnv *env, jobject obj)
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getFile(JNIEnv *env, jobject obj)
{
return JSTRING_NEW(mrmsg_get_filename(get_mrmsg_t(env, obj)));
char* temp = mrmsg_get_file(get_mrmsg_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getFilemime(JNIEnv *env, jobject obj)
{
char* temp = mrmsg_get_filemime(get_mrmsg_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getFilename(JNIEnv *env, jobject obj)
{
char* temp = mrmsg_get_filename(get_mrmsg_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
@@ -1009,12 +1022,40 @@ JNIEXPORT jlong Java_com_b44t_messenger_MrMsg_getMediainfoCPtr(JNIEnv *env, jobj
}
JNIEXPORT jint Java_com_b44t_messenger_MrMsg_isIncreation(JNIEnv *env, jobject obj)
JNIEXPORT jboolean Java_com_b44t_messenger_MrMsg_isForwarded(JNIEnv *env, jobject obj)
{
return (jint)mrmsg_is_increation(get_mrmsg_t(env, obj));
return mrmsg_is_forwarded(get_mrmsg_t(env, obj)) != 0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrMsg_isIncreation(JNIEnv *env, jobject obj)
{
return mrmsg_is_increation(get_mrmsg_t(env, obj)) != 0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrMsg_isSystemcmd(JNIEnv *env, jobject obj)
{
return mrmsg_is_systemcmd(get_mrmsg_t(env, obj)) != 0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrMsg_isSetupMessage(JNIEnv *env, jobject obj)
{
return mrmsg_is_setupmessage(get_mrmsg_t(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getSetupCodeBegin(JNIEnv *env, jobject obj)
{
char* temp = mrmsg_get_setupcodebegin(get_mrmsg_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
/*******************************************************************************
* MrContact
******************************************************************************/
@@ -1040,77 +1081,112 @@ JNIEXPORT void Java_com_b44t_messenger_MrContact_MrContactUnref(JNIEnv *env, jcl
}
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_MrContactGetName(JNIEnv *env, jclass c, jlong hContact)
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_getName(JNIEnv *env, jobject obj)
{
mrcontact_t* ths = (mrcontact_t*)hContact; if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_name);
const char* temp = mrcontact_get_name(get_mrcontact_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_getAuthName(JNIEnv *env, jclass cls)
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_getDisplayName(JNIEnv *env, jobject obj)
{
mrcontact_t* ths = get_mrcontact_t(env, cls); if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_authname);
const char* temp = mrcontact_get_display_name(get_mrcontact_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_MrContactGetAddr(JNIEnv *env, jclass c, jlong hContact)
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_getAddr(JNIEnv *env, jobject obj)
{
mrcontact_t* ths = (mrcontact_t*)hContact; if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_addr);
const char* temp = mrcontact_get_addr(get_mrcontact_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrContact_MrContactIsBlocked(JNIEnv *env, jclass c, jlong hContact)
JNIEXPORT jstring Java_com_b44t_messenger_MrContact_getNameNAddr(JNIEnv *env, jobject obj)
{
mrcontact_t* ths = (mrcontact_t*)hContact; if( ths == NULL ) { return 0; }
return (jint)ths->m_blocked;
const char* temp = mrcontact_get_name_n_addr(get_mrcontact_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrContact_isBlocked(JNIEnv *env, jobject obj)
{
return (jboolean)( mrcontact_is_blocked(get_mrcontact_t(env, obj)) != 0 );
}
/*******************************************************************************
* MrPoortext
* MrLot
******************************************************************************/
JNIEXPORT void Java_com_b44t_messenger_MrPoortext_MrPoortextUnref(JNIEnv *env, jclass c, jlong hPoortext)
static mrlot_t* get_mrlot_t(JNIEnv *env, jobject obj)
{
mrpoortext_unref((mrpoortext_t*)hPoortext);
static jfieldID fid = 0;
if( fid == 0 ) {
jclass cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, cls, "m_hLot", "J" /*Signature, J=long*/);
}
if( fid ) {
return (mrlot_t*)(*env)->GetLongField(env, obj, fid);
}
return NULL;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrPoortext_MrPoortextGetText1(JNIEnv *env, jclass c, jlong hPoortext)
JNIEXPORT void Java_com_b44t_messenger_MrLot_unref(JNIEnv *env, jclass cls, jlong hLot)
{
mrpoortext_t* ths = (mrpoortext_t*)hPoortext; if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_text1);
mrlot_unref((mrlot_t*)hLot);
}
JNIEXPORT jint Java_com_b44t_messenger_MrPoortext_MrPoortextGetText1Meaning(JNIEnv *env, jclass c, jlong hPoortext)
JNIEXPORT jstring Java_com_b44t_messenger_MrLot_getText1(JNIEnv *env, jobject obj)
{
mrpoortext_t* ths = (mrpoortext_t*)hPoortext; if( ths == NULL ) { return 0; }
return ths->m_text1_meaning;
char* temp = mrlot_get_text1(get_mrlot_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrPoortext_MrPoortextGetText2(JNIEnv *env, jclass c, jlong hPoortext)
JNIEXPORT jint Java_com_b44t_messenger_MrLot_getText1Meaning(JNIEnv *env, jobject obj)
{
mrpoortext_t* ths = (mrpoortext_t*)hPoortext; if( ths == NULL ) { return JSTRING_NEW(NULL); }
return JSTRING_NEW(ths->m_text2);
return mrlot_get_text1_meaning(get_mrlot_t(env, obj));
}
JNIEXPORT jlong Java_com_b44t_messenger_MrPoortext_MrPoortextGetTimestamp(JNIEnv *env, jclass c, jlong hPoortext)
JNIEXPORT jstring Java_com_b44t_messenger_MrLot_getText2(JNIEnv *env, jobject obj)
{
mrpoortext_t* ths = (mrpoortext_t*)hPoortext; if( ths == NULL ) { return 0; }
return ths->m_timestamp;
char* temp = mrlot_get_text2(get_mrlot_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_MrPoortext_MrPoortextGetState(JNIEnv *env, jclass c, jlong hPoortext)
JNIEXPORT jlong Java_com_b44t_messenger_MrLot_getTimestamp(JNIEnv *env, jobject obj)
{
mrpoortext_t* ths = (mrpoortext_t*)hPoortext; if( ths == NULL ) { return 0; }
return ths->m_state;
return mrlot_get_timestamp(get_mrlot_t(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_MrLot_getState(JNIEnv *env, jobject obj)
{
return mrlot_get_state(get_mrlot_t(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_MrLot_MrLotUnref(JNIEnv *env, jclass c, jlong hLot)
{
mrlot_unref((mrlot_t*)hLot);
}
@@ -307,7 +307,7 @@ public class BaseFragment {
}
try {
visibleDialog = dialog;
visibleDialog.setCanceledOnTouchOutside(true);
//visibleDialog.setCanceledOnTouchOutside(true); -- we do overwrite this from time to time manually, eg. for showing the setup code. so, not all dialogs should be cancelled when touching outside!
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
@@ -91,6 +91,8 @@ public class Theme {
public static final int MSG_AUDIO_SEEKBAR_DARK_COLOR = 0xFFf68751; // same color as in audio-icon, also used for the record-button
public static final int MSG_AUDIO_SEEKBAR_LITE_COLOR = 0xFFfbc8af;
public static final int MSG_SYSTEM_CMD_COLOR = MSG_AUDIO_NAME_COLOR; // just the same color, there is no other dependency between system commands and audio messages
public static Drawable backgroundDrawableIn;
public static Drawable backgroundDrawableInSelected;
public static Drawable backgroundDrawableOut;
@@ -820,8 +820,8 @@ public class AndroidUtilities {
public static void openForViewOrShare(Activity activity, int msg_id, String cmd)
{
MrMsg msg = MrMailbox.getMsg(msg_id);
String path = msg.getParam('f', "");
String mimeType = getMimetype(path, msg.getParam('m', "application/octet-stream"));
String path = msg.getFile();
String mimeType = getMimetype(path, msg.getFilemime());
try {
File file = new File(path);
if( !file.exists() ) {
@@ -892,8 +892,8 @@ public class AndroidUtilities {
MrMsg msg = MrMailbox.getMsg(msg_id);
final int msg_type = msg.getType();
String msg_file_path = msg.getParam('f', "");
final String msg_mime = msg.getParam('m', "application/octet-stream");
String msg_file_path = msg.getFile();
final String msg_mime = msg.getFilemime();
final String msg_file_name = msg.getFilename();
final File sourceFile = new File(msg_file_path);
if( !sourceFile.exists() ) {
@@ -214,8 +214,7 @@ public class AudioSelectActivity extends BaseFragment implements NotificationCen
TLRPC.TL_message message = new TLRPC.TL_message();
message.out = true;
message.id = id;
message.to_id = new TLRPC.TL_peerUser();
message.to_id.user_id = message.from_id = MrContact.MR_CONTACT_ID_SELF;
message.from_id = MrContact.MR_CONTACT_ID_SELF;
message.date = (int) (System.currentTimeMillis() / 1000);
message.message = "-1";
message.attachPath = audioEntry.path;
@@ -55,7 +55,7 @@ import com.b44t.messenger.MessageObject;
import com.b44t.messenger.MrChat;
import com.b44t.messenger.MrContact;
import com.b44t.messenger.MrMailbox;
import com.b44t.messenger.MrPoortext;
import com.b44t.messenger.MrLot;
import com.b44t.messenger.R;
import com.b44t.messenger.TLRPC;
import com.b44t.messenger.Components.AvatarDrawable;
@@ -75,6 +75,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
public interface ChatMessageCellDelegate {
void didPressedUserAvatar(ChatMessageCell cell, TLRPC.User user);
void didPressedSetupMessage(ChatMessageCell cell);
void didLongPressed(ChatMessageCell cell);
void didPressedUrl(MessageObject messageObject, ClickableSpan url, boolean longPress);
void didPressedImage(ChatMessageCell cell);
@@ -207,6 +208,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private AvatarDrawable avatarDrawable;
private boolean avatarPressed;
private boolean setupmessagePressed;
private boolean drawNewchatButton;
private boolean newchatPressed;
private int newchatStartX;
@@ -658,7 +661,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
newchatPressed = true;
result = true;
invalidate();
} else if( currentMessageObject.messageOwner.is_setup_message && currentBackgroundDrawable.getBounds().contains((int)x, (int)y) ) {
setupmessagePressed = true;
result = true;
}
if (result) {
startCheckLongPress();
}
@@ -683,6 +690,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
avatarPressed = false;
}
}
} else if(setupmessagePressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
setupmessagePressed = false;
delegate.didPressedSetupMessage(this);
}
else if(event.getAction() == MotionEvent.ACTION_CANCEL) {
setupmessagePressed = false;
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if( !currentBackgroundDrawable.getBounds().contains((int)x, (int)y) ) {
setupmessagePressed = false;
}
}
} else if (newchatPressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
newchatPressed = false;
@@ -1014,7 +1033,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
maxWidth = maxWidth - dp(86);
MrPoortext pt = MrMailbox.getMsg(messageObject.getId()).getMediainfo();
MrLot pt = MrMailbox.getMsg(messageObject.getId()).getMediainfo();
CharSequence stringFinal = TextUtils.ellipsize(pt.getText2(), audioTitlePaint, maxWidth, TextUtils.TruncateAt.MIDDLE);
songLayout = new StaticLayout(stringFinal, audioTitlePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
if (songLayout.getLineCount() > 0) {
@@ -1052,7 +1071,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int minutes = duration / 60;
int seconds = duration - minutes * 60;
String infoString = String.format("%d:%02d, %s", minutes, seconds, formatFileSize(documentAttach.size));
if( MrMailbox.getMsg(messageObject.getId()).isIncreation()!=0 ) {
if( MrMailbox.getMsg(messageObject.getId()).isIncreation() ) {
infoString = ApplicationLoader.applicationContext.getString(R.string.OneMoment);
}
infoWidth = (int) Math.ceil(infoPaint.measureText(infoString));
@@ -44,9 +44,9 @@ import com.b44t.messenger.ContactsController;
import com.b44t.messenger.EmojiInputView;
import com.b44t.messenger.LocaleController;
import com.b44t.messenger.MrChat;
import com.b44t.messenger.MrLot;
import com.b44t.messenger.MrMailbox;
import com.b44t.messenger.MrMsg;
import com.b44t.messenger.MrPoortext;
import com.b44t.messenger.R;
import com.b44t.messenger.ImageReceiver;
import com.b44t.messenger.ActionBar.Theme;
@@ -121,7 +121,7 @@ public class ChatlistCell extends BaseCell {
private int avatarWH = AndroidUtilities.dp(52);
private MrChat m_mrChat = new MrChat(0);
private MrPoortext m_summary = new MrPoortext(0);
private MrLot m_summary = new MrLot(0);
private boolean m_showUnreadCount;
public ChatlistCell(Context context) {
@@ -163,7 +163,7 @@ public class ChatlistCell extends BaseCell {
avatarImage.setRoundRadius(AndroidUtilities.dp(26));
}
public void setChat(MrChat mrChat, MrPoortext mrSummary, int i, boolean showUnreadCount) {
public void setChat(MrChat mrChat, MrLot mrSummary, int i, boolean showUnreadCount) {
m_mrChat = mrChat;
m_summary = mrSummary;
m_showUnreadCount = showUnreadCount;
@@ -265,8 +265,8 @@ public class ChatlistCell extends BaseCell {
int title_meaning = m_summary.getText1Meaning();
int title_color = Theme.CHATLIST_NAME_TEXT_COLOR;
switch( title_meaning ) {
case MrPoortext.MR_TEXT1_SELF: title_color = Theme.CHATLIST_SELF_TEXT_COLOR; break;
case MrPoortext.MR_TEXT1_DRAFT: title_color = Theme.CHATLIST_DRAFT_TEXT_COLOR; break;
case MrLot.MR_TEXT1_SELF: title_color = Theme.CHATLIST_SELF_TEXT_COLOR; break;
case MrLot.MR_TEXT1_DRAFT: title_color = Theme.CHATLIST_DRAFT_TEXT_COLOR; break;
}
SpannableStringBuilder stringBuilder = SpannableStringBuilder.valueOf(String.format("%s: %s", title, mess));
stringBuilder.setSpan(new ForegroundColorSpan(title_color), 0, title.length() + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -43,7 +43,9 @@ import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.util.SparseIntArray;
@@ -455,7 +457,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
{
int do_archive = m_mrChat.getArchived()==0? 1: 0;
MrMailbox.archiveChat((int)dialog_id, do_archive);
MrMailbox.MrCallback(MrMailbox.MR_EVENT_MSGS_CHANGED, 0, 0);
AndroidUtilities.showDoneHint(context);
if( do_archive == 1 ) {
finishFragment();
@@ -849,11 +850,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
TextView emptyView = new TextView(context);
if( m_mrChat.getParamInt(MrChat.MRP_UNPROMOTED, 0)==1 ) {
if( m_mrChat.isUnpromoted() ) {
emptyView.setText(context.getString(R.string.MsgNewGroupDraftHint));
emptyView.setGravity(Gravity.START);
}
else if( m_mrChat.getType()==MrChat.MR_CHAT_NORMAL ){
else if( m_mrChat.getType()==MrChat.MR_CHAT_NORMAL && !m_mrChat.isSelfTalk() ){
String name = m_mrChat.getName();
emptyView.setText(AndroidUtilities.replaceTags(String.format(context.getString(R.string.NoMessagesHint), name, name)));
emptyView.setGravity(Gravity.START);
@@ -2668,6 +2669,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
@Override
public void didPressedSetupMessage(ChatMessageCell cell) {
querySetupCode(cell.getMessageObject().getId(), null);
}
@Override
public boolean canPerformActions() {
return actionBar != null && !actionBar.isActionModeShowed();
@@ -2761,7 +2767,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
public void didPressedImage(ChatMessageCell cell) {
MessageObject message = cell.getMessageObject();
if( message.type == MessageObject.MO_TYPE3_VIDEO && MrMailbox.getMsg(message.getId()).isIncreation()!=0 ) {
if( message.type == MessageObject.MO_TYPE3_VIDEO && MrMailbox.getMsg(message.getId()).isIncreation() ) {
return; // we're not ready (still compressing), a hint is already shown in the message itself
}
@@ -2906,4 +2912,85 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
}
void querySetupCode(final int msg_id, String[] preload)
{
if( !MrMailbox.getMsg(msg_id).isSetupMessage()) {
return;
}
View gl = View.inflate(getParentActivity(), R.layout.setup_code_grid, null);
final EditText[] editTexts = {
(EditText) gl.findViewById(R.id.setupCode0), (EditText) gl.findViewById(R.id.setupCode1), (EditText) gl.findViewById(R.id.setupCode2),
(EditText) gl.findViewById(R.id.setupCode3), (EditText) gl.findViewById(R.id.setupCode4), (EditText) gl.findViewById(R.id.setupCode5),
(EditText) gl.findViewById(R.id.setupCode6), (EditText) gl.findViewById(R.id.setupCode7), (EditText) gl.findViewById(R.id.setupCode8)
};
AlertDialog.Builder builder1 = new AlertDialog.Builder(getParentActivity());
builder1.setView(gl);
editTexts[0].setText(MrMailbox.getMsg(msg_id).getSetupCodeBegin());
editTexts[0].setSelection(editTexts[0].getText().length());
for( int i = 0; i < 9; i++ ) {
if( preload != null && i < preload.length ) {
editTexts[i].setText(preload[i]);
editTexts[i].setSelection(editTexts[i].getText().length());
}
editTexts[i].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if( s.length()==4 ) {
for ( int i = 0; i < 8; i++ ) {
if( editTexts[i].hasFocus() && editTexts[i+1].getText().length()<4 ) {
editTexts[i+1].requestFocus();
break;
}
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
builder1.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder1.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransferPleaseEnterCode)));
builder1.setNegativeButton(R.string.Cancel, null);
builder1.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message)
builder1.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String setup_code = "";
final String[] preload = new String[9];
for ( int i = 0; i < 9; i++ ) {
preload[i] = editTexts[i].getText().toString();
setup_code += preload[i];
}
boolean success = MrMailbox.continueKeyTransfer(msg_id, setup_code);
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder2.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(success? R.string.AutocryptKeyTransferSucceeded : R.string.AutocryptKeyTransferBadCode)));
if( success ) {
builder2.setPositiveButton(R.string.OK, null);
}
else {
builder2.setNegativeButton(R.string.Cancel, null);
builder2.setPositiveButton(R.string.Retry, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
querySetupCode(msg_id, preload);
}
});
}
showDialog(builder2.create());
}
});
showDialog(builder1.create());
}
}
@@ -477,7 +477,6 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
public void onClick(DialogInterface dialogInterface, int clickedEntry) {
if( clickedEntry==0 ) {
MrMailbox.archiveChat(mrChat.getId(), mrChat.getArchived() == 0 ? 1 : 0);
MrMailbox.MrCallback(MrMailbox.MR_EVENT_MSGS_CHANGED, 0, 0);
AndroidUtilities.showDoneHint(context);
}
else if( clickedEntry==1 ) {
@@ -970,7 +969,7 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
cell.useSeparator = (i != getItemCount() - 1);
MrChat mrChat = getChatByIndex(i);
MrPoortext mrSummary = m_chatlist.getSummaryByIndex(i, mrChat);
MrLot mrSummary = m_chatlist.getSummaryByIndex(i, mrChat);
cell.setChat(mrChat, mrSummary, i, true);
}
}
@@ -1102,7 +1101,7 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
cell.useSeparator = (j != m_chatlistCnt - 1);
MrChat mrChat = m_chatlist.getChatByIndex(j);
MrPoortext mrSummary = m_chatlist.getSummaryByIndex(j, mrChat);
MrLot mrSummary = m_chatlist.getSummaryByIndex(j, mrChat);
cell.setChat(mrChat, mrSummary, -1,
true /*always show unread count*/);
@@ -1118,7 +1117,7 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
MrMsg mrMsg = MrMailbox.getMsg(m_msgIds[j]);
MrChat mrChat = MrMailbox.getChat(mrMsg.getChatId());
MrPoortext mrSummary = mrMsg.getSummary(mrChat);
MrLot mrSummary = mrMsg.getSummary(mrChat);
cell.setChat(mrChat, mrSummary, -1,
mrMsg.getState()==MrMsg.MR_IN_FRESH /*show unread count only if the message itself is unread*/ );
@@ -1568,8 +1568,7 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe
TLRPC.TL_message message = new TLRPC.TL_message();
message.out = true;
message.id = 0;
message.to_id = new TLRPC.TL_peerUser();
message.to_id.user_id = message.from_id = MrContact.MR_CONTACT_ID_SELF;
message.from_id = MrContact.MR_CONTACT_ID_SELF;
message.date = (int) (System.currentTimeMillis() / 1000);
message.message = "-1";
message.attachPath = audioToSendPath;
@@ -182,7 +182,7 @@ public class ContactsController {
}
}
else if( chatType == MrChat.MR_CHAT_GROUP ) {
tempPath = mrChat.getParam(MrChat.MRP_PROFILE_IMAGE, "");
tempPath = mrChat.getProfileImage();
}
}
@@ -299,7 +299,7 @@ public class DocumentSelectActivity extends BaseFragment {
} else {
if (!file.canRead()) {
showErrorBox(ApplicationLoader.applicationContext.getString(R.string.AccessError));
file = new File("/mnt/sdcard");
return;
}
if (file.length() == 0) {
return;
@@ -24,6 +24,7 @@ package com.b44t.messenger;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
@@ -85,6 +86,8 @@ public class KeepAliveService extends Service {
public static final int FG_NOTIFICATION_ID = 4142;
private Notification createNotification()
{
Intent intent = new Intent(this, LaunchActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// a notification _must_ contain a small icon, a title and a text, see https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Required
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
@@ -101,6 +104,7 @@ public class KeepAliveService extends Service {
builder.setPriority(NotificationCompat.PRIORITY_MIN);
}
builder.setWhen(0);
builder.setContentIntent(contentIntent);
builder.setSmallIcon(R.drawable.notification_permanent);
return builder.build();
}
@@ -27,8 +27,10 @@ import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.MailTo;
import android.net.Uri;
@@ -753,7 +755,16 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
else {
switch (permissions[i]) {
case Manifest.permission.READ_CONTACTS:
msg += "- " + ApplicationLoader.applicationContext.getString(R.string.PermissionContacts) + "\n\n";
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Context.MODE_PRIVATE);
if (preferences.getBoolean("PermissionContactsDialogShown", false)) {
// The dialog was already shown once
grantedCount++;
} else {
msg += "- " + ApplicationLoader.applicationContext.getString(R.string.PermissionContacts) + "\n\n";
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("PermissionContactsDialogShown", true);
editor.apply();
}
break;
case Manifest.permission.WRITE_EXTERNAL_STORAGE:
msg += "- " + ApplicationLoader.applicationContext.getString(R.string.PermissionStorage) + "\n\n";
@@ -69,7 +69,6 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
@@ -96,14 +95,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
public static int[] readArgs = new int[3];
public interface FileDownloadProgressListener {
void onFailedDownload(String fileName);
void onSuccessDownload(String fileName);
void onProgressDownload(String fileName, float progress);
void onProgressUpload(String fileName, float progress, boolean isEncrypted);
int getObserverTag();
}
private class AudioBuffer {
public AudioBuffer(int capacity) {
buffer = ByteBuffer.allocateDirect(capacity);
@@ -271,14 +262,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
private Runnable refreshGalleryRunnable;
public static AlbumEntry allPhotosAlbumEntry;
private HashMap<String, ArrayList<WeakReference<FileDownloadProgressListener>>> loadingFileObservers = new HashMap<>();
private HashMap<String, ArrayList<MessageObject>> loadingFileMessagesObservers = new HashMap<>();
private HashMap<Integer, String> observersByTag = new HashMap<>();
private boolean listenerInProgress = false;
private HashMap<String, FileDownloadProgressListener> addLaterArray = new HashMap<>();
private ArrayList<FileDownloadProgressListener> deleteLaterArray = new ArrayList<>();
private int lastTag = 0;
private boolean isPaused = false;
private MediaPlayer audioPlayer = null;
private AudioTrack audioTrackPlayer = null;
@@ -719,74 +702,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
cancelVideoConvert(null);
}
public int generateObserverTag() {
return lastTag++;
}
public void addLoadingFileObserver(String fileName, FileDownloadProgressListener observer) {
addLoadingFileObserver(fileName, null, observer);
}
public void addLoadingFileObserver(String fileName, MessageObject messageObject, FileDownloadProgressListener observer) {
if (listenerInProgress) {
addLaterArray.put(fileName, observer);
return;
}
removeLoadingFileObserver(observer);
ArrayList<WeakReference<FileDownloadProgressListener>> arrayList = loadingFileObservers.get(fileName);
if (arrayList == null) {
arrayList = new ArrayList<>();
loadingFileObservers.put(fileName, arrayList);
}
arrayList.add(new WeakReference<>(observer));
if (messageObject != null) {
ArrayList<MessageObject> messageObjects = loadingFileMessagesObservers.get(fileName);
if (messageObjects == null) {
messageObjects = new ArrayList<>();
loadingFileMessagesObservers.put(fileName, messageObjects);
}
messageObjects.add(messageObject);
}
observersByTag.put(observer.getObserverTag(), fileName);
}
public void removeLoadingFileObserver(FileDownloadProgressListener observer) {
if (listenerInProgress) {
deleteLaterArray.add(observer);
return;
}
String fileName = observersByTag.get(observer.getObserverTag());
if (fileName != null) {
ArrayList<WeakReference<FileDownloadProgressListener>> arrayList = loadingFileObservers.get(fileName);
if (arrayList != null) {
for (int a = 0; a < arrayList.size(); a++) {
WeakReference<FileDownloadProgressListener> reference = arrayList.get(a);
if (reference.get() == null || reference.get() == observer) {
arrayList.remove(a);
a--;
}
}
if (arrayList.isEmpty()) {
loadingFileObservers.remove(fileName);
}
}
observersByTag.remove(observer.getObserverTag());
}
}
private void processLaterArrays() {
for (HashMap.Entry<String, FileDownloadProgressListener> listener : addLaterArray.entrySet()) {
addLoadingFileObserver(listener.getKey(), listener.getValue()); //TODO
}
addLaterArray.clear();
for (FileDownloadProgressListener listener : deleteLaterArray) {
removeLoadingFileObserver(listener);
}
deleteLaterArray.clear();
}
@SuppressWarnings("unchecked")
@Override
public void didReceivedNotification(int id, Object... args) {
@@ -93,9 +93,12 @@ public class MessageObject {
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(Theme.MSG_TEXT_COLOR);
textPaint.linkColor = Theme.MSG_LINK_TEXT_COLOR;
}
if( systemCmdPaint == null ) {
systemCmdPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
systemCmdPaint.setColor(Theme.MSG_AUDIO_NAME_COLOR);
systemCmdPaint.setColor(Theme.MSG_SYSTEM_CMD_COLOR);
systemCmdPaint.linkColor = Theme.MSG_SYSTEM_CMD_COLOR;
}
messageOwner = message;
@@ -323,7 +326,7 @@ public class MessageObject {
}
private void generateLayout() {
if (type != MO_TYPE0_TEXT || messageOwner.to_id == null || messageText == null || messageText.length() == 0) {
if (type != MO_TYPE0_TEXT || messageText == null || messageText.length() == 0) {
return;
}
@@ -46,6 +46,7 @@ public class MrChat {
@Override protected void finalize() throws Throwable {
super.finalize();
MrChatUnref(m_hChat);
m_hChat = 0;
}
public native int getId();
@@ -54,33 +55,18 @@ public class MrChat {
public native String getName();
public native String getSubtitle();
public static int MRP_UNPROMOTED = 'U';
public static int MRP_PROFILE_IMAGE = 'i';
public native String getParam(int key, String def);
public native int getParamInt(int key, int def);
public String getDraft() {
return MrChatGetDraft(m_hChat);
}
public long getDraftTimestamp() {
return MrChatGetDraftTimestamp(m_hChat);
}
public native String getProfileImage();
public native boolean isUnpromoted();
public native boolean isSelfTalk();
public native String getDraft();
public native long getDraftTimestamp();
public int getDraftReplyToMsgId() {
return MrChatGetDraftReplyToMsgId(m_hChat);
}
public int setDraft(String draft/*NULL=delete*/, long replyToMsgId) {
return MrChatSetDraft(m_hChat, draft, replyToMsgId);
return 0;
}
public native int setDraft(String draft/*NULL=delete*/, long replyToMsgId);
private long m_hChat; // must not be renamed as referenced by JNI under the name "m_hChat"
private native static void MrChatUnref (long hChat);
private native static String MrChatGetDraft (long hChat); // returns null for "no draft"
private native static long MrChatGetDraftTimestamp (long hChat); // returns 0 for "no draft"
private native static int MrChatGetDraftReplyToMsgId (long hChat); // returns 0 for "no draft"
private native static int MrChatSetDraft (long hChat, String draft/*NULL=delete*/, long replyToMsgId);
/* additional functions that are not 1:1 available in the backend
@@ -36,6 +36,7 @@ public class MrChatlist {
@Override protected void finalize() throws Throwable {
super.finalize();
MrChatlistUnref(m_hChatlist);
m_hChatlist = 0;
}
public int getCnt() {
@@ -50,8 +51,8 @@ public class MrChatlist {
return new MrMsg(MrChatlistGetMsgByIndex(m_hChatlist, index));
}
public MrPoortext getSummaryByIndex(int index, MrChat chat) {
return new MrPoortext(MrChatlistGetSummaryByIndex(m_hChatlist, index, chat.getCPtr()));
public MrLot getSummaryByIndex(int index, MrChat chat) {
return new MrLot(MrChatlistGetSummaryByIndex(m_hChatlist, index, chat.getCPtr()));
}
private long m_hChatlist;
@@ -40,54 +40,15 @@ public class MrContact {
@Override protected void finalize() throws Throwable {
super.finalize();
MrContactUnref(m_hContact);
m_hContact = 0;
}
public String getName() {
return MrContactGetName(m_hContact);
}
public native String getAuthName();
public String getAddr() {
return MrContactGetAddr(m_hContact);
}
public int isBlocked() {
return MrContactIsBlocked(m_hContact);
}
public native String getName();
public native String getDisplayName();
public native String getAddr();
public native String getNameNAddr();
public native boolean isBlocked();
private long m_hContact;
private native static void MrContactUnref (long hContact);
private native static String MrContactGetName (long hContact);
private native static String MrContactGetAddr (long hContact);
private native static int MrContactIsBlocked (long hContact);
/* additional functions that are not 1:1 available in the backend
**********************************************************************************************/
public static TLRPC.User contactId2user(int id)
{
TLRPC.User ret = new TLRPC.User();
ret.id = id;
return ret;
}
public String getDisplayName() {
String s=MrContactGetName(m_hContact);
if(s.isEmpty()) {
s=MrContactGetAddr(m_hContact);
}
return s;
}
public String getNameNAddr() {
String s=MrContactGetName(m_hContact);
if(s.isEmpty()) {
s=MrContactGetAddr(m_hContact);
}
else {
s+=" ("+MrContactGetAddr(m_hContact)+")";
}
return s;
}
}
@@ -19,7 +19,7 @@
*
*******************************************************************************
*
* File: MrPoortext.java
* File: MrLot.java
* Purpose: Wrap around mrpoortext_t
*
******************************************************************************/
@@ -28,47 +28,28 @@
package com.b44t.messenger;
public class MrPoortext {
public class MrLot {
public final static int MR_TEXT1_NORMAL = 0;
public final static int MR_TEXT1_DRAFT = 1;
public final static int MR_TEXT1_USERNAME = 2;
public final static int MR_TEXT1_SELF = 3;
public MrPoortext(long hPoortext) {
m_hPoortext = hPoortext;
public MrLot(long hLot) {
m_hLot = hLot;
}
@Override protected void finalize() throws Throwable {
super.finalize();
MrPoortextUnref(m_hPoortext);
MrLotUnref(m_hLot);
m_hLot = 0;
}
public String getText1() {
return MrPoortextGetText1(m_hPoortext);
}
public native String getText1();
public native int getText1Meaning();
public native String getText2();
public native long getTimestamp();
public native int getState();
public int getText1Meaning() {
return MrPoortextGetText1Meaning(m_hPoortext);
}
public String getText2() {
return MrPoortextGetText2(m_hPoortext);
}
public long getTimestamp() {
return MrPoortextGetTimestamp(m_hPoortext);
}
public int getState() {
return MrPoortextGetState(m_hPoortext);
}
private long m_hPoortext;
private native static void MrPoortextUnref (long hPoortext);
private native static String MrPoortextGetText1 (long hPoortext);
private native static int MrPoortextGetText1Meaning (long hPoortext);
private native static String MrPoortextGetText2 (long hPoortext);
private native static long MrPoortextGetTimestamp (long hPoortext);
private native static int MrPoortextGetState (long hPoortext);
private long m_hLot;
private native static void MrLotUnref(long hLot);
}
@@ -52,7 +52,7 @@ public class MrMailbox {
public native static String getBlobdir();
public native static int configureAndConnect();
public native static void configureCancel();
public native static void stopOngoingProcess();
public native static int isConfigured();
@@ -67,11 +67,13 @@ public class MrMailbox {
public native static String getInfo();
public native static String cmdline(String cmd);
public native static String initiateKeyTransfer();
public native static boolean continueKeyTransfer(int msg_id, String setup_code);
public final static int MR_IMEX_EXPORT_SELF_KEYS = 1;
public final static int MR_IMEX_IMPORT_SELF_KEYS = 2;
public final static int MR_IMEX_EXPORT_BACKUP = 11;
public final static int MR_IMEX_IMPORT_BACKUP = 12;
public native static void imex(int what, String dir);
public native static int imex(int what, String dir);
public native static String imexHasBackup(String dir);
public native static int checkPassword(String pw);
@@ -138,7 +140,7 @@ public class MrMailbox {
public native static int addContactToChat (int chat_id, int contact_id);
public native static int removeContactFromChat (int chat_id, int contact_id);
public native static int setChatName (int chat_id, String name);
public native static int setChatImage (int chat_id, String name);
public native static int setChatProfileImage (int chat_id, String name);
public final static int MR_GCM_ADDDAYMARKER = 0x01;
public native static int[] getChatMsgs(int chat_id, int flags, int marker1before);
@@ -171,6 +173,7 @@ public class MrMailbox {
public native static void forwardMsgs(int msg_ids[], int chat_ids);
public native static int sendTextMsg(int chat_id, String text);
public native static int sendVcardMsg(int chat_id, int contact_id);
public native static int sendMediaMsg(int chat_id, int type, String file, String mime, int w, int h, int time_ms, String author, String trackname);
private native static long MrMailboxGetMsg (long hMailbox, int id); // return hMsg which must be unref'd after usage
@@ -199,7 +202,6 @@ public class MrMailbox {
public final static int MR_EVENT_CONFIGURE_PROGRESS = 2041;
public final static int MR_EVENT_IMEX_ENDED = 2050;
public final static int MR_EVENT_IMEX_PROGRESS = 2051;
public final static int MR_EVENT_IMEX_FILE_WRITTEN = 2052;
@@ -227,15 +229,6 @@ public class MrMailbox {
});
return 0;
case MR_EVENT_IMEX_ENDED:
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)data1);
}
});
return 0;
case MR_EVENT_IMEX_PROGRESS:
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
@@ -333,7 +326,7 @@ public class MrMailbox {
return 0;
case MR_EVENT_GET_STRING:
String s = "ErrStrBadId";
String s;
switch( (int)data1 ) {
// the string-IDs are defined in the backend; as this is the only place where they're used, there is no benefit in creating an enum or sth. like that.
case 1: s = ApplicationLoader.applicationContext.getString(R.string.NoMessages); break;
@@ -369,6 +362,10 @@ public class MrMailbox {
case 36: s = "<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.E2eeOffBecauseOfUser)+"</c>"; break;
case 37: s = "<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.E2eeOffBecauseOfRecipient)+"</c>"; break;
case 40: s = ApplicationLoader.applicationContext.getString(R.string.ArchivedChats); break;
case 42: s = ApplicationLoader.applicationContext.getString(R.string.AutocryptSetupMessageSubject); break;
case 43: s = ApplicationLoader.applicationContext.getString(R.string.AutocryptSetupMessageGeneralBody); break;
case 50: s = ApplicationLoader.applicationContext.getString(R.string.SelfTalkSubtitle); break;
default: s = null; break;
}
return String2CPtr(s);
@@ -64,62 +64,40 @@ public class MrMsg {
@Override protected void finalize() throws Throwable {
super.finalize();
MrMsgUnref(m_hMsg);
m_hMsg = 0;
}
public int getId() {
return MrMsgGetId(m_hMsg);
}
public native int getId();
public native String getText();
public native long getTimestamp();
public native int getType();
public native int getState();
public native int getChatId();
public native int getFromId();
public String getText() {
return MrMsgGetText(m_hMsg);
}
public long getTimestamp() {
return MrMsgGetTimestamp(m_hMsg);
}
public int getType() {
return MrMsgGetType(m_hMsg);
}
public int getState() {
return MrMsgGetState(m_hMsg);
}
public int getChatId() {
return MrMsgGetChatId(m_hMsg);
}
public int getFromId() {
return MrMsgGetFromId(m_hMsg);
}
public int getToId() {
return MrMsgGetToId(m_hMsg);
}
public native String getParam(int key, String def);
public native int getParamInt(int key, int def);
public native void setParamInt(int key, int def);
public native void saveParamToDisk();
public native int getWidth(int def);
public native int getHeight(int def);
public native int getDuration();
public native void lateFilingMediaSize(int width, int height, int duration);
public native int getBytes();
public MrPoortext getSummary(MrChat chat) { return new MrPoortext(getSummaryCPtr(chat.getCPtr())); }
public MrLot getSummary(MrChat chat) { return new MrLot(getSummaryCPtr(chat.getCPtr())); }
private native long getSummaryCPtr(long hChat);
public native String getSummarytext(int approx_characters);
public native int showPadlock();
public MrPoortext getMediainfo() { return new MrPoortext(getMediainfoCPtr()); }
public MrLot getMediainfo() { return new MrLot(getMediainfoCPtr()); }
private native long getMediainfoCPtr();
public native String getFile();
public native String getFilemime();
public native String getFilename();
public native int isIncreation();
public native boolean isForwarded();
public native boolean isSystemcmd();
public native boolean isSetupMessage();
public native String getSetupCodeBegin();
public native boolean isIncreation();
private long m_hMsg; // must not be renamed as referenced by JNI under the name "m_hMsg"
private native static void MrMsgUnref (long hMsg);
private native static int MrMsgGetId (long hMsg);
private native static String MrMsgGetText (long hMsg);
private native static long MrMsgGetTimestamp (long hMsg);
private native static int MrMsgGetType (long hMsg);
private native static int MrMsgGetState (long hMsg);
private native static int MrMsgGetChatId (long hMsg);
private native static int MrMsgGetFromId (long hMsg);
private native static int MrMsgGetToId (long hMsg);
/* additional functions that are not 1:1 available in the backend
@@ -142,8 +120,6 @@ public class MrMsg {
ret.id = getId();
ret.from_id = getFromId();
ret.to_id = new TLRPC.TL_peerUser();
ret.to_id.user_id = getToId();
ret.date = (int)getTimestamp();
ret.dialog_id = getChatId();
ret.unread = state!=MR_OUT_MDN_RCVD; // the state of outgoing messages
@@ -152,19 +128,24 @@ public class MrMsg {
ret.out = ret.from_id==MrContact.MR_CONTACT_ID_SELF; // true=outgoing message, read eg. in MessageObject.isOutOwner()
ret.created_by_mr = true;
ret.show_padlock = showPadlock()!=0;
ret.is_system_cmd = getParamInt('S', 0)!=0;
ret.is_system_cmd = isSystemcmd();
ret.is_setup_message = isSetupMessage();
if( type == MR_MSG_TEXT ) {
ret.message = getText();
}
else if( type == MR_MSG_FILE && isSetupMessage() )
{
ret.message = ApplicationLoader.applicationContext.getString(R.string.AutocryptSetupMessageTapBody);
}
else if( type == MR_MSG_IMAGE ) {
String path = getParam('f', "");
String path = getFile();
TLRPC.TL_photo photo = null;
if( !path.isEmpty() ) {
try {
TLRPC.TL_photoSize photoSize = new TLRPC.TL_photoSize();
photoSize.w = getParamInt('w', 800);
photoSize.h = getParamInt('h', 800);
photoSize.w = getWidth(800);
photoSize.h = getHeight(800);
photoSize.size = 0; // not sure what to use here, maybe `getBytes();`?
photoSize.location = new TLRPC.TL_fileLocation();
photoSize.location.mr_path = path;
@@ -198,7 +179,7 @@ public class MrMsg {
}
}
else if( type == MR_MSG_GIF || type == MR_MSG_AUDIO || type == MR_MSG_VOICE || type == MR_MSG_VIDEO || type == MR_MSG_FILE ) {
String path = getParam('f', "");
String path = getFile();
if( !path.isEmpty()) {
ret.message = "-1"; // may be misused for video editing information
ret.media = new TLRPC.TL_messageMediaDocument();
@@ -208,20 +189,20 @@ public class MrMsg {
ret.media.document.mr_path = path;
ret.media.document.size = getBytes();
if( type == MR_MSG_GIF ) {
ret.media.document.mime_type = getParam('m', "image/gif");
ret.media.document.mime_type = getFilemime();
TLRPC.PhotoSize size = new TLRPC.PhotoSize();
size.location = new TLRPC.TL_fileLocation();
size.location.mr_path = path;
size.location.local_id = -ret.id;
size.w = getParamInt('w', 320);
size.h = getParamInt('h', 240);
size.w = getWidth(320);
size.h = getHeight(240);
size.type = "s";
ret.media.document.thumb = size;
}
else if( type == MR_MSG_AUDIO || type == MR_MSG_VOICE ) {
TLRPC.TL_documentAttributeAudio attr = new TLRPC.TL_documentAttributeAudio();
attr.voice = type == MR_MSG_VOICE;
attr.duration = getParamInt('d', 0) / 1000;
attr.duration = getDuration() / 1000;
ret.media.document.attributes.add(attr);
}
else if( type == MR_MSG_VIDEO ) {
@@ -235,9 +216,7 @@ public class MrMsg {
size.type = "s";
ret.media.document.thumb = size;
setParamInt('w', size.w);
setParamInt('h', size.h);
saveParamToDisk();
lateFilingMediaSize(size.w, size.h, 0);
}
catch (Exception e) {}
}
@@ -246,20 +225,20 @@ public class MrMsg {
size.location = new TLRPC.TL_fileLocation();
size.location.mr_path = tfile.getAbsolutePath();
size.location.local_id = -ret.id;
size.w = getParamInt('w', 320);
size.h = getParamInt('h', 240);
size.w = getWidth(320);
size.h = getHeight(240);
size.type = "s";
ret.media.document.thumb = size;
}
TLRPC.TL_documentAttributeVideo attr = new TLRPC.TL_documentAttributeVideo();
attr.duration = getParamInt('d', 0) / 1000;
attr.w = getParamInt('w', 320);
attr.h = getParamInt('h', 240);
attr.duration = getDuration() / 1000;
attr.w = getWidth(320);
attr.h = getHeight(240);
ret.media.document.attributes.add(attr);
}
else {
ret.media.document.mime_type = getParam('m', "application/octet-stream");
ret.media.document.mime_type = getFilemime();
}
}
@@ -271,7 +250,7 @@ public class MrMsg {
ret.message = String.format("<unsupported message type #%d for id #%d>", type, ret.id);
}
if( !getParam('a', "").equals("") ) {
if( isForwarded() ) {
ret.flags |= TLRPC.MESSAGE_FLAG_FWD;
}
@@ -110,7 +110,7 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
{
AudioInfo audioInfo = MediaController.getInstance().getAudioInfo();
MrPoortext pt = MrMailbox.getMsg(messageObject.getId()).getMediainfo();
MrLot pt = MrMailbox.getMsg(messageObject.getId()).getMediainfo();
String authorName = pt.getText1();
String songName = pt.getText2();
if( songName == null || songName.length()==0 ) {
@@ -753,7 +753,7 @@ public class NotificationsController {
cv.put("count", count);
ApplicationLoader.applicationContext.getContentResolver().insert(Uri.parse("content://com.teslacoilsw.notifier/unread_count"), cv);
} catch (Throwable e) {
e.printStackTrace();
//e.printStackTrace(); -- do not flood the log with errors about missing teslacoilsw-URIs
}
try {
@@ -168,7 +168,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
String nameonly = big.location.volume_id + "_" + big.location.local_id + ".jpg";
File fileobj = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), nameonly);
String fullpath = fileobj.getAbsolutePath();
MrMailbox.setChatImage(chat_id, fullpath);
MrMailbox.setChatProfileImage(chat_id, fullpath);
}
}
};
@@ -515,7 +515,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
// show menu to change the group image
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
CharSequence[] items;
boolean hasPhoto = MrMailbox.getChat(chat_id).getParam(MrChat.MRP_PROFILE_IMAGE, null)!=null;
boolean hasPhoto = MrMailbox.getChat(chat_id).getProfileImage()!=null;
if ( !hasPhoto ) {
items = new CharSequence[]{context.getString(R.string.FromCamera), context.getString(R.string.FromGalley)};
} else {
@@ -536,7 +536,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if( MrMailbox.setChatImage(chat_id, null)!=0 ) {
if( MrMailbox.setChatProfileImage(chat_id, null)!=0 ) {
AndroidUtilities.showDoneHint(getParentActivity());
}
}
@@ -841,7 +841,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
settingsNotificationsRow = rowCount++;
}
if( user_id!=0 || chat_id!=MrChat.MR_CHAT_ID_DEADDROP) {
if( (user_id!=0 && user_id!=MrContact.MR_CONTACT_ID_SELF) || (chat_id!=0 && chat_id!=MrChat.MR_CHAT_ID_DEADDROP)) {
changeNameRow = rowCount++;
}
@@ -870,7 +870,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
boolean blocked = false;
if( user_id!=0 ) {
MrContact mrContact = MrMailbox.getContact(user_id);
blocked = mrContact.isBlocked()!=0;
blocked = mrContact.isBlocked();
}
return blocked;
}
@@ -889,9 +889,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
mrContact = MrMailbox.getContact(user_id);
newString = mrContact.getDisplayName();
newString2 = mrContact.getAddr();
/*if( !newString.equals(mrContact.getAuthName()) ) { -- not sure if it is really useful to display the auth-name here
newString += " (" + mrContact.getAuthName() + ")";
}*/
}
else {
mrChat = MrMailbox.getChat(chat_id);
@@ -921,6 +918,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
if (user_id != 0) {
item.addSubItem(ID_COPY_EMAIL_TO_CLIPBOARD, ApplicationLoader.applicationContext.getString(R.string.CopyToClipboard), 0);
}
if( user_id != 0 && user_id != MrContact.MR_CONTACT_ID_SELF ) {
item.addSubItem(ID_BLOCK_CONTACT, userBlocked()? ApplicationLoader.applicationContext.getString(R.string.UnblockContact) : ApplicationLoader.applicationContext.getString(R.string.BlockContact), 0);
item.addSubItem(ID_DELETE_CONTACT, ApplicationLoader.applicationContext.getString(R.string.DeleteContact), 0);
}
@@ -99,15 +99,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
}
public void sendMessageContact(int contact_id, int dialog_id) {
MrContact contact = MrMailbox.getContact(contact_id);
String msg = contact.getAuthName();
if(msg.isEmpty()) {
msg = contact.getAddr();
}
else {
msg += ": " + contact.getAddr();
}
SendMessagesHelper.getInstance().sendMessageText(msg, dialog_id, null);
int msg_id = MrMailbox.sendVcardMsg(dialog_id, contact_id);
updateInterfaceForNewMessage(dialog_id, true, msg_id);
}
public void sendMessageDocument(TLRPC.TL_document document, VideoEditedInfo videoEditedInfo, String path, long peer, HashMap<String, String> params) {
@@ -132,7 +125,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
else {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, msg_id);
}
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
//NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); -- already send due to MR_EVENT_MSGS_CHANGED which is send by the core on sending messages
}
private void sendMessage__(String message,
@@ -345,7 +345,7 @@ public class SettingsAccountFragment extends BaseFragment implements Notificatio
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MrMailbox.configureCancel();
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
@@ -72,6 +72,7 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
private int settingsShadowRow;
private int imexHeaderRow;
private int initiateKeyTransferRow;
private int manageKeysRow;
private int backupRow;
private int backupShadowRow;
@@ -120,6 +121,7 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
settingsShadowRow = rowCount++;
imexHeaderRow = rowCount++;
initiateKeyTransferRow = rowCount++;
manageKeysRow = rowCount++;
backupRow = rowCount++;
backupShadowRow = rowCount++;
@@ -232,6 +234,63 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
{
presentFragment(new SettingsAccountFragment(null));
}
else if(i==initiateKeyTransferRow )
{
AlertDialog.Builder builder1 = new AlertDialog.Builder(getParentActivity());
builder1.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder1.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransferMsgBeforeSend)));
builder1.setNegativeButton(R.string.Cancel, null);
builder1.setPositiveButton(R.string.AutocryptKeyTransferInitiate, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
progressDialog = new ProgressDialog(getParentActivity());
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(false);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
final String sc = MrMailbox.initiateKeyTransfer();
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
if( progressDialog != null ) {
progressDialog.dismiss();
progressDialog = null;
}
if( sc != null ) {
String scFormatted = "";
try {
scFormatted = sc.substring(0, 4) + " - " + sc.substring(5, 9) + " - " + sc.substring(10, 14) + " -\n\n" +
sc.substring(15, 19) + " - " + sc.substring(20, 24) + " - " + sc.substring(25, 29) + " -\n\n" +
sc.substring(30, 34) + " - " + sc.substring(35, 39) + " - " + sc.substring(40, 44);
} catch (Exception e) {
e.printStackTrace();
}
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder2.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransferMsgAfterSend), scFormatted)));
builder2.setPositiveButton(R.string.OK, null);
builder2.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message)
showDialog(builder2.create());
}
}
});
}
});
}
});
showDialog(builder1.create());
}
else if(i==manageKeysRow )
{
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.E2EManagePrivateKeys),
@@ -410,7 +469,7 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MrMailbox.imex(0, null);
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
@@ -420,7 +479,18 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
MrMailbox.m_lastErrorString = "";
}
MrMailbox.imex(what, imexDir.getAbsolutePath());
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
final int res = MrMailbox.imex(progressWhat, imexDir.getAbsolutePath());
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)res);
}
});
}
});
}
@Override
@@ -535,6 +605,9 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
String cntStr = String.format("%d", MrMailbox.getBlockedCount());
textCell.setTextAndValue(ApplicationLoader.applicationContext.getString(R.string.BlockedContacts), cntStr, true);
}
else if( i==initiateKeyTransferRow ) {
textCell.setText(mContext.getString(R.string.AutocryptKeyTransferInitiate), true);
}
else if( i==manageKeysRow ) {
textCell.setText(mContext.getString(R.string.E2EManagePrivateKeys), true);
}
@@ -71,14 +71,6 @@ public class TLRPC {
public static class TL_documentAttributeFilename extends DocumentAttribute {
}
public static class Peer extends TLObject {
public int user_id;
public final int chat_id = 0;
}
public static class TL_peerUser extends Peer {
}
public static class TL_messageMediaEmpty extends MessageMedia {
}
@@ -238,7 +230,6 @@ public class TLRPC {
public static class Message extends TLObject {
public int id;
public int from_id;
public Peer to_id;
public int date;
public final int reply_to_msg_id = 0;
public String message;
@@ -258,6 +249,7 @@ public class TLRPC {
public boolean created_by_mr;
public boolean show_padlock;
public boolean is_system_cmd;
public boolean is_setup_message;
}
public static class TL_message extends Message {
@@ -100,7 +100,7 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
secondaryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String msgtext = "© 2017 Delta Chat contributors" + "\n\n" + MrMailbox.getInfo() + "\n\n" + getAndroidInfo();
final String msgtext = "© 2017, 2018 Delta Chat contributors" + "\n\n" + MrMailbox.getInfo() + "\n\n" + getAndroidInfo();
new AlertDialog.Builder(WelcomeActivity.this)
.setTitle(ApplicationLoader.applicationContext.getString(R.string.AppName) + " v" + getVersion())
.setMessage(msgtext)
@@ -323,7 +323,7 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
}
private ProgressDialog progressDialog = null;
private void startImport(String backupFile)
private void startImport(final String backupFile)
{
if( progressDialog!=null ) {
progressDialog.dismiss();
@@ -337,7 +337,7 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MrMailbox.imex(0, null);
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
@@ -347,7 +347,18 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
MrMailbox.m_lastErrorString = "";
}
MrMailbox.imex(MrMailbox.MR_IMEX_IMPORT_BACKUP, backupFile);
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
final int res = MrMailbox.imex(MrMailbox.MR_IMEX_IMPORT_BACKUP, backupFile);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)res);
}
});
}
});
}
@Override
@@ -371,6 +382,11 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
}
if( (int)args[0]==1 ) {
MrMailbox.connect(); // import does not automatically connect
KeepAliveService kas = KeepAliveService.getInstance();
if( kas != null ) {
kas.updateForegroundNotification();
}
startActivity(new Intent(WelcomeActivity.this, LaunchActivity.class));
finish();
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 23 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- the FrameLayout is needed as View.inflate() without a root discards all layout_-attributes -->
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp"
android:columnCount="6"
android:rowCount="1">
<!-- 1st row -->
<EditText
android:id="@+id/setupCode0"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode1"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode2"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<!-- 2nd row -->
<EditText
android:id="@+id/setupCode3"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode4"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode5"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<!-- 3rd row -->
<EditText
android:id="@+id/setupCode6"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode7"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode8"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" "
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat"/>
</GridLayout>
</FrameLayout>
@@ -41,9 +41,9 @@
<string name="From">Von</string>
<string name="NoRecent">Keine aktuellen</string>
<string name="TypeMessage">Nachricht</string>
<string name="SlideToCancel">WISCHEN UM ABZUBRECHEN</string>
<string name="SaveToDownloads">In Downloads speichern</string>
<string name="SaveToMusic">In Musik speichern</string>
<string name="SlideToCancel">Wischen um abzubrechen</string>
<string name="SaveToDownloads">In Downloads speichern</string>
<string name="SaveToMusic">In Musik speichern</string>
<string name="Share">Teilen</string>
<string name="SendItems">%1$s senden</string>
<string name="ClearRecentEmoji">Zuletzt benutzte Emoji leeren?</string>
@@ -83,7 +83,7 @@
<string name="Default">Standard</string>
<string name="OnlyIfSilent">Wenn lautlos</string>
<string name="ChatBackground">Chat-Hintergrundbild</string>
<string name="SendByEnter">Mit Taste „Enter“ senden</string>
<string name="SendByEnter">Mit Eingabetaste senden</string>
<string name="Help">Hilfe</string>
<string name="Enabled">An</string>
<string name="Disabled">Aus</string>
@@ -151,13 +151,13 @@
<string name="Sharpen">Schärfe</string>
<string name="Fade">Verblassen</string>
<string name="Tint">Tönung</string>
<string name="TintShadows">TIEFEN</string>
<string name="TintHighlights">LICHTER</string>
<string name="TintShadows">Tiefen</string>
<string name="TintHighlights">Lichter</string>
<string name="Curves">Kurven</string>
<string name="CurvesAll">ALLE</string>
<string name="CurvesRed">ROT</string>
<string name="CurvesGreen">GRÜN</string>
<string name="CurvesBlue">BLAU</string>
<string name="CurvesAll">Alle</string>
<string name="CurvesRed">Rot</string>
<string name="CurvesGreen">Grün</string>
<string name="CurvesBlue">Blau</string>
<string name="Blur">Unschärfe</string>
<string name="BlurOff">Aus</string>
<string name="BlurLinear">Linear</string>
@@ -184,7 +184,7 @@
<string name="FromGalley">Aus der Galerie</string>
<string name="Set">Wählen</string>
<string name="OK">OK</string>
<string name="Crop">SCHNEIDEN</string>
<string name="Crop">Schneiden</string>
<!--messages-->
<string name="AttachPhoto">Bild</string>
<string name="AttachVideo">Video</string>
@@ -208,10 +208,10 @@
<string name="PermissionOpenSettings">Einstellungen anpassen</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">Der Messenger mit der <![CDATA[<b>größten Reichweite</b>]]> der Welt.<![CDATA[<br/><b>Frei</b>]]> und <![CDATA[<b>sicher</b>]]>.</string>
<string name="Intro1Message">Der Messenger mit der <![CDATA[<b>größten Reichweite</b>]]> der Welt. <![CDATA[<b>Frei</b>]]> und <![CDATA[<b>unabhängig</b>]]>.</string>
<string name="Intro2Headline">Unabhängig</string>
<string name="Intro2Message"><![CDATA[<b>Keine Abhängigkeiten</b>]]> von fremden Diensten und Servern. Die App verwendet nur Ihren E-Mail-Server.</string>
<string name="Intro2Message"><![CDATA[<b>Es gibt keinen Delta-Chat-Server.</b>]]> Die App verwendet nur Ihren E-Mail-Server.</string>
<string name="Intro3Headline">Schnell</string>
<string name="Intro3Message"><![CDATA[<b>Push-Nachrichten</b>]]> in Sekunden.<![CDATA[<br/>]]>Rasantes Interface.</string>
@@ -222,7 +222,7 @@
<string name="Intro5Headline">Frei</string>
<string name="Intro5Message">Open Source. Keine Werbung. Kein Abo.<![CDATA[<br/>]]>Keine Bindung an die Mobilfunknummer.</string>
<string name="Intro6Headline">Sicher</string>
<string name="Intro6Headline">Verschlüsselt</string>
<string name="Intro6Message"><![CDATA[<b>Verschlüsselung</b>]]> mit allen gängigen Verfahren. Die Nachrichten bleiben auf Ihren Servern.</string>
<string name="Intro7Headline">Vertraulich</string>
@@ -239,7 +239,7 @@
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">Ich und %d Mitglied</item>
<item quantity="other">Ich und %d Mitglieder</item>
<item quantity="other">%d Mitglieder und ich</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d neue Nachricht</item>
@@ -334,7 +334,7 @@
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Einen Moment …</string>
<string name="NoChatsHelp">Unten auf das Plussymbol für die erste Chatnachricht tippen; der Menüknopf öffnet die weiteren Optionen.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> ist für die sichere geschäftliche Kommunikation geeignet.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> ist für die vertrauliche geschäftliche Kommunikation geeignet.</string>
<string name="InviteMenuEntry">Einladungen versenden</string>
<string name="InviteText">Ich verwende nun auch den Delta Chat Messenger - %1$s - und bin dort unter %2$s erreichbar.</string>
<string name="AdvancedSettings">Fortgeschrittene Einstellungen</string>
@@ -409,4 +409,16 @@
<string name="LeaveGroup">Gruppe verlassen</string>
<string name="AskLeaveGroup">Diese Gruppe verlassen?</string>
<string name="Never">Niemals</string>
<string name="AutocryptKeyTransferInitiate">Autocrypt-Key-Transfer starten</string>
<string name="AutocryptKeyTransfer">Autocrypt-Key-Transfer</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Der <![CDATA[<i>]]>Autocrypt-Key-Transfer<![CDATA[</i>]]> erfordert, dass das andere Gerät Autocrypt-kompatibel ist.\n\nSie können dann Ihren privaten Schlüssel an sich selbst schicken. Der Schlüssel wird mit einem <![CDATA[<i>]]>Setup Code<![CDATA[</i>]]> geschützt; dieser wird hier angezeigt und muss auf dem anderen Gerät eingetippt werden.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Ihr Schüssel wurde an Sie selbst verschickt. Wechseln sie nun zum anderen Gerät und öffnen die Setup-Nachricht. Sie werden dann aufgefordert einen Setup-Code einzugeben. Tippen Sie dort die folgenden Zahlen ein:\n\n%1$s\n\nWenn Sie fertig sind, ist Autocrypt auf dem anderen Gerät eingerichet.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt-Setup-Nachricht</string>
<string name="AutocryptSetupMessageGeneralBody">Diese Autocrypt-Setup-Nachricht wird verwendet um Ihren Schlüssel von einem Gerät auf das andere zu übertragen.\n\nUm Ihren Schlüssel zu verwenden, öffnen Sie diese Nachricht in einer Autocrypt-kompatiblen E-Mail-App und geben Sie den Setup-Code ein, der Ihnen auf dem andern Gerät angezeigt wurde.</string>
<string name="AutocryptSetupMessageTapBody">Diese Autocrypt-Setup-Nachricht wird verwendet um Ihren Schlüssel von einem Gerät auf das andere zu übertragen.\n\nTippen Sie auf diese Nachricht, um den Schlüssel zu verwenden.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Bitte geben Sie den Setup-Code ein, der auf dem anderen Gerät angezeigt wird.</string>
<string name="AutocryptKeyTransferBadCode">Ungültiger Setup-Code. Bitte versuchen Sie es erneut.\n\nWenn Sie den Setup-Code nicht mehr haben, können Sie auch jederzeit einen neue Autocrypt-Setup-Nachricht mit einem neuen Setup-Code erzeugen.</string>
<string name="AutocryptKeyTransferSucceeded">Ihr Schlüssel wurde erfolgreich übertragen. Dieses Gerät wird nun Autocrypt mit demselben Schlüssel wie das Andere verwenden.</string>
<string name="Retry">Wiederholen</string>
<string name="SelfTalkSubtitle">Nachrichten von mir an mich</string>
</resources>
@@ -41,9 +41,9 @@
<string name="From">De</string>
<string name="NoRecent">Pas de récents</string>
<string name="TypeMessage">Message</string>
<string name="SlideToCancel">GLISSER POUR ANNULER</string>
<string name="SaveToDownloads">Enregistrer dans Téléchargements</string>
<string name="SaveToMusic">Enregistrer dans Musique</string>
<string name="SlideToCancel">Glisser pour annuler</string>
<string name="SaveToDownloads">Enregistrer dans \"Téléchargements\"</string>
<string name="SaveToMusic">Enregistrer dans \"Musique\"</string>
<string name="Share">Partager</string>
<string name="SendItems">Envoyer %1$s</string>
<string name="ClearRecentEmoji">Vider les émojis récents ?</string>
@@ -83,7 +83,7 @@
<string name="Default">Défaut</string>
<string name="OnlyIfSilent">Seulement si silencieux</string>
<string name="ChatBackground">Arrière-plan des conversations</string>
<string name="SendByEnter">Envoyer avec "Entrée"</string>
<string name="SendByEnter">Envoyer avec la touche entrée</string>
<string name="Help">Aide</string>
<string name="Enabled">Activé</string>
<string name="Disabled">Désactivé</string>
@@ -101,7 +101,7 @@
<string name="NotificationsOther">Autres</string>
<string name="InChatSound">Sons dans la conversation</string>
<string name="SmartNotifications">Limiter les notifications</string>
<string name="SmartNotificationsSoundAtMost">Son au maximum</string>
<string name="SmartNotificationsSoundAtMost">max.</string>
<string name="SmartNotificationsTimes">fois</string>
<string name="SmartNotificationsWithin">toutes les</string>
<string name="SmartNotificationsMinutes">minutes</string>
@@ -151,13 +151,13 @@
<string name="Sharpen">Netteté</string>
<string name="Fade">Fondu</string>
<string name="Tint">Teinte</string>
<string name="TintShadows">OMBRES</string>
<string name="TintHighlights">HAUTES-LUMIERES</string>
<string name="TintShadows">Ombres</string>
<string name="TintHighlights">Hautes-lumières</string>
<string name="Curves">Courbes</string>
<string name="CurvesAll">TOUT</string>
<string name="CurvesRed">ROUGE</string>
<string name="CurvesGreen">VERT</string>
<string name="CurvesBlue">BLEU</string>
<string name="CurvesAll">Tout</string>
<string name="CurvesRed">Rouge</string>
<string name="CurvesGreen">Vert</string>
<string name="CurvesBlue">Bleu</string>
<string name="Blur">Flou</string>
<string name="BlurOff">Désactiver</string>
<string name="BlurLinear">Linéaire</string>
@@ -184,7 +184,7 @@
<string name="FromGalley">Depuis la galerie</string>
<string name="Set">Définir</string>
<string name="OK">OK</string>
<string name="Crop">ROGNER</string>
<string name="Crop">Rogner</string>
<!--messages-->
<string name="AttachPhoto">Photo</string>
<string name="AttachVideo">Vidéo</string>
@@ -194,11 +194,11 @@
<string name="AttachVoiceMessage">Message vocal</string>
<string name="FromSelf">Moi</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">Vous n\'avez pas d\'application qui peut gérer des fichiers de type \'%1$s\', veuillez en installer une pour continuer</string>
<string name="NoHandleAppInstalled">Vous n\'avez pas d\'application qui peut ouvrir des fichiers de type \'%1$s\', veuillez en installer une pour continuer</string>
<string name="ContactAlreadyInGroup">Ce contact est déjà dans ce groupe</string>
<string name="ForwardMessagesTo">Renvoyer les messages sélectionnés à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ?</string>
<string name="SendMessagesTo">Envoyer les messages à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ?</string>
<string name="AreYouSureDeleteThisChat">Êtes-vous sûr de vouloir supprimer cette conversation ? La conversation n\'apparaîtra plus dans la liste des conversations, mais les messages resteront sur le serveur.</string>
<string name="AreYouSureDeleteThisChat">Êtes-vous sûr de vouloir supprimer cette conversation? La conversation n\'apparaîtra plus dans la liste des conversations, mais les messages resteront sur le serveur.</string>
<string name="AreYouSureBlockContact">Êtes-vous sûr de vouloir bloquer ce contact?</string>
<string name="AreYouSureDeleteContact">Êtes-vous sûr de vouloir supprimer ce contact?</string>
<!--permissions-->
@@ -208,13 +208,13 @@
<string name="PermissionOpenSettings">Paramètres</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">La messagerie <![CDATA[<b>la plus étendue</b>]]> dans le monde.<![CDATA[<br/><b>Libre</b>]]> et <![CDATA[<b>sécurisée</b>]]>.</string>
<string name="Intro1Message">La messagerie <![CDATA[<b>la plus étendue</b>]]> dans le monde.<![CDATA[<br/><b>Libre</b>]]> et <![CDATA[<b>indépendante</b>]]>.</string>
<string name="Intro2Headline">Indépendant</string>
<string name="Intro2Message"><![CDATA[<b>Aucune dépendance</b>]]> à des serveurs ou services tiers. L\'application utilise juste votre serveur d\'e-mail.</string>
<string name="Intro2Message"><![CDATA[<b>Il n\'y a pas de serveur Delta Chat.</b>]]> L\'application utilise juste votre serveur d\'e-mail.</string>
<string name="Intro3Headline">Rapide</string>
<string name="Intro3Message">Envoyez des messages <![CDATA[<b>en quelques secondes</b>]]>.<![CDATA[<br/>]]> grâce à son interface rapide.</string>
<string name="Intro3Message"><![CDATA[<b>Envoyez des messages</b>]]> en quelques secondes.<![CDATA[<br/>]]> Interface rapide.</string>
<string name="Intro4Headline">Puissant</string>
<string name="Intro4Message">Envoyer et recevez des messages, des photos, des vidéos, des messages audios et plus <![CDATA[<b>sans limite</b>]]>. Compatible multi-plateforme.</string>
@@ -222,7 +222,7 @@
<string name="Intro5Headline">Libre</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> sera toujours libre.<![CDATA[<br/>]]>OpenSource. Pas de pub. Pas d\'inscription. Pas lié a un fournisseur.</string>
<string name="Intro6Headline">Sûr</string>
<string name="Intro6Headline">Chiffré</string>
<string name="Intro6Message"><![CDATA[<b>Chiffré</b>]]> avec des algorithmes reconnus. Les messages restent sur vos serveurs.</string>
<string name="Intro7Headline">Fiable</string>
@@ -239,7 +239,7 @@
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">Moi et %d membre</item>
<item quantity="other">Moi et %d membres</item>
<item quantity="other">%d membres et moi</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d nouveau message</item>
@@ -312,7 +312,7 @@
<string name="InboxHeadline">Boîte de réception</string>
<string name="OutboxHeadline">Boîte d\'envoi</string>
<string name="MyAccountExplain">Pour les fournisseurs e-mails connus, les paramètres suivants seront déterminés automatiquement.</string>
<string name="MyAccountExplain2" >Parfois, les protocoles IMAP/SMTP doivent être activés depuis l\'interface web.\n\nSi vous rencontrez des problème, demandez à votre fournisseur ou à vos amis.</string>
<string name="MyAccountExplain2" >Parfois, <![CDATA[<b>]]>IMAP doit être activé<![CDATA[</b>]]> depuis l\'interface web.\n\nSi vous rencontrez des problème, demandez à votre fournisseur ou à vos amis.</string>
<string name="AccountNotConfigured">Compte non configuré</string>
<string name="AboutThisProgram">À propos Delta Chat</string>
<string name="NotSet">Non défini</string>
@@ -321,7 +321,7 @@
<string name="DeaddropInChatlist">Monter les demandes de contact dans la liste des conversations</string>
<string name="MuteAlways">Toujours muet</string>
<string name="AskStartChatWith">Lancer une conversation avec <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="DeaddropHint">Pour lancer une conversation, cliquez sur le bouton de réponse en forme de flèche.</string>
<string name="DeaddropHint">Pour commencer une conversation, cliquez sur le bouton de réponse en forme de flèche.</string>
<string name="NotYetImplemented">Cette fonction n\'est pas disponible ou non supportée complètement.</string>
<string name="DefaultStatusText">Envoyé avec Delta Chat: https://delta.chat</string>
<string name="Name" >Nom</string>
@@ -333,12 +333,12 @@
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Veuillez patienter…</string>
<string name="NoChatsHelp">Lancez une conversation en appuyant sur le bouton dans le coin inférieur droit ou appuyez sur le bouton menu pour plus d\'options.</string>
<string name="NoChatsHelp">Lancez une conversation en appuyant sur le bouton \"Nouvelle conversation\" dans le coin inférieur droit ou appuyez sur le bouton \"Menu\" pour plus d\'options.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> est sûr pour une utilisation professionnelle, compatible et basé sur des standards.</string>
<string name="InviteMenuEntry">Envoyer des invitations</string>
<string name="InviteText">J\'utilise la messagerie Delta Chat maintenant - %1$s - vous pouvez me contacter à %2$s</string>
<string name="AdvancedSettings">Paramètres avancés</string>
<string name="AskResetNotifications">Réinitialiser toutes les paramètres de notification et les sons de cette page ainsi que de vos contacts et groupes?</string>
<string name="AskResetNotifications">Réinitialiser toutes les paramètres de notification et de son de cette page, contacts et groupes?</string>
<string name="AttachFiles">Joindre des fichiers</string>
<string name="ErrGroupNameEmpty">Merci de saisir un nom pour le groupe.</string>
<string name="MsgNewGroupDraftHint">Écrivez un premier message pour permettre aux autres de répondre dans ce groupe.\n\n• Ça ne devrait pas poser de problème si tous les membres du groupe n\'utilisent pas Delta Chat.\n\n• L\'envoi du premier message peut prendre un moment.</string>
@@ -390,9 +390,9 @@
<string name="ImportExportExplain">Les fichiers exportés contiendront des clés privées! Gardez-les dans un endroit sûr ou supprimez-les dès que possible.</string>
<string name="EnterPasswordToContinue">Entrer le mot de passe pour %1$s pour continuer:</string>
<string name="IncorrectPassword">Mot de passe incorrect.</string>
<string name="ImportBackupAsk">Delta Chat a trouvé une sauvegarde dans <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\n Voulez-vous importer et utiliser toutes les données et paramètres de cette sauvegarde?</string>
<string name="ImportBackupAsk">Une sauvegarde a été trouvée dans <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\n Voulez-vous importer et utiliser toutes les données et paramètres de cette sauvegarde?</string>
<string name="ImportBackup">Importer une sauvegarde</string>
<string name="NoBackupFound">Aucune sauvegarde à importer trouvée.\n\nCopier la sauvegarde dans <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> et réessayez. Sinon, appuyez sur \"Démarrer la messagerie\" pour un processus d\'installation normal.</string>
<string name="NoBackupFound">Aucune sauvegarde trouvée.\n\nCopier la sauvegarde dans <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> et réessayez. Sinon, appuyez sur \"Démarrer la messagerie\" pour un processus d\'installation normal.</string>
<string name="FilesSuccessfullyExported">Fichiers exportés avec succès dans <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
<string name="ExportBackup">Exporter une sauvegarde</string>
<string name="ExportPrivateKeys">Exporter les clés privées</string>
@@ -410,4 +410,16 @@ La dernière clé importée sera utilisée comme nouvelle clé par défaut</stri
<string name="LeaveGroup">Quitter le groupe</string>
<string name="AskLeaveGroup">Êtes-vous sûr de vouloir quitter ce groupe?</string>
<string name="Never">Jamais</string>
<string name="AutocryptKeyTransferInitiate">Lancer le transfert de clé Autocrypt</string>
<string name="AutocryptKeyTransfer">Transfert de clé Autocrypt</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Le <![CDATA[<i>]]>transfert de clé Autocrypt<![CDATA[</i>]]> nécessite que le client de messagerie sur l\'autre périphérique soit compatible avec Autocrypt.\n\nVous pouvez alors vous envoyer votre clé secrète. La clé sera cryptée par un code d\'installation qui est affiché ici et doit être tapé sur l\'autre appareil.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Votre clé vous a été envoyée. Passez à l\'autre appareil et ouvrez le message d\'installation. Vous devriez être invité à entrer un code d\'installation. Tapez les chiffres suivants dans l\'invite:\n\n%1$s\n\nUne fois que vous avez terminé, votre autre périphérique sera prêt à utiliser Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Message d\'installation d\'Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Ceci est le message d\'installation d\'Autocrypt utilisé pour transférer votre clé entre les clients.\n\nPour déchiffrer et utiliser votre clé, ouvrez le message dans un client compatible avec Autocrypt et entrez le code d\'installation présenté sur le périphérique d\'envoi.</string>
<string name="AutocryptSetupMessageTapBody">Ceci est le message d\'installation d\'Autocrypt utilisé pour transférer votre clé entre les clients.\n\nPour déchiffrer et utiliser votre clé, appuyez sur ce message.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Veuillez entrer le code d\'installation affiché sur l\'autre appareil.</string>
<string name="AutocryptKeyTransferBadCode">Mauvais code d\'installation. Veuillez réessayer.\n\nSi vous ne vous souvenez pas du code d\'installation, lancez à nouveau le transfert de clé depuis l\'autre appareil.</string>
<string name="AutocryptKeyTransferSucceeded">Clé transférée avec succès. Cet appareil est maintenant prêt à utiliser Autocrypt avec la même clé que l\'autre appareil.</string>
<string name="Retry">Recommencez</string>
<string name="SelfTalkSubtitle">Messages que je me suis envoyé</string>
</resources>
@@ -409,4 +409,16 @@
<string name="LeaveGroup">Abbandona gruppo</string>
<string name="AskLeaveGroup">Sei sicuro di voler abbandonare il gruppo?</string>
<string name="Never">Mai</string>
<string name="AutocryptKeyTransferInitiate">Avviato trasferimento chiavi Autocrypt</string>
<string name="AutocryptKeyTransfer">Trasferimento chiavi Autocrypt</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Il <![CDATA[<i>]]>trasferimento chiavi Autocrypt<![CDATA[</i>]]> richiede che il client email sull\'altro dispositivo sia compatibile con Autocrypt.\n\nSarà quindi possibile inviare la chiave a se stessi. La chiave verrà cifrata con un codice di configurazione che verrà mostrato qui e dovrà essere digitato sull\'altro dispositivo.</string>
<string name="AutocryptKeyTransferMsgAfterSend">La chiave è stata inviata. Passare all\'altro dispositivo e aprire il messaggio di configurazione. Verrà richiesto un codice. Digitare il codice seguente:\n\n%1$s\n\nUna volta terminato, l\'altro dispositivo sarà pronto per usare Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Massaggio di configurazione Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Questo è il messaggio di configurazione di Autocrypt usato per trasferire la propria chiave tra più client.\n\nPer decifrare e usare la chiave, aprire il messaggio in un client compatibile con Autocrypt e digitare il codice di configurazione visibile sul dispositivo dal quale si è generata la chiave.</string>
<string name="AutocryptSetupMessageTapBody">Questo è il messaggio di configurazione di Autocrypt usato per trasferire la propria chiave tra più client.\n\nPer decifrare e usare la chiave, aprire questo messaggio.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Inserire il codice di configurazione mostrato sull\'altro dispositivo.</string>
<string name="AutocryptKeyTransferBadCode">Codice di configurazione errato.\n\nSe non si ricorda il codice di configurazione, avviare nuovamente il trafserimento chiavi sull\'altro dispositivo.</string>
<string name="AutocryptKeyTransferSucceeded">Chiave trasferita con successo. Questo dispositivo è pronto per usare Autocrypt con la stessa chiave dell\'altro dispositivo.</string>
<string name="Retry">Riprovare</string>
<string name="SelfTalkSubtitle">Messaggi inviati a se stessi</string>
</resources>
@@ -82,6 +82,7 @@
<string name="BlockedContacts">Blokkerte kontakter</string>
<string name="Default">Forvalg</string>
<string name="OnlyIfSilent">Bare hvis lydløs</string>
<string name="ChatBackground">Sludrebakgrunn</string>
<string name="SendByEnter">Send med "Enter"</string>
<string name="Help">Hjelp</string>
<string name="Enabled"></string>
@@ -90,12 +91,16 @@
<string name="BadgeNumber">Vis antall i ikon hvis mulig</string>
<string name="Short">Kort</string>
<string name="Long">Lang</string>
<string name="RaiseToSpeak">Hev for å snakke</string>
<string name="EditName">Rediger navn</string>
<string name="NotificationsPriority">Vis</string>
<string name="NotificationsPriorityDefault">Normal prioritet</string>
<string name="NotificationsPriorityHigh">Høy prioritet</string>
<string name="NotificationsPriorityMax">Høyeste prioritet</string>
<string name="RepeatNotifications">Gjenta merknader</string>
<string name="NotificationsOther">Annet</string>
<string name="InChatSound">Lyder i sludring</string>
<string name="SmartNotifications">Begrens merknader</string>
<string name="SmartNotificationsSoundAtMost">Maks.</string>
<string name="SmartNotificationsTimes">tider</string>
<string name="SmartNotificationsWithin">innen</string>
@@ -109,14 +114,23 @@
<string name="KeepMediaForever">For alltid</string>
<!--passcode view-->
<string name="Passcode">Programlås</string>
<string name="ChangePasscode">Endre passord</string>
<string name="ChangePasscodeInfo">Hvis du setter opp et passord til, vil et låseikon vises på sludresiden. Trykk på det for å låse programmet.\n\nMerk: Hvis du glemmer passordet, må du slette og reinstallere programmet.</string>
<string name="PasscodePIN">PIN</string>
<string name="PasscodePassword">Passord</string>
<string name="EnterCurrentPasscode">Skriv inn ditt nåværende passord</string>
<string name="EnterNewFirstPasscode">Skriv inn et passord</string>
<string name="EnterNewPasscode">Skriv inn ditt nye passord</string>
<string name="EnterYourPasscode">Skriv inn passordet ditt</string>
<string name="ReEnterYourPasscode">Skriv inn passordet ditt igjen</string>
<string name="PasscodeDoNotMatch">Passordene stemmer ikke overens</string>
<string name="AutoLock">Autolås</string>
<string name="AutoLockInfo">Krev passord etter inaktivitet.</string>
<string name="UnlockFingerprint">Lås opp med fingeravtrykk</string>
<string name="FingerprintInfo">Bekreft fingeravtrykk for å fortsette</string>
<string name="FingerprintNotRecognized">Fingeravtrykket ble ikke gjenkjent. Prøv igjen</string>
<!--photo gallery view-->
<string name="SaveToGallery">Lagre i \"Galleri"\</string>
<string name="SaveToGallery">Lagre i \"Galleri\"</string>
<string name="Of">%1$d av %2$d</string>
<string name="Gallery">Galleri</string>
<string name="AllPhotos">Alle bilder</string>
@@ -126,14 +140,28 @@
<string name="CropImage">Beskjær bilde</string>
<string name="EditImage">Rediger bilde</string>
<string name="Enhance">Forbedre</string>
<string name="Highlights">Framhevinger</string>
<string name="Contrast">Kontrast</string>
<string name="Exposure">Eksponering</string>
<string name="Warmth">Varme</string>
<string name="Saturation">Metning</string>
<string name="Vignette">Vignettering</string>
<string name="Shadows">Skygger</string>
<string name="Grain">Kornethet</string>
<string name="Sharpen">Øk skarphet</string>
<string name="Fade">Toning</string>
<string name="Tint">Missfarging</string>
<string name="TintShadows">Skygger</string>
<string name="TintHighlights">Framhevinger</string>
<string name="Curves">Kurver</string>
<string name="CurvesAll">ALLE</string>
<string name="CurvesRed">RØD</string>
<string name="CurvesGreen">GRØNN</string>
<string name="CurvesBlue">BLÅ</string>
<string name="Blur">Tilsmussing</string>
<string name="BlurOff">Av</string>
<string name="BlurLinear">Lineæritet</string>
<string name="BlurRadial">Gon</string>
<string name="DiscardChanges">Forkast endringer?</string>
<string name="ClearButton">Tøm</string>
<string name="PickerPhotos">Bilder</string>
@@ -154,6 +182,7 @@
<string name="Forward">Videresend</string>
<string name="FromCamera">Fra kamera</string>
<string name="FromGalley">Fra galleri</string>
<string name="Set">Sett</string>
<string name="OK">OK</string>
<string name="Crop">BESKJÆR</string>
<!--messages-->
@@ -185,10 +214,14 @@
<string name="Intro2Message"><![CDATA[<b>Ingen avhengigheter</b>]]> på datamaskiner annensteds hen, eller tjenester. Programmet bruker kun e-posttjeneren din.</string>
<string name="Intro3Headline">Rask</string>
<string name="Intro3Message"><![CDATA[<b>Push-meldinger</b>]]> på kun sekunder.<![CDATA[<br/>]]>Hurtig grensesnitt.</string>
<string name="Intro4Headline">Kraftig</string>
<string name="Intro4Message"><![CDATA[<b>Ubegrensede</b>]]> sludringer, bilder, videoer, lydmeldinger med mer. Multiklient-støtte.</string>
<string name="Intro5Headline">Ledig</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> er gratis for alltid.<![CDATA[<br/>]]>Friprog. Ingen reklame. Inget abonnement. Inget tvunget tilbyderforhold.</string>
<string name="Intro6Headline">Trygt</string>
<string name="Intro6Message"><![CDATA[<b>Kryptert</b>]]> med alle vanlige alle vanlige algoritmer. Meldingene forblir på tjenerne.</string>
@@ -256,6 +289,12 @@
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yyyy</string>
<string name="chatDate">EEE, d, MMMM</string>
<string name="chatFullDate">EEE, d. MMMM, yyyy</string>
<string name="formatterWeek">EEE</string>
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s klokka %2$s</string>
<string name="AccountSettings">Kontoinnstillinger</string>
<string name="MyAccount">Min konto</string>
<string name="MyName">Mitt navn</string>
@@ -299,9 +338,12 @@
<string name="InviteMenuEntry">Send invitasjoner</string>
<string name="InviteText">Jeg bruker Delta Chat-meldingstjenesten nå - %1$s - du kan tekste meg på %2$s</string>
<string name="AdvancedSettings">Avanserte innstillinger</string>
<string name="AskResetNotifications">Tilbakestill alle merknadsinnstillinger og lyder for gjeldende side, kontakter og grupper?</string>
<string name="AttachFiles">Legg ved filer</string>
<string name="ErrGroupNameEmpty">Skriv inn et navn for gruppen.</string>
<string name="MsgNewGroupDraftHint">Forfatt den første meldingen, noe som lar andre svare i gruppen.\n\n• Det er greit at ikke alle medlemmer bruker Delta Chat.\n\n• Levering av den første meldingen kan ta sin tid.</string>
<string name="MsgNewGroupDraft">Hei, jeg har akkurat opprettet gruppen \"%1$s\" for oss.</string>
<string name="MsgGroupNameChanged">Gruppenavn endret fra \"%1$s\" til \"%2$s\".</string>
<string name="MsgGroupImageChanged">Gruppebilde endret.</string>
<string name="MsgMemberAddedToGroup">Medlem %1$s lagt til.</string>
<string name="MsgMemberRemovedFromToGroup">Medlem %1$s fjernet.</string>
@@ -309,6 +351,7 @@
<string name="AskRemoveMemberFromGroup">Fjern <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> fra gruppen?</string>
<string name="ErrSelfNotInGroup">Du må være medlem av gruppen for å utføre denne handlingen.</string>
<string name="MsgGroupLeft">Gruppe oppløst.</string>
<string name="NoMessagesHint">Send melding til <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• Det er greit hvis <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> ikke bruker Delta Chat.\n\n• Levering av den første meldingen kan ta sin tid.</string>
<string name="SendNRcvReadReceipts">Motta og send meldingskvitteringer</string>
<string name="PreferE2EEncryption">Foretrekk ende-til-ende -kryptering</string>
<string name="E2EManagePrivateKeys">Behandle private nøkler</string>
@@ -325,23 +368,31 @@
<string name="PermNotificationText">Venter på meldinger…</string>
<string name="SettingsFor">Innstillinger for %1$s</string>
<string name="AutoplayGifs">Spill av GIF-filer automatisk</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Kryptert melding</string>
<string name="Encryption">Kryptering</string>
<string name="EncrinfoE2E">Ende-til-ende -kryptering påskrudd.</string>
<string name="EncrinfoE2EExplain">Hvis alle fingeravtrykkene stemmer overens på den andre enheten, er tilkoblingen trygg.</string>
<string name="EncrinfoTransport">Transport-kryptering ihvertfall opptil min tjener.</string>
<string name="EncrinfoNone">Ingen kryptering på min tjener.</string>
<string name="EncrinfoNoE2EExplain">Ende-til-ende -kryptering vil bli brukt hvis mottakeren også bruker et Autocrypt-program.</string>
<string name="EncrinfoFingerprints">Fingeravtrykk</string>
<string name="Backup">Sikkerhetskopi</string>
<string name="ImportBackupExplain2">For å importere en sikkerhetskopi, importer den til <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> og reinstaller programmet.</string>
<string name="ReadReceiptMailBody">Dette er en meldingskvittering for meldingen \"%1$s\".\n\nDenne meldingskvitteringen bekrefter bare at meldingen ble vist på mottakerens enhet. Det finnes ingen garanti for at mottakeren har lest meldingsinnholdet.</string>
<string name="ReadReceipt">Meldingskvittering</string>
<string name="NameAndStatus">Navn og status</string>
<string name="MyStatus">Min status</string>
<string name="MyStatusExplain">Denne statusen viser i bunntekster for e-post, samt andre steder.</string>
<string name="MsgGroupImageDeleted">Gruppebilde slettet.</string>
<string name="AskDeleteGroupImage">Er du sikker på at du vil slette dette gruppebildet?\n\nDette vil ha innvirkning på alle enhetene tilhørende gruppemedlemmene.</string>
<string name="ExportImportHeader">Eksport og import</string>
<string name="ImportExportExplain">Eksporterte filer vil inneholde hemmelige nøkler! Ta vare på dem på en trygg plass, eller slett dem så snart som mulig.</string>
<string name="EnterPasswordToContinue">Skriv inn passordet for %1$s for å fortsette:</string>
<string name="IncorrectPassword">Uriktig passord.</string>
<string name="ImportBackupAsk">Sikkerhetskopi funnet i <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nØnsker du å importere og bruke alle data og innstillinger fra den?</string>
<string name="ImportBackup">Importer sikkerhetskopi</string>
<string name="NoBackupFound">Fant ingen sikkerhetskopier.\n\nKopier sikkerhetskopien til <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> og prøv igjen. Alternativt, trykk \"Start meldingsforsendelse\" for normal oppsettsprosess.</string>
<string name="FilesSuccessfullyExported">Filer eksporter til <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
<string name="ExportBackup">Eksporter sikkerhetskopi</string>
<string name="ExportPrivateKeys">Eksporter private nøkler</string>
@@ -358,4 +409,16 @@
<string name="LeaveGroup">Forlat gruppe</string>
<string name="AskLeaveGroup">Er du sikker på at du vil forlate denne gruppen?</string>
<string name="Never">Aldri</string>
<string name="AutocryptKeyTransferInitiate">Igangsett Autocrypt-nøkkeloverføring</string>
<string name="AutocryptKeyTransfer">Autocrypt-nøkkeloverføring</string>
<string name="AutocryptKeyTransferMsgBeforeSend">The <![CDATA[<i>]]>Autocrypt-nøkkeloverføring<![CDATA[</i>]]> krever at e-postklienten på den andre enheten er Autocrypt-kompatibel.\n\nDu kan så sende din hemmelige nøkkel til deg selv. Nøkkelen vil bli kryptert av en oppsettskode som vises her og må skrives inn på den andre enheten.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Nøkkelen din har blitt sendt til deg selv. Bytt til den andre enheten og åpne oppsettsmeldingen. Du bør bli forespurt om å oppgi en oppsettskode. Skriv in følgende siffer:\n\n%1$s\n\nNår du er ferdig, vil din andre enhet også kunne bruke Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt-oppsettsmelding</string>
<string name="AutocryptSetupMessageGeneralBody">Dette er Autocrypt-oppsettsmeldingen brukt til å overføre nøkkelen din mellom klienter.\n\nFor å dekryptere å bruke din nøkkel, åpne meldingen i en Autocrypt-kompatibel klient og skriv inn oppsettskoden som vises på enheten som genererer den.</string>
<string name="AutocryptSetupMessageTapBody">Dette er Autocrypt-oppsettsmeldingen brukt til å overføre nøkkelen din mellom klienter.\n\nFor å dekryptere å bruke din nøkkel, trykk på denne meldingen.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Skriv inn oppsettskoden som vises på den andre enheten.</string>
<string name="AutocryptKeyTransferBadCode">Feil oppsettskode. Prøv igjen.\n\nHvis du ikke husker den, sett igang nøkkeloverføringen på en andre enheten igjen.</string>
<string name="AutocryptKeyTransferSucceeded">Nøkkel overført. Denne enheten er nå klar til å bruke Autocrypt med samme nøkkel som den andre enheten.</string>
<string name="Retry">Prøv igjen</string>
<string name="SelfTalkSubtitle">Meldinger jeg har sendt til meg selv</string>
</resources>
@@ -437,4 +437,16 @@
<string name="LeaveGroup">Opuść grupę</string>
<string name="AskLeaveGroup">Czy na pewno chcesz opuścić tą grupę?</string>
<string name="Never">Nigdy</string>
<string name="AutocryptKeyTransferInitiate">Rozpocznij tranfer klucza automatycznego szyfrowania</string>
<string name="AutocryptKeyTransfer">Tranfer klucza automatycznego szyfrowania</string>
<string name="AutocryptKeyTransferMsgBeforeSend"><![CDATA[<i>]]>Tranfer klucza automatycznego szyfrowania<![CDATA[</i>]]> wymaga, aby klient poczty na drugim urządzeniu był zgodny z automatycznym szyfrowaniem.\n\nMożesz wysłać klucz do siebie. Klucz zostanie zaszyfrowany za pomocą wyświetlonego tutaj kodu konfiguracyjnego, który należy wpisać na drugim urządzeniu.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Klucz został wysłany do ciebie. Przejdź do innego urządzenia i otwórz wiadomość konfiguracyjną. Zostanie wyświetlona prośba o podanie kodu konfiguracyjnego. Wpisz następujące cyfry w podpowiedzi:\n\n%1$s\n\nGdy skończysz, drugie urządzenie będzie gotowe do użycia funkcji automatycznego szyfrowania.</string>
<string name="AutocryptSetupMessageSubject">Wiadomość konfiguracyjna automatycznego szyfrowania</string>
<string name="AutocryptSetupMessageGeneralBody">Jest to wiadomość konfiguracyjna automatycznego szyfrowania służąca do przesyłania klucza między klientami.\n\nAby odszyfrować i użyć klucza, otwórz wiadomość w kliencie zgodnym z automatycznym szyfrowaniem i wprowadź kod konfiguracyjny przedstawiony na urządzeniu generującym.</string>
<string name="AutocryptSetupMessageTapBody">Jest to wiadomość konfiguracyjna automatycznego szyfrowania służąca do przesyłania klucza między klientami.\n\nAby odszyfrować i użyć klucza, dotknij tą wiadomość.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Wprowadź kod konfiguracyjny wyświetlany na drugim urządzeniu.</string>
<string name="AutocryptKeyTransferBadCode">Zły kod konfiguracyjny. Spróbuj ponownie.\n\nJeśli nie pamiętasz kodu konfiguracji, po prostu uruchom ponownie transfer klucza na drugim urządzeniu.</string>
<string name="AutocryptKeyTransferSucceeded">Udany transfer klucza. To urządzenie jest teraz gotowe do użycia automatycznego szyfrowania za pomocą tego samego klucza, co na drugim urządzeniu.</string>
<string name="Retry">Powtórz</string>
<string name="SelfTalkSubtitle">Wiadomości wysłane do siebie</string>
</resources>
@@ -17,7 +17,7 @@
<string name="UnmuteNotifications">Restaurar som</string>
<string name="Draft">Rascunho</string>
<!--audio view-->
<string name="NoAudio">Por favor, adicione músicas à sua biblioteca para vê-las aqui.</string>
<string name="NoAudio">Músicas adicionados à biblioteca do dispositivo serão exibidas aqui.</string>
<string name="AttachMusic">Música</string>
<!--documents view-->
<string name="SelectFile">Selecione um arquivo</string>
@@ -41,7 +41,7 @@
<string name="From">De</string>
<string name="NoRecent">Nada recente</string>
<string name="TypeMessage">Mensagem</string>
<string name="SlideToCancel">DESLIZE PARA CANCELAR</string>
<string name="SlideToCancel">Deslize para cancelar</string>
<string name="SaveToDownloads">Salvar em downloads</string>
<string name="SaveToMusic">Salvar em músicas</string>
<string name="Share">Compartilhar</string>
@@ -151,13 +151,13 @@
<string name="Sharpen">Nitidez</string>
<string name="Fade">Desbotar</string>
<string name="Tint">Matiz</string>
<string name="TintShadows">SOMBRAS</string>
<string name="TintHighlights">LUZES</string>
<string name="TintShadows">Sombras</string>
<string name="TintHighlights">Luzes</string>
<string name="Curves">Curvas</string>
<string name="CurvesAll">TUDO</string>
<string name="CurvesRed">VERMELHO</string>
<string name="CurvesGreen">VERDE</string>
<string name="CurvesBlue">AZUL</string>
<string name="CurvesAll">Tudo</string>
<string name="CurvesRed">Vermelho</string>
<string name="CurvesGreen">Verde</string>
<string name="CurvesBlue">Azul</string>
<string name="Blur">Desfoque</string>
<string name="BlurOff">Desativado</string>
<string name="BlurLinear">Linear</string>
@@ -184,7 +184,7 @@
<string name="FromGalley">Da galeria</string>
<string name="Set">Aplicar</string>
<string name="OK">OK</string>
<string name="Crop">CORTAR</string>
<string name="Crop">Cortar</string>
<!--messages-->
<string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Vídeo</string>
@@ -205,7 +205,7 @@
<string name="PermissionContacts">Delta Chat precisa acessar seus contatos para que você possa se conectar aos seus amigos em todos os seus dispositivos.</string>
<string name="PermissionStorage">Delta Chat precisa acessar seu armazenamento para que você possa enviar e salvar fotos, vídeos, músicas e outras mídias.</string>
<string name="PermissionNoAudio">Delta Chat precisa acessar seu microfone para que você possa enviar mensagens de voz.</string>
<string name="PermissionOpenSettings">Configurações de ajuste</string>
<string name="PermissionOpenSettings">Configurações</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">O aplicativo com a <![CDATA[<b>maior base de contatos</b>]]> do mundo.<![CDATA[<br/><b>Grátis</b>]]> e <![CDATA[<b>seguro</b>]]>.</string>
@@ -222,7 +222,7 @@
<string name="Intro5Headline">Grátis</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> será sempre grátis, de<![CDATA[<br/>]]>Código livre e sem propagandas.</string>
<string name="Intro6Headline">Seguro</string>
<string name="Intro6Headline">Criptografado</string>
<string name="Intro6Message"><![CDATA[<b>Criptografia</b>]]> com as tecnologias mais usadas. Suas mensagens ficam no servidor de e-mail.</string>
<string name="Intro7Headline">Confiável</string>
@@ -398,4 +398,26 @@
<string name="ExportPrivateKeys">Exportar chaves privadas</string>
<string name="ImportPrivateKeys">Importar chaves privadas</string>
<string name="ImportPrivateKeysAsk2">Importar chaves privadas de <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• As chaves existentes não serão apagadas\n\n• A última chave importada será usada como padrão</string>
<string name="NoRecentEmoji">Emojis recentemente usados.</string>
<string name="E2eeOffBecauseOfUser">Para habilitar a criptografia ponta a ponta revise as configurações do aplicativo.</string>
<string name="E2eeOffBecauseOfRecipient">> A criptografia ponta a ponta será empregada se o destinatário habilitá-la também.</string>
<string name="NotNow">Agora não</string>
<string name="ArchiveChat">Arquivar conversa</string>
<string name="UnarchiveChat">Desarquivar conversa</string>
<string name="ArchivedChats">Conversas arquivadas</string>
<string name="Archived">Arquivado</string>
<string name="LeaveGroup">Sair do grupo</string>
<string name="AskLeaveGroup">Tem certeza que deseja sair do grupo?</string>
<string name="Never">Jamais</string>
<string name="AutocryptKeyTransferInitiate">Começar transferência de chaves</string>
<string name="AutocryptKeyTransfer">Transferência de chaves</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Para funcionar, a <![CDATA[<i>]]>transferência de chaves <![CDATA[</i>]]> é necessário que o cliente de e-mail do outro dispositivo seja compatível com o Autocrypt.\n\nEnvie sua chave secreta para você mesmo. A chave será cifrada com o código exibido aqui, o qual precisará ser digitado no outro dispositivo.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Sua chave foi enviada para você mesmo. Abra a mensagem de configuração no seu outro dispositivo. Lá será exibido uma solicitação de código. Digite-o lá:\n\n%1$s\n\nDepois disso, seu dispositivo estará pronto para usar o Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Mensagem de configuração do Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Esta é uma mensagem de configuração do Autocrypt que serve para transferir suas chaves entre dispositivos diferentes.\n\nPara descriptografar sua chave abra esta mensagem num cliente de e-mail compatível e digite o código exibido no dispositivo de origem.</string>
<string name="AutocryptSetupMessageTapBody">Esta é uma mensagem de configuração do Autocrypt que serve para a transferência de chaves.\n\nPara completá-la toque nesta mensagem.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Por favor, digite o código exibido no outro dispositivo.</string>
<string name="AutocryptKeyTransferBadCode">Código errado. Tente novamente.\n\nSe você não se lembra do código recomece a transferência de chaves no dispositivo original.</string>
<string name="AutocryptKeyTransferSucceeded">Chaves transferidas. Agora você está pronto para usar o Autocrypt neste dispositivo com as mesmas chaves do outro.</string>
<string name="Retry">Repetir</string>
</resources>
@@ -43,7 +43,7 @@
<string name="TypeMessage">Сообщение</string>
<string name="SlideToCancel">СДВИНЬТЕ ДЛЯ ОТМЕНЫ</string>
<string name="SaveToDownloads">Сохранить в папку Загрузки</string>
<string name="SaveToMusic">Сохранить в музыку</string>
<string name="SaveToMusic">Сохранить в музыкальную коллекцию</string>
<string name="Share">Поделиться</string>
<string name="SendItems">Отправить %1$s</string>
<string name="ClearRecentEmoji">Очистить недавние смайлики?</string>
@@ -81,7 +81,7 @@
<string name="NotificationsAndSounds">Уведомления и звуки</string>
<string name="BlockedContacts">Заблокированные контакты</string>
<string name="Default">По умолчанию</string>
<string name="OnlyIfSilent">Только если тишина</string>
<string name="OnlyIfSilent">Только при выключенном звуке</string>
<string name="ChatBackground">Фон чата</string>
<string name="SendByEnter">Отправить нажав "Ввод"</string>
<string name="Help">Помощь</string>
@@ -101,7 +101,7 @@
<string name="NotificationsOther">Другие</string>
<string name="InChatSound">Звуки в чате</string>
<string name="SmartNotifications">Ограничение уведомлений</string>
<string name="SmartNotificationsSoundAtMost">Звук не более</string>
<string name="SmartNotificationsSoundAtMost">не более</string>
<string name="SmartNotificationsTimes">раз</string>
<string name="SmartNotificationsWithin">в пределах</string>
<string name="SmartNotificationsMinutes">минут</string>
@@ -192,7 +192,7 @@
<string name="AttachContact">Контакт</string>
<string name="AttachDocument">Файл</string>
<string name="AttachVoiceMessage">Голосовое сообщение</string>
<string name="FromSelf">Мне</string>
<string name="FromSelf">Я</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">У вас нет приложений, которые могут обрабатывать тип файла \'%1$s\', пожалуйста, установите такое приложение, чтобы продолжить</string>
<string name="ContactAlreadyInGroup">Контакт уже находится в этой группе.</string>
@@ -211,7 +211,7 @@
<string name="Intro1Message">Мессенджер с <![CDATA[<b>самым большим диапазоном охвата</b>]]> в мире. <![CDATA[<br/><b>Бесплатный</b>]]> и <![CDATA[<b>безопасный</b>]]>.</string>
<string name="Intro2Headline">Независимый</string>
<string name="Intro2Message"><![CDATA[<b>Независимость</b>]]> от иностранных компьютеров или сервисов. Приложение использует только ваш почтовый сервер.</string>
<string name="Intro2Message"><![CDATA[<b>У Delta Chat нет своих серверов.</b>]]> Используется только ваш почтовый сервер.</string>
<string name="Intro3Headline">Быстрый</string>
<string name="Intro3Message"><![CDATA[<b>Push-сообщения</b>]]> за секунды.<![CDATA[<br/>]]>Быстрый интерфейс.</string>
@@ -340,7 +340,7 @@
<string name="InboxHeadline">Входящие</string>
<string name="OutboxHeadline">Исходящие</string>
<string name="MyAccountExplain">Для известных поставщиков электронной почты дополнительные настройки определяются автоматически.</string>
<string name="MyAccountExplain2" >Иногда, <![CDATA[<b>]]>IMAP должен быть включен<![CDATA[</b>]]> в веб-интерфейсе электронной почты.\n\nВ случае затруднений, обратитесь к своему поставщику электронной почты или компетентным друзьям.</string>
<string name="MyAccountExplain2" >Иногда <![CDATA[<b>]]>IMAP должен быть включён<![CDATA[</b>]]> в веб-интерфейсе электронной почты.\n\nВ случае затруднений обратитесь к своему поставщику услуги электронной почты, или компетентным друзьям.</string>
<string name="AccountNotConfigured">Аккаунт не настроен</string>
<string name="AboutThisProgram">Delta Chat (Дельта Чат)</string>
<string name="NotSet">Не задано</string>
@@ -361,7 +361,7 @@
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Один момент …</string>
<string name="NoChatsHelp">Начните обмен сообщениями, нажав кнопку нового чата в нижнем правом углу или коснитесь кнопки меню для получения дополнительных возможностей.</string>
<string name="NoChatsHelp">Начните обмен сообщениями, нажав кнопку нового чата в нижнем правом углу, или коснитесь кнопки меню для получения дополнительных возможностей.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> безопасен для использования в бизнесе, основан на совместимых стандартах.</string>
<string name="InviteMenuEntry">Отправить приглашения</string>
<string name="InviteText">Я использую систему мгновенных сообщений Delta Chat - %1$s - вы можете написать мне на %2$s</string>
@@ -415,7 +415,7 @@
<string name="MsgGroupImageDeleted">Изображение группы удалено.</string>
<string name="AskDeleteGroupImage">Вы действительно хотите удалить изображение группы?\n\nИзменение вступит в силу на всех устройствах участников группы.</string>
<string name="ExportImportHeader">Экспорт и импорт</string>
<string name="ImportExportExplain">Файлы экспорта будут содержать закрытые ключи! Храните их в защищенном месте или удалите их по первой возможности.</string>
<string name="ImportExportExplain">Файлы экспорта будут содержать закрытые ключи! Храните их в защищенном месте или удалите их при первой возможности.</string>
<string name="EnterPasswordToContinue">Введите пароль для %1$s, чтобы продолжить:</string>
<string name="IncorrectPassword">Неверный пароль.</string>
<string name="ImportBackupAsk">Delta Chat нашел резервную копию в <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nИмпортировать и использовать все данные и настройки из резервной копии?</string>
@@ -430,11 +430,23 @@
<string name="E2eeOffBecauseOfUser">Для включения сквозного шифрования выберите соответствующий пункт в настройках.</string>
<string name="E2eeOffBecauseOfRecipient">Шифрование будет переключено в сквозной режим, если со стороны контакта будет выбран соответствующий пункт настроек.</string>
<string name="NotNow">Не сейчас</string>
<string name="ArchiveChat">Архивировать чат</string>
<string name="UnarchiveChat">Разархивировать чат</string>
<string name="ArchivedChats">Архивированные чаты</string>
<string name="Archived">Помещено в архив</string>
<string name="ArchiveChat">Переместить чат в архив</string>
<string name="UnarchiveChat">Вернуть чат из архива в активный режим</string>
<string name="ArchivedChats">Архив чатов</string>
<string name="Archived">в архиве</string>
<string name="LeaveGroup">Выйти из группы</string>
<string name="AskLeaveGroup">Вы уверены, что хотите выйти из группы?</string>
<string name="Never">Никогда</string>
<string name="AutocryptKeyTransferInitiate">Начать передачу ключа Autocrypt</string>
<string name="AutocryptKeyTransfer">Передача ключа Autocrypt</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Для <![CDATA[<i>]]>передачи ключа Autocrypt<![CDATA[</i>]]> необходимо, чтобы почтовый клиент на другом устройстве так же поддерживал Autocrypt.\n\nЗатем Вы можете послать ключ себе. Ключ будет зашифрован кодом настройки, который указан здесь, и который нужно будет ввести на другом устройстве.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Вы отправили ключ себе. Теперь перейдите к другому устройству и откройте сообщение настройки. Будет предложено ввести код настройки. Введите следующие цифры:\n\n%1$s\n\nКак только Вы это сделаете, другое устройство будет готово использовать Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Сообщение настройки Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Это сообщение настройки Autocrypt, используемое для передачи ключа между клиентами.\n\nДля расшифровки и использования Вашего ключа откройте это сообщение в почтовом клиенте, совместимом с Autocrypt, и введите код, показываемый на устройстве, с которого отправлено сообщение.</string>
<string name="AutocryptSetupMessageTapBody">Это сообщение настройки Autocrypt, используемое для передачи Вашего ключа между клиентами.\n\nЧтобы расшифровать и начать использовать Ваш ключ, нажмите на это сообщение.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Пожалуйста, введите код настройки, показанный на другом устройстве.</string>
<string name="AutocryptKeyTransferBadCode">Неверный код настройки. Пожалуйста, повторите.\n\nЕсли Вы не помните код настройки, вернитесь к исходному устройству и передайте ключ ещё раз.</string>
<string name="AutocryptKeyTransferSucceeded">Ключ передан успешно. Сейчас это устройство может использовать Autocrypt с тем же ключом, что и на другом устройстве.</string>
<string name="Retry">Повторить</string>
<string name="SelfTalkSubtitle">Сообщения самому себе</string>
</resources>
@@ -0,0 +1,423 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="AppName">Delta Chat</string>
<!--chats view-->
<string name="Settings">Rregullime</string>
<string name="NewGroup">Grup i ri</string>
<string name="NoResult">S\ka përfundime.</string>
<string name="NoChats">Ende pa biseda.</string>
<string name="DeleteChat">Fshije bisedën</string>
<string name="SelectChat">Përzgjidhni bisedë…</string>
<string name="Search">Kërko</string>
<string name="MuteNotifications">Mos shfaq njoftime</string>
<string name="MuteFor">Mos i shfaq për %1$s</string>
<string name="UnmuteNotifications">Shfaqi</string>
<string name="Draft">Skicë</string>
<!--audio view-->
<string name="NoAudio">Kartelat e shtuara te mediateka e pajisjes suaj do të shfaqen këtu.</string>
<string name="AttachMusic">Muzikë</string>
<!--documents view-->
<string name="SelectFile">Përzgjidhni Kartelë</string>
<string name="FreeOfTotal">%1$s nga %2$s të lira</string>
<string name="ErrorHint">Gabim i panjohur</string>
<string name="AccessError">Gabim hyrjeje</string>
<string name="NoFiles">Ende pa kartela…</string>
<string name="NotMounted">S\ka depozitë të montuar</string>
<string name="UsbActive">Shpërngulje USB në ecuri e sipër</string>
<string name="InternalStorage">Depozitë e Brendshme</string>
<string name="ExternalStorage">Depozitë e Jashtme</string>
<string name="SystemRoot">Rrënjë e Sistemit</string>
<string name="SdCard">Diskth SD</string>
<string name="Folder">Dosje</string>
<string name="GalleryInfo">Për dërgim figurash të pangjeshura</string>
<!--chat view-->
<string name="ChatGallery">Galeri</string>
<string name="ChatCamera">Kamerë</string>
<string name="NoMessages">S\ka mesazhe.</string>
<string name="ForwardedMessage">Mesazh i përcjellë</string>
<string name="From">Nga</string>
<string name="NoRecent">Ska të freskët</string>
<string name="TypeMessage">Mesazh</string>
<string name="SlideToCancel">Rrëshqiteni që të anulohet</string>
<string name="SaveToDownloads">Ruaje te \"Shkarkime\"</string>
<string name="SaveToMusic">Ruaje te \"Muzikë\"</string>
<string name="Share">Ndajeni me të tjerë</string>
<string name="SendItems">Dërgo %1$s</string>
<string name="ClearRecentEmoji">Të hiqen emoji-t e përdorur së fundi?</string>
<string name="AddShortcut">Shtoje widget-in te kreu</string>
<string name="ShortcutAdded">Widget-i u shtua tek kreu</string>
<!--notification-->
<string name="Reply">Përgjigjuni</string>
<string name="ReplyToGroup">Përgjigjiuni %1$s</string>
<string name="ReplyToContact">Përgjigjiuni %1$s</string>
<!--contacts view-->
<string name="NoContacts">Ende pa kontakte.</string>
<!--group create view-->
<string name="SendMessageTo">Dërgoni mesazh te…</string>
<string name="EnterGroupNamePlaceholder">Jepni emër grupi</string>
<!--group info view-->
<string name="AddMember">Shtoni anëtar</string>
<string name="Notifications">Njoftime</string>
<string name="RemoveMember">Hiqni anëtar</string>
<!--contact info view-->
<string name="NewContactTitle">Kontakt i ri</string>
<string name="BlockContact">Bllokoje kontaktin</string>
<string name="DeleteContact">Fshije kontaktin</string>
<string name="Info">Të dhëna</string>
<!--settings view-->
<string name="TextSize">Madhësi shkronjash mesazhi</string>
<string name="UnblockContact">Zhbllokoje kontaktin</string>
<string name="NoBlocked">Ende pa kontakte të bllokuar</string>
<string name="DefaultForNormalMessages">Mesazhe normale</string>
<string name="MessagePreview">Paraparje mesazhesh</string>
<string name="DefaultForGroupMessages">Mesazhi grupi</string>
<string name="Sound">Tingull</string>
<string name="InAppNotifications">Njoftime nga aplikacioni</string>
<string name="Vibrate">Dridhu</string>
<string name="ResetAllNotifications">Ktheji krejt njoftimet te parazgjedhjet</string>
<string name="NotificationsAndSounds">Njoftime dhe tinguj</string>
<string name="BlockedContacts">Kontakte të bllokuar</string>
<string name="Default">Parazgjedhje</string>
<string name="OnlyIfSilent">Vetëm për pa zë</string>
<string name="ChatBackground">Sfond bisedash</string>
<string name="SendByEnter">Dërgoje me \"Enter\"</string>
<string name="Help">Ndihmë</string>
<string name="Enabled">On</string>
<string name="Disabled">Off</string>
<string name="LedColor">Ngjyrë LED</string>
<string name="BadgeNumber">Në qoftë e mundur, përdor ikonë për numërime</string>
<string name="Short">E shkurtër</string>
<string name="Long">E gjatë</string>
<string name="RaiseToSpeak">Ngrijeni që të flisni</string>
<string name="EditName">Përpunoni emrin</string>
<string name="NotificationsPriority">Shiheni</string>
<string name="NotificationsPriorityDefault">Përparësi normale</string>
<string name="NotificationsPriorityHigh">Përparësi e lartë</string>
<string name="NotificationsPriorityMax">Përparësia më lartë</string>
<string name="RepeatNotifications">Njoftime përsëritjeje</string>
<string name="NotificationsOther">Tjetër</string>
<string name="InChatSound">Tinguj nga aplikacioni</string>
<string name="SmartNotifications">Kufizo njoftimet</string>
<string name="SmartNotificationsSoundAtMost">Maks.</string>
<string name="SmartNotificationsTimes">herë</string>
<string name="SmartNotificationsWithin">brenda</string>
<string name="SmartNotificationsMinutes">minutash</string>
<string name="DirectShare">Ndarje e drejtpërdrejtë me të tjerët</string>
<string name="DirectShareInfo">Shfaq biseda të freskëta te menuja e ndarjeve me të tjerët</string>
<!--cache view-->
<string name="CacheSettings">Depozitë</string>
<string name="KeepMedia">Mbaje Median</string>
<string name="KeepMediaInfo">Foto, video dhe kartela të tjera prej bisedash në re, që <![CDATA[<b>nuk i keni hapur</b>]]> gjatë kësaj periudhe, do të hiqen prej pajisjes, për të kursyer hapësirë disku.</string>
<string name="KeepMediaForever">Përgjithmonë</string>
<!--passcode view-->
<string name="Passcode">Kyçje Kodkalimi</string>
<string name="ChangePasscode">Ndryshoni Kodkalimin</string>
<string name="ChangePasscodeInfo">Kur rregulloni një kodkalim shtesë, te faqja e bisedave do të shfaqet një ikonë dryni. Prekeni që të kyçet aplikacioni.\n\nShënim: nëse harroni kodkalimin, do t\ju duhet të fshini dhe ri-instaloni aplikacionin.</string>
<string name="PasscodePIN">PIN</string>
<string name="PasscodePassword">Fjalëkalim</string>
<string name="EnterCurrentPasscode">Jepni kodkalimin tuaj të tanishëm</string>
<string name="EnterNewFirstPasscode">Jepni një kodkalim</string>
<string name="EnterNewPasscode">Jepni kodkalimin tuaj të ri</string>
<string name="EnterYourPasscode">Jepni kodkalimin tuaj</string>
<string name="ReEnterYourPasscode">Rijepeni kodkalimin tuaj të ri</string>
<string name="PasscodeDoNotMatch">Kodkalimet nuk përputhen</string>
<string name="AutoLock">Vetëkyçe</string>
<string name="AutoLockInfo">Kërko kodkalim nëse largohet për njëfarë kohe.</string>
<string name="UnlockFingerprint">Shkyçe me shenja gishtash</string>
<string name="FingerprintInfo">Që të vazhdohet, konfirmoni shenja gishtash</string>
<string name="FingerprintNotRecognized">Shenja gishtash që nuk njihen. Riprovoni</string>
<!--photo gallery view-->
<string name="SaveToGallery">Ruaje te \"Galeri\"</string>
<string name="Of">%1$d nga %2$d gjithsej</string>
<string name="Gallery">Galeri</string>
<string name="AllPhotos">Krejt Fotot</string>
<string name="AllVideo">Krejt Videot</string>
<string name="NoPhotos">Ende pa foto</string>
<string name="NoVideo">Ende pa video</string>
<string name="CropImage">Qetheni figurën</string>
<string name="EditImage">Përpunoni figurën</string>
<string name="Enhance">Përmirësoje</string>
<string name="Highlights">Theksime</string>
<string name="Contrast">Kontrast</string>
<string name="Exposure">Ekspozim</string>
<string name="Warmth">Ngrohtësi</string>
<string name="Saturation">Ngopje</string>
<string name="Shadows">Hije</string>
<string name="Grain">Kokërrzim</string>
<string name="Sharpen">Mprehe</string>
<string name="Fade">Zbehe</string>
<string name="Tint">Ngjyrose</string>
<string name="TintShadows">Hije</string>
<string name="TintHighlights">Theksime</string>
<string name="Curves">Kurba</string>
<string name="CurvesAll">Krejt</string>
<string name="CurvesRed">E kuqe</string>
<string name="CurvesGreen">E gjelbër</string>
<string name="CurvesBlue">Blu</string>
<string name="Blur">Turbullim</string>
<string name="BlurOff">Off</string>
<string name="BlurLinear">Lineare</string>
<string name="BlurRadial">Radiale</string>
<string name="DiscardChanges">Të hidhen tej ndryshimet?</string>
<string name="ClearButton">Pastroje</string>
<string name="PickerPhotos">Foto</string>
<string name="PickerVideo">Video</string>
<!--privacy settings-->
<string name="PrivacySettings">Privatësi dhe siguri</string>
<string name="SecurityTitle">Siguri</string>
<!--edit video view-->
<string name="SendVideo">Dërgoni Video</string>
<!--button titles-->
<string name="Done">U bë</string>
<string name="Open">Hape</string>
<string name="Cancel">Anuloje</string>
<string name="Edit">Përpunoni</string>
<string name="Send">Dërgoje</string>
<string name="CopyToClipboard">Kopjoje në të papastër</string>
<string name="Delete">Fshije</string>
<string name="Forward">Përcille</string>
<string name="FromCamera">Prej kamerës</string>
<string name="FromGalley">Prej \"Galerie\"</string>
<string name="Set">Vëre</string>
<string name="OK">OK</string>
<string name="Crop">Qethe</string>
<!--messages-->
<string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Video</string>
<string name="AttachGif">GIF</string>
<string name="AttachContact">Kontakt</string>
<string name="AttachDocument">Kartelë</string>
<string name="AttachVoiceMessage">Mesazh zanor</string>
<string name="FromSelf">Unë</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">Asnjë aplikacion nga të instaluarit s\e hap dot llojin \'%1$s\' e kartelave, ju lutemi, që të vazhdohet, instaloni një të tillë.</string>
<string name="ContactAlreadyInGroup">Kontakti gjendet tashmë në këtë grup.</string>
<string name="ForwardMessagesTo">Përcillja mesazhet e përzgjedhur <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="SendMessagesTo">Të dërgohen mesazhet te <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="AreYouSureDeleteThisChat">Të fshihet kjo bisedë? S\do të shfaqet më te lista e bisedave, mesazhet e saj do të mbeten në shërbyes.</string>
<string name="AreYouSureBlockContact">Jeni i sigurt se doni ta bllokoni këtë kontakt?</string>
<string name="AreYouSureDeleteContact">Jeni i sigurt se doni ta fshini këtë kontakt?</string>
<!--permissions-->
<string name="PermissionContacts">Për t\ju lidhur me shokët tuaj nga cilado pajisje juaja, lypset hyrje te kontaktet.</string>
<string name="PermissionStorage">Për dërgim dhe ruajte fotosh, videosh, muzike dhe media të tjera, lypset hyrje te depozita.</string>
<string name="PermissionNoAudio">Për dërgim mesazhesh zanorë, lypset hyrje te mikrofoni.</string>
<string name="PermissionOpenSettings">Rregullime</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">Programi i shkëmbimit të mesazheve me <![CDATA[<b>publikun më të gjerë</b>]]> në botë.<![CDATA[<br/><b>I lirë</b>]]> dhe <![CDATA[<b>i pavarur</b>]]>.</string>
<string name="Intro2Headline">I pavarur</string>
<string name="Intro2Message"><![CDATA[<b>I pavarur</b>]]> nga kompjutera apo shërbime të huaja. Aplikacioni përdor vetëm shërbyesin tuaj të email-eve.</string>
<string name="Intro3Headline">I shpejtë</string>
<string name="Intro3Message"><![CDATA[<b>Dërgim mesazhesh</b>]]> brenda pak sekondash.<![CDATA[<br/>]]>Ndërfaqe e shpejtë.</string>
<string name="Intro4Headline">I fuqishëm</string>
<string name="Intro4Message">Biseda, figura, video, mesazhe audio, etj <![CDATA[<b>Pa kufi</b>]]>. I aftë për funksionim në shumë klientë njëherësh.</string>
<string name="Intro5Headline">I lirë</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> është i lirë, përgjithmonë.<![CDATA[<br/>]]>Me burim të hapët. Pa reklama. Pa pajtime. Pa kyçje brenda një platforme nga tregtues.</string>
<string name="Intro6Headline">I fshehtëzuar</string>
<string name="Intro6Message"><![CDATA[<b>I fshehtëzuar</b>]]> me krejt algoritmet e zakonshëm. Mesazhet mbeten në shërbyesit tuaj.</string>
<string name="Intro7Headline">I besueshëm</string>
<string name="IntroStartMessaging">Filloni të Shkëmbeni Mesazhe</string>
<!--plural-->
<plurals name="Members">
<item quantity="one">%d anëtar</item>
<item quantity="other">%d anëtarë</item>
</plurals>
<plurals name="Contacts">
<item quantity="one">%d kontakte</item>
<item quantity="other">%d kontakte</item>
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">%d anëtar dhe unë</item>
<item quantity="other">%d anëtarë dhe unë</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d mesazh i ri</item>
<item quantity="other">%d mesazhe të rinj</item>
</plurals>
<plurals name="messages">
<item quantity="one">%d mesazh</item>
<item quantity="other">%d mesazhe</item>
</plurals>
<plurals name="AreYouSureDeleteMessages">
<item quantity="one">Të fshihen %d mesazh? Do të fshihet edhe nga shërbyesi.</item>
<item quantity="other">Të fshihen %d mesazhe? Këta do të fshihen edhe nga shërbyesi.</item>
</plurals>
<plurals name="NewMessagesInChats">
<item quantity="one">%1$s në %2$d fjalosje</item>
<item quantity="other">%1$s në %2$d biseda</item>
</plurals>
<plurals name="Chats">
<item quantity="one">%d fjalosje</item>
<item quantity="other">%d biseda</item>
</plurals>
<plurals name="Minutes">
<item quantity="one">%d minutë</item>
<item quantity="other">%d minuta</item>
</plurals>
<plurals name="Hours">
<item quantity="one">%d orë</item>
<item quantity="other">%d orë</item>
</plurals>
<plurals name="Days">
<item quantity="one">%d ditë</item>
<item quantity="other">%d ditë</item>
</plurals>
<plurals name="Weeks">
<item quantity="one">%d javë</item>
<item quantity="other">%d javë</item>
</plurals>
<plurals name="Months">
<item quantity="one">%d muaj</item>
<item quantity="other">%d muaj</item>
</plurals>
<plurals name="MaxNotifications">
<item quantity="one">E shumta %1$d njoftime brenda %2$s</item>
<item quantity="other">E shumta %1$d njoftime brenda %2$s</item>
</plurals>
<!--date formatters-->
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yyyy</string>
<string name="chatDate">EEE, d MMMM</string>
<string name="chatFullDate">EEE, d MMMM, yyyy</string>
<string name="formatterWeek">EEE</string>
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s në %2$s</string>
<string name="AccountSettings">Rregullime llogarie</string>
<string name="MyAccount">Llogaria ime</string>
<string name="MyName">Emri im</string>
<string name="MyNameExplain">Emri juaj, siç u shfaqet marrësve. Në u lëntë i zbrazët, do të dërgohet vetëm adresa juaj email.</string>
<string name="Password">Fjalëkalim</string>
<string name="SmtpPassword">Fjalëkalim SMTP</string>
<string name="FromAbove">Nga sipër</string>
<string name="SmtpLoginname">Emër hyrjeje për SMTP</string>
<string name="SmtpPort">Portë SMTP</string>
<string name="Automatic">Automatike</string>
<string name="ImapServer">Shërbyes IMAP</string>
<string name="ImapLoginname">Emër hyrjeje për IMAP</string>
<string name="SmtpServer">Shërbyes SMTP</string>
<string name="ImapPort">Portë IMAP</string>
<string name="InboxHeadline">Të marrë</string>
<string name="OutboxHeadline">Të dërguar</string>
<string name="MyAccountExplain">Për furnizues të njohur shërbimesh email, rregullimet shtesë përcaktohen vetvetiu.</string>
<string name="MyAccountExplain2" >Ndonjëherë, <![CDATA[<b>]]>IMAP lypset të aktivizohet<![CDATA[</b>]]> te pjesa e dukshme e sistemit email web.\n\nNëse hasni probleme, këshillohuni me furnizuesin e email-it ose me shokë tuajt.</string>
<string name="AccountNotConfigured">Llogari e paformësuar</string>
<string name="AboutThisProgram">Mbi Delta Chat-in</string>
<string name="NotSet">E papërcaktuar</string>
<string name="NewChat">Bisedë e re</string>
<string name="Deaddrop">Kërkesa kontakti</string>
<string name="DeaddropInChatlist">Shfaq te listë bisedash kërkesa kontakti</string>
<string name="MuteAlways">Përherë pa zë</string>
<string name="AskStartChatWith">Bisedoni me <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="DeaddropHint">Prekni shigjetat përgjigje që të nisni të bisedoni.</string>
<string name="NotYetImplemented">Ky funksion s’është i passhëm ose është jo i plotë</string>
<string name="DefaultStatusText">Dërguar me Lajmëtarin tim Delta Chat: https://delta.chat</string>
<string name="Name" >Emër</string>
<string name="EmailAddress">Adresë email</string>
<string name="CannotDeleteContact">Sfshihen dot kontaktet në përdorim, në vend të kësaj bëni bllokim kontakti.</string>
<string name="BadEmailAddress">Adresë email e gabuar</string>
<string name="ContactCreated">Kontakti u krijua</string>
<string name="ViewProfile">Shihni profilin</string>
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Një sekondë …</string>
<string name="NoChatsHelp">Nisni të shkëmbeni mesazhe duke shtypur butonin \"Bisedë e re\" poshtë djathtas, ose prekni butonin \"Menu\" për më tepër mundësi.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> është i parrezik për përdorim në biznes, i përputhshëm dhe i bazuar në standarde.</string>
<string name="InviteMenuEntry">Dërgoni ftesa</string>
<string name="InviteText">Po përdor Delta Chat-in - %1$s - mund të dërgoni mesazh te %2$s</string>
<string name="AdvancedSettings">Rregullime të mëtejshme</string>
<string name="AskResetNotifications">Të kthehen te parazgjedhjet krejt rregullimet mbi njoftime dhe tinguj për faqen e tanishme, kontaktet dhe grupet?</string>
<string name="AttachFiles">Bashkëngjitni kartela</string>
<string name="ErrGroupNameEmpty">Ju lutemi, jepni një emër për grupin.</string>
<string name="MsgNewGroupDraftHint">Hartoni mesazhin e parë, duke u lejuar të tjerëve të përgjigjen brenda këtij grupi.\n\n• S\ka problem që Delta Chat-in s\e përdorin tërë anëtarët.\n\n• Dërgimi i mesazhit të parë mund të dojë pak kohë.</string>
<string name="MsgNewGroupDraft">Tungjatjeta, sapo krijova grupin \"%1$s\" për ne.</string>
<string name="MsgGroupNameChanged">Emri i grupit u ndryshua nga \"%1$s\" në \"%2$s\".</string>
<string name="MsgGroupImageChanged">Figura e grupit u ndryshua.</string>
<string name="MsgMemberAddedToGroup">U shtua anëtari %1$s.</string>
<string name="MsgMemberRemovedFromToGroup">U hoq anëtari %1$s.</string>
<string name="AskAddMemberToGroup">Të shtohet <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> te grupi?</string>
<string name="AskRemoveMemberFromGroup">Të hiqet <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> nga grupi?</string>
<string name="ErrSelfNotInGroup">Që të kryeni këtë veprim, duhet të jeni një anëtar i grupit.</string>
<string name="MsgGroupLeft">Grupi u la.</string>
<string name="NoMessagesHint">Dërgoje mesazhin te <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• S\ka problem nëse <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> nuk përdor Delta Chat-in.\n\n• Dërgimi i mesazhit të parë mund të dojë pak kohë.</string>
<string name="SendNRcvReadReceipts">Merrni dhe dërgoni fatura kthimesh</string>
<string name="PreferE2EEncryption">Parapëlqe fshehtëzim skaj-më-skaj</string>
<string name="E2EManagePrivateKeys">Administroni kyçe privatë</string>
<string name="E2ECompareKeys">Krahasoni kyçe</string>
<string name="ForwardToTitle">Përcilleni për …</string>
<string name="SelectContact">Zgjidhni një kontakt</string>
<string name="DoneHint">U bë.</string>
<string name="FileNotFound">Su gjet dot %1$s.</string>
<string name="Error">Gabim: %1$s</string>
<string name="NoNetwork">Rrjet i pakapshëm.</string>
<string name="Audio">Audio</string>
<string name="PleaseCutVideoToMaxSize">Ju lutemi, shkurtojeni videon në një madhësi më të vogël se %1$s.</string>
<string name="PermNotificationTitle">I lidhur te %1$s</string>
<string name="PermNotificationText">Po pritet për mesazhe…</string>
<string name="SettingsFor">Rregullime për %1$s</string>
<string name="AutoplayGifs">Vetëluaji GIF-et</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Mesazh i fshehtëzuar</string>
<string name="Encryption">Fshehtëzim</string>
<string name="EncrinfoE2E">U aktivizua fshehtëzimi skaj-më-skaj.</string>
<string name="EncrinfoE2EExplain">Nëse te pajisja tjetër përputhen krejt shenjat e gishtave, lidhja është e parrezik.</string>
<string name="EncrinfoTransport">Fshehtëzim transporti të paktën deri te shërbyesi im.</string>
<string name="EncrinfoNone">Pa fshehtëzim te shërbyesi im.</string>
<string name="EncrinfoNoE2EExplain">Fshehtëzimi skaj-më-skaj do të përdoret kur edhe nga marrësi përdoret Delta Chat ose tjetër aplikacion Autocrypt.</string>
<string name="EncrinfoFingerprints">Shenja gishtash</string>
<string name="Backup">Kopjeruajtje</string>
<string name="ImportBackupExplain2">Që të importohet një kopjeruajtje, kopjojeni kopjeruajtjen te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> dhe ri-instaloni aplikacionin.</string>
<string name="ReadReceiptMailBody">Kjo është një faturë kthimi për mesazhin \"%1$s\".\n\nKjo faturë kthimi dëshmon vetëm se mesazhi u shfaq te pajisja e marrësit. S\ka garanci që marrësi ta ketë lexuar lëndën e mesazhit.</string>
<string name="ReadReceipt">Faturë kthimi</string>
<string name="NameAndStatus">Emër dhe gjendje</string>
<string name="MyStatus">Gjendja ime</string>
<string name="MyStatusExplain">Veç vendesh të tjera, gjendja tregohet edhe te fundi i email-eve.</string>
<string name="MsgGroupImageDeleted">Figura e grupit u fshi.</string>
<string name="AskDeleteGroupImage">Jeni i sigurt se doni të fshihet figura e grupit?\n\nKjo do të prekë krejt pajisjet e krejt anëtarëve të grupit.</string>
<string name="ExportImportHeader">Eksportim dhe importim</string>
<string name="ImportExportExplain">Kartelat e eksportuara do të përmbajnë kyçe private! Mbajini në një vend të parrezik, ose fshijini sa më shpejt të jetë e mundur.</string>
<string name="EnterPasswordToContinue">Që të vazhdohet, jepni fjalëkalimin për %1$s:</string>
<string name="IncorrectPassword">Fjalëkalim i pasaktë.</string>
<string name="ImportBackupAsk">U gjet kopjeruajtje te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nDoni të importohet dhe të përdoren krejt të dhënat dhe rregullimet prej saj?</string>
<string name="ImportBackup">Importoje kopjeruajtjen</string>
<string name="NoBackupFound">S\u gjetën kopjeruajtje.\n\nKopjojeni kopjeruajtjen te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> dhe riprovoni. Ose, shtypni \"Nisni të shkëmbeni mesazhe\" që të ecni sipas procesit normal të rregullimit.</string>
<string name="FilesSuccessfullyExported">Kartelat u eksportuan te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
<string name="ExportBackup">Eksporto kopjeruajtje</string>
<string name="ExportPrivateKeys">Eksporto kyçe private</string>
<string name="ImportPrivateKeys">Importo kyçe private</string>
<string name="ImportPrivateKeysAsk2">Të importohen kyçe privatë prej <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Kyçet private ekzistuese nuk do të fshihen\n\n• Si kyç i ri parazgjedhje do të përdoret kyçi i fundit i importuar</string>
<string name="NoRecentEmoji">Këtu do të shfaqen emoji-t e përdorur së fundi.</string>
<string name="E2eeOffBecauseOfUser">Për aktivizim të fshehtëzimit skaj-më-skaj, i vini shenjë mundësisë përkatëse te rregullimet tuaja.</string>
<string name="E2eeOffBecauseOfRecipient">Fshehtëzimi skaj-më-skaj do të përdoret nëse e aktivizon edhe pala tjetër.</string>
<string name="NotNow">Jo tani</string>
<string name="ArchiveChat">Arkivoje bisedën</string>
<string name="UnarchiveChat">Çarkivoje bisedën</string>
<string name="ArchivedChats">Biseda të arkivuara</string>
<string name="Archived">E arkivuar</string>
<string name="LeaveGroup">Braktiseni grupin</string>
<string name="AskLeaveGroup">Jeni i sigurt se doni ta braktisni grupin?</string>
<string name="Never">Kurrë</string>
<string name="AutocryptKeyTransferInitiate">Përgatit Transferim Kyçi Autocrypt</string>
<string name="AutocryptKeyTransfer">Transferim Kyçi Autocrypt</string>
<string name="AutocryptKeyTransferMsgBeforeSend"><![CDATA[<i>]]>Transferimi i Kyçit Autocrypt<![CDATA[</i>]]> lyp që klienti i postës në pajisjen tjetër të mund të përdorë protokolle Autocrypt.\n\nMandej mund ti dërgoni vetes kyçin tuaj të fshehtë. Kyçi do të fshehtëzohet me një kod rregullimi që shfaqet këtu dhe duhet të shtypet te pajisja tjetër.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Kyçi juaj u dërgua te ju. Kaloni te pajisja tjetër dhe hapni mesazhin e rregullimit. Do tju kërkohet një kod rregullimi. Shtypni këto shifra:\n\n%1$s\n\nPasi të keni mbaruar, pajisja tjetër e juaja do të jetë gati të përdorë Autocrypt-in.</string>
<string name="AutocryptSetupMessageSubject">Mesazh Rregullimi Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Ky është Mesazhi i Rregullimit të Autocrypt-it i përdorur për të transferuar kyçin tuaj nga një klient në tjetrin.\n\nQë të shfshehtëzoni dhe përdorni kyçin tuaj, hapeni mesazhin në një klient të aftë për Autocrypt dhe jepni kodin e rregullimit të shfaqur te pajisja që e prodhoi.</string>
<string name="AutocryptSetupMessageTapBody">Ky është Mesazhi i Rregullimit të Autocrypt-it i përdorur për të transferuar kyçin tuaj nga një klient në tjetrin.\n\nQë të shfshehtëzoni dhe përdorni kyçin tuaj, prekeni këtë mesazh.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Ju lutemi, jepni kodin e rregullimit që është shfaqur te pajisja tjetër.</string>
<string name="AutocryptKeyTransferBadCode">Kod rregullimi i gabuar. Ju lutemi, riprovoni.\n\nNëse se mbani mend kodin e rregullimit, thjesht rinisni transferimin e kyçit që nga pajisja tjetër.</string>
<string name="AutocryptKeyTransferSucceeded">Kyçi u transferua me sukses. Tani kjo pajisje është gati të përdorë Autocrypt-in me të njëjtin kyç si pajisja tjetër.</string>
<string name="Retry">Riprovo</string>
<string name="SelfTalkSubtitle">Mesazhe që i kam dërguar vetes</string>
</resources>
+147 -10
View File
@@ -16,33 +16,47 @@
<string name="MuteFor">%1$s için sessiz</string>
<string name="UnmuteNotifications">Sessizden çıkarma</string>
<string name="Draft">Taslak</string>
<!--audio view-->
<string name="NoAudio">Aygıtınızın müzik kitaplığına eklenen dosyalar burada görünecek.</string>
<string name="AttachMusic">Müzik</string>
<!--documents view-->
<string name="SelectFile">Dosya Seçin</string>
<string name="FreeOfTotal">%2$sde %1$s boş</string>
<string name="ErrorHint">Bilinmeyen hata</string>
<string name="AccessError">Erişim hatası</string>
<string name="NoFiles">Henüz dosya yok ...</string>
<string name="NotMounted">Depo bellek bağlanmadı</string>
<string name="UsbActive">USB aktarımı etkin</string>
<string name="UsbActive">USB aktarımı devam ediyor</string>
<string name="InternalStorage">Dahili Depolama</string>
<string name="ExternalStorage">Harici Depolama</string>
<string name="SystemRoot">Sistem Root</string>
<string name="SdCard">SD Kart</string>
<string name="Folder">Klasör</string>
<string name="GalleryInfo">Sıkıştırılmamış resimleri göndermek için</string>
<!--chat view-->
<string name="ChatGallery">Galeri</string>
<string name="ChatCamera">Kamera</string>
<string name="NoMessages">İleti yok.</string>
<string name="ForwardedMessage">Yönlendirilmiş ileti</string>
<string name="From">Kimden</string>
<string name="NoRecent">son kullanılan yok</string>
<string name="TypeMessage">İleti</string>
<string name="SlideToCancel">İPTAL ETMEK İÇİN KAYDIR</string>
<string name="SaveToDownloads">İndirilenlere kaydet</string>
<string name="SaveToMusic">Müziğe kaydet</string>
<string name="Share">Paylaş</string>
<string name="SendItems">%1$sgönder</string>
<string name="ClearRecentEmoji">En son duygu simgeleri temizlensin mi?</string>
<string name="AddShortcut">Ana ekrana gereç ekleme</string>
<string name="ShortcutAdded">Gereç ana ekrana eklendi</string>
<!--notification-->
<string name="Reply">Yanıtlama</string>
<string name="Reply">Yanıtla</string>
<string name="ReplyToGroup">%1$se yanıt ver</string>
<string name="ReplyToContact">%1$se yanıt ver</string>
<!--contacts view-->
<string name="NoContacts">Henüz kişi yok.</string>
<!--group create view-->
<string name="SendMessageTo">...ileti gönder</string>
<string name="EnterGroupNamePlaceholder">Grup adı girin</string>
<!--group info view-->
<string name="AddMember">Üye ekle</string>
@@ -69,12 +83,15 @@
<string name="Default">Öntanımlı</string>
<string name="OnlyIfSilent">Sadece sessizse</string>
<string name="ChatBackground">Söyleşi arkaplanı</string>
<string name="SendByEnter">Enter tuşu ile gönder</string>
<string name="Help">Yardım</string>
<string name="Enabled"></string>
<string name="Disabled">Kapat</string>
<string name="LedColor">LED rengi</string>
<string name="BadgeNumber">Sayıyı akılda tutmak için mümkünse simge kullanın</string>
<string name="Short">Kısa</string>
<string name="Long">Uzun</string>
<string name="RaiseToSpeak">Konuşmayı artır</string>
<string name="EditName">Adı düzenle</string>
<string name="NotificationsPriority">Görünüm</string>
<string name="NotificationsPriorityDefault">Normal öncelik</string>
@@ -82,8 +99,13 @@
<string name="NotificationsPriorityMax">En yüksek öncelik</string>
<string name="RepeatNotifications">Bildirimleri yinele</string>
<string name="NotificationsOther">Diğer</string>
<string name="InChatSound">söyleşi içi sesler</string>
<string name="SmartNotifications">Sınır bildirimleri</string>
<string name="SmartNotificationsSoundAtMost">En çok</string>
<string name="SmartNotificationsTimes">kere</string>
<string name="SmartNotificationsWithin">içerisinde</string>
<string name="DirectShare">Doğrudan paylaşım</string>
<string name="DirectShareInfo">Son söyleşileri paylaşma menüsünde göster</string>
<!--cache view-->
<string name="CacheSettings">Depolama</string>
<string name="KeepMedia">Ortamı tut</string>
@@ -91,6 +113,7 @@
<!--passcode view-->
<string name="Passcode">Şifre Kilidi</string>
<string name="ChangePasscode">Şifre Değiştir</string>
<string name="ChangePasscodeInfo">Ek bir şifre koyduğunuzda söyleşi sayfasında bir kilit simgesi görünür. Uygulamayı kilitlemek için dokunun.\n\nNote: Eğer şifreyi unutursanız, uygulamayı silip tekrar yüklemeniz gerekir.</string>
<string name="PasscodePIN">PİN</string>
<string name="PasscodePassword">Parola</string>
<string name="EnterCurrentPasscode">Güncel şifrenizi girin</string>
@@ -100,11 +123,13 @@
<string name="ReEnterYourPasscode">Yeni şifrenizi tekrar girin</string>
<string name="PasscodeDoNotMatch">Şifreleriniz eşleşmiyor</string>
<string name="AutoLock">Otomatik kilit</string>
<string name="UnlockFingerprint">Parmak izi il şifreyi aç</string>
<string name="AutoLockInfo">Bir süre uzak kalınırsa şifre gerekir.</string>
<string name="UnlockFingerprint">Parmak izi ile şifreyi aç</string>
<string name="FingerprintInfo">Devam etmek için parmak izini onayla</string>
<string name="FingerprintNotRecognized">Parmak izi tanınmadı. Tekrar deneyin</string>
<!--photo gallery view-->
<string name="SaveToGallery">Galeriye kaydet</string>
<string name="Of">%1$d/%2$d</string>
<string name="Gallery">Galeri</string>
<string name="AllPhotos">Tüm Fotograflar</string>
<string name="AllVideo">Tüm Vidyolar</string>
@@ -120,10 +145,12 @@
<string name="Saturation">Renk doygunluğu</string>
<string name="Vignette">Süsleme</string>
<string name="Shadows">Gölgeler</string>
<string name="Grain">Gren</string>
<string name="Sharpen">Keskinleştirme</string>
<string name="Fade">Soldurma</string>
<string name="TintShadows">GÖLGELER</string>
<string name="TintHighlights">VURGULAMALAR</string>
<string name="Tint">Renk tonu</string>
<string name="TintShadows">Gölgeler</string>
<string name="TintHighlights">Vurgulamalar</string>
<string name="Curves">Eğriler</string>
<string name="CurvesAll">HEPSİ</string>
<string name="CurvesRed">KIRMIZI</string>
@@ -150,6 +177,7 @@
<string name="Send">Gönder</string>
<string name="CopyToClipboard">Panoya kopyala</string>
<string name="Delete">Sil</string>
<string name="Forward">İlet</string>
<string name="FromCamera">Kameradan</string>
<string name="FromGalley">Galeriden</string>
<string name="OK">TAMAM</string>
@@ -158,17 +186,47 @@
<string name="AttachPhoto">Fotograf</string>
<string name="AttachVideo">Vidyo</string>
<string name="AttachGif">GİF</string>
<string name="AttachContact">Kişiler</string>
<string name="AttachDocument">Dosya</string>
<string name="AttachVoiceMessage">Sesli ileti</string>
<string name="FromSelf">Ben</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">\'%1$s\' dosya türünü açacak kurulu bir uygulama yok, bir tane kurun ve devam edin.</string>
<string name="ContactAlreadyInGroup">Kişi zaten bu grupta.</string>
<string name="ForwardMessagesTo">Seçili iletiler <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> a iletilsin mi?</string>
<string name="AreYouSureDeleteThisChat">Bu söyleşiyi silinsin mi? Söyleşi listesinde artık gösterilmeyecek, iletileri sunucuda kalacak.</string>
<string name="AreYouSureBlockContact">Bu kişiyi engellemek istediğinizden emin misiniz?</string>
<string name="AreYouSureDeleteContact">Bu kişiyi silmek istediğizden emin misiniz?</string>
<string name="PermissionOpenSettings">Ayarları değiştir</string>
<string name="PermissionStorage">Fotoğraf, video, müzik ve diğer medyayı kaydetmek ve göndermek için depolama erişimi gerekiyor.</string>
<string name="PermissionNoAudio">Sesli ileti göndermek için mikrofon erişimi gerekiyor.</string>
<string name="PermissionOpenSettings">Ayarlar</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro2Headline">Bağımsız</string>
<string name="Intro2Message"><![CDATA[<b>Delta Chat sunucusu yok.</b>]]> Uygulama yalnızca e-posta sunucunuzu kullanıyor.</string>
<string name="Intro3Headline">Hızlı</string>
<string name="Intro4Headline">Muhteşem</string>
<string name="Intro6Headline">Güvenli</string>
<string name="Intro4Message"><![CDATA[<b>Sınırsız</b>]]> söyleşiler, görüntüler, vidyolar, sesli iletiler ve daha fazlası. Çoklu istemci kapasiteli. </string>
<string name="Intro5Headline">Özgür</string>
<string name="Intro6Headline">Şifreli</string>
<string name="Intro7Headline">Güvenilir</string>
<string name="IntroStartMessaging">İleti Alışverişini Başlat</string>
<!--plural-->
<plurals name="Members">
<item quantity="one">%düye</item>
<item quantity="other">%d üye</item>
</plurals>
<plurals name="Contacts">
<item quantity="one">%d kişi</item>
<item quantity="other">%d kişi</item>
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">%d üye ve ben</item>
<item quantity="other">%d üye ve ben</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d yeni ileti</item>
<item quantity="other">%dyeni ileti</item>
@@ -177,6 +235,10 @@
<item quantity="one">%dileti</item>
<item quantity="other">%dileti</item>
</plurals>
<plurals name="AreYouSureDeleteMessages">
<item quantity="one">%d ileti silinsin mi? Bu sunucudan da silinecek.</item>
<item quantity="other">%d iletiler silinsin mi? Bunlar sunucudan da silinecek.</item>
</plurals>
<plurals name="Chats">
<item quantity="one">%d söyleşi</item>
<item quantity="other">%dsöyleşi</item>
@@ -189,11 +251,25 @@
<item quantity="one">%d saat</item>
<item quantity="other">%d saat</item>
</plurals>
<string name="formatterYear">dd.MM.yyyy</string>
<string name="formatterDay24H">HH:mm</string>
<plurals name="Days">
<item quantity="one">%d gün</item>
<item quantity="other">%d gün</item>
</plurals>
<plurals name="Weeks">
<item quantity="one">%d hafta</item>
<item quantity="other">%d hafta</item>
</plurals>
<plurals name="Months">
<item quantity="one">%d ay</item>
<item quantity="other">%d ay</item>
</plurals>
<string name="formatterYear">gg.AA.yyyy</string>
<string name="formatterDay24H">SS:dd</string>
<string name="formatDateAtTime">%1$s de %2$s</string>
<string name="AccountSettings">Hesap ayarları</string>
<string name="MyAccount">Hesabım</string>
<string name="MyName">Adım</string>
<string name="MyNameExplain">Adınız karşıya böyle gösterilecek. Boş bırakırsanız, yalnızca eposta adresiniz gönderilecek.</string>
<string name="Password">Parola</string>
<string name="SmtpPassword">STMP parolası</string>
<string name="FromAbove">Yukarıdan</string>
@@ -206,34 +282,95 @@
<string name="ImapPort">İMAP bağlanma noktası</string>
<string name="InboxHeadline">Gelen kutusu</string>
<string name="OutboxHeadline">Gönderilenler</string>
<string name="MyAccountExplain">Bilinen e-posta sağlayıcıları için ek ayarlar otomatik olarak algılanır.</string>
<string name="AccountNotConfigured">Hesap düzenlenmedi</string>
<string name="AboutThisProgram">Delta Chat Hakkında</string>
<string name="NotSet">Ayarlanmadı</string>
<string name="NewChat">Yeni söyleşi</string>
<string name="Deaddrop">İletişim istekleri</string>
<string name="DeaddropInChatlist">Söyleşi listesindeki kişi isteklerini göster</string>
<string name="MuteAlways">Sürekli sessiz</string>
<string name="AskStartChatWith"><![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ile söyleşi?</string>
<string name="DeaddropHint">Söyleşmeye başlamak için yanıt oklarına dokunun.</string>
<string name="NotYetImplemented">Bu işlev mevcut değil veya eksik.</string>
<string name="DefaultStatusText">Delta Chat Messengerim ile göderildi: https://delta.chat</string>
<string name="Name" >Ad</string>
<string name="EmailAddress">E-posta adresi</string>
<string name="CannotDeleteContact">Kullanımdaki kişiler silinemez, bunun yerine kişiyi engelleyin.</string>
<string name="BadEmailAddress">Hatalı eposta adresi.</string>
<string name="ContactCreated">Kişi oluşturuldu.</string>
<string name="ViewProfile">Profil görüntüsü</string>
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Bir dakika ...</string>
<string name="NoChatsHelp">Sayfanın sağ altındaki \'\'Yeni söyleşi\'\' düğmesine basarak başlayın ya da daha fazla seçenek için \'\'Menü\'\' düğmesine dokunun.</string>
<string name="InviteMenuEntry">Davetiye gönderin</string>
<string name="InviteText">Şimdi Delta Chat kullanıyorum - %1$s- bana yazabilirsin%2$s</string>
<string name="AdvancedSettings">Gelişmiş ayarlar</string>
<string name="AskResetNotifications">Geçerli sayfanın grupların ve kişilerin bütün bildirim ayarları ve sesleri sıfırlansın mı?</string>
<string name="AttachFiles">Dosyaları iliştir</string>
<string name="ErrGroupNameEmpty">Grup için bir ad girin</string>
<string name="MsgGroupNameChanged">Grup adı \"%1$s\" den \"%2$s\"ye değişti.</string>
<string name="MsgGroupImageChanged">Grup resmi değişti.</string>
<string name="MsgMemberAddedToGroup">%1$s üye eklendi</string>
<string name="MsgMemberRemovedFromToGroup">%1$s üye silindi.</string>
<string name="AskAddMemberToGroup">Gruba <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> eklensin mi?</string>
<string name="AskRemoveMemberFromGroup">Gruptan <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> kaldırılsın mı?</string>
<string name="ErrSelfNotInGroup">Bu işlemi gerçekleştirmek için grubun üyesi olmalısınız.</string>
<string name="MsgGroupLeft">Grup ayrıldı.</string>
<string name="SendNRcvReadReceipts">İletim raporlarını al ve gönder</string>
<string name="PreferE2EEncryption">Uçtan uca şifrelemeyi yeğle</string>
<string name="E2EManagePrivateKeys">Özel anahtarları yönet</string>
<string name="E2ECompareKeys">Anahtarları karşılaştır</string>
<string name="ForwardToTitle">...ya ilet</string>
<string name="SelectContact">Bir kişi seçin</string>
<string name="DoneHint">Tamam.</string>
<string name="FileNotFound">%1$sbulunamadı.</string>
<string name="Error">Hata: %1$s</string>
<string name="NoNetwork">Ağ kullanılamıyor.</string>
<string name="Audio">Ses</string>
<string name="PleaseCutVideoToMaxSize">Lütfen vidyoyu %1$s\'den daha küçük boyutta kesin.</string>
<string name="PermNotificationTitle">%1$s\'e bağlandı</string>
<string name="PermNotificationText">İletiler bekliyor ...</string>
<string name="SettingsFor">%1$siçin ayarlar</string>
<string name="AutoplayGifs">GİFleri otomatik oynat</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Şifrelenmiş ileti</string>
<string name="Encryption">Şifreleme</string>
<string name="EncrinfoE2E">Uçtan uca şifreleme etkin</string>
<string name="EncrinfoE2EExplain">Tüm parmak izleri diğer cihazla eşleşiyorsa, bağlantı güvenlidir.</string>
<string name="EncrinfoTransport">En azından sunucuma kadar şifreli taşıma.</string>
<string name="EncrinfoNone">Sunucuma şifreleme yok.</string>
<string name="EncrinfoNoE2EExplain">Alıcı tarafından Delta Chat veya başka bir Otomatik şifreleme uygulaması kullanıldığında uçtan uca şifreleme uygulanacaktır.</string>
<string name="EncrinfoFingerprints">Parmak izleri</string>
<string name="Backup">Yedekleme</string>
<string name="ReadReceipt">İletim raporu</string>
<string name="NameAndStatus">Ad ve durum</string>
<string name="MyStatus">Durumum</string>
<string name="MsgGroupImageDeleted">Grup resmi silindi</string>
<string name="AskDeleteGroupImage">Grup resmini silmek istediğinizden emin misiniz?\n\nBu tüm grup üyelerinin aygıtlarını etkileyecek.</string>
<string name="ExportImportHeader">Dışa aktarım ve içe aktarım</string>
<string name="ImportExportExplain">Dışa aktarılan dosyalar gizli anahtarları içerecektir! Onları güvenli bir yerde saklayın veya mümkün olan en kısa sürede silin.</string>
<string name="IncorrectPassword">Geçersiz parola</string>
</resources>
<string name="ImportBackup">Yedeklemeyi içe aktar</string>
<string name="ExportBackup">Yedeklemeyi dışa aktar</string>
<string name="ExportPrivateKeys">Özel anahtarları dışa aktar</string>
<string name="ImportPrivateKeys">Özel anahtarları içe aktar</string>
<string name="NoRecentEmoji">Son kullanılan duygu simgeleri burada gösterilecek.</string>
<string name="E2eeOffBecauseOfUser">Uçtan uca şifrelemeyi etkinleştirmek için, ayarlarınızdaki ilgili seçeneği işaretleyin.</string>
<string name="E2eeOffBecauseOfRecipient">Karşı tarafın da ayarı etkinleştirmesi durumunda uçtan uca şifreleme uygulanacaktır.</string>
<string name="NotNow">Şimdi değil</string>
<string name="ArchiveChat">Söyleşiyi arşivle</string>
<string name="UnarchiveChat">Söyleşiyi arşivden kaldır</string>
<string name="ArchivedChats">Arşivlenmiş söyleşiler</string>
<string name="Archived">Arşivlenmiş</string>
<string name="LeaveGroup">Gruptan ayrıl</string>
<string name="AskLeaveGroup">Bu gruptan ayrılmak istediğinize emin misiniz?</string>
<string name="Never">Asla</string>
<string name="AutocryptKeyTransferInitiate">Autocrypt anahtar aktarımını başlat</string>
<string name="AutocryptKeyTransfer">Autocrypt Anahtar Aktarımı</string>
<string name="AutocryptKeyTransferMsgAfterSend">Anahtarınız kendinize gönderildi. Diğer aygıta geçin ve kurulum iletisini açın. Sizden bir kurulum şifresi girmeniz istenecektir. İsteğe aşağıdaki rakamları yazın:\n\n%1$s\n\nİşiniz bittiğinde, diğer aygıtınız Autocrypt\'i kullanmaya hazır hale gelecektir.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt Kurulum İletisi</string>
<string name="Retry">Yeniden dene</string>
<string name="SelfTalkSubtitle">Kendime gönderdiğim iletiler</string>
</resources>
@@ -412,4 +412,14 @@
<string name="ImportPrivateKeys">Імпортувати таємні ключі</string>
<string name="ImportPrivateKeysAsk2">Імпортувати таємні ключі з <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n•
Чинні таємні ключі не видалені\n\n• Найостанніший імпортований ключ буде використано як новий усталений ключ</string>
<string name="NoRecentEmoji">Емоджі, які використовувались недавно, будуть зображені тут.</string>
<string name="NotNow">Не зараз</string>
<string name="ArchiveChat">Додати розмову до архіву</string>
<string name="UnarchiveChat">Витягти розмову з архіву</string>
<string name="ArchivedChats">Розмови, що додані до архіву</string>
<string name="Archived">Заархівлено</string>
<string name="LeaveGroup">Полишити спільноту</string>
<string name="AskLeaveGroup">Чи ви певні, що хочете полишити спільноту?</string>
<string name="Never">Ніколи</string>
<string name="Retry">Спробувати ще раз</string>
</resources>
+25 -13
View File
@@ -42,8 +42,8 @@
<string name="NoRecent">No recent</string>
<string name="TypeMessage">Message</string>
<string name="SlideToCancel">Slide to cancel</string>
<string name="SaveToDownloads">Save to \"Downloads"\</string>
<string name="SaveToMusic">Save to "\Music"\</string>
<string name="SaveToDownloads">Save to \"Downloads\"</string>
<string name="SaveToMusic">Save to \"Music\"</string>
<string name="Share">Share</string>
<string name="SendItems">Send %1$s</string>
<string name="ClearRecentEmoji">Clear recent emoji?</string>
@@ -83,7 +83,7 @@
<string name="Default">Default</string>
<string name="OnlyIfSilent">Only when silent</string>
<string name="ChatBackground">Chat background</string>
<string name="SendByEnter">Send with \"⏎\"</string>
<string name="SendByEnter">Send with Enter key</string>
<string name="Help">Help</string>
<string name="Enabled">On</string>
<string name="Disabled">Off</string>
@@ -208,13 +208,13 @@
<string name="PermissionOpenSettings">Settings</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">The messenger with the <![CDATA[<b>broadest audience</b>]]> in the world.<![CDATA[<br/><b>Free</b>]]> and <![CDATA[<b>independent</b>]]>.</string>
<string name="Intro1Message">The messenger with the <![CDATA[<b>broadest audience</b>]]> in the world. <![CDATA[<b>Free</b>]]> and <![CDATA[<b>independent</b>]]>.</string>
<string name="Intro2Headline">Independent</string>
<string name="Intro2Message"><![CDATA[<b>Independent</b>]]> of foreign computers or services. The app only uses your email-server.</string>
<string name="Intro2Message"><![CDATA[<b>There is no Delta Chat server.</b>]]> The app only uses your email server.</string>
<string name="Intro3Headline">Fast</string>
<string name="Intro3Message"><![CDATA[<b>Push-messages</b>]]> in seconds.<![CDATA[<br/>]]>Rapid interface.</string>
<string name="Intro3Message"><![CDATA[<b>Push messages</b>]]> in seconds.<![CDATA[<br/>]]>Rapid interface.</string>
<string name="Intro4Headline">Powerful</string>
<string name="Intro4Message"><![CDATA[<b>Unlimited</b>]]> chats, images, videos, audio messages and more. Multi-client capable.</string>
@@ -339,7 +339,7 @@
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">One moment …</string>
<string name="NoChatsHelp">Start messaging by pressing the \"New chat"\ button in the bottom right, or tap the \"Menu"\ button for more options.</string>
<string name="NoChatsHelp">Start messaging by pressing the \"New chat\" button in the bottom right, or tap the \"Menu\" button for more options.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> is safe for business use, compatible and standards-based.</string>
<string name="InviteMenuEntry">Send invitations</string>
<string name="InviteText">I\'m using Delta Chat messenger now - %1$s - you can text me at %2$s</string>
@@ -360,7 +360,7 @@
<string name="NoMessagesHint">Send message to <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• It is okay if <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> does not use Delta Chat.\n\n• Delivering the first message may take a while.</string>
<string name="SendNRcvReadReceipts">Receive and send return receipts</string>
<string name="PreferE2EEncryption">Prefer end-to-end encryption</string>
<string name="E2EManagePrivateKeys">Manage private keys</string>
<string name="E2EManagePrivateKeys">Manage secret keys</string>
<string name="E2ECompareKeys">Compare keys</string>
<string name="ForwardToTitle">Forward to …</string>
<string name="SelectContact">Choose a contact</string>
@@ -393,7 +393,7 @@
<string name="MsgGroupImageDeleted">Group image deleted.</string>
<string name="AskDeleteGroupImage">Are you sure to delete the group image?\n\nThis will affect all devices of all group members.</string>
<string name="ExportImportHeader">Export and import</string>
<string name="ImportExportExplain">Exported files will contain private keys! Keep them in a safe place or delete them as soon as possible.</string>
<string name="ImportExportExplain">Exported files will contain secret keys! Keep them in a safe place or delete them as soon as possible.</string>
<string name="EnterPasswordToContinue">Enter the password for %1$s to continue:</string>
<string name="IncorrectPassword">Incorrect password.</string>
<string name="ImportBackupAsk">Backup found at <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nDo you want to import and use all data and settings from it?</string>
@@ -401,12 +401,12 @@
<string name="NoBackupFound">No backups found.\n\nCopy the backup to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> and try again. Alternatively, press \"Start messaging\" to go with the normal setup process.</string>
<string name="FilesSuccessfullyExported">Files exported to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
<string name="ExportBackup">Export backup</string>
<string name="ExportPrivateKeys">Export private keys</string>
<string name="ImportPrivateKeys">Import private keys</string>
<string name="ImportPrivateKeysAsk2">Import private keys from <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Existing private keys will not be deleted\n\n• The last imported key will be used as the new default key</string>
<string name="ExportPrivateKeys">Export secret keys</string>
<string name="ImportPrivateKeys">Import secret keys</string>
<string name="ImportPrivateKeysAsk2">Import secret keys from <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Existing secret keys will not be deleted\n\n• The last imported key will be used as the new default key</string>
<string name="NoRecentEmoji">Recently used emoji will be shown here.</string>
<string name="E2eeOffBecauseOfUser">To enable end-to-end-encryption, check the corresponding option in your settings.</string>
<string name="E2eeOffBecauseOfRecipient">>End-to-end encryption will be employed if the other party enables the setting too.</string>
<string name="E2eeOffBecauseOfRecipient">End-to-end encryption will be employed if the other party enables the setting too.</string>
<string name="NotNow">Not now</string>
<string name="ArchiveChat">Archive chat</string>
<string name="UnarchiveChat">Unarchive chat</string>
@@ -415,4 +415,16 @@
<string name="LeaveGroup">Leave group</string>
<string name="AskLeaveGroup">Are you sure you want to leave this group?</string>
<string name="Never">Never</string>
<string name="AutocryptKeyTransferInitiate">Initiate Autocrypt Key Transfer</string>
<string name="AutocryptKeyTransfer">Autocrypt Key Transfer</string>
<string name="AutocryptKeyTransferMsgBeforeSend">The <![CDATA[<i>]]>Autocrypt Key Transfer<![CDATA[</i>]]> requires that the mail client on the other device is Autocrypt-compliant.\n\nYou can then send your secret key to yourself. The key will be encrypted by a setup code which is displayed here and must be typed on the other device.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Your key has been sent to yourself. Switch to the other device and open the setup message. You should be prompted for a setup code. Type the following digits into the prompt:\n\n%1$s\n\nOnce you\'re done, your other device will be ready to use Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt Setup Message</string>
<string name="AutocryptSetupMessageGeneralBody">This is the Autocrypt Setup Message used to transfer your key between clients.\n\nTo decrypt and use your key, open the message in an Autocrypt-compliant client and enter the setup code presented on the generating device.</string>
<string name="AutocryptSetupMessageTapBody">This is the Autocrypt Setup Message used to transfer your key between clients.\n\nTo decrypt and use your key, tap on this message.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Please enter the setup code that is displayed on the other device.</string>
<string name="AutocryptKeyTransferBadCode">Bad setup code. Please try again.\n\nIf you do not remember the setup code, just initiate the key transfer on the other device again.</string>
<string name="AutocryptKeyTransferSucceeded">Key transferred successfully. This device is now ready to use Autocrypt with the same key as the other device.</string>
<string name="Retry">Retry</string>
<string name="SelfTalkSubtitle">Messages I sent to myself</string>
</resources>
+19 -16
View File
@@ -18,15 +18,14 @@ subproject _deltachat-core_:
- When using Git, you can can do this initially by
`$ git clone --recursive https://github.com/deltachat/deltachat-android.git`
or later by `git submodule update --init --recursive`.
or later by `git submodule update --init --recursive`. If your do this in your
home directory, this results in the folder `~/deltachat-android` which is just fine.
- Alternatively, you can download the [deltachat-android zip-file](https://github.com/deltachat/deltachat-android/archive/master.zip); in this case, also download the [deltachat-core zip-file](https://github.com/deltachat/deltachat-core/archive/master.zip) and place its contents to `MessengerProj/jni/messenger-backend`
There is no need to build the core library itself, deltachat-android just
references them.
Then, call `ndk-build` in the `MessengerProj` directory to build the C-part
and run the project in Android Studio. The project required API 25.
Then, call `ndk-build` in the `MessengerProj` directory to build the C-part;
this also builds deltachat-core. Afterwards run the project in Android Studio.
The project requires API 25.
With chance, that's it :) - if not, read on how to setup a proper development
environment.
@@ -46,28 +45,32 @@ Install Development Environment
move this folder eg. to `~/android-studio`
3. To launch Android Studio for the first time, open a terminal, navigate to
`~/android-studio/bin` and execute `studio.sh` and use all standard values
`~/android-studio/bin`, execute `./studio.sh` and use all standard values
from the wizard.
4. Android Studio now ask you if you want to download an existing project;
choose `~/deltachat-android` as created in step 1 (Android Studio starts to
choose `~/deltachat-android` as created in the "Build" chapter (Android Studio starts to
build the project, however, there are some steps missing before this will
succeed).
5. As Delta Chat uses API 25 for some reasons, go to "Tools / Android /
SDK Manager / SDK Platforms" and enable "Nougat 7.1.1 (API 25)" -
now the build should succeed - but the app still misses the native part.
5. As Delta Chat uses API 25 for some reasons, click on the corresponding error
message and install "Nougat 7.1.1 (API 25)" and the "Build-Tools" (you should
also find the option at "Tools / Android / SDK Manager / SDK Platforms").
Now the build should succeed - but the app still misses the native part.
6. Download Android NDK from <https://developer.android.com/ndk/downloads/> (eg. android-ndk-r15c-linux-x86_64.zip)
and unzip the archive which contains a single folder called eg.
`android-ndk-r15c`; move this folder eg. to `~/android-ndk-r15c`
6. Download Android NDK Revision 14b from
[NDK Archives](https://developer.android.com/ndk/downloads/older_releases.html)
(Newer releases shall not be used currently, they are not compatible,
see issues #197, #220, #248) and unzip the archive which contains a single folder
called `android-ndk-r...`; move this folder eg. to `~/android-ndk-r...`
7. Export the folder path to your environment as ANDROID_NDK and add it to PATH.
You can archive this eg. by adding the following lines to `.bashrc`
`export ANDROID_NDK=/home/bpetersen/android-ndk-r15c`
`export ANDROID_NDK=/home/bpetersen/android-ndk-r...`
`export PATH=$PATH:$ANDROID_NDK`
The last two steps may be omitted by using the new Android Studio NDK options, however, thus far, we have not found the time to do so.
The last two steps may be omitted by using the new Android Studio NDK options,
however, thus far, we have not found the time to do so.
---
+2 -2
View File
@@ -1,6 +1,6 @@
#Fri Mar 03 14:17:13 CET 2017
#Thu Dec 14 21:54:25 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
+23 -5
View File
@@ -1,20 +1,38 @@
The following checklists are there not to forget things ... to be continued.
# Add Release on F-Droid
1. deltachat-core: "draft a new release", if required
2. deltachat-android: check CHANGES.md against core and android commit list from last release
3. deltachat-android: `$ ./update-core.sh` followed by a `git push`
4. deltachat-android: "Draft a new release" using a version number in for Form v1.2.3
# Release new Core version
1. deltachat-core: bump version, commit, push
2. deltachat-core on Github: "Draft a new release" with the version form `v1.2.3`
# Release new F-Droid version
Release core, if needed, then:
1. deltachat-android: check CHANGLOG.md, commit, push
2. deltachat-android/tools: `$ ./update-core.sh`, push
3. deltachat-android/tools: `$ ./txpull`, if there are changes: commit, push
4. deltachat-android: bump version, commit, push
5. deltachat-android on Github: "Draft a new release" with the version form `v1.2.3`
... some days later, F-Droid should be updated.
For an additional APK:
6. in Android Studio select "Build / Build APK"
7. rename the generated APK to `deltachat-v1.2.3.apk`
8. upload the APK to the created Github release
# Add language
1. add `MessengerProj/src/main/res/values-<LANG>/strings.xml`
2. add copy command to `tools/txpull.sh` and `tools/txpush.sh`
# Update source languges on Transifex
1. call `./txpull` to overwrite local translation files with the ones from Transifex, the source is not updated
+1
View File
@@ -21,6 +21,7 @@ cp "${TXPREFIX}nl.xml" "${SRCPREFIX}-nl/strings.xml"
cp "${TXPREFIX}pl.xml" "${SRCPREFIX}-pl/strings.xml"
cp "${TXPREFIX}pt.xml" "${SRCPREFIX}-pt/strings.xml"
cp "${TXPREFIX}ru.xml" "${SRCPREFIX}-ru/strings.xml"
cp "${TXPREFIX}sq.xml" "${SRCPREFIX}-sq/strings.xml"
cp "${TXPREFIX}sr.xml" "${SRCPREFIX}-sr/strings.xml"
cp "${TXPREFIX}ta.xml" "${SRCPREFIX}-ta/strings.xml"
cp "${TXPREFIX}te.xml" "${SRCPREFIX}-te/strings.xml"
+1
View File
@@ -27,6 +27,7 @@ cp "${SRCPREFIX}-nl/strings.xml" "${TXPREFIX}nl.xml"
cp "${SRCPREFIX}-pl/strings.xml" "${TXPREFIX}pl.xml"
cp "${SRCPREFIX}-pt/strings.xml" "${TXPREFIX}pt.xml"
cp "${SRCPREFIX}-ru/strings.xml" "${TXPREFIX}ru.xml"
cp "${SRCPREFIX}-sq/strings.xml" "${TXPREFIX}sq.xml"
cp "${SRCPREFIX}-sr/strings.xml" "${TXPREFIX}sr.xml"
cp "${SRCPREFIX}-ta/strings.xml" "${TXPREFIX}ta.xml"
cp "${SRCPREFIX}-te/strings.xml" "${TXPREFIX}te.xml"