aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--art/ic_received_indicator.svg76
-rw-r--r--art/ic_secure_indicator.xcfbin0 -> 1240 bytes
-rwxr-xr-xart/render.rb2
-rw-r--r--docs/XEPs.md1
-rw-r--r--res/drawable-hdpi/ic_received_indicator.pngbin0 -> 686 bytes
-rw-r--r--res/drawable-hdpi/ic_secure_indicator.pngbin0 -> 294 bytes
-rw-r--r--res/drawable-mdpi/ic_received_indicator.pngbin0 -> 447 bytes
-rw-r--r--res/drawable-mdpi/ic_secure_indicator.pngbin0 -> 295 bytes
-rw-r--r--res/drawable-xhdpi/ic_received_indicator.pngbin0 -> 855 bytes
-rw-r--r--res/drawable-xhdpi/ic_secure_indicator.pngbin0 -> 410 bytes
-rw-r--r--res/drawable-xxhdpi/ic_received_indicator.pngbin0 -> 1236 bytes
-rw-r--r--res/drawable-xxhdpi/ic_secure_indicator.pngbin0 -> 380 bytes
-rw-r--r--res/layout/message_received.xml10
-rw-r--r--res/layout/message_sent.xml22
-rw-r--r--res/values-cs/arrays.xml2
-rw-r--r--res/values-cs/strings.xml34
-rw-r--r--res/values-de/strings.xml31
-rw-r--r--res/values-eu/arrays.xml16
-rw-r--r--res/values-eu/strings.xml31
-rw-r--r--res/values-it/arrays.xml39
-rw-r--r--res/values-it/strings.xml260
-rw-r--r--res/values-ru/strings.xml106
-rw-r--r--res/values/strings.xml9
-rw-r--r--res/xml/preferences.xml9
-rw-r--r--src/eu/siacs/conversations/crypto/OtrEngine.java4
-rw-r--r--src/eu/siacs/conversations/entities/Conversation.java2
-rw-r--r--src/eu/siacs/conversations/entities/Message.java11
-rw-r--r--src/eu/siacs/conversations/entities/MucOptions.java8
-rw-r--r--src/eu/siacs/conversations/entities/Roster.java4
-rw-r--r--src/eu/siacs/conversations/generator/AbstractGenerator.java8
-rw-r--r--src/eu/siacs/conversations/generator/IqGenerator.java5
-rw-r--r--src/eu/siacs/conversations/generator/MessageGenerator.java18
-rw-r--r--src/eu/siacs/conversations/generator/PresenceGenerator.java5
-rw-r--r--src/eu/siacs/conversations/parser/AbstractParser.java2
-rw-r--r--src/eu/siacs/conversations/parser/MessageParser.java34
-rw-r--r--src/eu/siacs/conversations/parser/PresenceParser.java4
-rw-r--r--src/eu/siacs/conversations/persistance/DatabaseBackend.java10
-rw-r--r--src/eu/siacs/conversations/services/EventReceiver.java5
-rw-r--r--src/eu/siacs/conversations/services/ImageProvider.java2
-rw-r--r--src/eu/siacs/conversations/services/XmppConnectionService.java30
-rw-r--r--src/eu/siacs/conversations/ui/ChooseContactActivity.java1
-rw-r--r--src/eu/siacs/conversations/ui/ConferenceDetailsActivity.java2
-rw-r--r--src/eu/siacs/conversations/ui/ConversationActivity.java5
-rw-r--r--src/eu/siacs/conversations/ui/ConversationFragment.java45
-rw-r--r--src/eu/siacs/conversations/ui/ManageAccountActivity.java8
-rw-r--r--src/eu/siacs/conversations/ui/SettingsActivity.java17
-rw-r--r--src/eu/siacs/conversations/ui/StartConversationActivity.java1
-rw-r--r--src/eu/siacs/conversations/ui/XmppActivity.java6
-rw-r--r--src/eu/siacs/conversations/ui/adapter/MessageAdapter.java77
-rw-r--r--src/eu/siacs/conversations/utils/UIHelper.java34
-rw-r--r--src/eu/siacs/conversations/xmpp/XmppConnection.java2
-rw-r--r--src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java4
53 files changed, 807 insertions, 197 deletions
diff --git a/README.md b/README.md
index f4c0a37a..ec510c15 100644
--- a/README.md
+++ b/README.md
@@ -66,7 +66,7 @@ These XEPs are - as of now:
* [Benoit Bouvarel](https://github.com/BenoitBouvarel) (French)
* [Daniel Gultsch](https://github.com/iNPUTmice) (German)
* [Aitor Beriain](https://github.com/beriain) (Basque)
-* [Ilia Rostovtsev](https://github.com/rostovtsev) (Russian)
+* [Ilia Rostovtsev](https://github.com/qooob) (Russian)
* [Jelmer Vernooij](https://github.com/jelmer) (Dutch)
* [Anders Sandblad](https://github.com/andersruneson) (Swedish)
diff --git a/art/ic_received_indicator.svg b/art/ic_received_indicator.svg
new file mode 100644
index 00000000..d9378c60
--- /dev/null
+++ b/art/ic_received_indicator.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="95"
+ height="95"
+ id="Yes_check"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ic_received_indicator.svg">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1233"
+ inkscape:window-height="828"
+ id="namedview8"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:zoom="5.04"
+ inkscape:cx="26.829268"
+ inkscape:cy="37.489149"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Yes_check"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <defs
+ id="defs1373">
+ <linearGradient
+ id="linearGradient2250">
+ <stop
+ style="stop-color:#008700;stop-opacity:1"
+ offset="0"
+ id="stop2252" />
+ <stop
+ style="stop-color:#006f00;stop-opacity:1"
+ offset="1"
+ id="stop2254" />
+ </linearGradient>
+ </defs>
+ <path
+ d="m 2.3894499,61.412131 c 0,0 16.7473651,20.271938 22.3528491,26.154483 3.648598,3.026816 12.878061,3.83429 14.880462,0 1.64903,-2.636163 2.380404,-5.8348 2.991819,-7.931771 C 49.920898,54.575958 72.297563,22.337321 92.321082,10.50894 96.814837,5.2377522 86.327596,3.5063483 77.217442,6.9958109 63.487006,12.254946 34.107717,59.529917 29.270873,69.192545 22.40265,70.841418 12.518762,52.447046 12.518762,52.447046 7.3805037,52.552428 1.8841059,52.071763 2.3894499,61.412131 z"
+ style="fill:#249b25;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.29981154;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="check"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscsccc" />
+</svg>
diff --git a/art/ic_secure_indicator.xcf b/art/ic_secure_indicator.xcf
new file mode 100644
index 00000000..a9069c9b
--- /dev/null
+++ b/art/ic_secure_indicator.xcf
Binary files differ
diff --git a/art/render.rb b/art/render.rb
index ed306072..5464b9f5 100755
--- a/art/render.rb
+++ b/art/render.rb
@@ -1,6 +1,6 @@
#!/bin/env ruby
resolutions={'mdpi'=> 1, 'hdpi' => 1.5, 'xhdpi' => 2, 'xxhdpi' => 3}
-images = { 'conversations.svg' => ['ic_launcher',48], 'conversations_baloon.svg' => ['ic_activity', 32], 'conversations_mono.svg' => ['ic_notification',24] }
+images = { 'conversations.svg' => ['ic_launcher',48], 'conversations_baloon.svg' => ['ic_activity', 32], 'conversations_mono.svg' => ['ic_notification',24], 'ic_received_indicator.svg' => ['ic_received_indicator',12] }
images.each do |source, result|
resolutions.each do |name, factor|
size = factor * result[1]
diff --git a/docs/XEPs.md b/docs/XEPs.md
index 8d1d0d5c..0dd6a1d7 100644
--- a/docs/XEPs.md
+++ b/docs/XEPs.md
@@ -1,3 +1,4 @@
+* XEP-0027: Current Jabber OpenPGP Usage
* XEP-0030: Service Discovery
* XEP-0045: Multi-User Chat
* XEP-0048: Bookmarks
diff --git a/res/drawable-hdpi/ic_received_indicator.png b/res/drawable-hdpi/ic_received_indicator.png
new file mode 100644
index 00000000..b1e3f274
--- /dev/null
+++ b/res/drawable-hdpi/ic_received_indicator.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_secure_indicator.png b/res/drawable-hdpi/ic_secure_indicator.png
new file mode 100644
index 00000000..2a2934fb
--- /dev/null
+++ b/res/drawable-hdpi/ic_secure_indicator.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_received_indicator.png b/res/drawable-mdpi/ic_received_indicator.png
new file mode 100644
index 00000000..88ff1efb
--- /dev/null
+++ b/res/drawable-mdpi/ic_received_indicator.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_secure_indicator.png b/res/drawable-mdpi/ic_secure_indicator.png
new file mode 100644
index 00000000..5a73aef4
--- /dev/null
+++ b/res/drawable-mdpi/ic_secure_indicator.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_received_indicator.png b/res/drawable-xhdpi/ic_received_indicator.png
new file mode 100644
index 00000000..2c871933
--- /dev/null
+++ b/res/drawable-xhdpi/ic_received_indicator.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_secure_indicator.png b/res/drawable-xhdpi/ic_secure_indicator.png
new file mode 100644
index 00000000..1f4c9a32
--- /dev/null
+++ b/res/drawable-xhdpi/ic_secure_indicator.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_received_indicator.png b/res/drawable-xxhdpi/ic_received_indicator.png
new file mode 100644
index 00000000..039a9ef9
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_received_indicator.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_secure_indicator.png b/res/drawable-xxhdpi/ic_secure_indicator.png
new file mode 100644
index 00000000..1ee9b67d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_secure_indicator.png
Binary files differ
diff --git a/res/layout/message_received.xml b/res/layout/message_received.xml
index d85a4f8d..28c04a70 100644
--- a/res/layout/message_received.xml
+++ b/res/layout/message_received.xml
@@ -54,7 +54,7 @@
android:text="@string/download_image"
android:visibility="gone" />
- <LinearLayout
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
@@ -65,10 +65,12 @@
android:layout_width="?attr/TextSizeInfo"
android:layout_height="?attr/TextSizeInfo"
android:layout_gravity="center_vertical"
- android:layout_marginRight="6sp"
- android:layout_marginTop="2sp"
android:gravity="center_vertical"
- android:src="@drawable/ic_indicator" />
+ android:src="@drawable/ic_secure_indicator"
+ android:layout_marginRight="4sp"
+ android:alpha="0.54"/>
+
+
<TextView
android:id="@+id/message_time"
diff --git a/res/layout/message_sent.xml b/res/layout/message_sent.xml
index 9728dc56..9167012a 100644
--- a/res/layout/message_sent.xml
+++ b/res/layout/message_sent.xml
@@ -63,15 +63,27 @@
android:textColor="@color/secondarytext"
android:textSize="?attr/TextSizeInfo" />
- <ImageView
+ <ImageView
android:id="@+id/security_indicator"
android:layout_width="?attr/TextSizeInfo"
android:layout_height="?attr/TextSizeInfo"
android:layout_gravity="center_vertical"
- android:layout_marginLeft="6sp"
- android:layout_marginTop="2sp"
android:gravity="center_vertical"
- android:src="@drawable/ic_indicator" />
+ android:src="@drawable/ic_secure_indicator"
+ android:layout_marginLeft="4sp"
+ android:alpha="0.54"/>
+
+ <ImageView
+ android:id="@+id/indicator_received"
+ android:layout_width="?attr/TextSizeInfo"
+ android:layout_height="?attr/TextSizeInfo"
+ android:layout_gravity="center_vertical"
+ android:gravity="center_vertical"
+ android:src="@drawable/ic_received_indicator"
+ android:layout_marginLeft="4sp"
+ android:alpha="0.54"/>
+
+
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -87,4 +99,4 @@
android:scaleType="fitXY"
android:src="@drawable/ic_profile" />
-</RelativeLayout> \ No newline at end of file
+</RelativeLayout>
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
index 97d8f80b..4510cf84 100644
--- a/res/values-cs/arrays.xml
+++ b/res/values-cs/arrays.xml
@@ -5,7 +5,7 @@
<item>Mobil</item>
<item>Telefon</item>
<item>Tablet</item>
- <item>Conversations</item>
+ <item>Konverzace</item>
<item>Android</item>
</string-array>
<string-array name="filesizes">
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 6943df59..43cd3d06 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="app_name">Conversations</string>
+ <string name="app_name">Konverzace</string>
<string name="action_settings">Nastavení</string>
<string name="action_add">Nová konverzace</string>
<string name="action_accounts">Nastavení účtů</string>
@@ -46,8 +46,8 @@
<string name="delete">Smazat</string>
<string name="save">Uložit</string>
<string name="ok">OK</string>
- <string name="crash_report_title">Aplikace Conversations přestala reagovat</string>
- <string name="crash_report_message">Zasláním detailů o důvodu selhání pomůžete dalšímu vývoji aplikace Conversations\n<b>Varování:</b> Toto použije nastavený XMPP účet pro zaslání detailů vývojářům.</string>
+ <string name="crash_report_title">Aplikace Konverzace přestala reagovat</string>
+ <string name="crash_report_message">Zasláním detailů o důvodu selhání pomůžete dalšímu vývoji aplikace Konverzace\n<b>Varování:</b> Toto použije nastavený XMPP účet pro zaslání detailů vývojářům.</string>
<string name="send_now">Odeslat teď</string>
<string name="send_never">Již se neptat</string>
<string name="problem_connecting_to_account">Připojení k účtu se nezdařilo</string>
@@ -75,15 +75,15 @@
<string name="send_unencrypted">Poslat nešifrované</string>
<string name="decryption_failed">Zašifrování se nezdařilo. Možná nemáte správný privátní klíč.</string>
<string name="openkeychain_required">OpenKeychain</string>
- <string name="openkeychain_required_long">Conversations využívá aplikaci třetí strany, <b>OpenKeychain</b>, k šifrování a dešifrování zpráv a ke správě veřejných klíčů.\n\nOpenKeychain je licencován pod GPLv3 a dostupný na F-Droid a Google Play.\n\n<small>(Po instalaci prosím restartujte aplikaci Conversations.)</small></string>
+ <string name="openkeychain_required_long">Konverzace využívá aplikaci třetí strany, <b>OpenKeychain</b>, k šifrování a dešifrování zpráv a ke správě veřejných klíčů.\n\nOpenKeychain je licencován pod GPLv3 a dostupný na F-Droid a Google Play.\n\n<small>(Po instalaci prosím restartujte aplikaci Konverzace.)</small></string>
<string name="restart">Restartovat</string>
<string name="install">Instalovat</string>
<string name="offering">nabízí&#8230;</string>
<string name="waiting">čekám&#8230;</string>
<string name="no_pgp_key">Nebyl nalezen žádný OpenPGP klíč</string>
- <string name="contact_has_no_pgp_key">Není možné zašifrovat zprávu v aplikaci Conversations, protože druhá strana neoznamuje svůj veřejný klíč.\n\n<small>Požádejte svůj kontakt ať si nastaví OpenPGP.</small></string>
+ <string name="contact_has_no_pgp_key">Není možné zašifrovat zprávu v aplikaci Konverzace, protože druhá strana neoznamuje svůj veřejný klíč.\n\n<small>Požádejte svůj kontakt ať si nastaví OpenPGP.</small></string>
<string name="no_pgp_keys">Nebyly nalezeny žádné OpenPGP klíče</string>
- <string name="contacts_have_no_pgp_keys">Není možné zašifrovat zprávy v aplikaci Conversations, protože kontakty neoznamují svůj veřejný klíč.\n\n<small>Požádejte své kontakty ať si nastaví OpenPGP.</small></string>
+ <string name="contacts_have_no_pgp_keys">Není možné zašifrovat zprávy v aplikaci Konverzace, protože kontakty neoznamují svůj veřejný klíč.\n\n<small>Požádejte své kontakty ať si nastaví OpenPGP.</small></string>
<string name="encrypted_message_received"><i>Byla přijata šifrovaná zpráva. Tapni pro dešifrování a přečtení.</i></string>
<string name="encrypted_image_received"><i>Byl přijat šifrovaný obrázek. Tapni pro dešifrování a prohlédnutí.</i></string>
<string name="image_file"><i>Byl přijat obrázek. Tapni pro prohlédnutí</i></string>
@@ -105,15 +105,15 @@
<string name="pref_notification_grace_period_summary">Neupozorňovat krátce poté co byla obdržena kopie zprávy</string>
<string name="pref_advanced_options">Pokročilé nastavení</string>
<string name="pref_never_send_crash">Neodesílat detaily o pádu aplikace</string>
- <string name="pref_never_send_crash_summary">Zasláním detailů o důvodu selhání pomůžete dalšímu vývoji aplikace Conversations</string>
+ <string name="pref_never_send_crash_summary">Zasláním detailů o důvodu selhání pomůžete dalšímu vývoji aplikace Konverzace</string>
<string name="pref_confirm_messages">Potvrzovat zprávy</string>
- <string name="pref_confirm_messages_summary">Dá vědět vašim kontaktům, že zpráva byla přijata a přečtena</string>
+ <string name="pref_confirm_messages_summary">Dá vědět kontaktům, že zpráva byla přijata a přečtena</string>
<string name="pref_ui_options">Nastavení UI</string>
<string name="openpgp_error">OpenKeychain nahlásil chybu</string>
<string name="error_decrypting_file">I/O chyba dešifrování souboru</string>
<string name="accept">Přijmout</string>
<string name="error">Došlo k chybě</string>
-<!-- <string name="pref_grant_presence_updates">Povolit aktualizace stavu</string> -->
+ <string name="pref_grant_presence_updates">Povolit aktualizace stavu</string>
<string name="pref_grant_presence_updates_summary">Aktivně povolovat a žádat o zasílání změn stavu pro vytvářené kontakty</string>
<string name="subscriptions">Odběry</string>
<string name="your_account">Váš účet</string>
@@ -140,7 +140,7 @@
<string name="account_status_regis_fail">Registrace selhala</string>
<string name="account_status_regis_conflict">Uživatelské jméno se již používá</string>
<string name="account_status_regis_success">Registrace dokončena</string>
- <string name="account_status_regis_not_sup">Server nepodporuje registrování</string>
+ <string name="account_status_regis_not_sup">Server nepodporuje registrace</string>
<string name="encryption_choice_none">Čistý text</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
@@ -155,7 +155,7 @@
<string name="attach_record_voice">Nahrát hlas</string>
<string name="account_settings_jabber_id">Jabber ID</string>
<string name="account_settings_password">Heslo</string>
- <string name="account_settings_example_jabber_id">username@example.com</string>
+ <string name="account_settings_example_jabber_id">jmeno@server.cz</string>
<string name="account_settings_confirm_password">Potvrdit heslo</string>
<string name="password">Heslo</string>
<string name="confirm_password">Potvrdit heslo</string>
@@ -199,11 +199,11 @@
<string name="join_conference">Připojit ke konferenci</string>
<string name="delete_contact">Smazat kontakt</string>
<string name="view_contact_details">Zobrazit detaily kontaktu</string>
- <string name="create">Vytořit</string>
+ <string name="create">Vytvořit</string>
<string name="contact_already_exists">Kontakt již existuje</string>
<string name="join">Vstoupit</string>
<string name="conference_address">Adresa konference</string>
- <string name="conference_address_example">room@conference.example.com</string>
+ <string name="conference_address_example">mistnost@konference.server.cz</string>
<string name="save_as_bookmark">Uložit jako záložku</string>
<string name="delete_bookmark">Smazat záložku</string>
<string name="bookmark_already_exists">Tato záložka již existuje</string>
@@ -215,7 +215,7 @@
<string name="add_back">Opět přidat</string>
<string name="contact_has_read_up_to_this_point">%s dočetl až sem</string>
<string name="publish">Zveřejnit</string>
- <string name="touch_to_choose_picture">Tapnout avatar a vybrat obrázek z galerie</string>
+ <string name="touch_to_choose_picture">Tapnout na avatar a vybrat obrázek z galerie</string>
<string name="publish_avatar_explanation">Pozor: Každý s povolením vidět změny stavu uvidí tento obrázek.</string>
<string name="publishing">Zveřejňuji&#8230;</string>
<string name="error_publish_avatar_server_reject">Server odmítl toto zveřejnění</string>
@@ -247,14 +247,14 @@
<string name="without_mutual_presence_updates"><b>Varování:</b> Odeslání bez povolení změn stavu může způsobit nečekané problémy na obou stranách.\n\n<small>Přejdi na detaily kontaktu pro ověření povolení o změnách stavu.</small></string>
<string name="pref_encryption_settings">Nastavení šifrování</string>
<string name="pref_force_encryption">Vynutit šifrování</string>
- <string name="pref_force_encryption_summary">Vždy zasílat šifrované zprávy (mimo konferencí)</string>
+ <string name="pref_force_encryption_summary">Vždy zasílat šifrované zprávy (mimo konference)</string>
<string name="pref_dont_save_encrypted">Neukládat šifrované zprávy</string>
<string name="pref_dont_save_encrypted_summary">Varování: Toto může vést ke ztrátě zpráv</string>
<string name="pref_expert_options">Expertní nastavení</string>
- <string name="pref_expert_options_summary">S tímto buďte velmi opatrní</string>
+ <string name="pref_expert_options_summary">S tímto zacházejte velmi opatrně</string>
<string name="pref_use_larger_font">Zvětšit velikost písma</string>
<string name="pref_use_larger_font_summary">Použít větší písmo v celé aplikaci</string>
- <string name="pref_use_send_button_to_indicate_status">Tlačítko pro odeslání zobrazuje stavu</string>
+ <string name="pref_use_send_button_to_indicate_status">Tlačítko pro odeslání zobrazuje stav</string>
<string name="pref_use_send_button_to_indicate_status_summary">Obarvit tlačítko pro odeslání barvou stavu kontaktu</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index e653147d..14397e16 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -202,7 +202,7 @@
<string name="contact_already_exists">Der Kontakt existiert bereits</string>
<string name="join">Beitreten</string>
<string name="conference_address">Konferenzadresse</string>
- <string name="conference_address_example">raum@conference.domain.de</string>
+ <string name="conference_address_example">raum@conference.example.com</string>
<string name="save_as_bookmark">Als Lesezeichen speichern</string>
<string name="delete_bookmark">Lesezeichen löschen</string>
<string name="bookmark_already_exists">Das Lesezeichen existiert bereits</string>
@@ -232,5 +232,32 @@
<string name="additional_information">Zusätzliche Informationen</string>
<string name="skip">Überspringen</string>
<string name="pref_ui_options">Benutzeroberfläche</string>
+ <string name="pref_use_indicate_received">Anfrage für Nachrichten Empfang</string>
+ <string name="pref_use_indicate_received_summary">Empfangene Nachrichten werden mit einem grünen Häckchen markiert. Bitte beachte das dies nicht unbedingt in allen Fällen funktioniert.</string>
+ <string name="disable_notifications">Benachrichtigungen deaktivieren</string>
+ <string name="disable_notifications_for_this_conversation">Benachrichtigungen für diese Unterhaltung deaktivieren</string>
+ <string name="notifications_disabled">Benachrichtigungen sind deaktiviert</string>
+ <string name="enable">Aktivieren</string>
+ <string name="conference_requires_password">Konferenz ist passwortgeschützt</string>
+ <string name="enter_password">Passwort eingeben</string>
+ <string name="missing_presence_updates">Fehlender Online-Status vom Kontakt</string>
+ <string name="request_presence_updates">Bitte erst Anwesenheitsbenachrichtigungen vom Kontakt anfordern.\n\n</string>
+ <string name="request_now">Jetzt anfordern</string>
+ <string name="delete_fingerprint">Fingerabdruck löschen</string>
+ <string name="sure_delete_fingerprint">Soll dieser Fingerabdruck definitiv gelöscht werden?</string>
+ <string name="ignore">Ignorieren</string>
+ <string name="without_mutual_presence_updates"><b>Achtung:</b> Es kann zu unerwarteten Problemen führen, dies ohne gegenseitige Anwesenheitsbenachrichtigungen abzusenden.\n\n<small>Bitte die Online-Status-Abonnements in den Kontaktdetails prüfen.</small></string>
+ <string name="pref_encryption_settings">Verschlüsselungs-Einstellungen</string>
+ <string name="pref_force_encryption">Ende-zu-Ende-Verschlüsselung forcieren</string>
+ <string name="pref_force_encryption_summary">Nachrichten immer verschlüsseln (außer für Konferenzen)</string>
+ <string name="pref_dont_save_encrypted">Verschlüsselte Nachrichten nicht speichern</string>
+ <string name="pref_dont_save_encrypted_summary">Achtung: Kann zu Nachrichtenverlust führen</string>
+ <string name="pref_expert_options">Einstellungen für Experten</string>
+ <string name="pref_expert_options_summary">Hier bitte vorsichtig sein</string>
+ <string name="pref_use_larger_font">Schriftgröße erhöhen</string>
+ <string name="pref_use_larger_font_summary">Überall in der App eine größere Schrift verwenden</string>
+ <string name="pref_use_send_button_to_indicate_status">Absende-Knopf zeigt Online-Status an</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">Absende-Knopf einfärben, um den Online-Status des Kontakts zu signalisieren</string>
+ <string name="pref_expert_options_other">Sonstiges</string>
-</resources> \ No newline at end of file
+</resources>
diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml
index eed87d35..cb1c20fd 100644
--- a/res/values-eu/arrays.xml
+++ b/res/values-eu/arrays.xml
@@ -20,5 +20,19 @@
<item>524288</item>
<item>1048576</item>
</string-array>
+ <string-array name="mute_options_descriptions">
+ <item>30 minutu</item>
+ <item>ordu bat</item>
+ <item>2 ordu</item>
+ <item>8 ordu</item>
+ <item>abisatu arte</item>
+ </string-array>
+ <integer-array name="mute_options_durations">
+ <item>1800</item>
+ <item>3600</item>
+ <item>7200</item>
+ <item>28800</item>
+ <item>-1</item>
+ </integer-array>
-</resources> \ No newline at end of file
+</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 2ca26c3d..72737284 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -108,6 +108,7 @@
<string name="pref_never_send_crash_summary">Akats harraskak bidaliz Conversationsen garapenean laguntzen duzu</string>
<string name="pref_confirm_messages">Mezuak egiaztatu</string>
<string name="pref_confirm_messages_summary">Zure kontaktuak mezu bat noiz jaso eta irakurri duzun jakin dezan baimendu</string>
+ <string name="pref_ui_options">Erabiltzaile-interfazearen aukerak</string>
<string name="openpgp_error">OpenKeychainek akats baten berri eman du</string>
<string name="error_decrypting_file">Sarrera/Irteera akatsa fitxategia desenkriptatzerakoan</string>
<string name="accept">Onartu</string>
@@ -213,6 +214,7 @@
<string name="contact_added_you">Kontaktuak bere zerrendara gehitu zaitu</string>
<string name="add_back">Bera gehitu</string>
<string name="contact_has_read_up_to_this_point">%s(e)k puntu honetaraino irakurri du</string>
+ <string name="publish">Argitaratu</string>
<string name="touch_to_choose_picture">Ukitu profileko argazkia irudi bat galeriatik hautatzeko</string>
<string name="publish_avatar_explanation">Adi: Zure presentzia eguneraketetara harpidetutako edonork irudi hau ikusi ahal izango du.</string>
<string name="publishing">Argitaratzen&#8230;</string>
@@ -230,6 +232,29 @@
<string name="server_info_session_established">Uneko saioa ezarri da</string>
<string name="additional_information">Informazio gehiago</string>
<string name="skip">Orain ez</string>
- <string name="pref_ui_options">Erabiltzaile-interfazearen aukerak</string>
-
-</resources> \ No newline at end of file
+ <string name="disable_notifications">Jakinarazpenak ezgaitu</string>
+ <string name="disable_notifications_for_this_conversation">Elkarrizketa honetarako jakinarazpenak ezgaitu</string>
+ <string name="notifications_disabled">Jakinarazpenak ezgaituta daude</string>
+ <string name="enable">Gaitu</string>
+ <string name="conference_requires_password">Konferentziak pasahitza behar du</string>
+ <string name="enter_password">Sartu pasahitza</string>
+ <string name="missing_presence_updates">Kontaktuaren presentzia eguneraketak falta dira</string>
+ <string name="request_presence_updates">Mesedez eskatu lehenago zure kontaktuaren presentzia eguneraketak.\n\n<small>Kontaktuak erabiltzen ari den bezeroa(k) zehazteko erabilika da hau.</small></string>
+ <string name="request_now">Eskatu orain</string>
+ <string name="delete_fingerprint">Hatz-marka ezabatu</string>
+ <string name="sure_delete_fingerprint">Ziur al zaude hatz-marka hau ezabatu nahi duzulaz?</string>
+ <string name="ignore">Kasurik ez egin</string>
+ <string name="without_mutual_presence_updates"><b>Adi:</b> Bien arteko presentzia eguneraketarik gabe hau bidaltzeak ustekabeko arazoak sor litzake.\n\n<small>Joan zaitez kontaktuaren xehetasunetara zure presentzia eguneraketak egiaztatzeko.</small></string>
+ <string name="pref_encryption_settings">Enkriptazio ezarpenak</string>
+ <string name="pref_force_encryption">End-to-end enkriptazioa behartu</string>
+ <string name="pref_force_encryption_summary">Mezuak beti enkriptatuta bidali (konferentzietan izan ezik)</string>
+ <string name="pref_dont_save_encrypted">Ez gorde enkriptatutako mezuak</string>
+ <string name="pref_dont_save_encrypted_summary">Adi: Honek mezuen galera ekar lezake</string>
+ <string name="pref_expert_options">Adituentzako aukerak</string>
+ <string name="pref_expert_options_summary">Mesedez kontuz ibili hauekin</string>
+ <string name="pref_use_larger_font">Letraren tamaina handitu</string>
+ <string name="pref_use_larger_font_summary">Letra tamaina handiagoa erabili aplikazio osoan zehar</string>
+ <string name="pref_use_send_button_to_indicate_status">Bidaltze botoiak egoera adierazten du</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">Bidaltze botoia koloreztatu kontaktu baten egoera adierazteko</string>
+
+</resources>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
new file mode 100644
index 00000000..491c4438
--- /dev/null
+++ b/res/values-it/arrays.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string-array name="resources">
+ <item>Cellulare</item>
+ <item>Telefono</item>
+ <item>Tablet</item>
+ <item>Conversations</item>
+ <item>Android</item>
+ </string-array>
+ <string-array name="filesizes">
+ <item>mai</item>
+ <item>256 KB</item>
+ <item>512 KB</item>
+ <item>1 MB</item>
+ </string-array>
+ <string-array name="filesizes_values">
+ <item>0</item>
+ <item>262144</item>
+ <item>524288</item>
+ <item>1048576</item>
+ </string-array>
+ <string-array name="mute_options_descriptions">
+ <item>30 minuti</item>
+ <item>un\'ora</item>
+ <item>2 ore</item>
+ <item>8 ore</item>
+ <item>fino avviso ulteriore</item>
+ </string-array>
+
+ <integer-array name="mute_options_durations">
+ <item>1800</item>
+ <item>3600</item>
+ <item>7200</item>
+ <item>28800</item>
+ <item>-1</item>
+ </integer-array>
+
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644
index 00000000..0bb0e05e
--- /dev/null
+++ b/res/values-it/strings.xml
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_name">Conversations</string>
+ <string name="action_settings">Impostazioni</string>
+ <string name="action_add">Nuova conversazione</string>
+ <string name="action_accounts">Gestisci utenti</string>
+ <string name="action_end_conversation">Termina questa conversazione</string>
+ <string name="action_contact_details">Dettagli del contatto</string>
+ <string name="action_muc_details">Dettagli conferenza</string>
+ <string name="action_secure">Conversazione sicura</string>
+ <string name="action_add_account">Aggiungi utente</string>
+ <string name="action_edit_contact">Modifica il nome</string>
+ <string name="action_add_phone_book">Aggiungi alla rubrica</string>
+ <string name="action_delete_contact">Cancella dalla lista</string>
+ <string name="title_activity_manage_accounts">Gestisci Utenti</string>
+ <string name="title_activity_settings">Impostazioni</string>
+ <string name="title_activity_conference_details">Dettagli conferenza</string>
+ <string name="title_activity_contact_details">Dettagli del contatto</string>
+ <string name="title_activity_conversations">Conversations</string>
+ <string name="title_activity_sharewith">Condividi con Conversation</string>
+ <string name="title_activity_start_conversation">Inizia una Conversazione</string>
+ <string name="title_activity_choose_contact">Scegli contatto</string>
+ <string name="just_now">adesso</string>
+ <string name="minute_ago">1 min fa</string>
+ <string name="minutes_ago">%d min fa</string>
+ <string name="unread_conversations">Conversazioni non lette</string>
+ <string name="sending">invio&#8230;</string>
+ <string name="encrypted_message">Decifrazione del messaggio. Attendere prego&#8230;</string>
+ <string name="nick_in_use">Nome utente già in uso</string>
+ <string name="admin">Amministratore</string>
+ <string name="owner">Proprietario</string>
+ <string name="moderator">Moderatore</string>
+ <string name="participant">Partecipante</string>
+ <string name="visitor">Visitatore</string>
+ <string name="remove_contact_text">Vuoi rimuovere %s dalla tua lista contatti? La conversazione associata con questo contatto non sarà rimossa.</string>
+ <string name="remove_bookmark_text">Vuoi rimuovere il segnalibro %s? La conversazione associata con questo contatto non sarà rimossa.</string>
+ <string name="register_account">Registra un nuovo account sul server</string>
+ <string name="share_with">Condividi con</string>
+ <string name="start_conversation">Inizia Conversazione</string>
+ <string name="invite_contact">Invita Contatto</string>
+ <string name="contacts">Contatti</string>
+ <string name="cancel">Cancella</string>
+ <string name="add">Aggiungi</string>
+ <string name="edit">Modifica</string>
+ <string name="delete">Elimina</string>
+ <string name="save">Salva</string>
+ <string name="ok">OK</string>
+ <string name="crash_report_title">Conversations è crashato</string>
+ <string name="crash_report_message">Se scegli di inviare una segnalazione dell\'errore aiuterai lo sviluppo di Conversations\n<b>Attenzione:</b> Questo utilizzerà il tuo account XMPP per inviare la segnalazione agli sviluppatori.</string>
+ <string name="send_now">Invia adesso</string>
+ <string name="send_never">Non chiedere mai più</string>
+ <string name="problem_connecting_to_account">Impossibile collegarsi all\'utente</string>
+ <string name="problem_connecting_to_accounts">Impossibile collegarsi a più utenti</string>
+ <string name="touch_to_fix">Tocca qui per gestire i tuoi utenti</string>
+ <string name="attach_file">Allega file</string>
+ <string name="not_in_roster">Il contatto non è nella tua lista. Vuoi aggiungerlo?</string>
+ <string name="add_contact">Aggiungi contatto</string>
+ <string name="send_failed">Invio fallito</string>
+ <string name="send_rejected">rifiutato</string>
+ <string name="receiving_image">Ricezione di un\'immagine. Attendere prego&#8230;</string>
+ <string name="preparing_image">Preparazioone immagine per la trasmissione</string>
+ <string name="action_clear_history">Pulisci la cronologia</string>
+ <string name="clear_conversation_history">Pulisci la cronologia della Conversazione</string>
+ <string name="clear_histor_msg">Vuoi cancellare tutti i messaggi di questa Conversazione?\n\n<b>Attenzione:</b> Questo non influenzerà i messaggi presenti su altri dispositivi o server.</string>
+ <string name="delete_messages">Elimina messaggi</string>
+ <string name="also_end_conversation">Termina questa conversazione in seguito</string>
+ <string name="choose_presence">Choose presence to contact</string>
+ <string name="send_plain_text_message">Invia messaggio di testo semplice</string>
+ <string name="send_otr_message">Invia messaggio cifrato con OTR</string>
+ <string name="send_pgp_message">Invia messaggio cifrato con OpenPGP</string>
+ <string name="your_nick_has_been_changed">Il tuo nome utente èstato cambiato</string>
+ <string name="download_image">Scarica Immagine</string>
+ <string name="image_offered_for_download"><i>Immagine disponibile per il download</i></string>
+ <string name="send_unencrypted">Invia non cifrato</string>
+ <string name="decryption_failed">Decifrazione fallita. Forse non disponi della chiave privata corretta.</string>
+ <string name="openkeychain_required">OpenKeychain</string>
+ <string name="openkeychain_required_long">Conversations usa una app di terze parti chiamata <b>OpenKeychain</b> per cifrare e decifrare i messaggi per gestire le tue chiavi pubbliche.\n\nOpenKeychain è rilasciato secondo i termini della GPLv3 ed è disponibile sia su F-Droid, che su Google Play.\n\n<small>(Riavvia Conversations in seguito.)</small></string>
+ <string name="restart">Riavvia</string>
+ <string name="install">Installa</string>
+ <string name="offering">offrendo&#8230;</string>
+ <string name="waiting">in attesa&#8230;</string>
+ <string name="no_pgp_key">Nessuna chiave OpenPGP trovata</string>
+ <string name="contact_has_no_pgp_key">Conversations non è in grado di cifrare i tuoi messaggi perchè il contatto non sta annunciando la sua chiave pubblica.\n\n<small>Per favore chiedi al tuo contatto di configurare OpenPGP.</small></string>
+ <string name="no_pgp_keys">Nessuna chiave OpenPGP trovata</string>
+ <string name="contacts_have_no_pgp_keys">Conversations non è in grado di cifrare i tuoi messaggi perchè i contatti non stanno annunciando la propria chiave pubblica.\n\n<small>Per favore chiedi ai tuoi contatti di configurare OpenPGP.</small></string>
+ <string name="encrypted_message_received"><i>Messaggio cifrato ricevuto. Tocca per decifrare.</i></string>
+ <string name="encrypted_image_received"><i>Immagine cifrata ricevuta. Tocca per decifrare e mostrare.</i></string>
+ <string name="image_file"><i>Immagine ricevuta. Tocca per mostrare</i></string>
+ <string name="pref_general">Generale</string>
+ <string name="pref_xmpp_resource">Risorsa XMPP</string>
+ <string name="pref_xmpp_resource_summary">Il nome con il quale questo client si identifica</string>
+ <string name="pref_accept_files">Accetta i file</string>
+ <string name="pref_accept_files_summary">Accetta automaticamente i file più piccoli di&#8230;</string>
+ <string name="pref_notification_settings">Impostazioni di Notifica</string>
+ <string name="pref_notifications">Notifiche</string>
+ <string name="pref_notifications_summary">Notifica quando arriva un nuovo messaggio</string>
+ <string name="pref_vibrate">Vibra</string>
+ <string name="pref_vibrate_summary">Vibra anche quando arriva un nuovo messaggio</string>
+ <string name="pref_sound">Suono</string>
+ <string name="pref_sound_summary">Riproduci una suoneria con la notifica</string>
+ <string name="pref_conference_notifications">Notifiche Conferenze</string>
+ <string name="pref_conference_notifications_summary">Notifica sempre quando arriva un nuovo messaggio da una conferenza, invece che solo quando in primo piano</string>
+ <string name="pref_notification_grace_period">Periodo tra notifiche</string>
+ <string name="pref_notification_grace_period_summary">Disabilita le notifiche per un breve lasso di tempo dopo che un messaggio è stato ricevuto</string>
+ <string name="pref_advanced_options">Opzioni Avanzate</string>
+ <string name="pref_never_send_crash">Non inviare mai segnalazioni di errore</string>
+ <string name="pref_never_send_crash_summary">Se scegli di inviare una segnalazione dell\'errore aiuterai lo sviluppo di Conversations</string>
+ <string name="pref_confirm_messages">Conferma Messaggi</string>
+ <string name="pref_confirm_messages_summary">Fai sapere ai tuoi contatti quando hai ricevuto il messaggio e l\'hai letto</string>
+ <string name="pref_ui_options">Opzioni Interfaccia</string>
+ <string name="openpgp_error">OpenKeychain ha riportato un errore</string>
+ <string name="error_decrypting_file">Errore di I/O nel decifrare il file</string>
+ <string name="accept">Accetta</string>
+ <string name="error">Si è verificato un errore</string>
+ <string name="pref_grant_presence_updates">Concedi aggiornamenti della presenza</string>
+ <string name="pref_grant_presence_updates_summary">Concedi e chiedi preventivamente la sottoscrizione della presenza ai contatti che hai creato</string>
+ <string name="subscriptions">Sottoscrizioni</string>
+ <string name="your_account">Il tuo utente</string>
+ <string name="keys">Chiavi</string>
+ <string name="send_presence_updates">Invia aggiornamenti della presenza</string>
+ <string name="receive_presence_updates">Ricevi aggiornamenti della presenza</string>
+ <string name="ask_for_presence_updates">Chiedi aggiornamenti della presenza</string>
+ <string name="attach_choose_picture">Scegli un\'immagine</string>
+ <string name="attach_take_picture">Foto</string>
+ <string name="preemptively_grant">Concedi aggiornamenti della presenza preventivamente</string>
+ <string name="error_not_an_image_file">Il file selezionato non è un\'immagine</string>
+ <string name="error_compressing_image">Errore durante la conversione dell\'immagine</string>
+ <string name="error_file_not_found">File non trovato</string>
+ <string name="error_io_exception">Errore di I/O generico. Forse hai esaurito lo spazio?</string>
+ <string name="error_security_exception_during_image_copy">L\'app che hai usato per selezionare questa immagine non ci ha fornito permessi sufficienti per leggere il file.\n\n<small>Usa un file manager differente per scegliere un\'immagine</small></string>
+ <string name="account_status_unknown">Sconosciuto</string>
+ <string name="account_status_disabled">Disabilitato temporaneamente</string>
+ <string name="account_status_online">Online</string>
+ <string name="account_status_connecting">In connessione\u2026</string>
+ <string name="account_status_offline">Offline</string>
+ <string name="account_status_unauthorized">Non autorizzato</string>
+ <string name="account_status_not_found">Server non trovato</string>
+ <string name="account_status_no_internet">Connettività assente</string>
+ <string name="account_status_regis_fail">Registrazione fallita</string>
+ <string name="account_status_regis_conflict">Nome utente già in uso</string>
+ <string name="account_status_regis_success">Registrazione completata</string>
+ <string name="account_status_regis_not_sup">Il Server non supporta la registrazione</string>
+ <string name="encryption_choice_none">Testo semplice</string>
+ <string name="encryption_choice_otr">OTR</string>
+ <string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="mgmt_account_edit">Modifica utente</string>
+ <string name="mgmt_account_delete">Elimina utente</string>
+ <string name="mgmt_account_disable">Disabilita temporaneamente</string>
+ <string name="mgmt_account_publish_avatar">Pubblica avatar</string>
+ <string name="mgmt_account_publish_pgp">Pubblica chiave pubblica OpenPGP</string>
+ <string name="mgmt_account_enable">Abilita utente</string>
+ <string name="mgmt_account_are_you_sure">Sei sicuro?</string>
+ <string name="mgmt_account_delete_confirm_text">Se cancelli il tuo utente la cronologia delle tue conversazioni verrà persa</string>
+ <string name="attach_record_voice">Registra la voce</string>
+ <string name="account_settings_jabber_id">ID Jabber</string>
+ <string name="account_settings_password">Password</string>
+ <string name="account_settings_example_jabber_id">utente@esempio.com</string>
+ <string name="account_settings_confirm_password">Conferma password</string>
+ <string name="password">Password</string>
+ <string name="confirm_password">Conferma password</string>
+ <string name="passwords_do_not_match">Le Password non corrispondono</string>
+ <string name="invalid_jid">Questo non è un ID Jabber valido</string>
+ <string name="error_out_of_memory">Memoria esaurita. L\'immagine è tropppo grande</string>
+ <string name="add_phone_book_text">Vuoi aggiungere %s alla rubrica del telefono?</string>
+ <string name="contact_status_online">online</string>
+ <string name="contact_status_free_to_chat">vuole chattare</string>
+ <string name="contact_status_away">assente</string>
+ <string name="contact_status_extended_away">assenza prolungata</string>
+ <string name="contact_status_do_not_disturb">non disturbare</string>
+ <string name="contact_status_offline">offline</string>
+ <string name="muc_details_conference">Conferenza</string>
+ <string name="muc_details_other_members">Altri Membri</string>
+ <string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
+ <string name="server_info_stream_management">XEP-0198: Stream Management</string>
+ <string name="server_info_pep">XEP-0163: PEP (Avatars)</string>
+ <string name="server_info_available">disponibile</string>
+ <string name="server_info_unavailable">non disponibile</string>
+ <string name="missing_public_keys">Annuncio chiave pubblica non effettuato</string>
+ <string name="last_seen_now">visto adesso</string>
+ <string name="last_seen_min">visto 1 minuto fa</string>
+ <string name="last_seen_mins">visto %d minuti fa</string>
+ <string name="last_seen_hour">visto 1 ora fa</string>
+ <string name="last_seen_hours">visto %d ore fa</string>
+ <string name="last_seen_day">visto 1 giorno fa</string>
+ <string name="last_seen_days">visto %d giorni fa</string>
+ <string name="never_seen">mai visto</string>
+ <string name="install_openkeychain">Messaggio cifrato. Installa OpenKeychain per decifrare.</string>
+ <string name="unknown_otr_fingerprint">Impronta OTR sconosciuta</string>
+ <string name="openpgp_messages_found">Messaggi cifrati con OpenPGP trovati</string>
+ <string name="reception_failed">Ricezione fallita</string>
+ <string name="your_fingerprint">La tua impronta</string>
+ <string name="otr_fingerprint">Impronta OTR</string>
+ <string name="verify">Verifica</string>
+ <string name="decrypt">Decripta</string>
+ <string name="conferences">Conferenze</string>
+ <string name="search">Cerca</string>
+ <string name="create_contact">Crea Contatto</string>
+ <string name="join_conference">Entra in Conferenza</string>
+ <string name="delete_contact">Elimina Contatto</string>
+ <string name="view_contact_details">Mostra dettagli contatto</string>
+ <string name="create">Crea</string>
+ <string name="contact_already_exists">Il contatto esiste già</string>
+ <string name="join">Entra</string>
+ <string name="conference_address">Indirizzo conferenza</string>
+ <string name="conference_address_example">room@conference.example.com</string>
+ <string name="save_as_bookmark">Salva come segnalibro</string>
+ <string name="delete_bookmark">Elimina segnalibro</string>
+ <string name="bookmark_already_exists">Questo segnalibro esiste già</string>
+ <string name="you">Tu</string>
+ <string name="action_edit_subject">Modifica soggetto conferenza</string>
+ <string name="conference_not_found">Conferenza non trovata</string>
+ <string name="leave">Abbandona</string>
+ <string name="contact_added_you">Il contatto ti ha aggiunto alla sua lista contatti</string>
+ <string name="add_back">Add back</string>
+ <string name="contact_has_read_up_to_this_point">%s ha letto fino a questo punto</string>
+ <string name="publish">Pubblica</string>
+ <string name="touch_to_choose_picture">Tocca l\'avatar per selezionare l\'immagine dalla gallaria</string>
+ <string name="publish_avatar_explanation">Nota bene: tutti i contatti sottoscritti agli aggiornamenti della tua presenza avranno il permesso di vedere questa immagine.</string>
+ <string name="publishing">Pubblicazione&#8230;</string>
+ <string name="error_publish_avatar_server_reject">Il server ha rifiutato la tua pubblicazione</string>
+ <string name="error_publish_avatar_converting">Qualcosa è andato storto durante la conversione della tua immagine</string>
+ <string name="error_saving_avatar">Impossibile salvare l\'avatar sulla memoria interna</string>
+ <string name="or_long_press_for_default">(O premi a lungo per ripristinare le impostazioni di default)</string>
+ <string name="error_publish_avatar_no_server_support">Il tuo server non supporta la pubblicazione degli avatar</string>
+ <string name="private_message">sussurrato</string>
+ <string name="private_message_to">a %s</string>
+ <string name="send_private_message_to">Invia messaggio privato a %s</string>
+ <string name="connect">Connetti</string>
+ <string name="account_already_exists">Questo utente esiste già</string>
+ <string name="next">Successivo</string>
+ <string name="server_info_session_established">Sessione corrente stabilita</string>
+ <string name="additional_information">Informazioni Aggiuntive</string>
+ <string name="skip">Salta</string>
+ <string name="disable_notifications">Disabilita le notifiche</string>
+ <string name="disable_notifications_for_this_conversation">Disabilita le notifiche per questa conversazione</string>
+ <string name="notifications_disabled">Le notifiche sono disabilitate</string>
+ <string name="enable">Abilita</string>
+ <string name="conference_requires_password">La conferenza richiede una password</string>
+ <string name="enter_password">Inserisci la password</string>
+ <string name="missing_presence_updates">Aggiornamenti della presenza del contatto mancanti</string>
+ <string name="request_presence_updates">Richiedi gli aggiornamenti della presenza dal tuo contatto.\n\n<small>Questo verrà usato per determinare quali client sta usando il tuo contatto.</small></string>
+ <string name="request_now">Rechiedi adesso</string>
+ <string name="delete_fingerprint">Elimina Impronta</string>
+ <string name="sure_delete_fingerprint">Sei sicuro di voler eliminare questa impronta?</string>
+ <string name="ignore">Ignora</string>
+ <string name="without_mutual_presence_updates"><b>Attenzione:</b> Inviando questo messaggio senza aggiornamenti della presenza reciproci potrebbe causare problemi inaspettati.\n\n<small>Vai nei dettagli del contatto per verificare le tue sottoscrizioni alla presenza.</small></string>
+ <string name="pref_encryption_settings">Impostazioni di cifratura</string>
+ <string name="pref_force_encryption">Forza cifratura end-to-end</string>
+ <string name="pref_force_encryption_summary">Manda sempre messaggi cifrati (ad eccezione delle conferenze)</string>
+ <string name="pref_dont_save_encrypted">Non salvare i messaggi cifrati</string>
+ <string name="pref_dont_save_encrypted_summary">Attenzione: Questo potrebbe comportare la perdita di messaggi</string>
+ <string name="pref_expert_options">Opzioni da Esperto</string>
+ <string name="pref_expert_options_summary">Fai attenzione con queste impostazioni</string>
+ <string name="pref_use_larger_font">Aumenta la dimensione dei font</string>
+ <string name="pref_use_larger_font_summary">Usa font più grandi in tutta l\'app</string>
+ <string name="pref_use_send_button_to_indicate_status">Il pulsante di invio indica lo stato</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">Colora il pulsante di invio per indicare lo stato di un contatto</string>
+
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 9f3992f2..2aa26b0b 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -1,44 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="next">Далее</string>
- <string name="publish_avatar_explanation">Пожалуйста, обратите внимание, что этот аватар смогут увидеть все ваши подписчики</string>
- <string name="server_info_unavailable">недоступен</string>
- <string name="mgmt_account_publish_pgp">Анонсировать OpenPGP ключ</string>
- <string name="additional_information">Дополнительная информация</string>
- <string name="server_info_pep">XEP-0163: PEP (Аватары)</string>
- <string name="skip">Пропустить</string>
- <string name="problem_connecting_to_account">Не удается подключиться к аккаунту</string>
- <string name="problem_connecting_to_accounts">Не удается подключиться к аккаунтам</string>
- <string name="account_status_connecting">Соединение\u2026</string>
- <string name="account_status_no_internet">Нет подключения к сети</string>
- <string name="connect">Подключиться</string>
- <string name="account_already_exists">Эта учетная запись уже существует</string>
- <string name="private_message_to">отправить %s</string>
- <string name="send_private_message_to">Отправить личное сообщение для %s</string>
- <string name="touch_to_choose_picture">Нажмите на аватар, чтобы выбрать новую фотографию из галереи</string>
- <string name="mgmt_account_publish_avatar">Разместить аватар</string>
- <string name="error_publish_avatar_server_reject">Сервер не смог разместить аватар</string>
- <string name="error_publish_avatar_converting">В процессе преобразования фотографии возникла ошибка</string>
- <string name="error_publish_avatar_no_server_support">Ваш сервер не поддерживает публикацию аватаров</string>
- <string name="publishing">Установка&#8230;</string>
- <string name="error_saving_avatar">Не удалось сохранить аватар</string>
- <string name="server_info_session_established">Текущий сеанс установлен</string>
- <string name="or_long_press_for_default">(Или долгое нажатие, чтобы вернуть значения по умолчанию)</string>
- <string name="server_info_available">доступен</string>
- <string name="pref_general">Общие</string>
- <string name="invite_contact">Пригласить собеседника</string>
- <string name="you">Вы</string>
- <string name="conference_not_found">Конференция не найдена</string>
- <string name="pref_accept_files">Принимать файлы</string>
- <string name="pref_accept_files_summary">Автоматический прием файлов&#8230;</string>
- <string name="title_activity_choose_contact">Выберите собеседника</string>
- <string name="contact_added_you">Собеседник добавил вас в контакт лист</string>
- <string name="remove_bookmark_text">Вы хотели бы удалить %s из закладок? Беседы связанные с данной закладкой не будут удалены.</string>
- <string name="action_edit_subject">Редактировать тему конференции</string>
- <string name="leave">Покинуть</string>
- <string name="add_back">Добавить в ответ</string>
- <string name="contact_has_read_up_to_this_point">%s видела сообщения до этого момента</string>
<string name="app_name">Conversations</string>
<string name="action_settings">Настройки</string>
<string name="action_add">Новая беседа</string>
@@ -58,6 +20,7 @@
<string name="title_activity_conversations">Conversations</string>
<string name="title_activity_sharewith">Поделиться</string>
<string name="title_activity_start_conversation">Начать беседу</string>
+ <string name="title_activity_choose_contact">Выберите собеседника</string>
<string name="just_now">только что</string>
<string name="minute_ago">1 минуту назад</string>
<string name="minutes_ago">%d мин. назад</string>
@@ -71,9 +34,11 @@
<string name="participant">Участник</string>
<string name="visitor">Посетитель</string>
<string name="remove_contact_text">Вы хотите удалить %s из своего списка? Беседы, связанные с этим аккаунтом будут сохранены.</string>
+ <string name="remove_bookmark_text">Вы хотите удалить %s из избранного? Беседы, связанные с данной закладкой будут сохранены</string>
<string name="register_account">Создать новый аккаунт на сервере</string>
<string name="share_with">Поделиться с</string>
<string name="start_conversation">Начать беседу</string>
+ <string name="invite_contact">Пригласить собеседника</string>
<string name="contacts">Контакты</string>
<string name="cancel">Отмена</string>
<string name="add">Добавить</string>
@@ -85,6 +50,8 @@
<string name="crash_report_message">Отправляя отчеты об ошибках, вы помогаете исправить и улучшить программу, поддерживая дальнейшее развитие программы\n<b>Предупреждение:</b>Отчет об ошибке будет отправлен разработчику, используя ваш аккаунт XMPP.</string>
<string name="send_now">Отправить сейчас</string>
<string name="send_never">Больше не спрашивать</string>
+ <string name="problem_connecting_to_account">Не удается подключиться к аккаунту</string>
+ <string name="problem_connecting_to_accounts">Не удается подключиться к аккаунтам</string>
<string name="touch_to_fix">Нажмите здесь, чтобы настроить свои аккаунты</string>
<string name="attach_file">Прикрепить файл</string>
<string name="not_in_roster">Контакт не находится в вашем списке. Хотите добавить его?</string>
@@ -120,8 +87,11 @@
<string name="encrypted_message_received"><i>Зашифрованное сообщение получено. Нажмите здесь, чтобы расшифровать и посмотреть сообщение.</i></string>
<string name="encrypted_image_received"><i>Зашифрованное изображение получено. Нажмите здесь, чтобы расшифровать и посмотреть изображение.</i></string>
<string name="image_file"><i>Изображение получено. Нажмите здесь, чтобы посмотреть.</i></string>
+ <string name="pref_general">Общие</string>
<string name="pref_xmpp_resource">Название ресурса</string>
<string name="pref_xmpp_resource_summary">Имя которым Conversations идентифицирует себя</string>
+ <string name="pref_accept_files">Принимать файлы</string>
+ <string name="pref_accept_files_summary">Автоматический прием файлов&#8230;</string>
<string name="pref_notification_settings">Настройки Уведомлений</string>
<string name="pref_notifications">Уведомление</string>
<string name="pref_notifications_summary">Использовать звуковое уведомление когда приходят новые сообщения</string>
@@ -138,6 +108,7 @@
<string name="pref_never_send_crash_summary">Отправляя отчеты об ошибках, вы помогаете исправить и улучшить Conversations, поддерживая дальнейшее развитие программы</string>
<string name="pref_confirm_messages">Отчеты о получении</string>
<string name="pref_confirm_messages_summary">Разрешить уведомлять отправителя, когда вы получили и прочитали сообщение</string>
+ <string name="pref_ui_options">Параметры интерфейса</string>
<string name="openpgp_error">Возникла ошибка в OpenKeychain</string>
<string name="error_decrypting_file">Ошибка расшифровки файла</string>
<string name="accept">Принять</string>
@@ -162,8 +133,10 @@
<string name="account_status_disabled">Временно отключен</string>
<string name="account_status_online">В сети</string>
<string name="account_status_offline">Не в сети</string>
+ <string name="account_status_connecting">Соединение\u2026</string>
<string name="account_status_unauthorized">Неавторизован</string>
<string name="account_status_not_found">Сервер не найден</string>
+ <string name="account_status_no_internet">Нет подключения к сети</string>
<string name="account_status_regis_fail">Регистрация не удалась</string>
<string name="account_status_regis_conflict">Имя пользователя уже используется</string>
<string name="account_status_regis_success">Регистрация завершена</string>
@@ -174,6 +147,8 @@
<string name="mgmt_account_edit">Редактировать аккаунт</string>
<string name="mgmt_account_delete">Удалить</string>
<string name="mgmt_account_disable">Отключить</string>
+ <string name="mgmt_account_publish_avatar">Разместить аватар</string>
+ <string name="mgmt_account_publish_pgp">Анонсировать OpenPGP ключ</string>
<string name="mgmt_account_enable">Включить</string>
<string name="mgmt_account_are_you_sure">Вы уверены?</string>
<string name="mgmt_account_delete_confirm_text">Если вы удалите свой аккаунт, вся ваша история будет потеряна</string>
@@ -198,6 +173,9 @@
<string name="muc_details_other_members">Другие участники</string>
<string name="server_info_carbon_messages">Дублирование сообщений</string>
<string name="server_info_stream_management">Управление потоками</string>
+ <string name="server_info_pep">XEP-0163: PEP (Аватары)</string>
+ <string name="server_info_available">доступен</string>
+ <string name="server_info_unavailable">недоступен</string>
<string name="missing_public_keys">Отсутствие анонсирования открытых ключей</string>
<string name="last_seen_now">Присутствие: только что</string>
<string name="last_seen_min">Присутствие: 1 минуту назад</string>
@@ -229,6 +207,54 @@
<string name="save_as_bookmark">Сохранить закладку</string>
<string name="delete_bookmark">Удалить закладку</string>
<string name="bookmark_already_exists">Такая закладка уже существует</string>
- <string name="pref_ui_options">Параметры интерфейса</string>
+ <string name="you">Вы</string>
+ <string name="action_edit_subject">Редактировать тему конференции</string>
+ <string name="conference_not_found">Конференция не найдена</string>
+ <string name="leave">Покинуть</string>
+ <string name="contact_added_you">Собеседник добавил вас в список контактов</string>
+ <string name="add_back">Добавить в ответ</string>
+ <string name="contact_has_read_up_to_this_point">%s прочит. сообщ. до этого момента</string>
+ <string name="publish">Опубликовать</string>
+ <string name="touch_to_choose_picture">Нажмите на аватар, чтобы выбрать новую фотографию из галереи</string>
+ <string name="publish_avatar_explanation">Пожалуйста, обратите внимание, что этот аватар смогут увидеть все ваши подписчики</string>
+ <string name="publishing">Установка&#8230;</string>
+ <string name="error_publish_avatar_server_reject">Сервер отклонил размещение аватара</string>
+ <string name="error_publish_avatar_converting">В процессе преобразования фотографии возникла ошибка</string>
+ <string name="error_saving_avatar">Не удалось сохранить аватар</string>
+ <string name="or_long_press_for_default">(Или долгое прикосновение, чтобы вернуть значения по умолчанию)</string>
+ <string name="error_publish_avatar_no_server_support">Ваш сервер не поддерживает публикацию аватаров</string>
+ <string name="private_message">Отправить личное сообщение для %s</string>
+ <string name="private_message_to">отправить %s</string>
+ <string name="send_private_message_to">Отправить личное сообщение для %s</string>
+ <string name="connect">Подключиться</string>
+ <string name="account_already_exists">Эта учетная запись уже существует</string>
+ <string name="next">Далее</string>
+ <string name="server_info_session_established">Текущий сеанс установлен</string>
+ <string name="additional_information">Дополнительная информация</string>
+ <string name="skip">Пропустить</string>
+ <string name="disable_notifications">Отключить уведомления</string>
+ <string name="disable_notifications_for_this_conversation">Отключить уведомления для текущей беседы</string>
+ <string name="notifications_disabled">Уведомления отключены</string>
+ <string name="enable">Включить</string>
+ <string name="conference_requires_password">Конференция требует авторизации</string>
+ <string name="enter_password">Введите пароль</string>
+ <string name="missing_presence_updates">Обновления присутствия недоступны</string>
+ <string name="request_presence_updates">Пожалуйста, прежде запросите обновления присутствия у вашего собеседника.\n\n<small>Эта информация будет использоваться для определения того, каким клиентом(ами) пользуетя ваш собеседник.</small></string>
+ <string name="request_now">Запросить сейчас</string>
+ <string name="delete_fingerprint">Удалить Контрольную Сумму</string>
+ <string name="sure_delete_fingerprint">Вы уверены, что хотите удалить данную контрольную сумму?</string>
+ <string name="ignore">Отменить</string>
+ <string name="without_mutual_presence_updates"><b>Внимание:</b> Если обновления присутствия не включены на обеих сторонах, это может привести к возникновению неожиданных проблемам.\n\n<small>Уточните сведения о контакте, проверив настройки обновлений присутствия.</small></string>
+ <string name="pref_encryption_settings">Настройки шифрования</string>
+ <string name="pref_force_encryption">Обязательное сквозное шифрование</string>
+ <string name="pref_force_encryption_summary">Всегда отправлять сообщения зашифрованными (за исключением конференций)</string>
+ <string name="pref_dont_save_encrypted">Не сохранять зашифрованные сообщения</string>
+ <string name="pref_dont_save_encrypted_summary">Внимание: Это может привести к потере сообщений</string>
+ <string name="pref_expert_options">Расширенные настройки</string>
+ <string name="pref_expert_options_summary">Пожалуйста, будьте осторожны с данными настройками</string>
+ <string name="pref_use_larger_font">Увеличить размер шрифта</string>
+ <string name="pref_use_larger_font_summary">Установите больший размер шрифта по всей программе</string>
+ <string name="pref_use_send_button_to_indicate_status">Использовать кнопку-индикатор</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">Раскрасить кнопку отправить, указывая текущий статус собеседника</string>
-</resources> \ No newline at end of file
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 75eb3b4d..be76c140 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -247,7 +247,7 @@
<string name="without_mutual_presence_updates"><b>Warning:</b> Sending this without mutual presence updates could cause unexpected problems.\n\n<small>Go to contact details to verify your presence subscriptions.</small></string>
<string name="pref_encryption_settings">Encryption settings</string>
<string name="pref_force_encryption">Force end-to-end encryption</string>
- <string name="pref_force_encryption_summary">Always send messages encrypted (execpt for conferences)</string>
+ <string name="pref_force_encryption_summary">Always send messages encrypted (except for conferences)</string>
<string name="pref_dont_save_encrypted">Don’t save encrypted messages</string>
<string name="pref_dont_save_encrypted_summary">Warning: This could lead to message loss</string>
<string name="pref_expert_options">Expert options</string>
@@ -255,6 +255,9 @@
<string name="pref_use_larger_font">Increase font size</string>
<string name="pref_use_larger_font_summary">Use larger font sizes across the entire app</string>
<string name="pref_use_send_button_to_indicate_status">Send button indicates status</string>
- <string name="pref_use_send_button_to_indicate_status_summary">Colorize send button to indicate a contacs status</string>
+ <string name="pref_use_indicate_received">Request message receipts</string>
+ <string name="pref_use_indicate_received_summary">Received masseges will be marked with a green tick. Be aware that this might no work in every case.</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">Colorize send button to indicate contact status</string>
+ <string name="pref_expert_options_other">Other</string>
-</resources> \ No newline at end of file
+</resources>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 7d0886bc..3dab0959 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -90,6 +90,13 @@
android:summary="@string/pref_dont_save_encrypted_summary"
android:title="@string/pref_dont_save_encrypted" />
</PreferenceCategory>
+ <PreferenceCategory android:title="@string/pref_expert_options_other" >
+ <CheckBoxPreference
+ android:defaultValue="false"
+ android:key="indicate_received"
+ android:summary="@string/pref_use_indicate_received_summary"
+ android:title="@string/pref_use_indicate_received" />
+ </PreferenceCategory>
</PreferenceScreen>
<CheckBoxPreference
@@ -99,4 +106,4 @@
android:title="@string/pref_never_send_crash" />
</PreferenceCategory>
-</PreferenceScreen> \ No newline at end of file
+</PreferenceScreen>
diff --git a/src/eu/siacs/conversations/crypto/OtrEngine.java b/src/eu/siacs/conversations/crypto/OtrEngine.java
index 5dfd6fd6..e0bd0e79 100644
--- a/src/eu/siacs/conversations/crypto/OtrEngine.java
+++ b/src/eu/siacs/conversations/crypto/OtrEngine.java
@@ -18,8 +18,6 @@ import android.util.Log;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.entities.Conversation;
-import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
@@ -29,8 +27,6 @@ import net.java.otr4j.OtrPolicy;
import net.java.otr4j.OtrPolicyImpl;
import net.java.otr4j.session.InstanceTag;
import net.java.otr4j.session.SessionID;
-import net.java.otr4j.session.SessionImpl;
-import net.java.otr4j.session.SessionStatus;
public class OtrEngine implements OtrEngineHost {
diff --git a/src/eu/siacs/conversations/entities/Conversation.java b/src/eu/siacs/conversations/entities/Conversation.java
index 005b83db..8395449d 100644
--- a/src/eu/siacs/conversations/entities/Conversation.java
+++ b/src/eu/siacs/conversations/entities/Conversation.java
@@ -230,7 +230,7 @@ public class Conversation extends AbstractEntity {
return this.otrSession;
} else {
SessionID sessionId = new SessionID(
- this.getContactJid().split("/")[0], presence, "xmpp");
+ this.getContactJid().split("/",2)[0], presence, "xmpp");
this.otrSession = new SessionImpl(sessionId, getAccount()
.getOtrEngine(service));
try {
diff --git a/src/eu/siacs/conversations/entities/Message.java b/src/eu/siacs/conversations/entities/Message.java
index ce496d27..8f9885c5 100644
--- a/src/eu/siacs/conversations/entities/Message.java
+++ b/src/eu/siacs/conversations/entities/Message.java
@@ -246,9 +246,10 @@ public class Message extends AbstractEntity {
public void setPresence(String presence) {
if (presence == null) {
- this.counterpart = this.counterpart.split("/")[0];
+ this.counterpart = this.counterpart.split("/", 2)[0];
} else {
- this.counterpart = this.counterpart.split("/")[0] + "/" + presence;
+ this.counterpart = this.counterpart.split("/", 2)[0] + "/"
+ + presence;
}
}
@@ -257,7 +258,7 @@ public class Message extends AbstractEntity {
}
public String getPresence() {
- String[] counterparts = this.counterpart.split("/");
+ String[] counterparts = this.counterpart.split("/", 2);
if (counterparts.length == 2) {
return counterparts[1];
} else {
@@ -327,11 +328,11 @@ public class Message extends AbstractEntity {
&& this.getEncryption() == message.getEncryption()
&& this.getCounterpart().equals(message.getCounterpart())
&& (message.getTimeSent() - this.getTimeSent()) <= (Config.MESSAGE_MERGE_WINDOW * 1000) && ((this
- .getStatus() == message.getStatus()) || ((this.getStatus() == Message.STATUS_SEND || this
+ .getStatus() == message.getStatus() || ((this.getStatus() == Message.STATUS_SEND || this
.getStatus() == Message.STATUS_SEND_RECEIVED) && (message
.getStatus() == Message.STATUS_UNSEND
|| message.getStatus() == Message.STATUS_SEND || message
- .getStatus() == Message.STATUS_SEND_DISPLAYED))));
+ .getStatus() == Message.STATUS_SEND_DISPLAYED)))));
}
public String getMergedBody() {
diff --git a/src/eu/siacs/conversations/entities/MucOptions.java b/src/eu/siacs/conversations/entities/MucOptions.java
index e9ab6908..676fb4f4 100644
--- a/src/eu/siacs/conversations/entities/MucOptions.java
+++ b/src/eu/siacs/conversations/entities/MucOptions.java
@@ -134,7 +134,7 @@ public class MucOptions {
}
public void processPacket(PresencePacket packet, PgpEngine pgp) {
- String[] fromParts = packet.getFrom().split("/");
+ String[] fromParts = packet.getFrom().split("/",2);
if (fromParts.length >= 2) {
String name = fromParts[1];
String type = packet.getAttribute("type");
@@ -180,7 +180,7 @@ public class MucOptions {
}
}
} else if (type.equals("unavailable")) {
- deleteUser(packet.getAttribute("from").split("/")[1]);
+ deleteUser(packet.getAttribute("from").split("/",2)[1]);
} else if (type.equals("error")) {
Element error = packet.findChild("error");
if (error.hasChild("conflict")) {
@@ -209,7 +209,7 @@ public class MucOptions {
}
public String getProposedNick() {
- String[] mucParts = conversation.getContactJid().split("/");
+ String[] mucParts = conversation.getContactJid().split("/",2);
if (conversation.getBookmark() != null
&& conversation.getBookmark().getNick() != null) {
return conversation.getBookmark().getNick();
@@ -309,7 +309,7 @@ public class MucOptions {
}
public String getJoinJid() {
- return this.conversation.getContactJid().split("/")[0] + "/"
+ return this.conversation.getContactJid().split("/",2)[0] + "/"
+ this.joinnick;
}
diff --git a/src/eu/siacs/conversations/entities/Roster.java b/src/eu/siacs/conversations/entities/Roster.java
index c6212f77..f11f0250 100644
--- a/src/eu/siacs/conversations/entities/Roster.java
+++ b/src/eu/siacs/conversations/entities/Roster.java
@@ -15,12 +15,12 @@ public class Roster {
}
public boolean hasContact(String jid) {
- String cleanJid = jid.split("/")[0];
+ String cleanJid = jid.split("/",2)[0];
return contacts.containsKey(cleanJid);
}
public Contact getContact(String jid) {
- String cleanJid = jid.split("/")[0].toLowerCase(Locale.getDefault());
+ String cleanJid = jid.split("/",2)[0].toLowerCase(Locale.getDefault());
if (contacts.containsKey(cleanJid)) {
return contacts.get(cleanJid);
} else {
diff --git a/src/eu/siacs/conversations/generator/AbstractGenerator.java b/src/eu/siacs/conversations/generator/AbstractGenerator.java
index 05d3d988..61f290e4 100644
--- a/src/eu/siacs/conversations/generator/AbstractGenerator.java
+++ b/src/eu/siacs/conversations/generator/AbstractGenerator.java
@@ -6,6 +6,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import eu.siacs.conversations.services.XmppConnectionService;
+
import android.util.Base64;
public abstract class AbstractGenerator {
@@ -19,6 +21,12 @@ public abstract class AbstractGenerator {
"urn:xmpp:avatar:metadata+notify" };
public final String IDENTITY_NAME = "Conversations 0.7";
public final String IDENTITY_TYPE = "phone";
+
+ protected XmppConnectionService mXmppConnectionService;
+
+ protected AbstractGenerator(XmppConnectionService service) {
+ this.mXmppConnectionService = service;
+ }
public String getCapHash() {
StringBuilder s = new StringBuilder();
diff --git a/src/eu/siacs/conversations/generator/IqGenerator.java b/src/eu/siacs/conversations/generator/IqGenerator.java
index b5ecafb5..d44bf0ca 100644
--- a/src/eu/siacs/conversations/generator/IqGenerator.java
+++ b/src/eu/siacs/conversations/generator/IqGenerator.java
@@ -4,12 +4,17 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.pep.Avatar;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
public class IqGenerator extends AbstractGenerator {
+ public IqGenerator(XmppConnectionService service) {
+ super(service);
+ }
+
public IqPacket discoResponse(IqPacket request) {
IqPacket packet = new IqPacket(IqPacket.TYPE_RESULT);
packet.setId(request.getId());
diff --git a/src/eu/siacs/conversations/generator/MessageGenerator.java b/src/eu/siacs/conversations/generator/MessageGenerator.java
index ecfb4744..d4cab3ed 100644
--- a/src/eu/siacs/conversations/generator/MessageGenerator.java
+++ b/src/eu/siacs/conversations/generator/MessageGenerator.java
@@ -10,10 +10,15 @@ import net.java.otr4j.session.Session;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
-public class MessageGenerator {
+public class MessageGenerator extends AbstractGenerator {
+ public MessageGenerator(XmppConnectionService service) {
+ super(service);
+ }
+
private MessagePacket preparePacket(Message message, boolean addDelay) {
Conversation conversation = message.getConversation();
Account account = conversation.getAccount();
@@ -22,11 +27,14 @@ public class MessageGenerator {
packet.setTo(message.getCounterpart());
packet.setType(MessagePacket.TYPE_CHAT);
packet.addChild("markable", "urn:xmpp:chat-markers:0");
+ if (this.mXmppConnectionService.indicateReceived()) {
+ packet.addChild("request", "urn:xmpp:receipts");
+ }
} else if (message.getType() == Message.TYPE_PRIVATE) {
packet.setTo(message.getCounterpart());
packet.setType(MessagePacket.TYPE_CHAT);
} else {
- packet.setTo(message.getCounterpart().split("/")[0]);
+ packet.setTo(message.getCounterpart().split("/",2)[0]);
packet.setType(MessagePacket.TYPE_GROUPCHAT);
}
packet.setFrom(account.getFullJid());
@@ -126,7 +134,7 @@ public class MessageGenerator {
String subject) {
MessagePacket packet = new MessagePacket();
packet.setType(MessagePacket.TYPE_GROUPCHAT);
- packet.setTo(conversation.getContactJid().split("/")[0]);
+ packet.setTo(conversation.getContactJid().split("/",2)[0]);
Element subjectChild = new Element("subject");
subjectChild.setContent(subject);
packet.addChild(subjectChild);
@@ -140,13 +148,13 @@ public class MessageGenerator {
packet.setTo(contact);
packet.setFrom(conversation.getAccount().getFullJid());
Element x = packet.addChild("x", "jabber:x:conference");
- x.setAttribute("jid", conversation.getContactJid().split("/")[0]);
+ x.setAttribute("jid", conversation.getContactJid().split("/",2)[0]);
return packet;
}
public MessagePacket invite(Conversation conversation, String contact) {
MessagePacket packet = new MessagePacket();
- packet.setTo(conversation.getContactJid().split("/")[0]);
+ packet.setTo(conversation.getContactJid().split("/",2)[0]);
packet.setFrom(conversation.getAccount().getFullJid());
Element x = new Element("x");
x.setAttribute("xmlns", "http://jabber.org/protocol/muc#user");
diff --git a/src/eu/siacs/conversations/generator/PresenceGenerator.java b/src/eu/siacs/conversations/generator/PresenceGenerator.java
index 87e361f5..d896dd00 100644
--- a/src/eu/siacs/conversations/generator/PresenceGenerator.java
+++ b/src/eu/siacs/conversations/generator/PresenceGenerator.java
@@ -2,11 +2,16 @@ package eu.siacs.conversations.generator;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
public class PresenceGenerator extends AbstractGenerator {
+ public PresenceGenerator(XmppConnectionService service) {
+ super(service);
+ }
+
private PresencePacket subscription(String type, Contact contact) {
PresencePacket packet = new PresencePacket();
packet.setAttribute("type", type);
diff --git a/src/eu/siacs/conversations/parser/AbstractParser.java b/src/eu/siacs/conversations/parser/AbstractParser.java
index 25fcd921..efbf5aef 100644
--- a/src/eu/siacs/conversations/parser/AbstractParser.java
+++ b/src/eu/siacs/conversations/parser/AbstractParser.java
@@ -60,7 +60,7 @@ public abstract class AbstractParser {
protected void updateLastseen(Element packet, Account account,
boolean presenceOverwrite) {
- String[] fromParts = packet.getAttribute("from").split("/");
+ String[] fromParts = packet.getAttribute("from").split("/",2);
String from = fromParts[0];
String presence = null;
if (fromParts.length >= 2) {
diff --git a/src/eu/siacs/conversations/parser/MessageParser.java b/src/eu/siacs/conversations/parser/MessageParser.java
index 534c9dea..0e15c60f 100644
--- a/src/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/eu/siacs/conversations/parser/MessageParser.java
@@ -25,7 +25,7 @@ public class MessageParser extends AbstractParser implements
}
private Message parseChat(MessagePacket packet, Account account) {
- String[] fromParts = packet.getFrom().split("/");
+ String[] fromParts = packet.getFrom().split("/",2);
Conversation conversation = mXmppConnectionService
.findOrCreateConversation(account, fromParts[0], false);
conversation.setLatestMarkableMessageId(getMarkableMessageId(packet));
@@ -57,9 +57,9 @@ public class MessageParser extends AbstractParser implements
}
private Message parseOtrChat(MessagePacket packet, Account account) {
- boolean properlyAddressed = (packet.getTo().split("/").length == 2)
+ boolean properlyAddressed = (packet.getTo().split("/",2).length == 2)
|| (account.countPresences() == 1);
- String[] fromParts = packet.getFrom().split("/");
+ String[] fromParts = packet.getFrom().split("/",2);
Conversation conversation = mXmppConnectionService
.findOrCreateConversation(account, fromParts[0], false);
String presence;
@@ -132,7 +132,7 @@ public class MessageParser extends AbstractParser implements
private Message parseGroupchat(MessagePacket packet, Account account) {
int status;
- String[] fromParts = packet.getFrom().split("/");
+ String[] fromParts = packet.getFrom().split("/",2);
if (mXmppConnectionService.find(account.pendingConferenceLeaves,
account, fromParts[0]) != null) {
return null;
@@ -186,11 +186,13 @@ public class MessageParser extends AbstractParser implements
int status;
String fullJid;
Element forwarded;
- if (packet.hasChild("received")) {
- forwarded = packet.findChild("received").findChild("forwarded");
+ if (packet.hasChild("received", "urn:xmpp:carbons:2")) {
+ forwarded = packet.findChild("received", "urn:xmpp:carbons:2")
+ .findChild("forwarded", "urn:xmpp:forward:0");
status = Message.STATUS_RECEIVED;
- } else if (packet.hasChild("sent")) {
- forwarded = packet.findChild("sent").findChild("forwarded");
+ } else if (packet.hasChild("sent", "urn:xmpp:carbons:2")) {
+ forwarded = packet.findChild("sent", "urn:xmpp:carbons:2")
+ .findChild("forwarded", "urn:xmpp:forward:0");
status = Message.STATUS_SEND;
} else {
return null;
@@ -219,7 +221,7 @@ public class MessageParser extends AbstractParser implements
return null;
}
}
- String[] parts = fullJid.split("/");
+ String[] parts = fullJid.split("/",2);
Conversation conversation = mXmppConnectionService
.findOrCreateConversation(account, parts[0], false);
conversation.setLatestMarkableMessageId(getMarkableMessageId(packet));
@@ -251,7 +253,7 @@ public class MessageParser extends AbstractParser implements
}
private void parseError(MessagePacket packet, Account account) {
- String[] fromParts = packet.getFrom().split("/");
+ String[] fromParts = packet.getFrom().split("/",2);
mXmppConnectionService.markMessage(account, fromParts[0],
packet.getId(), Message.STATUS_SEND_FAILED);
}
@@ -265,13 +267,20 @@ public class MessageParser extends AbstractParser implements
String id = packet
.findChild("displayed", "urn:xmpp:chat-markers:0")
.getAttribute("id");
- String[] fromParts = packet.getAttribute("from").split("/");
+ String[] fromParts = packet.getAttribute("from").split("/",2);
updateLastseen(packet, account, true);
mXmppConnectionService.markMessage(account, fromParts[0], id,
Message.STATUS_SEND_DISPLAYED);
} else if (packet.hasChild("received", "urn:xmpp:chat-markers:0")) {
String id = packet.findChild("received", "urn:xmpp:chat-markers:0")
.getAttribute("id");
+ String[] fromParts = packet.getAttribute("from").split("/",2);
+ updateLastseen(packet, account, false);
+ mXmppConnectionService.markMessage(account, fromParts[0], id,
+ Message.STATUS_SEND_RECEIVED);
+ } else if (packet.hasChild("received", "urn:xmpp:receipts")) {
+ String id = packet.findChild("received", "urn:xmpp:receipts")
+ .getAttribute("id");
String[] fromParts = packet.getAttribute("from").split("/");
updateLastseen(packet, account, false);
mXmppConnectionService.markMessage(account, fromParts[0], id,
@@ -392,7 +401,8 @@ public class MessageParser extends AbstractParser implements
if (message != null) {
message.markUnread();
}
- } else if (packet.hasChild("received") || (packet.hasChild("sent"))) {
+ } else if (packet.hasChild("received", "urn:xmpp:carbons:2")
+ || (packet.hasChild("sent", "urn:xmpp:carbons:2"))) {
message = this.parseCarbonMessage(packet, account);
if (message != null) {
if (message.getStatus() == Message.STATUS_SEND) {
diff --git a/src/eu/siacs/conversations/parser/PresenceParser.java b/src/eu/siacs/conversations/parser/PresenceParser.java
index 05ffa67e..e240a858 100644
--- a/src/eu/siacs/conversations/parser/PresenceParser.java
+++ b/src/eu/siacs/conversations/parser/PresenceParser.java
@@ -22,7 +22,7 @@ public class PresenceParser extends AbstractParser implements
PgpEngine mPgpEngine = mXmppConnectionService.getPgpEngine();
if (packet.hasChild("x", "http://jabber.org/protocol/muc#user")) {
Conversation muc = mXmppConnectionService.find(account, packet
- .getAttribute("from").split("/")[0]);
+ .getAttribute("from").split("/",2)[0]);
if (muc != null) {
boolean before = muc.getMucOptions().online();
muc.getMucOptions().processPacket(packet, mPgpEngine);
@@ -32,7 +32,7 @@ public class PresenceParser extends AbstractParser implements
}
} else if (packet.hasChild("x", "http://jabber.org/protocol/muc")) {
Conversation muc = mXmppConnectionService.find(account, packet
- .getAttribute("from").split("/")[0]);
+ .getAttribute("from").split("/",2)[0]);
if (muc != null) {
boolean before = muc.getMucOptions().online();
muc.getMucOptions().processPacket(packet, mPgpEngine);
diff --git a/src/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/eu/siacs/conversations/persistance/DatabaseBackend.java
index cda2f356..51fd79e5 100644
--- a/src/eu/siacs/conversations/persistance/DatabaseBackend.java
+++ b/src/eu/siacs/conversations/persistance/DatabaseBackend.java
@@ -32,7 +32,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
+ ") ON DELETE CASCADE, UNIQUE(" + Contact.ACCOUNT + ", "
+ Contact.JID + ") ON CONFLICT REPLACE);";
- public DatabaseBackend(Context context) {
+ private DatabaseBackend(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@@ -221,6 +221,14 @@ public class DatabaseBackend extends SQLiteOpenHelper {
String[] args = { account.getUuid() };
db.delete(Account.TABLENAME, Account.UUID + "=?", args);
}
+
+ public boolean hasEnabledAccounts() {
+ SQLiteDatabase db = this.getReadableDatabase();
+ Cursor cursor= db.rawQuery("select count("+Account.UUID+") from "+Account.TABLENAME+" where not options & (1 <<1)", null);
+ cursor.moveToFirst();
+ int count = cursor.getInt(0);
+ return (count>0);
+ }
@Override
public SQLiteDatabase getWritableDatabase() {
diff --git a/src/eu/siacs/conversations/services/EventReceiver.java b/src/eu/siacs/conversations/services/EventReceiver.java
index c0bf67f3..e2445b2a 100644
--- a/src/eu/siacs/conversations/services/EventReceiver.java
+++ b/src/eu/siacs/conversations/services/EventReceiver.java
@@ -1,5 +1,6 @@
package eu.siacs.conversations.services;
+import eu.siacs.conversations.persistance.DatabaseBackend;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -14,7 +15,9 @@ public class EventReceiver extends BroadcastReceiver {
} else {
mIntentForService.setAction("other");
}
- context.startService(mIntentForService);
+ if (intent.getAction().equals("ui") || DatabaseBackend.getInstance(context).hasEnabledAccounts()) {
+ context.startService(mIntentForService);
+ }
}
}
diff --git a/src/eu/siacs/conversations/services/ImageProvider.java b/src/eu/siacs/conversations/services/ImageProvider.java
index 15b86802..af8ab4b2 100644
--- a/src/eu/siacs/conversations/services/ImageProvider.java
+++ b/src/eu/siacs/conversations/services/ImageProvider.java
@@ -31,7 +31,7 @@ public class ImageProvider extends ContentProvider {
if (uuids == null) {
throw new FileNotFoundException();
}
- String[] uuidsSplited = uuids.split("/");
+ String[] uuidsSplited = uuids.split("/",2);
if (uuidsSplited.length != 3) {
throw new FileNotFoundException();
}
diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java
index c019682e..f80bb9ef 100644
--- a/src/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/eu/siacs/conversations/services/XmppConnectionService.java
@@ -96,8 +96,8 @@ public class XmppConnectionService extends Service {
private MessageParser mMessageParser = new MessageParser(this);
private PresenceParser mPresenceParser = new PresenceParser(this);
private IqParser mIqParser = new IqParser(this);
- private MessageGenerator mMessageGenerator = new MessageGenerator();
- private PresenceGenerator mPresenceGenerator = new PresenceGenerator();
+ private MessageGenerator mMessageGenerator = new MessageGenerator(this);
+ private PresenceGenerator mPresenceGenerator = new PresenceGenerator(this);
private List<Account> accounts;
private CopyOnWriteArrayList<Conversation> conversations = null;
@@ -585,18 +585,18 @@ public class XmppConnectionService extends Service {
}
}
+ conv.getMessages().add(message);
+ if (!account.getXmppConnection().getFeatures().sm()
+ && conv.getMode() != Conversation.MODE_MULTI) {
+ message.setStatus(Message.STATUS_SEND);
+ }
if (saveInDb) {
if (message.getEncryption() == Message.ENCRYPTION_NONE
|| saveEncryptedMessages()) {
databaseBackend.createMessage(message);
}
}
- conv.getMessages().add(message);
if ((send) && (packet != null)) {
- if (!account.getXmppConnection().getFeatures().sm()
- && conv.getMode() != Conversation.MODE_MULTI) {
- message.setStatus(Message.STATUS_SEND);
- }
sendMessagePacket(account, packet);
}
updateConversationUi();
@@ -819,15 +819,15 @@ public class XmppConnectionService extends Service {
}
});
}
-
- public List<Message> getMoreMessages(Conversation conversation,
- long timestamp) {
+
+ public int loadMoreMessages(Conversation conversation, long timestamp) {
List<Message> messages = databaseBackend.getMessages(conversation, 50,
timestamp);
for (Message message : messages) {
message.setConversation(conversation);
}
- return messages;
+ conversation.getMessages().addAll(0, messages);
+ return messages.size();
}
public List<Account> getAccounts() {
@@ -847,7 +847,7 @@ public class XmppConnectionService extends Service {
String jid) {
for (Conversation conversation : haystack) {
if ((conversation.getAccount().equals(account))
- && (conversation.getContactJid().split("/")[0].equals(jid))) {
+ && (conversation.getContactJid().split("/",2)[0].equals(jid))) {
return conversation;
}
}
@@ -1097,7 +1097,7 @@ public class XmppConnectionService extends Service {
}
private OnRenameListener renameListener = null;
- private IqGenerator mIqGenerator = new IqGenerator();
+ private IqGenerator mIqGenerator = new IqGenerator(this);
public void setOnRenameListener(OnRenameListener listener) {
this.renameListener = listener;
@@ -1566,6 +1566,10 @@ public class XmppConnectionService extends Service {
return !getPreferences().getBoolean("dont_save_encrypted", false);
}
+ public boolean indicateReceived() {
+ return getPreferences().getBoolean("indicate_received", false);
+ }
+
public void notifyUi(Conversation conversation, boolean notify) {
if (mOnConversationUpdate != null) {
mOnConversationUpdate.onConversationUpdate();
diff --git a/src/eu/siacs/conversations/ui/ChooseContactActivity.java b/src/eu/siacs/conversations/ui/ChooseContactActivity.java
index 277d21d6..62a2cbe1 100644
--- a/src/eu/siacs/conversations/ui/ChooseContactActivity.java
+++ b/src/eu/siacs/conversations/ui/ChooseContactActivity.java
@@ -82,6 +82,7 @@ public class ChooseContactActivity extends XmppActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_contact);
mListView = (ListView) findViewById(R.id.choose_contact_list);
+ mListView.setFastScrollEnabled(true);
mContactsAdapter = new ListItemAdapter(this, contacts);
mListView.setAdapter(mContactsAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
diff --git a/src/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
index 2cfa1635..76c12a47 100644
--- a/src/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
+++ b/src/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
@@ -201,7 +201,7 @@ public class ConferenceDetailsActivity extends XmppActivity {
private void populateView() {
mYourPhoto.setImageBitmap(conversation.getAccount().getImage(this, 48));
setTitle(conversation.getName());
- mFullJid.setText(conversation.getContactJid().split("/")[0]);
+ mFullJid.setText(conversation.getContactJid().split("/",2)[0]);
mYourNick.setText(conversation.getMucOptions().getActualNick());
mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
if (conversation.getMucOptions().online()) {
diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java
index 40ad0f33..03d034d9 100644
--- a/src/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/eu/siacs/conversations/ui/ConversationActivity.java
@@ -16,7 +16,6 @@ import eu.siacs.conversations.utils.UIHelper;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
-import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.app.ActionBar;
import android.app.AlertDialog;
@@ -791,6 +790,10 @@ public class ConversationActivity extends XmppActivity implements
return getPreferences().getBoolean("send_button_status", false);
}
+ public boolean indicateReceived() {
+ return getPreferences().getBoolean("indicate_received", false);
+ }
+
@Override
public void onAccountUpdate() {
final ConversationFragment fragment = (ConversationFragment) getFragmentManager()
diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java
index e09958cb..299bf281 100644
--- a/src/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/eu/siacs/conversations/ui/ConversationFragment.java
@@ -165,14 +165,15 @@ public class ConversationFragment extends Fragment {
if (firstVisibleItem == 0 && messagesLoaded) {
long timestamp = messageList.get(0).getTimeSent();
messagesLoaded = false;
- List<Message> messages = activity.xmppConnectionService
- .getMoreMessages(conversation, timestamp);
- messageList.addAll(0, messages);
+ int size = activity.xmppConnectionService.loadMoreMessages(
+ conversation, timestamp);
+ messageList.clear();
+ messageList.addAll(conversation.getMessages());
messageListAdapter.notifyDataSetChanged();
- if (messages.size() != 0) {
+ if (size != 0) {
messagesLoaded = true;
}
- messagesView.setSelectionFromTop(messages.size() + 1, 0);
+ messagesView.setSelectionFromTop(size + 1, 0);
}
}
};
@@ -274,11 +275,23 @@ public class ConversationFragment extends Fragment {
@Override
public void onContactPictureClicked(Message message) {
- if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
- if (message.getPresence() != null) {
- highlightInConference(message.getPresence());
+ if (message.getStatus() <= Message.STATUS_RECEIVED) {
+ if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
+ if (message.getPresence() != null) {
+ highlightInConference(message.getPresence());
+ } else {
+ highlightInConference(message
+ .getCounterpart());
+ }
} else {
- highlightInConference(message.getCounterpart());
+ Contact contact = message.getConversation()
+ .getContact();
+ if (contact.showInRoster()) {
+ activity.switchToContactDetails(contact);
+ } else {
+ activity.showAddToRosterDialog(message
+ .getConversation());
+ }
}
}
}
@@ -288,11 +301,13 @@ public class ConversationFragment extends Fragment {
@Override
public void onContactPictureLongClicked(Message message) {
- if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
- if (message.getPresence() != null) {
- privateMessageWith(message.getPresence());
- } else {
- privateMessageWith(message.getCounterpart());
+ if (message.getStatus() <= Message.STATUS_RECEIVED) {
+ if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
+ if (message.getPresence() != null) {
+ privateMessageWith(message.getPresence());
+ } else {
+ privateMessageWith(message.getCounterpart());
+ }
}
}
}
@@ -492,7 +507,7 @@ public class ConversationFragment extends Fragment {
private void messageSent() {
int size = this.messageList.size();
- if (size >= 1) {
+ if (size >= 1 && this.messagesView.getLastVisiblePosition() != size - 1) {
messagesView.setSelection(size - 1);
}
mEditMessage.setText("");
diff --git a/src/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/eu/siacs/conversations/ui/ManageAccountActivity.java
index c57121da..ca17eb0d 100644
--- a/src/eu/siacs/conversations/ui/ManageAccountActivity.java
+++ b/src/eu/siacs/conversations/ui/ManageAccountActivity.java
@@ -62,7 +62,7 @@ public class ManageAccountActivity extends XmppActivity {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
- editAccount(accountList.get(position));
+ switchToAccount(accountList.get(position));
}
});
registerForContextMenu(accountListView);
@@ -163,12 +163,6 @@ public class ManageAccountActivity extends XmppActivity {
}
}
- private void editAccount(Account account) {
- Intent intent = new Intent(this, EditAccountActivity.class);
- intent.putExtra("jid", account.getJid());
- startActivity(intent);
- }
-
private void publishAvatar(Account account) {
Intent intent = new Intent(getApplicationContext(),
PublishProfilePictureActivity.class);
diff --git a/src/eu/siacs/conversations/ui/SettingsActivity.java b/src/eu/siacs/conversations/ui/SettingsActivity.java
index 6b280719..fc361fb8 100644
--- a/src/eu/siacs/conversations/ui/SettingsActivity.java
+++ b/src/eu/siacs/conversations/ui/SettingsActivity.java
@@ -1,21 +1,27 @@
package eu.siacs.conversations.ui;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Locale;
-import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.os.Build;
import android.os.Bundle;
+import android.preference.ListPreference;
import android.preference.PreferenceManager;
public class SettingsActivity extends XmppActivity implements
OnSharedPreferenceChangeListener {
+ private SettingsFragment mSettingsFragment;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mSettingsFragment = new SettingsFragment();
getFragmentManager().beginTransaction()
- .replace(android.R.id.content, new SettingsFragment()).commit();
+ .replace(android.R.id.content,mSettingsFragment).commit();
}
@Override
@@ -28,6 +34,13 @@ public class SettingsActivity extends XmppActivity implements
super.onStart();
PreferenceManager.getDefaultSharedPreferences(this)
.registerOnSharedPreferenceChangeListener(this);
+ ListPreference resources = (ListPreference) mSettingsFragment.findPreference("resource");
+ if (resources!=null) {
+ ArrayList<CharSequence> entries = new ArrayList<CharSequence>(Arrays.asList(resources.getEntries()));
+ entries.add(0,Build.MODEL);
+ resources.setEntries(entries.toArray(new CharSequence[entries.size()]));
+ resources.setEntryValues(entries.toArray(new CharSequence[entries.size()]));
+ }
}
@Override
diff --git a/src/eu/siacs/conversations/ui/StartConversationActivity.java b/src/eu/siacs/conversations/ui/StartConversationActivity.java
index 6287070c..db6c1509 100644
--- a/src/eu/siacs/conversations/ui/StartConversationActivity.java
+++ b/src/eu/siacs/conversations/ui/StartConversationActivity.java
@@ -568,6 +568,7 @@ public class StartConversationActivity extends XmppActivity {
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
registerForContextMenu(getListView());
+ getListView().setFastScrollEnabled(true);
}
@Override
diff --git a/src/eu/siacs/conversations/ui/XmppActivity.java b/src/eu/siacs/conversations/ui/XmppActivity.java
index 4ee51580..351462ae 100644
--- a/src/eu/siacs/conversations/ui/XmppActivity.java
+++ b/src/eu/siacs/conversations/ui/XmppActivity.java
@@ -247,6 +247,12 @@ public abstract class XmppActivity extends Activity {
intent.putExtra("contact", contact.getJid());
startActivity(intent);
}
+
+ public void switchToAccount(Account account) {
+ Intent intent = new Intent(this, EditAccountActivity.class);
+ intent.putExtra("jid", account.getJid());
+ startActivity(intent);
+ }
protected void inviteToConversation(Conversation conversation) {
Intent intent = new Intent(getApplicationContext(),
diff --git a/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java
index db01eabe..035d18c5 100644
--- a/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java
+++ b/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java
@@ -11,7 +11,6 @@ import eu.siacs.conversations.entities.Downloadable;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.ui.ConversationActivity;
import eu.siacs.conversations.utils.UIHelper;
-import eu.siacs.conversations.xmpp.jingle.JingleConnection;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -97,6 +96,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
String filesize = null;
String info = null;
boolean error = false;
+ if (viewHolder.indicatorReceived != null) {
+ viewHolder.indicatorReceived.setVisibility(View.GONE);
+ }
boolean multiReceived = message.getConversation().getMode() == Conversation.MODE_MULTI
&& message.getMergedStatus() <= Message.STATUS_RECEIVED;
if (message.getType() == Message.TYPE_IMAGE) {
@@ -118,6 +120,16 @@ public class MessageAdapter extends ArrayAdapter<Message> {
case Message.STATUS_OFFERED:
info = getContext().getString(R.string.offering);
break;
+ case Message.STATUS_SEND_RECEIVED:
+ if (activity.indicateReceived()) {
+ viewHolder.indicatorReceived.setVisibility(View.VISIBLE);
+ }
+ break;
+ case Message.STATUS_SEND_DISPLAYED:
+ if (activity.indicateReceived()) {
+ viewHolder.indicatorReceived.setVisibility(View.VISIBLE);
+ }
+ break;
case Message.STATUS_SEND_FAILED:
info = getContext().getString(R.string.send_failed);
error = true;
@@ -129,6 +141,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
case Message.STATUS_RECEPTION_FAILED:
info = getContext().getString(R.string.reception_failed);
error = true;
+ break;
default:
if (multiReceived) {
Contact contact = message.getContact();
@@ -155,7 +168,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.indicator.setVisibility(View.VISIBLE);
}
- String formatedTime = UIHelper.readableTimeDifference(getContext(),
+ String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(),
message.getMergedTimeSent());
if (message.getStatus() <= Message.STATUS_RECEIVED) {
if ((filesize != null) && (info != null)) {
@@ -337,6 +350,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
.findViewById(R.id.message_body);
viewHolder.time = (TextView) view
.findViewById(R.id.message_time);
+ viewHolder.indicatorReceived = (ImageView) view
+ .findViewById(R.id.indicator_received);
view.setTag(viewHolder);
break;
case RECEIVED:
@@ -406,6 +421,36 @@ public class MessageAdapter extends ArrayAdapter<Message> {
return view;
}
+ if (viewHolder.contact_picture != null) {
+ viewHolder.contact_picture
+ .setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ if (MessageAdapter.this.mOnContactPictureClickedListener != null) {
+ MessageAdapter.this.mOnContactPictureClickedListener
+ .onContactPictureClicked(item);
+ ;
+ }
+
+ }
+ });
+ viewHolder.contact_picture
+ .setOnLongClickListener(new OnLongClickListener() {
+
+ @Override
+ public boolean onLongClick(View v) {
+ if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) {
+ MessageAdapter.this.mOnContactPictureLongClickedListener
+ .onContactPictureLongClicked(item);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ }
+
if (type == RECEIVED) {
if (item.getConversation().getMode() == Conversation.MODE_MULTI) {
Contact contact = item.getContact();
@@ -420,33 +465,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.contact_picture.setImageBitmap(mBitmapCache.get(
name, getContext()));
}
- viewHolder.contact_picture
- .setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- if (MessageAdapter.this.mOnContactPictureClickedListener != null) {
- MessageAdapter.this.mOnContactPictureClickedListener
- .onContactPictureClicked(item);
- ;
- }
-
- }
- });
- viewHolder.contact_picture
- .setOnLongClickListener(new OnLongClickListener() {
-
- @Override
- public boolean onLongClick(View v) {
- if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) {
- MessageAdapter.this.mOnContactPictureLongClickedListener
- .onContactPictureLongClicked(item);
- return true;
- } else {
- return false;
- }
- }
- });
}
}
@@ -512,6 +530,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
protected Button download_button;
protected ImageView image;
protected ImageView indicator;
+ protected ImageView indicatorReceived;
protected TextView time;
protected TextView messageBody;
protected ImageView contact_picture;
diff --git a/src/eu/siacs/conversations/utils/UIHelper.java b/src/eu/siacs/conversations/utils/UIHelper.java
index 54c370ef..f6e66cdb 100644
--- a/src/eu/siacs/conversations/utils/UIHelper.java
+++ b/src/eu/siacs/conversations/utils/UIHelper.java
@@ -51,10 +51,21 @@ public class UIHelper {
private static final int BG_COLOR = 0xFF181818;
private static final int FG_COLOR = 0xFFFAFAFA;
private static final int TRANSPARENT = 0x00000000;
- private static final int DATE_NO_YEAR_FLAGS = DateUtils.FORMAT_SHOW_DATE
+ private static final int SHORT_DATE_FLAGS = DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_NO_YEAR | DateUtils.FORMAT_ABBREV_ALL;
+ private static final int FULL_DATE_FLAGS = DateUtils.FORMAT_SHOW_TIME
+ | DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_DATE;
public static String readableTimeDifference(Context context, long time) {
+ return readableTimeDifference(context, time, false);
+ }
+
+ public static String readableTimeDifferenceFull(Context context, long time) {
+ return readableTimeDifference(context, time, true);
+ }
+
+ private static String readableTimeDifference(Context context, long time,
+ boolean fullDate) {
if (time == 0) {
return context.getString(R.string.just_now);
}
@@ -67,12 +78,17 @@ public class UIHelper {
} else if (difference < 60 * 15) {
return context.getString(R.string.minutes_ago,
Math.round(difference / 60.0));
- } else if (today(date) || difference < 6 * 60 * 60) {
+ } else if (today(date)) {
java.text.DateFormat df = DateFormat.getTimeFormat(context);
return df.format(date);
} else {
- return DateUtils.formatDateTime(context, date.getTime(),
- DATE_NO_YEAR_FLAGS);
+ if (fullDate) {
+ return DateUtils.formatDateTime(context, date.getTime(),
+ FULL_DATE_FLAGS);
+ } else {
+ return DateUtils.formatDateTime(context, date.getTime(),
+ SHORT_DATE_FLAGS);
+ }
}
}
@@ -353,14 +369,15 @@ public class UIHelper {
Pattern highlight = generateNickHighlightPattern(nick);
Matcher m = highlight.matcher(currentCon.getLatestMessage()
.getBody());
- notify = m.find();
+ notify = m.find()
+ || (currentCon.getLatestMessage().getType() == Message.TYPE_PRIVATE);
}
List<Conversation> unread = new ArrayList<Conversation>();
for (Conversation conversation : conversations) {
if (conversation.getMode() == Conversation.MODE_MULTI) {
if ((!conversation.isRead())
- && ((wasHighlighted(conversation) || (alwaysNotify)))) {
+ && ((wasHighlightedOrPrivate(conversation) || (alwaysNotify)))) {
unread.add(conversation);
}
} else {
@@ -466,7 +483,7 @@ public class UIHelper {
}
}
- private static boolean wasHighlighted(Conversation conversation) {
+ private static boolean wasHighlightedOrPrivate(Conversation conversation) {
List<Message> messages = conversation.getMessages();
String nick = conversation.getMucOptions().getActualNick();
Pattern highlight = generateNickHighlightPattern(nick);
@@ -475,7 +492,8 @@ public class UIHelper {
break;
} else {
Matcher m = highlight.matcher(messages.get(i).getBody());
- if (m.find()) {
+ if (m.find()
+ || messages.get(i).getType() == Message.TYPE_PRIVATE) {
return true;
}
}
diff --git a/src/eu/siacs/conversations/xmpp/XmppConnection.java b/src/eu/siacs/conversations/xmpp/XmppConnection.java
index e7b25e26..e02c772d 100644
--- a/src/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -657,7 +657,7 @@ public class XmppConnection implements Runnable {
if (bind != null) {
Element jid = bind.findChild("jid");
if (jid != null) {
- account.setResource(jid.getContent().split("/")[1]);
+ account.setResource(jid.getContent().split("/",2)[1]);
if (streamFeatures.hasChild("sm", "urn:xmpp:sm:3")) {
smVersion = 3;
EnablePacket enable = new EnablePacket(smVersion);
diff --git a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
index f42482e8..4eac99e6 100644
--- a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -256,12 +256,12 @@ public class JingleConnection implements Downloadable {
this.status = STATUS_INITIATED;
Conversation conversation = this.mXmppConnectionService
.findOrCreateConversation(account,
- packet.getFrom().split("/")[0], false);
+ packet.getFrom().split("/",2)[0], false);
this.message = new Message(conversation, "", Message.ENCRYPTION_NONE);
this.message.setType(Message.TYPE_IMAGE);
this.message.setStatus(Message.STATUS_RECEIVED_OFFER);
this.message.setDownloadable(this);
- String[] fromParts = packet.getFrom().split("/");
+ String[] fromParts = packet.getFrom().split("/",2);
this.message.setPresence(fromParts[1]);
this.account = account;
this.initiator = packet.getFrom();