diff options
53 files changed, 807 insertions, 197 deletions
@@ -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 Binary files differnew file mode 100644 index 00000000..a9069c9b --- /dev/null +++ b/art/ic_secure_indicator.xcf 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 Binary files differnew file mode 100644 index 00000000..b1e3f274 --- /dev/null +++ b/res/drawable-hdpi/ic_received_indicator.png diff --git a/res/drawable-hdpi/ic_secure_indicator.png b/res/drawable-hdpi/ic_secure_indicator.png Binary files differnew file mode 100644 index 00000000..2a2934fb --- /dev/null +++ b/res/drawable-hdpi/ic_secure_indicator.png diff --git a/res/drawable-mdpi/ic_received_indicator.png b/res/drawable-mdpi/ic_received_indicator.png Binary files differnew file mode 100644 index 00000000..88ff1efb --- /dev/null +++ b/res/drawable-mdpi/ic_received_indicator.png diff --git a/res/drawable-mdpi/ic_secure_indicator.png b/res/drawable-mdpi/ic_secure_indicator.png Binary files differnew file mode 100644 index 00000000..5a73aef4 --- /dev/null +++ b/res/drawable-mdpi/ic_secure_indicator.png diff --git a/res/drawable-xhdpi/ic_received_indicator.png b/res/drawable-xhdpi/ic_received_indicator.png Binary files differnew file mode 100644 index 00000000..2c871933 --- /dev/null +++ b/res/drawable-xhdpi/ic_received_indicator.png diff --git a/res/drawable-xhdpi/ic_secure_indicator.png b/res/drawable-xhdpi/ic_secure_indicator.png Binary files differnew file mode 100644 index 00000000..1f4c9a32 --- /dev/null +++ b/res/drawable-xhdpi/ic_secure_indicator.png diff --git a/res/drawable-xxhdpi/ic_received_indicator.png b/res/drawable-xxhdpi/ic_received_indicator.png Binary files differnew file mode 100644 index 00000000..039a9ef9 --- /dev/null +++ b/res/drawable-xxhdpi/ic_received_indicator.png diff --git a/res/drawable-xxhdpi/ic_secure_indicator.png b/res/drawable-xxhdpi/ic_secure_indicator.png Binary files differnew file mode 100644 index 00000000..1ee9b67d --- /dev/null +++ b/res/drawable-xxhdpi/ic_secure_indicator.png 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í…</string> <string name="waiting">čekám…</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…</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…</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…</string> + <string name="encrypted_message">Decifrazione del messaggio. Attendere prego…</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…</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…</string> + <string name="waiting">in attesa…</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…</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…</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">Установка…</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">Автоматический прием файлов…</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">Автоматический прием файлов…</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">Установка…</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(); |