Compare commits

...

35 Commits

Author SHA1 Message Date
Moxie Marlinspike
ac2626437e Bump version to 3.26.2
// FREEBIE
2017-01-09 08:00:53 -08:00
Moxie Marlinspike
99b8cfc82b Include missing cardview dependency
Fixes #6026
// FREEBIE
2017-01-09 07:51:56 -08:00
Moxie Marlinspike
6eef1a6ee4 Bump version to 3.26.1
// FREEBIE
2017-01-08 13:11:48 -08:00
Moxie Marlinspike
4ad989cc38 Fix rounded corners bitmap double free
Fixes #4732
// FREEBIE
2017-01-08 13:06:11 -08:00
Moxie Marlinspike
5804213152 Eliminate item animations in ConversationFragment
Experience feels faster this way too

// FREEBIE
2017-01-08 10:16:23 -08:00
Moxie Marlinspike
d599c058c6 No choice but to multiDex
// FREEBIE
2017-01-08 09:58:01 -08:00
Moxie Marlinspike
b7d4294314 This is no longer testable =(
// FREEBIE
2017-01-07 11:36:50 -08:00
Moxie Marlinspike
d280604f1f Fix compileSdk 25 problems with GIF search
For #5965
// FREEBIE
2017-01-07 11:02:18 -08:00
AsamK
7817e38e5f Fix crash when clicking on a gif image
For gif images, the dimensions is always null.

Closes #6021
//FREEBIE
2017-01-07 10:40:22 -08:00
Moxie Marlinspike
f310dd6047 Update Play Services
Apparently we've put this off for as long as we can

Fixes #6018
// FREEBIE
2017-01-06 18:00:40 -08:00
Moxie Marlinspike
30633c9672 Bump version to 3.26.0
// FREEBIE
2017-01-06 11:48:49 -08:00
Moxie Marlinspike
16c44812c8 Update Dockerfile to support new compileSdk target
// FREEBIE
2017-01-06 11:48:35 -08:00
Moxie Marlinspike
1a57ff16cd Updated language translations
// FREEBIE
2017-01-06 11:36:02 -08:00
Moxie Marlinspike
c3451d19db This doesn't work in Iran
// FREEBIE
2017-01-06 09:40:04 -08:00
Moxie Marlinspike
bb5dcb7131 Start increasing frequency of signed prekey rotation
// FREEBIE
2017-01-06 09:19:58 -08:00
Moxie Marlinspike
884d8b7f72 Store display name in Signal contacts
Fixes #5974
// FREEBIE
2017-01-05 12:42:28 -08:00
Moxie Marlinspike
57cdbaedd6 Remove EXTRA_SUBJECT from safety number share.
Negatively impacts share through email slightly, positively
impacts share through a few other mechanisms somewhat
significantly.

Fixes #5959
// FREEBIE
2017-01-03 13:57:09 -08:00
Moxie Marlinspike
3861084ea2 Disable expiration menu on inactive group
Fixes #6007
// FREEBIE
2017-01-03 13:51:29 -08:00
Piotr Prucia
bb1ab2e929 Added Iran to domain fronting list
Fixes #5992
Closes #6006
// FREEBIE
2017-01-02 17:22:24 -08:00
Ali Makki
5a6e75a7e1 +968 uses google.com.om +53 uses google.com.cu
Closes #6001
2017-01-02 17:18:42 -08:00
Moxie Marlinspike
d2be49af42 Support for tiling image view and large image viewing
Fixes #5949
Fixes #5574
Fixes #4380
// FREEBIE
2017-01-02 17:17:48 -08:00
FeuRenard
477589b092 Color passphrase prompt text field blue
Closes #5424
// FREEBIE
2017-01-02 17:17:48 -08:00
Benedikt Constantin Radtke
a6488b3652 fix zero length attachments crashing signal
Fixes #5331
Closes #5926
2017-01-02 17:17:48 -08:00
FeuRenard
cde92256a6 Convert file save toast string to plural
Closes #5961
// FREEBIE
2017-01-02 17:17:48 -08:00
Echo
47f1f0b9a0 Update crowdfunding link
Closes #5984
// FREEBIE
2017-01-02 17:17:48 -08:00
Moxie Marlinspike
a3019be7b6 Support for image keyboards
// FREEBIE
2017-01-02 17:17:48 -08:00
Moxie Marlinspike
373a0f9527 Support for Android N direct reply notifications
// FREEBIE
2017-01-02 17:17:48 -08:00
Moxie Marlinspike
a9bd84c69c Support for bundled notifications (Android wear and Android N)
// FREEBIE
2017-01-02 17:17:48 -08:00
Moxie Marlinspike
0c6bfdbd0d Improve canonical address database caching
// FREEBIE
2017-01-02 17:17:48 -08:00
Moxie Marlinspike
cdf3a849e9 Reduce DB updates on send path, move support SDK up to 24
// FREEBIE
2017-01-02 17:17:48 -08:00
Moxie Marlinspike
4e32fb21fe Bump version to 3.25.4
// FREEBIE
2016-12-30 08:47:10 -08:00
Moxie Marlinspike
ae40715526 Support for expanded domain fronting strategies
// FREEBIE
2016-12-29 20:54:05 -08:00
Moxie Marlinspike
7488525641 Add Cuba and Oman to domain fronting list
// FREEBIE
2016-12-21 14:28:41 -08:00
Moxie Marlinspike
fd00298930 Bump version to 3.25.3
// FREEBIE
2016-12-21 09:59:40 -08:00
Moxie Marlinspike
f3f2f29b23 Fix avatar download crash bug
Fixes #5980
// FREEBIE
2016-12-21 09:58:45 -08:00
117 changed files with 2924 additions and 757 deletions

View File

@@ -2,10 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.thoughtcrime.securesms"
android:versionCode="220"
android:versionName="3.25.2">
android:versionCode="225"
android:versionName="3.26.2">
<uses-sdk tools:overrideLibrary="com.amulyakhare.textdrawable,com.astuetz.pagerslidingtabstrip,pl.tajchert.waitingdots,com.h6ah4i.android.multiselectlistpreferencecompat"/>
<uses-sdk tools:overrideLibrary="com.amulyakhare.textdrawable,com.astuetz.pagerslidingtabstrip,pl.tajchert.waitingdots,com.h6ah4i.android.multiselectlistpreferencecompat,android.support.v13,com.davemorrissey.labs.subscaleview"/>
<permission android:name="org.thoughtcrime.securesms.ACCESS_SECRETS"
android:label="Access to TextSecure Secrets"
@@ -454,13 +454,13 @@
<receiver android:name=".notifications.MarkReadReceiver"
android:enabled="true"
android:exported="true">
android:exported="false">
<intent-filter>
<action android:name="org.thoughtcrime.securesms.notifications.CLEAR"/>
</intent-filter>
</receiver>
<receiver android:name=".notifications.WearReplyReceiver"
<receiver android:name=".notifications.RemoteReplyReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
@@ -502,7 +502,12 @@
<receiver android:name=".service.DirectoryRefreshListener">
<intent-filter>
<action android:name="org.whispersystems.whisperpush.DIRECTORY_REFRESH"/>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name=".service.RotateSignedPreKeyListener">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

View File

@@ -83,6 +83,6 @@ Any one can help by
- submitting pull requests
- testing other people's pull requests
- spreading the joy of Signal to your friends and family
- donating money to our [BitHub](https://www.coinbase.com/checkouts/51dac699e660a4d773216b5ad94d6a0b) or through the [Freedom of the Press Foundation's donation page](https://freedom.press/bundle/encryption-tools-journalists)
- donating money to our [BitHub](https://www.coinbase.com/checkouts/51dac699e660a4d773216b5ad94d6a0b) or through the [Freedom of the Press Foundation's donation page](https://freedom.press/crowdfunding/signal/)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/WhisperSystems/Signal-Android?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)

View File

@@ -12,7 +12,7 @@ RUN dpkg --add-architecture i386 && \
ENV ANDROID_SDK_FILENAME android-sdk_r24.4.1-linux.tgz
ENV ANDROID_SDK_URL https://dl.google.com/android/${ANDROID_SDK_FILENAME}
ENV ANDROID_API_LEVELS android-24
ENV ANDROID_API_LEVELS android-25
ENV ANDROID_BUILD_TOOLS_VERSION 23.0.3
ENV ANDROID_HOME /usr/local/android-sdk-linux
ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools

View File

@@ -38,11 +38,29 @@ repositories {
}
dependencies {
compile 'com.android.support:appcompat-v7:25.1.0'
compile 'com.android.support:recyclerview-v7:25.1.0'
compile 'com.android.support:design:25.1.0'
compile 'com.android.support:support-v13:25.1.0'
compile 'com.android.support:cardview-v7:25.1.0'
compile ('com.android.support:support-v4-preferencefragment:1.0.0@aar'){
exclude module: 'support-v4'
}
compile ('com.android.support:gridlayout-v7:25.1.0') {
exclude module: 'support-v4'
}
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.android.gms:play-services-gcm:9.6.1'
compile 'com.google.android.gms:play-services-maps:9.6.1'
compile 'com.google.android.gms:play-services-places:9.6.1'
compile 'org.whispersystems:jobmanager:1.0.2'
compile 'org.whispersystems:libpastelog:1.0.7'
compile 'org.whispersystems:signal-service-android:2.4.4'
compile 'me.leolin:ShortcutBadger:1.1.0-WS1'
compile 'se.emilsjolander:stickylistheaders:2.7.0'
compile 'com.google.android.gms:play-services-gcm:8.1.0'
compile 'com.google.android.gms:play-services-maps:8.1.0'
compile 'com.google.android.gms:play-services-location:8.1.0'
compile 'com.jpardogo.materialtabstrip:library:1.0.9'
compile 'org.w3c:smil:1.0.0'
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
@@ -53,33 +71,20 @@ dependencies {
compile 'de.greenrobot:eventbus:2.4.0'
compile 'pl.tajchert:waitingdots:0.1.0'
compile 'com.soundcloud.android:android-crop:0.9.10@aar'
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:recyclerview-v7:22.2.1'
compile 'com.android.support:design:22.2.1'
compile 'com.android.support:cardview-v7:22.2.1'
compile 'com.melnykov:floatingactionbutton:1.3.0'
compile 'com.google.zxing:android-integration:3.1.0'
compile ('com.android.support:support-v4-preferencefragment:1.0.0@aar'){
exclude module: 'support-v4'
}
compile ('com.android.support:gridlayout-v7:22.2.0') {
exclude module: 'support-v4'
}
compile 'com.squareup.dagger:dagger:1.2.2'
compile ("com.doomonafireball.betterpickers:library:1.5.3") {
exclude group: 'com.android.support', module: 'support-v4'
}
compile 'com.madgag.spongycastle:prov:1.51.0.0'
provided 'com.squareup.dagger:dagger-compiler:1.2.2'
compile 'org.whispersystems:jobmanager:1.0.2'
compile 'org.whispersystems:libpastelog:1.0.7'
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
compile 'org.whispersystems:signal-service-android:2.4.3'
compile 'com.h6ah4i.android.compat:mulsellistprefcompat:1.0.0'
compile 'com.google.zxing:core:3.2.1'
compile ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') {
exclude group: 'com.android.support', module: 'support-annotations'
}
compile ('cn.carbswang.android:NumberPickerView:1.0.9') {
exclude group: 'com.android.support', module: 'appcompat-v7'
}
@@ -105,11 +110,22 @@ dependencies {
dependencyVerification {
verify = [
'com.android.support:appcompat-v7:b48bfd5efc14da938ba0647f9894aa7d3d90f0b618167652a318f6f336ef303e',
'com.android.support:recyclerview-v7:45beed1778f785c75540b68aa7735b8973a518ac21e8d763188dbbdae6c5b65d',
'com.android.support:design:92466557dc6a222bbff361801b26979573cb7086119331e78c74a2df34d5e11e',
'com.android.support:support-v13:deeb43c2878025f2a0485791f66b5f59a1c6a4c6671c6ad7bb20abfeffaa313f',
'com.android.support:cardview-v7:cd6f472f130a75f029cd1b7c56f72174023d56a2eee2b97577837fe39169d5df',
'com.android.support:support-v4-preferencefragment:5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad',
'com.android.support:gridlayout-v7:c24f2aa68089fd31b39811bc502e24637a6a8cc29bbf709cda4f4605047c9e11',
'com.android.support:multidex:60df8e7153fabdcf3a6a48a2ce5980b599cf25cbeb3b689b7b615975ca731840',
'com.google.android.gms:play-services-gcm:312e61253a236f2d9b750b9c04fc92fd190d23b0b2755c99de6ce4a28b259dae',
'com.google.android.gms:play-services-maps:45e8021e7ddac4a44a82a0e9698991389ded3023d35c58f38dbd86d54211ec0e',
'com.google.android.gms:play-services-places:abf3a4a3b146ec7e6e753be62775e512868cf37d6f88ffe2d81167b33b57132b',
'org.whispersystems:jobmanager:506f679fc2fcf7bb6d10f00f41d6f6ea0abf75c70dc95b913398661ad538a181',
'org.whispersystems:libpastelog:bb331d9a98240fc139101128ba836c1edec3c40e000597cdbb29ebf4cbf34d88',
'org.whispersystems:signal-service-android:27f3f686d9d9f855360307b4b641e666246e7b617020e271df66cb4bdcc26f2a',
'me.leolin:ShortcutBadger:3142d017234bfa0cdd69ccded7cc5ea63f13b97574803c8c616c9bbeaad33ad9',
'se.emilsjolander:stickylistheaders:a08ca948aa6b220f09d82f16bbbac395f6b78897e9eeac6a9f0b0ba755928eeb',
'com.google.android.gms:play-services-gcm:757ecd2c837ac81c98f4cc7dc783e7454c6d0506f6cc66b10417126b675248c9',
'com.google.android.gms:play-services-maps:c58a9d98a98889fb0b27f78100f2d9341ed7722db24ccf832df62b6e8ce1b42e',
'com.google.android.gms:play-services-location:8226f778aa86bd15b9143f62425262cc53d64021990f62eb1aaec108d4e25f35',
'com.jpardogo.materialtabstrip:library:c6ef812fba4f74be7dc4a905faa4c2908cba261a94c13d4f96d5e67e4aad4aaa',
'org.w3c:smil:085dc40f2bb249651578bfa07499fd08b16ad0886dbe2c4078586a408da62f9b',
'org.apache.httpcomponents:httpclient-android:6f56466a9bd0d42934b90bfbfe9977a8b654c058bf44a12bdc2877c4e1f033f1',
@@ -120,32 +136,32 @@ dependencyVerification {
'de.greenrobot:eventbus:61d743a748156a372024d083de763b9e91ac2dcb3f6a1cbc74995c7ddab6e968',
'pl.tajchert:waitingdots:2835d49e0787dbcb606c5a60021ced66578503b1e9fddcd7a5ef0cd5f095ba2c',
'com.soundcloud.android:android-crop:ffd4b973cf6e97f7d64118a0dc088df50e9066fd5634fe6911dd0c0c5d346177',
'com.android.support:appcompat-v7:4b5ccba8c4557ef04f99aa0a80f8aa7d50f05f926a709010a54afd5c878d3618',
'com.android.support:recyclerview-v7:b0f530a5b14334d56ce0de85527ffe93ac419bc928e2884287ce1dddfedfb505',
'com.android.support:design:58be3ca6a73789615f7ece0937d2f683b98b594bb90aa10565fa760fb10b07ee',
'com.android.support:cardview-v7:2c2354761a4e20ba451ae903ab808f15c9acc8343b1e74001869c2d0a672c1fc',
'com.melnykov:floatingactionbutton:15d58d4fac0f7a288d0e5301bbaf501a146f5b3f5921277811bf99bd3b397263',
'com.google.zxing:android-integration:89e56aadf1164bd71e57949163c53abf90af368b51669c0d4a47a163335f95c4',
'com.android.support:support-v4-preferencefragment:5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad',
'com.android.support:gridlayout-v7:a9b770cffca2c7c5cd83cba4dd12503365de5e8d9c79c479165adf18ab3bc25b',
'com.squareup.dagger:dagger:789aca24537022e49f91fc6444078d9de8f1dd99e1bfb090f18491b186967883',
'com.doomonafireball.betterpickers:library:132ecd685c95a99e7377c4e27bfadbb2d7ed0bea995944060cd62d4369fdaf3d',
'com.madgag.spongycastle:prov:b8c3fec3a59aac1aa04ccf4dad7179351e54ef7672f53f508151b614c131398a',
'org.whispersystems:jobmanager:506f679fc2fcf7bb6d10f00f41d6f6ea0abf75c70dc95b913398661ad538a181',
'org.whispersystems:libpastelog:bb331d9a98240fc139101128ba836c1edec3c40e000597cdbb29ebf4cbf34d88',
'com.amulyakhare:com.amulyakhare.textdrawable:54c92b5fba38cfd316a07e5a30528068f45ce8515a6890f1297df4c401af5dcb',
'org.whispersystems:signal-service-android:59e4cec73b9160b7d7c073841318098d46f25c618561d457baf4e10775a6e7b1',
'com.h6ah4i.android.compat:mulsellistprefcompat:47167c5cb796de1a854788e9ff318358e36c8fb88123baaa6e38fb78511dfabe',
'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259',
'com.davemorrissey.labs:subsampling-scale-image-view:550c5baa07e0bb4ff0a18b705e96d34436d22619248bd8c08c08c730b1f55cfe',
'cn.carbswang.android:NumberPickerView:18b3c316d62c7c277978a8d4ed57a5b8f4e943762264960f579a8a549c756729',
'com.google.android.gms:play-services-base:ef36e50fa5c0415ed41f74dd399a889efd2fa327c449036e140c7c3786aa0e1f',
'com.android.support:support-annotations:104f353b53d5dd8d64b2f77eece4b37f6b961de9732eb6b706395e91033ec70a',
'com.android.support:support-annotations:fb941680f43afbd70ce01ec3cc837a5037f0a774701b12a9fd3090bd4727cf15',
'com.android.support:support-v4:ed4cda7c752f51d33f9bbdfff3422b425b323d356cd1bdc9786aa413c912e594',
'com.android.support:support-vector-drawable:2697503d3e8e709023ae176ba5db7f98ca0aa0b4e6290aedcb3c371904806bf7',
'com.android.support:animated-vector-drawable:6d05cb63d1f68900220f85c56dfe1066a9bb19cb0ec1247cc68fc2ba32f6b4a7',
'com.android.support:support-compat:e880fb1209c33fcb43e2b25716808e1a6e0b4d3170d5a8dc7704e15084428f88',
'com.android.support:support-core-ui:0149b54fd3bc9f4b3b2d321ff53c11821b31a2eca1e664d0cee224e8f53073d6',
'com.android.support:transition:cf53f778352fe0b74ff14d838bef9fe79264f3fd43eac499b6e0d1664dbd8997',
'com.google.android.gms:play-services-base:0ca636a8fc9a5af45e607cdcd61783bf5d561cbbb0f862021ce69606eee5ad49',
'com.google.android.gms:play-services-basement:95dd882c5ffba15b9a99de3fefb05d3a01946623af67454ca00055d222f85a8d',
'com.google.android.gms:play-services-iid:54e919f9957b8b7820da7ee9b83471d00d0cac1cf08ddea8b5b41aea80bb1a70',
'org.whispersystems:signal-protocol-android:1b4b9d557c8eaf861797ff683990d482d4aa8e9f23d9b17ff0cc67a02f38cb19',
'org.whispersystems:signal-service-java:df0e83633ff4078cd276838c8942b953f670c61a5f2615ae2a89c75c19fc1bec',
'com.nineoldandroids:library:68025a14e3e7673d6ad2f95e4b46d78d7d068343aa99256b686fe59de1b3163a',
'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'com.madgag.spongycastle:core:8d6240b974b0aca4d3da9c7dd44d42339d8a374358aca5fc98e50a995764511f',
'org.whispersystems:signal-protocol-android:1b4b9d557c8eaf861797ff683990d482d4aa8e9f23d9b17ff0cc67a02f38cb19',
'org.whispersystems:signal-service-java:9e983922084ca2c8089de0a58d7f2032e50026c2456c2bf9dfb0a56ac46a5864',
'com.google.android.gms:play-services-basement:e1d29b21e02fd2a63e5a31807415cbb17a59568e27e3254181c01ffae10659bf',
'com.google.android.gms:play-services-tasks:69ec265168e601d0203d04cd42e34bb019b2f029aa1e16fabd38a5153eea2086',
'org.whispersystems:curve25519-android:bf6c34223d45d2f2813a8efcab9923caf99115115c760c9acea680bcb42d23c0',
'org.whispersystems:signal-protocol-java:a835cd0609cf116a74651bd0aa748db9392bba48c2d2af787757b8a1b50d131c',
'com.googlecode.libphonenumber:libphonenumber:7214dc6dfc6243e34fb1a3e02ad15331bfff6ab902d679e3ba337695265c21ca',
@@ -156,12 +172,14 @@ dependencyVerification {
'com.squareup.okio:okio:5e1098bd3fdee4c3347f5ab815b40ba851e4ab1b348c5e49a5b0362f0ce6e978',
'com.fasterxml.jackson.core:jackson-annotations:0ca408c24202a7626ec8b861e99d85eca5e38b73311dd6dd12e3e9deecc3fe94',
'com.fasterxml.jackson.core:jackson-core:cbf4604784b4de226262845447a1ad3bb38a6728cebe86562e2c5afada8be2c0',
'com.android.support:support-v4:c62f0d025dafa86f423f48df9185b0d89496adbc5f6a9be5a7c394d84cf91423',
'com.android.support:support-media-compat:8d6a1a5ba3d9eb1a25cb8f21bb312ac6280202e3d2900cb0b447d065d0d8a125',
'com.android.support:support-core-utils:a7649e18c04143dde40c218c5ce9a030e7ae674089cd7b18c6cf8ed2a22cf01a',
'com.android.support:support-fragment:1294500b357f52cf3779e2521c79f54ae7844f3b9a5f6727495dbbda7f231377',
]
}
android {
compileSdkVersion 24
compileSdkVersion 25
buildToolsVersion '23.0.3'
useLibrary 'org.apache.http.legacy'
@@ -172,14 +190,12 @@ android {
defaultConfig {
minSdkVersion 9
targetSdkVersion 22
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
buildConfigField "long", "BUILD_TIMESTAMP", getLastCommitTimestamp() + "L"
buildConfigField "String", "TEXTSECURE_URL", "\"https://textsecure-service.whispersystems.org\""
buildConfigField "String[]", "CENSORED_COUNTRIES", "{\"+20\", \"+971\"}"
buildConfigField "String", "UNCENSORED_FRONTING_HOST", "\"https://www.google.com\""
buildConfigField "String", "CENSORED_REFLECTOR", "\"signal-reflector-meek.appspot.com\""
buildConfigField "String", "SIGNAL_URL", "\"https://textsecure-service.whispersystems.org\""
buildConfigField "String", "GIPHY_PROXY_HOST", "\"giphy-proxy-production.whispersystems.org\""
buildConfigField "int", "GIPHY_PROXY_PORT", "80"
buildConfigField "String", "USER_AGENT", "\"OWA\""

View File

@@ -12,7 +12,8 @@
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="?attr/actionBarStyle"/>
android:theme="?attr/actionBarStyle"
app:contentInsetStartWithNavigation="0dp"/>
<fragment android:id="@+id/contact_selection_list_fragment"
android:layout_width="match_parent"

View File

@@ -9,7 +9,8 @@
<ImageView android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent"
android:scaleType="centerCrop"/>
</org.thoughtcrime.securesms.components.SquareFrameLayout>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="org.thoughtcrime.securesms.components.ZoomingImageView">
<ImageView android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"/>
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
android:id="@+id/subsampling_image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</merge>

View File

@@ -76,6 +76,8 @@
<!--CallScreen-->
<string name="CallScreen_Incoming_call">مكالمة واردة</string>
<!--ConfirmIdentityDialog-->
<string name="ConfirmIdentityDialog_your_safety_number_with_s_has_changed">لقد تغير رقم الأمان الخاص بك وبـ %1$s. هذا إما يعني أن أحداً يحاول اعتراض اتصالكما ، أو أن %2$s ببساطة أعاد تنصيب تطبيق سيقنـال مرة آخرى.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact">لربما ترغب بالتحقق من رقم الأمان مع هذا المتصل.</string>
<string name="ConfirmIdentityDialog_accept">موافقة</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">رسالة %s</string>
@@ -183,7 +185,6 @@
<item quantity="many">وقع خطأ أثناء حفظ المرفقات في مساحة التخزين!</item>
<item quantity="other">وقع خطأ أثناء حفظ المرفقات في مساحة التخزين!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">تم حفظ الملف بنجاح.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">تعذر الإضافة إلى الذاكرة!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="zero">جارٍ حفظ %1$d مرفق</item>
@@ -256,6 +257,7 @@
<string name="CustomDefaultPreference_using_default">الاستخدام الافتراضي: %s</string>
<string name="CustomDefaultPreference_none">لا شيء </string>
<!--DateUtils-->
<string name="DateUtils_just_now">هذه اللحظة</string>
<string name="DateUtils_minutes_ago">%d دقيقة</string>
<!--DeviceListActivity-->
<string name="DeviceListActivity_unlink_s">إلغاء ربط \'%s\'؟</string>
@@ -293,7 +295,10 @@
<string name="GcmRefreshJob_Permanent_Signal_communication_failure">فشل دائما في اتصال سيجنال!</string>
<string name="GcmRefreshJob_Signal_was_unable_to_register_with_Google_Play_Services">سيجنال لم يتمكن من التسجيل مع خدمات جوجل بلاي، وتم تعطيل رسائل ومكالمات سيجنال. رجاء محاولة إعادة التسجيل عبر قائمة الإعدادات بالتطبيق ثم اختيار متقدم.</string>
<!--GiphyActivity-->
<string name="GiphyActivity_error_while_retrieving_full_resolution_gif">طرأ خطأ أثناء استجلاب صورة الـGIF بدقة كاملة...</string>
<!--GiphyFragmentPageAdapter-->
<string name="GiphyFragmentPagerAdapter_gifs">صور GIF</string>
<string name="GiphyFragmentPagerAdapter_stickers">لصاقات</string>
<!--GroupCreateActivity-->
<string name="GroupCreateActivity_actionbar_title">مجموعة جديدة</string>
<string name="GroupCreateActivity_actionbar_update_title">تحديث المجموعة</string>
@@ -363,6 +368,7 @@
<string name="KeyScanningActivity_this_application_requires_barcode_scanner_would_you_like_to_install_it">سيجنال يحتاج إلى ماسح Barcode لرموز الاستجابة السريعة.</string>
<!--MessageDetailsRecipient-->
<string name="MessageDetailsRecipient_failed_to_send">الإرسال فشل.</string>
<string name="MessageDetailsRecipient_new_safety_number">رقم أمان جديد</string>
<!--MmsDownloader-->
<string name="MmsDownloader_error_storing_mms">خطأ بتخزين رسالة الوسائط المتعددة!</string>
<string name="MmsDownloader_error_connecting_to_mms_provider">خطأ في الاتصال مع مزود خدمة رسالة الوسائط المتعددة...</string>
@@ -387,6 +393,9 @@
<string name="MessageRecord_called_s">%s قام بالاتصال</string>
<string name="MessageRecord_missed_call_from">مكالمة فائتة من %s</string>
<string name="MessageRecord_s_is_on_signal_say_hey">%s إنضم إلى سيجنال.. ألقي التحية!</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">لقد قمت بتحديد توقيت اختفاء الرسالة ليكون %1$s.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">حدد %1$s توقيت اختفاء الرسالة ليكون %2$s.</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">تم تغيير رقم الأمان الخاص بك وبـ%s.</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">العبارات السرية غير متطابقة!</string>
<string name="PassphraseChangeActivity_incorrect_old_passphrase_exclamation">العبارة السرية القديمة غير صحيحة!</string>
@@ -508,6 +517,7 @@
<string name="SmsMessageRecord_received_corrupted_key_exchange_message">تم استلام رسالة تبادل مفاتيح تالفة.</string>
<string name="SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version">
تم استلام رسالة تبادل مفاتيح مع إصدارة بروتوكول غير صحيحة.</string>
<string name="SmsMessageRecord_received_message_with_new_safety_number_tap_to_process">تم استلام رسالة برقم أمان جديد. انقر للمعالجة والعرض.</string>
<string name="SmsMessageRecord_secure_session_reset">لقد قمت بإعادة ضبط تأمين المحادثة.</string>
<string name="SmsMessageRecord_secure_session_reset_s">%s أعاد ضبط تأمين المحادثة.</string>
<string name="SmsMessageRecord_duplicate_message">رسالة مكررة.</string>
@@ -521,8 +531,16 @@
<string name="ThreadRecord_media_message">رسالة وسائط متعددة</string>
<string name="ThreadRecord_s_is_on_signal_say_hey">%s إنضم إلى سيجنال.. ألقي التحية!</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">ضبط توقيت إخفاء الرسائل إلى %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">تم تغيير رقم الأمان الخاص بك وبـ%s.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">متصلك يستعمل نسخة قديمة من تطبيق سيقنال. من فضلك اطلب منه تحديث التطبيق ليتسنى لك التحقق من رقم الأمان.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">إن متصلك هذا يستعمل نسخة تطبيق سيقنـال أحدث ورمز QR فيها لا يتوافق مع نسختك.
من فضلك، قم بالتحديث لتتمكن من المقارنة.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">إن رمز التحقق من رقم الأمان المستقرأ من رمز QR غير مصاغ بشكل صحيح. يُرجى إعادة الاستقراء مجدداً.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">شارك رقم الأمان بواسطة...</string>
<string name="VerifyIdentityActivity_our_signal_safety_number">رقم الأمان الخاص بنا في سيقنال:</string>
<string name="VerifyIdentityActivity_no_app_to_share_to">يبدو عدم وجود أي تطبيقات لديك للمشاركة من خلالها.</string>
<string name="VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard">لم يُعثر على رقم أمان في الحافظة من أجل المقارنة</string>
<!--KeyExchangeInitiator-->
<string name="KeyExchangeInitiator_initiate_despite_existing_request_question">ابدأ على الرغم من الطلب الحالي؟</string>
<string name="KeyExchangeInitiator_send">أرسل</string>
@@ -578,11 +596,20 @@
<string name="SingleRecipientNotificationBuilder_new_message">رسالة جديدة</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">صورة</string>
<string name="attachment_type_selector__image_description">صورة</string>
<string name="attachment_type_selector__audio">صوت</string>
<string name="attachment_type_selector__audio_description">صوت</string>
<string name="attachment_type_selector__video">فيديو</string>
<string name="attachment_type_selector__video_description">فيديو</string>
<string name="attachment_type_selector__contact">جهة اتصال</string>
<string name="attachment_type_selector__contact_description">متصل</string>
<string name="attachment_type_selector__camera">كاميرا</string>
<string name="attachment_type_selector__camera_description">كاميرا</string>
<string name="attachment_type_selector__location">الموقع</string>
<string name="attachment_type_selector__location_description">موقع جغرافي</string>
<string name="attachment_type_selector__gif">صورة GIF</string>
<string name="attachment_type_selector__gif_description">صورة Gif</string>
<string name="attachment_type_selector__drawer_description">تفعيل أو تثبيط درج المرفقات</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">العبارة السرية القديمة</string>
<string name="change_passphrase_activity__new_passphrase">العبارة السرية الجديدة</string>
@@ -613,6 +640,9 @@
<string name="conversation_activity__compose_description">تكوين الرسالة</string>
<string name="conversation_activity__emoji_toggle_description">تبديل لوحة مفاتيح الرموز التعبيرية</string>
<string name="conversation_activity__attachment_thumbnail">المصغّرة للمرفق</string>
<string name="conversation_activity__quick_attachment_drawer_toggle_camera_description">تفعيل أو تثبيط سريع لدرج مرفقات الكاميرا </string>
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">تسجيل وإرسال مرفق صوتي</string>
<string name="conversation_activity__enable_signal_for_sms">تمكين سيقنـال للرسائل النصية</string>
<!--conversation_input_panel-->
<string name="conversation_input_panel__slide_to_cancel">سحب للإلغاء</string>
<!--conversation_item-->
@@ -630,6 +660,9 @@
<string name="conversation_item_received__contact_photo_description">صورة جهة الاتصال</string>
<string name="conversation_item_received__downloading">التنزيل جارٍ...</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">تشغيل</string>
<string name="audio_view__pause_accessibility_description">توقف</string>
<string name="audio_view__download_accessibility_description">تنزيل</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">وضع اختيار الدفعات</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s اختيار</string>
@@ -685,7 +718,9 @@
</plurals>
<string name="expiration_weeks_abbreviated">%dw</string>
<!--giphy_activity-->
<string name="giphy_activity_toolbar__search_gifs_and_stickers">ابحث في صور GIF واللصاقات</string>
<!--giphy_fragment-->
<string name="giphy_fragment__nothing_found">لا يوجد شيء</string>
<!--log_submit_activity-->
<string name="log_submit_activity__log_fetch_failed">تعذر التقاط السجلات من هاتفك. يمكنك استخدام ADB للحصول على سجل التشغيل بدلا من ذلك.</string>
<string name="log_submit_activity__thanks">شكرا للمساعدة!</string>
@@ -749,6 +784,7 @@
<string name="recipient_preferences__block">حظر</string>
<string name="recipient_preferences__color">اللون</string>
<string name="recipient_preferences__color_for_this_contact">اللون المخصص لجهة الاتصال</string>
<string name="recipient_preferences__verify_safety_number">تحقق من رقم الأمان</string>
<!--- redphone_call_controls-->
<string name="redphone_call_card__signal_call">مكالمة سيجنال</string>
<string name="redphone_call_controls__end_call">إنهاء المكالمة</string>
@@ -808,8 +844,10 @@
<string name="recipients_panel__to"><small>أدخل اسم أو رقم</small></string>
<string name="recipients_panel__add_members">إضافة أعضاء</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment__if_you_wish_to_verify_the_security_of_your_end_to_end_encryption_with_s"><![CDATA[إن كنت ترغب في فحص أمان التشفير الحاصل بينك وبين %s من طرفيه ، قارن الرقم في الأعلى بالرقم الموجود على جهازهم. أو يمكنك كحل آخر إجراء مسح تصويري للرمز الموجود على جهازهم أو أن تطلب منهم إجراء مسح تصويري للرمز الذي على جهازك.<a href=\"https://whispersystems.org/redirect/safety-numbers\">تعلم المزيد عن التحقق من أرقام الأمان</a>]]></string>
<string name="verify_display_fragment__tap_to_scan">المس للمسح</string>
<!--verify_identity-->
<string name="verify_identity__share_safety_number">شارك رقم الأمان</string>
<!--message_details_header-->
<string name="message_details_header__issues_need_your_attention">بعض المشاكل تتطلب انتباهك.</string>
<string name="message_details_header__sent">أرسلت</string>
@@ -825,6 +863,7 @@
<string name="AndroidManifest__select_contacts">اخر جهات الاتصال</string>
<string name="AndroidManifest__signal_detected">تم العثور على سيجنال</string>
<string name="AndroidManifest__change_passphrase">غير العبارة السرية</string>
<string name="AndroidManifest__verify_safety_number">تحقق من رقم الأمان</string>
<string name="AndroidManifest__log_submit">أرسل سجل التشغيل.</string>
<string name="AndroidManifest__media_preview">معاينة الوسائط</string>
<string name="AndroidManifest__media_overview">جميع الصور</string>
@@ -1046,6 +1085,8 @@
<string name="text_secure_normal__invite_friends">دعوة الأصدقاء</string>
<string name="text_secure_normal__help">مساعدة</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment_context_menu__copy_to_clipboard">نسخ إلى الحافظة</string>
<string name="verify_display_fragment_context_menu__compare_with_clipboard">قارن مع الحافظة</string>
<!--reminder_header-->
<string name="reminder_header_outdated_build">لقد انتهت صلاحية هذه الإصدارة من سيجنال.</string>
<plurals name="reminder_header_outdated_build_details">
@@ -1082,6 +1123,8 @@
<string name="MediaPreviewActivity_unssuported_media_type">غير مدعوم.</string>
<!--media_preview-->
<string name="media_preview__save_title">أحفظ</string>
<string name="media_preview__forward_title">إعادة إرسال</string>
<string name="media_preview__overview_title">كل الصور</string>
<!--media_overview-->
<string name="media_overview__save_all">حفظ الكل</string>
<!--media_preview_activity-->

View File

@@ -153,7 +153,10 @@
<item quantity="one">Грешка при запазването на прикаченият файл!</item>
<item quantity="other">Грешка при запазването на прикачените файлове!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Файлът е успешно запазен.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Файлът е успешно съхранен.</item>
<item quantity="other">Файловете са успешно съхранени.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Неуспеше запис на SD карта!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Запазване на прикачения файл</item>

View File

@@ -149,7 +149,6 @@
<item quantity="one">Error al desar l\'arxiu adjunt a l\'emmagatzematge!</item>
<item quantity="other">Error al desar els arxius adjunts a l\'emmagatzematge!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Arxiu desat correctament.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">No s\'ha pogut escriure a emmagatzematge!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Desant arxiu adjunt</item>

View File

@@ -4,7 +4,7 @@
<string name="yes">Ano</string>
<string name="no">Ne</string>
<string name="delete">Smazat</string>
<string name="please_wait">Prosím čekejte...</string>
<string name="please_wait">Prosím čekejte</string>
<!--AbstractNotificationBuilder-->
<string name="AbstractNotificationBuilder_new_message">Nová zpráva</string>
<!--ApplicationPreferencesActivity-->
@@ -40,7 +40,7 @@
<string name="ApplicationPreferencesActivity_Off">Vyp.</string>
<string name="ApplicationPreferencesActivity_sms_mms_summary">SMS %1$s, MMS %2$s</string>
<string name="ApplicationPreferencesActivity_privacy_summary">Heslo %1$s, Zabezpečení obrazovky %2$s</string>
<string name="ApplicationPreferencesActivity_appearance_summary">Téma %1$s, Jazyk %2$s</string>
<string name="ApplicationPreferencesActivity_appearance_summary">Motiv %1$s, jazyk %2$s</string>
<!--AppProtectionPreferenceFragment-->
<plurals name="AppProtectionPreferenceFragment_minutes">
<item quantity="one">1 minuta</item>
@@ -82,7 +82,7 @@
<string name="ConversationItem_error_received_stale_key_exchange_message">Chyba při předávání klíčů.</string>
<string name="ConversationItem_received_key_exchange_message_tap_to_process">Byl vám doručen klíč, klikněte pro jeho zpracování.</string>
<string name="ConversationItem_group_action_left">%1$s opustil(a) skupinu.</string>
<string name="ConversationItem_click_for_details">Klikněte pro detail</string>
<string name="ConversationItem_click_for_details">Klikněte pro podrobnosti</string>
<string name="ConversationItem_click_to_approve_unencrypted">Klikněte pro nešifrovaný záložní způsob</string>
<string name="ConversationItem_click_to_approve_unencrypted_sms_dialog_title">Použít záložní způsob přes nešifrovanou SMS?</string>
<string name="ConversationItem_click_to_approve_unencrypted_mms_dialog_title">Použít záložní způsob přes nešifrovanou MMS?</string>
@@ -161,7 +161,11 @@
<item quantity="few">Chyba při ukládání příloh!</item>
<item quantity="other">Chyba při ukládání příloh!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Soubor byl úspěšně uložen</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Soubor byl úspěšně uložen.</item>
<item quantity="few">Soubory byly úspěšně uloženy.</item>
<item quantity="other">Soubory byly úspěšně uloženy.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Nelze uložit data do paměti.</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Ukládám přílohu</item>
@@ -228,7 +232,7 @@
<string name="DeviceListActivity_network_failed">Síť selhala</string>
<!--DeviceListItem-->
<string name="DeviceListItem_unnamed_device">Nepojmenované zřízení</string>
<string name="DeviceListItem_linked_s">Provázáno %s</string>
<string name="DeviceListItem_linked_s">Propojeno %s</string>
<string name="DeviceListItem_last_active_s">Naposled aktivní %s</string>
<string name="DeviceListItem_today">Dnes</string>
<!--ShareActivity-->
@@ -272,7 +276,7 @@
<string name="GroupCreateActivity_creating_group">Vytvářím %1$s…</string>
<string name="GroupCreateActivity_updating_group">Aktualizuji %1$s...</string>
<string name="GroupCreateActivity_cannot_add_non_push_to_existing_group">Nemohu přidat %1$s protože není uživatelem Signal.</string>
<string name="GroupCreateActivity_loading_group_details">Načítám detaily skupiny...</string>
<string name="GroupCreateActivity_loading_group_details">Načítám podrobnosti skupiny</string>
<string name="GroupCreateActivity_youre_already_in_the_group">Již jste ve skupině.</string>
<!--GroupMembersDialog-->
<string name="GroupMembersDialog_me"></string>
@@ -377,7 +381,7 @@ tuto zálohu importovali, mohou se některé zprávy objevit vícekrát.</string
<string name="DeviceProvisioningActivity_content_progress_no_device">Nenalezeno žádné zařízení.</string>
<string name="DeviceProvisioningActivity_content_progress_network_error">Chyba sítě.</string>
<string name="DeviceProvisioningActivity_content_progress_key_error">Neplatný QR kód.</string>
<string name="DeviceProvisioningActivity_sorry_you_have_too_many_devices_linked_already">Omlouváme se, ale máte provázáno příliš mnoho zařízení, pokuste se některé odpojit...</string>
<string name="DeviceProvisioningActivity_sorry_you_have_too_many_devices_linked_already">Promiňte, ale máte příliš mnoho propojených zařízení, zkuste některá odstranit…</string>
<string name="DeviceActivity_sorry_this_is_not_a_valid_device_link_qr_code">Omlouváme se, ale toto není platný QR kód pro provázání zařízení</string>
<string name="DeviceProvisioningActivity_link_a_signal_device">Provázat zařízení Signal?</string>
<string name="DeviceProvisioningActivity_it_looks_like_youre_trying_to_link_a_signal_device_using_a_3rd_party_scanner">Zdá se se snažíte provázat zařízení Signal použitím jiné skennovací aplikace. Pro vaši ochranu, prosím oskenujete kód ještě jednou z aplikace Signal.</string>
@@ -635,7 +639,7 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.</string>
<!--device_link_fragment-->
<string name="device_link_fragment__link_device">Provázat zařízení</string>
<!--device_list_fragment-->
<string name="device_list_fragment__no_devices_linked">Žádná zařízení nejsou provázána...</string>
<string name="device_list_fragment__no_devices_linked">Žádná zařízení nejsou propojena…</string>
<string name="device_list_fragment__link_new_device">Provázat nové zařízení</string>
<!--experience_upgrade_activity-->
<string name="experience_upgrade_activity__continue">pokračovat</string>
@@ -832,7 +836,7 @@ Signal se nedočkal přijetí ověřovací SMS. </string>
<string name="AndroidManifest__media_overview">Všechny obrázky</string>
<string name="AndroidManifest__media_overview_named">Všechny obrázky s %1$s</string>
<string name="AndroidManifest__message_details">Podrobnosti zprávy</string>
<string name="AndroidManifest__linked_devices">Provázaná zařízení</string>
<string name="AndroidManifest__linked_devices">Propojená zařízení</string>
<string name="AndroidManifest__invite_friends">Pozvat přátele</string>
<string name="AndroidManifest_archived_conversations">Archivované konverzace</string>
<!--arrays.xml-->
@@ -941,11 +945,11 @@ Signal se nedočkal přijetí ověřovací SMS. </string>
<string name="preferences__conversation_length_limit">Limit délky konverzací</string>
<string name="preferences__trim_all_conversations_now">Zkrátit všechny konverzace teď</string>
<string name="preferences__scan_through_all_conversations_and_enforce_conversation_length_limits">Prohledat všechny konverzace a uplatnit limit délky.</string>
<string name="preferences__linked_devices">Provázaná zařízení</string>
<string name="preferences__linked_devices">Propojená zařízení</string>
<string name="preferences__light_theme">Světlý</string>
<string name="preferences__dark_theme">Tmavý</string>
<string name="preferences__appearance">Chování</string>
<string name="preferences__theme">Vzhled</string>
<string name="preferences__theme">Motiv</string>
<string name="preferences__default">Výchozí</string>
<string name="preferences__language">Jazyk</string>
<string name="preferences__signal_messages_and_calls">Signal zprávy a volání</string>

View File

@@ -145,7 +145,6 @@
<item quantity="one">At gemme denne fil på disk vil tillade alle andre apps at tilgå den.\n\nFortsæt?</item>
<item quantity="other">At gemme alle %1$d filer på disk vil tillade alle andre apps at tilgå dem.\n\nFortsæt?</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Fil lagring gennemført.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Kunne ikke skrive til lageret!</string>
<string name="ConversationFragment_collecting_attahments">Samler vedhæftninger...</string>
<string name="ConversationFragment_pending">Afventer...</string>

View File

@@ -153,7 +153,10 @@
<item quantity="one">Fehler beim Speichern des Anhangs im Gerätespeicher!</item>
<item quantity="other">Fehler beim Speichern der Anhänge im Gerätespeicher!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Datei erfolgreich gespeichert.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Datei erfolgreich gespeichert.</item>
<item quantity="other">Dateien erfolgreich gespeichert.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Kein Schreibzugriff auf Gerätespeicher!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Anhang speichern</item>

View File

@@ -64,6 +64,8 @@
<!--CallScreen-->
<string name="CallScreen_Incoming_call">Εισερχόμενη κλήση</string>
<!--ConfirmIdentityDialog-->
<string name="ConfirmIdentityDialog_your_safety_number_with_s_has_changed">Ο κωδικός ασφαλείας με τον/την %1$s έχει αλλάξει. Αυτό σημαίνει ότι είτε κάποιος προσπαθεί να υποκλέψει την συνομιλία σας είτε ο/η %2$s απλά επανενεργοποίησε το Signal.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact">Μήπως θα ήθελες να επιβεβαιώσεις τον κωδικό ασφαλείας σου για αυτή την επαφή;</string>
<string name="ConfirmIdentityDialog_accept">Αποδοχή</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">Μήνυμα %s</string>
@@ -155,7 +157,6 @@
<item quantity="one">Σφάλμα κατά την αποθήκευση του συνημμένου στην μνήμη!</item>
<item quantity="other">Σφάλμα κατά την αποθήκευση των συνημμένων στην μνήμη!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Το αρχείο αποθηκεύτηκε επιτυχώς.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Αδύνατη η εγγραφή στην μνήμη!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Το συνημμένο αποθηκεύεται</item>
@@ -204,6 +205,7 @@
<string name="CustomDefaultPreference_using_default">Χρησιμοποιείται το προκαθορισμένο: %s</string>
<string name="CustomDefaultPreference_none">Κανένα</string>
<!--DateUtils-->
<string name="DateUtils_just_now">Μόλις τώρα</string>
<string name="DateUtils_minutes_ago">%d λεπ</string>
<!--DeviceListActivity-->
<string name="DeviceListActivity_unlink_s">Αποσύνδεση του \'%s\';</string>
@@ -240,6 +242,7 @@
<string name="GcmRefreshJob_Permanent_Signal_communication_failure">Μόνιμη αποτυχία επικοινωνίας του Signal!</string>
<string name="GcmRefreshJob_Signal_was_unable_to_register_with_Google_Play_Services">Το Signal δεν μπόρεσε να εγγραφτεί στις Υπηρεσίες Google Play. Τα μηνύματα και οι κλήσεις του Signal έχουν απενεργοποιηθεί. Παρακαλώ προσπάθησε να επανεγγραφτείς στις Ρυθμίσεις &gt; Προχωρημένες Ρυθμίσεις.</string>
<!--GiphyActivity-->
<string name="GiphyActivity_error_while_retrieving_full_resolution_gif">Σφάλμα κατά τη λήψη της πλήρης ανάλυσης της κινούμενης εικόνας...</string>
<!--GiphyFragmentPageAdapter-->
<string name="GiphyFragmentPagerAdapter_gifs">GIFs</string>
<string name="GiphyFragmentPagerAdapter_stickers">Αυτοκόλλητα</string>
@@ -319,6 +322,7 @@
<string name="KeyScanningActivity_this_application_requires_barcode_scanner_would_you_like_to_install_it">Το Signal χρειάζεται την εφαρμογή Barcode Scanner για κωδικούς QR</string>
<!--MessageDetailsRecipient-->
<string name="MessageDetailsRecipient_failed_to_send">Αποτυχία αποστολής</string>
<string name="MessageDetailsRecipient_new_safety_number">Νέος κωδικός ασφαλείας</string>
<!--MmsDownloader-->
<string name="MmsDownloader_error_storing_mms">Σφάλμα κατά την αποθήκευση MMS! </string>
<string name="MmsDownloader_error_connecting_to_mms_provider">Σφάλμα κατά στη σύνδεση με τον πάροχο MMS...</string>
@@ -343,6 +347,9 @@
<string name="MessageRecord_called_s">Κλήση προς τον/την %s</string>
<string name="MessageRecord_missed_call_from">Αναπάντητη κλήση από τον/την %s</string>
<string name="MessageRecord_s_is_on_signal_say_hey">Ο/Η %s είναι στο Signal, πες ένα γεια!</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Ο χρόνος που όρισες για την εξαφάνιση του μηνύματος είναι %1$s.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s όρισε το χρόνο εξαφάνισης του μηνύματος τα %2$s.</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">Ο κωδικός ασφαλείας με τον/την %s έχει αλλάξει.</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">Τα συνθηματικά δε ταιριάζουν!</string>
<string name="PassphraseChangeActivity_incorrect_old_passphrase_exclamation">Λανθασμένο, παλιό συνθηματικό!</string>
@@ -469,6 +476,7 @@
</string>
<string name="SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version">
Ελήφθη μήνυμα ανταλλαγής κλειδιών για άκυρη έκδοση του πρωτόκολλου.</string>
<string name="SmsMessageRecord_received_message_with_new_safety_number_tap_to_process">Ελήφθη μήνυμα με καινούργιου κωδικό ασφαλείας. Αγγίξτε για προβολή.</string>
<string name="SmsMessageRecord_secure_session_reset">Επανεκκίνησες την ασφαλή συνεδρία.</string>
<string name="SmsMessageRecord_secure_session_reset_s">Ο/Η %s επανεκκίνησε την ασφαλή συνεδρία.</string>
<string name="SmsMessageRecord_duplicate_message">Διπλότυπο μήνυμα.</string>
@@ -482,8 +490,15 @@
<string name="ThreadRecord_media_message">Μήνυμα πολυμέσων</string>
<string name="ThreadRecord_s_is_on_signal_say_hey">Ο/Η %s είναι στο Signal, πές ένα γεια!</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Ο χρόνος εξαφάνισης μηνυμάτων ρυθμίστηκε σε %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Ο κωδικός ασφαλείας με τον/την %s έχει αλλάξει.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Η επαφή σας χρησιμοποιεί παλιά εκδοχή του Signal. Παρακαλούμε ζήτα του να ανανεώσει την εφαρμογή πριν επιβεβαιώσετε το κωδικό ασφαλείας.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Η επαφή σου χρησιμοποιεί μια νεότερη εκδοχή του Signal και ο κώδικας QR δεν έχει συμβατή μορφοποίηση. Παρακαλώ ενημερώστε την εφαρμογή.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Η μορφοποίηση του κώδικα QR που σαρώσατε δεν είναι σωστή για την επιβεβαίωση του κωδικού ασφαλείας. Παρακαλώ σαρώστε ξανά.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Μοιράσου τον κωδικό ασφαλείας μέσω...</string>
<string name="VerifyIdentityActivity_our_signal_safety_number">Ο κωδικός ασφαλείας μας:</string>
<string name="VerifyIdentityActivity_no_app_to_share_to">Φαινεται πως δεν έχεις κάποια εφαρμογή στην οποία μπορείς να μοιραστείς.</string>
<string name="VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard">Δεν βρέθηκε κωδικός ασφαλείας στο πρόχειρο για να γίνει σύγκριση</string>
<!--KeyExchangeInitiator-->
<string name="KeyExchangeInitiator_initiate_despite_existing_request_question">Εκκίνηση παρά το υπάρχον αίτημα;</string>
<string name="KeyExchangeInitiator_send">Αποστολή</string>
@@ -539,11 +554,19 @@
<string name="SingleRecipientNotificationBuilder_new_message">Νέο Μήνυμα</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Εικόνα</string>
<string name="attachment_type_selector__image_description">Εικόνα</string>
<string name="attachment_type_selector__audio">Ήχος</string>
<string name="attachment_type_selector__audio_description">Ήχος</string>
<string name="attachment_type_selector__video">Βίντεο</string>
<string name="attachment_type_selector__video_description">Βίντεο</string>
<string name="attachment_type_selector__contact">Επαφή</string>
<string name="attachment_type_selector__contact_description">Επαφή</string>
<string name="attachment_type_selector__camera">Κάμερα</string>
<string name="attachment_type_selector__camera_description">Κάμερα</string>
<string name="attachment_type_selector__location">Τοποθεσία</string>
<string name="attachment_type_selector__location_description">Τοποθεσία</string>
<string name="attachment_type_selector__gif">Κινούμενη εικόνα</string>
<string name="attachment_type_selector__gif_description">Κινούμενη εικόνα</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Παλιό συνθηματικό</string>
<string name="change_passphrase_activity__new_passphrase">Νέο συνθηματικό</string>
@@ -574,6 +597,8 @@
<string name="conversation_activity__compose_description">Σύνθεση μηνύματος</string>
<string name="conversation_activity__emoji_toggle_description">Εναλλαγή πληκτρολογίου emoji</string>
<string name="conversation_activity__attachment_thumbnail">Μικρογραφία συνημμένου</string>
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">Ηχογράφησε και στείλε το συνημμένο αρχείο ήχου</string>
<string name="conversation_activity__enable_signal_for_sms">Ενεργοποίησε το Signal για SMS</string>
<!--conversation_input_panel-->
<string name="conversation_input_panel__slide_to_cancel">ΣΥΡΕ ΓΙΑ ΑΚΥΡΩΣΗ</string>
<!--conversation_item-->
@@ -591,6 +616,9 @@
<string name="conversation_item_received__contact_photo_description">Φωτογραφία επαφής</string>
<string name="conversation_item_received__downloading">Γίνεται λήψη</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Αναπαραγωγή</string>
<string name="audio_view__pause_accessibility_description">Παύση</string>
<string name="audio_view__download_accessibility_description">Λήψη</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Λειτουργία μαζικής επιλογής</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s επιλέχτηκαν</string>
@@ -636,6 +664,7 @@
<!--giphy_activity-->
<string name="giphy_activity_toolbar__search_gifs_and_stickers">Αναζήτηση GIFs και αυτοκολλήτων</string>
<!--giphy_fragment-->
<string name="giphy_fragment__nothing_found">Δεν βρέθηκε</string>
<!--log_submit_activity-->
<string name="log_submit_activity__log_fetch_failed">Αποτυχία ανάγνωσης αρχείου συμβάντων για τη συσκευή σου. Μπορείς να χρησιμοποιήσεις το ADB για να πάρεις ένα αρχείο συμβάντων αποσφαλμάτωσης.</string>
<string name="log_submit_activity__thanks">Ευχαριστούμε για τη βοήθειά σου!</string>
@@ -695,6 +724,7 @@
<string name="recipient_preferences__block">Μπλοκάρισμα</string>
<string name="recipient_preferences__color">Χρώμα</string>
<string name="recipient_preferences__color_for_this_contact">Χρώμα επαφής</string>
<string name="recipient_preferences__verify_safety_number">Επαλήθευση κωδικού ασφαλείας</string>
<!--- redphone_call_controls-->
<string name="redphone_call_card__signal_call">Κλήση Signal</string>
<string name="redphone_call_controls__end_call">τερματισμός κλήσης</string>
@@ -774,8 +804,11 @@
<string name="recipients_panel__to"><small>Εισαγωγή ονόματος ή αριθμού</small></string>
<string name="recipients_panel__add_members">Προσθήκη μελών</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment__if_you_wish_to_verify_the_security_of_your_end_to_end_encryption_with_s"><![CDATA[Αν θέλεις να επιβεβαιώσεις την ασφάλεια της κρυπτογράφισης από άκρο σε άκρο %s, σύγκρινε τον παρακάτω αριθμό με τον αριθμό στην συσκευή. Αλλιώς, μπορείς Alternatively, you can scan the code on their phone, or ask them to scan your code. <a href=\"https://whispersystems.org/redirect/safety-numbers\">Learn more about verifying safety numbers</a>]]>
Μάθε περισσότερα για την επιβεβαίωση του κωδικού ασφαλείας</string>
<string name="verify_display_fragment__tap_to_scan">Πάτα για σκανάρισμα</string>
<!--verify_identity-->
<string name="verify_identity__share_safety_number">Μοιράσου τον κωδικό ασφαλείας</string>
<!--message_details_header-->
<string name="message_details_header__issues_need_your_attention">Ορισμένα ζητήματα χρειάζονται την προσοχή σου.</string>
<string name="message_details_header__sent">Στάλθηκε στις</string>
@@ -791,6 +824,7 @@
<string name="AndroidManifest__select_contacts">Επιλογή επαφών</string>
<string name="AndroidManifest__signal_detected">Το Signal εντοπίστηκε</string>
<string name="AndroidManifest__change_passphrase">Αλλαγή συνθηματικού</string>
<string name="AndroidManifest__verify_safety_number">Επαλήθευση κωδικού ασφαλείας</string>
<string name="AndroidManifest__log_submit">Αποστολή αρχείου συμβάντων αποσφαλμάτωσης</string>
<string name="AndroidManifest__media_preview">Προεπισκόπιση</string>
<string name="AndroidManifest__media_overview">Όλες οι εικόνες</string>
@@ -1008,6 +1042,8 @@
<string name="text_secure_normal__invite_friends">Πρόσκληση φίλων</string>
<string name="text_secure_normal__help">Βοήθεια</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment_context_menu__copy_to_clipboard">Αντιγραφή</string>
<string name="verify_display_fragment_context_menu__compare_with_clipboard">Σύγκρινε με το πρόχειρο</string>
<!--reminder_header-->
<string name="reminder_header_outdated_build">Η έκδοση του Signal σου είναι παρωχημένη</string>
<plurals name="reminder_header_outdated_build_details">
@@ -1040,6 +1076,8 @@
<string name="MediaPreviewActivity_unssuported_media_type">Μη υποστηριζόμενος τύπος μέσων ενημέρωσης</string>
<!--media_preview-->
<string name="media_preview__save_title">Αποθήκευση</string>
<string name="media_preview__forward_title">Προώθηση</string>
<string name="media_preview__overview_title">Όλες οι εικόνες</string>
<!--media_overview-->
<string name="media_overview__save_all">Αποθήκευση όλων</string>
<!--media_preview_activity-->

View File

@@ -157,7 +157,10 @@ Recibido:%4$s</string>
<item quantity="one">¡Error al guardar adjunto en el almacenamiento!</item>
<item quantity="other">¡Error al guardar adjuntos en el almacenamiento!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Archivo guardado con éxito.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Fichero guardado con éxito</item>
<item quantity="other">Ficheros guardados con éxito</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">¡No se pudo escribir en el almacenamiento!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Guardando adjunto</item>

View File

@@ -152,7 +152,6 @@
<item quantity="one">Errorea eranskina biltegian gordetzerakoan!</item>
<item quantity="other">Errorea eranskinak biltegian gordetzerakoan!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Fitxategia ondo gorde da.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Ezgai biltegian idazteko!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Eranskina gordetzen</item>

View File

@@ -143,7 +143,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">خطا در هنگام ذخیره سازی فایل ضمیمه</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">فایل با موفقیت ذخیره شد.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">قادر نیست به ارسال به ذخیره سازی!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">در حال ذخیره‌ی %1$d پیوست</item>

View File

@@ -157,7 +157,10 @@ Vastaanotettu: %4$s</string>
<item quantity="one">Virhe tallennettaessa liitetiedostoa laitteesi tallennustilaan!</item>
<item quantity="other">Virhe tallennettaessa liitetiedostoja laitteesi tallennustilaan!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Tiedoston tallennus onnistui.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Tiedoston tallennus onnistui.</item>
<item quantity="other">Tiedostojen tallennus onnistui.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Tallennustilaan kirjoitus epäonnistui!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Tallennetaan liitetiedostoa</item>

View File

@@ -37,7 +37,7 @@
<string name="ApplicationPreferencesActivity_off">off</string>
<string name="ApplicationPreferencesActivity_Off">Off</string>
<string name="ApplicationPreferencesActivity_sms_mms_summary">SMS %1$s, MMS %2$s</string>
<string name="ApplicationPreferencesActivity_privacy_summary">Phrase secrète %1$s, Sécurité de l\'écran %2$s</string>
<string name="ApplicationPreferencesActivity_privacy_summary">Phrase de passe %1$s, Sécurité de l\'écran %2$s</string>
<string name="ApplicationPreferencesActivity_appearance_summary">Thème %1$s, Langage %2$s</string>
<!--AppProtectionPreferenceFragment-->
<plurals name="AppProtectionPreferenceFragment_minutes">
@@ -64,6 +64,8 @@
<!--CallScreen-->
<string name="CallScreen_Incoming_call">Appel entrant</string>
<!--ConfirmIdentityDialog-->
<string name="ConfirmIdentityDialog_your_safety_number_with_s_has_changed">Vos numéros de sécurité avec %1$s ont changé. Cela pourrait signifier que quelqu\'un essaie d\'intercepter votre communication, ou que %2$s a simplement réinstallé Signal.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact">Vous pouvez vérifier vos numéros de sécurité avec ce contact.</string>
<string name="ConfirmIdentityDialog_accept">Accepter</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">Message %s</string>
@@ -73,7 +75,7 @@
<string name="ConversationItem_expires_s">Expire : %s</string>
<string name="ConversationItem_error_not_delivered">Non délivré</string>
<string name="ConversationItem_view_secure_media_question">Visualiser le média sécurisé ?</string>
<string name="ConversationItem_this_media_has_been_stored_in_an_encrypted_database_external_viewer_warning">Ce média est enregistré dans une base de données chiffrée. Pour l\'ouvrir avec une autre application, il doit être temporairement déchiffré et enregistré sur cet appareil ! Êtes-vous certain de vouloir continuer ?</string>
<string name="ConversationItem_this_media_has_been_stored_in_an_encrypted_database_external_viewer_warning">Ce média est enregistré dans une base de données chiffrée. Malheureusement, pour l\'ouvrir avec une autre application, il doit être temporairement déchiffré et enregistré sur cet appareil . Êtes-vous certain de vouloir continuer ?</string>
<string name="ConversationItem_error_received_stale_key_exchange_message">Erreur, un message déchange de clés périmé a été reçu.</string>
<string name="ConversationItem_received_key_exchange_message_tap_to_process">Un message déchange de clés a été reçu. Appuyer pour le traiter.</string>
<string name="ConversationItem_group_action_left">%1$s a quitté le groupe.</string>
@@ -129,7 +131,7 @@
<string name="ConversationActivity_quick_camera_unavailable">Appareil photo non disponible</string>
<string name="ConversationActivity_unable_to_record_audio">Impossible d\'enregistrer l\'audio !</string>
<string name="ConversationActivity_error_sending_voice_message">Erreur lors de l\'envoi du message vocal...</string>
<string name="ConversationActivity_there_is_no_app_available_to_handle_this_link_on_your_device">Il n\'y a pas d\'appli disponible pour ouvrir ce lien sur votre appareil.</string>
<string name="ConversationActivity_there_is_no_app_available_to_handle_this_link_on_your_device">Il n\'y a pas d\'application disponible pour ouvrir ce lien sur votre appareil.</string>
<!--ConversationFragment-->
<string name="ConversationFragment_message_details">Détails du message</string>
<string name="ConversationFragment_transport_s_sent_received_s">Transport: %1$s\nEnvoyé/Reçu: %2$s</string>
@@ -151,7 +153,6 @@
<item quantity="one">Erreur lors de l\'enregistrement de la pièce jointe sur l\'espace de stockage !</item>
<item quantity="other">Erreur lors de l\'enregistrement des pièces jointes dans l\'espace de stockage !</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Enregistrement du fichier réussi.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Impossible décrire dans l\'espace de stockage !</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Enregistrement de la pièce jointe</item>
@@ -311,6 +312,7 @@ l\'importer à nouveau se traduira par des messages dupliqués.</string>
<string name="KeyScanningActivity_this_application_requires_barcode_scanner_would_you_like_to_install_it">Signal a besoin de Barcode Scanner pour les QR codes.</string>
<!--MessageDetailsRecipient-->
<string name="MessageDetailsRecipient_failed_to_send">Échec de lenvoi</string>
<string name="MessageDetailsRecipient_new_safety_number">Nouveau numéro de sécurité</string>
<!--MmsDownloader-->
<string name="MmsDownloader_error_storing_mms">Erreur denregistrement du MMS !</string>
<string name="MmsDownloader_error_connecting_to_mms_provider">Erreur de connexion au fournisseur MMS…</string>
@@ -337,6 +339,7 @@ l\'importer à nouveau se traduira par des messages dupliqués.</string>
<string name="MessageRecord_s_is_on_signal_say_hey">%s est sur Signal, dites-lui bonjour !</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Vous avez choisi %1$s comme heure de disparition du message.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s a choisi %2$s comme heure de disparition du message.</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">Votre numéro de sécurité avec %s a changé</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">Les phrases de passe ne correspondent pas !</string>
<string name="PassphraseChangeActivity_incorrect_old_passphrase_exclamation">Ancienne phrase de passe incorrecte !</string>
@@ -464,6 +467,7 @@ cet appareil n\'est pas supporté pour la messagerie sur le canal de données. L
Message d\'échange!</string>
<string name="SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version">
Réception d\'un message d\'échange de clés pour une version invalide du protocole.</string>
<string name="SmsMessageRecord_received_message_with_new_safety_number_tap_to_process">Un message avec de nouveaux numéros de sécurité a été reçu. Cliquez pour l\'accepter et l\'afficher.</string>
<string name="SmsMessageRecord_secure_session_reset">Vous avez réinitialisé la session sécurisée.</string>
<string name="SmsMessageRecord_secure_session_reset_s">%s a réinitialisé la session sécurisée.</string>
<string name="SmsMessageRecord_duplicate_message">Message doublon.</string>
@@ -477,9 +481,15 @@ Réception d\'un message d\'échange de clés pour une version invalide du proto
<string name="ThreadRecord_media_message">Message média</string>
<string name="ThreadRecord_s_is_on_signal_say_hey">%s est sur Signal, dites-lui bonjour !</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Le temps de disparition des messages a été réglé à %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Votre numéro de sécurité avec %s a changé</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Votre contact exécute une ancienne version de Signal. Veuillez lui demander de mettre à jour Signal avant de vérifier le numéro de sécurité.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Votre contact utilise une version plus récente de Signal, avec un format de QR code incompatible. Mettez votre application à jour pour comparer.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Le code QR scanné n\'est pas valide. Essayez de le scanner de nouveau.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Partager les numéros de sécurité via...</string>
<string name="VerifyIdentityActivity_our_signal_safety_number">Vos numéros de sécurité Signal :</string>
<string name="VerifyIdentityActivity_no_app_to_share_to">Il semble n\'y avoir aucune application pour partager ce contenu.</string>
<string name="VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard">Aucun numéro de sécurité à comparer n\'a été trouvé dans le presse-papiers</string>
<!--KeyExchangeInitiator-->
<string name="KeyExchangeInitiator_initiate_despite_existing_request_question">Initier malgré la demande existante ?</string>
<string name="KeyExchangeInitiator_send">Envoyer</string>
@@ -535,11 +545,20 @@ Réception d\'un message d\'échange de clés pour une version invalide du proto
<string name="SingleRecipientNotificationBuilder_new_message">Nouveau message</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Image</string>
<string name="attachment_type_selector__image_description">Image</string>
<string name="attachment_type_selector__audio">Audio</string>
<string name="attachment_type_selector__audio_description">Audio</string>
<string name="attachment_type_selector__video">Vidéo</string>
<string name="attachment_type_selector__video_description">Vidéo</string>
<string name="attachment_type_selector__contact">Contact</string>
<string name="attachment_type_selector__contact_description">Contact</string>
<string name="attachment_type_selector__camera">Appareil photo</string>
<string name="attachment_type_selector__camera_description">Appareil photo</string>
<string name="attachment_type_selector__location">Lieu</string>
<string name="attachment_type_selector__location_description">Lieu</string>
<string name="attachment_type_selector__gif">GIFs</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<string name="attachment_type_selector__drawer_description">Afficher l\'accès rapide aux pièces jointes</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Ancienne phrase de passe</string>
<string name="change_passphrase_activity__new_passphrase">Nouvelle phrase de passe</string>
@@ -570,6 +589,8 @@ Réception d\'un message d\'échange de clés pour une version invalide du proto
<string name="conversation_activity__compose_description">Composition du message</string>
<string name="conversation_activity__emoji_toggle_description">Activer le clavier emoji</string>
<string name="conversation_activity__attachment_thumbnail">Vignette de pièce jointe</string>
<string name="conversation_activity__quick_attachment_drawer_toggle_camera_description">Afficher l\'accès rapide à l\'appareil photo</string>
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">Enregistrer et envoyer un fichier audio</string>
<string name="conversation_activity__enable_signal_for_sms">Activer les SMS dans Signal</string>
<!--conversation_input_panel-->
<string name="conversation_input_panel__slide_to_cancel">GLISSEZ POUR ANNULER</string>
@@ -588,6 +609,9 @@ Réception d\'un message d\'échange de clés pour une version invalide du proto
<string name="conversation_item_received__contact_photo_description">Photo de contact</string>
<string name="conversation_item_received__downloading">Téléchargement</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Lire</string>
<string name="audio_view__pause_accessibility_description">Pause</string>
<string name="audio_view__download_accessibility_description">Téléchargement</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Mode de sélection par lot</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s sélectionné</string>
@@ -694,6 +718,7 @@ Les paramètres MMS de votre opérateur peuvent généralement être obtenus en
<string name="recipient_preferences__block">Bloquer</string>
<string name="recipient_preferences__color">Couleur</string>
<string name="recipient_preferences__color_for_this_contact">Couleur pour ce contact</string>
<string name="recipient_preferences__verify_safety_number">Vérification des numéros de sécurité</string>
<!--- redphone_call_controls-->
<string name="redphone_call_card__signal_call">Appel Signal</string>
<string name="redphone_call_controls__end_call">Terminer l\'appel</string>
@@ -764,8 +789,10 @@ par SMS.</string>
<string name="recipients_panel__to"><small>Entrez un nom ou un numéro</small></string>
<string name="recipients_panel__add_members">Ajouter des membres</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment__if_you_wish_to_verify_the_security_of_your_end_to_end_encryption_with_s"><![CDATA[Si vous voulez verifier la securité du chiffrement de bout en bout avec %s, comparez les numéros ci-dessus avec les numéros sur son appareil. Vous pouvez également scanner le code sur son téléphone, ou lui demander de scanner votre code. <a href=\"https://whispersystems.org/redirect/safety-numbers\">En savoir plus sur les numéros de sécurité</a>.]]></string>
<string name="verify_display_fragment__tap_to_scan">Appuyer pour scanner</string>
<!--verify_identity-->
<string name="verify_identity__share_safety_number">Partager les numéros de sécurité</string>
<!--message_details_header-->
<string name="message_details_header__issues_need_your_attention">Des problèmes requièrent votre attention.</string>
<string name="message_details_header__sent">Envoyé</string>
@@ -781,6 +808,7 @@ par SMS.</string>
<string name="AndroidManifest__select_contacts">Sélectionner des contacts</string>
<string name="AndroidManifest__signal_detected">Signal détecté</string>
<string name="AndroidManifest__change_passphrase">Modifier la phrase de passe</string>
<string name="AndroidManifest__verify_safety_number">Vérification des numéros de sécurité</string>
<string name="AndroidManifest__log_submit">Envoyer un rapport de débogage</string>
<string name="AndroidManifest__media_preview">Aperçu du média</string>
<string name="AndroidManifest__media_overview">Toutes les images</string>
@@ -1033,6 +1061,7 @@ par SMS.</string>
<!--media_preview-->
<string name="media_preview__save_title">Enregistrer</string>
<string name="media_preview__forward_title">Suivant</string>
<string name="media_preview__overview_title">Toutes les images</string>
<!--media_overview-->
<string name="media_overview__save_all">Tout sauvegarder</string>
<!--media_preview_activity-->

View File

@@ -140,7 +140,6 @@
<item quantity="one">Erro ao gardar o anexo no almacenamento!</item>
<item quantity="other">Erro ao gardar os anexos no almacenamento!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Ficheiro gardado satisfactoriamente.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Non é posible escribir no almacenamento!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Gardando anexo</item>

View File

@@ -161,7 +161,11 @@
<item quantity="few">Greška prilikom spremanja privitaka na disk!</item>
<item quantity="other">Greška prilikom spremanja privitaka na disk!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Datoteka uspješno spremljena.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Datoteka uspješno spremljena.</item>
<item quantity="few">Datoteke uspješno spremljene.</item>
<item quantity="other">Datoteke uspješno spremljene.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Nije moguće pisati na disk!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Spremanje privitaka</item>
@@ -506,6 +510,7 @@ Primljena poruka razmjene ključeva za pogrešnu inačicu protokola.</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Vrijeme nestajanja poruke postavljeno na %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Vaš sigurnosni broj s %s je izmjenjen.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Vaš kontakt koristi stariju Signal inačicu. Zamolite ih da ažuriraju Signal prije provjere sigurnosnog broja.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Vaš kontakt koristi noviju Signal inačicu s nekompatibilnim QR kod oblikom. Ažurirajte vašu inačicu kako biste usporedili.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Skenirani QR kod nije ispravno oblikovan sigurnosni broj za provjeru. Pokušajte ponovno skenirati broj.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Podijelite sigurnosni broj putem...</string>
@@ -567,11 +572,20 @@ Primljena poruka razmjene ključeva za pogrešnu inačicu protokola.</string>
<string name="SingleRecipientNotificationBuilder_new_message">Nova poruka</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Slika</string>
<string name="attachment_type_selector__image_description">Slika</string>
<string name="attachment_type_selector__audio">Zvuk</string>
<string name="attachment_type_selector__audio_description">Zvuk</string>
<string name="attachment_type_selector__video">Video</string>
<string name="attachment_type_selector__video_description">Video</string>
<string name="attachment_type_selector__contact">Kontakt</string>
<string name="attachment_type_selector__contact_description">Kontakt</string>
<string name="attachment_type_selector__camera">Kamera</string>
<string name="attachment_type_selector__camera_description">Kamera</string>
<string name="attachment_type_selector__location">Položaj</string>
<string name="attachment_type_selector__location_description">Položaj</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<string name="attachment_type_selector__drawer_description">Uključi/isključi ladicu dodataka</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Stara lozinka</string>
<string name="change_passphrase_activity__new_passphrase">Nova lozinka</string>
@@ -622,6 +636,9 @@ Primljena poruka razmjene ključeva za pogrešnu inačicu protokola.</string>
<string name="conversation_item_received__contact_photo_description">Slika kontakta</string>
<string name="conversation_item_received__downloading">Preuzimanje</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Reprodukcija</string>
<string name="audio_view__pause_accessibility_description">Zaustavi</string>
<string name="audio_view__download_accessibility_description">Preuzmi</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Način za višestruki odabir</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s odabrano</string>

View File

@@ -155,7 +155,6 @@
<item quantity="one">Hiba történt a melléklet tárolóra mentése közben!</item>
<item quantity="other">Hiba történt a mellékletek tárolóra mentése közben!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">A fájl sikeresen mentve.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Nem lehet írni a tárolóra!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Melléklet mentése</item>

View File

@@ -61,6 +61,8 @@
<!--CallScreen-->
<string name="CallScreen_Incoming_call">Panggilan masuk</string>
<!--ConfirmIdentityDialog-->
<string name="ConfirmIdentityDialog_your_safety_number_with_s_has_changed">Angka keamananmu dengan %1$s telah berubah. Ini bisa disebabkan adanya seseorang yang mencoba mencegat komunikasi anda, atau dikarenakan %2$s telah memasang ulang Signal.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact">Mungkin sebaiknya anda memastikan angka keamanan dengan kontak ini.</string>
<string name="ConfirmIdentityDialog_accept">Terima</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">Pesan %s</string>
@@ -119,6 +121,7 @@
<string name="ConversationActivity_mms_not_supported_message">Pesan ini tidak bisa dikirimkan karena penyedia layanan seluler Anda tidak mendukung MMS.</string>
<string name="ConversationActivity_specify_recipient">Silahkan pilih kontak</string>
<string name="ConversationActivity_unblock_this_contact_question">Buka blokir kontak ini?</string>
<string name="ConversationActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">Anda kembali dapat menerima pesan dan panggilan dari kontak ini.</string>
<string name="ConversationActivity_unblock">Buka blokir</string>
<string name="ConversationActivity_attachment_exceeds_size_limits">Lampiran melebihi batas ukuran untuk tipe pesan yang Anda kirimkan.</string>
<string name="ConversationActivity_quick_camera_unavailable">Kamera tidak tersedia</string>
@@ -142,7 +145,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">Terjadi kesalahan saat menyimpan lampiran ke penyimpanan!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">File berhasil disimpan</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Tidak bisa menyimpan ke penyimpanan!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">Menyimpan %1$d lampiran</item>
@@ -159,6 +161,7 @@
<string name="ConversationFragment_deleting_messages">Menghapus pesan...</string>
<!--ConversationListActivity-->
<string name="ConversationListActivity_search">Cari...</string>
<string name="ConversationListActivity_there_is_no_browser_installed_on_your_device">Tidak ada browser terpasang pada alat anda.</string>
<!--ConversationListFragment-->
<plurals name="ConversationListFragment_delete_selected_conversations">
<item quantity="other">Hapus percakapan terpilih?</item>
@@ -184,6 +187,7 @@
<string name="CustomDefaultPreference_using_default">Gunakan bawaan: %s</string>
<string name="CustomDefaultPreference_none">Kosong</string>
<!--DateUtils-->
<string name="DateUtils_just_now">Baru saja</string>
<string name="DateUtils_minutes_ago">%d mnt</string>
<!--DeviceListActivity-->
<string name="DeviceListActivity_unlink_s">Buang kaitan \'%s\'?</string>
@@ -220,6 +224,7 @@
<string name="GcmRefreshJob_Permanent_Signal_communication_failure">Kegagalan permanen komunikasi Signal!</string>
<string name="GcmRefreshJob_Signal_was_unable_to_register_with_Google_Play_Services">Signal tidak dapat melakukan registrasi dengan Layanan Google Play. Fitur Signal seperti pesan dan panggilan di nonaktifkan, mohon registrasi ulang melalui Pengaturan</string>
<!--GiphyActivity-->
<string name="GiphyActivity_error_while_retrieving_full_resolution_gif">Kesalahan terjadi saat mengambil GIF beresolusi penuh...</string>
<!--GiphyFragmentPageAdapter-->
<!--GroupCreateActivity-->
<string name="GroupCreateActivity_actionbar_title">Grup baru</string>
@@ -281,6 +286,9 @@ telah mengimport basis data sistem SMS, hal ini akan menyebabkan adanya duplikas
<string name="InviteActivity_heart_content_description">Hati</string>
<string name="InviteActivity_invitations_sent">Undangan dikirim!</string>
<string name="InviteActivity_invite_to_signal">Undang ke Signal!</string>
<plurals name="InviteActivity_send_sms_to_friends">
<item quantity="other">KIRIM SMS KEPADA %d TEMAN</item>
</plurals>
<plurals name="InviteActivity_send_sms_invites">
<item quantity="other">Kirim %d SMS undangan?</item>
</plurals>
@@ -293,6 +301,7 @@ telah mengimport basis data sistem SMS, hal ini akan menyebabkan adanya duplikas
<string name="KeyScanningActivity_this_application_requires_barcode_scanner_would_you_like_to_install_it">Signal membutuhkan Barcode Scanner untuk kode QR.</string>
<!--MessageDetailsRecipient-->
<string name="MessageDetailsRecipient_failed_to_send">Gagal mengirim</string>
<string name="MessageDetailsRecipient_new_safety_number">Angka keamanan baru</string>
<!--MmsDownloader-->
<string name="MmsDownloader_error_storing_mms">Kesalahan dalam menyimpan MMS!</string>
<string name="MmsDownloader_error_connecting_to_mms_provider">Kesalahan dalam menghubungi penyedia layanan MMS...</string>
@@ -317,6 +326,7 @@ telah mengimport basis data sistem SMS, hal ini akan menyebabkan adanya duplikas
<string name="MessageRecord_called_s">Memanggil %s</string>
<string name="MessageRecord_missed_call_from">Panggilan tak terjawab dari %s</string>
<string name="MessageRecord_s_is_on_signal_say_hey">%s ada di Signal, katakan halo!</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">Angka keamanan anda dengan %s telah berubah.</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">Frasa sandi tidak cocok!</string>
<string name="PassphraseChangeActivity_incorrect_old_passphrase_exclamation">Kata kunci lama salah!</string>
@@ -342,6 +352,7 @@ telah mengimport basis data sistem SMS, hal ini akan menyebabkan adanya duplikas
<string name="DeviceProvisioningActivity_link_a_signal_device">Kaitkan perangkat Signal?</string>
<string name="DeviceProvisioningActivity_it_looks_like_youre_trying_to_link_a_signal_device_using_a_3rd_party_scanner">Sepertinya Anda mencoba untuk menghubungkan perangkat Signal menggunakan pemindai pihak ke-3. Untuk perlindungan Anda, mohon memindai kode lagi dari Signal.</string>
<!--ExpirationDialog-->
<string name="ExpirationDialog_your_messages_will_not_expire">Pesan anda tidak akan kadaluarsa.</string>
<string name="ExpirationDialog_your_messages_will_disappear_s_after_they_have_been_seen">Pesan terkirim dan diterima pada percakapan ini akan lenyap %s setelah dibaca.</string>
<!--PassphrasePromptActivity-->
<string name="PassphrasePromptActivity_enter_passphrase">Masukkan frasa sandi</string>
@@ -356,10 +367,13 @@ telah mengimport basis data sistem SMS, hal ini akan menyebabkan adanya duplikas
<string name="RatingManager_rate_now">Nilai sekarang!</string>
<string name="RatingManager_no_thanks">Tidak, terima kasih</string>
<string name="RatingManager_later">Nanti</string>
<string name="RatingManager_whoops_the_play_store_app_does_not_appear_to_be_installed">Eiittts, aplikasi Play Store nampaknya tidak terpasang pada perangkat anda.</string>
<!--RecipientPreferencesActivity-->
<string name="RecipientPreferenceActivity_block_this_contact_question">Blokir kontak ini?</string>
<string name="RecipientPreferenceActivity_you_will_no_longer_receive_messages_and_calls_from_this_contact">Anda tidak akan lagi menerima pesan dan panggilan dari kontak ini.</string>
<string name="RecipientPreferenceActivity_block">Blokir</string>
<string name="RecipientPreferenceActivity_unblock_this_contact_question">Buka blokir kontak ini?</string>
<string name="RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">Anda kembali dapat menerima pesan dan panggilan dari kontak ini.</string>
<string name="RecipientPreferenceActivity_unblock">Buka blokir</string>
<string name="RecipientPreferenceActivity_enabled">Aktif</string>
<string name="RecipientPreferenceActivity_disabled">Nonaktif</string>
@@ -456,6 +470,7 @@ Diterima pesan pertukaran kunci untuk versi protokol yang tidak valid.
<string name="ThreadRecord_missed_call">Panggilan tak terjawab</string>
<string name="ThreadRecord_media_message">Pesan media</string>
<string name="ThreadRecord_s_is_on_signal_say_hey">%s ada di Signal, katakan halo!</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Angka keamanan anda dengan %s telah berubah.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_no_app_to_share_to">Sepertinya Anda tidak memiliki aplikasi untuk berbagi.</string>
<!--KeyExchangeInitiator-->
@@ -641,6 +656,7 @@ Diterima pesan pertukaran kunci untuk versi protokol yang tidak valid.
<string name="recipient_preferences__block">Blokir</string>
<string name="recipient_preferences__color">Warna</string>
<string name="recipient_preferences__color_for_this_contact">Warna untuk kontak ini</string>
<string name="recipient_preferences__verify_safety_number">Periksa angka keamanan</string>
<!--- redphone_call_controls-->
<string name="redphone_call_card__signal_call">Panggilan Signal</string>
<string name="redphone_call_controls__end_call">akhiri panggilan</string>
@@ -743,6 +759,7 @@ gagal
<string name="AndroidManifest__select_contacts">Pilih kontak</string>
<string name="AndroidManifest__signal_detected">Signal terdeteksi</string>
<string name="AndroidManifest__change_passphrase">Ganti Kata Kunci</string>
<string name="AndroidManifest__verify_safety_number">Periksa angka keamanan</string>
<string name="AndroidManifest__log_submit">Kirim debug log</string>
<string name="AndroidManifest__media_preview">Pratinjau media</string>
<string name="AndroidManifest__media_overview">Semua gambar</string>

View File

@@ -153,7 +153,6 @@
<item quantity="one">Errore nel salvare l\'allegato in memoria!</item>
<item quantity="other">Errore nel salvare gli allegati in memoria!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">File salvato correttamente.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Impossibile scrivere sulla memoria!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Salvataggio allegato</item>
@@ -487,6 +486,7 @@ Ricevuto un messaggio di scambio chiavi per una versione di protocollo non valid
<string name="ThreadRecord_disappearing_message_time_updated_to_s">La scomparsa dei messaggi è settata a %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Il tuo numero sicuro con %s è cambiato.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Il tuo contatto sta usando una vecchia versione di Signal. Chiedigli cortesemente di aggiornarla prima di verificare il tuo numero sicuro.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Il tuo contatto sta eseguendo una versione più aggiornata di Signal con un formato di codice QR non compatibile. Per effettuare il confronto aggiorna la tua versione.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Il codice QR letto non è un codice di verifica formalmente valido per un numero sicuro. Si prega di rieseguire la scansione.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Condividi numero sicuro tramite...</string>
@@ -548,11 +548,19 @@ Ricevuto un messaggio di scambio chiavi per una versione di protocollo non valid
<string name="SingleRecipientNotificationBuilder_new_message">Nuovo messaggio</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Immagine</string>
<string name="attachment_type_selector__image_description">Immagine</string>
<string name="attachment_type_selector__audio">Audio</string>
<string name="attachment_type_selector__audio_description">Audio</string>
<string name="attachment_type_selector__video">Video</string>
<string name="attachment_type_selector__video_description">Video</string>
<string name="attachment_type_selector__contact">Contatto</string>
<string name="attachment_type_selector__contact_description">Contatto</string>
<string name="attachment_type_selector__camera">Fotocamera</string>
<string name="attachment_type_selector__camera_description">Fotocamera</string>
<string name="attachment_type_selector__location">Posizione</string>
<string name="attachment_type_selector__location_description">Posizione</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Vecchia password</string>
<string name="change_passphrase_activity__new_passphrase">Nuova password</string>
@@ -602,6 +610,9 @@ Ricevuto un messaggio di scambio chiavi per una versione di protocollo non valid
<string name="conversation_item_received__contact_photo_description">Foto del contatto</string>
<string name="conversation_item_received__downloading">Caricamento in corso</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Play</string>
<string name="audio_view__pause_accessibility_description">Pausa</string>
<string name="audio_view__download_accessibility_description">Scarica</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Modalità di selezione di gruppo</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s selezionati</string>

View File

@@ -153,7 +153,6 @@
<item quantity="one">שגיאה בעת שמירת הצרופה לאחסון!</item>
<item quantity="other">שגיאה בעת שמירת הצרופות לאחסון!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">הקובץ נשמר בהצלחה.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">לא ניתן לכתוב לאחסון!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">שמירת צרופה</item>

View File

@@ -145,7 +145,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">添付ファイルを外部メモリに保存する際にエラー発生!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">ファイルの保存完了</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">外部メモリに書き込めませんでした</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">%1$d個の添付ファイルを保存</item>

View File

@@ -134,7 +134,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">ಸಂಗ್ರಹಕ್ಕೆ ಲಗತ್ತನ್ನು ಉಳಿಸುವಾಗ ತೊಡಕಾಗಿದೆ!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">ಕಡತವನ್ನು ಉಳಿಸಲಾಗಿದೆ.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">ಸಂಗ್ರಹಕ್ಕೆ ಬರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">%1$d ಲಗತ್ತನ್ನು ಉಳಿಸಲಾಗುತ್ತಿದೆ</item>

View File

@@ -142,7 +142,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">첨부파일 저장 오류 발생</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">첨부파일 저장됨</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">저장소에 저장할 수 없음</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">첨부파일 %1$d개 저장</item>

View File

@@ -140,7 +140,6 @@ a</string>
<item quantity="one">Ensobi mu kutereka ebigatiddwako mu terekero</item>
<item quantity="other">Ensobi mu kutereka ebigatiddwako mu terekero</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">fayilo eterekedwa bulungi.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">tesisobose kuwandiikira terekero</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">ekigatibwaako kiterekebwa</item>

View File

@@ -152,7 +152,6 @@
<item quantity="one">Det oppstod en feil under lagring av vedlegg som vanlig fil.</item>
<item quantity="other">Det oppstod en feil under lagring av vedlegg som vanlige filer.</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Fila er lagret.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Klarte ikke å skrive til enhetslager.</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Lagrer vedlegg</item>
@@ -488,6 +487,7 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion.</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Utløpstid for melding endret til %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Din sikkerhets nummer med %s har endret seg.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Din kontakt kjører en gammel versjon av Signal. Vennligst be dem om å oppdatere før verifisere din sikkerhets nummer.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Din kontakt kjører en nyere versjon av Signal med en inkompatibel QR-kode format. Vennligst oppdater for å sammenligne.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Det skannede QR-kode er ikke en riktig formatert sikkerhets nummer bekreftelseskode. Vennligst prøv å skanne på nytt.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Del sikkerhets nummer via...</string>
@@ -549,11 +549,19 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion.</string>
<string name="SingleRecipientNotificationBuilder_new_message">Ny melding</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Bilde</string>
<string name="attachment_type_selector__image_description">Bilde</string>
<string name="attachment_type_selector__audio">Lyd</string>
<string name="attachment_type_selector__audio_description">Lyd</string>
<string name="attachment_type_selector__video">Video</string>
<string name="attachment_type_selector__video_description">Video</string>
<string name="attachment_type_selector__contact">Kontakt</string>
<string name="attachment_type_selector__contact_description">Kontakt</string>
<string name="attachment_type_selector__camera">Kamera</string>
<string name="attachment_type_selector__camera_description">Kamera</string>
<string name="attachment_type_selector__location">Plassering</string>
<string name="attachment_type_selector__location_description">Plassering</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Gammel passordfrase</string>
<string name="change_passphrase_activity__new_passphrase">Ny passordfrase</string>
@@ -603,6 +611,9 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion.</string>
<string name="conversation_item_received__contact_photo_description">Kontaktfoto</string>
<string name="conversation_item_received__downloading">Laster ned</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Spill</string>
<string name="audio_view__pause_accessibility_description">Pause</string>
<string name="audio_view__download_accessibility_description">Last ned</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Buntvalg-modus</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s valgt</string>

View File

@@ -153,7 +153,10 @@
<item quantity="one">Fout tijdens het opslaan van de bijlage!</item>
<item quantity="other">Fout tijdens het opslaan van de bijlage!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Bestand succesvol opgeslagen.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Bestand succesvol opgeslagen.</item>
<item quantity="other">Bestanden succesvol opgeslagen.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Opslag niet beschrijfbaar!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Bijlage opslaan</item>

1092
res/values-nn/strings.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -152,7 +152,6 @@ Om du vil benytte Signal for meldinger og anrop igjen i fremtiden må du registr
<item quantity="one">Feil ved lagring av vedlegg!</item>
<item quantity="other">Feil under lagring av vedlegg!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Fil lagret ok.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Kunne ikke skrive til lagringsenheten!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Lagrer vedlegg</item>

View File

@@ -161,7 +161,6 @@
<item quantity="few">Wystąpił błąd podczas zapisywania załączników na dysku!</item>
<item quantity="other">Wystąpił błąd podczas zapisywania załączników na dysku!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Plik pomyślnie został zapisany.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Nie udało zapisać się pliku!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Zapisywanie załącznika</item>

View File

@@ -153,7 +153,10 @@
<item quantity="one">Erro ao gravar anexo no armazenamento!</item>
<item quantity="other">Erro ao gravar anexos no armazenamento!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Arquivo gravado com sucesso.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Arquivo gravado com sucesso.</item>
<item quantity="other">Arquivos gravados com sucesso.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Não foi possível escrever no cartão SD!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Gravando anexo</item>
@@ -927,8 +930,8 @@ falhou.</string>
<string name="preferences__advanced">Avançado</string>
<string name="preferences__privacy">Privacidade</string>
<string name="preferences__mms_user_agent">Agente de usuário MMS</string>
<string name="preferences__advanced_mms_access_point_names">Configurações manuais de MMS</string>
<string name="preferences__enable_manual_mms">Usar configurações manuais de MMS</string>
<string name="preferences__advanced_mms_access_point_names">Configurações de MMS manuais</string>
<string name="preferences__enable_manual_mms">Usar configurações de MMS manuais</string>
<string name="preferences__override_system_mms_settings">Usar a informação abaixo ao invés das configurações MMS do sistema.</string>
<string name="preferences__mmsc_url">URL do MMSC</string>
<string name="preferences__mms_proxy_host">Proxy MMS</string>

View File

@@ -155,7 +155,6 @@ que %2$s reinstalou o Signal.</string>
<item quantity="one">Erro ao guardar anexo para o armazenamento local!</item>
<item quantity="other">Erro ao guardar anexos para o armazenamento local!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Ficheiro guardado com sucesso.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Não é possível escrever para o armazenamento local!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">A guardar anexo</item>

View File

@@ -161,7 +161,11 @@
<item quantity="few">A apărut o eroare în timpul salvării atașamentelor pe spațiul de stocare!</item>
<item quantity="other">A apărut o eroare în timpul salvării atașamentelor pe spațiul de stocare!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Fișierul a fost salvat cu succes.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Fișierul a fost salvat cu succes.</item>
<item quantity="few">Fișierele au fost salvate cu succes.</item>
<item quantity="other">Fișierele au fost salvate cu succes.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Nu se poate scrie pe spațiul de stocare!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Se salvează atașamentul</item>
@@ -234,9 +238,9 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Partajează cu</string>
<!--ExperienceUpgradeActivity-->
<string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Bunvenit la Signal.</string>
<string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Bine ai venit pe Signal.</string>
<string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure și RedPhone sunt acum un singur mesager privat pentru orice situație: Signal.</string>
<string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Bunvenit la Signal!</string>
<string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Bine ai venit pe Signal!</string>
<string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure se numește acum Signal.</string>
<string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure și RedPhone sunt acum o singură aplicație: Signal. Apasă pentru a explora.</string>
<!--ExportFragment-->
@@ -434,9 +438,9 @@ Vei pierde orice informație care se află în instalarea curentă de Signal și
<!--RegistrationActivity-->
<string name="RegistrationActivity_connect_with_signal">Conectează-te la Signal</string>
<string name="RegistrationActivity_select_your_country">Alege ţara ta</string>
<string name="RegistrationActivity_you_must_specify_your_country_code">Trebuie să specifici
<string name="RegistrationActivity_you_must_specify_your_country_code">Trebuie să introduci
codul țarii tale</string>
<string name="RegistrationActivity_you_must_specify_your_phone_number">Trebuie să specifici
<string name="RegistrationActivity_you_must_specify_your_phone_number">Trebuie să introduci
numărul tău de telefon</string>
<string name="RegistrationActivity_invalid_number">Număr invalid</string>
<string name="RegistrationActivity_the_number_you_specified_s_is_invalid">Numărul de telefon
@@ -451,7 +455,7 @@ Verifică din nou dacă acesta este numărul tău! Suntem pe cale să-l verific
<string name="RegistrationActivity_continue">Continuă</string>
<string name="RegistrationActivity_edit">Editează</string>
<!--RegistrationProblemsActivity-->
<string name="RegistrationProblemsActivity_possible_problems">Probleme posibile</string>
<string name="RegistrationProblemsActivity_possible_problems">Probleme posibile.</string>
<!--RegistrationProgressActivity-->
<string name="RegistrationProgressActivity_verifying_number">Se verifică numărul</string>
<string name="RegistrationProgressActivity_edit_s">Editează %s</string>
@@ -476,8 +480,8 @@ Verifică din nou dacă acesta este numărul tău! Suntem pe cale să-l verific
<!--RegistrationService-->
<string name="RegistrationService_registration_complete">Înregistrarea este completă</string>
<string name="RegistrationService_signal_registration_has_successfully_completed">Înregistrarea la Signal s-a finalizat cu succes.</string>
<string name="RegistrationService_registration_error">Eroare de înregistrare</string>
<string name="RegistrationService_signal_registration_has_encountered_a_problem">Înregistrarea la Signal a întampinat o problemă.</string>
<string name="RegistrationService_registration_error">Eroare la înregistrare</string>
<string name="RegistrationService_signal_registration_has_encountered_a_problem">Înregistrarea la Signal a întâmpinat o problemă.</string>
<!--Slide-->
<string name="Slide_image">Imagine</string>
<string name="Slide_audio">Audio</string>
@@ -785,7 +789,7 @@ Signal poate de asemenea să te sune pentru a verifica numărul tău.
Apasă \"Sună-mă\" și introdu mai jos
codul din șase cifre pe care îl vei auzi.</string>
<string name="registration_progress_activity__verify">Verifică</string>
<string name="registration_progress_activity__call_me">Apelează-mă</string>
<string name="registration_progress_activity__call_me">Sună-mă</string>
<string name="registration_progress_activity__edit_number">Editează număr</string>
<string name="registration_progress_activity__connectivity_error">Eroare de conectivitate</string>
<string name="registration_progress_activity__signal_was_unable_to_connect_to_the_server">Signal nu s-a putut conecta la server.
@@ -887,7 +891,7 @@ SMS a eșuat.</string>
<string name="preferences__input_settings">Setări de introducere</string>
<string name="preferences__enable_enter_key_title">Activează tasta Enter</string>
<string name="preferences__replace_smiley_with_enter_key">Inlocuiți tasta smiley cu tasta Enter</string>
<string name="preferences__pref_enter_sends_title">Tasta Enter trimite</string>
<string name="preferences__pref_enter_sends_title">Trimite cu Enter</string>
<string name="preferences__pressing_the_enter_key_will_send_text_messages">Apăsarea tastei Enter va trimite mesajele text</string>
<string name="preferences__display_settings">Afișează setările</string>
<string name="preferences__choose_identity">Selectează identitatea</string>
@@ -1106,7 +1110,7 @@ SMS a eșuat.</string>
<!--media_preview_activity-->
<string name="media_preview_activity__image_content_description">Previzualizare imagine</string>
<!--new_conversation_activity-->
<string name="new_conversation_activity__refresh">Reîmprospătează</string>
<string name="new_conversation_activity__refresh">Reîmprospătare</string>
<!--redphone_audio_popup_menu-->
<string name="redphone_audio_popup_menu__handset">Mobil</string>
<string name="redphone_audio_popup_menu__headset">Căști</string>

View File

@@ -167,7 +167,6 @@
<item quantity="many">Ошибка при сохранении вложений в память!</item>
<item quantity="other">Ошибка при сохранении вложений в память!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Файл успешно сохранен.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Невозможно произвести запись в память!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Сохранение вложения</item>

View File

@@ -10,10 +10,16 @@
<!--ApplicationPreferencesActivity-->
<string name="ApplicationPreferencesActivity_currently_s">Aktuálne: %s</string>
<string name="ApplicationPreferenceActivity_you_havent_set_a_passphrase_yet">Ešte ste si nenastavili heslo!</string>
<plurals name="ApplicationPreferencesActivity_messages_per_conversation">
<item quantity="one">1 správa na konverzáciu</item>
<item quantity="few">%d správ na konverzáciu</item>
<item quantity="other">%d správ na konverzáciu</item>
</plurals>
<string name="ApplicationPreferencesActivity_delete_all_old_messages_now">Zmazať všetky staré správy?</string>
<string name="ApplicationPreferencesActivity_delete">Zmazať</string>
<string name="ApplicationPreferencesActivity_disable_passphrase">Vypnúť heslo?</string>
<string name="ApplicationPreferencesActivity_disable">Vypnúť</string>
<string name="ApplicationPreferencesActivity_unregistering">Odregistrovávam</string>
<string name="ApplicationPreferencesActivity_error_connecting_to_server">Chyba pripojenia na server!</string>
<string name="ApplicationPreferencesActivity_sms_enabled">SMS zapnuté</string>
<string name="ApplicationPreferencesActivity_touch_to_change_your_default_sms_app">Dotykom sem môžete zmeniť Vašu predvolenú aplikáciu pre SMS.</string>
@@ -25,6 +31,11 @@
<string name="ApplicationPreferencesActivity_Off">Vypnuté</string>
<string name="ApplicationPreferencesActivity_sms_mms_summary">SMS %1$s, MMS %2$s</string>
<!--AppProtectionPreferenceFragment-->
<plurals name="AppProtectionPreferenceFragment_minutes">
<item quantity="one">1 minúta</item>
<item quantity="few">%d minúty</item>
<item quantity="other">%d minút</item>
</plurals>
<!--DraftDatabase-->
<string name="DraftDatabase_Draft_image_snippet">(obrázok)</string>
<string name="DraftDatabase_Draft_audio_snippet">(zvuk)</string>
@@ -48,6 +59,7 @@
<string name="ConfirmIdentityDialog_accept">Potvrdiť</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">Správa %s</string>
<string name="ContactsDatabase_signal_call_s">Signal Hovor %s</string>
<!--ConversationItem-->
<string name="ConversationItem_message_size_d_kb">Veľkosť správy: %d KB</string>
<string name="ConversationItem_expires_s">Expirácia: %s</string>
@@ -97,6 +109,8 @@
<string name="ConversationActivity_mms_not_supported_title">MMS nie sú podporované</string>
<string name="ConversationActivity_mms_not_supported_message">Táto správa nemohla byť odoslaná keďže váš operátor nepodporuje MMS.</string>
<string name="ConversationActivity_specify_recipient">Prosím vyberte kontakt</string>
<string name="ConversationActivity_unblock_this_contact_question">Odblokovať tento kontakt?</string>
<string name="ConversationActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">Znovu budete dostávať správy a hovory od tohoto kontaktu.</string>
<string name="ConversationActivity_unblock">Odblokovať</string>
<string name="ConversationActivity_quick_camera_unavailable">Kamera je momentálne neprístupná</string>
<string name="ConversationActivity_unable_to_record_audio">Nemôžem zaznamenať zvuk!</string>
@@ -116,9 +130,10 @@
<item quantity="few">Nastala chyba pri ukladaní príloh na dátové úložisko zariadenia!</item>
<item quantity="other">Nastala chyba pri ukladaní príloh na dátové úložisko zariadenia!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Súbor úspešne uložený.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Aplikácia nedokázala zapísať informácie na dátové úložisko zariadenia!</string>
<string name="ConversationFragment_collecting_attahments">Ukladám prílohy...</string>
<string name="ConversationFragment_pending">Čaká na spracovanie...</string>
<string name="ConversationFragment_push">Data (Signal)</string>
<string name="ConversationFragment_mms">MMS</string>
<string name="ConversationFragment_sms">SMS</string>
<string name="ConversationFragment_deleting">Vymazávanie</string>
@@ -130,13 +145,19 @@
<!--ConversationListItem-->
<string name="ConversationListItem_key_exchange_message">Správa vzájomnej výmeny kľúčov...</string>
<!--ConversationListItemAction-->
<string name="ConversationListItemAction_archived_conversations_d">Archivované konverzácie (%d)</string>
<!--CustomDefaultPreference-->
<string name="CustomDefaultPreference_using_custom">Používa sa upravené: %s</string>
<string name="CustomDefaultPreference_using_default">Používa sa predvolené: %s</string>
<string name="CustomDefaultPreference_none">Žiadna</string>
<!--DateUtils-->
<string name="DateUtils_just_now">Práve teraz</string>
<string name="DateUtils_minutes_ago">%d min</string>
<!--DeviceListActivity-->
<string name="DeviceListActivity_unlink_s">Odobrať \'%s\'?</string>
<string name="DeviceListActivity_try_again">Skúsiť znova</string>
<string name="DeviceListActivity_unlinking_device">Odoberám zariadenie...</string>
<string name="DeviceListActivity_network_failed">Chyba siete! </string>
<!--DeviceListItem-->
<!--ShareActivity-->
<string name="ShareActivity_share_with">Zdieľaj s</string>
@@ -202,6 +223,7 @@ opätovným importom zduplikujete správy.
<!--MessageRecord-->
<string name="MessageRecord_left_group">Opustili ste skupinu.</string>
<string name="MessageRecord_updated_group">Skupina bola aktualizovaná.</string>
<string name="MessageRecord_s_is_on_signal_say_hey">%s už má tiež Signal, pozdravte ho!</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">Heslá sa nezhodujú!</string>
<string name="PassphraseChangeActivity_incorrect_old_passphrase_exclamation">Nesprávne staré heslo!</string>
@@ -212,12 +234,20 @@ opätovným importom zduplikujete správy.
<string name="DeviceProvisioningActivity_continue">POKRAČOVAŤ</string>
<string name="DeviceProvisioningActivity_title">Pridať toto zariadenie?</string>
<string name="DeviceProvisioningActivity_content_intro">Bude môcť </string>
<string name="DeviceProvisioningActivity_content_progress_title">Pridávam zariadenie</string>
<string name="DeviceProvisioningActivity_content_progress_content">Pridávam nové zariadenie...</string>
<string name="DeviceProvisioningActivity_content_progress_success">Zariadenie schválené!</string>
<string name="DeviceProvisioningActivity_content_progress_no_device">Nebolo nájdené žiadne zariadenie!</string>
<string name="DeviceProvisioningActivity_content_progress_network_error">Chyba siete.</string>
<string name="DeviceProvisioningActivity_content_progress_key_error">Neplatný QR kód.</string>
<string name="DeviceActivity_sorry_this_is_not_a_valid_device_link_qr_code">Prepáčte, toto nie je platný QR kód na pridanie zariadenia.</string>
<string name="DeviceProvisioningActivity_link_a_signal_device">Pridať zariadenie so Signalom?</string>
<!--ExpirationDialog-->
<string name="ExpirationDialog_disappearing_messages">Miznúce správy</string>
<string name="ExpirationDialog_your_messages_will_not_expire">Vaše správy nevypršia.</string>
<!--PassphrasePromptActivity-->
<string name="PassphrasePromptActivity_enter_passphrase">Zadajte heslo</string>
<string name="PassphrasePromptActivity_watermark_content_description">Signal ikona</string>
<string name="PassphrasePromptActivity_ok_button_content_description">Odošli heslo</string>
<string name="PassphrasePromptActivity_invalid_passphrase_exclamation">Nesprávne heslo!</string>
<!--PlayServicesProblemFragment-->
@@ -229,9 +259,35 @@ opätovným importom zduplikujete správy.
<string name="RatingManager_no_thanks">Nie ďakujem</string>
<string name="RatingManager_later">Neskôr</string>
<!--RecipientPreferencesActivity-->
<string name="RecipientPreferenceActivity_block_this_contact_question">Zablokovať tento kontakt?</string>
<string name="RecipientPreferenceActivity_you_will_no_longer_receive_messages_and_calls_from_this_contact">Už nebudete od tohoto kontaktu dostávať správy a hovory.</string>
<string name="RecipientPreferenceActivity_block">Blokovať</string>
<string name="RecipientPreferenceActivity_unblock_this_contact_question">Odblokovať tento kontakt?</string>
<string name="RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">Znovu budete dostávať správy a hovory od tohoto kontaktu.</string>
<string name="RecipientPreferenceActivity_unblock">Odblokovať</string>
<string name="RecipientPreferenceActivity_enabled">Povolené</string>
<string name="RecipientPreferenceActivity_disabled">Zakázané</string>
<!--RedPhone-->
<string name="RedPhone_answering">Zodvíham</string>
<string name="RedPhone_ending_call">Končím hovor</string>
<string name="RedPhone_dialing">Vytáčam</string>
<string name="RedPhone_canceling_call">Ruším hovor</string>
<string name="RedPhone_call_rejected">Hovor odmietnutý</string>
<string name="RedPhone_ringing">Zvoním</string>
<string name="RedPhone_busy">Zaneprázdnený</string>
<string name="RedPhone_connected">Pripojený</string>
<string name="RedPhone_connecting">Pripájam</string>
<string name="RedPhone_handshake_failed">Handshake sa nepodaril!</string>
<string name="RedPhone_recipient_unavailable">Adresát nie je dostupný</string>
<string name="RedPhone_network_failed">Chyba siete! </string>
<string name="RedPhone_client_failed">Klient zlyhal</string>
<string name="RedPhone_fatal_error">Fatálna chyba</string>
<string name="RedPhone_login_failed">Prihlasovanie zlyhalo!</string>
<string name="RedPhone_message_from_the_server">Správa zo serveru</string>
<string name="RedPhone_number_not_registered">Neregistrované číslo!</string>
<string name="RedPhone_got_it">Mám to</string>
<!--RegistrationActivity-->
<string name="RegistrationActivity_connect_with_signal">Pripájam sa so Signalom</string>
<string name="RegistrationActivity_select_your_country">Vyber svoju krajinu</string>
<string name="RegistrationActivity_you_must_specify_your_country_code">Ty musíš zadať tvoj
@@ -278,17 +334,29 @@ Skontrolujte pre istotu znovu, že ste správne zadali Vaše telefónne číslo!
<string name="RegistrationService_registration_complete">Registrácia dokončená.</string>
<string name="RegistrationService_registration_error">Chyba pri registrácii</string>
<!--Slide-->
<string name="Slide_image">Obrázok</string>
<string name="Slide_audio">Zvuk</string>
<string name="Slide_video">Video</string>
<!--SmsMessageRecord-->
<string name="SmsMessageRecord_received_corrupted_key_exchange_message">Bola prijatá poškodená správa
vzájomnej výmeny kľúčov.</string>
<string name="SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version">
Bola prijatá správa vzájomnej výmeny kľúčov s neplatnou verziou protokolu.
</string>
<string name="SmsMessageRecord_secure_session_reset">Obnovili ste bezpečnú reláciu.</string>
<string name="SmsMessageRecord_duplicate_message">Zduplikuj správu.</string>
<!--ThreadRecord-->
<string name="ThreadRecord_left_the_group">Opustil skupinu...</string>
<string name="ThreadRecord_secure_session_reset">Bezpečná relácia obnovená.</string>
<string name="ThreadRecord_draft">Rozpísaná správa:</string>
<string name="ThreadRecord_called">Volali ste</string>
<string name="ThreadRecord_called_you">Volal Vám</string>
<string name="ThreadRecord_missed_call">Zmeškaný hovor</string>
<string name="ThreadRecord_media_message">Multimediálna správa</string>
<string name="ThreadRecord_s_is_on_signal_say_hey">%s už má tiež Signal, pozdravte ho!</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Čas na zmiznutie správy nastavený na %s</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_our_signal_safety_number">Naše bezpečnostné Signal číslo:</string>
<!--KeyExchangeInitiator-->
<string name="KeyExchangeInitiator_initiate_despite_existing_request_question">Začať aj napriek existujúcemu požiadavku?</string>
<string name="KeyExchangeInitiator_send">Odošli</string>
@@ -316,23 +384,50 @@ Bola prijatá správa vzájomnej výmeny kľúčov s neplatnou verziou protokolu
<!--ApplicationMigrationService-->
<string name="ApplicationMigrationService_import_in_progress">Prebieha import</string>
<string name="ApplicationMigrationService_importing_text_messages">Nahrávanie textových správ</string>
<string name="ApplicationMigrationService_import_complete">Import dokončený!</string>
<string name="ApplicationMigrationService_system_database_import_is_complete">Import systémovej databázy je dokončený.</string>
<!--KeyCachingService-->
<string name="KeyCachingService_signal_passphrase_cached">Dotykom otvor.</string>
<string name="KeyCachingService_signal_passphrase_cached_with_lock">Dotykom otvorte alebo dotykom zámku zatvorte.</string>
<string name="KeyCachingService_passphrase_cached">Signal je odomknutý</string>
<string name="KeyCachingService_lock">Zamkni s heslom</string>
<!--MessageNotifier-->
<string name="MessageNotifier_most_recent_from_s">Najnovšie od: %1$s</string>
<string name="MessageNotifier_locked_message">Zamknutá správa...</string>
<string name="MessageNotifier_media_message_with_text">Multimediálna správa: %s</string>
<string name="MessageNotifier_no_subject">(bez predmetu)</string>
<string name="MessageNotifier_message_delivery_failed">Doručenie správy zlyhalo.</string>
<string name="MessageNotifier_failed_to_deliver_message">Zlyhanie doručenia správy.</string>
<string name="MessageNotifier_error_delivering_message">Chyba doručovania správy.</string>
<string name="MessageNotifier_mark_all_as_read">Označ všetko ako prečítané</string>
<string name="MessageNotifier_mark_read">Označiť ako prečítané</string>
<string name="MessageNotifier_media_message">Multimediálna správa</string>
<string name="MessageNotifier_reply">Odpovedať</string>
<!--QuickResponseService-->
<!--SingleRecipientNotificationBuilder-->
<string name="SingleRecipientNotificationBuilder_signal">Signal</string>
<string name="SingleRecipientNotificationBuilder_new_message">Nová správa</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Obrázok</string>
<string name="attachment_type_selector__image_description">Obrázok</string>
<string name="attachment_type_selector__audio">Zvuk</string>
<string name="attachment_type_selector__audio_description">Zvuk</string>
<string name="attachment_type_selector__video">Video</string>
<string name="attachment_type_selector__video_description">Video</string>
<string name="attachment_type_selector__contact">Kontakt</string>
<string name="attachment_type_selector__contact_description">Kontak</string>
<string name="attachment_type_selector__camera">Kamera</string>
<string name="attachment_type_selector__camera_description">Kamera</string>
<string name="attachment_type_selector__location">Poloha</string>
<string name="attachment_type_selector__location_description">Poloha</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Staré heslo</string>
<string name="change_passphrase_activity__new_passphrase">Nové heslo</string>
<string name="change_passphrase_activity__repeat_new_passphrase">Opakovať nové heslo</string>
<!--contact_selection_activity-->
<string name="contact_selection_activity__enter_name_or_number">Zadajte meno alebo číslo</string>
<!--contact_selection_group_activity-->
<string name="contact_selection_group_activity__no_contacts">Žiadne kontakty.</string>
<string name="contact_selection_group_activity__finding_contacts">Načítavanie kontaktov...</string>
@@ -341,12 +436,16 @@ Bola prijatá správa vzájomnej výmeny kľúčov s neplatnou verziou protokolu
<!--ContactSelectionListFragment-->
<string name="ContactSelectionlistFragment_select_for">Vyber pre</string>
<!--blocked_contacts_fragment-->
<string name="blocked_contacts_fragment__no_blocked_contacts">Žiadne zablokované kontaky...</string>
<!--contact_selection_recent_activity-->
<string name="contact_selection_recent_activity__no_recent_calls">Žiadne nedávne hovory.</string>
<!--conversation_title_view-->
<string name="conversation_title_view__conversation_muted">Konverzácia umlčaná.</string>
<!--conversation_activity-->
<string name="conversation_activity__type_message_push">Poslať Signal správu</string>
<string name="conversation_activity__type_message_sms_insecure">Poslať nezašifrovanú SMS</string>
<string name="conversation_activity__type_message_mms_insecure">Poslať nezašifrovanú MMS</string>
<string name="conversation_activity__from_sim_name">Od %1$s</string>
<string name="conversation_activity__send">Odoslať</string>
<string name="conversation_activity__remove">Odstrániť</string>
<string name="conversation_activity__window_description">Konverzácia s %1$s</string>
@@ -369,6 +468,9 @@ Bola prijatá správa vzájomnej výmeny kľúčov s neplatnou verziou protokolu
<string name="conversation_item_received__contact_photo_description">Fotografia kontaktu</string>
<string name="conversation_item_received__downloading">Sťahujem</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Hrať</string>
<string name="audio_view__pause_accessibility_description">Pozastaviť</string>
<string name="audio_view__download_accessibility_description">Stiahnuť</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Mód hromadného výberu</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s vybraných</string>
@@ -377,6 +479,7 @@ Bola prijatá správa vzájomnej výmeny kľúčov s neplatnou verziou protokolu
<string name="country_selection_fragment__search">Hľadaj</string>
<!--device_add_fragment-->
<!--device_link_fragment-->
<string name="device_link_fragment__link_device">Pridať zariadenie</string>
<!--device_list_fragment-->
<!--experience_upgrade_activity-->
<!--expiration-->
@@ -418,7 +521,9 @@ Bola prijatá správa vzájomnej výmeny kľúčov s neplatnou verziou protokolu
<!--prompt_mms_activity-->
<!--recipient_preferences_activity-->
<!--recipient_preferences-->
<string name="recipient_preferences__block">Blokovať</string>
<!--- redphone_call_controls-->
<string name="redphone_call_controls__audio">Zvuk</string>
<!--registration_activity-->
<string name="registration_activity__your_country">TVOJA KRAJINA</string>
<string name="registration_activity__your_country_code_and_phone_number">Tvoj kód krajiny a
@@ -487,6 +592,10 @@ zlyhalo.
<string name="arrays__import_export">Import / export</string>
<string name="arrays__use_default">Použiť predvolené</string>
<string name="arrays__use_custom">Použiť vlastné</string>
<string name="arrays__enabled">Povolené</string>
<string name="arrays__disabled">Zakázané</string>
<string name="arrays__audio">Zvuk</string>
<string name="arrays__video">Video</string>
<!--plurals.xml-->
<plurals name="hours_ago">
<item quantity="one">%d hodina</item>
@@ -591,6 +700,7 @@ zlyhalo.
<!--conversation_context_image-->
<string name="conversation_context_image__save_attachment">Uložiť prílohu </string>
<!--conversation_expiring_off-->
<string name="conversation_expiring_off__disappearing_messages">Miznúce správy</string>
<!--conversation_expiring_on-->
<!--conversation_insecure-->
<string name="conversation_insecure__invite">Pozvať</string>

View File

@@ -169,7 +169,12 @@
<item quantity="few">Napaka pri shranjevanju priponk v shrambo!</item>
<item quantity="other">Napaka pri shranjevanju priponk v shrambo!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Datoteka je bila uspešno shranjena.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Datoteka je bila uspešno shranjena.</item>
<item quantity="two">Datoteki sta bili uspešno shranjeni.</item>
<item quantity="few">Datoteke so bile uspešno shranjene.</item>
<item quantity="other">Datoteke so bile uspešno shranjene.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Ne morem shranjevati v sistemsko shrambo!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Shranjujem priponko</item>

View File

@@ -27,11 +27,11 @@
<string name="ApplicationPreferencesActivity_unregistering_from_signal_messages_and_calls">Duke u çregjistruar nga mesazhet dhe thirrjet përmes Signal-it...</string>
<string name="ApplicationPreferencesActivity_disable_signal_messages_and_calls">Çaktivizo mesazhet dhe thirrjet përmes Signal-it?</string>
<string name="ApplicationPreferencesActivity_disable_signal_messages_and_calls_by_unregistering">Çaktivizo mesazhet dhe thirrjet përmes Signal-it duke u çregjistruar nga serveri. Për t\'i perdorur ato serish në të ardhmen, do të ju nevojitet që ta ri-regjistroni numrin tuaj të telefonit.</string>
<string name="ApplicationPreferencesActivity_error_connecting_to_server">Gabim në lidhjen me serverin!</string>
<string name="ApplicationPreferencesActivity_error_connecting_to_server">Gabim dukë lidhur me serverin!</string>
<string name="ApplicationPreferencesActivity_sms_enabled">SMS është aktivizuar</string>
<string name="ApplicationPreferencesActivity_touch_to_change_your_default_sms_app">Prek për të ndryshuar epin për SMS të parazgjedhur</string>
<string name="ApplicationPreferencesActivity_touch_to_change_your_default_sms_app">Prek për të ndryshuar aplikacionin e parazgjedhur për SMS</string>
<string name="ApplicationPreferencesActivity_sms_disabled">SMS është çaktivizuar</string>
<string name="ApplicationPreferencesActivity_touch_to_make_signal_your_default_sms_app">Prek për të bërë Signal-in epin tënd SMS të parazgjedhur</string>
<string name="ApplicationPreferencesActivity_touch_to_make_signal_your_default_sms_app">Prek për të bërë Signal aplikacionin tënd SMS të parazgjedhur</string>
<string name="ApplicationPreferencesActivity_on">aktivizuar</string>
<string name="ApplicationPreferencesActivity_On">Aktivizuar</string>
<string name="ApplicationPreferencesActivity_off">çaktivizuar</string>
@@ -48,9 +48,9 @@
<string name="DraftDatabase_Draft_image_snippet">(imazh)</string>
<string name="DraftDatabase_Draft_audio_snippet">(audio)</string>
<string name="DraftDatabase_Draft_video_snippet">(video)</string>
<string name="DraftDatabase_Draft_location_snippet">(lokacioni)</string>
<string name="DraftDatabase_Draft_location_snippet">(vendndodhja)</string>
<!--AttchmentManager-->
<string name="AttachmentManager_cant_open_media_selection">Nuk mund të gjëndet një ep për të përzgjedhur median. </string>
<string name="AttachmentManager_cant_open_media_selection">Nuk mund të gjëndet një aplikacion për të përzgjedhur median. </string>
<!--AttachmentTypeSelectorAdapter-->
<string name="AttachmentTypeSelectorAdapter_camera">Kamera</string>
<string name="AttachmentTypeSelectorAdapter_picture">Foto</string>
@@ -64,42 +64,44 @@
<!--CallScreen-->
<string name="CallScreen_Incoming_call">Thirrje hyrëse</string>
<!--ConfirmIdentityDialog-->
<string name="ConfirmIdentityDialog_your_safety_number_with_s_has_changed">Numri sigurie i juaj me %1$s është ndryshuar. Kjo do të thotë që, ose dikush është duke u munduar të nderhyjë në bisedën e juaj, ose thjeshtë që %2$s ka instaluar Signal perseri.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact">Ndoshta deshironi të verifikoni numrin e juaj sigurie me këtë kontakt.</string>
<string name="ConfirmIdentityDialog_accept">Prano</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">Mesazh %s</string>
<string name="ContactsDatabase_message_s">Lajmi %s</string>
<string name="ContactsDatabase_signal_call_s">Thirrje përmes Signal %s</string>
<!--ConversationItem-->
<string name="ConversationItem_message_size_d_kb">Madhësia e mesazhit: %d KB</string>
<string name="ConversationItem_message_size_d_kb">Madhësia e lajmit: %d KB</string>
<string name="ConversationItem_expires_s">Skadon: %s</string>
<string name="ConversationItem_error_not_delivered">Nuk u dërgua</string>
<string name="ConversationItem_view_secure_media_question">Shiko medium të sigurt?</string>
<string name="ConversationItem_this_media_has_been_stored_in_an_encrypted_database_external_viewer_warning">Kjo media është ruajtur në bazë të enkriptuar të të dhënave. Fatkeqësisht, për ta hapur me një aplikacion të jashtëm, duhet që të dhënat të dekriptohen dhe të shkruhen në memorje. A jeni të sigurt se e dëshironi këtë?</string>
<string name="ConversationItem_error_received_stale_key_exchange_message">Gabim, u pranua mesazh me çelës të shkëmbyer të ndenjur.</string>
<string name="ConversationItem_received_key_exchange_message_tap_to_process">U pranua mesazh për shkëmbim çelsash, shtyp për të procesuar.</string>
<string name="ConversationItem_group_action_left">%1$s e ka lë grupin.</string>
<string name="ConversationItem_this_media_has_been_stored_in_an_encrypted_database_external_viewer_warning">Kjo media është ruajtur në bazë të enkriptuar të të dhënave. Fatkeqësisht, për ta hapur me një aplikacion të jashtëm, duhet që të dhënat të dekriptohen dhe të shkruhen në kujtesë. A jeni të sigurt se e dëshironi këtë?</string>
<string name="ConversationItem_error_received_stale_key_exchange_message">Gabim, u pranua lajm me çelës të shkëmbyer të ndenjur.</string>
<string name="ConversationItem_received_key_exchange_message_tap_to_process">U pranua lajm për shkëmbim çelsash, shtyp për të procesuar.</string>
<string name="ConversationItem_group_action_left">%1$s e ka lëshuar grupin.</string>
<string name="ConversationItem_click_for_details">Shtypni për më shumë detaje</string>
<string name="ConversationItem_click_to_approve_unencrypted">Shtypni për alternativë të pasigur</string>
<string name="ConversationItem_click_to_approve_unencrypted_sms_dialog_title">Kthehu në SMS jo enkriptuar</string>
<string name="ConversationItem_click_to_approve_unencrypted">Shtypni për zbrapsje të pasiguruar</string>
<string name="ConversationItem_click_to_approve_unencrypted_sms_dialog_title">Zbrapsje në SMS të pakritptuar?</string>
<string name="ConversationItem_click_to_approve_unencrypted_mms_dialog_title">Zbrapsje në MMS të pakritptuar?</string>
<string name="ConversationItem_click_to_approve_unencrypted_dialog_message">Ky mesazh <b>nuk</b> do të jetë i enkriptuar pasi që pranuesi nuk është më perdorues i Signal-it.\n\nDërgo mesazh të pasiguruar? </string>
<string name="ConversationItem_unable_to_open_media">Nuk mund të gjëndet një ep që mund ta hapë mediumin.</string>
<string name="ConversationItem_click_to_approve_unencrypted_dialog_message">Ky lajm <b>nuk</b> do të jetë i enkriptuar pasi që pranuesi nuk është më perdorues i Signal.\n\nDërgo lajm të pasiguruar? </string>
<string name="ConversationItem_unable_to_open_media">Nuk mund të gjëndet një aplikacion që mund ta hapë mediumin.</string>
<string name="ConversationItem_from_s">nga %s</string>
<string name="ConversationItem_to_s">te %s</string>
<!--ConversationActivity-->
<string name="ConversationActivity_reset_secure_session_question">Reseto sesionin e sigurt?</string>
<string name="ConversationActivity_this_may_help_if_youre_having_encryption_problems">Kjo mund të ndihmojë në qoftë se keni probleme me enkriptimin në këtë bisedë. Mesazhet tuaja do të ruhen.</string>
<string name="ConversationActivity_this_may_help_if_youre_having_encryption_problems">Kjo mund të ndihmojë në qoftë se keni probleme me enkriptimin në këtë bisedë. Lajmet e juaja do të ruhen.</string>
<string name="ConversationActivity_reset">Reseto</string>
<string name="ConversationActivity_delete_thread_question">Fshij bisedën?</string>
<string name="ConversationActivity_this_will_permanently_delete_all_messages_in_this_conversation">Kjo do të fshijë përgjithmonë të gjitha porositë në këtë bisedë.</string>
<string name="ConversationActivity_add_attachment">Shto bashkëngjitje</string>
<string name="ConversationActivity_this_will_permanently_delete_all_messages_in_this_conversation">Kjo do të fshijë përgjithmonë të gjitha lajmet në këtë bisedë.</string>
<string name="ConversationActivity_add_attachment">Shto shtojcë</string>
<string name="ConversationActivity_select_contact_info">Përzgjedh informacionin e kontaktit</string>
<string name="ConversationActivity_compose_message">Krijo mesazh</string>
<string name="ConversationActivity_compose_message">Krijo lajm</string>
<string name="ConversationActivity_sorry_there_was_an_error_setting_your_attachment">Na vjen keq, kishte një gabim në vendosjen e shtojcës suaj.</string>
<string name="ConversationActivity_the_gif_you_selected_was_too_big">Gifin zë përzgjodhët është shumë i madh!</string>
<string name="ConversationActivity_sorry_the_selected_video_exceeds_message_size_restrictions">Videoja e përzgjedhur i tejkalon limitet për madhesinë e mesazheve (%1$skB)..</string>
<string name="ConversationActivity_sorry_the_selected_audio_exceeds_message_size_restrictions">Audioja e përzgjedhur i tejkalon limitet për madhesinë e mesazheve (%1$skB).</string>
<string name="ConversationActivity_sorry_the_selected_video_exceeds_message_size_restrictions">Kërkimfalje, videoja e përzgjedhur i tejkalon kufizimet për madhesinë e lajmeve (%1$skB).</string>
<string name="ConversationActivity_sorry_the_selected_audio_exceeds_message_size_restrictions">Kërkimfalje, audioja e përzgjedhur i tejkalon kufizimet për madhesinë e lajmeve (%1$skB).</string>
<string name="ConversationActivity_recipient_is_not_a_valid_sms_or_email_address_exclamation">Pranuesi nuk është një SMS ose adresë emaili i vlefshëm!</string>
<string name="ConversationActivity_message_is_empty_exclamation">Mesazhi është i zbrazët!</string>
<string name="ConversationActivity_message_is_empty_exclamation">Lajmi është i zbrazët!</string>
<string name="ConversationActivity_group_members">Anëtarët e grupit</string>
<string name="ConversationActivity_group_conversation">Bisedë në grup</string>
<string name="ConversationActivity_unnamed_group">Grup i paemruar</string>
@@ -107,21 +109,21 @@
<item quantity="one">1 anëtar</item>
<item quantity="other">%d anëtarë</item>
</plurals>
<string name="ConversationActivity_saved_draft">U ruajt drafti</string>
<string name="ConversationActivity_invalid_recipient">Marrës jovalid!</string>
<string name="ConversationActivity_saved_draft">Hartim i ruajtur</string>
<string name="ConversationActivity_invalid_recipient">Pranues jovalid!</string>
<string name="ConversationActivity_calls_not_supported">Thirrjet nuk mbështetën</string>
<string name="ConversationActivity_this_device_does_not_appear_to_support_dial_actions">Kjo paisje nuk mbështet thirje.</string>
<string name="ConversationActivity_this_device_does_not_appear_to_support_dial_actions">Si po duket, kjo paisje nuk mbështet thirje.</string>
<string name="ConversationActivity_leave_group">Largohu nga grupi?</string>
<string name="ConversationActivity_are_you_sure_you_want_to_leave_this_group">A jeni të sigurt që dëshironi të largoheni nga grupi?</string>
<string name="ConversationActivity_transport_insecure_sms">SMS i pasigurët</string>
<string name="ConversationActivity_transport_insecure_sms">SMS i pasigurtë</string>
<string name="ConversationActivity_transport_insecure_mms">MMS i pasigurtë</string>
<string name="ConversationActivity_transport_signal">Signal</string>
<string name="ConversationActivity_lets_switch_to_signal">Të kalojmë në Signal %1$s</string>
<string name="ConversationActivity_lets_use_this_to_chat">Ta përdorim këtë për të biseduar: %1$s</string>
<string name="ConversationActivity_error_leaving_group">Gabim në lënjën e grupit...</string>
<string name="ConversationActivity_mms_not_supported_title">MMS nuk mbështetet</string>
<string name="ConversationActivity_mms_not_supported_message">Kjo porosi nuk mund të dërgohet pasiqë operatori yt nuk mbështetë MMS.</string>
<string name="ConversationActivity_specify_recipient">Përzgjedhni një kontakt</string>
<string name="ConversationActivity_mms_not_supported_message">Kjo porosi nuk mund të dërgohet pasi që operatori i juaj nuk mbështet MMS.</string>
<string name="ConversationActivity_specify_recipient">Ju lutem, përzgjedhni një kontakt</string>
<string name="ConversationActivity_unblock_this_contact_question">Zhblloko këtë kontakt?</string>
<string name="ConversationActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">Tani mund sërish të pranoni mesazhe dhe telefonata nga ky kontakt.</string>
<string name="ConversationActivity_unblock">Zhblloko</string>
@@ -151,7 +153,6 @@
<item quantity="one">Gabim gjatë ruajtjes të shtojcës në memorie!</item>
<item quantity="other">Gabim gjatë shkruarjes në memorie!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Skedari u ruaj me sukses.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">E pamundur të shkruhet në memorie!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Duke ruar shtojcën</item>
@@ -167,7 +168,7 @@
<string name="ConversationFragment_mms">MMS</string>
<string name="ConversationFragment_sms">SMS</string>
<string name="ConversationFragment_deleting">Duke fshirë</string>
<string name="ConversationFragment_deleting_messages">Duke fshirë porosi...</string>
<string name="ConversationFragment_deleting_messages">Duke fshirë lajmet...</string>
<!--ConversationListActivity-->
<string name="ConversationListActivity_search">Kërko...</string>
<string name="ConversationListActivity_there_is_no_browser_installed_on_your_device">Nuk keni instaluar shfletues në celularin tuaj.</string>
@@ -192,7 +193,7 @@
<item quantity="other">%d biseda u zhvendosën në inbox</item>
</plurals>
<!--ConversationListItem-->
<string name="ConversationListItem_key_exchange_message">Porosi e shkëmbimit të qelësve</string>
<string name="ConversationListItem_key_exchange_message">Lajm i shkëmbimit të qelësve</string>
<!--ConversationListItemAction-->
<string name="ConversationListItemAction_archived_conversations_d">Biseda të arkivuara (%d)</string>
<!--CustomDefaultPreference-->
@@ -200,6 +201,7 @@
<string name="CustomDefaultPreference_using_default">Po përdorët parazgjedhja: %s</string>
<string name="CustomDefaultPreference_none">Asnjë</string>
<!--DateUtils-->
<string name="DateUtils_just_now">Veq sa</string>
<string name="DateUtils_minutes_ago">%d min</string>
<!--DeviceListActivity-->
<string name="DeviceListActivity_unlink_s">Shkëput \'%s\'?</string>
@@ -320,6 +322,7 @@ importimi i sërishëm do të rezultojë ne mesazhe duplikate.</string>
<string name="KeyScanningActivity_this_application_requires_barcode_scanner_would_you_like_to_install_it">Signal-it i duhet Barcode Scanner për kodet QR.</string>
<!--MessageDetailsRecipient-->
<string name="MessageDetailsRecipient_failed_to_send">Dështoj dërgimi</string>
<string name="MessageDetailsRecipient_new_safety_number">Numër sigurie i ri</string>
<!--MmsDownloader-->
<string name="MmsDownloader_error_storing_mms">Gabim në ruajtjën e MMS!</string>
<string name="MmsDownloader_error_connecting_to_mms_provider">Gabim gjatë lidhjes me ofruesin e MMS...</string>
@@ -346,6 +349,7 @@ importimi i sërishëm do të rezultojë ne mesazhe duplikate.</string>
<string name="MessageRecord_s_is_on_signal_say_hey">%s është në Signal, thuaj tung!</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Ju rregulluar kohën për zhduken mesazhit në %1$s.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s vendosi kohën e zhdukjes së mesazhit në %2$s.</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">Numri juaj sigurie me %s është ndryshuar.</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">Fjalëkalimet nuk përputhen!</string>
<string name="PassphraseChangeActivity_incorrect_old_passphrase_exclamation">Fjalëkalim i vjetër i gabuar!</string>
@@ -438,11 +442,11 @@ Kontrolloni/sigurohuni nëse ky është numri juaj! Do ta verifikojmë me një S
<!--RegistrationProblemsActivity-->
<string name="RegistrationProblemsActivity_possible_problems">Probleme të mundshme</string>
<!--RegistrationProgressActivity-->
<string name="RegistrationProgressActivity_verifying_number">Duke u verifikuar numri</string>
<string name="RegistrationProgressActivity_edit_s">Edito %s</string>
<string name="RegistrationProgressActivity_verifying_number">Duke verifikuar numrin</string>
<string name="RegistrationProgressActivity_edit_s">Ndrysho %s</string>
<string name="RegistrationProgressActivity_registration_complete">U përfundua regjistrimi!</string>
<string name="RegistrationProgressActivity_you_must_enter_the_code_you_received_first">Duhet ta futni kodin që keni marrë së pari...</string>
<string name="RegistrationProgressActivity_connecting">Po lidhet</string>
<string name="RegistrationProgressActivity_connecting">Duke u lidhur</string>
<string name="RegistrationProgressActivity_connecting_for_verification">Duke u lidhur për verifikim...</string>
<string name="RegistrationProgressActivity_network_error">Gabim rrjeti!</string>
<string name="RegistrationProgressActivity_unable_to_connect">Lidhja nuk është e mundur. Ju lutemi kontrolloni nëse jeni lidhur në rrjetë dhe provoni sërisht.</string>
@@ -472,6 +476,7 @@ Kontrolloni/sigurohuni nëse ky është numri juaj! Do ta verifikojmë me një S
për shkëmbim çelsash!</string>
<string name="SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version">
U pranua mesazh për shkembim çelsash për një verzion të protokolli jo valid.</string>
<string name="SmsMessageRecord_received_message_with_new_safety_number_tap_to_process">Është pranuar një lajm me numër sigurie të ri. Shtypni për të vazhduar dhe shfaqur. </string>
<string name="SmsMessageRecord_secure_session_reset">Keni resetuar sesionin e sigurtë.</string>
<string name="SmsMessageRecord_secure_session_reset_s">%s resetoi sesionin e sigurtë.</string>
<string name="SmsMessageRecord_duplicate_message">Porosi e dyfishuar.</string>
@@ -485,9 +490,15 @@ U pranua mesazh për shkembim çelsash për një verzion të protokolli jo valid
<string name="ThreadRecord_media_message">Mesazh medial</string>
<string name="ThreadRecord_s_is_on_signal_say_hey">%s është në Signal, thuaj tung!</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Koha për zhdukje të mesazheve rregulluar në %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Numri juaj sigurie me %s është ndryshuar.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Kontakti i juaj është duke perdorur një version të vjetër të Signal. Ju lutem kërkoni atij/asaj të përditësojë para se të verifikoni numrin e juaj sigurie.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Kontakti juaj ka një version më të ri të Siganl-it me një format QR Kodi që nuk përputhet. Ju lutem shkarkoni versionin e ri për të krahasuar.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Kodi i skanuar QR nuk është një kod verifikimi i numrit sigurie i formatuar korrekt.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Shpërndajeni numrin sigurie me ...</string>
<string name="VerifyIdentityActivity_our_signal_safety_number">Signal numri sigurie i jonë:</string>
<string name="VerifyIdentityActivity_no_app_to_share_to">Duket që nuk keni epa me të cilat të ndani.</string>
<string name="VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard">Asnjë numër sigurie për të krahasuar nuk është gjetur në kujtesen e përkohshme</string>
<!--KeyExchangeInitiator-->
<string name="KeyExchangeInitiator_initiate_despite_existing_request_question">Inico përkurndër kërkesës ekzistuese?</string>
<string name="KeyExchangeInitiator_send">Dërgo</string>
@@ -543,11 +554,20 @@ U pranua mesazh për shkembim çelsash për një verzion të protokolli jo valid
<string name="SingleRecipientNotificationBuilder_new_message">Mesazh i ri</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Imazh</string>
<string name="attachment_type_selector__image_description">Pamje</string>
<string name="attachment_type_selector__audio">Audio</string>
<string name="attachment_type_selector__audio_description">Audio</string>
<string name="attachment_type_selector__video">Video</string>
<string name="attachment_type_selector__video_description">Video</string>
<string name="attachment_type_selector__contact">Kontakt</string>
<string name="attachment_type_selector__contact_description">Kontakt</string>
<string name="attachment_type_selector__camera">Kamera</string>
<string name="attachment_type_selector__camera_description">Kamera</string>
<string name="attachment_type_selector__location">Lokacioni</string>
<string name="attachment_type_selector__location_description">Vendndodhja</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<string name="attachment_type_selector__drawer_description">Ndërroje vizatuesin e shtojcave</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Fjalëkalimi i vjetër</string>
<string name="change_passphrase_activity__new_passphrase">Fjalëkalimi i ri</string>
@@ -578,6 +598,9 @@ U pranua mesazh për shkembim çelsash për një verzion të protokolli jo valid
<string name="conversation_activity__compose_description">Shkrimi i porosisë</string>
<string name="conversation_activity__emoji_toggle_description">Shfaq tastaturën emoji</string>
<string name="conversation_activity__attachment_thumbnail">Foto e shtojcës</string>
<string name="conversation_activity__quick_attachment_drawer_toggle_camera_description">Ndërroje vizatuesin e shtojcave të shpejta te kameres</string>
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">Xhironi zërin dhe dërgojeni të bashkangjitur</string>
<string name="conversation_activity__enable_signal_for_sms">Aktivizo Signal për SMS</string>
<!--conversation_input_panel-->
<string name="conversation_input_panel__slide_to_cancel">RRQITË PËR TË ANULUAR</string>
<!--conversation_item-->
@@ -595,6 +618,9 @@ U pranua mesazh për shkembim çelsash për një verzion të protokolli jo valid
<string name="conversation_item_received__contact_photo_description">Foto e kontaktit</string>
<string name="conversation_item_received__downloading">Duke u shkarkuar</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Luaj</string>
<string name="audio_view__pause_accessibility_description">Ndërprerje</string>
<string name="audio_view__download_accessibility_description">Shkarko</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Mënyrë përzgjedhje grupi</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s të përzgjedhur</string>
@@ -700,6 +726,7 @@ U pranua mesazh për shkembim çelsash për një verzion të protokolli jo valid
<string name="recipient_preferences__block">Blloko</string>
<string name="recipient_preferences__color">Ngjyra</string>
<string name="recipient_preferences__color_for_this_contact">Ngjyra për këtë kontakt</string>
<string name="recipient_preferences__verify_safety_number">Verifiko numrin sigurie</string>
<!--- redphone_call_controls-->
<string name="redphone_call_card__signal_call">Thirrje përmes Signal</string>
<string name="redphone_call_controls__end_call">përfundo thirrjen</string>
@@ -773,8 +800,10 @@ Signal u ndal derisa pritej SMSi për verifikim.</string>
<string name="recipients_panel__to"><small>Shkruaj një emër ose numër</small></string>
<string name="recipients_panel__add_members">Shto pjesëmarrës</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment__if_you_wish_to_verify_the_security_of_your_end_to_end_encryption_with_s"><![CDATA[Nëse dëshironi të verifikoni sigurinë e enkriptimit tuaj end-to-end me %s, krahasoni numrin lartë me numrin në pajisjen e asaj/atij. Përndryshe mundeni të skanoni kodin në telefonin e asaj/atij ose kërkoni prej asaj/atij të skanojë kodin e juaj. <a href=\"https://whispersystems.org/redirect/safety-numbers\">Mësoni më shumë për verifikimin e numrave sigurie</a>]]></string>
<string name="verify_display_fragment__tap_to_scan">Shtypni për të skanuar</string>
<!--verify_identity-->
<string name="verify_identity__share_safety_number">Shpërndajeni numrin sigurie</string>
<!--message_details_header-->
<string name="message_details_header__issues_need_your_attention">Disa gjëra kërkojnë vëmendjen tuaj.</string>
<string name="message_details_header__sent">Dërguar</string>
@@ -790,6 +819,7 @@ Signal u ndal derisa pritej SMSi për verifikim.</string>
<string name="AndroidManifest__select_contacts">Përzgjedh kontaktet</string>
<string name="AndroidManifest__signal_detected">Signal u detektua</string>
<string name="AndroidManifest__change_passphrase">Ndrysho fjalëkalimin</string>
<string name="AndroidManifest__verify_safety_number">Verifiko numrin sigurie</string>
<string name="AndroidManifest__log_submit">Dërgo logun e gabimeve</string>
<string name="AndroidManifest__media_preview">Parapamje e medias</string>
<string name="AndroidManifest__media_overview">Gjitha imazhet</string>
@@ -1042,6 +1072,7 @@ Signal u ndal derisa pritej SMSi për verifikim.</string>
<!--media_preview-->
<string name="media_preview__save_title">Ruaj</string>
<string name="media_preview__forward_title">Përpara</string>
<string name="media_preview__overview_title">Gjithë pamjet</string>
<!--media_overview-->
<string name="media_overview__save_all">Ruaj të gjitha</string>
<!--media_preview_activity-->

View File

@@ -69,6 +69,7 @@
<string name="CallScreen_Incoming_call">Долазни позив</string>
<!--ConfirmIdentityDialog-->
<string name="ConfirmIdentityDialog_your_safety_number_with_s_has_changed">Ваш безбедносни број са %1$s је промењен. Ово може да значи или да неко покушава да пресретне вашу комуникацију или да је корисник %2$s једноставно поново инсталирао Сигнал.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact">Можда желите да потврдите ваш безбедносни број за овај контакт.</string>
<string name="ConfirmIdentityDialog_accept">Прихвати</string>
<!--ContactsDatabase-->
<string name="ContactsDatabase_message_s">Порука за %s</string>
@@ -161,7 +162,11 @@
<item quantity="few">Грешка уписа прилога у складиште!</item>
<item quantity="other">Грешка уписа прилога у складиште!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Фајл успешно сачуван.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">Фајл успешно сачуван.</item>
<item quantity="few">Фајлови успешно сачувани.</item>
<item quantity="other">Фајлови успешно сачувани.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Не могу да упишем у складиште!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Уписивање прилога</item>
@@ -490,6 +495,7 @@
порука размене кључа!</string>
<string name="SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version">
Примљена је порука размене кључа за неисправно издање протокола.</string>
<string name="SmsMessageRecord_received_message_with_new_safety_number_tap_to_process">Примљена је порука са новим безбедносним бројем. Тапните за обраду и приказ.</string>
<string name="SmsMessageRecord_secure_session_reset">Ресетовали сте безбедну сесију.</string>
<string name="SmsMessageRecord_secure_session_reset_s">%s ресетова безбедну сесију.</string>
<string name="SmsMessageRecord_duplicate_message">Порука дупликат.</string>
@@ -507,6 +513,7 @@
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Ваш контакт има старије издање Сигнала. Замолите их да ажурирају пре потврде ваших безбедносних бројева.</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Ваш контакт има новије издање Сигнала са некомпатибилним форматом бар-кôда. Ажурирајте Сигнал да бисте могли да упоређујете.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Очитани бар-кôд није исправно форматиран кôд безбедносног броја. Покушајте поново.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Подели безбедносни број преко...</string>
<string name="VerifyIdentityActivity_our_signal_safety_number">Наш Сигнал безбедносни број:</string>
<string name="VerifyIdentityActivity_no_app_to_share_to">Изгледа да немате ниједну апликацију преко које бисте могли да делите.</string>
@@ -630,6 +637,7 @@
<string name="conversation_item_received__contact_photo_description">Фотографија контакта</string>
<string name="conversation_item_received__downloading">Преузимам</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Пусти</string>
<string name="audio_view__pause_accessibility_description">Паузирај</string>
<string name="audio_view__download_accessibility_description">Преузми</string>
<!--conversation_fragment_cab-->
@@ -814,6 +822,7 @@
<string name="recipients_panel__to"><small>Унесите име или број</small></string>
<string name="recipients_panel__add_members">Додај чланове</string>
<!--verify_display_fragment-->
<string name="verify_display_fragment__if_you_wish_to_verify_the_security_of_your_end_to_end_encryption_with_s"><![CDATA[Ако желите да потврдите безбедност вашег с-краја-на-крај шифровања са %s, упоредите број изнад са бројем на њиховом уређају. Alternatively, можете да очитате кôд на њиховом телефону, или их замолити да очитају ваш кôд. <a href=\"https://whispersystems.org/redirect/safety-numbers\">Сазнајте више о потврђивању безбедносног броја</a>]]></string>
<string name="verify_display_fragment__tap_to_scan">Тапните за скенирање</string>
<!--verify_identity-->
<string name="verify_identity__share_safety_number">Подели безбедносни број</string>

View File

@@ -153,7 +153,6 @@
<item quantity="one">Det blev ett fel när bifogad fil skulle sparas till lagring!</item>
<item quantity="other">Det blev ett fel när de bifogade filerna skulle sparas till lagring!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Sparande av fil lyckades.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Kan inte skriva till lagring!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Sparar bifogad fil</item>
@@ -342,7 +341,7 @@ som inte finns i säkerhetskopian.</string>
<string name="MessageRecord_missed_call_from">Missat samtal från %s</string>
<string name="MessageRecord_s_is_on_signal_say_hey">%s finns på Signal, skriv hej!</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Du satte tiden för försvinnande meddelanden till %1$s.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s sätt tiden för försvinnande meddelanden till %2$s.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s satte tiden för försvinnande meddelanden till %2$s.</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">Ditt säkerhetsnummer med %s har ändrats.</string>
<!--PassphraseChangeActivity-->
<string name="PassphraseChangeActivity_passphrases_dont_match_exclamation">Lösenorden matchar inte!</string>
@@ -484,6 +483,7 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion.</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Tiden för självförstörande meddelanden satt till %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">Ditt säkerhetsnummer med %s har ändrats.</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">Din kontakt använder en äldre version av Signal. Be dem uppdatera sin mjukvara innan de verifierar din säkerhetskod. </string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">Din kontakt kör en nyare version av Signal med ett inkompatibelt format på QR koden. Vänligen uppdatera för att jämföra.</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">Den inlästa QR-koden är inte en korrekt formaterad verifikationskod för säkerhetsnummer. Försök att göra om inläsningen.</string>
<string name="VerifyIdentityActivity_share_safety_number_via">Dela säkerhetsnummer via...</string>
@@ -545,11 +545,20 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion.</string>
<string name="SingleRecipientNotificationBuilder_new_message">Nytt meddelande</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">Bild</string>
<string name="attachment_type_selector__image_description">Bild</string>
<string name="attachment_type_selector__audio">Ljud</string>
<string name="attachment_type_selector__audio_description">Ljud</string>
<string name="attachment_type_selector__video">Video</string>
<string name="attachment_type_selector__video_description">Video</string>
<string name="attachment_type_selector__contact">Kontakt</string>
<string name="attachment_type_selector__contact_description">Kontakt</string>
<string name="attachment_type_selector__camera">Kamera</string>
<string name="attachment_type_selector__camera_description">Kamera</string>
<string name="attachment_type_selector__location">Plats</string>
<string name="attachment_type_selector__location_description">Plats</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<string name="attachment_type_selector__drawer_description">Dölj/visa bilagor</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">Gammal lösenfras</string>
<string name="change_passphrase_activity__new_passphrase">Ny lösenfras</string>
@@ -600,6 +609,9 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion.</string>
<string name="conversation_item_received__contact_photo_description">Kontaktfoto</string>
<string name="conversation_item_received__downloading">Laddar ner</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">Spela</string>
<string name="audio_view__pause_accessibility_description">Pausa</string>
<string name="audio_view__download_accessibility_description">Ladda ner</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">Flervalsläge</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s vald</string>

View File

@@ -128,7 +128,6 @@
<item quantity="other">தேர்ந்தெடுக்கப்பட்ட %1$d செய்தியைகளை நிரந்தரமாக நீக்கீவிடும்.</item>
</plurals>
<string name="ConversationFragment_save_to_sd_card">சேமிப்பில் சேர்க்கவேண்டுமா?</string>
<string name="ConversationFragment_file_saved_successfully">கோப்பு சேமிக்கபட்டது</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">சேமிப்பில் சேர்க இயலவில்லை!</string>
<string name="ConversationFragment_collecting_attahments">இணைப்பு சேமிக்கபடுகிறது</string>
<string name="ConversationFragment_pending">நிலுவையில் உள்ளது...</string>

View File

@@ -145,7 +145,9 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">Ekler depolama alanına kaydedilirken hata oluştu! </item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Dosya başarıyla kaydedildi.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="other">Dosyalar başarıyla kaydedildi.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Depolama alanına yazılamıyor!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">%1$d ekleri kaydediliyor</item>

View File

@@ -161,7 +161,6 @@
<item quantity="few">Під час збереження вкладень до сховища сталася помилка!</item>
<item quantity="other">Під час збереження вкладень до сховища сталася помилка!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Файл успішно збережено.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Неможливо записати до сховища!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Збереження вкладення</item>
@@ -241,13 +240,13 @@
<string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure і RedPhone тепер єдина програма: Signal. Торкніться, щоб дізнатися більше.</string>
<!--ExportFragment-->
<string name="ExportFragment_export">Експортувати</string>
<string name="ExportFragment_export_plaintext_to_storage">Експортувати відкритим текстом на карту SD?</string>
<string name="ExportFragment_warning_this_will_export_the_plaintext_contents">Увага, цим ви експортуєте свої повідомлення на SD-карту у незашифрованому вигляді.</string>
<string name="ExportFragment_export_plaintext_to_storage">Експортувати незашифрованим текстом до сховища?</string>
<string name="ExportFragment_warning_this_will_export_the_plaintext_contents">Увага, цим ви експортуєте свої повідомлення до сховища у незашифрованому вигляді.</string>
<string name="ExportFragment_cancel">Скасувати</string>
<string name="ExportFragment_exporting">Експортування</string>
<string name="ExportFragment_exporting_plaintext_to_storage">Експорт у незашифрованому вигляді на карту SD...</string>
<string name="ExportFragment_error_unable_to_write_to_storage">Помилка, не вдалося записати на накопичувач.</string>
<string name="ExportFragment_error_while_writing_to_storage">Помилка при записі на накопичувач.</string>
<string name="ExportFragment_exporting_plaintext_to_storage">Експорт у незашифрованому вигляді до сховища...</string>
<string name="ExportFragment_error_unable_to_write_to_storage">Помилка, неможливо записати до сховища!</string>
<string name="ExportFragment_error_while_writing_to_storage">Помилка при записі до сховища.</string>
<string name="ExportFragment_export_successful">Експортування успішне.</string>
<!--GcmRefreshJob-->
<string name="GcmRefreshJob_Permanent_Signal_communication_failure">Постійний збій зв\'язку Signal!</string>
@@ -386,7 +385,7 @@
<string name="DeviceProvisioningActivity_content_progress_key_error">Хибний QR-код.</string>
<string name="DeviceProvisioningActivity_sorry_you_have_too_many_devices_linked_already">Вибачте, у вас забагато прив\'язаних пристроїв, спробуйте видалити декілька...</string>
<string name="DeviceActivity_sorry_this_is_not_a_valid_device_link_qr_code">Вибачте, це хибний QR код для прив\'язки пристрою.</string>
<string name="DeviceProvisioningActivity_link_a_signal_device">Прив\'язати пристрій Signal?</string>
<string name="DeviceProvisioningActivity_link_a_signal_device">Приєднати пристрій Signal?</string>
<string name="DeviceProvisioningActivity_it_looks_like_youre_trying_to_link_a_signal_device_using_a_3rd_party_scanner">Здається, ви намагаєтеся приєднати пристрій Signal, використовуючи сканер від 3-ї особи. Для вашого захисту, відскануйте код знову, використовуючи Signal.</string>
<!--ExpirationDialog-->
<string name="ExpirationDialog_disappearing_messages">Зникнення повідомлень</string>
@@ -440,7 +439,8 @@
<string name="RegistrationActivity_connect_with_signal">Підключення до Signal</string>
<string name="RegistrationActivity_select_your_country">Оберіть вашу країну</string>
<string name="RegistrationActivity_you_must_specify_your_country_code">Ви повинні вказати
код вашої країни</string>
код вашої країни
</string>
<string name="RegistrationActivity_you_must_specify_your_phone_number">Ви повинні вказати
номер вашого телефону
</string>
@@ -470,7 +470,7 @@
<string name="RegistrationProgressActivity_connecting_for_verification">Підключення для підтвердження...</string>
<string name="RegistrationProgressActivity_network_error">Помилка мережі!</string>
<string name="RegistrationProgressActivity_unable_to_connect">Неможливо підключитися. Перевірте підключення до мережі та спробуйте знову.</string>
<string name="RegistrationProgressActivity_verification_failed">Перевірку не пройдено!</string>
<string name="RegistrationProgressActivity_verification_failed">Перевірка не вдалася!</string>
<string name="RegistrationProgressActivity_the_verification_code_you_submitted_is_incorrect">Введений код підтвердження хибний. Будь ласка, спробуйте знову.</string>
<string name="RegistrationProgressActivity_too_many_attempts">Забагато спроб</string>
<string name="RegistrationProgressActivity_youve_submitted_an_incorrect_verification_code_too_many_times">Занадто багато спроб введення хибних кодів підтвердження. Зачекайте хвилину і спробуйте знову.</string>
@@ -504,7 +504,7 @@
<string name="ThreadRecord_left_the_group">Покидає групу...</string>
<string name="ThreadRecord_secure_session_reset">Скидання безпечного сеансу.</string>
<string name="ThreadRecord_draft">Чернетка:</string>
<string name="ThreadRecord_called">Ви телефонувал</string>
<string name="ThreadRecord_called">Ви телефонували</string>
<string name="ThreadRecord_called_you">Вам телефонували</string>
<string name="ThreadRecord_missed_call">Пропущений виклик</string>
<string name="ThreadRecord_media_message">Медіа повідомлення</string>
@@ -567,7 +567,7 @@
<string name="MessageNotifier_media_message">Медіа повідомлення</string>
<string name="MessageNotifier_reply">Відповісти</string>
<!--QuickResponseService-->
<string name="QuickResponseService_quick_response_unavailable_when_Signal_is_locked">Швидка відповідь неможлива коли Signal заблоковано!</string>
<string name="QuickResponseService_quick_response_unavailable_when_Signal_is_locked">Швидка відповідь неможлива, коли Signal заблоковано!</string>
<string name="QuickResponseService_problem_sending_message">Проблема під час надсилання повідомлення!</string>
<!--SingleRecipientNotificationBuilder-->
<string name="SingleRecipientNotificationBuilder_signal">Signal</string>
@@ -622,7 +622,7 @@
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">Записати та надіслати аудіо-прикріплення</string>
<string name="conversation_activity__enable_signal_for_sms">Увімкнути Signal для SMS</string>
<!--conversation_input_panel-->
<string name="conversation_input_panel__slide_to_cancel">ПРОВЕДІТЬ, ЩОБ ВІДМІНИТИ</string>
<string name="conversation_input_panel__slide_to_cancel">ПРОВЕДІТЬ, ЩОБ СКАСУВАТИ</string>
<!--conversation_item-->
<string name="conversation_item__mms_downloading_description">Завантаження медіа-повідомлення</string>
<string name="conversation_item__mms_image_description">Медіа повідомлення</string>
@@ -761,14 +761,14 @@
<string name="redphone_call_controls__signal_call">Виклик Signal</string>
<!--registration_activity-->
<string name="registration_activity__verify_your_number_to_connect_with_signal">
Перевірте ваш номер телефону, щоб підключити Signal.
Перевірте ваш номер телефону, щоб з\'єднатися із Signal.
</string>
<string name="registration_activity__your_country">ВАША КРАЇНА</string>
<string name="registration_activity__your_country_code_and_phone_number">КОД ВАШОЇ КРАЇНИ ТА НОМЕР ТЕЛЕФОНУ
</string>
<string name="registration_activity__phone_number">НОМЕР ТЕЛЕФОНУ</string>
<string name="registration_activity__register">Реєстрація</string>
<string name="registration_activity__registration_will_transmit_some_contact_information_to_the_server_temporariliy">Під час реєстрації на вервер передається деяка контактна інформація. Вона не зберігається.</string>
<string name="registration_activity__registration_will_transmit_some_contact_information_to_the_server_temporariliy">Реєстрація передає деяку контактну інформація на сервер. Вона не зберігається.</string>
<string name="registration_activity__powered_by_twilio">За підтримки twilio</string>
<!--registration_problems-->
<string name="registration_problems__some_possible_problems_include">Можливі проблеми
@@ -904,7 +904,7 @@ Signal не дочекався перевірочного SMS.
<string name="preferences__pressing_the_enter_key_will_send_text_messages">Натиснення кнопки Enter відправить повідомлення</string>
<string name="preferences__display_settings">Налаштування відображення</string>
<string name="preferences__choose_identity">Обрати особистість</string>
<string name="preferences__choose_your_contact_entry_from_the_contacts_list">Виберіть себе зі списку контактів.</string>
<string name="preferences__choose_your_contact_entry_from_the_contacts_list">Оберіть себе зі списку контактів.</string>
<string name="preferences__change_passphrase">Змінити фразу-ключ</string>
<string name="preferences__change_your_passphrase">Змінити вашу фразу-ключ</string>
<string name="preferences__enable_passphrase">Увімкнути фразу-пароль</string>
@@ -922,8 +922,8 @@ Signal не дочекався перевірочного SMS.
<string name="preferences__led_color_unknown">Невідомо</string>
<string name="preferences__pref_led_blink_title">Шаблон мерехтіння LED</string>
<string name="preferences__pref_led_blink_custom_pattern_title">Задати власний шаблон мерехтіння LED</string>
<string name="preferences__pref_led_blink_custom_pattern_on_for">Включено для:</string>
<string name="preferences__pref_led_blink_custom_pattern_off_for">Виключено для:</string>
<string name="preferences__pref_led_blink_custom_pattern_on_for">Увімкнено для:</string>
<string name="preferences__pref_led_blink_custom_pattern_off_for">Вимкнено для:</string>
<string name="preferences__pref_led_blink_custom_pattern_set">Власний шаблон мерехтіння LED задано!</string>
<string name="preferences__sound">Звук</string>
<string name="preferences__change_notification_sound">Змінити звук сповіщення</string>
@@ -1128,6 +1128,6 @@ Signal не дочекався перевірочного SMS.
<string name="trimmer__deleting_old_messages">Видалення старих повідомлень...</string>
<string name="trimmer__old_messages_successfully_deleted">Старі повідомлення було успішно видалено</string>
<!--transport_selection_list_item-->
<string name="transport_selection_list_item__transport_icon">Логотип транспорту</string>
<string name="transport_selection_list_item__transport_icon">Логотип типу зв\'язку</string>
<!--EOF-->
</resources>

View File

@@ -142,7 +142,6 @@ Bạn sẽ phải đăng ký lại số điện thoại để sử dụng Signal
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">Có lỗi trong khi đang lưu đính kèm vào thẻ nhớ!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">Đã lưu tập tin thành công.</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Không thể viết vào thẻ nhớ!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">Đang lưu %1$d đính kèm</item>

View File

@@ -145,7 +145,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">保存附件到存储时遇到错误!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">保存文件成功。</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">存储无法写入!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">正在保存 %1$d 附件</item>
@@ -471,6 +470,7 @@
<string name="ThreadRecord_disappearing_message_time_updated_to_s">信息销毁时间设置为 %s</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">您与 %s 的安全码已经改变</string>
<!--VerifyIdentityActivity-->
<string name="VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal">您的联系人使用的是旧版本的暗号,在请求对方验证安全码前,请先让对方升级暗号客户端。</string>
<string name="VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal">您的联系人使用的是新版本的暗号,程序无法识别这个联系人的二维码。
请升级您的暗号。</string>
<string name="VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number">扫描的 QR 码格式不正确。请重新扫一次。</string>
@@ -533,11 +533,20 @@
<string name="SingleRecipientNotificationBuilder_new_message">新信息</string>
<!--attachment_type_selector-->
<string name="attachment_type_selector__image">图片</string>
<string name="attachment_type_selector__image_description">图片</string>
<string name="attachment_type_selector__audio">音频</string>
<string name="attachment_type_selector__audio_description">音频</string>
<string name="attachment_type_selector__video">视频</string>
<string name="attachment_type_selector__video_description">视频</string>
<string name="attachment_type_selector__contact">联系人</string>
<string name="attachment_type_selector__contact_description">联系人</string>
<string name="attachment_type_selector__camera">相机</string>
<string name="attachment_type_selector__camera_description">相机</string>
<string name="attachment_type_selector__location">位置</string>
<string name="attachment_type_selector__location_description">位置</string>
<string name="attachment_type_selector__gif">GIF</string>
<string name="attachment_type_selector__gif_description">Gif</string>
<string name="attachment_type_selector__drawer_description">切换附件抽屉</string>
<!--change_passphrase_activity-->
<string name="change_passphrase_activity__old_passphrase">旧密钥</string>
<string name="change_passphrase_activity__new_passphrase">新密钥</string>
@@ -588,6 +597,9 @@
<string name="conversation_item_received__contact_photo_description">联系人照片</string>
<string name="conversation_item_received__downloading">下载中</string>
<!--audio_view-->
<string name="audio_view__play_accessibility_description">播放</string>
<string name="audio_view__pause_accessibility_description">暂停</string>
<string name="audio_view__download_accessibility_description">下载</string>
<!--conversation_fragment_cab-->
<string name="conversation_fragment_cab__batch_selection_mode">批量选择模式</string>
<string name="conversation_fragment_cab__batch_selection_amount">%s 已选择</string>

View File

@@ -145,7 +145,6 @@
<plurals name="ConversationFragment_error_while_saving_attachments_to_sd_card">
<item quantity="other">保存附件至存儲時遇到錯誤!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">檔案已成功存儲。</string>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">無法寫入儲存裝置!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="other">正在保存 %1$d 附件</item>

View File

@@ -167,7 +167,10 @@
<item quantity="one">Error while saving attachment to storage!</item>
<item quantity="other">Error while saving attachments to storage!</item>
</plurals>
<string name="ConversationFragment_file_saved_successfully">File saved successfully.</string>
<plurals name="ConversationFragment_files_saved_successfully">
<item quantity="one">File saved successfully.</item>
<item quantity="other">Files saved successfully.</item>
</plurals>
<string name="ConversationFragment_unable_to_write_to_sd_card_exclamation">Unable to write to storage!</string>
<plurals name="ConversationFragment_saving_n_attachments">
<item quantity="one">Saving attachment</item>

View File

@@ -42,11 +42,13 @@
<!--<item name="colorPrimary">@android:color/transparent</item>-->
<item name="actionBarStyle">@style/TextSecure.IntroActionBar</item>
<item name="android:windowContentOverlay">@null</item>
<item name="colorAccent">@color/signal_primary</item>
<item name="android:textColorHint">#cc000000</item>
<item name="centered_app_title_color">#55000000</item>
<item name="ic_arrow_forward">@drawable/ic_arrow_forward_light</item>
<item name="lockscreen_watermark">@drawable/lockscreen_watermark_light</item>
<item name="android:windowBackground">@color/gray5</item>
<item name="ic_visibility">@drawable/ic_visibility_grey600_24dp</item>
<item name="ic_visibility_off">@drawable/ic_visibility_off_grey600_24dp</item>
</style>
@@ -54,6 +56,7 @@
<style name="TextSecure.DarkIntroTheme" parent="@style/Theme.AppCompat">
<item name="actionBarStyle">@style/TextSecure.IntroActionBar</item>
<item name="android:windowContentOverlay">@null</item>
<item name="colorAccent">@color/signal_primary_dark</item>
<item name="android:textColorHint">@color/white</item>
<item name="centered_app_title_color">@color/gray27</item>

View File

@@ -36,8 +36,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
public class NotificationBarManager {
private static final int RED_PHONE_NOTIFICATION = 313388;
private static final int MISSED_CALL_NOTIFICATION = 313389;
public static final int RED_PHONE_NOTIFICATION = 313388;
public static final int TYPE_INCOMING_RINGING = 1;
public static final int TYPE_OUTGOING_RINGING = 2;

View File

@@ -21,6 +21,7 @@ import android.content.Context;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.os.StrictMode.VmPolicy;
import android.support.multidex.MultiDexApplication;
import org.thoughtcrime.securesms.crypto.PRNGFixes;
import org.thoughtcrime.securesms.dependencies.AxolotlStorageModule;
@@ -33,7 +34,10 @@ import org.thoughtcrime.securesms.jobs.persistence.EncryptingJobSerializer;
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirementProvider;
import org.thoughtcrime.securesms.jobs.requirements.MediaNetworkRequirementProvider;
import org.thoughtcrime.securesms.jobs.requirements.ServiceRequirementProvider;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.service.DirectoryRefreshListener;
import org.thoughtcrime.securesms.service.ExpiringMessageManager;
import org.thoughtcrime.securesms.service.RotateSignedPreKeyListener;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.jobqueue.JobManager;
import org.whispersystems.jobqueue.dependencies.DependencyInjector;
@@ -51,7 +55,7 @@ import dagger.ObjectGraph;
*
* @author Moxie Marlinspike
*/
public class ApplicationContext extends Application implements DependencyInjector {
public class ApplicationContext extends MultiDexApplication implements DependencyInjector {
private ExpiringMessageManager expiringMessageManager;
private JobManager jobManager;
@@ -74,6 +78,7 @@ public class ApplicationContext extends Application implements DependencyInjecto
initializeExpiringMessageManager();
initializeGcmCheck();
initializeSignedPreKeyCheck();
initializePeriodicTasks();
}
@Override
@@ -126,7 +131,7 @@ public class ApplicationContext extends Application implements DependencyInjecto
}
private void initializeDependencyInjection() {
this.objectGraph = ObjectGraph.create(new SignalCommunicationModule(this),
this.objectGraph = ObjectGraph.create(new SignalCommunicationModule(this, new SignalServiceNetworkAccess(this)),
new RedPhoneCommunicationModule(this),
new AxolotlStorageModule(this));
}
@@ -149,4 +154,9 @@ public class ApplicationContext extends Application implements DependencyInjecto
this.expiringMessageManager = new ExpiringMessageManager(this);
}
private void initializePeriodicTasks() {
RotateSignedPreKeyListener.schedule(this);
DirectoryRefreshListener.schedule(this);
}
}

View File

@@ -38,10 +38,12 @@ import android.provider.Browser;
import android.provider.ContactsContract;
import android.provider.Telephony;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.AlertDialog;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.util.Pair;
@@ -169,7 +171,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
RecipientsModifiedListener,
OnKeyboardShownListener,
AttachmentDrawerListener,
InputPanel.Listener
InputPanel.Listener,
InputPanel.MediaListener
{
private static final String TAG = ConversationActivity.class.getSimpleName();
@@ -507,6 +510,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
private void handleSelectMessageExpiration() {
if (isPushGroupConversation() && !isActiveGroup()) {
return;
}
ExpirationDialog.show(this, recipients.getExpireMessages(), new ExpirationDialog.OnClickListener() {
@Override
public void onClick(final int expirationTime) {
@@ -982,6 +989,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
container.addOnKeyboardShownListener(this);
inputPanel.setListener(this, emojiDrawer);
inputPanel.setMediaListener(this);
int[] attributes = new int[]{R.attr.conversation_item_bubble_background};
TypedArray colors = obtainStyledAttributes(attributes);
@@ -1147,7 +1155,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
}
private void setMedia(Uri uri, MediaType mediaType) {
private void setMedia(@Nullable Uri uri, @NonNull MediaType mediaType) {
if (uri == null) return;
attachmentManager.setMedia(masterSecret, uri, mediaType, getCurrentMediaConstraints());
}
@@ -1605,6 +1613,20 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
else container.show(composeText, emojiDrawer);
}
@Override
public void onMediaSelected(@NonNull Uri uri, String contentType) {
if (!TextUtils.isEmpty(contentType) && contentType.trim().equals("image/gif")) {
setMedia(uri, MediaType.GIF);
} else if (ContentType.isImageType(contentType)) {
setMedia(uri, MediaType.IMAGE);
} else if (ContentType.isVideoType(contentType)) {
setMedia(uri, MediaType.VIDEO);
} else if (ContentType.isAudioType(contentType)) {
setMedia(uri, MediaType.AUDIO);
}
}
// Listeners
private class AttachmentTypeListener implements AttachmentTypeSelector.AttachmentClickedListener {

View File

@@ -109,6 +109,7 @@ public class ConversationFragment extends Fragment
list.setHasFixedSize(false);
list.setLayoutManager(layoutManager);
list.addOnScrollListener(scrollListener);
list.setItemAnimator(null);
loadMoreView = inflater.inflate(R.layout.load_more_header, container, false);
loadMoreView.setOnClickListener(new OnClickListener() {
@@ -171,7 +172,6 @@ public class ConversationFragment extends Fragment
if (this.recipients != null && this.threadId != -1) {
list.setAdapter(new ConversationAdapter(getActivity(), masterSecret, locale, selectionClickListener, null, this.recipients));
getLoaderManager().restartLoader(0, Bundle.EMPTY, this);
list.getItemAnimator().setMoveDuration(120);
}
}
@@ -236,13 +236,7 @@ public class ConversationFragment extends Fragment
}
public void scrollToBottom() {
list.getItemAnimator().isRunning(new ItemAnimatorFinishedListener() {
@Override
public void onAnimationsFinished() {
list.stopScroll();
list.smoothScrollToPosition(0);
}
});
list.smoothScrollToPosition(0);
}
private void handleCopyMessage(final Set<MessageRecord> messageRecords) {

View File

@@ -73,7 +73,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
initializeContactUpdatesReceiver();
DirectoryRefreshListener.schedule(this);
RatingManager.showRatingDialogIfNecessary(this);
}

View File

@@ -61,14 +61,15 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
private MasterSecret masterSecret;
private ZoomingImageView image;
private VideoPlayer video;
private Uri mediaUri;
private String mediaType;
private Recipient recipient;
private long threadId;
private long date;
private long size;
private ZoomingImageView image;
private VideoPlayer video;
private Uri mediaUri;
private String mediaType;
private Recipient recipient;
private long threadId;
private long date;
private long size;
@Override
protected void onCreate(Bundle bundle, @NonNull MasterSecret masterSecret) {
@@ -137,8 +138,8 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
}
private void initializeViews() {
image = (ZoomingImageView)findViewById(R.id.image);
video = (VideoPlayer)findViewById(R.id.video_player);
image = (ZoomingImageView) findViewById(R.id.image);
video = (VideoPlayer) findViewById(R.id.video_player);
}
private void initializeResources() {
@@ -171,7 +172,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
if (mediaType != null && mediaType.startsWith("image/")) {
image.setVisibility(View.VISIBLE);
video.setVisibility(View.GONE);
image.setImageUri(masterSecret, mediaUri);
image.setImageUri(masterSecret, mediaUri, mediaType);
} else if (mediaType != null && mediaType.startsWith("video/")) {
image.setVisibility(View.GONE);
video.setVisibility(View.VISIBLE);
@@ -185,7 +186,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
}
private void cleanupMedia() {
image.setImageDrawable(null);
image.cleanup();
video.cleanup();
}

View File

@@ -14,7 +14,7 @@ import android.util.Log;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
import org.thoughtcrime.securesms.push.Censorship;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.service.MessageRetrievalService;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
@@ -33,12 +33,14 @@ public abstract class PassphraseRequiredActionBarActivity extends BaseActionBarA
private static final int STATE_PROMPT_PUSH_REGISTRATION = 4;
private static final int STATE_EXPERIENCE_UPGRADE = 5;
private BroadcastReceiver clearKeyReceiver;
private boolean isVisible;
private SignalServiceNetworkAccess networkAccess;
private BroadcastReceiver clearKeyReceiver;
private boolean isVisible;
@Override
protected final void onCreate(Bundle savedInstanceState) {
Log.w(TAG, "onCreate(" + savedInstanceState + ")");
this.networkAccess = new SignalServiceNetworkAccess(this);
onPreCreate();
final MasterSecret masterSecret = KeyCachingService.getMasterSecret(this);
routeApplicationState(masterSecret);
@@ -58,8 +60,9 @@ public abstract class PassphraseRequiredActionBarActivity extends BaseActionBarA
super.onResume();
KeyCachingService.registerPassphraseActivityStarted(this);
if (!Censorship.isCensored(this)) MessageRetrievalService.registerActivityStarted(this);
else ApplicationContext.getInstance(this).getJobManager().add(new PushNotificationReceiveJob(this));
if (!networkAccess.isCensored(this)) MessageRetrievalService.registerActivityStarted(this);
else ApplicationContext.getInstance(this).getJobManager().add(new PushNotificationReceiveJob(this));
isVisible = true;
}
@@ -69,7 +72,8 @@ public abstract class PassphraseRequiredActionBarActivity extends BaseActionBarA
super.onPause();
KeyCachingService.registerPassphraseActivityStopped(this);
if (!Censorship.isCensored(this)) MessageRetrievalService.registerActivityStopped(this);
if (!networkAccess.isCensored(this)) MessageRetrievalService.registerActivityStopped(this);
isVisible = false;
}

View File

@@ -201,7 +201,6 @@ public class VerifyIdentityActivity extends PassphraseRequiredActionBarActivity
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.VerifyIdentityActivity_our_signal_safety_number));
intent.putExtra(Intent.EXTRA_TEXT, shareString);
intent.setType("text/plain");

View File

@@ -2,8 +2,15 @@ package org.thoughtcrime.securesms.components;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v13.view.inputmethod.EditorInfoCompat;
import android.support.v13.view.inputmethod.InputConnectionCompat;
import android.support.v13.view.inputmethod.InputContentInfoCompat;
import android.support.v4.os.BuildCompat;
import android.text.InputType;
import android.text.Spannable;
import android.text.SpannableString;
@@ -12,6 +19,7 @@ import android.text.TextUtils;
import android.text.TextUtils.TruncateAt;
import android.text.style.RelativeSizeSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
@@ -25,6 +33,8 @@ public class ComposeText extends EmojiEditText {
private SpannableString hint;
private SpannableString subHint;
@Nullable private InputPanel.MediaListener mediaListener;
public ComposeText(Context context) {
super(context);
}
@@ -114,11 +124,57 @@ public class ComposeText extends EmojiEditText {
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs);
public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
InputConnection inputConnection = super.onCreateInputConnection(editorInfo);
if(TextSecurePreferences.isEnterSendsEnabled(getContext())) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
editorInfo.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return conn;
if (Build.VERSION.SDK_INT <= 13) return inputConnection;
if (mediaListener == null) return inputConnection;
if (inputConnection == null) return null;
EditorInfoCompat.setContentMimeTypes(editorInfo, new String[] {"image/jpeg", "image/png", "image/gif"});
return InputConnectionCompat.createWrapper(inputConnection, editorInfo, new CommitContentListener(mediaListener));
}
public void setMediaListener(@Nullable InputPanel.MediaListener mediaListener) {
this.mediaListener = mediaListener;
}
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB_MR2)
private static class CommitContentListener implements InputConnectionCompat.OnCommitContentListener {
private static final String TAG = CommitContentListener.class.getName();
private final InputPanel.MediaListener mediaListener;
private CommitContentListener(@NonNull InputPanel.MediaListener mediaListener) {
this.mediaListener = mediaListener;
}
@Override
public boolean onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts) {
if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {
try {
inputContentInfo.requestPermission();
} catch (Exception e) {
Log.w(TAG, e);
return false;
}
}
if (inputContentInfo.getDescription().getMimeTypeCount() > 0) {
mediaListener.onMediaSelected(inputContentInfo.getContentUri(),
inputContentInfo.getDescription().getMimeType(0));
return true;
}
return false;
}
}
}

View File

@@ -95,7 +95,7 @@ public class ContactFilterToolbar extends Toolbar {
});
setLogo(null);
setContentInsetStartWithNavigation(0);
expandTapArea(toggleContainer, dialpadToggle);
}

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.components;
import android.annotation.TargetApi;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.support.annotation.NonNull;
@@ -32,14 +33,17 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
public class InputPanel extends LinearLayout
implements MicrophoneRecorderView.Listener, KeyboardAwareLinearLayout.OnKeyboardShownListener, EmojiDrawer.EmojiEventListener {
implements MicrophoneRecorderView.Listener,
KeyboardAwareLinearLayout.OnKeyboardShownListener,
EmojiDrawer.EmojiEventListener
{
private static final String TAG = InputPanel.class.getSimpleName();
private static final int FADE_TIME = 150;
private EmojiToggle emojiToggle;
private EmojiEditText composeText;
private ComposeText composeText;
private View quickCameraToggle;
private View quickAudioToggle;
private View buttonToggle;
@@ -106,6 +110,10 @@ public class InputPanel extends LinearLayout
});
}
public void setMediaListener(@NonNull MediaListener listener) {
composeText.setMediaListener(listener);
}
@Override
public void onRecordPressed(float startPositionX) {
if (listener != null) listener.onRecorderStarted();
@@ -300,4 +308,8 @@ public class InputPanel extends LinearLayout
}
}
}
public interface MediaListener {
public void onMediaSelected(@NonNull Uri uri, String contentType);
}
}

View File

@@ -22,6 +22,7 @@ import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.signature.MediaStoreSignature;
import org.thoughtcrime.securesms.R;
@@ -77,6 +78,8 @@ public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.Lo
private static class RecentPhotoAdapter extends CursorRecyclerViewAdapter<RecentPhotoAdapter.RecentPhotoViewHolder> {
private static final String TAG = RecentPhotoAdapter.class.getName();
@NonNull private final Uri baseUri;
@Nullable private OnItemClickedListener clickedListener;
@@ -112,7 +115,7 @@ public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.Lo
.fromMediaStore()
.load(uri)
.signature(signature)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(viewHolder.imageView);
viewHolder.imageView.setOnClickListener(new OnClickListener() {

View File

@@ -1,48 +1,131 @@
package org.thoughtcrime.securesms.components;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.subsampling.AttachmentBitmapDecoder;
import org.thoughtcrime.securesms.components.subsampling.AttachmentRegionDecoder;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.util.BitmapDecodingException;
import org.thoughtcrime.securesms.util.BitmapUtil;
import java.io.IOException;
import java.io.InputStream;
import uk.co.senab.photoview.PhotoViewAttacher;
public class ZoomingImageView extends ImageView {
private PhotoViewAttacher attacher = new PhotoViewAttacher(this);
public class ZoomingImageView extends FrameLayout {
private static final String TAG = ZoomingImageView.class.getName();
private final ImageView imageView;
private final PhotoViewAttacher imageViewAttacher;
private final SubsamplingScaleImageView subsamplingImageView;
public ZoomingImageView(Context context) {
super(context);
this(context, null);
}
public ZoomingImageView(Context context, AttributeSet attrs) {
super(context, attrs);
this(context, attrs, 0);
}
public ZoomingImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.zooming_image_view, this);
this.imageView = (ImageView) findViewById(R.id.image_view);
this.subsamplingImageView = (SubsamplingScaleImageView) findViewById(R.id.subsampling_image_view);
this.imageViewAttacher = new PhotoViewAttacher(imageView);
this.subsamplingImageView.setBitmapDecoderClass(AttachmentBitmapDecoder.class);
this.subsamplingImageView.setRegionDecoderClass(AttachmentRegionDecoder.class);
this.subsamplingImageView.setOrientation(SubsamplingScaleImageView.ORIENTATION_USE_EXIF);
}
public void setImageUri(MasterSecret masterSecret, Uri uri) {
public void setImageUri(final MasterSecret masterSecret, final Uri uri, final String contentType) {
final Context context = getContext();
final int maxTextureSize = BitmapUtil.getMaxTextureSize();
Log.w(TAG, "Max texture size: " + maxTextureSize);
new AsyncTask<Void, Void, Pair<Integer, Integer>>() {
@Override
protected @Nullable Pair<Integer, Integer> doInBackground(Void... params) {
if (contentType.equals("image/gif")) return null;
try {
InputStream inputStream = PartAuthority.getAttachmentStream(context, masterSecret, uri);
return BitmapUtil.getDimensions(inputStream);
} catch (IOException | BitmapDecodingException e) {
Log.w(TAG, e);
return null;
}
}
protected void onPostExecute(@Nullable Pair<Integer, Integer> dimensions) {
Log.w(TAG, "Dimensions: " + (dimensions == null ? "(null)" : dimensions.first + ", " + dimensions.second));
if (dimensions == null || (dimensions.first <= maxTextureSize && dimensions.second <= maxTextureSize)) {
Log.w(TAG, "Loading in standard image view...");
setImageViewUri(masterSecret, uri);
} else {
Log.w(TAG, "Loading in subsampling image view...");
setSubsamplingImageViewUri(uri);
}
}
}.execute();
}
private void setImageViewUri(MasterSecret masterSecret, Uri uri) {
subsamplingImageView.setVisibility(View.GONE);
imageView.setVisibility(View.VISIBLE);
Glide.with(getContext())
.load(new DecryptableUri(masterSecret, uri))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.dontTransform()
.dontAnimate()
.into(new GlideDrawableImageViewTarget(this) {
.into(new GlideDrawableImageViewTarget(imageView) {
@Override protected void setResource(GlideDrawable resource) {
super.setResource(resource);
attacher.update();
imageViewAttacher.update();
}
});
}
private void setSubsamplingImageViewUri(Uri uri) {
subsamplingImageView.setVisibility(View.VISIBLE);
imageView.setVisibility(View.GONE);
subsamplingImageView.setImage(ImageSource.uri(uri));
}
public void cleanup() {
imageView.setImageDrawable(null);
subsamplingImageView.recycle();
}
}

View File

@@ -0,0 +1,52 @@
package org.thoughtcrime.securesms.components.subsampling;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.net.Uri;
import com.davemorrissey.labs.subscaleview.decoder.ImageDecoder;
import com.davemorrissey.labs.subscaleview.decoder.SkiaImageDecoder;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.service.KeyCachingService;
import java.io.InputStream;
public class AttachmentBitmapDecoder implements ImageDecoder{
@Override
public Bitmap decode(Context context, Uri uri) throws Exception {
if (!PartAuthority.isLocalUri(uri)) {
return new SkiaImageDecoder().decode(context, uri);
}
MasterSecret masterSecret = KeyCachingService.getMasterSecret(context);
if (masterSecret == null) {
throw new IllegalStateException("Can't decode without secret");
}
InputStream inputStream = PartAuthority.getAttachmentStream(context, masterSecret, uri);
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
if (bitmap == null) {
throw new RuntimeException("Skia image region decoder returned null bitmap - image format may not be supported");
}
return bitmap;
} finally {
if (inputStream != null) inputStream.close();
}
}
}

View File

@@ -0,0 +1,95 @@
package org.thoughtcrime.securesms.components.subsampling;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
import android.graphics.Point;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
import com.davemorrissey.labs.subscaleview.decoder.ImageRegionDecoder;
import com.davemorrissey.labs.subscaleview.decoder.SkiaImageRegionDecoder;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.service.KeyCachingService;
import java.io.InputStream;
public class AttachmentRegionDecoder implements ImageRegionDecoder {
private static final String TAG = AttachmentRegionDecoder.class.getName();
private SkiaImageRegionDecoder passthrough;
private BitmapRegionDecoder bitmapRegionDecoder;
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD_MR1)
@Override
public Point init(Context context, Uri uri) throws Exception {
Log.w(TAG, "Init!");
if (!PartAuthority.isLocalUri(uri)) {
passthrough = new SkiaImageRegionDecoder();
return passthrough.init(context, uri);
}
MasterSecret masterSecret = KeyCachingService.getMasterSecret(context);
if (masterSecret == null) {
throw new IllegalStateException("No master secret available...");
}
InputStream inputStream = PartAuthority.getAttachmentStream(context, masterSecret, uri);
this.bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
inputStream.close();
return new Point(bitmapRegionDecoder.getWidth(), bitmapRegionDecoder.getHeight());
}
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD_MR1)
@Override
public Bitmap decodeRegion(Rect rect, int sampleSize) {
Log.w(TAG, "Decode region: " + rect);
if (passthrough != null) {
return passthrough.decodeRegion(rect, sampleSize);
}
synchronized(this) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = sampleSize;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = bitmapRegionDecoder.decodeRegion(rect, options);
if (bitmap == null) {
throw new RuntimeException("Skia image decoder returned null bitmap - image format may not be supported");
}
return bitmap;
}
}
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD_MR1)
public boolean isReady() {
Log.w(TAG, "isReady");
return (passthrough != null && passthrough.isReady()) ||
(bitmapRegionDecoder != null && !bitmapRegionDecoder.isRecycled());
}
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD_MR1)
public void recycle() {
if (passthrough != null) {
passthrough.recycle();
passthrough = null;
} else {
bitmapRegionDecoder.recycle();
}
}
}

View File

@@ -35,6 +35,7 @@ import android.util.Log;
import android.util.Pair;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.push.ContactTokenDetails;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
@@ -58,16 +59,16 @@ public class ContactsDatabase {
private static final String CALL_MIMETYPE = "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.call";
private static final String SYNC = "__TS";
public static final String ID_COLUMN = "_id";
public static final String NAME_COLUMN = "name";
public static final String NUMBER_COLUMN = "number";
public static final String NUMBER_TYPE_COLUMN = "number_type";
public static final String LABEL_COLUMN = "label";
public static final String CONTACT_TYPE_COLUMN = "contact_type";
static final String ID_COLUMN = "_id";
static final String NAME_COLUMN = "name";
static final String NUMBER_COLUMN = "number";
static final String NUMBER_TYPE_COLUMN = "number_type";
static final String LABEL_COLUMN = "label";
static final String CONTACT_TYPE_COLUMN = "contact_type";
public static final int NORMAL_TYPE = 0;
public static final int PUSH_TYPE = 1;
public static final int NEW_TYPE = 2;
static final int NORMAL_TYPE = 0;
static final int PUSH_TYPE = 1;
static final int NEW_TYPE = 2;
private final Context context;
@@ -99,7 +100,8 @@ public class ContactsDatabase {
Log.w(TAG, "Adding number: " + registeredNumber);
addedNumbers.add(registeredNumber);
addTextSecureRawContact(operations, account, systemContactInfo.get().number,
systemContactInfo.get().id, registeredContact.isVoice());
systemContactInfo.get().name, systemContactInfo.get().id,
registeredContact.isVoice());
}
}
}
@@ -118,6 +120,11 @@ public class ContactsDatabase {
} else if (!tokenDetails.isVoice() && currentContactEntry.getValue().isVoiceSupported()) {
Log.w(TAG, "Removing voice support: " + currentContactEntry.getKey());
removeContactVoiceSupport(operations, currentContactEntry.getValue().getId());
} else if (!Util.isStringEquals(currentContactEntry.getValue().getRawDisplayName(),
currentContactEntry.getValue().getAggregateDisplayName()))
{
Log.w(TAG, "Updating display name: " + currentContactEntry.getKey());
updateDisplayName(operations, currentContactEntry.getValue().getAggregateDisplayName(), currentContactEntry.getValue().getId(), currentContactEntry.getValue().getDisplayNameSource());
}
}
@@ -128,7 +135,7 @@ public class ContactsDatabase {
return addedNumbers;
}
public @NonNull Cursor querySystemContacts(String filter) {
@NonNull Cursor querySystemContacts(String filter) {
Uri uri;
if (!TextUtils.isEmpty(filter)) {
@@ -176,7 +183,7 @@ public class ContactsDatabase {
new Pair<String, Object>(CONTACT_TYPE_COLUMN, NORMAL_TYPE));
}
public @NonNull Cursor queryTextSecureContacts(String filter) {
@NonNull Cursor queryTextSecureContacts(String filter) {
String[] projection = new String[] {ContactsContract.Data._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Data.DATA1};
@@ -231,6 +238,30 @@ public class ContactsDatabase {
.build());
}
private void updateDisplayName(List<ContentProviderOperation> operations,
@Nullable String displayName,
long rawContactId, int displayNameSource)
{
Uri dataUri = ContactsContract.Data.CONTENT_URI.buildUpon()
.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
.build();
if (displayNameSource != ContactsContract.DisplayNameSources.STRUCTURED_NAME) {
operations.add(ContentProviderOperation.newInsert(dataUri)
.withValue(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.build());
} else {
operations.add(ContentProviderOperation.newUpdate(dataUri)
.withSelection(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?",
new String[] {String.valueOf(rawContactId), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.build());
}
}
private void removeContactVoiceSupport(List<ContentProviderOperation> operations, long rawContactId) {
operations.add(ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI)
.withSelection(RawContacts._ID + " = ?", new String[] {String.valueOf(rawContactId)})
@@ -245,7 +276,7 @@ public class ContactsDatabase {
}
private void addTextSecureRawContact(List<ContentProviderOperation> operations,
Account account, String e164number,
Account account, String e164number, String displayName,
long aggregateId, boolean supportsVoice)
{
int index = operations.size();
@@ -260,6 +291,12 @@ public class ContactsDatabase {
.withValue(RawContacts.SYNC4, String.valueOf(supportsVoice))
.build());
operations.add(ContentProviderOperation.newInsert(dataUri)
.withValueBackReference(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, index)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.build());
operations.add(ContentProviderOperation.newInsert(dataUri)
.withValueBackReference(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID, index)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
@@ -321,7 +358,15 @@ public class ContactsDatabase {
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(currentContactsUri, new String[] {BaseColumns._ID, RawContacts.SYNC1, RawContacts.SYNC4}, null, null, null);
String[] projection;
if (Build.VERSION.SDK_INT >= 11) {
projection = new String[] {BaseColumns._ID, RawContacts.SYNC1, RawContacts.SYNC4, RawContacts.CONTACT_ID, RawContacts.DISPLAY_NAME_PRIMARY, RawContacts.DISPLAY_NAME_SOURCE};
} else{
projection = new String[] {BaseColumns._ID, RawContacts.SYNC1, RawContacts.SYNC4, RawContacts.CONTACT_ID};
}
cursor = context.getContentResolver().query(currentContactsUri, projection, null, null, null);
while (cursor != null && cursor.moveToNext()) {
String currentNumber;
@@ -333,7 +378,20 @@ public class ContactsDatabase {
currentNumber = cursor.getString(1);
}
signalContacts.put(currentNumber, new SignalContact(cursor.getLong(0), cursor.getString(2)));
long rawContactId = cursor.getLong(0);
long contactId = cursor.getLong(3);
String supportsVoice = cursor.getString(2);
String rawContactDisplayName = null;
String aggregateDisplayName = null;
int rawContactDisplayNameSource = 0;
if (Build.VERSION.SDK_INT >= 11) {
rawContactDisplayName = cursor.getString(4);
rawContactDisplayNameSource = cursor.getInt(5);
aggregateDisplayName = getDisplayName(contactId);
}
signalContacts.put(currentNumber, new SignalContact(rawContactId, supportsVoice, rawContactDisplayName, aggregateDisplayName, rawContactDisplayNameSource));
}
} finally {
if (cursor != null)
@@ -386,15 +444,33 @@ public class ContactsDatabase {
return Optional.absent();
}
private @Nullable String getDisplayName(long contactId) {
Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts.DISPLAY_NAME},
ContactsContract.Contacts._ID + " = ?",
new String[] {String.valueOf(contactId)},
null);
try {
if (cursor != null && cursor.moveToFirst()) {
return cursor.getString(0);
} else {
return null;
}
} finally {
if (cursor != null) cursor.close();
}
}
private static class ProjectionMappingCursor extends CursorWrapper {
private final Map<String, String> projectionMap;
private final Pair<String, Object>[] extras;
@SafeVarargs
public ProjectionMappingCursor(Cursor cursor,
Map<String, String> projectionMap,
Pair<String, Object>... extras)
ProjectionMappingCursor(Cursor cursor,
Map<String, String> projectionMap,
Pair<String, Object>... extras)
{
super(cursor);
this.projectionMap = projectionMap;
@@ -498,20 +574,46 @@ public class ContactsDatabase {
}
private static class SignalContact {
private final long id;
@Nullable private final String supportsVoice;
@Nullable private final String rawDisplayName;
@Nullable private final String aggregateDisplayName;
private final int displayNameSource;
public SignalContact(long id, @Nullable String supportsVoice) {
this.id = id;
this.supportsVoice = supportsVoice;
SignalContact(long id,
@Nullable String supportsVoice,
@Nullable String rawDisplayName,
@Nullable String aggregateDisplayName,
int displayNameSource)
{
this.id = id;
this.supportsVoice = supportsVoice;
this.rawDisplayName = rawDisplayName;
this.aggregateDisplayName = aggregateDisplayName;
this.displayNameSource = displayNameSource;
}
public long getId() {
return id;
}
public boolean isVoiceSupported() {
boolean isVoiceSupported() {
return "true".equals(supportsVoice);
}
@Nullable
String getRawDisplayName() {
return rawDisplayName;
}
@Nullable
String getAggregateDisplayName() {
return aggregateDisplayName;
}
int getDisplayNameSource() {
return displayNameSource;
}
}
}

View File

@@ -35,6 +35,7 @@ import org.whispersystems.libsignal.state.PreKeyStore;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.libsignal.state.SignedPreKeyStore;
import org.whispersystems.libsignal.util.Medium;
import org.whispersystems.libsignal.util.guava.Optional;
import java.io.File;
import java.io.FileInputStream;
@@ -46,7 +47,9 @@ import java.util.List;
public class PreKeyUtil {
public static final int BATCH_SIZE = 100;
private static final String TAG = PreKeyUtil.class.getName();
private static final int BATCH_SIZE = 100;
public static List<PreKeyRecord> generatePreKeys(Context context) {
PreKeyStore preKeyStore = new TextSecurePreKeyStore(context);
@@ -66,7 +69,7 @@ public class PreKeyUtil {
return records;
}
public static SignedPreKeyRecord generateSignedPreKey(Context context, IdentityKeyPair identityKeyPair)
public static SignedPreKeyRecord generateSignedPreKey(Context context, IdentityKeyPair identityKeyPair, boolean active)
{
try {
SignedPreKeyStore signedPreKeyStore = new TextSecurePreKeyStore(context);
@@ -78,6 +81,10 @@ public class PreKeyUtil {
signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record);
setNextSignedPreKeyId(context, (signedPreKeyId + 1) % Medium.MAX_VALUE);
if (active) {
setActiveSignedPreKeyId(context, signedPreKeyId);
}
return record;
} catch (InvalidKeyException e) {
throw new AssertionError(e);
@@ -104,7 +111,7 @@ public class PreKeyUtil {
return record;
}
private static void setNextPreKeyId(Context context, int id) {
private static synchronized void setNextPreKeyId(Context context, int id) {
try {
File nextFile = new File(getPreKeysDirectory(context), PreKeyIndex.FILE_NAME);
FileOutputStream fout = new FileOutputStream(nextFile);
@@ -115,18 +122,36 @@ public class PreKeyUtil {
}
}
private static void setNextSignedPreKeyId(Context context, int id) {
private static synchronized void setNextSignedPreKeyId(Context context, int id) {
try {
File nextFile = new File(getSignedPreKeysDirectory(context), SignedPreKeyIndex.FILE_NAME);
FileOutputStream fout = new FileOutputStream(nextFile);
fout.write(JsonUtils.toJson(new SignedPreKeyIndex(id)).getBytes());
fout.close();
SignedPreKeyIndex index = getSignedPreKeyIndex(context).or(new SignedPreKeyIndex());
index.nextSignedPreKeyId = id;
setSignedPreKeyIndex(context, index);
} catch (IOException e) {
Log.w("PreKeyUtil", e);
Log.w(TAG, e);
}
}
private static int getNextPreKeyId(Context context) {
public static synchronized void setActiveSignedPreKeyId(Context context, int id) {
try {
SignedPreKeyIndex index = getSignedPreKeyIndex(context).or(new SignedPreKeyIndex());
index.activeSignedPreKeyId = id;
setSignedPreKeyIndex(context, index);
} catch (IOException e) {
Log.w(TAG, e);
}
}
public static synchronized int getActiveSignedPreKeyId(Context context) {
Optional<SignedPreKeyIndex> index = getSignedPreKeyIndex(context);
if (index.isPresent()) return index.get().activeSignedPreKeyId;
else return -1;
}
private static synchronized int getNextPreKeyId(Context context) {
try {
File nextFile = new File(getPreKeysDirectory(context), PreKeyIndex.FILE_NAME);
@@ -144,7 +169,7 @@ public class PreKeyUtil {
}
}
private static int getNextSignedPreKeyId(Context context) {
private static synchronized int getNextSignedPreKeyId(Context context) {
try {
File nextFile = new File(getSignedPreKeysDirectory(context), SignedPreKeyIndex.FILE_NAME);
@@ -162,6 +187,32 @@ public class PreKeyUtil {
}
}
private static synchronized Optional<SignedPreKeyIndex> getSignedPreKeyIndex(Context context) {
File indexFile = new File(getSignedPreKeysDirectory(context), SignedPreKeyIndex.FILE_NAME);
if (!indexFile.exists()) {
return Optional.absent();
}
try {
InputStreamReader reader = new InputStreamReader(new FileInputStream(indexFile));
SignedPreKeyIndex index = JsonUtils.fromJson(reader, SignedPreKeyIndex.class);
reader.close();
return Optional.of(index);
} catch (IOException e) {
Log.w(TAG, e);
return Optional.absent();
}
}
private static synchronized void setSignedPreKeyIndex(Context context, SignedPreKeyIndex index) throws IOException {
File indexFile = new File(getSignedPreKeysDirectory(context), SignedPreKeyIndex.FILE_NAME);
FileOutputStream fout = new FileOutputStream(indexFile);
fout.write(JsonUtils.toJson(index).getBytes());
fout.close();
}
private static File getPreKeysDirectory(Context context) {
return getKeysDirectory(context, TextSecurePreKeyStore.PREKEY_DIRECTORY);
}
@@ -198,11 +249,11 @@ public class PreKeyUtil {
@JsonProperty
private int nextSignedPreKeyId;
@JsonProperty
private int activeSignedPreKeyId = -1;
public SignedPreKeyIndex() {}
public SignedPreKeyIndex(int nextSignedPreKeyId) {
this.nextSignedPreKeyId = nextSignedPreKeyId;
}
}

View File

@@ -79,7 +79,9 @@ public class TextSecurePreKeyStore implements PreKeyStore, SignedPreKeyStore {
for (File signedPreKeyFile : directory.listFiles()) {
try {
results.add(new SignedPreKeyRecord(loadSerializedRecord(signedPreKeyFile)));
if (!"index.dat".equals(signedPreKeyFile.getName())) {
results.add(new SignedPreKeyRecord(loadSerializedRecord(signedPreKeyFile)));
}
} catch (IOException | InvalidMessageException e) {
Log.w(TAG, e);
}

View File

@@ -34,8 +34,10 @@ import com.google.i18n.phonenumbers.Phonenumber;
import com.google.i18n.phonenumbers.ShortNumberInfo;
import org.thoughtcrime.securesms.util.GroupUtil;
import org.thoughtcrime.securesms.util.LRUCache;
import org.thoughtcrime.securesms.util.ShortCodeUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
@@ -62,8 +64,9 @@ public class CanonicalAddressDatabase {
private DatabaseHelper databaseHelper;
private final Context context;
private final Map<String, Long> addressCache = new ConcurrentHashMap<>();
private final Map<Long, String> idCache = new ConcurrentHashMap<>();
private final Map<String, Long> addressCache = new ConcurrentHashMap<>();
private final Map<Long, String> idCache = new ConcurrentHashMap<>();
private final LRUCache<String, String> formattedAddressCache = new LRUCache<>(100);
public synchronized static CanonicalAddressDatabase getInstance(Context context) {
if (instance == null)
@@ -147,24 +150,30 @@ public class CanonicalAddressDatabase {
public long getCanonicalAddressId(@NonNull String address) {
try {
long canonicalAddressId;
long canonicalAddressId;
String formattedAddress;
if (isNumberAddress(address) && TextSecurePreferences.isPushRegistered(context)) {
if ((formattedAddress = formattedAddressCache.get(address)) == null) {
String localNumber = TextSecurePreferences.getLocalNumber(context);
if (!ShortCodeUtil.isShortCode(localNumber, address)) {
address = PhoneNumberFormatter.formatNumber(address, localNumber);
if (!isNumberAddress(address) ||
!TextSecurePreferences.isPushRegistered(context) ||
ShortCodeUtil.isShortCode(localNumber, address))
{
formattedAddress = address;
} else {
formattedAddress = PhoneNumberFormatter.formatNumber(address, localNumber);
}
formattedAddressCache.put(address, formattedAddress);
}
if ((canonicalAddressId = getCanonicalAddressFromCache(address)) != -1) {
return canonicalAddressId;
if ((canonicalAddressId = getCanonicalAddressFromCache(formattedAddress)) == -1) {
canonicalAddressId = getCanonicalAddressIdFromDatabase(formattedAddress);
}
canonicalAddressId = getCanonicalAddressIdFromDatabase(address);
idCache.put(canonicalAddressId, address);
addressCache.put(address, canonicalAddressId);
idCache.put(canonicalAddressId, formattedAddress);
addressCache.put(formattedAddress, canonicalAddressId);
return canonicalAddressId;
} catch (InvalidNumberException e) {

View File

@@ -204,14 +204,12 @@ public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHold
public void onChanged() {
super.onChanged();
valid = true;
notifyDataSetChanged();
}
@Override
public void onInvalidated() {
super.onInvalidated();
valid = false;
notifyDataSetChanged();
}
}
}

View File

@@ -65,7 +65,7 @@ public class EncryptingSmsDatabase extends SmsDatabase {
OutgoingTextMessage message, boolean forceSms,
long timestamp)
{
long type = Types.BASE_OUTBOX_TYPE;
long type = Types.BASE_SENDING_TYPE;
if (masterSecret.getMasterSecret().isPresent()) {
message = message.withBody(getEncryptedBody(masterSecret.getMasterSecret().get(), message.getMessageBody()));

View File

@@ -382,11 +382,11 @@ public class MmsDatabase extends MessagingDatabase {
notifyConversationListeners(threadId);
}
public void markAsSending(long messageId) {
long threadId = getThreadIdForMessage(messageId);
updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE, Optional.of(threadId));
notifyConversationListeners(threadId);
}
// public void markAsSending(long messageId) {
// long threadId = getThreadIdForMessage(messageId);
// updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE, Optional.of(threadId));
// notifyConversationListeners(threadId);
// }
public void markAsSentFailed(long messageId) {
long threadId = getThreadIdForMessage(messageId);
@@ -394,9 +394,9 @@ public class MmsDatabase extends MessagingDatabase {
notifyConversationListeners(threadId);
}
public void markAsSent(long messageId) {
public void markAsSent(long messageId, boolean secure) {
long threadId = getThreadIdForMessage(messageId);
updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENT_TYPE, Optional.of(threadId));
updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENT_TYPE | (secure ? Types.PUSH_MESSAGE_BIT | Types.SECURE_MESSAGE_BIT : 0), Optional.of(threadId));
notifyConversationListeners(threadId);
}
@@ -414,17 +414,17 @@ public class MmsDatabase extends MessagingDatabase {
notifyConversationListeners(threadId);
}
public void markAsSecure(long messageId) {
updateMailboxBitmask(messageId, 0, Types.SECURE_MESSAGE_BIT, Optional.<Long>absent());
}
// public void markAsSecure(long messageId) {
// updateMailboxBitmask(messageId, 0, Types.SECURE_MESSAGE_BIT, Optional.<Long>absent());
// }
public void markAsInsecure(long messageId) {
updateMailboxBitmask(messageId, Types.SECURE_MESSAGE_BIT, 0, Optional.<Long>absent());
}
public void markAsPush(long messageId) {
updateMailboxBitmask(messageId, 0, Types.PUSH_MESSAGE_BIT, Optional.<Long>absent());
}
// public void markAsPush(long messageId) {
// updateMailboxBitmask(messageId, 0, Types.PUSH_MESSAGE_BIT, Optional.<Long>absent());
// }
public void markAsDecryptFailed(long messageId, long threadId) {
updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT, Optional.of(threadId));
@@ -847,12 +847,12 @@ public class MmsDatabase extends MessagingDatabase {
long threadId, boolean forceSms)
throws MmsException
{
long type = Types.BASE_OUTBOX_TYPE;
long type = Types.BASE_SENDING_TYPE;
if (masterSecret.getMasterSecret().isPresent()) type |= Types.ENCRYPTION_SYMMETRIC_BIT;
else type |= Types.ENCRYPTION_ASYMMETRIC_BIT;
if (message.isSecure()) type |= Types.SECURE_MESSAGE_BIT;
if (message.isSecure()) type |= (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT);
if (forceSms) type |= Types.MESSAGE_FORCE_SMS_BIT;
if (message.isGroup()) {

View File

@@ -228,12 +228,8 @@ public class SmsDatabase extends MessagingDatabase {
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_PENDING_INSECURE_SMS_FALLBACK);
}
public void markAsSending(long id) {
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE);
}
public void markAsSent(long id) {
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENT_TYPE);
public void markAsSent(long id, boolean isSecure) {
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENT_TYPE | (isSecure ? Types.PUSH_MESSAGE_BIT | Types.SECURE_MESSAGE_BIT : 0));
}
public void markExpireStarted(long id) {
@@ -575,7 +571,7 @@ public class SmsDatabase extends MessagingDatabase {
long type, boolean forceSms, long date)
{
if (message.isKeyExchange()) type |= Types.KEY_EXCHANGE_BIT;
else if (message.isSecureMessage()) type |= Types.SECURE_MESSAGE_BIT;
else if (message.isSecureMessage()) type |= (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT);
else if (message.isEndSession()) type |= Types.END_SESSION_BIT;
if (forceSms) type |= Types.MESSAGE_FORCE_SMS_BIT;

View File

@@ -23,17 +23,15 @@ import org.thoughtcrime.securesms.jobs.PushTextSendJob;
import org.thoughtcrime.securesms.jobs.RefreshAttributesJob;
import org.thoughtcrime.securesms.jobs.RefreshPreKeysJob;
import org.thoughtcrime.securesms.jobs.RequestGroupInfoJob;
import org.thoughtcrime.securesms.push.Censorship;
import org.thoughtcrime.securesms.push.SignalServiceTrustStore;
import org.thoughtcrime.securesms.push.CensorshipFrontingTrustStore;
import org.thoughtcrime.securesms.jobs.RotateSignedPreKeyJob;
import org.thoughtcrime.securesms.push.SecurityEventListener;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.service.MessageRetrievalService;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import org.whispersystems.signalservice.api.SignalServiceMessageSender;
import org.whispersystems.signalservice.api.push.TrustStore;
import org.whispersystems.signalservice.api.util.CredentialsProvider;
import org.whispersystems.signalservice.internal.push.SignalServiceUrl;
@@ -59,27 +57,20 @@ import dagger.Provides;
GcmRefreshJob.class,
RequestGroupInfoJob.class,
PushGroupUpdateJob.class,
AvatarDownloadJob.class})
AvatarDownloadJob.class,
RotateSignedPreKeyJob.class})
public class SignalCommunicationModule {
private final Context context;
private final SignalServiceUrl url;
private final TrustStore trustStore;
private final Context context;
private final SignalServiceUrl[] urls;
public SignalCommunicationModule(Context context) {
this.context = context;
if (Censorship.isCensored(context)) {
this.url = new SignalServiceUrl(BuildConfig.UNCENSORED_FRONTING_HOST, BuildConfig.CENSORED_REFLECTOR);
this.trustStore = new CensorshipFrontingTrustStore(context);
} else {
this.url = new SignalServiceUrl(BuildConfig.TEXTSECURE_URL, null);
this.trustStore = new SignalServiceTrustStore(context);
}
public SignalCommunicationModule(Context context, SignalServiceNetworkAccess networkAccess) {
this.context = context;
this.urls = networkAccess.getConfiguration(context);
}
@Provides SignalServiceAccountManager provideSignalAccountManager() {
return new SignalServiceAccountManager(this.url, this.trustStore,
return new SignalServiceAccountManager(urls,
TextSecurePreferences.getLocalNumber(context),
TextSecurePreferences.getPushServerPassword(context),
BuildConfig.USER_AGENT);
@@ -90,8 +81,7 @@ public class SignalCommunicationModule {
return new SignalMessageSenderFactory() {
@Override
public SignalServiceMessageSender create() {
return new SignalServiceMessageSender(SignalCommunicationModule.this.url,
SignalCommunicationModule.this.trustStore,
return new SignalServiceMessageSender(urls,
TextSecurePreferences.getLocalNumber(context),
TextSecurePreferences.getPushServerPassword(context),
new SignalProtocolStoreImpl(context),
@@ -102,7 +92,7 @@ public class SignalCommunicationModule {
}
@Provides SignalServiceMessageReceiver provideSignalMessageReceiver() {
return new SignalServiceMessageReceiver(this.url, this.trustStore,
return new SignalServiceMessageReceiver(urls,
new DynamicCredentialsProvider(context),
BuildConfig.USER_AGENT);
}

View File

@@ -112,6 +112,9 @@ public class GiphyActivityToolbar extends Toolbar {
}
});
setLogo(null);
setNavigationIcon(null);
setContentInsetStartWithNavigation(0);
expandTapArea(this, action);
expandTapArea(toggleContainer, gridToggle);
}

View File

@@ -207,7 +207,7 @@ public class GroupMessageProcessor {
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
long messageId = mmsDatabase.insertMessageOutbox(masterSecret, outgoingMessage, threadId, false);
mmsDatabase.markAsSent(messageId);
mmsDatabase.markAsSent(messageId, true);
return threadId;
} else {

View File

@@ -7,6 +7,7 @@ import android.util.Log;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.dependencies.InjectableType;
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
import org.thoughtcrime.securesms.mms.AttachmentStreamUriLoader.AttachmentModel;
import org.thoughtcrime.securesms.util.BitmapDecodingException;
@@ -24,7 +25,7 @@ import java.io.InputStream;
import javax.inject.Inject;
public class AvatarDownloadJob extends MasterSecretJob {
public class AvatarDownloadJob extends MasterSecretJob implements InjectableType {
private static final long serialVersionUID = 1L;

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import android.util.Log;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.PreKeyUtil;
import org.thoughtcrime.securesms.dependencies.InjectableType;
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
import org.whispersystems.jobqueue.JobParameters;
@@ -11,7 +12,6 @@ import org.whispersystems.libsignal.InvalidKeyIdException;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.libsignal.state.SignedPreKeyStore;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity;
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
@@ -30,7 +30,7 @@ public class CleanPreKeysJob extends MasterSecretJob implements InjectableType {
private static final String TAG = CleanPreKeysJob.class.getSimpleName();
private static final int ARCHIVE_AGE_DAYS = 15;
private static final long ARCHIVE_AGE = TimeUnit.DAYS.toMillis(7);
@Inject transient SignalServiceAccountManager accountManager;
@Inject transient SignedPreKeyStoreFactory signedPreKeyStoreFactory;
@@ -51,17 +51,20 @@ public class CleanPreKeysJob extends MasterSecretJob implements InjectableType {
@Override
public void onRun(MasterSecret masterSecret) throws IOException {
try {
SignedPreKeyStore signedPreKeyStore = signedPreKeyStoreFactory.create();
SignedPreKeyEntity currentSignedPreKey = accountManager.getSignedPreKey();
Log.w(TAG, "Cleaning prekeys...");
if (currentSignedPreKey == null) return;
int activeSignedPreKeyId = PreKeyUtil.getActiveSignedPreKeyId(context);
SignedPreKeyStore signedPreKeyStore = signedPreKeyStoreFactory.create();
SignedPreKeyRecord currentRecord = signedPreKeyStore.loadSignedPreKey(currentSignedPreKey.getKeyId());
if (activeSignedPreKeyId < 0) return;
SignedPreKeyRecord currentRecord = signedPreKeyStore.loadSignedPreKey(activeSignedPreKeyId);
List<SignedPreKeyRecord> allRecords = signedPreKeyStore.loadSignedPreKeys();
LinkedList<SignedPreKeyRecord> oldRecords = removeRecordFrom(currentRecord, allRecords);
Collections.sort(oldRecords, new SignedPreKeySorter());
Log.w(TAG, "Active signed prekey: " + activeSignedPreKeyId);
Log.w(TAG, "Old signed prekey record count: " + oldRecords.size());
boolean foundAgedRecord = false;
@@ -69,7 +72,7 @@ public class CleanPreKeysJob extends MasterSecretJob implements InjectableType {
for (SignedPreKeyRecord oldRecord : oldRecords) {
long archiveDuration = System.currentTimeMillis() - oldRecord.getTimestamp();
if (archiveDuration >= TimeUnit.DAYS.toMillis(ARCHIVE_AGE_DAYS)) {
if (archiveDuration >= ARCHIVE_AGE) {
if (!foundAgedRecord) {
foundAgedRecord = true;
} else {

View File

@@ -53,7 +53,7 @@ public class CreateSignedPreKeyJob extends MasterSecretJob implements Injectable
}
IdentityKeyPair identityKeyPair = IdentityKeyUtil.getIdentityKeyPair(context);
SignedPreKeyRecord signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(context, identityKeyPair);
SignedPreKeyRecord signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(context, identityKeyPair, true);
accountManager.setSignedPreKey(signedPreKeyRecord);
TextSecurePreferences.setSignedPreKeyRegistered(context, true);

View File

@@ -64,8 +64,8 @@ public class MmsSendJob extends SendJob {
@Override
public void onAdded() {
MmsDatabase database = DatabaseFactory.getMmsDatabase(context);
database.markAsSending(messageId);
// MmsDatabase database = DatabaseFactory.getMmsDatabase(context);
// database.markAsSending(messageId);
}
@Override
@@ -82,7 +82,7 @@ public class MmsSendJob extends SendJob {
final SendConf sendConf = new CompatMmsConnection(context).send(pduBytes, message.getSubscriptionId());
final MmsSendResult result = getSendResult(sendConf, pdu);
database.markAsSent(messageId);
database.markAsSent(messageId, false);
markAttachmentsUploaded(messageId, message.getAttachments());
} catch (UndeliverableMessageException | IOException e) {
Log.w(TAG, e);

View File

@@ -395,8 +395,7 @@ public class PushDecryptJob extends ContextJob {
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
long messageId = database.insertMessageOutbox(masterSecret, expirationUpdateMessage, threadId, false);
database.markAsSent(messageId);
database.markAsPush(messageId);
database.markAsSent(messageId, true);
DatabaseFactory.getRecipientPreferenceDatabase(context).setExpireMessages(recipients, message.getMessage().getExpiresInSeconds());
@@ -429,8 +428,7 @@ public class PushDecryptJob extends ContextJob {
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
long messageId = database.insertMessageOutbox(masterSecret, mediaMessage, threadId, false);
database.markAsSent(messageId);
database.markAsPush(messageId);
database.markAsSent(messageId, true);
for (DatabaseAttachment attachment : DatabaseFactory.getAttachmentDatabase(context).getAttachmentsForMessage(messageId)) {
ApplicationContext.getInstance(context)
@@ -506,9 +504,7 @@ public class PushDecryptJob extends ContextJob {
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
long messageId = database.insertMessageOutbox(masterSecret, threadId, outgoingTextMessage, false, message.getTimestamp());
database.markAsSent(messageId);
database.markAsPush(messageId);
database.markAsSecure(messageId);
database.markAsSent(messageId, true);
if (smsMessageId.isPresent()) {
database.deleteMessage(smsMessageId.get());

View File

@@ -70,12 +70,10 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
@Override
public void onAdded() {
DatabaseFactory.getMmsDatabase(context)
.markAsSending(messageId);
}
@Override
public void onSend(MasterSecret masterSecret)
public void onPushSend(MasterSecret masterSecret)
throws MmsException, IOException, NoSuchMessageException
{
MmsDatabase database = DatabaseFactory.getMmsDatabase(context);
@@ -84,9 +82,7 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
try {
deliver(masterSecret, message, filterRecipientId);
database.markAsPush(messageId);
database.markAsSecure(messageId);
database.markAsSent(messageId);
database.markAsSent(messageId, true);
markAttachmentsUploaded(messageId, message.getAttachments());
if (message.getExpiresIn() > 0 && !message.isExpirationUpdate()) {
@@ -114,11 +110,9 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
}
database.addFailures(messageId, failures);
database.markAsPush(messageId);
if (e.getNetworkExceptions().isEmpty() && e.getUntrustedIdentityExceptions().isEmpty()) {
database.markAsSecure(messageId);
database.markAsSent(messageId);
database.markAsSent(messageId, true);
markAttachmentsUploaded(messageId, message.getAttachments());
} else {
database.markAsSentFailed(messageId);

View File

@@ -53,13 +53,11 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType {
@Override
public void onAdded() {
MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
mmsDatabase.markAsSending(messageId);
mmsDatabase.markAsPush(messageId);
}
@Override
public void onSend(MasterSecret masterSecret)
public void onPushSend(MasterSecret masterSecret)
throws RetryLaterException, MmsException, NoSuchMessageException,
UndeliverableMessageException
{
@@ -69,9 +67,7 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType {
try {
deliver(masterSecret, message);
database.markAsPush(messageId);
database.markAsSecure(messageId);
database.markAsSent(messageId);
database.markAsSent(messageId, true);
markAttachmentsUploaded(messageId, message.getAttachments());
if (message.getExpiresIn() > 0 && !message.isExpirationUpdate()) {
@@ -91,7 +87,6 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType {
database.addMismatchedIdentity(messageId, recipientId, uie.getIdentityKey());
database.markAsSentFailed(messageId);
database.markAsPush(messageId);
}
}

View File

@@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.jobs;
import android.content.Context;
import android.util.Log;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.TextSecureExpiredException;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
@@ -12,6 +14,7 @@ import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.notifications.MessageNotifier;
import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.jobqueue.JobParameters;
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
@@ -48,6 +51,19 @@ public abstract class PushSendJob extends SendJob {
return builder.create();
}
@Override
protected final void onSend(MasterSecret masterSecret) throws Exception {
if (TextSecurePreferences.getSignedPreKeyFailureCount(context) > 5) {
ApplicationContext.getInstance(context)
.getJobManager()
.add(new RotateSignedPreKeyJob(context));
throw new TextSecureExpiredException("Too many signed prekey rotation failures");
}
onPushSend(masterSecret);
}
protected SignalServiceAddress getPushAddress(String number) throws InvalidNumberException {
String e164number = Util.canonicalizeNumber(context, number);
String relay = TextSecureDirectory.getInstance(context).getRelay(e164number);
@@ -63,7 +79,7 @@ public abstract class PushSendJob extends SendJob {
ContentType.isVideoType(attachment.getContentType()))
{
try {
if (attachment.getDataUri() == null) throw new IOException("Assertion failed, outgoing attachment has no data!");
if (attachment.getDataUri() == null || attachment.getSize() == 0) throw new IOException("Assertion failed, outgoing attachment has no data!");
InputStream is = PartAuthority.getAttachmentStream(context, masterSecret, attachment.getDataUri());
attachments.add(SignalServiceAttachment.newStreamBuilder()
.withStream(is)
@@ -93,4 +109,6 @@ public abstract class PushSendJob extends SendJob {
MessageNotifier.notifyMessageDeliveryFailed(context, recipients, threadId);
}
}
protected abstract void onPushSend(MasterSecret masterSecret) throws Exception;
}

View File

@@ -46,14 +46,10 @@ public class PushTextSendJob extends PushSendJob implements InjectableType {
}
@Override
public void onAdded() {
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
smsDatabase.markAsSending(messageId);
smsDatabase.markAsPush(messageId);
}
public void onAdded() {}
@Override
public void onSend(MasterSecret masterSecret) throws NoSuchMessageException, RetryLaterException {
public void onPushSend(MasterSecret masterSecret) throws NoSuchMessageException, RetryLaterException {
ExpiringMessageManager expirationManager = ApplicationContext.getInstance(context).getExpiringMessageManager();
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
SmsMessageRecord record = database.getMessage(masterSecret, messageId);
@@ -62,9 +58,7 @@ public class PushTextSendJob extends PushSendJob implements InjectableType {
Log.w(TAG, "Sending message: " + messageId);
deliver(record);
database.markAsPush(messageId);
database.markAsSecure(messageId);
database.markAsSent(messageId);
database.markAsSent(messageId, true);
if (record.getExpiresIn() > 0) {
database.markExpireStarted(messageId);

View File

@@ -60,12 +60,13 @@ public class RefreshPreKeysJob extends MasterSecretJob implements InjectableType
List<PreKeyRecord> preKeyRecords = PreKeyUtil.generatePreKeys(context);
PreKeyRecord lastResortKeyRecord = PreKeyUtil.generateLastResortKey(context);
IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context);
SignedPreKeyRecord signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(context, identityKey);
SignedPreKeyRecord signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(context, identityKey, false);
Log.w(TAG, "Registering new prekeys...");
accountManager.setPreKeys(identityKey.getPublicKey(), lastResortKeyRecord, signedPreKeyRecord, preKeyRecords);
PreKeyUtil.setActiveSignedPreKeyId(context, signedPreKeyRecord.getId());
TextSecurePreferences.setSignedPreKeyRegistered(context, true);
ApplicationContext.getInstance(context)

View File

@@ -0,0 +1,69 @@
package org.thoughtcrime.securesms.jobs;
import android.content.Context;
import android.util.Log;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.PreKeyUtil;
import org.thoughtcrime.securesms.dependencies.InjectableType;
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.jobqueue.JobParameters;
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
import org.whispersystems.libsignal.IdentityKeyPair;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
import javax.inject.Inject;
public class RotateSignedPreKeyJob extends MasterSecretJob implements InjectableType {
private static final String TAG = RotateSignedPreKeyJob.class.getName();
@Inject transient SignalServiceAccountManager accountManager;
public RotateSignedPreKeyJob(Context context) {
super(context, JobParameters.newBuilder()
.withRequirement(new NetworkRequirement(context))
.withRequirement(new MasterSecretRequirement(context))
.withRetryCount(5)
.create());
}
@Override
public void onAdded() {
}
@Override
public void onRun(MasterSecret masterSecret) throws Exception {
Log.w(TAG, "Rotating signed prekey...");
IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context);
SignedPreKeyRecord signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(context, identityKey, false);
accountManager.setSignedPreKey(signedPreKeyRecord);
PreKeyUtil.setActiveSignedPreKeyId(context, signedPreKeyRecord.getId());
TextSecurePreferences.setSignedPreKeyRegistered(context, true);
TextSecurePreferences.setSignedPreKeyFailureCount(context, 0);
ApplicationContext.getInstance(context)
.getJobManager()
.add(new CleanPreKeysJob(context));
}
@Override
public boolean onShouldRetryThrowable(Exception exception) {
return exception instanceof PushNetworkException;
}
@Override
public void onCanceled() {
TextSecurePreferences.setSignedPreKeyFailureCount(context, TextSecurePreferences.getSignedPreKeyFailureCount(context) + 1);
}
}

View File

@@ -40,10 +40,7 @@ public class SmsSendJob extends SendJob {
}
@Override
public void onAdded() {
SmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
database.markAsSending(messageId);
}
public void onAdded() {}
@Override
public void onSend(MasterSecret masterSecret) throws NoSuchMessageException {

View File

@@ -78,7 +78,7 @@ public class SmsSentJob extends MasterSecretJob {
switch (result) {
case Activity.RESULT_OK:
database.markAsSent(messageId);
database.markAsSent(messageId, false);
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
case SmsManager.RESULT_ERROR_RADIO_OFF:

View File

@@ -332,6 +332,7 @@ public class AttachmentManager {
if (MediaPreviewActivity.isContentTypeSupported(slide.getContentType()) && slide.getUri() != null) {
Intent intent = new Intent(context, MediaPreviewActivity.class);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(MediaPreviewActivity.SIZE_EXTRA, slide.asAttachment().getSize());
intent.setDataAndType(slide.getUri(), slide.getContentType());
context.startActivity(intent);

View File

@@ -49,7 +49,7 @@ public abstract class MediaConstraints {
}
}
public boolean isWithinBounds(Context context, MasterSecret masterSecret, Uri uri) throws IOException {
private boolean isWithinBounds(Context context, MasterSecret masterSecret, Uri uri) throws IOException {
try {
InputStream is = PartAuthority.getAttachmentStream(context, masterSecret, uri);
Pair<Integer, Integer> dimensions = BitmapUtil.getDimensions(is);

View File

@@ -6,7 +6,7 @@ import org.thoughtcrime.securesms.util.Util;
public class PushMediaConstraints extends MediaConstraints {
private static final int MAX_IMAGE_DIMEN_LOWMEM = 768;
private static final int MAX_IMAGE_DIMEN = 2048;
private static final int MAX_IMAGE_DIMEN = 4096;
private static final int KB = 1024;
private static final int MB = 1024 * KB;
@@ -22,12 +22,12 @@ public class PushMediaConstraints extends MediaConstraints {
@Override
public int getImageMaxSize() {
return 4 * MB;
return 6 * MB;
}
@Override
public int getGifMaxSize() {
return 5 * MB;
return 6 * MB;
}
@Override

View File

@@ -38,19 +38,24 @@ public class RoundedCorners extends BitmapTransformation {
{
final Bitmap toRound = crop ? centerCrop(pool, toTransform, outWidth, outHeight)
: fitCenter(pool, toTransform, outWidth, outHeight);
final Bitmap rounded = round(pool, toRound);
if (toRound != null && toRound != rounded && !pool.put(toRound)) {
if (toRound != null && toRound != rounded && toRound != toTransform && !pool.put(toRound)) {
toRound.recycle();
}
return rounded;
}
private Bitmap centerCrop(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
final Bitmap toReuse = pool.get(outWidth, outHeight, getSafeConfig(toTransform));
final Bitmap transformed = TransformationUtils.centerCrop(toReuse, toTransform, outWidth, outHeight);
if (toReuse != null && toReuse != transformed && !pool.put(toReuse)) {
toReuse.recycle();
}
return transformed;
}
@@ -63,28 +68,29 @@ public class RoundedCorners extends BitmapTransformation {
return null;
}
final Bitmap result;
final Bitmap toReuse = pool.get(toRound.getWidth(), toRound.getHeight(), getSafeConfig(toRound));
if (toReuse != null) {
result = toReuse;
} else {
Bitmap result = pool.get(toRound.getWidth(), toRound.getHeight(), getSafeConfig(toRound));
if (result == null) {
result = Bitmap.createBitmap(toRound.getWidth(), toRound.getHeight(), getSafeConfig(toRound));
}
final Canvas canvas = new Canvas(result);
final Paint cornerPaint = new Paint();
final Paint shaderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas canvas = new Canvas(result);
shaderPaint.setShader(new BitmapShader(toRound, TileMode.CLAMP, TileMode.CLAMP));
cornerPaint.setColor(colorHint);
if (Config.RGB_565.equals(result.getConfig())) {
Paint cornerPaint = new Paint();
cornerPaint.setColor(colorHint);
canvas.drawRect(0, 0, radius, radius, cornerPaint);
canvas.drawRect(0, toRound.getHeight() - radius, radius, toRound.getHeight(), cornerPaint);
canvas.drawRect(toRound.getWidth() - radius, 0, toRound.getWidth(), radius, cornerPaint);
canvas.drawRect(toRound.getWidth() - radius, toRound.getHeight() - radius, toRound.getWidth(), toRound.getHeight(), cornerPaint);
}
Paint shaderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
shaderPaint.setShader(new BitmapShader(toRound, TileMode.CLAMP, TileMode.CLAMP));
canvas.drawRoundRect(new RectF(0, 0, toRound.getWidth(), toRound.getHeight()), radius, radius, shaderPaint);
// Log.w("RoundedCorners", "in was " + toRound.getWidth() + "x" + toRound.getHeight() + ", out to " + result.getWidth() + "x" + result.getHeight());
return result;
}
@@ -92,7 +98,8 @@ public class RoundedCorners extends BitmapTransformation {
return bitmap.getConfig() != null ? bitmap.getConfig() : Bitmap.Config.ARGB_8888;
}
@Override public String getId() {
@Override
public String getId() {
return RoundedCorners.class.getCanonicalName();
}
}

View File

@@ -17,18 +17,15 @@
package org.thoughtcrime.securesms.notifications;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationManagerCompat;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob;
import org.whispersystems.libsignal.logging.Log;
import java.util.LinkedList;
@@ -39,9 +36,10 @@ import java.util.List;
*/
public class AndroidAutoHeardReceiver extends MasterSecretBroadcastReceiver {
public static final String TAG = AndroidAutoHeardReceiver.class.getSimpleName();
public static final String HEARD_ACTION = "org.thoughtcrime.securesms.notifications.ANDROID_AUTO_HEARD";
public static final String THREAD_IDS_EXTRA = "car_heard_thread_ids";
public static final String TAG = AndroidAutoHeardReceiver.class.getSimpleName();
public static final String HEARD_ACTION = "org.thoughtcrime.securesms.notifications.ANDROID_AUTO_HEARD";
public static final String THREAD_IDS_EXTRA = "car_heard_thread_ids";
public static final String NOTIFICATION_ID_EXTRA = "car_notification_id";
@Override
protected void onReceive(final Context context, Intent intent,
@@ -53,8 +51,8 @@ public class AndroidAutoHeardReceiver extends MasterSecretBroadcastReceiver {
final long[] threadIds = intent.getLongArrayExtra(THREAD_IDS_EXTRA);
if (threadIds != null) {
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
.cancel(MessageNotifier.NOTIFICATION_ID);
int notificationId = intent.getIntExtra(NOTIFICATION_ID_EXTRA, -1);
NotificationManagerCompat.from(context).cancel(notificationId);
new AsyncTask<Void, Void, Void>() {
@Override

View File

@@ -1,18 +1,16 @@
package org.thoughtcrime.securesms.notifications;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.support.v4.app.NotificationManagerCompat;
import android.util.Log;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MessagingDatabase;
import org.thoughtcrime.securesms.database.MessagingDatabase.ExpirationInfo;
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
@@ -24,9 +22,10 @@ import java.util.List;
public class MarkReadReceiver extends MasterSecretBroadcastReceiver {
private static final String TAG = MarkReadReceiver.class.getSimpleName();
public static final String CLEAR_ACTION = "org.thoughtcrime.securesms.notifications.CLEAR";
public static final String THREAD_IDS_EXTRA = "thread_ids";
private static final String TAG = MarkReadReceiver.class.getSimpleName();
public static final String CLEAR_ACTION = "org.thoughtcrime.securesms.notifications.CLEAR";
public static final String THREAD_IDS_EXTRA = "thread_ids";
public static final String NOTIFICATION_ID_EXTRA = "notification_id";
@Override
protected void onReceive(final Context context, Intent intent, @Nullable final MasterSecret masterSecret)
@@ -37,10 +36,7 @@ public class MarkReadReceiver extends MasterSecretBroadcastReceiver {
final long[] threadIds = intent.getLongArrayExtra(THREAD_IDS_EXTRA);
if (threadIds != null) {
Log.w("TAG", "threadIds length: " + threadIds.length);
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
.cancel(MessageNotifier.NOTIFICATION_ID);
NotificationManagerCompat.from(context).cancel(intent.getIntExtra(NOTIFICATION_ID_EXTRA, -1));
new AsyncTask<Void, Void, Void>() {
@Override

View File

@@ -30,14 +30,17 @@ import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.service.notification.StatusBarNotification;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationManagerCompat;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.util.Log;
import org.thoughtcrime.redphone.ui.NotificationBarManager;
import org.thoughtcrime.redphone.util.Util;
import org.thoughtcrime.securesms.ConversationActivity;
import org.thoughtcrime.securesms.R;
@@ -83,8 +86,10 @@ public class MessageNotifier {
private static final String TAG = MessageNotifier.class.getSimpleName();
public static final String EXTRA_VOICE_REPLY = "extra_voice_reply";
public static final int NOTIFICATION_ID = 1338;
public static final String EXTRA_REMOTE_REPLY = "extra_remote_reply";
private static final int SUMMARY_NOTIFICATION_ID = 1338;
private static final String NOTIFICATION_GROUP = "messages";
private static final long MIN_AUDIBLE_PERIOD_MILLIS = TimeUnit.SECONDS.toMillis(2);
private static final long DESKTOP_ACTIVITY_PERIOD = TimeUnit.MINUTES.toMillis(1);
@@ -101,10 +106,6 @@ public class MessageNotifier {
lastDesktopActivityTimestamp = timestamp;
}
public static void cancelDelayedNotifications() {
executor.cancel();
}
public static void notifyMessageDeliveryFailed(Context context, Recipients recipients, long threadId) {
if (visibleThread == threadId) {
sendInThreadNotification(context, recipients);
@@ -120,6 +121,49 @@ public class MessageNotifier {
}
}
public static void cancelDelayedNotifications() {
executor.cancel();
}
private static void cancelActiveNotifications(@NonNull Context context) {
NotificationManager notifications = ServiceUtil.getNotificationManager(context);
notifications.cancel(SUMMARY_NOTIFICATION_ID);
if (Build.VERSION.SDK_INT >= 23) {
StatusBarNotification[] activeNotifications = notifications.getActiveNotifications();
for (StatusBarNotification activeNotification : activeNotifications) {
if (activeNotification.getId() != NotificationBarManager.RED_PHONE_NOTIFICATION) {
notifications.cancel(activeNotification.getId());
}
}
}
}
private static void cancelOrphanedNotifications(@NonNull Context context, NotificationState notificationState) {
if (Build.VERSION.SDK_INT >= 23) {
NotificationManager notifications = ServiceUtil.getNotificationManager(context);
StatusBarNotification[] activeNotifications = notifications.getActiveNotifications();
for (StatusBarNotification notification : activeNotifications) {
boolean validNotification = false;
if (notification.getId() != SUMMARY_NOTIFICATION_ID && notification.getId() != NotificationBarManager.RED_PHONE_NOTIFICATION) {
for (NotificationItem item : notificationState.getNotifications()) {
if (notification.getId() == (SUMMARY_NOTIFICATION_ID + item.getThreadId())) {
validNotification = true;
break;
}
}
if (!validNotification) {
notifications.cancel(notification.getId());
}
}
}
}
}
public static void updateNotification(@NonNull Context context, @Nullable MasterSecret masterSecret) {
if (!TextSecurePreferences.isNotificationsEnabled(context)) {
return;
@@ -194,8 +238,7 @@ public class MessageNotifier {
if ((telcoCursor == null || telcoCursor.isAfterLast()) &&
(pushCursor == null || pushCursor.isAfterLast()))
{
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
.cancel(NOTIFICATION_ID);
cancelActiveNotifications(context);
updateBadge(context, 0);
clearReminder(context);
return;
@@ -214,11 +257,18 @@ public class MessageNotifier {
}
if (notificationState.hasMultipleThreads()) {
if (Build.VERSION.SDK_INT >= 23) {
for (long threadId : notificationState.getThreads()) {
sendSingleThreadNotification(context, masterSecret, new NotificationState(notificationState.getNotificationsForThread(threadId)), false, true);
}
}
sendMultipleThreadNotification(context, notificationState, signal);
} else {
sendSingleThreadNotification(context, masterSecret, notificationState, signal);
sendSingleThreadNotification(context, masterSecret, notificationState, signal, false);
}
cancelOrphanedNotifications(context, notificationState);
updateBadge(context, notificationState.getMessageCount());
if (signal) {
@@ -233,33 +283,36 @@ public class MessageNotifier {
private static void sendSingleThreadNotification(@NonNull Context context,
@Nullable MasterSecret masterSecret,
@NonNull NotificationState notificationState,
boolean signal)
boolean signal, boolean bundled)
{
if (notificationState.getNotifications().isEmpty()) {
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
.cancel(NOTIFICATION_ID);
if (!bundled) cancelActiveNotifications(context);
return;
}
SingleRecipientNotificationBuilder builder = new SingleRecipientNotificationBuilder(context, masterSecret, TextSecurePreferences.getNotificationPrivacy(context));
List<NotificationItem> notifications = notificationState.getNotifications();
Recipients recipients = notifications.get(0).getRecipients();
SingleRecipientNotificationBuilder builder = new SingleRecipientNotificationBuilder(context, masterSecret, TextSecurePreferences.getNotificationPrivacy(context));
List<NotificationItem> notifications = notificationState.getNotifications();
Recipients recipients = notifications.get(0).getRecipients();
int notificationId = (int) (SUMMARY_NOTIFICATION_ID + (bundled ? notifications.get(0).getThreadId() : 0));
builder.setThread(notifications.get(0).getRecipients());
builder.setMessageCount(notificationState.getMessageCount());
builder.setPrimaryMessageBody(recipients, notifications.get(0).getIndividualRecipient(),
notifications.get(0).getText(), notifications.get(0).getSlideDeck());
builder.setContentIntent(notifications.get(0).getPendingIntent(context));
builder.setGroup(NOTIFICATION_GROUP);
long timestamp = notifications.get(0).getTimestamp();
if (timestamp != 0) builder.setWhen(timestamp);
builder.addActions(masterSecret,
notificationState.getMarkAsReadIntent(context),
notificationState.getMarkAsReadIntent(context, notificationId),
notificationState.getQuickReplyIntent(context, notifications.get(0).getRecipients()),
notificationState.getWearableReplyIntent(context, notifications.get(0).getRecipients()));
notificationState.getRemoteReplyIntent(context, notifications.get(0).getRecipients()));
builder.addAndroidAutoAction(notificationState.getAndroidAutoReplyIntent(context, notifications.get(0).getRecipients()),
notificationState.getAndroidAutoHeardIntent(context, notifications.get(0).getRecipients()), notifications.get(0).getTimestamp());
notificationState.getAndroidAutoHeardIntent(context, notificationId), notifications.get(0).getTimestamp());
ListIterator<NotificationItem> iterator = notifications.listIterator(notifications.size());
@@ -274,8 +327,11 @@ public class MessageNotifier {
notifications.get(0).getText());
}
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
.notify(NOTIFICATION_ID, builder.build());
if (!bundled) {
builder.setGroupSummary(true);
}
NotificationManagerCompat.from(context).notify(notificationId, builder.build());
}
private static void sendMultipleThreadNotification(@NonNull Context context,
@@ -287,11 +343,12 @@ public class MessageNotifier {
builder.setMessageCount(notificationState.getMessageCount(), notificationState.getThreadCount());
builder.setMostRecentSender(notifications.get(0).getIndividualRecipient());
builder.setGroup(NOTIFICATION_GROUP);
long timestamp = notifications.get(0).getTimestamp();
if (timestamp != 0) builder.setWhen(timestamp);
builder.addActions(notificationState.getMarkAsReadIntent(context));
builder.addActions(notificationState.getMarkAsReadIntent(context, SUMMARY_NOTIFICATION_ID));
ListIterator<NotificationItem> iterator = notifications.listIterator(notifications.size());
@@ -306,8 +363,7 @@ public class MessageNotifier {
notifications.get(0).getText());
}
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
.notify(NOTIFICATION_ID, builder.build());
NotificationManagerCompat.from(context).notify(SUMMARY_NOTIFICATION_ID, builder.build());
}
private static void sendInThreadNotification(Context context, Recipients recipients) {

View File

@@ -31,6 +31,7 @@ public class MultipleRecipientNotificationBuilder extends AbstractNotificationBu
setCategory(NotificationCompat.CATEGORY_MESSAGE);
setPriority(NotificationCompat.PRIORITY_HIGH);
setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(MessageNotifier.DeleteReceiver.DELETE_REMINDER_ACTION), 0));
setGroupSummary(true);
}
public void setMessageCount(int messageCount, int threadCount) {

View File

@@ -4,6 +4,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
@@ -12,20 +13,32 @@ import org.thoughtcrime.securesms.ConversationPopupActivity;
import org.thoughtcrime.securesms.database.RecipientPreferenceDatabase.VibrateState;
import org.thoughtcrime.securesms.recipients.Recipients;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class NotificationState {
private final LinkedList<NotificationItem> notifications = new LinkedList<>();
private final Set<Long> threads = new HashSet<>();
private final LinkedHashSet<Long> threads = new LinkedHashSet<>();
private int notificationCount = 0;
public NotificationState() {}
public NotificationState(@NonNull List<NotificationItem> items) {
for (NotificationItem item : items) {
addNotification(item);
}
}
public void addNotification(NotificationItem item) {
notifications.addFirst(item);
if (threads.contains(item.getThreadId())) {
threads.remove(item.getThreadId());
}
threads.add(item.getThreadId());
notificationCount++;
}
@@ -58,6 +71,10 @@ public class NotificationState {
return threads.size() > 1;
}
public LinkedHashSet<Long> getThreads() {
return threads;
}
public int getThreadCount() {
return threads.size();
}
@@ -70,7 +87,17 @@ public class NotificationState {
return notifications;
}
public PendingIntent getMarkAsReadIntent(Context context) {
public List<NotificationItem> getNotificationsForThread(long threadId) {
LinkedList<NotificationItem> list = new LinkedList<>();
for (NotificationItem item : notifications) {
if (item.getThreadId() == threadId) list.addFirst(item);
}
return list;
}
public PendingIntent getMarkAsReadIntent(Context context, int notificationId) {
long[] threadArray = new long[threads.size()];
int index = 0;
@@ -80,23 +107,21 @@ public class NotificationState {
}
Intent intent = new Intent(MarkReadReceiver.CLEAR_ACTION);
intent.setClass(context, MarkReadReceiver.class);
intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
intent.putExtra(MarkReadReceiver.THREAD_IDS_EXTRA, threadArray);
intent.setPackage(context.getPackageName());
// XXX : This is an Android bug. If we don't pull off the extra
// once before handing off the PendingIntent, the array will be
// truncated to one element when the PendingIntent fires. Thanks guys!
Log.w("NotificationState", "Pending array off intent length: " +
intent.getLongArrayExtra("thread_ids").length);
intent.putExtra(MarkReadReceiver.NOTIFICATION_ID_EXTRA, notificationId);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
public PendingIntent getWearableReplyIntent(Context context, Recipients recipients) {
public PendingIntent getRemoteReplyIntent(Context context, Recipients recipients) {
if (threads.size() != 1) throw new AssertionError("We only support replies to single thread notifications!");
Intent intent = new Intent(WearReplyReceiver.REPLY_ACTION);
intent.putExtra(WearReplyReceiver.RECIPIENT_IDS_EXTRA, recipients.getIds());
Intent intent = new Intent(RemoteReplyReceiver.REPLY_ACTION);
intent.setClass(context, RemoteReplyReceiver.class);
intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
intent.putExtra(RemoteReplyReceiver.RECIPIENT_IDS_EXTRA, recipients.getIds());
intent.setPackage(context.getPackageName());
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
@@ -106,6 +131,8 @@ public class NotificationState {
if (threads.size() != 1) throw new AssertionError("We only support replies to single thread notifications!");
Intent intent = new Intent(AndroidAutoReplyReceiver.REPLY_ACTION);
intent.setClass(context, AndroidAutoReplyReceiver.class);
intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
intent.putExtra(AndroidAutoReplyReceiver.RECIPIENT_IDS_EXTRA, recipients.getIds());
intent.putExtra(AndroidAutoReplyReceiver.THREAD_ID_EXTRA, (long)threads.toArray()[0]);
intent.setPackage(context.getPackageName());
@@ -113,7 +140,7 @@ public class NotificationState {
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
public PendingIntent getAndroidAutoHeardIntent(Context context, Recipients recipients) {
public PendingIntent getAndroidAutoHeardIntent(Context context, int notificationId) {
long[] threadArray = new long[threads.size()];
int index = 0;
for (long thread : threads) {
@@ -122,17 +149,17 @@ public class NotificationState {
}
Intent intent = new Intent(AndroidAutoHeardReceiver.HEARD_ACTION);
intent.setClass(context, AndroidAutoHeardReceiver.class);
intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
intent.putExtra(AndroidAutoHeardReceiver.THREAD_IDS_EXTRA, threadArray);
intent.putExtra(AndroidAutoHeardReceiver.NOTIFICATION_ID_EXTRA, notificationId);
intent.setPackage(context.getPackageName());
Log.w("NotificationState", "getAndroidAutoHeardIntent - Pending array off intent length: " +
intent.getLongArrayExtra(AndroidAutoHeardReceiver.THREAD_IDS_EXTRA).length);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
public PendingIntent getQuickReplyIntent(Context context, Recipients recipients) {
if (threads.size() != 1) throw new AssertionError("We only support replies to single thread notifications!");
if (threads.size() != 1) throw new AssertionError("We only support replies to single thread notifications! " + threads.size());
Intent intent = new Intent(context, ConversationPopupActivity.class);
intent.putExtra(ConversationActivity.RECIPIENTS_EXTRA, recipients.getIds());

View File

@@ -1,5 +1,5 @@
/**
* Copyright (C) 2011 Whisper Systems
* Copyright (C) 2016 Open Whisper Systems
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,15 +24,11 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.RemoteInput;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MessagingDatabase;
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
import org.thoughtcrime.securesms.database.RecipientPreferenceDatabase.RecipientsPreferences;
import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob;
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
import org.thoughtcrime.securesms.recipients.RecipientFactory;
import org.thoughtcrime.securesms.recipients.Recipients;
@@ -46,9 +42,9 @@ import java.util.List;
/**
* Get the response text from the Wearable Device and sends an message as a reply
*/
public class WearReplyReceiver extends MasterSecretBroadcastReceiver {
public class RemoteReplyReceiver extends MasterSecretBroadcastReceiver {
public static final String TAG = WearReplyReceiver.class.getSimpleName();
public static final String TAG = RemoteReplyReceiver.class.getSimpleName();
public static final String REPLY_ACTION = "org.thoughtcrime.securesms.notifications.WEAR_REPLY";
public static final String RECIPIENT_IDS_EXTRA = "recipient_ids";
@@ -63,7 +59,7 @@ public class WearReplyReceiver extends MasterSecretBroadcastReceiver {
if (remoteInput == null) return;
final long[] recipientIds = intent.getLongArrayExtra(RECIPIENT_IDS_EXTRA);
final CharSequence responseText = remoteInput.getCharSequence(MessageNotifier.EXTRA_VOICE_REPLY);
final CharSequence responseText = remoteInput.getCharSequence(MessageNotifier.EXTRA_REMOTE_REPLY);
final Recipients recipients = RecipientFactory.getRecipientsForIds(context, recipientIds, false);
if (masterSecret != null && responseText != null) {

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