From 2a731731767b341af2785532c17bfa9ed71710d0 Mon Sep 17 00:00:00 2001 From: Erkan Date: Sun, 22 Mar 2015 20:09:53 +0100 Subject: [PATCH 01/57] Update french translation --- src/main/res/values-fr/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 69440362c..47c285174 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -427,4 +427,8 @@ Aucune application trouvée pour afficher la position Position Position reçue + + %d contact séléctionné + %d contacts séléctionnés + From e64049c4fc0f4514dee011a1f616ea4bdff1f16a Mon Sep 17 00:00:00 2001 From: BrianBlade Date: Wed, 1 Apr 2015 12:14:05 +0200 Subject: [PATCH 02/57] Add toggle account-state switch Add a switch to AccountAdapter that allows self-contained enabling/disabling of accounts without the need to bring up the context-menu --- .../ui/ManageAccountActivity.java | 8 ++++ .../ui/adapter/AccountAdapter.java | 45 ++++++++++++------- src/main/res/layout/account_row.xml | 8 ++++ 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java index b2d5ddfd7..c7db94af6 100644 --- a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java @@ -168,6 +168,14 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda } } + public void onClickTglAccountState(Account account) { + if (account.isOptionSet(Account.OPTION_DISABLED)) { + enableAccount(account); + } else { + disableAccount(account); + } + } + private void publishAvatar(Account account) { Intent intent = new Intent(getApplicationContext(), PublishProfilePictureActivity.class); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java index 29730914f..5209aa124 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java @@ -5,6 +5,7 @@ import java.util.List; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.ui.XmppActivity; +import eu.siacs.conversations.ui.ManageAccountActivity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -12,6 +13,7 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Switch; public class AccountAdapter extends ArrayAdapter { @@ -24,7 +26,7 @@ public class AccountAdapter extends ArrayAdapter { @Override public View getView(int position, View view, ViewGroup parent) { - Account account = getItem(position); + final Account account = getItem(position); if (view == null) { LayoutInflater inflater = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -34,21 +36,32 @@ public class AccountAdapter extends ArrayAdapter { jid.setText(account.getJid().toBareJid().toString()); TextView statusView = (TextView) view.findViewById(R.id.account_status); ImageView imageView = (ImageView) view.findViewById(R.id.account_image); - imageView.setImageBitmap(activity.avatarService().get(account, - activity.getPixel(48))); - statusView.setText(getContext().getString(account.getStatus().getReadableId())); - switch (account.getStatus()) { - case ONLINE: - statusView.setTextColor(activity.getOnlineColor()); - break; - case DISABLED: - case CONNECTING: - statusView.setTextColor(activity.getSecondaryTextColor()); - break; - default: - statusView.setTextColor(activity.getWarningTextColor()); - break; - } + imageView.setImageBitmap(activity.avatarService().get(account, activity.getPixel(48))); + statusView.setText(getContext().getString(account.getStatus().getReadableId())); + switch (account.getStatus()) { + case ONLINE: + statusView.setTextColor(activity.getOnlineColor()); + break; + case DISABLED: + case CONNECTING: + statusView.setTextColor(activity.getSecondaryTextColor()); + break; + default: + statusView.setTextColor(activity.getWarningTextColor()); + break; + } + final Switch tglAccountState = (Switch) view.findViewById(R.id.tgl_account_status); + boolean isDisabled = (account.getStatus() == Account.State.DISABLED) ? true : false; + tglAccountState.setChecked(!isDisabled); + tglAccountState.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (activity instanceof ManageAccountActivity) { + ((ManageAccountActivity) activity).onClickTglAccountState(account); + tglAccountState.toggle(); + } + } + }); return view; } } diff --git a/src/main/res/layout/account_row.xml b/src/main/res/layout/account_row.xml index 60b69090f..1cd29d59c 100644 --- a/src/main/res/layout/account_row.xml +++ b/src/main/res/layout/account_row.xml @@ -41,4 +41,12 @@ android:textStyle="bold" /> + + \ No newline at end of file From db74cb52c417a99005f86d49804fdb512ee5c99f Mon Sep 17 00:00:00 2001 From: BrianBlade Date: Wed, 1 Apr 2015 12:22:18 +0200 Subject: [PATCH 03/57] Fix OTR-Error messages Send out OTR-Errors on unreadableMessageReceived() as well, not only on messageFromAnotherInstanceReceived --- .../siacs/conversations/crypto/OtrEngine.java | 38 +++++++++++-------- .../generator/MessageGenerator.java | 4 +- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java b/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java index 20427d7bd..263f60890 100644 --- a/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java +++ b/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java @@ -202,20 +202,7 @@ public class OtrEngine extends OtrCryptoEngineImpl implements OtrEngineHost { @Override public void messageFromAnotherInstanceReceived(SessionID session) { - try { - Jid jid = Jid.fromSessionID(session); - Conversation conversation = mXmppConnectionService.find(account, jid); - String id = conversation == null ? null : conversation.getLastReceivedOtrMessageId(); - if (id != null) { - MessagePacket packet = mXmppConnectionService.getMessageGenerator().generateOtrError(jid,id); - packet.setFrom(account.getJid()); - mXmppConnectionService.sendMessagePacket(account,packet); - Log.d(Config.LOGTAG,packet.toString()); - Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": unreadable OTR message in "+conversation.getName()); - } - } catch (InvalidJidException e) { - return; - } + sendOtrErrorMessage(session, "Message from another OTR-instance received"); } @Override @@ -267,9 +254,28 @@ public class OtrEngine extends OtrCryptoEngineImpl implements OtrEngineHost { } @Override - public void unreadableMessageReceived(SessionID arg0) throws OtrException { + public void unreadableMessageReceived(SessionID session) throws OtrException { Log.d(Config.LOGTAG,"unreadable message received"); - throw new OtrException(new Exception("unreadable message received")); + sendOtrErrorMessage(session, "You sent me an unreadable OTR-encrypted message"); + } + + public void sendOtrErrorMessage(SessionID session, String errorText) { + try { + Jid jid = Jid.fromSessionID(session); + Conversation conversation = mXmppConnectionService.find(account, jid); + String id = conversation == null ? null : conversation.getLastReceivedOtrMessageId(); + if (id != null) { + MessagePacket packet = mXmppConnectionService.getMessageGenerator() + .generateOtrError(jid, id, errorText); + packet.setFrom(account.getJid()); + mXmppConnectionService.sendMessagePacket(account,packet); + Log.d(Config.LOGTAG,packet.toString()); + Log.d(Config.LOGTAG,account.getJid().toBareJid().toString() + +": unreadable OTR message in "+conversation.getName()); + } + } catch (InvalidJidException e) { + return; + } } @Override diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java index 8f6a90b99..a60c5613f 100644 --- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java @@ -172,7 +172,7 @@ public class MessageGenerator extends AbstractGenerator { return receivedPacket; } - public MessagePacket generateOtrError(Jid to, String id) { + public MessagePacket generateOtrError(Jid to, String id, String errorText) { MessagePacket packet = new MessagePacket(); packet.setType(MessagePacket.TYPE_ERROR); packet.setAttribute("id",id); @@ -181,7 +181,7 @@ public class MessageGenerator extends AbstractGenerator { error.setAttribute("code","406"); error.setAttribute("type","modify"); error.addChild("not-acceptable","urn:ietf:params:xml:ns:xmpp-stanzas"); - error.addChild("text").setContent("unreadable OTR message received"); + error.addChild("text").setContent("?OTR Error:" + errorText); return packet; } } From 64d6a2970e687c4d1931fa6ccb4a9917a61ed1d5 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Wed, 1 Apr 2015 20:26:28 +0200 Subject: [PATCH 04/57] pulled translations from transifex --- src/main/res/values-de/strings.xml | 12 +- src/main/res/values-es/strings.xml | 4 + src/main/res/values-eu/strings.xml | 4 + src/main/res/values-ja/strings.xml | 433 +++++++++++++++++++++++++++++ src/main/res/values-sk/strings.xml | 5 + src/main/res/values-sr/strings.xml | 9 +- src/main/res/values-sv/strings.xml | 14 +- 7 files changed, 466 insertions(+), 15 deletions(-) create mode 100644 src/main/res/values-ja/strings.xml diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 0dd9f4011..b8266182c 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -121,13 +121,13 @@ Annehmen Ein unbekannter Fehler ist aufgetreten Online-Status - Erlaube neu hinzugefügten Kontakten deinen online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen + Erlaube neu hinzugefügten Kontakten meinen Online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen Abonnements Dein Konto Schlüssel - Anwesenheitsbenachrichtigungen senden - Empfange Anwesenheitsbenachrichtigungen - Frage um Erlaubnis, Anwesenheitsbenachrichtigungen sehen zu dürfen + Online-Status senden + Online-Status empfangen + Online-Status anfragen Bild auswählen Bild aufnehmen Erlaube Statusanfrage vorab @@ -255,12 +255,12 @@ Konferenz ist passwortgeschützt Passwort eingeben Fehlender Online-Status vom Kontakt - Bitte erst Anwesenheitsbenachrichtigungen vom Kontakt anfordern.\n\n + Bitte erst Online-Status vom Kontakt anfragen.\n\nDies wird verwendet, um festzustellen, welche Client(s) der Kontakt benutzt. Jetzt anfordern Fingerabdruck löschen Soll dieser Fingerabdruck gelöscht werden? Ignorieren - Achtung: Es kann zu unerwarteten Problemen führen, dies ohne gegenseitige Anwesenheitsbenachrichtigungen abzusenden.\n\nBitte die Online-Status-Abonnements in den Kontaktdetails prüfen. + Achtung: Ohne gegenseitig den Online-Status zu kennen, kann es zu unerwarteten Problemen kommen.\n\nBitte die Einstellungen in den Kontakt-Details prüfen. Verschlüsselungs-Einstellungen Ende-zu-Ende-Verschlüsselung erzwingen Nachrichten immer verschlüsseln (außer für Konferenzen) diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 639eddfaf..44d8abb23 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -427,4 +427,8 @@ No se ha encontrado ninguna aplicación para mostrar la ubicación Ubicación Ubicación recibida + + Seleccionado %d contacto + Seleccionados %d contactos + diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index 4d81c1bfa..b6d1fa3c8 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -427,4 +427,8 @@ Kokapena erakutsi dezakeen aplikaziorik ez da aurkitu Kokapena Kokapena jaso da + + Hautatu kontaktu %d + Hautatu %d kontaktu + diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..baffa088c --- /dev/null +++ b/src/main/res/values-ja/strings.xml @@ -0,0 +1,433 @@ + + + 設定 + 新しい会話 + アカウントの管理 + この会話を終了 + 連絡先の詳細 + 会議の詳細 + 安全に会話 + アカウントを追加 + 名前の編集 + 電話帳に追加 + 名簿から削除 + 連絡先をブロック + 連絡先のブロックを解除 + ドメインをブロック + ドメインのブロックを解除 + アカウントの管理 + 設定 + 会議の詳細 + 連絡先の詳細 + 会話で共有 + 会話の開始 + 連絡先の選択 + ブロックリスト + ちょうど今 + 1 分前 + %d 分前 + 未読の会話 + 送信中… + メッセージを復号しています。しばらくお待ちください… + ニックネームは既に使用されています + 管理者 + オーナー + モデレーター + 参加者 + ビジター + あなたの名簿から %s を削除しますか? この連絡先と関連した会話は削除されません。 + %s からあなたに送信されるメッセージをブロックしますか? + %s のブロックを解除し、あなたにメッセージを送信できるようにしますか? + %s からの連絡をすべてブロックしますか? + %s からの連絡をすべてブロック解除しますか? + 連絡先をブロックしました + ブックマークとして %s を削除しますか? このブックマークに関連した会話は削除されません。 + サーバーに新しいアカウントを登録 + サーバーのパスワードを変更 + …で共有 + 会話を開始 + 連絡先を招待 + 連絡先 + キャンセル + 設定 + 追加 + 編集 + 削除 + ブロック + ブロックを解除 + 保存 + OK + Conversations がクラッシュしました + Conversations の継続的な開発を支援するために、スタックトレースをお送りください。\n警告: あなたのXMPPアカウントを使用して、開発者にスタックトレースを送信します。 + 今すぐ送信 + 今後表示しない + アカウントに接続できません + 複数のアカウントに接続できません + ここをタッチして、アカウントの管理 + 添付ファイル + 連絡先が名簿にありません。追加しますか? + 連絡先を追加 + 配信に失敗しました + 拒否されました + 転送用画像の準備中 + 履歴をクリア + 会話履歴をクリア + この会話のすべてのメッセージを削除しますか?\n\n警告: これは、他のデバイスやサーバーに保存されているメッセージには影響しません。 + メッセージを削除 + その後、この会話を終了 + 連絡する参加を選択 + プレーンテキストを送信 + OTR 暗号化メッセージを送信 + OpenPGP 暗号化メッセージを送信 + あなたのニックネームが変更されました + 画像のダウンロード + 暗号化されていない送信 + 復号化に失敗しました。おそらく秘密鍵が正しくないようです。 + OpenKeychain + Conversations は OpenKeychain と呼ばれるサードパーティのアプリを利用して、メッセージの暗号化および復号化、そしてあなたの公開鍵を管理します。\n\nOpenKeychain は GPLv3 ライセンスの下で、F-Droid および Google Play から利用可能です。\n\n(後で Conversations を再起動してください。) + 再起動 + インストール + 依頼中… + 待機中… + OpenPGP の鍵はありません + 連絡先が公開鍵を通知しないため、Conversations はあなたのメッセージを暗号化することができません。\n\n連絡先に OpenPGP をセットアップするように依頼してください。 + OpenPGP の鍵はありません + 連絡先が公開鍵を通知しないため、Conversations はあなたのメッセージを暗号化することができません。\n\n連絡先に OpenPGP をセットアップするように依頼してください。 + 暗号化されたメッセージを受信しました。タッチすると、表示および復号化します。 + 全般 + XMPP リソース + 自分自身を識別するこのクライアントの名前 + ファイルを受取 + 自動的に小さいファイルを受取… + 通知設定 + 通知 + 新しいメッセージが到着したときに通知します + 振動 + 新しいメッセージが到着したときに振動もします + サウンド + 通知で着信音を再生します + 会議通知 + 新しい会議メッセージが到着したとき、ハイライト表示ではなく、常に通知します + 通知猶予期間 + カーボンコピーを受信した後、短時間、通知を無効にします + 詳細オプション + クラッシュレポートを送信しない + スタックトレースを送信することで、あなたは Conversations の継続的な開発を支援しています + メッセージの確認 + あなたがメッセージを受け取って読んだことを、連絡先に知らせます + UI オプション + OpenKeychain がエラーを報告しました + ファイルの復号化中に I/O エラー + 受付 + エラーが発生しました + 参加アップデートの権限を付与 + 事前に、作成した連絡先に対して権限を付与して、参加のサブスクリプションを求めます + サブスクリプション + あなたのアカウント + + 参加アップデートを送信 + 参加アップデートを受信 + 参加アップデートを問合せ + 写真の選択 + 写真の撮影 + 事前にサブスクリプション要求を許可する + 選択したファイルは画像ではありません + 画像ファイルの変換中にエラー + ファイルが見つかりません + 一般的な I/O エラー。おそらく空き容量がなくなっていませんか? + 選択した画像ファイルは、読み取りに必要なアクセス権がありません。\n\n別のファイルマネージャを使用して、画像を選択してください。 + 不明 + 一時的に無効 + オンライン + 接続中\u2026 + オフライン + 許可されていません + サーバーが見つかりません + 接続エラー + 登録に失敗しました + ユーザー名はすでに使用されています + 登録が完了しました + サーバーが登録をサポートしていません + セキュリティ エラー + 互換性のないサーバー + プレーンテキスト + OTR + OpenPGP + アカウントの編集 + アカウントを削除 + 一時的に無効にする + アバターを公開 + OpenPGP 公開鍵を公開 + アカウントを有効にする + よろしいですか? + アカウントを削除するとあなたの会話履歴がすべて失われます + 音声を録音 + Jabber ID + パスワード + username@example.com + パスワードを確認 + パスワード + パスワードを確認 + パスワードが一致しません + これは有効な Jabber ID ではありません + メモリ不足です。画像が大きすぎます + 電話の連絡先リストに %s を追加しますか? + オンライン + 自由にチャットできます + 離席中 + 長時間離席中 + じゃましないで + オフライン + 会議 + 他のメンバー + サーバー情報 + XEP-0313: メッセージ アーカイブ管理 + XEP-0280: メッセージ カーボン + XEP-0352: クライアント状態表示 + XEP-0191: ブロッキング コマンド + XEP-0237: 名簿バージョニング + XEP-0198: ストリーム管理 + XEP-0163: 個人イベントプロトコル (アバター) + 利用可能 + 利用不可 + 公開鍵の通知がありません + ちょうど今会いました + 1 分前に会いました + %d 分前に会いました + 1 時間前に会いました + %d 時間前に会いました + 1 日前に会いました + %d 日前に会いました + 会ったことはありません + 暗号化されたメッセージ。復号化するには OpenKeychain をインストールしてください。 + 不明な OTR フィンガープリント + OpenPGP 暗号化されたメッセージが見つかりました + 受信に失敗しました + あなたのフィンガープリント + OTR フィンガープリント + 検証 + 復号化 + 会議 + 検索 + 連絡先を作成 + 会議に参加 + 連絡先を削除 + 連絡先の詳細を表示 + 連絡先をブロック + 連絡先のブロックを解除 + 作成 + 連絡先はすでに存在します + 参加 + 会議アドレス + room@conference.example.com + ブックマークとして保存 + ブックマークを削除 + このブックマークはすでに存在します + あなた + 会議の件名を編集 + 会議が見つかりません + 退出 + 連絡先があなたを連絡先リストに追加しました + 戻りを追加 + %s はここまで読みました + 公開 + アバターをタッチしてギャラリーから画像を選択します + ご注意ください: あなたの参加アップデートを登録している人は、誰でもこの絵を見ることができます。 + 公開中… + サーバーがあなたの公開を拒否しました + 写真の変換中に、何か問題が発生しました + ディスクにアバターを保存できませんでした + (または長押しするとデフォルトに戻します) + ご利用のサーバーは、アバターの公開をサポートしていません + ささやいた + %s に + プライベートメッセージを %s に送信 + 接続 + このアカウントはすでに存在します + 次へ + 現在のセッションが確立 + 追加情報 + スキップ + 通知を無効にする + この会話の通知を無効にします + 通知を無効にしました + 有効 + 会議はパスワードが必要です + パスワードを入力してください + 連絡先からの参加アップデートがありません + 最初に連絡先から参加アップデートを要求してください。\n\nこれは、連絡先が何のクライアントを使用しているかを決めるために使用されます。 + 今すぐ要求 + フィンガープリントを削除 + このフィンガープリントを削除してもよろしいですか? + 無視 + 警告: 相互の参加アップデートなしにこれを送信すると、予期しない問題が発生する可能性があります。\n\nあなたの参加サブスクリプションを検証するために、連絡先の詳細に移動します。 + 暗号化設定 + 強制的にエンドツーエンド暗号化を使用する + 常に暗号化されたメッセージを送信します (会議を除く) + 暗号化されたメッセージを保存しない + 警告: これはメッセージの損失につながる可能性があります + 上級者オプション + ご利用は注意してください + Conversations について + ビルドおよびライセンス情報 + 消音時間 + 開始時間 + 終了時間 + 消音時間を有効にする + 消音時間の間、通知は無音になります + フォントサイズを拡大 + アプリ全体にわたって大きなフォントサイズを使用します + 送信ボタンにステータスを示す + 要求メッセージの受信 + サポートされている場合、受信したメッセージに緑色のチェックマークが付きます + 送信ボタンに連絡先ステータスを示す色が付きます + その他 + 会議名 + 会議を識別するために JID の代わりにルームのテーマを使用します + OTR フィンガープリントをクリップボードにコピーしました! + あなたはこの会議から禁止されています + この会議はメンバーのみです + あなたはこの会議からキックされました + アカウント %s を使用 + HTTP ホストの画像を確認中 + 画像ファイルは削除されました + 接続されていません。後でもう一度お試しください + 画像ファイルのサイズを確認 + メッセージオプション + テキストをコピー + 元の URL をコピー + 再送 + 画像 URL + メッセージテキスト + URL をクリップボードにコピーしました + メッセージをクリップボードにコピーしました + 画像の転送に失敗しました + QR コードをスキャン + QR コードを表示 + ブロックリストを表示 + アカウントの詳細 + OTR を検証 + リモート フィンガープリント + スキャン + (または電話をタッチ) + ソーシャリスト ミリオネア プロトコル + ヒントまたは質問 + 共有の秘密 + 確認 + 実行中 + 応答 + 失敗しました + 秘密が一致しません + 再度実行してください + 完了 + 検証しました! + 連絡先が SMP 検証を要求しました + 有効な OTR セッションが見つかりません! + Conversations + サービスをフォアグラウンドに保持 + オペレーティングシステムが接続を切断するのを防止します + ファイルの選択 + %1$s 受信中 (%2$d%% 完了) + %s のダウンロード + ファイル + %s を開く + 送信中 (%1$d%% 完了) + 転送用ファイルの準備中 + %s ダウンロード依頼中 + 転送をキャンセル + ファイル転送に失敗しました + ファイルを削除しました + ファイルを開くアプリケーションが見つかりません + フィンガープリントを検証できません + 手動で検証 + 連絡先の OTR フィンガープリントを検証してもよろしいですか? + ダイナミック タグを表示 + 連絡先の下に、読み取り専用タグを表示します + 通知を有効にする + …と会議を作成 + 会議サーバーが見つかりません + 会議の作成に失敗しました! + 会議を作成しました! + 秘密を受取ました! + リセット + アカウント アバター + OTR フィンガープリントをクリップボードにコピーしました + サーバーから履歴を取得中 + サーバーにこれ以上履歴はありません + アップデート中… + パスワードを変更しました! + パスワードを変更できません + メッセージを送信して、暗号化されたチャットを開始します + 質問をたずねる + あなたと連絡先が、(内輪の冗談や、最後に会って食べた昼食などの) 他の誰も知らない共通の秘密を持っている場合、お互いのフィンガープリントを検証するために、その秘密を使用することができます。\n\nあなたはヒントまたは質問を提供して、連絡先は大文字と小文字を区別した答えで応答します。 + 連絡先は共有の秘密であなたにチャレンジして、あなたのフィンガープリントを検証したいと思います。連絡先は秘密に対して、次のヒントまたは質問を提供しました。 + あなたのヒントは空にできません。 + あなたの共有の秘密は空にできません。 + 慎重に、連絡先のフィンガープリントと、以下に表示されるフィンガープリントを比較してください。\nこれを交換するためには、暗号化されたメールや、電話のような信頼できる形式の通信を使用することができます。 + パスワードの変更 + 現在のパスワード + 新しいパスワード + パスワードは空にできません + すべてのアカウントを有効にする + すべてのアカウントを無効にする + アクションを実行... + 所属なし + 役割なし + 追放 + メンバー + 詳細モード + メンバーシップを付与 + メンバーシップを取消 + 管理者権限を付与 + 管理者権限を取消 + 会議から削除 + %s の所属を変更できません + 会議から禁止 + 公開の会議から %s を削除しようとしています。そのための唯一の方法は、永久にそのユーザーを禁止することです。 + 今すぐ禁止 + %s の役割を変更できません + 公開アクセス可能な会議 + プライベート、メンバーのみの会議 + 会議オプション + プライベート (メンバーのみ) + 匿名でない + 会議オプションを変更しました! + 会議オプションを変更できません + なし + 30 分 + 1 時間 + 2 時間 + 8 時間 + 通知があるまで + 入力オプション + Enter は送信 + Enter キーをメッセージの送信に使用します + Enter キーを表示 + 絵文字キーを Enter キーに変更 + オーディオ + ビデオ + 画像 + PDF 文書 + Android アプリ + 連絡先 + %s を受信しました + フォアグラウンド サービスを無効にする + タッチして Conversations を開く + アバターを公開しました! + %s の送信中 + %s の依頼中 + オフラインを非表示にする + アカウントを無効にする + %s は入力中... + %s は入力を停止しました + 入力中通知 + あなたが新しいメッセージを書いている時に、連絡先に知らせます + 位置を送信 + 位置を表示 + 位置を表示するアプリケーションが見つかりません + 位置 + 位置を受信しました + + %d 連絡先を選択 + + diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index bca8d3d26..cb45b4aa5 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -422,4 +422,9 @@ %s prestal písať Upozornenia pri písaní Upozorniť kontakt, keď píšete novú správu + Poslať polohu + Zobraziť polohu + Nenašla sa aplikácia na zobrazenie polohy + Poloha + Prijatá poloha diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index 479889b77..052463c8f 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -302,8 +302,8 @@ УРЛ је копиран на клипборд Порука је копирана на клипборд Пренос слике није успео - Очитај бар-код - Прикажи бар-код + Очитај бар-кôд + Прикажи бар-кôд Прикажи списак блокираних Детаљи налога Овери ОТР @@ -427,4 +427,9 @@ Нема апликације за приказ локације Локација Примљена локација + + Изабери %d контакт + Изабери %d контакта + Изабери %d контаката + diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index 69a66808e..874de244e 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -36,10 +36,10 @@ Deltagare Besökare Vill du ta bort %s från din kontaktlista? Konversationer associerade med denna kontakt kommer inte tas bort. - Vill du blockera %s från att skicka dig meddelanden + Vill du blockera %s från att skicka dig meddelanden? Vill du avblockera %s och tillåta denne att skicka dig meddelanden? - Blockera alla kontakter från %s - Avblockera alla kontakter från %s + Blockera alla kontakter från %s? + Avblockera alla kontakter från %s? Kontakt blockerad Vill du ta bort %s som bokmärke? Konversationer associerade med detta bokmärke kommer inte tas bort. Registrera nytt konto på servern @@ -74,7 +74,7 @@ Rensa konversationshistorik Vill du ta bort alla meddelanden i denna konversation?\n\nVarning: Detta kommer inte påverka meddelanden lagrade på andra enheter eller servrar. Ta bort meddelanden - Avsluta denna konversation efter + Avsluta sedan denna konversation Välj tillgänglighet till kontakt Skicka meddelande i klartext Skicka OTR-krypterat meddelande @@ -82,9 +82,9 @@ Ditt nick har ändrats Ladda ner bild Skicka okrypterat - Avkryptering gick fel. Du kanske inte har rätt privat nyckel. + Avkryptering misslyckades. Du har kanske kanske inte rätt privat nyckel. OpenKeychain - Conversations använder en tredjeparts applikation som heter OpenKeychain för att kryptera och avkryptera meddelanden och hantera dina publika nycklar.\n\nOpenKeychain är licensierat under GPLv3 och tillgängligt på F-Droid och Google Play.\n\n(Starta om Conversations efter.) + Conversations använder en tredjeparts-applikation som heter OpenKeychain för att kryptera och avkryptera meddelanden och hantera dina publika nycklar.\n\nOpenKeychain är licensierad under GPLv3 och tillgänglig på F-Droid och Google Play.\n\n(Starta om Conversations efter installation.) Starta om Installera erbjuder… @@ -229,7 +229,7 @@ Lämna Kontakten lade till dig i sin kontaktlista Addera tillbaka - %s har läst fram hit + %s har läst hit Publicera Tryck på avatarbild för att välja en bild från bildgalleriet Notera: Alla som kan se dina tillgänglighetsuppdateringar kommer se denna bild. From b7b87e1a8d3c17f49eb9f9d5434224d38afabb24 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Wed, 1 Apr 2015 23:45:46 +0200 Subject: [PATCH 05/57] do not overlap account title and switch --- src/main/res/layout/account_row.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/res/layout/account_row.xml b/src/main/res/layout/account_row.xml index 1cd29d59c..94c591119 100644 --- a/src/main/res/layout/account_row.xml +++ b/src/main/res/layout/account_row.xml @@ -20,7 +20,10 @@ android:layout_centerVertical="true" android:layout_toRightOf="@+id/account_image" android:orientation="vertical" - android:paddingLeft="8dp" > + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:layout_toLeftOf="@+id/tgl_account_status" + android:layout_toStartOf="@+id/tgl_account_status"> Date: Fri, 3 Apr 2015 00:06:37 +0200 Subject: [PATCH 06/57] Enable end-conversation by swipe gesture Add EnhancedListView library de.timroes.android:EnhancedListView:0.3.4 to enable swipe-out for ListViews Re-enable selectableItemBackground Dont end selectedConversation on swipe Call mConversationFragment.reinit() instead. Add separate undo string for swipe MUC. Add blacklistedConversation for undo swipe Update title_undo_swipe_* strings Fix undo(), rename blacklistedConversation Fix discardUndo(); re-init selectedConversation maintain scroll position after undo clear notification when dismissing a conversation modified / simplified maintain scroll position code simplify handling of selectedConversation change undo_muc string, remove notifyDataSetChanged() --- build.gradle | 1 + .../services/XmppConnectionService.java | 1 + .../ui/ConversationActivity.java | 103 +++++++++++-- .../fragment_conversations_overview.xml | 2 +- src/main/res/layout/conversation_list_row.xml | 138 ++++++++++-------- .../fragment_conversations_overview.xml | 2 +- src/main/res/values-de/strings.xml | 2 + src/main/res/values-v21/dimens.xml | 4 + src/main/res/values/strings.xml | 3 + 9 files changed, 185 insertions(+), 71 deletions(-) create mode 100644 src/main/res/values-v21/dimens.xml diff --git a/build.gradle b/build.gradle index 8f7bb914a..cdbb5a98a 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,7 @@ dependencies { compile 'com.google.zxing:core:3.1.0' compile 'com.google.zxing:android-integration:3.1.0' compile 'de.measite.minidns:minidns:0.1.3' + compile 'de.timroes.android:EnhancedListView:0.3.4' } android { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index ca182867a..9badbbd80 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1129,6 +1129,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void archiveConversation(Conversation conversation) { + getNotificationService().clear(conversation); conversation.setStatus(Conversation.STATUS_ARCHIVED); conversation.setNextEncryption(-1); synchronized (this.conversations) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 82afda073..29308cc56 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -22,12 +22,12 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.CheckBox; -import android.widget.ListView; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; import android.widget.Toast; import net.java.otr4j.session.SessionStatus; +import de.timroes.android.listview.EnhancedListView; import java.util.ArrayList; import java.util.List; @@ -76,8 +76,9 @@ public class ConversationActivity extends XmppActivity private View mContentView; private List conversationList = new ArrayList<>(); + private Conversation swipedConversation = null; private Conversation mSelectedConversation = null; - private ListView listView; + private EnhancedListView listView; private ConversationFragment mConversationFragment; private ArrayAdapter listAdapter; @@ -156,7 +157,7 @@ public class ConversationActivity extends XmppActivity transaction.replace(R.id.selected_conversation, this.mConversationFragment, "conversation"); transaction.commit(); - listView = (ListView) findViewById(R.id.list); + listView = (EnhancedListView) findViewById(R.id.list); this.listAdapter = new ConversationAdapter(this, conversationList); listView.setAdapter(this.listAdapter); @@ -178,6 +179,73 @@ public class ConversationActivity extends XmppActivity openConversation(); } }); + + listView.setDismissCallback(new EnhancedListView.OnDismissCallback() { + + @Override + public EnhancedListView.Undoable onDismiss(final EnhancedListView enhancedListView, final int position) { + + final int index = listView.getFirstVisiblePosition(); + View v = listView.getChildAt(0); + final int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop()); + + swipedConversation = listAdapter.getItem(position); + listAdapter.remove(swipedConversation); + swipedConversation.markRead(); + xmppConnectionService.getNotificationService().clear(swipedConversation); + + final boolean formerlySelected = (getSelectedConversation() == swipedConversation); + if (position == 0 && listAdapter.getCount() == 0) { + endConversation(swipedConversation, false, true); + return null; + } else if (formerlySelected) { + setSelectedConversation(listAdapter.getItem(0)); + ConversationActivity.this.mConversationFragment + .reInit(getSelectedConversation()); + } + + return new EnhancedListView.Undoable() { + + @Override + public void undo() { + listAdapter.insert(swipedConversation, position); + if (formerlySelected) { + setSelectedConversation(swipedConversation); + ConversationActivity.this.mConversationFragment + .reInit(getSelectedConversation()); + } + swipedConversation = null; + listView.setSelectionFromTop(index + (listView.getChildCount() < position ? 1 : 0), top); + } + + @Override + public void discard() { + if (!swipedConversation.isRead() + && swipedConversation.getMode() == Conversation.MODE_SINGLE) { + swipedConversation = null; + return; + } + endConversation(swipedConversation, false, false); + swipedConversation = null; + } + + @Override + public String getTitle() { + if (swipedConversation.getMode() == Conversation.MODE_MULTI) { + return getResources().getString(R.string.title_undo_swipe_out_muc); + } else { + return getResources().getString(R.string.title_undo_swipe_out_conversation); + } + } + }; + } + }); + listView.enableSwipeToDismiss(); + listView.setSwipingLayout(R.id.swipeable_item); + listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP); + listView.setUndoHideDelay(3000); + listView.setRequireTouchBeforeDismiss(false); + mContentView = findViewById(R.id.content_view_spl); if (mContentView == null) { mContentView = findViewById(R.id.content_view_ll); @@ -204,6 +272,7 @@ public class ConversationActivity extends XmppActivity @Override public void onPanelClosed(View arg0) { + listView.discardUndo(); openConversation(); } @@ -485,13 +554,21 @@ public class ConversationActivity extends XmppActivity } public void endConversation(Conversation conversation) { - showConversationsOverview(); + endConversation(conversation, true, true); + } + + public void endConversation(Conversation conversation, boolean showOverview, boolean reinit) { + if (showOverview) { + showConversationsOverview(); + } xmppConnectionService.archiveConversation(conversation); - if (conversationList.size() > 0) { - setSelectedConversation(conversationList.get(0)); - this.mConversationFragment.reInit(getSelectedConversation()); - } else { - setSelectedConversation(null); + if (reinit) { + if (conversationList.size() > 0) { + setSelectedConversation(conversationList.get(0)); + this.mConversationFragment.reInit(getSelectedConversation()); + } else { + setSelectedConversation(null); + } } } @@ -744,6 +821,7 @@ public class ConversationActivity extends XmppActivity @Override public void onPause() { + listView.discardUndo(); super.onPause(); this.mActivityPaused = true; if (this.xmppConnectionServiceBound) { @@ -1013,6 +1091,13 @@ public class ConversationActivity extends XmppActivity public void updateConversationList() { xmppConnectionService .populateWithOrderedConversations(conversationList); + if (swipedConversation != null) { + if (swipedConversation.isRead()) { + conversationList.remove(swipedConversation); + } else { + listView.discardUndo(); + } + } listAdapter.notifyDataSetChanged(); } diff --git a/src/main/res/layout-w960dp/fragment_conversations_overview.xml b/src/main/res/layout-w960dp/fragment_conversations_overview.xml index 2744f38ef..50039c03a 100644 --- a/src/main/res/layout-w960dp/fragment_conversations_overview.xml +++ b/src/main/res/layout-w960dp/fragment_conversations_overview.xml @@ -12,7 +12,7 @@ android:background="@color/primarybackground" android:orientation="vertical" > - + - + - + - + - + - + - - + - - + - \ No newline at end of file + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/fragment_conversations_overview.xml b/src/main/res/layout/fragment_conversations_overview.xml index 695700288..24c653ae6 100644 --- a/src/main/res/layout/fragment_conversations_overview.xml +++ b/src/main/res/layout/fragment_conversations_overview.xml @@ -10,7 +10,7 @@ android:background="@color/primarybackground" android:orientation="vertical" > - Keine App für die Standort-Anzeige gefunden Standort Standort empfangen + Unterhaltung beendet + Konferenz verlassen %d Kontakt ausgewählt %d Kontakte ausgewählt diff --git a/src/main/res/values-v21/dimens.xml b/src/main/res/values-v21/dimens.xml new file mode 100644 index 000000000..8bc8f3f7b --- /dev/null +++ b/src/main/res/values-v21/dimens.xml @@ -0,0 +1,4 @@ + + + 63dp + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index af56c0146..50e9d9e43 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -296,6 +296,7 @@ \n\nhttps://developer.android.com/tools/support-library\n(Apache License, Version 2.0) \n\nhttps://github.com/zxing/zxing\n(Apache License, Version 2.0) \n\nhttps://github.com/google/material-design-icons\n(CC BY 4.0) + \n\nhttps://github.com/timroes/EnhancedListView\n(Apache License, Version 2.0) Quiet Hours Start time @@ -454,6 +455,8 @@ No application found to display location Location Received location + Conversation closed + Left conference Select %d contact Select %d contacts From 332fe0fd194a80501cf935f22faed645f3032b57 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Thu, 9 Apr 2015 12:46:54 +0200 Subject: [PATCH 07/57] don't resume old session when changing resource --- .../eu/siacs/conversations/entities/Account.java | 14 ++++++++++---- .../conversations/generator/PresenceGenerator.java | 7 +++++++ .../services/XmppConnectionService.java | 5 +++++ .../siacs/conversations/ui/SettingsActivity.java | 12 +++++++++--- .../siacs/conversations/xmpp/XmppConnection.java | 4 ++++ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 2bc2c9540..fe1030945 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -229,11 +229,17 @@ public class Account extends AbstractEntity { return jid.getResourcepart(); } - public void setResource(final String resource) { - try { - jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource); - } catch (final InvalidJidException ignored) { + public boolean setResource(final String resource) { + final String oldResource = jid.getResourcepart(); + if (oldResource == null || !oldResource.equals(resource)) { + try { + jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource); + return true; + } catch (final InvalidJidException ignored) { + return true; + } } + return false; } public Jid getJid() { diff --git a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java index 1e8967244..526005f33 100644 --- a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java @@ -54,4 +54,11 @@ public class PresenceGenerator extends AbstractGenerator { } return packet; } + + public PresencePacket sendOfflinePresence(Account account) { + PresencePacket packet = new PresencePacket(); + packet.setFrom(account.getJid()); + packet.setAttribute("type","unavailable"); + return packet; + } } \ No newline at end of file diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 9badbbd80..669ad62cf 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1701,6 +1701,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } } + sendOfflinePresence(account); } account.getXmppConnection().disconnect(force); } @@ -2261,6 +2262,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa sendPresencePacket(account, mPresenceGenerator.sendPresence(account)); } + public void sendOfflinePresence(final Account account) { + sendPresencePacket(account, mPresenceGenerator.sendOfflinePresence(account)); + } + public MessageGenerator getMessageGenerator() { return this.mMessageGenerator; } diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index 39e215f2b..e3cb2ee79 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.Locale; import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.xmpp.XmppConnection; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; @@ -63,9 +64,14 @@ public class SettingsActivity extends XmppActivity implements .toLowerCase(Locale.US); if (xmppConnectionServiceBound) { for (Account account : xmppConnectionService.getAccounts()) { - account.setResource(resource); - if (!account.isOptionSet(Account.OPTION_DISABLED)) { - xmppConnectionService.reconnectAccountInBackground(account); + if (account.setResource(resource)) { + if (!account.isOptionSet(Account.OPTION_DISABLED)) { + XmppConnection connection = account.getXmppConnection(); + if (connection != null) { + connection.resetStreamId(); + } + xmppConnectionService.reconnectAccountInBackground(account); + } } } } diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 48dc2150d..25db8ecca 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -981,6 +981,10 @@ public class XmppConnection implements Runnable { } } + public void resetStreamId() { + this.streamId = null; + } + public List findDiscoItemsByFeature(final String feature) { final List items = new ArrayList<>(); for (final Entry> cursor : disco.entrySet()) { From 37d08276a866aa943bfb6022732618e9fc37653b Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Sat, 11 Apr 2015 14:53:10 +0200 Subject: [PATCH 08/57] allow sharing multiple images at once. fixes #1090 --- src/main/AndroidManifest.xml | 7 ++ .../ui/ConversationActivity.java | 109 +++++++++++------- .../conversations/ui/ShareWithActivity.java | 54 ++++++--- 3 files changed, 111 insertions(+), 59 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index e4e91d801..9fe370171 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -122,6 +122,13 @@ + + + + + + + mPendingImageUris = new ArrayList<>(); + final private List mPendingFileUris = new ArrayList<>(); private Uri mPendingGeoUri = null; private View mContentView; @@ -141,13 +143,14 @@ public class ConversationActivity extends XmppActivity @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (savedInstanceState != null) {mOpenConverstaion = savedInstanceState.getString( - STATE_OPEN_CONVERSATION, null); - mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true); - String pending = savedInstanceState.getString(STATE_PENDING_URI, null); - if (pending != null) { - mPendingImageUri = Uri.parse(pending); - } + if (savedInstanceState != null) { + mOpenConverstaion = savedInstanceState.getString(STATE_OPEN_CONVERSATION, null); + mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true); + String pending = savedInstanceState.getString(STATE_PENDING_URI, null); + if (pending != null) { + mPendingImageUris.clear(); + mPendingImageUris.add(Uri.parse(pending)); + } } setContentView(R.layout.fragment_conversations_overview); @@ -409,13 +412,18 @@ public class ConversationActivity extends XmppActivity switch (attachmentChoice) { case ATTACHMENT_CHOICE_CHOOSE_IMAGE: intent.setAction(Intent.ACTION_GET_CONTENT); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true); + } intent.setType("image/*"); chooser = true; break; case ATTACHMENT_CHOICE_TAKE_PHOTO: - mPendingImageUri = xmppConnectionService.getFileBackend().getTakePhotoUri(); + Uri uri = xmppConnectionService.getFileBackend().getTakePhotoUri(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); - intent.putExtra(MediaStore.EXTRA_OUTPUT, mPendingImageUri); + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); + mPendingImageUris.clear(); + mPendingImageUris.add(uri); break; case ATTACHMENT_CHOICE_CHOOSE_FILE: chooser = true; @@ -857,8 +865,8 @@ public class ConversationActivity extends XmppActivity } savedInstanceState.putBoolean(STATE_PANEL_OPEN, isConversationsOverviewVisable()); - if (this.mPendingImageUri != null) { - savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUri.toString()); + if (this.mPendingImageUris.size() >= 1) { + savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUris.get(0).toString()); } super.onSaveInstanceState(savedInstanceState); } @@ -897,21 +905,23 @@ public class ConversationActivity extends XmppActivity this.mConversationFragment.reInit(getSelectedConversation()); } else { showConversationsOverview(); - mPendingImageUri = null; - mPendingFileUri = null; + mPendingImageUris.clear(); + mPendingFileUris.clear(); mPendingGeoUri = null; setSelectedConversation(conversationList.get(0)); this.mConversationFragment.reInit(getSelectedConversation()); } - if (mPendingImageUri != null) { - attachImageToConversation(getSelectedConversation(),mPendingImageUri); - mPendingImageUri = null; - } else if (mPendingFileUri != null) { - attachFileToConversation(getSelectedConversation(),mPendingFileUri); - mPendingFileUri = null; - } else if (mPendingGeoUri != null) { - attachLocationToConversation(getSelectedConversation(),mPendingGeoUri); + for(Iterator i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) { + attachImageToConversation(getSelectedConversation(),i.next()); + } + + for(Iterator i = mPendingFileUris.iterator(); i.hasNext(); i.remove()) { + attachFileToConversation(getSelectedConversation(),i.next()); + } + + if (mPendingGeoUri != null) { + attachLocationToConversation(getSelectedConversation(), mPendingGeoUri); mPendingGeoUri = null; } ExceptionHelper.checkForCrash(this, this.xmppConnectionService); @@ -963,6 +973,20 @@ public class ConversationActivity extends XmppActivity xmppConnectionService.getNotificationService().setOpenConversation(null); } + private static List extractUriFromIntent(final Intent intent) { + List uris = new ArrayList<>(); + Uri uri = intent.getData(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && uri == null) { + ClipData clipData = intent.getClipData(); + for(int i = 0; i < clipData.getItemCount(); ++i) { + uris.add(clipData.getItemAt(i).getUri()); + } + } else { + uris.add(uri); + } + return uris; + } + @Override protected void onActivityResult(int requestCode, int resultCode, final Intent data) { @@ -972,25 +996,34 @@ public class ConversationActivity extends XmppActivity mConversationFragment.hideSnackbar(); mConversationFragment.updateMessages(); } else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_IMAGE) { - mPendingImageUri = data.getData(); + mPendingImageUris.clear(); + mPendingImageUris.addAll(extractUriFromIntent(data)); if (xmppConnectionServiceBound) { - attachImageToConversation(getSelectedConversation(),mPendingImageUri); - mPendingImageUri = null; + for(Iterator i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) { + attachImageToConversation(getSelectedConversation(),i.next()); + } } } else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_FILE || requestCode == ATTACHMENT_CHOICE_RECORD_VOICE) { - mPendingFileUri = data.getData(); + mPendingFileUris.clear(); + mPendingFileUris.addAll(extractUriFromIntent(data)); if (xmppConnectionServiceBound) { - attachFileToConversation(getSelectedConversation(),mPendingFileUri); - mPendingFileUri = null; + for(Iterator i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) { + attachFileToConversation(getSelectedConversation(), i.next()); + } } - } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO && mPendingImageUri != null) { - if (xmppConnectionServiceBound) { - attachImageToConversation(getSelectedConversation(),mPendingImageUri); - mPendingImageUri = null; + } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) { + if (mPendingImageUris.size() == 1) { + Uri uri = mPendingImageUris.get(0); + if (xmppConnectionServiceBound) { + attachImageToConversation(getSelectedConversation(), uri); + mPendingImageUris.clear(); + } + Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + intent.setData(uri); + sendBroadcast(intent); + } else { + mPendingImageUris.clear(); } - Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); - intent.setData(mPendingImageUri); - sendBroadcast(intent); } else if (requestCode == ATTACHMENT_CHOICE_LOCATION) { double latitude = data.getDoubleExtra("latitude",0); double longitude = data.getDoubleExtra("longitude",0); @@ -1000,10 +1033,6 @@ public class ConversationActivity extends XmppActivity this.mPendingGeoUri = null; } } - } else { - if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) { - mPendingImageUri = null; - } } } diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java index 6be238dca..200a577e7 100644 --- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java @@ -18,6 +18,7 @@ import java.net.URLConnection; import java.net.URLDecoder; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import eu.siacs.conversations.Config; @@ -32,7 +33,7 @@ import eu.siacs.conversations.xmpp.jid.Jid; public class ShareWithActivity extends XmppActivity { private class Share { - public Uri uri; + public List uris = new ArrayList<>(); public boolean image; public String account; public String contact; @@ -104,7 +105,7 @@ public class ShareWithActivity extends XmppActivity { int position, long arg3) { Conversation conversation = mConversations.get(position); if (conversation.getMode() == Conversation.MODE_SINGLE - || share.uri == null) { + || share.uris.size() == 0) { share(mConversations.get(position)); } } @@ -133,18 +134,32 @@ public class ShareWithActivity extends XmppActivity { @Override public void onStart() { - final String type = getIntent().getType(); - final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); - if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) { - this.share.uri = uri; - this.share.image = type.startsWith("image/") || isImage(uri); - } else { - this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT); + super.onStart(); + Intent intent = getIntent(); + if (intent == null) { + return; + } + final String type = intent.getType(); + if (Intent.ACTION_SEND.equals(intent.getAction())) { + final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); + if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) { + this.share.uris.add(uri); + this.share.image = type.startsWith("image/") || isImage(uri); + } else { + this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT); + } + } else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { + this.share.image = type != null && type.startsWith("image/"); + if (!this.share.image) { + return; + } + + this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); } if (xmppConnectionServiceBound) { - xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uri == null); + xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.image); } - super.onStart(); + } protected boolean isImage(Uri uri) { @@ -164,7 +179,7 @@ public class ShareWithActivity extends XmppActivity { return; } xmppConnectionService.populateWithOrderedConversations(mConversations, - this.share != null && this.share.uri == null); + this.share != null && this.share.uris.size() == 0); } private void share() { @@ -188,7 +203,7 @@ public class ShareWithActivity extends XmppActivity { } private void share(final Conversation conversation) { - if (share.uri != null) { + if (share.uris.size() != 0) { selectPresence(conversation, new OnPresenceSelected() { @Override public void onPresenceSelected() { @@ -196,22 +211,23 @@ public class ShareWithActivity extends XmppActivity { Toast.makeText(getApplicationContext(), getText(R.string.preparing_image), Toast.LENGTH_LONG).show(); - ShareWithActivity.this.xmppConnectionService - .attachImageToConversation(conversation, share.uri, - attachFileCallback); + for (Iterator i = share.uris.iterator(); i.hasNext(); i.remove()) { + ShareWithActivity.this.xmppConnectionService + .attachImageToConversation(conversation, i.next(), + attachFileCallback); + } } else { Toast.makeText(getApplicationContext(), getText(R.string.preparing_file), Toast.LENGTH_LONG).show(); ShareWithActivity.this.xmppConnectionService - .attachFileToConversation(conversation, share.uri, - attachFileCallback); + .attachFileToConversation(conversation, share.uris.get(0), + attachFileCallback); } switchToConversation(conversation, null, true); finish(); } }); - } else { switchToConversation(conversation, this.share.text, true); finish(); From 878066ca99c1170479fb217d68ecdb9cf5498975 Mon Sep 17 00:00:00 2001 From: BrianBlade Date: Thu, 2 Apr 2015 13:35:42 +0200 Subject: [PATCH 09/57] Add option to use MTM without default TrustManager Add a new "Don't trust system CAs" preference under advanced options that will change the behaviour of the MemorizingTrustManager. All formerly unknown certificates will raise a warning if checked. --- .../services/XmppConnectionService.java | 19 ++++++++++++++++--- .../conversations/ui/SettingsActivity.java | 3 ++- src/main/res/values-de/strings.xml | 2 ++ src/main/res/values/strings.xml | 2 ++ src/main/res/xml/preferences.xml | 5 +++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index ca182867a..f94e715eb 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -532,9 +532,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa ExceptionHelper.init(getApplicationContext()); PRNGFixes.apply(); this.mRandom = new SecureRandom(); - this.mMemorizingTrustManager = new MemorizingTrustManager( - getApplicationContext()); - + updateMemorizingTrustmanager(); final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; this.mBitmapCache = new LruCache(cacheSize) { @@ -2185,6 +2183,21 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa return this.mMemorizingTrustManager; } + public void setMemorizingTrustManager(MemorizingTrustManager trustManager) { + this.mMemorizingTrustManager = trustManager; + } + + public void updateMemorizingTrustmanager() { + final MemorizingTrustManager tm; + final boolean dontTrustSystemCAs = getPreferences().getBoolean("dont_trust_system_cas", false); + if (dontTrustSystemCAs) { + tm = new MemorizingTrustManager(getApplicationContext(), null); + } else { + tm = new MemorizingTrustManager(getApplicationContext()); + } + setMemorizingTrustManager(tm); + } + public PowerManager getPowerManager() { return this.pm; } diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index 39e215f2b..1bc59b138 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -79,7 +79,8 @@ public class SettingsActivity extends XmppActivity implements } } } + } else if (name.equals("dont_trust_system_cas")) { + xmppConnectionService.updateMemorizingTrustmanager(); } } - } diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 0dd9f4011..d5533061b 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -427,6 +427,8 @@ Keine App für die Standort-Anzeige gefunden Standort Standort empfangen + Misstraue Zertifizierungsstellen + Alle Zertifikate müssen manuell bestätigt werden %d Kontakt ausgewählt %d Kontakte ausgewählt diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index af56c0146..28bb71e95 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -454,6 +454,8 @@ No application found to display location Location Received location + Don\'t trust system CAs + All certificates must be manually approved Select %d contact Select %d contacts diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 8bf6eb877..d48124a60 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -147,6 +147,11 @@ android:key="keep_foreground_service" android:title="@string/pref_keep_foreground_service" android:summary="@string/pref_keep_foreground_service_summary" /> + From 845b39cdcc4d20d916bdee5b661c31a19f6cbdac Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Mon, 13 Apr 2015 15:59:18 +0200 Subject: [PATCH 10/57] fixed regression where the selected conversation wasn't highlighted anymore on tabled layout --- .../eu/siacs/conversations/ui/XmppActivity.java | 8 +++++++- .../ui/adapter/ConversationAdapter.java | 15 ++++----------- src/main/res/layout/conversation_list_row.xml | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java index 7eaec10c1..392e57a70 100644 --- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java @@ -90,6 +90,7 @@ public abstract class XmppActivity extends Activity { protected int mPrimaryTextColor; protected int mSecondaryTextColor; + protected int mPrimaryBackgroundColor; protected int mSecondaryBackgroundColor; protected int mColorRed; protected int mColorOrange; @@ -331,6 +332,7 @@ public abstract class XmppActivity extends Activity { mColorOrange = getResources().getColor(R.color.orange); mColorGreen = getResources().getColor(R.color.green); mPrimaryColor = getResources().getColor(R.color.primary); + mPrimaryBackgroundColor = getResources().getColor(R.color.primarybackground); mSecondaryBackgroundColor = getResources().getColor(R.color.secondarybackground); this.mTheme = findTheme(); setTheme(this.mTheme); @@ -740,7 +742,11 @@ public abstract class XmppActivity extends Activity { public int getOnlineColor() { return this.mColorGreen; } - + + public int getPrimaryBackgroundColor() { + return this.mPrimaryBackgroundColor; + } + public int getSecondaryBackgroundColor() { return this.mSecondaryBackgroundColor; } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index a48f6ae43..d5b7e4c05 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java @@ -46,17 +46,10 @@ public class ConversationAdapter extends ArrayAdapter { } Conversation conversation = getItem(position); if (this.activity instanceof ConversationActivity) { - ConversationActivity activity = (ConversationActivity) this.activity; - if (!activity.isConversationsOverviewHideable()) { - if (conversation == activity.getSelectedConversation()) { - view.setBackgroundColor(activity - .getSecondaryBackgroundColor()); - } else { - view.setBackgroundColor(Color.TRANSPARENT); - } - } else { - view.setBackgroundColor(Color.TRANSPARENT); - } + View swipeableItem = view.findViewById(R.id.swipeable_item); + ConversationActivity a = (ConversationActivity) this.activity; + int c = !a.isConversationsOverviewHideable() && conversation == a.getSelectedConversation() ? a.getSecondaryBackgroundColor() : a.getPrimaryBackgroundColor(); + swipeableItem.setBackgroundColor(c); } TextView convName = (TextView) view.findViewById(R.id.conversation_name); if (conversation.getMode() == Conversation.MODE_SINGLE || activity.useSubjectToIdentifyConference()) { diff --git a/src/main/res/layout/conversation_list_row.xml b/src/main/res/layout/conversation_list_row.xml index de04780fe..69abb2256 100644 --- a/src/main/res/layout/conversation_list_row.xml +++ b/src/main/res/layout/conversation_list_row.xml @@ -6,7 +6,7 @@ + android:background="@color/primary"/> Date: Mon, 13 Apr 2015 16:00:04 +0200 Subject: [PATCH 11/57] Maintain private chat on MUC. fixes #1097 --- .../java/eu/siacs/conversations/ui/ConversationFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index d5f20e417..a3a02b277 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -268,7 +268,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa if (conversation.getNextCounterpart() != null) { message.setCounterpart(conversation.getNextCounterpart()); message.setType(Message.TYPE_PRIVATE); - conversation.setNextCounterpart(null); } } if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_OTR) { From 6da77bdf3b38fab3daa0de8776082038d8d62a78 Mon Sep 17 00:00:00 2001 From: lookshe Date: Mon, 13 Apr 2015 10:57:30 +0200 Subject: [PATCH 12/57] Bugfix for issue #1121 check with lowercase to also match JPEG, JPeg ... changed image url in comment --- .../siacs/conversations/entities/Message.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 8015eeadb..21aa7779e 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -430,23 +430,31 @@ public class Message extends AbstractEntity { } public boolean bodyContainsDownloadable() { + /** + * there are a few cases where spaces result in an unwanted behavior, e.g. + * "http://example.com/image.jpg" text that will not be shown /abc.png" + * or more than one image link in one message. + */ + if (body.contains(" ")) { + return false; + } try { - URL url = new URL(this.getBody()); + URL url = new URL(body); if (!url.getProtocol().equalsIgnoreCase("http") && !url.getProtocol().equalsIgnoreCase("https")) { return false; } - if (url.getPath() == null) { + + String sUrlPath = url.getPath(); + if (sUrlPath == null || sUrlPath.isEmpty()) { return false; } - String[] pathParts = url.getPath().split("/"); - String filename; - if (pathParts.length > 0) { - filename = pathParts[pathParts.length - 1].toLowerCase(); - } else { - return false; - } - String[] extensionParts = filename.split("\\."); + + int iSlashIndex = sUrlPath.lastIndexOf('/') + 1; + + String sLastUrlPath = sUrlPath.substring(iSlashIndex).toLowerCase(); + + String[] extensionParts = sLastUrlPath.split("\\."); if (extensionParts.length == 2 && Arrays.asList(Downloadable.VALID_IMAGE_EXTENSIONS).contains( extensionParts[extensionParts.length - 1])) { From 4bf09bc10b05844f2d1407b1ff72080cc6acb72b Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Mon, 13 Apr 2015 17:35:20 +0200 Subject: [PATCH 13/57] shut up linter --- .../java/eu/siacs/conversations/ui/ConversationActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 9533ffc7e..c8a1e6df0 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -973,6 +973,7 @@ public class ConversationActivity extends XmppActivity xmppConnectionService.getNotificationService().setOpenConversation(null); } + @SuppressLint("NewApi") private static List extractUriFromIntent(final Intent intent) { List uris = new ArrayList<>(); Uri uri = intent.getData(); From 62faa163f0d5fc2d8d53067cc328f1905d1df370 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Mon, 13 Apr 2015 18:18:25 +0200 Subject: [PATCH 14/57] fixed typos --- src/main/java/eu/siacs/conversations/entities/Message.java | 2 +- src/main/java/eu/siacs/conversations/utils/GeoHelper.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 21aa7779e..7ea3d60b0 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -432,7 +432,7 @@ public class Message extends AbstractEntity { public boolean bodyContainsDownloadable() { /** * there are a few cases where spaces result in an unwanted behavior, e.g. - * "http://example.com/image.jpg" text that will not be shown /abc.png" + * "http://example.com/image.jpg text that will not be shown /abc.png" * or more than one image link in one message. */ if (body.contains(" ")) { diff --git a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java index f7dda936f..b31b90182 100644 --- a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java @@ -20,7 +20,7 @@ public class GeoHelper { } public static ArrayList createGeoIntentsFromMessage(Message message) { - final ArrayList intents = new ArrayList(); + final ArrayList intents = new ArrayList<>(); Matcher matcher = GEO_URI.matcher(message.getBody()); if (!matcher.matches()) { return intents; From 2f24b093093296ca6f4f90fbcf664b050a8b03fc Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Mon, 13 Apr 2015 18:19:40 +0200 Subject: [PATCH 15/57] fixed disable account when sliding and not clicking the toggle --- .../conversations/ui/ManageAccountActivity.java | 4 ++-- .../conversations/ui/adapter/AccountAdapter.java | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java index c7db94af6..56dbc55e0 100644 --- a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java @@ -168,8 +168,8 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda } } - public void onClickTglAccountState(Account account) { - if (account.isOptionSet(Account.OPTION_DISABLED)) { + public void onClickTglAccountState(Account account, boolean enable) { + if (enable) { enableAccount(account); } else { disableAccount(account); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java index 5209aa124..95c0524d0 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java @@ -11,6 +11,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Switch; @@ -51,14 +52,14 @@ public class AccountAdapter extends ArrayAdapter { break; } final Switch tglAccountState = (Switch) view.findViewById(R.id.tgl_account_status); - boolean isDisabled = (account.getStatus() == Account.State.DISABLED) ? true : false; + final boolean isDisabled = (account.getStatus() == Account.State.DISABLED) ? true : false; + tglAccountState.setOnCheckedChangeListener(null); tglAccountState.setChecked(!isDisabled); - tglAccountState.setOnClickListener(new View.OnClickListener() { + tglAccountState.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override - public void onClick(View v) { - if (activity instanceof ManageAccountActivity) { - ((ManageAccountActivity) activity).onClickTglAccountState(account); - tglAccountState.toggle(); + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if (b == isDisabled && activity instanceof ManageAccountActivity) { + ((ManageAccountActivity) activity).onClickTglAccountState(account,b); } } }); From 261b505f066b90ef346c529afea50f8285ddfd7d Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Tue, 14 Apr 2015 15:00:49 +0200 Subject: [PATCH 16/57] always show save button when account info was modified. fixes #918 --- .../conversations/ui/EditAccountActivity.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index 27dfc4922..dbad9e00e 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -67,7 +67,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate @Override public void onClick(final View v) { - if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED) { + if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !accountInfoEdited()) { mAccount.setOption(Account.OPTION_DISABLED, false); xmppConnectionService.updateAccount(mAccount); return; @@ -237,7 +237,11 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } protected void updateSaveButton() { - if (mAccount != null && (mAccount.getStatus() == Account.State.CONNECTING || mFetchingAvatar)) { + if (accountInfoEdited() && jidToEdit != null) { + this.mSaveButton.setText(R.string.save); + this.mSaveButton.setEnabled(true); + this.mSaveButton.setTextColor(getPrimaryTextColor()); + } else if (mAccount != null && (mAccount.getStatus() == Account.State.CONNECTING || mFetchingAvatar)) { this.mSaveButton.setEnabled(false); this.mSaveButton.setTextColor(getSecondaryTextColor()); this.mSaveButton.setText(R.string.account_status_connecting); @@ -265,9 +269,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } protected boolean accountInfoEdited() { - return (!this.mAccount.getJid().toBareJid().toString().equals( - this.mAccountJid.getText().toString())) - || (!this.mAccount.getPassword().equals( + return this.mAccount != null && (!this.mAccount.getJid().toBareJid().toString().equals( + this.mAccountJid.getText().toString()) + || !this.mAccount.getPassword().equals( this.mPassword.getText().toString())); } From f99e234b886d043968267323ccb4995f20ee4fa4 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Tue, 14 Apr 2015 15:53:50 +0200 Subject: [PATCH 17/57] maintain state when rotating settings activity --- .../conversations/ui/SettingsActivity.java | 30 ++++++++++--------- src/main/res/xml/preferences.xml | 14 ++++++--- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index d24cb52b3..f91bc9536 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -7,6 +7,8 @@ import java.util.Locale; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.xmpp.XmppConnection; +import android.app.Fragment; +import android.app.FragmentManager; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Build; @@ -21,9 +23,12 @@ public class SettingsActivity extends XmppActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mSettingsFragment = new SettingsFragment(); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, mSettingsFragment).commit(); + FragmentManager fm = getFragmentManager(); + mSettingsFragment = (SettingsFragment) fm.findFragmentById(android.R.id.content); + if (mSettingsFragment == null || !mSettingsFragment.getClass().equals(SettingsFragment.class)) { + mSettingsFragment = new SettingsFragment(); + fm.beginTransaction().replace(android.R.id.content, mSettingsFragment).commit(); + } } @Override @@ -34,18 +39,15 @@ public class SettingsActivity extends XmppActivity implements @Override public void onStart() { super.onStart(); - PreferenceManager.getDefaultSharedPreferences(this) - .registerOnSharedPreferenceChangeListener(this); - ListPreference resources = (ListPreference) mSettingsFragment - .findPreference("resource"); + PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); + ListPreference resources = (ListPreference) mSettingsFragment.findPreference("resource"); if (resources != null) { - ArrayList entries = new ArrayList( - 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()])); + ArrayList entries = new ArrayList<>(Arrays.asList(resources.getEntries())); + if (!entries.contains(Build.MODEL)) { + entries.add(0, Build.MODEL); + resources.setEntries(entries.toArray(new CharSequence[entries.size()])); + resources.setEntryValues(entries.toArray(new CharSequence[entries.size()])); + } } } diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index d48124a60..9cf0100f3 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -36,7 +36,9 @@ android:title="@string/pref_chat_states" /> - + + android:title="@string/title_pref_quiet_hours" + android:key="quiet_hours"> - + + android:title="@string/pref_expert_options" + android:key="expert"> Date: Wed, 15 Apr 2015 15:36:16 +0200 Subject: [PATCH 18/57] some bug fixes concerning 0byte files. fixes #1126 --- .../eu/siacs/conversations/xmpp/jingle/JingleConnection.java | 2 +- .../siacs/conversations/xmpp/jingle/JingleInbandTransport.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index 2d949e21e..68eadbc66 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -317,7 +317,7 @@ public class JingleConnection implements Downloadable { message.setBody(Long.toString(size)); conversation.add(message); mXmppConnectionService.updateConversationUi(); - if (size <= this.mJingleConnectionManager + if (size < this.mJingleConnectionManager .getAutoAcceptFileSize()) { Log.d(Config.LOGTAG, "auto accepting file from " + packet.getFrom()); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java index 174f70faa..3677bf4f9 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java @@ -207,6 +207,7 @@ public class JingleInbandTransport extends JingleTransport { if (!established) { established = true; connected = true; + this.receiveNextBlock(""); this.account.getXmppConnection().sendIqPacket( packet.generateResponse(IqPacket.TYPE.RESULT), null); } else { From 584ffbd0009ec57bcbe413857e3d16ff10f376de Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Wed, 15 Apr 2015 16:28:44 +0200 Subject: [PATCH 19/57] bumped version to 1.3.0-alpha --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index cdbb5a98a..1664fa575 100644 --- a/build.gradle +++ b/build.gradle @@ -44,8 +44,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 21 - versionCode 56 - versionName "1.2.0" + versionCode 57 + versionName "1.3.0-alpha" } compileOptions { From c4daa08170f0e468c0407d9db91a0de0415b6bf2 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Thu, 16 Apr 2015 21:55:52 +0200 Subject: [PATCH 20/57] fixed a bug in DNS helper code. fixes #1130 --- src/main/java/eu/siacs/conversations/utils/DNSHelper.java | 2 +- src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java index bcb2ca442..42dd1c95c 100644 --- a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java @@ -121,7 +121,7 @@ public class DNSHelper { while (p > 0) { p -= s.get(i++).getPriority(); } - i--; + if (i>0) i--; // remove is expensive, but we have only a few entries // anyway SRV srv = s.remove(i); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 25db8ecca..1351226ba 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -204,7 +204,7 @@ public class XmppConnection implements Runnable { && "nosrv".equals(result.getString("error", null))) { socket = new Socket(account.getServer().getDomainpart(), 5222); } else { - throw new IOException("timeout in dns"); + throw new IOException("unhandled exception in DNS resolver"); } final OutputStream out = socket.getOutputStream(); tagWriter.setOutputStream(out); From 570a22206dd1588ac2bff0e950a48befa0daef82 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Fri, 17 Apr 2015 20:01:09 +0200 Subject: [PATCH 21/57] increased undo delay --- .../java/eu/siacs/conversations/ui/ConversationActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index c8a1e6df0..a44311b44 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -246,7 +246,7 @@ public class ConversationActivity extends XmppActivity listView.enableSwipeToDismiss(); listView.setSwipingLayout(R.id.swipeable_item); listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP); - listView.setUndoHideDelay(3000); + listView.setUndoHideDelay(8000); listView.setRequireTouchBeforeDismiss(false); mContentView = findViewById(R.id.content_view_spl); From da367dd752b6c92a3d0dbc558c80ebc71ef7b1fe Mon Sep 17 00:00:00 2001 From: BrianBlade Date: Sun, 19 Apr 2015 18:08:13 +0200 Subject: [PATCH 22/57] Add option to remove manually approved certificates - "Remove certificates" option brings up a dialog that allows to delete certificates from MemorizingTrustManager's keystore - Reconnect active accounts when certificate-settings are changed - new preference category "Certificate options" --- .../conversations/ui/SettingsActivity.java | 91 +++++++++++++++++++ src/main/res/values-de/strings.xml | 11 +++ src/main/res/values/strings.xml | 11 +++ src/main/res/xml/preferences.xml | 16 +++- 4 files changed, 124 insertions(+), 5 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index f91bc9536..eb5d9b2e0 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -1,20 +1,29 @@ package eu.siacs.conversations.ui; +import java.security.KeyStoreException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Locale; +import de.duenndns.ssl.MemorizingTrustManager; + +import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.xmpp.XmppConnection; +import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentManager; +import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; +import android.preference.Preference; import android.preference.PreferenceManager; +import android.widget.Toast; public class SettingsActivity extends XmppActivity implements OnSharedPreferenceChangeListener { @@ -49,6 +58,68 @@ public class SettingsActivity extends XmppActivity implements resources.setEntryValues(entries.toArray(new CharSequence[entries.size()])); } } + + final Preference removeCertsPreference = mSettingsFragment.findPreference("remove_trusted_certificates"); + removeCertsPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + final MemorizingTrustManager mtm = xmppConnectionService.getMemorizingTrustManager(); + final ArrayList aliases = Collections.list(mtm.getCertificates()); + if (aliases.size() == 0) { + displayToast(getString(R.string.toast_no_trusted_certs)); + return true; + } + final ArrayList selectedItems = new ArrayList(); + final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this); + dialogBuilder.setTitle(getResources().getString(R.string.dialog_manage_certs_title)); + dialogBuilder.setMultiChoiceItems(aliases.toArray(new CharSequence[aliases.size()]), null, + new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int indexSelected, + boolean isChecked) { + if (isChecked) { + selectedItems.add(indexSelected); + } else if (selectedItems.contains(indexSelected)) { + selectedItems.remove(Integer.valueOf(indexSelected)); + } + if (selectedItems.size() > 0) + ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true); + else { + ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false); + } + } + }); + + dialogBuilder.setPositiveButton( + getResources().getString(R.string.dialog_manage_certs_positivebutton), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int count = selectedItems.size(); + if (count > 0) { + for (int i = 0; i < count; i++) { + try { + Integer item = Integer.valueOf(selectedItems.get(i).toString()); + String alias = aliases.get(item); + mtm.deleteCertificate(alias); + } catch (KeyStoreException e) { + e.printStackTrace(); + displayToast("Error: " + e.getLocalizedMessage()); + } + } + if (xmppConnectionServiceBound) { + reconnectAccounts(); + } + displayToast(getResources().getQuantityString(R.plurals.toast_delete_certificates, count, count)); + } + } + }); + dialogBuilder.setNegativeButton(getResources().getString(R.string.dialog_manage_certs_negativebutton), null); + AlertDialog removeCertsDialog = dialogBuilder.create(); + removeCertsDialog.show(); + removeCertsDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + return true; + } + }); } @Override @@ -89,6 +160,26 @@ public class SettingsActivity extends XmppActivity implements } } else if (name.equals("dont_trust_system_cas")) { xmppConnectionService.updateMemorizingTrustmanager(); + reconnectAccounts(); + } + + } + + private void displayToast(final String msg) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(SettingsActivity.this, msg, Toast.LENGTH_LONG).show(); + } + }); + } + + private void reconnectAccounts() { + for (Account account : xmppConnectionService.getAccounts()) { + if (!account.isOptionSet(Account.OPTION_DISABLED)) { + xmppConnectionService.reconnectAccountInBackground(account); + } } } + } diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index addc55ded..d5f550a35 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -429,8 +429,19 @@ Standort empfangen Unterhaltung beendet Konferenz verlassen + Zertifikats-Optionen Misstraue Zertifizierungsstellen Alle Zertifikate müssen manuell bestätigt werden + Zertifikate löschen + Als vertrauenswürdig bestätigte Zertifikate löschen + Keine manuell bestätigten Zertifikate + Zertifikate löschen + Auswahl löschen + Abbrechen + + %d Zertifikat gelöscht + %d Zertifikate gelöscht + %d Kontakt ausgewählt %d Kontakte ausgewählt diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 4a36163c1..cc7727d22 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -457,8 +457,19 @@ Received location Conversation closed Left conference + Certificate options Don’t trust system CAs All certificates must be manually approved + Remove certificates + Delete manually approved certificates + No manually approved certificates + Remove certificates + Delete selection + Cancel + + %d certificate deleted + %d certificates deleted + Select %d contact Select %d contacts diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 9cf0100f3..417e60a43 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -142,6 +142,17 @@ android:title="@string/pref_display_enter_key" android:summary="@string/pref_display_enter_key_summary" /> + + + + - From 9e20a4936e3bea938e20e15421985ea1a928bf63 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 19 Apr 2015 19:11:32 +0200 Subject: [PATCH 23/57] =?UTF-8?q?some=20code=20clean=20up=20to=20fix=20som?= =?UTF-8?q?e=20rare=20NPE=E2=80=99s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eu/siacs/conversations/ui/ConversationActivity.java | 8 ++++---- .../eu/siacs/conversations/ui/ConversationFragment.java | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index a44311b44..e5389dd65 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -929,10 +929,10 @@ public class ConversationActivity extends XmppActivity } private void handleViewConversationIntent(final Intent intent) { - final String uuid = (String) intent.getExtras().get(CONVERSATION); - final String downloadUuid = (String) intent.getExtras().get(MESSAGE); - final String text = intent.getExtras().getString(TEXT, ""); - final String nick = intent.getExtras().getString(NICK, null); + final String uuid = intent.getStringExtra(CONVERSATION); + final String downloadUuid = intent.getStringExtra(MESSAGE); + final String text = intent.getStringExtra(TEXT); + final String nick = intent.getStringExtra(NICK); if (selectConversationByUuid(uuid)) { this.mConversationFragment.reInit(getSelectedConversation()); if (nick != null) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index a3a02b277..bb349348e 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1019,6 +1019,9 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa } public void appendText(String text) { + if (text == null) { + return; + } String previous = this.mEditMessage.getText().toString(); if (previous.length() != 0 && !previous.endsWith(" ")) { text = " " + text; From d2c9bf31cd2a6b39f22ac3426015ecea73403315 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 20 Apr 2015 11:39:38 +0200 Subject: [PATCH 24/57] fixed weird touch on snackbar switched conversation bug when touching the border of the snackbar or more precisely the space between the input field and the snackbar Conversations would switch into a random conversation for yet unknown reasons. --- .../java/eu/siacs/conversations/ui/ConversationFragment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index bb349348e..748fa1686 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -8,7 +8,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender; import android.content.IntentSender.SendIntentException; -import android.net.Uri; import android.os.Bundle; import android.text.InputType; import android.view.ContextMenu; @@ -315,8 +314,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final View view = inflater.inflate(R.layout.fragment_conversation, - container, false); + final View view = inflater.inflate(R.layout.fragment_conversation,container, false); + view.setOnClickListener(null); mEditMessage = (EditMessage) view.findViewById(R.id.textinput); setupIme(); mEditMessage.setOnClickListener(new OnClickListener() { From 127b7866f027b6c1df67973769f5964fa2441c8e Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 20 Apr 2015 11:49:44 +0200 Subject: [PATCH 25/57] removed some dead code --- .../ui/ConversationFragment.java | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 748fa1686..3d94f8716 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -718,21 +718,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa final ConversationActivity activity = (ConversationActivity) getActivity(); if (this.conversation != null) { updateSnackBar(this.conversation); - final Contact contact = this.conversation.getContact(); - if (this.conversation.isBlocked()) { - - } else if (!contact.showInRoster() - && contact - .getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) { - - } else if (conversation.getMode() == Conversation.MODE_SINGLE) { - makeFingerprintWarning(); - } else if (!conversation.getMucOptions().online() - && conversation.getAccount().getStatus() == Account.State.ONLINE) { - - } else if (this.conversation.isMuted()) { - - } conversation.populateWithMessages(ConversationFragment.this.messageList); for (final Message message : this.messageList) { if (message.getEncryption() == Message.ENCRYPTION_PGP @@ -878,10 +863,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa } } - protected void makeFingerprintWarning() { - - } - protected void showSnackbar(final int message, final int action, final OnClickListener clickListener) { snackbar.setVisibility(View.VISIBLE); From 5d7e1159f521482eec9bd17ca7f291b8ade3233f Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 20 Apr 2015 12:13:47 +0200 Subject: [PATCH 26/57] always hide pgp snackbar after decrypting a message. fixes #1075 --- .../java/eu/siacs/conversations/ui/ConversationFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 3d94f8716..5b1e9b4d6 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -764,6 +764,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa } catch (final NoSuchElementException ignored) { } + askForPassphraseIntent = null; activity.xmppConnectionService.updateMessage(message); } From 895a28ab9ddcffcac47fad1f5e1a4a02c70f2105 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 20 Apr 2015 16:13:43 +0200 Subject: [PATCH 27/57] added amazon app store link (us store) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac075fd3f..c491b3c5a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Conversations: the very last word in instant messaging -[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) +[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) [![Amazon App Store](https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png)](http://www.amazon.com/dp/B00WD35AAC/) ![screenshots](https://raw.githubusercontent.com/siacs/Conversations/master/screenshots.png) From 69b43556525a3a2a1565dbbe3289399d51cc642f Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 20 Apr 2015 16:41:24 +0200 Subject: [PATCH 28/57] added reference to the location plugin to README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c491b3c5a..5519e47f6 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,8 @@ Conversations: the very last word in instant messaging ## Features * End-to-end encryption with either [OTR](https://otr.cypherpunks.ca/) or [OpenPGP](http://www.openpgp.org/about_openpgp/) -* Sending and receiving images +* Send and receive images as well as other kind of files +* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation) * Indication when your contact has read your message * Intuitive UI that follows Android Design guidelines * Pictures / Avatars for your Contacts From e7972d3d112065f37b1b4d99584ecc8f1ca8fd32 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 20 Apr 2015 20:32:50 +0200 Subject: [PATCH 29/57] pulled latest translations from transifex --- src/main/res/values-cs/strings.xml | 4 + src/main/res/values-el/strings.xml | 10 +- src/main/res/values-id/strings.xml | 343 +++++++++++++++++++++++++++++ src/main/res/values-nl/strings.xml | 4 + src/main/res/values-pl/strings.xml | 333 +++++++++++++++++++++++++++- src/main/res/values-ru/strings.xml | 36 ++- 6 files changed, 727 insertions(+), 3 deletions(-) create mode 100644 src/main/res/values-id/strings.xml diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index 0c08fa7aa..192df52f8 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -427,6 +427,10 @@ Nebyla nalezena aplikace pro zobrazení pozice Pozice Přijmout pozici + Conversation zavřena + Opustil(a) konferenci + Nedůvěřovat systémovým CA + Všechny certifikáty musí být schváleny ručně Vybrat %d kontakt Vybrat %d kontakty diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 48dc40341..ec1da08c4 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -359,7 +359,7 @@ Δεν ήταν δυνατή η αλλαγή του συνθηματικού Αποστολή μηνύματος για την έναρξη κρυπτογραφημένης συνομιλίας Ερώτηση - Αν εσείς και η επαφή σας έχετε ένα κοινό μυστικό που κανείς άλλος δεν γνωρίζει (κάτι σαν δικό σας αστείο ή απλώς τι φάγατε την τελευταία φορά που συναντηθήκατε) μπορείτε να χρησιμοποιήσετε αυτό το μυστικό για νε επαληθεύσετε τα αποτυπώματά σας.\n\nΠροσφέρετε έναν υπαινιγμό ή μια ερώτηση για την επαφή σας, που θα απαντήσει με μια φράση στην οποία έχουν διαφοροποίηση τα πεζά από τα κεφαλαία. + Αν εσείς και η επαφή σας έχετε ένα κοινό μυστικό που κανείς άλλος δεν γνωρίζει (κάτι σαν δικό σας αστείο ή απλώς τι φάγατε την τελευταία φορά που συναντηθήκατε) μπορείτε να χρησιμοποιήσετε αυτό το μυστικό για να επαληθεύσετε τα αποτυπώματά σας.\n\nΠροσφέρετε έναν υπαινιγμό ή μια ερώτηση για την επαφή σας, που θα απαντήσει με μια φράση στην οποία έχουν διαφοροποίηση τα πεζά από τα κεφαλαία. Η επαφή σας θα ήθελε να επαληθεύσει το αποτύπωμά σας χρησιμοποιώντας ένα κοινό μυστικό. Η επαφή σας προμήθευση τον παρακάτω υπαινιγμό ή ερώτηση για το μυστικό αυτό. Ο υπαινιγμός σας δεν μπορεί να είναι κενός Το κοινό μυστικό σας δεν μπορεί να είναι κενό @@ -427,4 +427,12 @@ Δεν βρέθηκε εφαρμογή για την απεικόνιση τοποθεσίας Τοποθεσία Ελήφθη τοποθεσία + Η συζήτηση έκλεισε + Έφυγε από την συνδιάσκεψη + Μη έμπιστες αρχές πιστοποίησης συστήματος + Όλα τα πιστοποιητικά πρέπει να εγκριθούν χειροκίνητα + + Επιλογή %d επαφής + Επιλογή %d επαφών + diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml new file mode 100644 index 000000000..6c2dedb63 --- /dev/null +++ b/src/main/res/values-id/strings.xml @@ -0,0 +1,343 @@ + + + Pengaturan + Percakapan Baru + Pengaturan Akun + Akhiri Percakapan + Detil Kontak + Detil conference + Amankan Percakapan + Tambah Akun + Ubah Nama + Tambah ke buku telepon + Hapus dari roster + Blokir kontak + Batal blokir kontak + Blokir domain + Batal blokir domain + Pengaturan Akun + Pengaturan + Conference Detil + Kontak Detil + Bagikan dengan Conversation + Mulai Percakapan + Pilih kontak + Daftar blokir + sekarang + 1 min lalu + %d min lalu + Percakapan belum dibaca + mengirim... + Menerjemahkan pesan. Tunggu sebentar... + Nick ini sudah digunakan + Administrator + Pemilik + Moderator + Peserta + Pengunjung + Apakah Anda ingin menghapus %s dari roster Anda? Percakapan yang terkait dengan kontak ini tidak akan dihapus. + Apakah Anda ingin memblokir pesan dari %s? + Apakah Anda ingin membuka blokir %s dan membolehkannya untuk mengirim pesan? + Blokir semua kontak dari %s? + Batalkan blokir semua kontak dari %s? + Kontak terblokir + Apakah Anda ingin menghapus %s dari bookmark? Percakapan yang terkait dengan bookmark ini tidak akan dihapus. + Daftarkan akun baru di server + Ganti password di server + Bagikan dengan... + Mulai Percakapan + Undang Kontak + Kontak + Batal + Atur + Tambah + Ubah + Hapus + Blokir + Batalkan blokir + Simpan + YA + Percakapan terhenti + Dengan mengirimkan laporan kesalahan Anda membantu pengembangan Conversations\n<b>Perhatian:</>Conversations akan menggunakan akun XMPP Anda untuk mengirim laporan kesalahan untuk pengembang. + Kirim sekarang + Jangan tanya lagi + Tidak terhubung ke akun + Tidak bisa terhubung ke banyak akun + Sentuh untuk mengatur akun + Sisipkan berkas + Kontak tidak ada dalam roster Anda. Ingin menambahkannya? + Tambah kontak + pengiriman gagal + ditolak + Mempersiapkan gambar untuk transmisi + Bersihkan riwayat + Hapus Riwayat Percakapan + Apakah Anda ingin menghapus semua pesan dalam Percakapan ini\n\nPeringatan:ini tidak akan mempengaruhi pesan yang disimpan pada perangkat atau server lain. + Hapus pesan + Pilih kehadiran untuk kontak + Kirim pesan teks biasa + Kirim pesan terenskripsi OTR + Kirim pesan terenskripsi OpenPGP + Nick kamu telah dirubah + Unduh Gambar + Kirim tidak terenkripsi + Dekripsi gagal. Mungkin Anda tidak memiliki kunci pribadi yang tepat. + OpenKeychain + Mulai ulang + Pasang + menawarkan... + menunggu... + Tidak ada kunci OpenPGP ditemukan + Tidak ada kunci OpenPGP ditemukan + Percakapan tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publik mereka.\n\nSilakan meminta kontak Anda untuk setup OpenPGP. + Pesan terenkripsi diterima. Sentuh untuk membongkar dan melihatnya. + Umum + XMPP resource + Identifikasi nama klien ini dengan + Terima berkas + Otomatis menerima berkas lebih kecil dari... + Pengaturan Notifikasi + Notifikasi + Notifikasikan jika pesan baru tiba + Getar + Juga aktifkan getaran bila pesan baru tiba + Suara + mainkan suara saat menerima notifikasi + Notifikasi Conference + Selalu memberitahukan bila pesan conference baru diterima daripada hanya dicetak tebal + Tenggang waktu pemberitahuan + Nonaktifkan pemberitahuan untuk waktu yang singkat setelah salinan diterima + Opsi Lanjutan + Jangan kirim laporan kerusakan + Dengan mengirimkan kesalahan Anda membantu pengembangan Aplikasi Conversations + Konfirmasi Pesan + Biarkan kontak Anda tahu kapan Anda telah menerima dan membaca pesan + Opsi Tampilan + OpenKeychain melaporkan kesalahan + I/O Error menerjemahkan berkas + Menerima + Sebuah kesalahan terjadi + Memberikan perubahan kehadiran + Terlebih dahulu meminta dan berlangganan kehadiran untuk kontak Anda buat + Langganan + Akun anda + Kunci + Kirim pembaruan kehadiran + Terima pembaruan kehadiran + Tanya untuk pembaruan kehadiran + Pilih gambar + Ambil gambar + Ijinkan permintaan berlangganan + Berkas yang anda pilih bukan gambar + Terjadi kesalahan saat mengubah berkas gambar + Berkas tidak ditemukan + Kesalahan Umum I/O. Mungkin Anda kehabisan ruang penyimpanan? + Aplikasi yang digunakan untuk memilih gambar tidak memberikan izin untuk membaca file.\n\n Gunakan file manager yang berbeda untuk memilih gambar + Tidak diketahui + Sementara dimatikan + Online + Menghubungkan\u2026 + Offline + Tidak mendapat izin + Server tidak ditemukan + Tidak ada koneksi + Registrasi gagal + Username telah digunakan + Registrasi berhasil + Server tidak mendukung pendaftaran akun. + Kesalahan keamanan + Server tidak cocok + Teks biasa + OTR + OpenPGP + Ubah akun + Hapus akun + Sementara dimatikan + Publikasikan avatar + terlihat %d hari lalu + tidak pernah terlihat + Penerimaan gagal + Fingerprint Anda + OTR fingerprint + Verifikasi + Deskripsi + Conferences + Cari + Buat Kontak + Gabung Conference + Hapus Kontak + Lihat detil kontak + Blokir kontak + Lepas blokir kontak + Buat + Kontak ini sudah ada + Gabung + Alamat conference + room@conference.example.com + Simpan sebagai bookmark + Hapus bookmark + Anda + Conference tidak ditemukan + Tambah kembali + Kirim pesan pribadi ke %s + Hubungkan + Akun ini sudah ada + Selanjutnya + Informasi tambahan + Lewati + Nonaktifkan notifikasi + Nonaktifkan notifikasi untuk percakapan ini + Notifikasi telah dimatikan + Aktifkan + Conference membutuhkan password + Masukan password + Abaikan + Pengaturan enskripsi + Paksa enskripsi end-to-end + Selalu mengirim pesan terenkripsi (kecuali untuk conferences) + jangan simpan pesan terenskripsi + Peringatan: Hal ini bisa mengakibatkan hilangnya pesan + Pengaturan lanjutan + Harap berhati-hati dengan ini + Tentang Conversations + Build dan informasi lisensi + Waktu sunyi + Waktu mulai + Waktu selesai + Aktifkan waktu sunyi + Perbesar ukuran huruf + Tombol kirim menunjukan statusnya + Lainnya + menggunakan akun %s + Mengecek gambar di host HTTP + Berkas gambar telah dihapus + Anda tidak terhubung. Coba lagi nanti + Cek ukuran berkas gambar + Opsi pesan + Salin teks + Salin URL asli + Kirim lagi + URL gambar + Pesan teks + URL disalin ke clipboard + Pesan disalin ke clipboard + pengiriman gambar gagal + Pindai kode QR + Tampilkan kode QR + Tampilkan daftar blokir + Detil akun + Sedang diproses + Gagal + Coba lagi + Selesai + Terverifikasi! + Percakapan + Jaga layanan di latar depan + Cegah sistem operasi mematikan koneksi + Pilih berkas + Menerima %1$s (%2$d%% terselesaikan) + Mengunduh %s + berkas + Buka %s + mengirim (%1$d%% terselesaikan) + Menyiapkan berkas untuk transmisi + %s ditawarkan untuk mengunduh + batalkan pengiriman + pengiriman berkas gagal + Berkas sudah dihapus + Tidak ditemukan aplikasi untuk membuka berkas + Tidak dapat verifikasi fingerprint + Verifikasi secara manual + Yakin untuk memferifikasi OTR fingerprint kontak Anda? + Tampilkan tag dinamis + Tampilan read-only tag di bawah kontak + Aktifkan notifikasi + Buat conference dengan... + Tidak ada server conference ditemukan + Pembuatan conference gagal! + Conference dibuat! + Rahasia disetujui! + Ulang + Avatar akun + Salin OTR fingerprint ke clipboard + Mengambil data dari server + Tidak ada data lagi di server + Merubah... + Password diganti! + Tidak dapat mengubah password + Kirim pesan untuk memulai obrolan dienkripsi + Bertanya + Petunjuk Anda tidak boleh kosong + Rahasia bersama Anda tidak boleh kosong + Hati-hati membandingkan sidik jari yang ditunjukkan di bawah dengan sidik jari kontak Anda.\nAnda dapat mengunakan layanan komunikasi terpercaya seperti e-mail terenskripsi atau panggilan telepon untuk menukarkannya. + Ubah password + Password sekarang + Password baru + Password tidak boleh kosong + Aktifkan semua akun + Menonaktifkan semua account + Lakukan aksi dengan + Tidak ada afiliasi + Tidak ada peran + Orang buangan + Member + Mode lanjut + Memberikan keanggotaan + Cabut keanggotaan + Memberikan hak istimewa admin + Mencabut hak istimewa admin + Hapus dari conference + Tidak bisa mengubah afiliasi %s + Tendang dari conference + Anda mencoba untuk menghapus %s dari sebuah conference publik. Satu-satunya cara untuk melakukannya adalah untuk menendang pengguna ini selamanya. + Tendang sekarang + Tidak dapat merumah role %s + Conference umum + Rahasia, hanya member conference + Opsi conference + Rahasia (Hanya member) + Non Anonymous + Opsi conference dimodifikasi! + Tidak dapat merubah pengaturan conference + Tidak pernah + 30 menit + 1 jam + 2 jam + 8 jam + Sampai pemberitahuan selanjutnya + Opsi input + Enter untuk mengirim + Gunakan enter untuk mengrim pesan + Tampilkan masukan kunci + Mengubah kunci emoji untuk memasukan kunci + audio + video + Gambar + Berkas PDF + Apl Android + Kontak + Diterima %s + Nonaktifkan layanan latar belakang + Sentuh untuk membuka Conversations + Avatar telah diterbitkan! + Mengirim %s + Menawarkan %s + Sembunyikan Offline + Nonaktifkan Akun + %s sedang mengetik... + %s telah berhenti mengetik + Notifikasi ketik pesan + Biarkan kontak Anda tahu ketika Anda sedang menulis pesan baru + Kirim lokasi + Tampilkan lokasi + Tidak ada aplikasi ditemukan untuk menampilkan lokasi + Lokasi + Lokasi yang diterima + Percakapan tertutup + Tinggalkan conference + Jangan percaya sistem CA + Semua sertifikat harus disetujui secara manual + + Pilih %d kontak + + diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 2b8c55011..650e18c44 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -427,6 +427,10 @@ Geen applicatie gevonden om locatie weer te geven Locatie Locatie ontvangen + Gesprek gesloten + Groepsgesprek verlaten + Vertrouw geen systeem-CA\'s. + Alle certificaten moeten handmatig goedgekeurd worden Selecteer %d contact Selecteer %d contacten diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 58dea13bb..3c58c485c 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -5,8 +5,11 @@ Zarządzaj kontami Zakończ konwersację Szczegóły kontaktu - Szczególy konferencji + Szczegóły konferencji + Konwersacja szyfrowana Dodaj konto + Edytuj nazwę + Dodaj do książki telefonicznej Usuń z rostera Zablokuj kontakt Odblokuj kontakt @@ -16,6 +19,7 @@ Ustawienia Szczegóły konferencji Szczegóły kontaktu + Udostępnij przez Conversation Rozpocznij konwersację Wybierz kontakt Czarna lista @@ -25,6 +29,7 @@ nieprzeczytanych konwersacji wysyłanie... Deszyfrowanie wiadomości. Proszę czekać... + Nazwa jest już w użyciu Admin Właściciel Moderator @@ -36,12 +41,15 @@ Zablokować wszystkie kontakty z %s? Odblokować wszystkie kontakty z %s? Kontakt zablokowany + Czy usunąć zakładkę %s? Konwersacja powiązana z zakładką nie zostanie usunięta. Zarejestruj nowe konto na serwerze Zmień hasło na serwerze + Udostępnij... Rozpocznij konwersację Zaproś kontakt Kontakty Anuluj + Ustaw Dodaj Edytuj Usuń @@ -50,6 +58,7 @@ Zapisz Ok Conversations uległo awarii + Wysyłając ślady stosu pomagasz rozwijać Conversations\nUwaga: Ślad stosu zostanie przesłany deweloperowi przy użyciu twojego konta XMPP. Wyślij teraz Nie pytaj ponownie Nie można połączyć się z kontem @@ -60,30 +69,352 @@ Dodaj kontakt wysyłanie nie powiodło się odrzucono + Przygotowywanie obrazu do wysłania Wyczyść historię Wyczyść historię konwersacji + Czy na pewno usunąć wszystkie wiadomości powiązane z konwersacją?\n\nUwaga: Działanie nie wpływa na wiadomości przechowywane na innych urządzeniach lub serwerach. Usuń wiadomości + Zakończ konwersację po usunięciu historii + Wybierz widoczność dla kontaktu + Wyślij wiadomość jawną + Wyślij zaszyfrowaną wiadomość (OTR) + Wyślij zaszyfrowaną wiadomość (OpenPGP) + Twoja nazwa została zmieniona + Pobierz obraz + Wyślij bez szyfrowania + Nie można odszyfrować. Sprawdź poprawność klucza prywatnego. + OpenKeychain + Conversations używa zewnętrznej aplikacji OpenKeychain do szyfrowania wiadomości i zarządzania kluczami publicznymi.\n\nOpenKeychain rozpowszechniany jest na licencji GPLv3 przez F-Droid lub Google Play.\n\n(Zrestartuj Conversations po instalacji). + Zrestartuj + Zainstaluj + oferowanie... + oczekiwanie... + Nie znaleziono klucza OpenPGP + Conversations nie może zaszyfrować wiadomości, ponieważ kontakt nie udostępnia klucza publicznego.\n\nZasugeruj rozmówcy instalację OpenPGP. + Nie znaleziono kluczy OpenPGP + Conversations nie może zaszyfrować wiadomości, ponieważ kontakty nie udostępniają kluczy publicznych.\n\nZasugeruj rozmówcom instalację OpenPGP. + Otrzymano zaszyfrowaną wiadomość. Dotknij, aby odszyfrować i wyświetlić. + Główne + Zasób XMPP + Nazwa identyfikująca urządzenie + Akceptuj pliki + Automatycznie akceptuj pliki mniejsze niż... + Ustawienia powiadamiania + Powiadomienia + Powiadamiaj, gdy nadejdzie wiadomość + Wibracje + Wibruj, gdy nadejdzie wiadomość + Dźwięk + Odtwórz dźwięk z powiadomieniem + Powiadomienia konferencji + Zawsze powiadamiaj o nowej wiadomości w konferencji + Opóźnienie powiadomień + Wyłącz powiadomienia przez krótki czas po otrzymaniu kopii wiadomości + Opcje zaawansowane + Nie wysyłaj raportów awarii + Wysyłając ślady stosu pomagasz rozwijać Conversations + Potwierdzenia wiadomości + Powiadamiaj kontakty o otrzymaniu lub przeczytaniu wiadomości + Ustawienia interfejsu + Wystąpił błąd OpenKeychain + Błąd podczas deszyfrowania pliku + Akceptuj + Wystąpił błąd + Zezwól na powiadomienia obecności + Automatycznie zezwalaj i pytaj o powiadomienia obecności, kiedy utworzysz kontakt + Subskrypcje + Twoje konto + Klucze + Wysyłaj powiadomienia obecności + Otrzymuj powiadomienia obecności + Poproś o powiadomienia obecności + Wybierz obraz + Zrób zdjęcie + Automatyczne powiadomienia obecności + Wybrany plik nie jest obrazem + Błąd kompresji obrazu + Nie odnaleziono pliku + Ogólny błąd wejścia/wyjścia + Aplikacja użyta do wyboru obrazu nie zezwoliła na odczyt pliku.\n\nWybierz obraz przy użyciu innego menedżera plików + nieznany + Tymczasowo wyłączono + Połączono + Łączenie... + Rozłączono + Błąd uwierzytelnienia + Nie odnaleziono serwera + Brak połączenia + Błąd rejestracji + Nazwa jest już w użyciu + Zarejestrowano pomyślnie + Serwer nie umożliwia rejestracji + Błąd zabezpieczeń + Serwer niekompatybilny + Tekst jawny + OTR + OpenPGP + Edytuj konto + Usuń konto + Wyłącz tymczasowo + Publikuj awatar + Udostępnij klucz publiczny OpenPGP + Włącz konto + Czy na pewno? + Wraz z kontem zostanie nieodwracalnie usunięta powiązana historia konwersacji. + Nagraj głos + Jabber ID + Hasło + username@example.com + Potwierdź hasło + Hasło + Potwierdź hasło + Hasła są niezgodne + Wprowadzono niepoprawny Jabber ID + Brak pamięci, obraz jest za duży + Czy chcesz dodać kontakt %s do książki telefonicznej? + dostępny + chętny do rozmowy + zaraz wracam + będę później + nie przeszkadzać + niedostępny + Konferencja + Pozostali uczestnicy + Informacje o serwerze + XEP-0313: MAM + XEP-0280: Kopie wiadomości + dostępny + niedostępny + Brak informacji o kluczu publicznym + widziany chwilę temu + widziany minutę temu + widziany %d minut(y) temu + widziany godzinę temu + widziany %d godzin(y) temu + widziany wczoraj + widziany %d dni temu + nigdy nie widziany + Wiadomość zaszyfrowana. Zainstaluj OpenKeychain, żeby odszyfrować. + Nieznany odcisk klucza OTR + Znaleziono wiadomości zaszyfrowane przez OpenPGP + Twój odcisk klucza + Odcisk klucza OTR + Weryfikuj + Odszyfruj + Konferencje + Szukaj + Utwórz kontakt + Dołącz do konferencji + Usuń kontakt + Szczegóły kontaktu + Zablokuj kontakt + Odblokuj kontakt + Utwórz + Kontakt już istnieje + Dołącz + Adres konferencji + room@conference.example.com + Dodaj jako zakładkę + Usuń zakładkę + Zakładka już istnieje + Ty + Edytuj temat konferencji + Nie znaleziono konferencji + Opuść pokój + Kontakt został dodany do listy + Dodaj ponownie + %s przeczytał do tego miejsca + Publikuj + Naciśnij awatar, żeby wybrać obraz z galerii + Uwaga: Obraz będzie widoczny dla wszystkich kontaktów, którym udostępniasz powiadomienia o obecności. + Publikowanie... + Serwer odrzucił żądanie publikacji + Wystąpił błąd podczas konwersji obrazu + Nie udało się zapisać obrazu w pamięci urządzenia + Serwer nie udostępnia możliwości publikacji awatarów + do %s + Wyślij prywatną wiadomość do %s + Połącz + Konto już istnieje + Dalej + Połączono + Dodatkowe informacje + Pomiń + Wyłącz powiadomienia + Wyłącz powiadomienia tej konwersacji + Powiadomienia są wyłączone + Włącz + Konferencja jest zabezpieczona hasłem + Wprowadź hasło + Kontakt nie udostępnia powiadomień o obecności + Zażądaj teraz + Usuń odcisk klucza + Czy na pewno chcesz usunąć odcisk klucza? + Ignoruj + Ustawienia szyfrowania + Wymuszaj szyfrowanie typu end-to-end + Szyfruj wszystkie wiadomości (poza konferencjami) + Nie zapisuj zaszyfrowanych wiadomości + Uwaga: Może powodować utratę wiadomości + Ustawienia zaawansowane + Modyfikuj ustawienia ostrożnie + O Conversations + Informacje o kompilacji i licencji + Godziny ciszy + Początek + Koniec + Włącz godziny ciszy + Powiadomienia będą wyciszone w wybranym przedziale czasu + Większy rozmiar czcionki + Używaj większego rozmiaru czcionki w aplikacji + Przycisk wysyłania wskazuje status + Raporty dostarczenia + Jeżeli to możliwe, oznaczaj dostarczone wiadomości zielonym haczykiem + Koloruj przycisk wysyłania w zależności od statusu kontaktu + Inne opcje + Nazwa konferencji + Nazywaj konferencję tematem zamiast Jabber ID + Odcisk klucza OTR został skopiowany do schowka + Zbanowano cię w konferencji + To jest zamknięty pokój + Wyrzucono cię z konferencji + Sprawdzanie obrazka na hoście HTTP + Obraz został usunięty + Brak połączenia. Spróbuj ponownie później + Sprawdź rozmiar pliku + Opcje wiadomości + Skopiuj tekst + Skopiuj oryginalny URL + Wyślij ponownie + URL obrazu + Treść wiadomości + URL obrazu został skopiowany do schowka + Wiadomość została skopiowana do schowka + Błąd podczas przesyłania obrazu + Zeskanuj kod QR + Pokaż kod QR + Wyświetl listę banów + Szczegóły konta + Weryfikuj OTR + Zdalny odcisk klucza + (lub zetknij telefony) + Protokół socialist millionaire + Podpowiedź lub pytanie + Wspólny sekret + Potwierdź + W toku + Odpowiedz + Sekrety są niezgodne + Spróbuj ponownie + Zakończ + Weryfikacja udana! + Kontakt zażądał weryfikacji SMP + Brak ważnej sesji OTR! + Conversations + Usługa na pierwszym planie + Uniemożliwia systemowi przerwanie połączenia + Wybierz plik + Odbieranie %1$s (ukończono %2$d%%) + Pobierz %s + plik + Otwórz %s + Wysyłanie (ukończono %1$d%%) + Przygotowywanie pliku do wysłania + Zaproponowano pobranie pliku %s + Anuluj przesyłanie + Przesyłanie pliku nie powiodło się + Plik został usunięty + Nie odnaleziono aplikacji skojarzonej z typem pliku + Weryfikacja odcisku klucza nieudana + Weryfikuj ręcznie + Czy na pewno chcesz zweryfikować odcisk klucza OTR kontaktu? + Etykiety kontaktów + Wyświetlaj etykiety pod kontaktami + Włącz powiadomienia + Utwórz konferencję... + Nie odnaleziono serwera konferencji + Nie udało się utworzyć konferencji! + Konferencja została utworzona! + Sekret został zaakceptowany! + Resetuj + Awatar konta + Skopiuj odcisk klucza OTR do schowka + Pobieranie historii z serwera + Koniec historii na serwerze + Aktualizowanie... + Hasło zostało zmienione! + Nie udało się zmienić hasła + Wyślij wiadomość, żeby rozpocząć szyfrowaną rozmowę + Zadaj pytanie + Jeśli ty i twój kontakt macie jakiś wspólny sekret, którego nie zna nikt inny (żart znany tylko wam lub po prostu co jedliście ostatnim razem, gdy się widzieliście) możecie użyć tego sekretu by zweryfikować wzajemnie odciski swoich kluczy.\n\nPodasz podpowiedź lub pytanie dla twojego kontaktu i otrzymasz odpowiedź (wielkość liter ma znaczenie). + Twój kontakt chciałby zweryfikować odcisk Twojego klucza poprzez sprawdzenie znajomości wspólnego sekretu. Twój znajomy przedstawił następującą podpowiedź lub pytanie dotyczącego tego sekretu. + Wskazówka nie powinna być pusta + Sekret nie może być pusty + Ostrożnie porównaj odcisk klucza pokazany poniżej z odciskiem klucza twojego kontaktu.\nMożesz użyć bezpiecznego kanału komunikacji takiego, jak szyfrowany e-mail lub rozmowa telefoniczna, by wymienić odciski klucza. Zmień hasło Obecne hasło Nowe hasło Hasło nie może być puste Aktywuj wszystkie konta Wyłącz wszystkie konta + Użyj + Brak stanowiska + Brak funkcji + Wykluczony + Członek + Tryb zaawansowany + Przyznaj członkostwo + Cofnij członkostwo + Przyznaj uprawnienia administratora + Odbierz uprawnienia administratora + Usuń z konferencji + Nie udało się zmienić stanowiska dla %s + Zbanuj uczestnika konferencji + Próbujesz usunąć %s z publicznego pokoju. Jedyny sposób, by to zrobić, to wykluczyć tego użytkownika na zawsze. + Zbanuj teraz + Nie udało się zmienić funkcji %s + Konferencja publiczna + Konferencja prywatna, dla zaakceptowanych uczestników + Opcje konferencji + Prywatna (tylko zaakceptowani) + Opcje konferencji zostały zmienione! + Nie udało się zmienić opcji konferencji Nigdy 30 minut 1 godzina 2 godziny 8 godzin + Ręcznie + Ustawienia wprowadzania + Enter wysyła Używaj klawisza Enter do wysyłania wiadomości Pokaż klawisz Enter Zamień klawisz emotikon na klawisz Enter plik audio plik wideo obraz + Dokument PDF + Aplikacja Androida Kontakt Odebrano %s + Wyłącz podtrzymanie pierszego planu usługi + Dotknij, aby otworzyć Conversations Avatar został pomyślnie opublikowany! Wysyłanie %s Oferowanie %s Ukryj niedostępnych + Wyłącz konto + %s pisze... + %s przestał(a) pisać + Powiadomienia pisania + Powiadamiaj rozmówcę, kiedy rozpoczynasz nową wiadomość + Wyślij lokalizację + Pokaż lokalizację + Nie odnaleziono aplikacji do wyświetlenia lokalizacji + Lokalizacja + Otrzymano lokalizację + Zamknięto konwersację + Opuszczono konferencję + Nie ufaj certyfikatom systemowym + Wymagaj ręcznego potwierdzania certyfikatów diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 4a96a7fe9..0f3ec4c73 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -11,6 +11,10 @@ Редактировать контакт Добавить в телефонную книгу Удалить из списка + Заблокировать контакт + Разблокировать контакт + Заблокировать домен + Разблокировать домен Управление Аккаунтами Настройки Сведения о Конференции @@ -18,6 +22,7 @@ Поделиться Начать беседу Выберите собеседника + Черный список только что 1 минуту назад %d мин. назад @@ -31,16 +36,25 @@ Участник Посетитель Вы хотите удалить %s из своего списка? Беседы, связанные с этим аккаунтом будут сохранены. + Вы хотите заблокировать дальнейшие сообщения от %s? + Вы хотите разблокировать пользователя %s? + Заблокировать всех пользователей домена %s? + Разблокировать всех пользователей домена %s? + Контакт заблокирован Вы хотите удалить %s из избранного? Беседы, связанные с данной закладкой будут сохранены Создать новый аккаунт на сервере + Изменить пароль на сервере Поделиться с Начать беседу Пригласить собеседника Контакты Отмена + Установить Добавить Редактировать Удалить + Заблокировать + Разблокировать Сохранить ОК Conversations был неожиданно остановлен @@ -134,6 +148,8 @@ Имя пользователя уже используется Регистрация завершена Сервер не поддерживает регистрацию + Ошибка безопасности + Несовместимый сервер Без шифрования OTR OpenPGP @@ -164,8 +180,13 @@ не в сети Конференция Другие участники + Информация о сервере + XEP-0313: Сохранение сообщений в архив Дублирование сообщений - Управление потоками + XEP-0352: Индикатор Состояния Клиента + XEP-0191: Команда Блокирования + XEP-0237: Управление версиями списков + XEP-0198: Управление потоками XEP-0163: PEP (Аватары) доступен недоступен @@ -192,6 +213,8 @@ Присоединиться к конференции Удалить Контакт Посмотреть данные контакта + Заблокировать контакт + Разблокировать контакт Создать Контакт уже существует Присоединиться @@ -245,8 +268,19 @@ Внимание: Это может привести к потере сообщений Расширенные настройки Пожалуйста, будьте осторожны с данными настройками + О Conversations + Информация о билде и лицензировании + Тихие Часы + Начало + Окончание + Включить режим «тихих часов» + Уведомления будут отключены во время «тихих часов» Увеличить размер шрифта Установите больший размер шрифта по всей программе Использовать кнопку-индикатор + Запрос в получении сообщения + Если поддерживается, поступившие сообщения будут отмечены зеленой галочкой Раскрасить кнопку отправить, указывая текущий статус собеседника + Другие + Название конференции From e9783b80d18c5d1b64090d7e6fa4cf1e6b95f177 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 21 Apr 2015 10:13:28 +0200 Subject: [PATCH 30/57] added missing translations from transifex --- src/main/res/values-ar-rEG/strings.xml | 1 - src/main/res/values-bg/strings.xml | 6 +++++- src/main/res/values-ca/strings.xml | 1 - src/main/res/values-es/strings.xml | 6 +++++- src/main/res/values-eu/strings.xml | 3 ++- src/main/res/values-fr/strings.xml | 1 - src/main/res/values-it/strings.xml | 1 - src/main/res/values-ja/strings.xml | 4 ++++ src/main/res/values-sk/strings.xml | 1 - src/main/res/values-sr/strings.xml | 4 ++++ src/main/res/values-sv/strings.xml | 4 ++++ 11 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/main/res/values-ar-rEG/strings.xml b/src/main/res/values-ar-rEG/strings.xml index 3acf8e541..35eff49fd 100644 --- a/src/main/res/values-ar-rEG/strings.xml +++ b/src/main/res/values-ar-rEG/strings.xml @@ -260,7 +260,6 @@ لايمكن تغيير كلمة السر ارسل رساله لبدأ محادثة مشفّرة أسال سؤال - إذا كنت و جهة اتصالك لديكم سر مشترك غير معروف لأحد آخر (مثل جملة مكرره بينكم او تاريخ ما يخصكم كتاريخ آخر لقاء بينكم ) استخدماه للتحقق من بصمات الأصابع \n\n عليك توفير تلميحا أو سؤال لجهة الإتصال بك للحصول على تلك الإجابه وبدأ التواصل سترغب جهة الإتصال بتأكيد بصمتك عبر السر المشترك بينكما لذلك أخبره تلميحا أو إسأله سؤالا يذكره بالسر ليكتبه برده التلميح الذي يراه صديقك لا يمكن ان يكون فارغ السر المشترك بينكما لا يمكن ان يترك فارغا !! diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml index 2f89f3ae6..b4810f513 100644 --- a/src/main/res/values-bg/strings.xml +++ b/src/main/res/values-bg/strings.xml @@ -359,7 +359,7 @@ Неуспешна промяна на паролата Изпратете съобщение, за да започнете нешифрован разговор Задаване на въпрос - Ако Вие и контакта Ви имате някаква тайна информация, която никой друг не знае (като някаква шега или пък просто какво сте обядвали, когато сте се срещнали за последно), можете да я използвате, за да проверите отпечатъците си един на друг.\n\nМожете да подсигурите подсказка или въпрос, на който контакта Ви да отговори, като има предвид, че главните и малките букви се броят за различни. + Ако Вие и контактът Ви имате някаква тайна информация, която никой друг не знае (като някаква шега или пък просто какво сте обядвали, когато сте се срещнали за последно), можете да я използвате, за да проверите отпечатъците си един на друг.\n\nМожете да подсигурите подсказка или въпрос, на който контактът Ви да отговори, като има предвид, че главните и малките букви се броят за различни. Вашият контакт би искал да провери отпечатъка Ви, като Ви попита за обща тайна информация. Контактът Ви предостави следната подсказка или въпрос, който да Ви насочи към тази тайна. Подсказката Ви не трябва да е празна Общата Ви тайна не може да е празна @@ -427,6 +427,10 @@ Няма намерено приложение за показване на местоположението Местоположение Получено местоположение + Conversation се затвори + Напуснахте беседата + Да не се вярва на системните сертификати + Всички сертификати трябва да бъдат одобрени на ръка Изберете %d контакт Изберете %d контакта diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml index e50fa740e..a0861b167 100644 --- a/src/main/res/values-ca/strings.xml +++ b/src/main/res/values-ca/strings.xml @@ -359,7 +359,6 @@ No s\'ha pogut canviar la contrasenya Començar a enviar un missatge de conversació xifrat Fer una pregunta - Si vosté i el seu contacte tenen un secret en comú que ningú més sap (com una broma o simplement el que tenia per dinar l\'última vegada que es va trobar) pot utilitzar aquest secret per comprovar les empremtes dactilars de cadascú. \ n\ n Proporcionarás una pista o una pregunta per a la seu contacte que respondrà amb una resposta entre majúscules i minúscules. El seu contacte l\'hi agradaria verificar la seva empremta digital per un repte amb un secret compartit.El seu contacte proporciona el següent suggeriment o pregunta per aquest secret. El seu suggeriment no pot estar buit El teu secret compartit no pot estar buit diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 44d8abb23..d7c6a8851 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -359,7 +359,7 @@ No se puede cambiar la contraseña Enviar mensaje para empezar una conversación cifrada Haz una pregunta - Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como un pequeño juego o broma o simplemente lo que tomasteis para comer la última vez os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas. + Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como una broma o simplemente lo que tomasteis para comer la última vez que os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas. Tu contacto quiere verificar tu huella digital a través de un secreto compartido. Te hace la siguiente sugerencia o pregunta para ese secreto. La pregunta no puede ser vacía El secreto compartido no puede ser vacío @@ -427,6 +427,10 @@ No se ha encontrado ninguna aplicación para mostrar la ubicación Ubicación Ubicación recibida + Conversación cerrada + Has salido de la conversación + No confiar en los CAs del sistema + Todos los certificados deben ser aprobados manualmente Seleccionado %d contacto Seleccionados %d contactos diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index b6d1fa3c8..3c9dee1b1 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -359,7 +359,6 @@ Pasahitza ezin izan da aldatu Mezu bat bidali enkripatutako elkarrizketa hasteko Galdetu - Zu eta zure kontaktua beste inor ezagutzen ez duen elkarren arteko sekreturen bat baduzue (ohiko txantxa edo azkenengo aldian bazkaldu zenutena adibidez) bakoitzaren hatz-markak egiaztatzeko sekretu hori erabili dezakezue.\n\nIradokizun edo galdera bat eman behar duzu zure kontaktuak erantzun dezan, letra larri eta xeheak bereiziz. Zure kontaktuak zure hatz-marka egiaztatu nahi du partekatutako sekretu batekin erronka eginez. Zure kontaktuak hurrengo iradokizuna edo sekretu horren galdera eman du. Zure iradokizuna ez luke hutsik egon behar Zure partekatutako sekretua ezin da hutsik egon @@ -427,6 +426,8 @@ Kokapena erakutsi dezakeen aplikaziorik ez da aurkitu Kokapena Kokapena jaso da + Elkarrizketa itxi egin da + Konferentzia utzi egin da Hautatu kontaktu %d Hautatu %d kontaktu diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 47c285174..4baef67f6 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -359,7 +359,6 @@ Impossible de changer le mot de passe Envoyez un message pour commencer la conversation chiffrée Poser une question - Si vous et votre contact avez un secret en commun connu par vous deux uniquement (comme une histoire personnelle ou même comme ce que vous avez mangé lors de votre dernière rencontre) vous pouvez utiliser ce secret pour vérifier vos empreintes respectives.\n\nVous envoyez un indice ou une question à votre contact qui devra répondre en faisant attention à la casse. Votre contact voudrait vous identifier de manière sûre grâce à un secret commun. Il vous envoie le message ou la question suivante. Votre indice ne devrait pas être vide Votre secret ne peut être vide diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index c32e95854..836dced8c 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -357,7 +357,6 @@ Impossibile cambiare la password Invia un messaggio per avviare una conversazione cifrata Fai una domanda - Se tu ed il tuo contatto avete un segreto in comune che nessun’altro conosce (come uno scherzo o semplicemente ciò che avete mangiato a pranzo l’ultima volta che vi siete incontrati), potete usare quel segreto per dimostrare la vostra identità reciprocamente.\n\nFornisci un suggerimento o una domanda al tuo contatto che ti risponderà con una domanda Case Sensitive. Il tuo contatto vorrebbe verificare la tua identità. Dovrai rispondere correttamente alla sua domanda con una risposta che condividete. Il tuo contatto ti ha fornito il suggerimento o la domanda seguente. Il suggerimento non dovrebbe essere vuoto Il segreto condiviso non può essere vuoto diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index baffa088c..0996334e5 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -427,6 +427,10 @@ 位置を表示するアプリケーションが見つかりません 位置 位置を受信しました + 会話が閉じられました + 退出した会話 + システムの CA を信頼しない + すべての証明書を手動で承認する必要があります %d 連絡先を選択 diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index cb45b4aa5..e66bfd19e 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -359,7 +359,6 @@ Nepodarilo sa zmeniť heslo Poslať správu pre spustenie šifrovaného chatu Položiť otázku - Ak máte vy a váš kontakt spoločné tajomstvo, ktoré nikto iný nepozná (napríklad spoločný vtip alebo čo ste mali na obed na vašom poslednom stretnutí), môžete ho použiť na overenie vzájomných identifikátorov.\n\nZadáte pomôcku alebo otázku a kontakt na ňu správne odpovie. Váš kontakt by chcel overiť váš identifikátor pomocou spoločného tajomstva. Váš kontakt zadal nasledujúcu pomôcku alebo otázku týkajúcu sa tajomstva. Vaša pomôcka by nemala byť prázdna Vaše spoločné tajomstvo nemôže byť prázdne diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index 052463c8f..3b632cdbe 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -427,6 +427,10 @@ Нема апликације за приказ локације Локација Примљена локација + Преписка затворена + Напусти конференцију + Не веруј системским сертификационим телима + Сви сертификати морају ручно да се одобре Изабери %d контакт Изабери %d контакта diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index 874de244e..b411f4844 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -427,6 +427,10 @@ Kunde inte hitta applikation för att visa position Position Mottog position + Konversation stängd + Lämnade konferens + Lita inte på systemets CAs + Alla certifikat måste manuellt godkännas Välj %d kontakt Välj %d kontakter From 3a627f72fbc5f51efaf3d8723fc7ce883f2f6e83 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 21 Apr 2015 18:36:11 +0200 Subject: [PATCH 31/57] fixed direct invites --- .../conversations/parser/MessageParser.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 8ae9b642a..76d014688 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -391,15 +391,17 @@ public class MessageParser extends AbstractParser implements private void parseNonMessage(Element packet, Account account) { final Jid from = packet.getAttributeAsJid("from"); + if (account.getJid().equals(from)) { + return; + } if (extractChatState(from == null ? null : mXmppConnectionService.find(account,from), packet)) { mXmppConnectionService.updateConversationUi(); } - Element invite = extractInvite(packet); - if (invite != null) { - Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, from, true); + Invite invite = extractInvite(packet); + if (invite != null && invite.jid != null) { + Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, invite.jid, true); if (!conversation.getMucOptions().online()) { - Element password = invite.findChild("password"); - conversation.getMucOptions().setPassword(password == null ? null : password.getContent()); + conversation.getMucOptions().setPassword(invite.password); mXmppConnectionService.databaseBackend.updateConversation(conversation); mXmppConnectionService.joinMuc(conversation); mXmppConnectionService.updateConversationUi(); @@ -439,16 +441,30 @@ public class MessageParser extends AbstractParser implements } } - private Element extractInvite(Element message) { + private class Invite { + Jid jid; + String password; + Invite(Jid jid, String password) { + this.jid = jid; + this.password = password; + } + } + + private Invite extractInvite(Element message) { Element x = message.findChild("x","http://jabber.org/protocol/muc#user"); - if (x == null) { - x = message.findChild("x","jabber:x:conference"); - } - if (x != null && x.hasChild("invite")) { - return x; + if (x != null) { + Element invite = x.findChild("invite"); + if (invite != null) { + Element pw = x.findChild("password"); + return new Invite(message.getAttributeAsJid("from"), pw != null ? pw.getContent(): null); + } } else { - return null; + x = message.findChild("x","jabber:x:conference"); + if (x != null) { + return new Invite(x.getAttributeAsJid("jid"),x.getAttribute("password")); + } } + return null; } private void parseEvent(final Element event, final Jid from, final Account account) { From d6443d9b2f4654a0724ca273c81f400730b644c1 Mon Sep 17 00:00:00 2001 From: BrianBlade Date: Tue, 21 Apr 2015 22:17:58 +0200 Subject: [PATCH 32/57] OTR: Fix onContactStatusChanged & dont archive OTR - Fix session handling on contact status change: Do not reset potentially active sessions; check peer's OTR-resource on disconnect - use no-permanent-store hint instead of no-store to ensure finished messages are delivered to offline/disconnected clients - add no-permanent-store to ask compliant servers not to archive OTR messages --- .../siacs/conversations/crypto/OtrEngine.java | 2 +- .../generator/MessageGenerator.java | 1 + .../services/XmppConnectionService.java | 20 ++++++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java b/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java index 263f60890..0dc7c37e4 100644 --- a/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java +++ b/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java @@ -182,7 +182,7 @@ public class OtrEngine extends OtrCryptoEngineImpl implements OtrEngineHost { packet.setBody(body); packet.addChild("private", "urn:xmpp:carbons:2"); packet.addChild("no-copy", "urn:xmpp:hints"); - packet.addChild("no-store", "urn:xmpp:hints"); + packet.addChild("no-permanent-store", "urn:xmpp:hints"); try { Jid jid = Jid.fromSessionID(session); diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java index a60c5613f..474a3e1dc 100644 --- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java @@ -71,6 +71,7 @@ public class MessageGenerator extends AbstractGenerator { MessagePacket packet = preparePacket(message, addDelay); packet.addChild("private", "urn:xmpp:carbons:2"); packet.addChild("no-copy", "urn:xmpp:hints"); + packet.addChild("no-permanent-store", "urn:xmpp:hints"); try { packet.setBody(otrSession.transformSending(message.getBody())[0]); return packet; diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 3e8ce65f2..9ffffe0f6 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -36,6 +36,7 @@ import org.openintents.openpgp.util.OpenPgpServiceConnection; import java.math.BigInteger; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -174,13 +175,22 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void onContactStatusChanged(Contact contact, boolean online) { Conversation conversation = find(getConversations(), contact); if (conversation != null) { - if (online && contact.getPresences().size() > 1) { + if (online) { conversation.endOtrIfNeeded(); + if (contact.getPresences().size() == 1) { + sendUnsentMessages(conversation); + } } else { - conversation.resetOtrSession(); - } - if (online && (contact.getPresences().size() == 1)) { - sendUnsentMessages(conversation); + if (contact.getPresences().size() >= 1) { + if (conversation.hasValidOtrSession()) { + String otrResource = conversation.getOtrSession().getSessionID().getUserID(); + if (!(Arrays.asList(contact.getPresences().asStringArray()).contains(otrResource))) { + conversation.endOtrIfNeeded(); + } + } + } else { + conversation.endOtrIfNeeded(); + } } } } From 5e1492fbff8c8377abedac776405a09424a6a20e Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 23 Apr 2015 17:37:47 +0200 Subject: [PATCH 33/57] send invite to other instanzes after creating ad hoc conference. fixes #1136 --- .../conversations/services/XmppConnectionService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 3e8ce65f2..c0b609f3f 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1537,6 +1537,9 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa for (Jid invite : jids) { invite(conversation, invite); } + if (account.countPresences() > 1) { + directInvite(conversation, account.getJid().toBareJid()); + } if (callback != null) { callback.success(conversation); } @@ -2022,6 +2025,11 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa sendMessagePacket(conversation.getAccount(), packet); } + public void directInvite(Conversation conversation, Jid jid) { + MessagePacket packet = mMessageGenerator.directInvite(conversation,jid); + sendMessagePacket(conversation.getAccount(),packet); + } + public void resetSendingToWaiting(Account account) { for (Conversation conversation : getConversations()) { if (conversation.getAccount() == account) { From d07baccf9722a464111273f7a364139ce534fad4 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 25 Apr 2015 14:08:24 +0200 Subject: [PATCH 34/57] cleaned up file handling --- .../persistance/FileBackend.java | 138 ++++++++++-------- .../xmpp/jingle/JingleInbandTransport.java | 3 + .../xmpp/jingle/JingleSocks5Transport.java | 17 +-- 3 files changed, 87 insertions(+), 71 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index c499d499a..cb79b0e96 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -1,6 +1,7 @@ package eu.siacs.conversations.persistance; import java.io.ByteArrayOutputStream; +import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -42,8 +43,7 @@ public class FileBackend { private static int IMAGE_SIZE = 1920; - private SimpleDateFormat imageDateFormat = new SimpleDateFormat( - "yyyyMMdd_HHmmssSSS", Locale.US); + private final SimpleDateFormat imageDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US); private XmppConnectionService mXmppConnectionService; @@ -110,9 +110,7 @@ public class FileBackend { scalledW = size; scalledH = (int) (h / ((double) w / size)); } - Bitmap scalledBitmap = Bitmap.createScaledBitmap(originalBitmap, - scalledW, scalledH, true); - return scalledBitmap; + return Bitmap.createScaledBitmap(originalBitmap, scalledW, scalledH, true); } else { return originalBitmap; } @@ -148,31 +146,34 @@ public class FileBackend { } public DownloadableFile copyFileToPrivateStorage(Message message, Uri uri) throws FileCopyException { + Log.d(Config.LOGTAG, "copy " + uri.toString() + " to private storage"); + String mime = mXmppConnectionService.getContentResolver().getType(uri); + String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime); + message.setRelativeFilePath(message.getUuid() + "." + extension); + DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message); + file.getParentFile().mkdirs(); + OutputStream os = null; + InputStream is = null; try { - Log.d(Config.LOGTAG, "copy " + uri.toString() + " to private storage"); - String mime = mXmppConnectionService.getContentResolver().getType(uri); - String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime); - message.setRelativeFilePath(message.getUuid() + "." + extension); - DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message); - file.getParentFile().mkdirs(); - file.createNewFile(); - OutputStream os = new FileOutputStream(file); - InputStream is = mXmppConnectionService.getContentResolver().openInputStream(uri); + if (!file.createNewFile()) { + throw new FileCopyException(R.string.error_io_exception); + } + os = new FileOutputStream(file); + is = mXmppConnectionService.getContentResolver().openInputStream(uri); byte[] buffer = new byte[1024]; - int length; - while ((length = is.read(buffer)) > 0) { + int length; + while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); - } + } os.flush(); - os.close(); - is.close(); - Log.d(Config.LOGTAG, "output file name " + mXmppConnectionService.getFileBackend().getFile(message)); - return file; - } catch (FileNotFoundException e) { - throw new FileCopyException(R.string.error_file_not_found); } catch (IOException e) { throw new FileCopyException(R.string.error_io_exception); + } finally { + close(os); + close(is); } + Log.d(Config.LOGTAG, "output file name " + mXmppConnectionService.getFileBackend().getFile(message)); + return file; } public DownloadableFile copyImageToPrivateStorage(Message message, Uri image) @@ -182,40 +183,41 @@ public class FileBackend { private DownloadableFile copyImageToPrivateStorage(Message message, Uri image, int sampleSize) throws FileCopyException { + DownloadableFile file = getFile(message); + file.getParentFile().mkdirs(); + InputStream is = null; + OutputStream os = null; try { - InputStream is = mXmppConnectionService.getContentResolver() - .openInputStream(image); - DownloadableFile file = getFile(message); - file.getParentFile().mkdirs(); - file.createNewFile(); + if (!file.createNewFile()) { + throw new FileCopyException(R.string.error_io_exception); + } + is = mXmppConnectionService.getContentResolver().openInputStream(image); + os = new FileOutputStream(file); + Bitmap originalBitmap; BitmapFactory.Options options = new BitmapFactory.Options(); int inSampleSize = (int) Math.pow(2, sampleSize); - Log.d(Config.LOGTAG, "reading bitmap with sample size " - + inSampleSize); + Log.d(Config.LOGTAG, "reading bitmap with sample size " + inSampleSize); options.inSampleSize = inSampleSize; originalBitmap = BitmapFactory.decodeStream(is, null, options); is.close(); if (originalBitmap == null) { throw new FileCopyException(R.string.error_not_an_image_file); } - Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE); - originalBitmap = null; + Bitmap scaledBitmap = resize(originalBitmap, IMAGE_SIZE); int rotation = getRotation(image); if (rotation > 0) { - scalledBitmap = rotate(scalledBitmap, rotation); + scaledBitmap = rotate(scaledBitmap, rotation); } - OutputStream os = new FileOutputStream(file); - boolean success = scalledBitmap.compress( - Bitmap.CompressFormat.WEBP, 75, os); + + boolean success = scaledBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os); if (!success) { throw new FileCopyException(R.string.error_compressing_image); } os.flush(); - os.close(); long size = file.getSize(); - int width = scalledBitmap.getWidth(); - int height = scalledBitmap.getHeight(); + int width = scaledBitmap.getWidth(); + int height = scaledBitmap.getHeight(); message.setBody(Long.toString(size) + ',' + width + ',' + height); return file; } catch (FileNotFoundException e) { @@ -223,8 +225,7 @@ public class FileBackend { } catch (IOException e) { throw new FileCopyException(R.string.error_io_exception); } catch (SecurityException e) { - throw new FileCopyException( - R.string.error_security_exception_during_image_copy); + throw new FileCopyException(R.string.error_security_exception_during_image_copy); } catch (OutOfMemoryError e) { ++sampleSize; if (sampleSize <= 3) { @@ -232,23 +233,24 @@ public class FileBackend { } else { throw new FileCopyException(R.string.error_out_of_memory); } + } finally { + close(os); + close(is); } } private int getRotation(Uri image) { + InputStream is = null; try { - InputStream is = mXmppConnectionService.getContentResolver() - .openInputStream(image); + is = mXmppConnectionService.getContentResolver().openInputStream(image); return ExifHelper.getOrientation(is); } catch (FileNotFoundException e) { return 0; + } finally { + close(is); } } - public Bitmap getImageFromMessage(Message message) { - return BitmapFactory.decodeFile(getFile(message).getAbsolutePath()); - } - public Bitmap getThumbnail(Message message, int size, boolean cacheOnly) throws FileNotFoundException { Bitmap thumbnail = mXmppConnectionService.getBitmapCache().get( @@ -257,8 +259,7 @@ public class FileBackend { File file = getFile(message); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(file, size); - Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath(), - options); + Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath(),options); if (fullsize == null) { throw new FileNotFoundException(); } @@ -271,13 +272,11 @@ public class FileBackend { public Uri getTakePhotoUri() { StringBuilder pathBuilder = new StringBuilder(); - pathBuilder.append(Environment - .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)); + pathBuilder.append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)); pathBuilder.append('/'); pathBuilder.append("Camera"); pathBuilder.append('/'); - pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date()) - + ".jpg"); + pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date()) + ".jpg"); Uri uri = Uri.parse("file://" + pathBuilder.toString()); File file = new File(uri.toString()); file.getParentFile().mkdirs(); @@ -325,13 +324,13 @@ public class FileBackend { String filename = getAvatarPath(avatar.getFilename()); file = new File(filename + ".tmp"); file.getParentFile().mkdirs(); + OutputStream os = null; try { file.createNewFile(); - FileOutputStream mFileOutputStream = new FileOutputStream(file); + os = new FileOutputStream(file); MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.reset(); - DigestOutputStream mDigestOutputStream = new DigestOutputStream( - mFileOutputStream, digest); + DigestOutputStream mDigestOutputStream = new DigestOutputStream(os, digest); mDigestOutputStream.write(avatar.getImageAsBytes()); mDigestOutputStream.flush(); mDigestOutputStream.close(); @@ -349,6 +348,8 @@ public class FileBackend { return false; } catch (NoSuchAlgorithmException e) { return false; + } finally { + close(os); } } avatar.size = file.length(); @@ -356,8 +357,7 @@ public class FileBackend { } public String getAvatarPath(String avatar) { - return mXmppConnectionService.getFilesDir().getAbsolutePath() - + "/avatars/" + avatar; + return mXmppConnectionService.getFilesDir().getAbsolutePath()+ "/avatars/" + avatar; } public Uri getAvatarUri(String avatar) { @@ -368,10 +368,11 @@ public class FileBackend { if (image == null) { return null; } + InputStream is = null; try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(image, size); - InputStream is = mXmppConnectionService.getContentResolver().openInputStream(image); + is = mXmppConnectionService.getContentResolver().openInputStream(image); Bitmap input = BitmapFactory.decodeStream(is, null, options); if (input == null) { return null; @@ -384,6 +385,8 @@ public class FileBackend { } } catch (FileNotFoundException e) { return null; + } finally { + close(is); } } @@ -391,10 +394,11 @@ public class FileBackend { if (image == null) { return null; } + InputStream is = null; try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(image,Math.max(newHeight, newWidth)); - InputStream is = mXmppConnectionService.getContentResolver().openInputStream(image); + is = mXmppConnectionService.getContentResolver().openInputStream(image); Bitmap source = BitmapFactory.decodeStream(is, null, options); int sourceWidth = source.getWidth(); @@ -414,8 +418,11 @@ public class FileBackend { return dest; } catch (FileNotFoundException e) { return null; + } catch (IOException e) { + return null; + } finally { + close(is); } - } public Bitmap cropCenterSquare(Bitmap input, int size) { @@ -522,4 +529,13 @@ public class FileBackend { public boolean isFileAvailable(Message message) { return getFile(message).exists(); } + + public static void close(Closeable stream) { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + } + } + } } diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java index 3677bf4f9..9866af03d 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java @@ -11,6 +11,7 @@ import android.util.Base64; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.DownloadableFile; +import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.OnIqPacketReceived; @@ -172,6 +173,7 @@ public class JingleInbandTransport extends JingleTransport { connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100)); } } catch (IOException e) { + FileBackend.close(fileInputStream); this.onFileTransmissionStatusChanged.onFileTransferAborted(); } } @@ -198,6 +200,7 @@ public class JingleInbandTransport extends JingleTransport { connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100)); } } catch (IOException e) { + FileBackend.close(fileOutputStream); this.onFileTransmissionStatusChanged.onFileTransferAborted(); } } diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java index c34195804..72015a058 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java @@ -11,6 +11,7 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; import eu.siacs.conversations.entities.DownloadableFile; +import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.utils.CryptoHelper; public class JingleSocks5Transport extends JingleTransport { @@ -126,25 +127,19 @@ public class JingleSocks5Transport extends JingleTransport { } catch (NoSuchAlgorithmException e) { callback.onFileTransferAborted(); } finally { - try { - if (fileInputStream != null) { - fileInputStream.close(); - } - } catch (IOException e) { - callback.onFileTransferAborted(); - } + FileBackend.close(fileInputStream); } } }).start(); } - public void receive(final DownloadableFile file, - final OnFileTransmissionStatusChanged callback) { + public void receive(final DownloadableFile file, final OnFileTransmissionStatusChanged callback) { new Thread(new Runnable() { @Override public void run() { + OutputStream fileOutputStream = null; try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.reset(); @@ -152,7 +147,7 @@ public class JingleSocks5Transport extends JingleTransport { socket.setSoTimeout(30000); file.getParentFile().mkdirs(); file.createNewFile(); - OutputStream fileOutputStream = file.createOutputStream(); + fileOutputStream = file.createOutputStream(); if (fileOutputStream == null) { callback.onFileTransferAborted(); return; @@ -183,6 +178,8 @@ public class JingleSocks5Transport extends JingleTransport { callback.onFileTransferAborted(); } catch (NoSuchAlgorithmException e) { callback.onFileTransferAborted(); + } finally { + FileBackend.close(fileOutputStream); } } }).start(); From 82daf849aa9b68dbd61f61923d8d618630af50bf Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 25 Apr 2015 14:42:32 +0200 Subject: [PATCH 35/57] fixed #1039 --- src/main/java/eu/siacs/conversations/utils/CryptoHelper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java index eb7e2c3c6..466bc4098 100644 --- a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java @@ -91,6 +91,9 @@ public final class CryptoHelper { } public static String prettifyFingerprint(String fingerprint) { + if (fingerprint.length() < 40) { + return fingerprint; + } StringBuilder builder = new StringBuilder(fingerprint); builder.insert(8, " "); builder.insert(17, " "); From 5ea1c547d5d956473d3bce83d1f4354c0936ac6f Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 25 Apr 2015 18:24:10 +0200 Subject: [PATCH 36/57] fixed service discovery by properly storing and checking identities --- .../conversations/ui/EditAccountActivity.java | 2 +- .../ui/PublishProfilePictureActivity.java | 3 +- .../conversations/xmpp/XmppConnection.java | 75 ++++++++++++------- 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index dbad9e00e..7aa7b1c2e 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -468,7 +468,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } else { this.mServerInfoSm.setText(R.string.server_info_unavailable); } - if (features.pubsub()) { + if (features.pep()) { this.mServerInfoPep.setText(R.string.server_info_available); } else { this.mServerInfoPep.setText(R.string.server_info_unavailable); diff --git a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java index 3f72b7233..e8ab8dae7 100644 --- a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java @@ -163,8 +163,7 @@ public class PublishProfilePictureActivity extends XmppActivity { if (jid != null) { this.account = xmppConnectionService.findAccountByJid(jid); if (this.account.getXmppConnection() != null) { - this.support = this.account.getXmppConnection() - .getFeatures().pubsub(); + this.support = this.account.getXmppConnection().getFeatures().pep(); } if (this.avatarUri == null) { if (this.account.getAvatar() != null diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 1351226ba..cf580df1b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -90,7 +90,7 @@ public class XmppConnection implements Runnable { private boolean shouldBind = true; private boolean shouldAuthenticate = true; private Element streamFeatures; - private final HashMap> disco = new HashMap<>(); + private final HashMap disco = new HashMap<>(); private String streamId = null; private int smVersion = 3; @@ -334,6 +334,7 @@ public class XmppConnection implements Runnable { } catch (final NumberFormatException ignored) { } sendServiceDiscoveryInfo(account.getServer()); + sendServiceDiscoveryInfo(account.getJid().toBareJid()); sendServiceDiscoveryItems(account.getServer()); sendInitialPing(); } else if (nextTag.isStart("r")) { @@ -734,6 +735,7 @@ public class XmppConnection implements Runnable { features.blockListRequested = false; disco.clear(); sendServiceDiscoveryInfo(account.getServer()); + sendServiceDiscoveryInfo(account.getJid().toBareJid()); sendServiceDiscoveryItems(account.getServer()); if (bindListener != null) { bindListener.onBind(account); @@ -741,34 +743,35 @@ public class XmppConnection implements Runnable { sendInitialPing(); } - private void sendServiceDiscoveryInfo(final Jid server) { - if (disco.containsKey(server.toDomainJid().toString())) { - if (account.getServer().equals(server.toDomainJid())) { + private void sendServiceDiscoveryInfo(final Jid jid) { + if (disco.containsKey(jid)) { + if (account.getServer().equals(jid)) { enableAdvancedStreamFeatures(); } } else { final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); - iq.setTo(server.toDomainJid()); + iq.setTo(jid); iq.query("http://jabber.org/protocol/disco#info"); this.sendIqPacket(iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { final List elements = packet.query().getChildren(); - final List features = new ArrayList<>(); + final Info info = new Info(); for (final Element element : elements) { if (element.getName().equals("identity")) { - if ("irc".equals(element.getAttribute("type"))) { - //add fake feature to not confuse irc and real muc - features.add("siacs:no:muc"); + String type = element.getAttribute("type"); + String category = element.getAttribute("category"); + if (type != null && category != null) { + info.identities.add(new Pair<>(category,type)); } } else if (element.getName().equals("feature")) { - features.add(element.getAttribute("var")); + info.features.add(element.getAttribute("var")); } } - disco.put(server.toDomainJid().toString(), features); + disco.put(jid, info); - if (account.getServer().equals(server.toDomainJid())) { + if (account.getServer().equals(jid)) { enableAdvancedStreamFeatures(); for (final OnAdvancedStreamFeaturesLoaded listener : advancedStreamFeaturesLoadedListeners) { listener.onAdvancedStreamFeaturesAvailable(account); @@ -987,9 +990,9 @@ public class XmppConnection implements Runnable { public List findDiscoItemsByFeature(final String feature) { final List items = new ArrayList<>(); - for (final Entry> cursor : disco.entrySet()) { - if (cursor.getValue().contains(feature)) { - items.add(cursor.getKey()); + for (final Entry cursor : disco.entrySet()) { + if (cursor.getValue().features.contains(feature)) { + items.add(cursor.getKey().toString()); } } return items; @@ -1008,10 +1011,12 @@ public class XmppConnection implements Runnable { } public String getMucServer() { - for (final Entry> cursor : disco.entrySet()) { - final List value = cursor.getValue(); - if (value.contains("http://jabber.org/protocol/muc") && !value.contains("jabber:iq:gateway") && !value.contains("siacs:no:muc")) { - return cursor.getKey(); + for (final Entry cursor : disco.entrySet()) { + final Info value = cursor.getValue(); + if (value.features.contains("http://jabber.org/protocol/muc") + && !value.features.contains("jabber:iq:gateway") + && !value.identities.contains(new Pair<>("conference","irc"))) { + return cursor.getKey().toString(); } } return null; @@ -1066,6 +1071,11 @@ public class XmppConnection implements Runnable { this.lastConnect = 0; } + private class Info { + public final ArrayList features = new ArrayList<>(); + public final ArrayList> identities = new ArrayList<>(); + } + public class Features { XmppConnection connection; private boolean carbonsEnabled = false; @@ -1077,8 +1087,8 @@ public class XmppConnection implements Runnable { } private boolean hasDiscoFeature(final Jid server, final String feature) { - return connection.disco.containsKey(server.toDomainJid().toString()) && - connection.disco.get(server.toDomainJid().toString()).contains(feature); + return connection.disco.containsKey(server) && + connection.disco.get(server).features.contains(feature); } public boolean carbons() { @@ -1094,24 +1104,35 @@ public class XmppConnection implements Runnable { } public boolean sm() { - return streamId != null; + return streamId != null + || (connection.streamFeatures != null && connection.streamFeatures.hasChild("sm")); } public boolean csi() { return connection.streamFeatures != null && connection.streamFeatures.hasChild("csi", "urn:xmpp:csi:0"); } - public boolean pubsub() { - return hasDiscoFeature(account.getServer(), - "http://jabber.org/protocol/pubsub#publish"); + public boolean pep() { + final Pair needle = new Pair<>("pubsub","pep"); + Info info = disco.get(account.getServer()); + if (info != null && info.identities.contains(needle)) { + return true; + } else { + info = disco.get(account.getJid().toBareJid()); + return info != null && info.identities.contains(needle); + } } public boolean mam() { - return hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0"); + if (hasDiscoFeature(account.getJid().toBareJid(), "urn:xmpp:mam:0")) { + return true; + } else { + return hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0"); + } } public boolean advancedStreamFeaturesLoaded() { - return disco.containsKey(account.getServer().toString()); + return disco.containsKey(account.getServer()); } public boolean rosterVersioning() { From 7f2a83a684023aa7ac59c640be8e877434ebcbe7 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 26 Apr 2015 10:48:36 +0200 Subject: [PATCH 37/57] pulled translations from transifex --- src/main/res/values-bg/strings.xml | 11 +++ src/main/res/values-de/strings.xml | 2 +- src/main/res/values-es/strings.xml | 11 +++ src/main/res/values-eu/strings.xml | 3 + src/main/res/values-it/strings.xml | 43 ++++++++++++ src/main/res/values-pl/strings.xml | 10 ++- src/main/res/values-ru/strings.xml | 106 +++++++++++++++++++++++++++++ src/main/res/values-sk/strings.xml | 10 +++ src/main/res/values-sr/strings.xml | 12 ++++ 9 files changed, 205 insertions(+), 3 deletions(-) diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml index b4810f513..b27481dd7 100644 --- a/src/main/res/values-bg/strings.xml +++ b/src/main/res/values-bg/strings.xml @@ -429,8 +429,19 @@ Получено местоположение Conversation се затвори Напуснахте беседата + Настройки на сертификата Да не се вярва на системните сертификати Всички сертификати трябва да бъдат одобрени на ръка + Премахване на сертификатите + Изтриване на сертификатите, одобрени на ръка + Няма сертификати, одобрени на ръка + Премахване на сертификатите + Изтриване на избраните + Отказ + + %d сертификат е изтрит + %d сертификата са изтрити + Изберете %d контакт Изберете %d контакта diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index d5f550a35..08b0d4a5b 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -439,7 +439,7 @@ Auswahl löschen Abbrechen - %d Zertifikat gelöscht + %d Zertifikat gelöscht %d Zertifikate gelöscht diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index d7c6a8851..165310730 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -429,8 +429,19 @@ Ubicación recibida Conversación cerrada Has salido de la conversación + Opciones de Certificados No confiar en los CAs del sistema Todos los certificados deben ser aprobados manualmente + Eliminar Certificados + Eliminar manualmente certificados aceptados + No aceptar certificados manualmente + Eliminar Certificados + Deshacer selección + Cancelar + + %d certificado eliminado + %d certificados eliminados + Seleccionado %d contacto Seleccionados %d contactos diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index 3c9dee1b1..423096618 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -359,6 +359,7 @@ Pasahitza ezin izan da aldatu Mezu bat bidali enkripatutako elkarrizketa hasteko Galdetu + Zu eta zure kontaktua beste inor ezagutzen ez duen elkarren arteko sekreturen bat baduzue (ohiko txantxa edo azkenengo aldian bazkaldu zenutena adibidez) bakoitzaren hatz-markak egiaztatzeko sekretu hori erabili dezakezue.\n\nIradokizun edo galdera bat eman behar duzu zure kontaktuak erantzun dezan, letra larri eta xeheak bereiziz. Zure kontaktuak zure hatz-marka egiaztatu nahi du partekatutako sekretu batekin erronka eginez. Zure kontaktuak hurrengo iradokizuna edo sekretu horren galdera eman du. Zure iradokizuna ez luke hutsik egon behar Zure partekatutako sekretua ezin da hutsik egon @@ -428,6 +429,8 @@ Kokapena jaso da Elkarrizketa itxi egin da Konferentzia utzi egin da + Sistemaren CAtaz ez fidatu + Ziurtagiri guztiak eskuz onartu behar dira Hautatu kontaktu %d Hautatu %d kontaktu diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 836dced8c..8960f60b5 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -304,6 +304,7 @@ Trasmissione dell’immagine fallita Scansiona codice QR Mostra codice QR + Mostra la black list Dettagli utente Verifica OTR Impronta remota @@ -328,6 +329,7 @@ Scegli file Ricezione di %1$s file (%2$d%% completato) Scarica %s + file Apri %s invio (%1$d%% completato) Preparazione alla trasmissione del file @@ -357,6 +359,7 @@ Impossibile cambiare la password Invia un messaggio per avviare una conversazione cifrata Fai una domanda + Se condividi con il tuo contatto un segreto in comune non conosciuto da altri (come uno scherzo privato o semplicemente quel che avete mangiato l\'ultima volta insieme) potete usarlo per verificare le vostre fingerprint.\n\nInvia un suggerimento o una domanda al tuo contatto il quale dovrà rispondere con una risposta controllando le maiuscole. Il tuo contatto vorrebbe verificare la tua identità. Dovrai rispondere correttamente alla sua domanda con una risposta che condividete. Il tuo contatto ti ha fornito il suggerimento o la domanda seguente. Il suggerimento non dovrebbe essere vuoto Il segreto condiviso non può essere vuoto @@ -399,6 +402,46 @@ Opzioni di ingresso Invio invia Il tasto invio spedisce il messaggio + Mostra il tasto invio + Cambia il tasto delle faccine nel tastodi invio + audio + video + immagine Documento PDF + Applicazione Android + Contatto Ricevuto %s + Tocca per avviare Conversations + Il tuo avatar è stato pubblicato! + Invio %s + Inviando %s + Nascondi i contatti offline + Disabilita l\'account + %s sta digitando... + %s ha smesso di digitare + Permetti al tuo contatto di vedere quando stai digitando + Invia la posizione + Mostra la posizione + Non è stata trovata alcuna applicazione per mostrare la posizione + Posizione + Posizione ricevuta + Conversazione interrotta + Conferenza terminata + Opzioni per i certificati + Non ti fidare delle CA di sistema + Tutti i certificati devono essere accettati manualmente + Elimina i certificati + Cancella manualmente i certificati già accettati + Non sono presenti certificati accettati manualmente + Elimina i certificati + Cancella la selezione + Annulla + + Cancellato il %d certificato + Cancellati %d certificati + + + Seleziona il %d contatto + Selezionati %d contatti + diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 3c58c485c..e18493573 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -19,7 +19,7 @@ Ustawienia Szczegóły konferencji Szczegóły kontaktu - Udostępnij przez Conversation + Udostępnij w konwersacji Rozpocznij konwersację Wybierz kontakt Czarna lista @@ -183,6 +183,11 @@ Informacje o serwerze XEP-0313: MAM XEP-0280: Kopie wiadomości + XEP-0352: Client State Indication + XEP-0191: Blocking Command + XEP-0237: Roster Versioning + XEP-0198: Stream Management + XEP-0163: PEP (Avatars) dostępny niedostępny Brak informacji o kluczu publicznym @@ -237,7 +242,7 @@ Połącz Konto już istnieje Dalej - Połączono + Połączono z serwerem Dodatkowe informacje Pomiń Wyłącz powiadomienia @@ -417,4 +422,5 @@ Opuszczono konferencję Nie ufaj certyfikatom systemowym Wymagaj ręcznego potwierdzania certyfikatów + Anuluj diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 0f3ec4c73..fb39e24a9 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -283,4 +283,110 @@ Раскрасить кнопку отправить, указывая текущий статус собеседника Другие Название конференции + Использовать тему беседы заместо JID для отображения конференций + OTR-отпечаток скопирован в буфер обмена! + Вы заблокированы в этой конференции + Эта конференция требует членства + Вы были удалены из конференции + использовать учётную запись %s + Проверка изображения на узле HTTP + Файл изображения был удалён + Вы неподключены. Попробуйте позже + Проверить размер файла изображения + Опции сообщения + Копировать текст + Копировать адрес ссылки + Отправить ещё раз + Адрес изображения + Текст сообщения + Ссылка скопирована в буфер обмена + Сообщение скопировано в буфер обмена + Передача изображения не удалась + Поиск QR-кода + Показать QR-код + Показать чёрный список + Сведения об учётной записи + Подтвердить OTR + Удалённый отпечаток + поиск + (или сенсорные телефоны) + Socialist Millionaire Protocol + Подсказка или вопрос + Общий секретный ключ + Подтвердить + В ходе выполнения + Ответ + Не удалось + Ключи не совпадают + Попробуйте ещё раз + Завершить + Подтверждён! + Контакт запросил подтверждение SMP + Действительная OTR-сессия не найдена! + Диалоги + Оставить службу на переднем плане + Не позволяет операционной системе закрыть ваше соединение + Выберите файл + Получение %1$s (%2$d%% выполнено) + Загружено %s + файл + Открыть %s + отправка (%1$d%% выполнено) + Файл готовится для передачи + %s предлагается скачать + Отменить передачу + передача файла не удалась + Файл был удалён + Не найдено приложения для открытия файла + Не удалось подтвердить отпечаток + Ручная проверка + Вы точно хотите подтвердить OTR-отпечатки ваших контактов? + Показывать динамические тэги + Отображать теги только для чтения под контактами + Включить уведомления + Создать конференцию с... + Сервер конференции не был найден + Не удалось создать конференцию! + Конференция создана! + Секретный ключ принят! + Сброс + Изображение учётной записи + Скопировать OTR-отпечаток в буфер обмена + Получение истории с сервера + На сервере больше нет истории + Обновление... + Пароль изменён! + Не удалось изменить пароль + Отправить сообщение чтобы начать зашифрованный чат + Задать вопрос + Если у вас и вашего собеседника есть общая тайна, о которой никто кроме вас не знает (например, шутка, понятная только \"своим\" или что вы ели на обед при последней вашей встрече) вы можете использовать эту тайну, чтобы подтвердить отпечаток друг друга.\n\nВы даёте подсказку или задаёте вопрос вашему контакту, а она даст регистрозависимый ответ. + Ваш собеседник желает проверить ваш отпечаток с помощью общего секрета. Ваш собеседник дал следующую подсказку или вопрос в качестве этого секрета. + Ваша подсказка не может быть пустой + Ваш общий секрет не может быть пустым + Внимательно сверьте отпечаток, показанный ниже с отпечатком вашего собеседника.\nДля обмена ими вы можете использовать любое доверенное средство связи, например, зашифрованное электронное письмо или телефонный звонок. + Изменить пароль + Текущий пароль + Новый пароль + Пароль не может быть пустым + Включить все учётные записи + Отключить все учётные записи + Взаимодействовать с + Не является участником + Нет роли + Заблокированный пользователь + Участник + Расширенный режим + Предоставить участие + Отменить участие + Назначить административные права + Снять административные права + Исключить из конференции + Не удалось изменить принадлежность %s + Запретить доступ к конференции + Вы пытаетесь исключить %s из публичной конференции. Единственный способ — это навсегда запретить доступ пользователю. + Заблокировать + Не удалось сменить роль %s + Публичная конференция + Приватная конференция только для членов + Настройки конференции diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index e66bfd19e..aa0fcff7c 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -359,6 +359,7 @@ Nepodarilo sa zmeniť heslo Poslať správu pre spustenie šifrovaného chatu Položiť otázku + Ak máte vy a váš kontakt spoločné tajomstvo, ktoré nikto iný nepozná (napríklad nejaký spoločný vtip alebo len čo ste mali na obed, keď ste sa naposledy stretli), môžte použiť toto tajomstvo na overenie vzájomných identifikátorov. \n\nZadáte pomôcku alebo otázku pre váš kontakt, ktorý na ňu správne odpovie. Váš kontakt by chcel overiť váš identifikátor pomocou spoločného tajomstva. Váš kontakt zadal nasledujúcu pomôcku alebo otázku týkajúcu sa tajomstva. Vaša pomôcka by nemala byť prázdna Vaše spoločné tajomstvo nemôže byť prázdne @@ -426,4 +427,13 @@ Nenašla sa aplikácia na zobrazenie polohy Poloha Prijatá poloha + Konverzácia zatvorená + Opustil skupinovú konverzáciu + Nedôverovať systému CAs + Všetky certifikáty musia byť ručne schválené + + Vybrať %d kontaktu + Vybrať %d kontaktu + Vybrať %d kontaktov + diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index 3b632cdbe..bcf420ba4 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -429,8 +429,20 @@ Примљена локација Преписка затворена Напусти конференцију + Опције сертификата Не веруј системским сертификационим телима Сви сертификати морају ручно да се одобре + Уклони сертификате + Обриши ручно одобрене сертификате + Нема ручно одобрених сертификата + Уклањање сертификата + Обриши изабрано + Одустани + + %d сертификат обрисан + %d сертификата обрисана + %d сертификата обрисано + Изабери %d контакт Изабери %d контакта From 031b752906a1f921e6c41bd22164d9bdfe3f82c0 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 26 Apr 2015 10:49:25 +0200 Subject: [PATCH 38/57] version bump to 1.3.0-beta --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 1664fa575..370506560 100644 --- a/build.gradle +++ b/build.gradle @@ -44,8 +44,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 21 - versionCode 57 - versionName "1.3.0-alpha" + versionCode 58 + versionName "1.3.0-beta" } compileOptions { From e50910590903b1db6c9ff3fa107935076d898c2e Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 26 Apr 2015 12:40:03 +0200 Subject: [PATCH 39/57] added changelog. removed deprecated todo list --- CHANGELOG.md | 8 ++++++++ todo.md | 23 ----------------------- 2 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 todo.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 28bf27656..ae267086e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ ###Changelog +####Version 1.3.0 +* swipe conversations to end them +* quickly enable / disable account via slider +* share multiple images at once +* expert option to distrust system CAs +* mlink compatibility +* bug fixes + ####Version 1.2.0 * Send current location. (requires [plugin](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation)) * Invite multiple contacts at once diff --git a/todo.md b/todo.md deleted file mode 100644 index bace5987f..000000000 --- a/todo.md +++ /dev/null @@ -1,23 +0,0 @@ -##GSOC teaser tasks - -####update Contacts last seen for muc messages as well -The contact class (entities/Contact) has the ability to save the last time that Conversations - received a message from that contact. Currently this time only gets updated for one-on-one - messages. In non-anonymous mucs messages from a contact should also update the last seen - time. - -####Select multiple Contact in Choose Contact Activity -Currently the choose Contact activity allows only for one contact to be selected. A long -press on one contact should bring the activity in a mode where the user can select multiple -contacts. -The Activity should then return an array of contacts instead of just one - -####Request and respond to message receipts in MUC PNs -Private MUC messages either dont request message receipts or dont respond to them. The source -of error should be determined and eliminated. A rather small tasks that just teaches you a bit -about the stanza parser and generator in Conversations - -####Edit dynamic tags / groups -The context menu for the contact list (StartConversationActivity) should offer the ability to -edit groups. (Any UI decissions are left to you) Quick suggestion though: Dialog with -checkboxes for existing groups and some way to enter new tags. From c283fec0d1af6d4dc8c6b794a065fa1029b6d178 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 26 Apr 2015 20:26:59 +0200 Subject: [PATCH 40/57] hard code bitmap configs --- .../java/eu/siacs/conversations/persistance/FileBackend.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index cb79b0e96..ac169180b 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -412,7 +412,7 @@ public class FileBackend { float top = (newHeight - scaledHeight) / 2; RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight); - Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig()); + Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(dest); canvas.drawBitmap(source, null, targetRect, null); return dest; @@ -437,7 +437,7 @@ public class FileBackend { float top = (size - outHeight) / 2; RectF target = new RectF(left, top, left + outWidth, top + outHeight); - Bitmap output = Bitmap.createBitmap(size, size, input.getConfig()); + Bitmap output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawBitmap(input, null, target, null); return output; From e11d658f5e1cc89142df468eb12c2af388c97d7d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 26 Apr 2015 20:27:30 +0200 Subject: [PATCH 41/57] use xmppserviceconnection to send iq packets in jingle connection --- .../siacs/conversations/xmpp/jingle/JingleConnection.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index 68eadbc66..e448f9477 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -192,7 +192,7 @@ public class JingleConnection implements Downloadable { } else { response = packet.generateResponse(IqPacket.TYPE.ERROR); } - account.getXmppConnection().sendIqPacket(response, null); + mXmppConnectionService.sendIqPacket(account,response,null); } public void init(Message message) { @@ -459,11 +459,11 @@ public class JingleConnection implements Downloadable { } private void sendJinglePacket(JinglePacket packet) { - account.getXmppConnection().sendIqPacket(packet, responseListener); + mXmppConnectionService.sendIqPacket(account,packet,responseListener); } private void sendJinglePacket(JinglePacket packet, OnIqPacketReceived callback) { - account.getXmppConnection().sendIqPacket(packet,callback); + mXmppConnectionService.sendIqPacket(account,packet,callback); } private boolean receiveAccept(JinglePacket packet) { @@ -556,7 +556,7 @@ public class JingleConnection implements Downloadable { .setAttribute("sid", this.getSessionId()); activation.query().addChild("activate") .setContent(this.getCounterPart().toString()); - this.account.getXmppConnection().sendIqPacket(activation, + mXmppConnectionService.sendIqPacket(account,activation, new OnIqPacketReceived() { @Override From 4caa92e8ff374e28663fd1fe6c9494c767622004 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 27 Apr 2015 12:18:27 +0200 Subject: [PATCH 42/57] handle returning from camera without picture --- .../java/eu/siacs/conversations/ui/ConversationActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index e5389dd65..1f8fd0aa0 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -1034,6 +1034,9 @@ public class ConversationActivity extends XmppActivity this.mPendingGeoUri = null; } } + } else { + mPendingImageUris.clear(); + mPendingFileUris.clear(); } } From a4ff8e36337acab6fb3d945159f6d143e825f16b Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 27 Apr 2015 12:19:05 +0200 Subject: [PATCH 43/57] increased padding around switches in manage accounts --- src/main/res/layout/account_row.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/res/layout/account_row.xml b/src/main/res/layout/account_row.xml index 94c591119..0e73dd643 100644 --- a/src/main/res/layout/account_row.xml +++ b/src/main/res/layout/account_row.xml @@ -3,7 +3,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/activatedBackgroundIndicator" - android:padding="8dp" > + android:paddingLeft="8dp" + android:paddingBottom="8dp" + android:paddingTop="8dp"> @@ -50,6 +51,7 @@ android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" + android:padding="8dp" android:focusable="false"/> \ No newline at end of file From f8e06d8e9a45d5e08c067fe9302ea96ddeebd175 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 09:25:58 +0200 Subject: [PATCH 44/57] revert undo timeout to a more reasonable value --- .../java/eu/siacs/conversations/ui/ConversationActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 1f8fd0aa0..063b02596 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -246,7 +246,7 @@ public class ConversationActivity extends XmppActivity listView.enableSwipeToDismiss(); listView.setSwipingLayout(R.id.swipeable_item); listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP); - listView.setUndoHideDelay(8000); + listView.setUndoHideDelay(5000); listView.setRequireTouchBeforeDismiss(false); mContentView = findViewById(R.id.content_view_spl); From b10b8e2c50374c3f2f7d8f02b77f726c8921b721 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 09:32:58 +0200 Subject: [PATCH 45/57] escape nick in highlight regex pattern --- .../eu/siacs/conversations/services/NotificationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 7269a559b..be01eebdf 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -454,7 +454,7 @@ public class NotificationService { // nick (matched in case-insensitive manner), followed by optional // punctuation (for example "bob: i disagree" or "how are you alice?"), // followed by another word boundary. - return Pattern.compile("\\b" + nick + "\\p{Punct}?\\b", + return Pattern.compile("\\b" + Pattern.quote(nick) + "\\p{Punct}?\\b", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); } From b1843fb61a3f3c52ec99e3239a62d1976355f88c Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 09:35:10 +0200 Subject: [PATCH 46/57] print stack trace on io error --- .../siacs/conversations/persistance/FileBackend.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index ac169180b..9ae56b048 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -155,9 +155,7 @@ public class FileBackend { OutputStream os = null; InputStream is = null; try { - if (!file.createNewFile()) { - throw new FileCopyException(R.string.error_io_exception); - } + file.createNewFile(); os = new FileOutputStream(file); is = mXmppConnectionService.getContentResolver().openInputStream(uri); byte[] buffer = new byte[1024]; @@ -166,7 +164,10 @@ public class FileBackend { os.write(buffer, 0, length); } os.flush(); + } catch(FileNotFoundException e) { + throw new FileCopyException(R.string.error_file_not_found); } catch (IOException e) { + e.printStackTrace(); throw new FileCopyException(R.string.error_io_exception); } finally { close(os); @@ -188,9 +189,7 @@ public class FileBackend { InputStream is = null; OutputStream os = null; try { - if (!file.createNewFile()) { - throw new FileCopyException(R.string.error_io_exception); - } + file.createNewFile(); is = mXmppConnectionService.getContentResolver().openInputStream(image); os = new FileOutputStream(file); @@ -223,6 +222,7 @@ public class FileBackend { } catch (FileNotFoundException e) { throw new FileCopyException(R.string.error_file_not_found); } catch (IOException e) { + e.printStackTrace(); throw new FileCopyException(R.string.error_io_exception); } catch (SecurityException e) { throw new FileCopyException(R.string.error_security_exception_during_image_copy); From 51bf8ec98ea6b628ed38d03969492ef0fddd6c77 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 13:31:33 +0200 Subject: [PATCH 47/57] fixed npe when rotating screen in contact details activity --- .../conversations/ui/ContactDetailsActivity.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java index 40a4587c5..f7156d7a7 100644 --- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java @@ -256,16 +256,19 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd MenuItem unblock = menu.findItem(R.id.action_unblock); MenuItem edit = menu.findItem(R.id.action_edit_contact); MenuItem delete = menu.findItem(R.id.action_delete_contact); + if (contact == null) { + return true; + } final XmppConnection connection = contact.getAccount().getXmppConnection(); if (connection != null && connection.getFeatures().blocking()) { if (this.contact.isBlocked()) { - menu.findItem(R.id.action_block).setVisible(false); + block.setVisible(false); } else { - menu.findItem(R.id.action_unblock).setVisible(false); + unblock.setVisible(false); } } else { - menu.findItem(R.id.action_unblock).setVisible(false); - menu.findItem(R.id.action_block).setVisible(false); + unblock.setVisible(false); + block.setVisible(false); } if (!contact.showInRoster()) { edit.setVisible(false); @@ -275,6 +278,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd } private void populateView() { + invalidateOptionsMenu(); setTitle(contact.getDisplayName()); if (contact.showInRoster()) { send.setVisibility(View.VISIBLE); From f3805b8bab6cc8aead9ea19e98161eb872d05996 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 13:56:08 +0200 Subject: [PATCH 48/57] stop conference details from crashing when rotating the screen --- .../eu/siacs/conversations/ui/ConferenceDetailsActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index e4bfd6ff3..8c4f6eafe 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -237,6 +237,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers MenuItem menuItemDeleteBookmark = menu.findItem(R.id.action_delete_bookmark); MenuItem menuItemAdvancedMode = menu.findItem(R.id.action_advanced_mode); menuItemAdvancedMode.setChecked(mAdvancedMode); + if (mConversation == null) { + return true; + } Account account = mConversation.getAccount(); if (account.hasBookmarkFor(mConversation.getJid().toBareJid())) { menuItemSaveBookmark.setVisible(false); From 93e942f96d856b4ea2ac2595dd8f76ffa0832db3 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 14:28:51 +0200 Subject: [PATCH 49/57] made material icons smaller (24dp) --- .../services/NotificationService.java | 4 +-- .../ui/ConversationActivity.java | 2 +- .../res/drawable-hdpi/ic_add_white_24dp.png | Bin 0 -> 223 bytes .../ic_attach_file_white_24dp.png | Bin 0 -> 452 bytes .../res/drawable-hdpi/ic_chat_white_48dp.png | Bin 363 -> 0 bytes .../ic_content_copy_grey600_24dp.png} | Bin .../ic_content_copy_grey600_36dp.png | Bin 348 -> 0 bytes .../drawable-hdpi/ic_delete_grey600_24dp.png | Bin 0 -> 248 bytes .../drawable-hdpi/ic_delete_white_24dp.png | Bin 0 -> 246 bytes .../ic_edit_grey600_24dp.png} | Bin .../drawable-hdpi/ic_edit_grey600_36dp.png | Bin 419 -> 0 bytes .../res/drawable-hdpi/ic_edit_white_24dp.png | Bin 0 -> 339 bytes .../drawable-hdpi/ic_group_add_white_24dp.png | Bin 0 -> 396 bytes .../res/drawable-hdpi/ic_group_white_24dp.png | Bin 0 -> 417 bytes .../ic_import_export_white_24dp.png | Bin 0 -> 300 bytes .../drawable-hdpi/ic_lock_open_white_24dp.png | Bin 0 -> 400 bytes .../ic_lock_outline_white_48dp.png | Bin 743 -> 0 bytes .../res/drawable-hdpi/ic_lock_white_24dp.png | Bin 0 -> 399 bytes .../ic_person_add_white_24dp.png | Bin 0 -> 383 bytes .../drawable-hdpi/ic_refresh_white_48dp.png | Bin 875 -> 0 bytes .../drawable-hdpi/ic_remove_grey600_36dp.png | Bin 217 -> 0 bytes .../drawable-hdpi/ic_search_white_24dp.png | Bin 0 -> 504 bytes .../ic_settings_grey600_24dp.png} | Bin .../ic_settings_grey600_36dp.png | Bin 780 -> 0 bytes .../ic_warning_white_24dp.png} | Bin .../drawable-hdpi/ic_warning_white_36dp.png | Bin 540 -> 0 bytes .../res/drawable-mdpi/ic_add_white_24dp.png | Bin 0 -> 174 bytes .../ic_attach_file_white_24dp.png | Bin 0 -> 332 bytes .../res/drawable-mdpi/ic_chat_white_48dp.png | Bin 290 -> 0 bytes .../ic_content_copy_grey600_24dp.png | Bin 0 -> 217 bytes .../drawable-mdpi/ic_delete_grey600_24dp.png | Bin 0 -> 199 bytes .../drawable-mdpi/ic_delete_white_24dp.png | Bin 0 -> 197 bytes .../drawable-mdpi/ic_edit_grey600_24dp.png | Bin 0 -> 276 bytes .../res/drawable-mdpi/ic_edit_white_24dp.png | Bin 0 -> 272 bytes .../drawable-mdpi/ic_group_add_white_24dp.png | Bin 0 -> 313 bytes .../res/drawable-mdpi/ic_group_white_24dp.png | Bin 0 -> 296 bytes .../ic_import_export_white_24dp.png | Bin 0 -> 226 bytes .../drawable-mdpi/ic_lock_open_white_24dp.png | Bin 0 -> 290 bytes .../ic_lock_outline_white_48dp.png | Bin 449 -> 0 bytes .../res/drawable-mdpi/ic_lock_white_24dp.png | Bin 0 -> 296 bytes .../ic_person_add_white_24dp.png | Bin 0 -> 289 bytes .../drawable-mdpi/ic_refresh_white_48dp.png | Bin 637 -> 0 bytes .../drawable-mdpi/ic_remove_grey600_36dp.png | Bin 197 -> 0 bytes .../drawable-mdpi/ic_search_white_24dp.png | Bin 0 -> 346 bytes .../ic_settings_grey600_24dp.png | Bin 0 -> 423 bytes .../drawable-mdpi/ic_warning_white_24dp.png | Bin 0 -> 328 bytes .../ic_add_white_24dp.png} | Bin .../ic_attach_file_white_24dp.png} | Bin .../res/drawable-xhdpi/ic_chat_white_48dp.png | Bin 533 -> 0 bytes .../ic_content_copy_grey600_24dp.png | Bin 0 -> 320 bytes .../drawable-xhdpi/ic_delete_grey600_24dp.png | Bin 0 -> 271 bytes .../ic_delete_white_24dp.png} | Bin .../drawable-xhdpi/ic_edit_grey600_24dp.png | Bin 0 -> 379 bytes .../ic_edit_white_24dp.png} | Bin .../ic_group_add_white_24dp.png} | Bin .../ic_group_white_24dp.png} | Bin .../ic_import_export_white_24dp.png} | Bin .../ic_lock_open_white_24dp.png} | Bin .../ic_lock_outline_white_48dp.png | Bin 948 -> 0 bytes .../res/drawable-xhdpi/ic_lock_white_24dp.png | Bin 0 -> 465 bytes .../ic_person_add_white_24dp.png} | Bin .../drawable-xhdpi/ic_refresh_white_48dp.png | Bin 1148 -> 0 bytes .../drawable-xhdpi/ic_remove_grey600_36dp.png | Bin 212 -> 0 bytes .../ic_search_white_24dp.png} | Bin .../ic_settings_grey600_24dp.png | Bin 0 -> 704 bytes .../drawable-xhdpi/ic_warning_white_24dp.png | Bin 0 -> 460 bytes .../ic_add_white_24dp.png} | Bin .../res/drawable-xxhdpi/ic_add_white_48dp.png | Bin 356 -> 0 bytes .../ic_attach_file_white_24dp.png} | Bin .../ic_attach_file_white_48dp.png | Bin 1642 -> 0 bytes .../drawable-xxhdpi/ic_chat_white_48dp.png | Bin 717 -> 0 bytes .../ic_content_copy_grey600_24dp.png} | Bin .../ic_content_copy_grey600_36dp.png | Bin 631 -> 0 bytes .../ic_delete_grey600_24dp.png | Bin 0 -> 341 bytes .../ic_delete_white_24dp.png} | Bin .../drawable-xxhdpi/ic_delete_white_48dp.png | Bin 574 -> 0 bytes .../ic_edit_grey600_24dp.png} | Bin .../drawable-xxhdpi/ic_edit_grey600_36dp.png | Bin 656 -> 0 bytes .../ic_edit_white_24dp.png} | Bin .../drawable-xxhdpi/ic_edit_white_48dp.png | Bin 843 -> 0 bytes .../ic_group_add_white_24dp.png} | Bin .../ic_group_add_white_48dp.png | Bin 1406 -> 0 bytes .../ic_group_white_24dp.png} | Bin .../drawable-xxhdpi/ic_group_white_48dp.png | Bin 1273 -> 0 bytes .../ic_import_export_white_24dp.png} | Bin .../ic_import_export_white_48dp.png | Bin 768 -> 0 bytes .../ic_lock_open_white_24dp.png} | Bin .../ic_lock_open_white_48dp.png | Bin 1438 -> 0 bytes .../ic_lock_outline_white_48dp.png | Bin 1437 -> 0 bytes .../drawable-xxhdpi/ic_lock_white_24dp.png | Bin 0 -> 760 bytes .../ic_person_add_white_24dp.png} | Bin .../ic_person_add_white_48dp.png | Bin 1346 -> 0 bytes .../drawable-xxhdpi/ic_refresh_white_48dp.png | Bin 1704 -> 0 bytes .../ic_remove_grey600_36dp.png | Bin 278 -> 0 bytes .../ic_search_white_24dp.png} | Bin .../drawable-xxhdpi/ic_search_white_48dp.png | Bin 1671 -> 0 bytes .../ic_settings_grey600_24dp.png} | Bin .../ic_settings_grey600_36dp.png | Bin 1486 -> 0 bytes .../ic_warning_white_24dp.png} | Bin .../drawable-xxhdpi/ic_warning_white_36dp.png | Bin 1050 -> 0 bytes .../ic_add_white_24dp.png} | Bin .../drawable-xxxhdpi/ic_add_white_48dp.png | Bin 470 -> 0 bytes .../ic_attach_file_white_24dp.png} | Bin .../ic_attach_file_white_48dp.png | Bin 2215 -> 0 bytes .../drawable-xxxhdpi/ic_chat_white_48dp.png | Bin 929 -> 0 bytes .../ic_content_copy_grey600_24dp.png | Bin 0 -> 521 bytes .../ic_content_copy_grey600_36dp.png | Bin 760 -> 0 bytes .../ic_delete_grey600_24dp.png | Bin 0 -> 402 bytes .../ic_delete_white_24dp.png} | Bin .../drawable-xxxhdpi/ic_delete_white_48dp.png | Bin 719 -> 0 bytes .../drawable-xxxhdpi/ic_edit_grey600_24dp.png | Bin 0 -> 639 bytes .../drawable-xxxhdpi/ic_edit_grey600_36dp.png | Bin 846 -> 0 bytes .../ic_edit_white_24dp.png} | Bin .../drawable-xxxhdpi/ic_edit_white_48dp.png | Bin 1098 -> 0 bytes .../ic_group_add_white_24dp.png} | Bin .../ic_group_add_white_48dp.png | Bin 1935 -> 0 bytes .../ic_group_white_24dp.png} | Bin .../drawable-xxxhdpi/ic_group_white_48dp.png | Bin 1719 -> 0 bytes .../ic_import_export_white_24dp.png} | Bin .../ic_import_export_white_48dp.png | Bin 1025 -> 0 bytes .../ic_lock_open_white_24dp.png} | Bin .../ic_lock_open_white_48dp.png | Bin 1872 -> 0 bytes .../ic_lock_outline_white_48dp.png | Bin 1874 -> 0 bytes .../drawable-xxxhdpi/ic_lock_white_24dp.png | Bin 0 -> 971 bytes .../ic_person_add_white_24dp.png} | Bin .../ic_person_add_white_48dp.png | Bin 1729 -> 0 bytes .../ic_refresh_white_48dp.png | Bin 2312 -> 0 bytes .../ic_remove_grey600_36dp.png | Bin 341 -> 0 bytes .../ic_search_white_24dp.png} | Bin .../drawable-xxxhdpi/ic_search_white_48dp.png | Bin 2279 -> 0 bytes .../ic_settings_grey600_24dp.png | Bin 0 -> 1299 bytes .../ic_settings_grey600_36dp.png | Bin 1978 -> 0 bytes .../ic_warning_white_24dp.png | Bin 0 -> 887 bytes .../ic_warning_white_36dp.png | Bin 1324 -> 0 bytes src/main/res/values-v21/themes.xml | 32 ++++++++---------- 135 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 src/main/res/drawable-hdpi/ic_add_white_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png delete mode 100644 src/main/res/drawable-hdpi/ic_chat_white_48dp.png rename src/main/res/{drawable-mdpi/ic_content_copy_grey600_36dp.png => drawable-hdpi/ic_content_copy_grey600_24dp.png} (100%) delete mode 100644 src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png create mode 100644 src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_delete_white_24dp.png rename src/main/res/{drawable-mdpi/ic_edit_grey600_36dp.png => drawable-hdpi/ic_edit_grey600_24dp.png} (100%) delete mode 100644 src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png create mode 100644 src/main/res/drawable-hdpi/ic_edit_white_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_group_add_white_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_group_white_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_import_export_white_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png delete mode 100644 src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png create mode 100644 src/main/res/drawable-hdpi/ic_lock_white_24dp.png create mode 100644 src/main/res/drawable-hdpi/ic_person_add_white_24dp.png delete mode 100644 src/main/res/drawable-hdpi/ic_refresh_white_48dp.png delete mode 100644 src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png create mode 100644 src/main/res/drawable-hdpi/ic_search_white_24dp.png rename src/main/res/{drawable-mdpi/ic_settings_grey600_36dp.png => drawable-hdpi/ic_settings_grey600_24dp.png} (100%) delete mode 100644 src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png rename src/main/res/{drawable-mdpi/ic_warning_white_36dp.png => drawable-hdpi/ic_warning_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-hdpi/ic_warning_white_36dp.png create mode 100644 src/main/res/drawable-mdpi/ic_add_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png delete mode 100644 src/main/res/drawable-mdpi/ic_chat_white_48dp.png create mode 100644 src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_delete_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_edit_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_group_add_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_group_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_import_export_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png delete mode 100644 src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png create mode 100644 src/main/res/drawable-mdpi/ic_lock_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_person_add_white_24dp.png delete mode 100644 src/main/res/drawable-mdpi/ic_refresh_white_48dp.png delete mode 100644 src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png create mode 100644 src/main/res/drawable-mdpi/ic_search_white_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_warning_white_24dp.png rename src/main/res/{drawable-mdpi/ic_add_white_48dp.png => drawable-xhdpi/ic_add_white_24dp.png} (100%) rename src/main/res/{drawable-mdpi/ic_attach_file_white_48dp.png => drawable-xhdpi/ic_attach_file_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xhdpi/ic_chat_white_48dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png rename src/main/res/{drawable-mdpi/ic_delete_white_48dp.png => drawable-xhdpi/ic_delete_white_24dp.png} (100%) create mode 100644 src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png rename src/main/res/{drawable-mdpi/ic_edit_white_48dp.png => drawable-xhdpi/ic_edit_white_24dp.png} (100%) rename src/main/res/{drawable-mdpi/ic_group_add_white_48dp.png => drawable-xhdpi/ic_group_add_white_24dp.png} (100%) rename src/main/res/{drawable-mdpi/ic_group_white_48dp.png => drawable-xhdpi/ic_group_white_24dp.png} (100%) rename src/main/res/{drawable-mdpi/ic_import_export_white_48dp.png => drawable-xhdpi/ic_import_export_white_24dp.png} (100%) rename src/main/res/{drawable-mdpi/ic_lock_open_white_48dp.png => drawable-xhdpi/ic_lock_open_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_lock_white_24dp.png rename src/main/res/{drawable-mdpi/ic_person_add_white_48dp.png => drawable-xhdpi/ic_person_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png delete mode 100644 src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png rename src/main/res/{drawable-mdpi/ic_search_white_48dp.png => drawable-xhdpi/ic_search_white_24dp.png} (100%) create mode 100644 src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_warning_white_24dp.png rename src/main/res/{drawable-hdpi/ic_add_white_48dp.png => drawable-xxhdpi/ic_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_add_white_48dp.png rename src/main/res/{drawable-hdpi/ic_attach_file_white_48dp.png => drawable-xxhdpi/ic_attach_file_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_content_copy_grey600_36dp.png => drawable-xxhdpi/ic_content_copy_grey600_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png create mode 100644 src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png rename src/main/res/{drawable-hdpi/ic_delete_white_48dp.png => drawable-xxhdpi/ic_delete_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_edit_grey600_36dp.png => drawable-xxhdpi/ic_edit_grey600_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png rename src/main/res/{drawable-hdpi/ic_edit_white_48dp.png => drawable-xxhdpi/ic_edit_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png rename src/main/res/{drawable-hdpi/ic_group_add_white_48dp.png => drawable-xxhdpi/ic_group_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png rename src/main/res/{drawable-hdpi/ic_group_white_48dp.png => drawable-xxhdpi/ic_group_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_group_white_48dp.png rename src/main/res/{drawable-hdpi/ic_import_export_white_48dp.png => drawable-xxhdpi/ic_import_export_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png rename src/main/res/{drawable-hdpi/ic_lock_open_white_48dp.png => drawable-xxhdpi/ic_lock_open_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png create mode 100644 src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png rename src/main/res/{drawable-hdpi/ic_person_add_white_48dp.png => drawable-xxhdpi/ic_person_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png rename src/main/res/{drawable-hdpi/ic_search_white_48dp.png => drawable-xxhdpi/ic_search_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_search_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_settings_grey600_36dp.png => drawable-xxhdpi/ic_settings_grey600_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png rename src/main/res/{drawable-xhdpi/ic_warning_white_36dp.png => drawable-xxhdpi/ic_warning_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png rename src/main/res/{drawable-xhdpi/ic_add_white_48dp.png => drawable-xxxhdpi/ic_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_attach_file_white_48dp.png => drawable-xxxhdpi/ic_attach_file_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png rename src/main/res/{drawable-xhdpi/ic_delete_white_48dp.png => drawable-xxxhdpi/ic_delete_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png rename src/main/res/{drawable-xhdpi/ic_edit_white_48dp.png => drawable-xxxhdpi/ic_edit_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_group_add_white_48dp.png => drawable-xxxhdpi/ic_group_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_group_white_48dp.png => drawable-xxxhdpi/ic_group_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_import_export_white_48dp.png => drawable-xxxhdpi/ic_import_export_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png rename src/main/res/{drawable-xhdpi/ic_lock_open_white_48dp.png => drawable-xxxhdpi/ic_lock_open_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png rename src/main/res/{drawable-xhdpi/ic_person_add_white_48dp.png => drawable-xxxhdpi/ic_person_add_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png rename src/main/res/{drawable-xhdpi/ic_search_white_48dp.png => drawable-xxxhdpi/ic_search_white_24dp.png} (100%) delete mode 100644 src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index be01eebdf..fc40ce756 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -493,7 +493,7 @@ public class NotificationService { final int cancelIcon; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mBuilder.setCategory(Notification.CATEGORY_SERVICE); - mBuilder.setSmallIcon(R.drawable.ic_import_export_white_48dp); + mBuilder.setSmallIcon(R.drawable.ic_import_export_white_24dp); cancelIcon = R.drawable.ic_cancel_white_24dp; } else { mBuilder.setSmallIcon(R.drawable.ic_stat_communication_import_export); @@ -540,7 +540,7 @@ public class NotificationService { mBuilder.setOngoing(true); //mBuilder.setLights(0xffffffff, 2000, 4000); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mBuilder.setSmallIcon(R.drawable.ic_warning_white_36dp); + mBuilder.setSmallIcon(R.drawable.ic_warning_white_24dp); } else { mBuilder.setSmallIcon(R.drawable.ic_stat_alert_warning); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 063b02596..aec755fce 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -375,7 +375,7 @@ public class ConversationActivity extends XmppActivity if (this.getSelectedConversation().getLatestMessage() .getEncryption() != Message.ENCRYPTION_NONE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - menuSecure.setIcon(R.drawable.ic_lock_outline_white_48dp); + menuSecure.setIcon(R.drawable.ic_lock_white_24dp); } else { menuSecure.setIcon(R.drawable.ic_action_secure); } diff --git a/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..481643ecd5e5c361bdf5440f80b6ead58c015a87 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?|m)`b<0N2FLh>sBaz zbNHm-*5u;7=mneO8+En?J13^G1)j}b{4(Q;!Yv7xt%vHjER#LP#>jBmH-z#3;kA!} PRxo(F`njxgN@xNAMifE{ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png b/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..66299b88178eb314e3de58e91af24cb273dd8497 GIT binary patch literal 452 zcmV;#0XzPQP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00BHnL_t(Y$L*G}O2beThW`p;6131oJ9U&oC3Mi|kk0xN z)dvy53Z)OByQnx9T}sg`BIvF|s!5m6CDx|RjY$y~^PlPd=kgIw;GSQ|P!?_a_=MbX zh;6(Vm8nrCRP z!MOquqR!i7MZU5b>t)&^-UEi%@!Yy}A&Mr z!@iQVm)O~lenG}zH-UhyIo~A&+&rI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g$s z6nyOI;uw-~@9nLNoJ@uSEEj5y%AFH>dO>K7-v<%?wJrij_)GtUV;TW_6*#`Ac9gwg z74lecrGMU>lBJEeHaXO0Y&r12WZ^^adqM9m*u6iue1U3ygZuL%jx#L{1Iqj)TpqMI zi1hI)73v7|8uKU>wK;^Gv+g)k$$HW9m#p#xhnLrx84iYYe~f$O0`x9}r>mdKI;Vst E0JBSn8vpO>_%)r1c48n{Iv*t(u z1+RFzIEF+VetW}^%gIoHd#gcOK*SBxz z=w0%Y>*kuyro&fG|NdZnbY0_0@z1tr4kdRxhqc^b2yc1Qv4KyI%d4X|bc(>|!ZnBN zqdoQo{+8+#J@P4Q-*GnMEvYlsJyS2aY?ynNIqc<(ZO<6XzXWakGi(0iCmN!s>*wqF zStT9m5L9;Sk=ST|^jE?8kOQ+6-FhM_bK>&sv(r8`p1r&*>DSyUP0KvK!r*}8->)}a q-}vE1>K(^xGZuYyPQQJql3|K;v)2ca$q#`3WAJqKb6Mw<&;$U>J&KY5 diff --git a/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b72a9f3c69795abc5529255c017ccd2797f319c3 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?TR)5S5w<9M=0>H@wLiJ5GLQ^Ka0DIDwy;w$2Lq;WU!mpt#g1Gyr*9GKhEVm2hM zkaW2kk*&Zalqz5-CvBQ>WkF!G8?RIl+h663Gx3jjtlTdwFg_xg68wvGz2SVXwH<3S oQ@uVHiv9k%^wQ$9QlAtUjMN14P2W{!1MOz;boFyt=akR{0ON^D=l}o! literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/src/main/res/drawable-hdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a9eac0ca7e773fa639e5c86ed460ba7abb6c6b7f GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?af+om}F=aBk5-JbP0l+XkKJF8LJ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_edit_grey600_24dp.png similarity index 100% rename from src/main/res/drawable-mdpi/ic_edit_grey600_36dp.png rename to src/main/res/drawable-hdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png deleted file mode 100644 index f8970cb25b634f5637691344355d95c2ddd43e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL0wmRZ7KH&Rg=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t)J zFfdAcx;TbJ9DaMlmhX@O59?11Qm1Wh63=?RRST~-c3 z>V>zT^R1|2|G{SO?y1yu%lk^A>@_*FCA_+~4ob6mZ2%jyZ;9H`L!1n zNW2MH6v5ZL_QkOxO|jS2JK1#$B7D+sRqZt8(#|UUUZ5_Oupys0HpVUZ%$YNrieoxg zbx-|%>Y2nUxnpZLoP2A!itkvk8oO1;-6;*uLGxu+wjVqca_synt7|hRB{O(+Ici9< zEmD!_;Yt?DYTIe1vd-jRA8b^)M}WbkzL Kb6Mw<&;$VfshGR~ diff --git a/src/main/res/drawable-hdpi/ic_edit_white_24dp.png b/src/main/res/drawable-hdpi/ic_edit_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..730416c96a60eac87732e3780cb9a345fc3a5451 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?~c^Ye?BWn5j7thXKh*{-+i z-{jgltrhoO-cFdS9ToFr!ZD5n2i0aZw(PFtKI6@cZU}B|aGqP~v6wT!U+j{^$3uq~ zTg|a}5xmj6RAWcqme7w*mS@Z-l!aw268n2)a*Q>(Q)e5~WosK5S&gC;K gkN#Wxll==@W8J@L%&!W#f!<>9boFyt=akR{0O0p_kpKVy literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d96c584ca6d5be95010b8e9621aba4192dff07ff GIT binary patch literal 396 zcmV;70dxL|P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_009I^L_t(Y$L*Eh3IRbB#uv#GC@RtpuOPXiJcwPa-03q;`)76*I|&!sZ?3*?&iralXBq{{XO53Y3NpO9%64TksyxT_Q*YuQ_D}!ApToE|5W4Oz^)2&0HXrvZCN^&?8yfNoaPa zBSl$9@KT^VYKkMfglZofFvokTtGzXlUj#)^LJK|g+3KRn+8pL~6KtZw{-8Q0+*DiA zFhNCj(`wZ8+Ww+CoMfs*O9|3%W{y qu3TrydqJ`is=o*devtt551<=($s?zfPEBn90000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_009|EL_t(Y$L*D|PJ>VshW{)21jZ*YNMntOle+0+xcOdg zy4KLxQ5}twnsoOKOe@fi@;QK4F1-~@IvB%Yx*wb`;Xn6+L93}Xb)rt>RHRs`QpJiK z-q%QT&2*!lr;GX(G3BeK>{z}_V);A0df%cbrdrpQj~qU17Nt%@V)@+RS-r1)*!(u^ z+a;@ehu<}a9Wt>mFd=Ll!qSXH$bf`|K}A!jVlpz~MGZ24?t8ReTL;?Lfwr|N=}oVC z(O9{?d!%zOuZ4ZeRVC2xz%Mx|pD`_p!!e<}I|rXK|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?Fm z;v$=-fr>-q*9%S(OkxH$3Rhiu1C#?!e_<=y)0QXFW_YAsa8qDJkD}@Z=?95d95UB5 p_8dy&Sy{TD`EcXKG~S;K3`+k(7+*MN9{{?S!PC{xWt~$(69D(+T$um> literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png b/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1f582254ffa5bf421498120bdc39d116bf7bddb8 GIT binary patch literal 400 zcmV;B0dM|^P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_009U|L_t(Y$L-cVN&`Uv2GFfyo5I-m1Hn>HAOSBCv9S?? zZ3t-Pb}^hw2G?pM$;hP#ZL6=8wSfBJb$qH~^==5n2+8q)A_>lnjNkBus{)Oi+{zy(P_Q z&8+;>(1w`Jn6ZWnbolUM4y_7j!j-F7iP&1Mp}k@2#zAYFhn&*+oPB uqWUOXLw1s(QtHl*bUy3sZ~SQeJoF0C14kCmNm!i#0000?P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00Li0L_t(&-tC&tOB+EH$G>TQNx@%NgD1U-y-4vtkZQn# zP(jjz^kz%3^bZgT^yF2ccRdxnm)@nIk=784rSw*z)Itjdjj8(Wp=8}+N-`(nj; zxeU8+-+uDu&6{sFnMDtL=G_+t^1oqh&c<_|{M z30K+QY1~e67WkcU_Kox114{E1b!?sKZUCjZO**-qzQOILna>@n+rF_X1W?Fo*Eb}T*-u-ew9-g_T9E?E z1^Q0>ZC(cYQdS0NHc&g6Ht?T)-bMYpnCxX!zVR9^VtpG}Q(T$gDtqUB0L!JNt diff --git a/src/main/res/drawable-hdpi/ic_lock_white_24dp.png b/src/main/res/drawable-hdpi/ic_lock_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b94735ecbb6043e2842514aaed9124dbcf18d34f GIT binary patch literal 399 zcmV;A0dW3_P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_009R{L_t(Y$L-d!O2beT2H=2L!6J09?!{3-)K{tK;35=X zpo?yOg3zp`=&K0DSJ1gy=g`3lSw06fh;1}!svz{g+c}r-!c92bK(Ltg(}tR+woAu0 z=ZETg5+6xi*_sF1G4wT0c8fywcV?omMY2yA;n zGW*(RL(Pn{ufb7%s0~_E^>c8MAL@XUsro7C{6}a_B$g**kxDicDUv7~iVHz;HdHiA z=q*E`&_h}1#=1bDYETZ^OM3_9pp~?@S`OMzdxzzqfvP}Y!)@8G_Nc3CwEVLd4UHEy tkBUvmFdM4mp4qYRyP5rq53Rq4UI7l%BzuJ0j)(vN002ovPDHLkV1i&mp)3FZ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..533419085822397011780841e8751c4b788440ce GIT binary patch literal 383 zcmV-_0f7FAP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_008$%L_t(Y$L-cnY63A7$MJwV19JgU+j^RM1wDd@PVEKS zqX_O@6;GfGQ564OKo{+95Ruk}@O34OlQ-4`K~R5hm%s;-_X1I<%apoj$fZu74O@o1 zVf_EHtsd_@u?0fE_ymX0-U=74KZg zp+uW)Y)Ak2qIldv9ZBNz!#Vk;N+J%*GsGkVUL+{P64NY5>rfM$G<0ZX1qC`}n+Ie8 dJ^n{h?E!Dn>>uZ4l$`(o002ovPDHLkV1ip7lH33Q literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png deleted file mode 100644 index 72128fe69086bd90233bd2f16ca25cd52f423326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmV-x1C;!UP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00QGlL_t(&-tE~>NRwe4!0}CTo{HE;x%AM%xu62Y4l4=5 zL)5J>sA)kGC5fenLhzE>F|ZsdL3A_fP}i9R5)?rwRM%VObYIzLi4$aA zihqXFZWXpZqu8**g`zoKtYlnHjrybG@8@_{Ip!(53P$agM%M4?utis$x-&H*Dp zk8kE-)f!b=q{JT%hI7$0*Sxmp~@O40KeOUgyh7>7%-wczKq z66Ym5OSRWg$yI5pEZi39rJ}T(FFuBgtmZFq1JB0n26^b_)jEaWHD1u2f6Y^>?Wt{? zO>_%)r1c48n{Iv*t(u z1p_@@977@wzrF0p+h8EVeBm5pPyxfT59TsHr&J1_dQJPoTq$~?JoEO{T_zGdY|RG~ z3~t=tV0+u?^_d?{UuC#&%oPsno62`&WugH@`n`?dN|mPzi$zU004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00D4GL_t(Y$L-d!N0ALM4Cu@#qXmRlgLR{L~>lLCQ zaB9g>aBm2j9D9K>m(X_zTHJy_ni?D=q_4qKS>4;cSKI2G<#PD%$A5m#J^#(g{m#t& zJ!svYV@-#)6&8hd^u72Pk6OxEp^}cM@t~dsD!B9`Lo6T9i5w`?wKzOUu& z8-cM(I%p>_C*Q(03_(8~)DPK21y((SS~9fm1=G1reV*swEE(DZgV^Nj;5HdL2B)!5 zITSn*YJyfQR0zi+5jq5&SZE83lA&#IFCPY-VV%m$X627_l@uXoT zJYPps(TUcaxivO5(sL9_+zV7Uipp}qmwuwM^@^hFKwW*MvbLR~ZZws>gMCn!^VA~E uu;?mK&1F07j9NOQ8P#02M*qJx3(r?D#L7`^-AZZz0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00M+bL_t(o!|mA3YZE~j$MH=sHc6=>rCN)&C?+=%EfxO& zW80%3ErK9a(Sz47_(G|KQW}~H^&leA(jWv8p(6AyVtcTPc(rJ%6imGO))zBg6tdZQ zX2*6n2Pw}fVJ4q2FTa^x2d94JY+?1r+8Jh~riN(?2fL5bR4yEBUW?6zgMHCr3<21KlXGgvDHhS=l!?jW-wHp>Ce7AeqThfSkUtTRI&4LI!JHtQm# zP^@u_W*i#m#1h*xA4+g<`;j z#aRv%`$$yAMgpZ2ieU-skWhZdbbGe(L82~uPzS@d|I$KLpKtB`Te0Wq?! zjiRfU(lEX@!89gzYz`V}(I2b-|d7uj$ld zZ+(M!f_TjUPWq<)f*vba92h0W=^;syUb4c4++BG+*1`9{56`c(OA90&I5s4&#+c#0000< KMNUMnLSTZ2u~<3) diff --git a/src/main/res/drawable-mdpi/ic_warning_white_36dp.png b/src/main/res/drawable-hdpi/ic_warning_white_24dp.png similarity index 100% rename from src/main/res/drawable-mdpi/ic_warning_white_36dp.png rename to src/main/res/drawable-hdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_warning_white_36dp.png b/src/main/res/drawable-hdpi/ic_warning_white_36dp.png deleted file mode 100644 index c8b7140a9a9bdeee174ea87008c1b3303b8ef891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmV+%0^|LOP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00ERqL_t(o!|m81Oaf6H$8lhcjg3H{5HwM=(Jm69Y1D=h zn?`LIwQ1CbQ6o{CCQVYbXwaaWZaN)P_*#S=$Gvy&?)~p(;CJyhJ{vr4`(BDva#w1G zOlKMTL++(1Xkn)fM<&FV|$FY8#h*=KgRl0;>AvJ?<7vFhIh5NungBz z*cF+0ur>VFi~}q1JQ!j3WB;EAwHDy;HWsj;6jYH3o+^Sd~F2Y(OPC^kJe{L!6no6m zIr>Ji$0j;Q-zXB8t8;=HMPf}arfL+4jXNi}Q6$!OW4cC>*k9+EG>XJJBg`TG4RL0# e0B6{L!hQjqB4q&Q{=l^W0000 diff --git a/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..977dd3427ade9fa5002997d3e3df916aa8861983 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkLM z=IP=XVsSe8&v^%_1es$}4u^UcOKr$FAbzMPO=~G=WkKx z#M8ww#NzbZD~4XofdXs~%6SX9O?#gxH7)lN2#$0)ow3}qVUlo5MCbO1pcKI=+i!QA zOc#tOxw<_&U6HxJ(!S>MS(b<8Urk@lUODBROc`UXe%P^dqVx7EpG`~9D-CeM6mWx$k=h6;OxJS6wCw?ro& eo%Jugk@x--PNiik{D*+9WbkzLb6Mw<&;$UnDPFq( diff --git a/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..bab9b4d669edd03f93365a4d2f23daec6edc1a84 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkJm z=;`7ZVsScIBUORdX~ls{)0h4)bXX%*pnZHHV>e5k`oy)2+vDS={z|^wa9&@3W9EUk zCOgioXj5Fv=v={(UD2vux&OejgYxNp6@jn1eVGLX7^;7)i_(f&bronhgQu&X%Q~lo FCIFl*LstL* literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e757fdb07dbd51e84e7d121d5939bb50b2894099 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkKh z@9E+gVsScIBUORdh^K+A^%DEi{|i4ju4J;~{r}P7RffW0ewMTHR}EG*dho8_pjF=( m-CY0DTjx|QyOqCi0|Wovb7#d)y?6;Uiow&>&t;ucLK6Ue*Ey*G literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/src/main/res/drawable-mdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ea52ef251a109b0b518f6688078b5e4f68b326 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkKh z>*?YcVsSe8$9V^-6bS}iuK)6X+8fy&71D@QA7V53D`- k|G&4+sakd`f8hoOrq8U|98*so1scTQ>FVdQ&MBb@01`boWdHyG literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..bae3480cb123b0dfafaea1bea608b82994d06519 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkL+ z{rG3V~jbIkwP*j)bNf#qG7*d=`1wk*qdq!xLf-6@mfOYRHy z0||{+nVV(#_$G_-6x6NZ;jt2M<4@z1cw=#)defo`_OO=~G=WkL+ z;pyTSVsZNH<-NQO3IYy^(>_m^EaBrW-%#LZt!(xzl0(q2DqVfcdvCoK;~Dwa|1d

2t?+KF{Qd1XyO;N07-#Y)VLhOn84k!38d7PJee$l{xLDlK^ z4`%H)@o$_F->B5@xbmd`gl9XyL{I(6IpwFU1=n3B&Cm63N{Y&-Y+m_udZ|Cq3k(dN Lu6{1-oD!MO=~G=WkLc z(bL5-#NzbR%hp_n97I|l24^HCA6TpLO>CXxr5!4Y0w?)u-gqu@OjKqW%yXaq$7ZerMm5;fvS!3zwG?Bw_Qy7y2=My%+j&-K$CwOE88%@<` zNY79_cCE$5)al2O7z^Qtir22qS#WT(nM5gL{{+?OyqKFC5}c$31q2^mJvbru?Ica+ zBO)Fz!~1PMXjQxLH@y8^!5!YU_xJP%>+A2#{>reT_-K2b%z7Q5;~6|%{an^LB{Ts5 DO-XPr literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_group_white_24dp.png b/src/main/res/drawable-mdpi/ic_group_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2a916b4717a32c9b56bafb8f613a4bb56e1564 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkLc zz|+Ms#NzbR$+ldF90c6#r6)_j;IxUe>D(|wpkHB|<-}`T*_U>5op<7S=g$-s@xuIS z^7Df{hq?BK|1wlueCSfpBt;iL-|vSe27K&s?67*^v7z=br{b;#<%Msh`#j|&Gp9Z| za!EB^r!8~R{+f16Zz($-)HOCvTSsaQnc+$~(-sz3RDY1kRH~i@X}M2k2G?Pgg&ebxsLQ08GwkivR!s literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png b/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6e11bc89f4cb716fcffa76bb2f2b9b6d335284 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkJm z<>}%WVsZNFWKXUG4je3hf6n-kyRe8WMbd4rOVa!ny)CS)D?Ozecvmx6AK==#{aEBQ zMz%iY2Nue+8CSIa6Ps~hKSLAq7sgXtO^hAWzkT)kwas1fOXmBZFCEw?YE-UKl+AYo P+QQ)J>gTe~DWM4fvI<5V literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png b/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9efde0be5c8932eb64807d16709ebd13e6ee7f GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkJ` z%hSa%#NzbXE8bj(3uf^yV>t~iZnCdf~!q`g>F1ln(C3V?!@5-JzLJ3S+qGWpZewIt+TZ|Uq09PDWzfZ zEX;O`UBl0!6~_+zeyVo9j+N_d@#519DsxLDuPo?c-|40KdwF;lQ)z+8DZ>+?jh}SN g_AIXJO|W5TpMNU*`Eq6speq?XUHx3vIVCg!03`-)fB*mh literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png deleted file mode 100644 index 2d2c9417dca348991f817d79758044cde06b1ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tg=CK)Uj~LMH3o);76yi2K%s^g z3=E|}g|8AA7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+;1OBOz`!jG!i)^F=14Fw zFj{)LIEF+VetW~w>#&1F+rx$3Y~JS;7d~IPG~ne*7JfxD6BhA#PAj^bI#^1zr>eB3 zecmP6e#FNrO>JV+&&{XVKex=RVNnve8}}%Lp~^T>yYPQ$SoYAgx0Jn$_qxe7*^WN* zYqBRmgvV~SLqY;u_YzEk{V{)US>$? oWl7(zDc-_sKQo^5zr+tFiOrUmq7F#C28Jwyr>mdKI;Vst0BXFj?EnA( diff --git a/src/main/res/drawable-mdpi/ic_lock_white_24dp.png b/src/main/res/drawable-mdpi/ic_lock_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..381b6a118137f0b9c13bad8dd3138d9975b0952e GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkLc zz|+Ms#NzbXE7n|x90b@N^rjnBsXIP;9MR zGue1%VfXj1F4XL0eE)buJzMVAQgKF0QqI{N}{)+_?LmBG{1&t;ucLK6V4if&i{ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d0857a492db86bc8e139f8950ff4513a317a65e4 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkJ` z)6>N<#NzbT%Z7YS1|kg)%cU-Fc#*e*{i9x$DpTS??gzFeyCi)Qojw~UMrG=@bnXwH z{9V;IPV2-TdX1t-M#a{s-*W!>~=q@Cifg{uD^R+;Y!hl cWA=BMSN^#(vD)5YBG8cxp00i_>zopr09u-382|tP literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png deleted file mode 100644 index 5f89fc257b71bee3b3e6ca55d89e57a3f3b2d4d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637 zcmV-@0)qXCP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00H$$L_t(o!|j(%ZxT@yh7oM#OB;7Zi7_}Pu8cndb<-t~ zYFzM7gw|H5E=*jYR5pz+OkDLxXiCzi!L==Zpkg#GG&D?`Jl$MwX2NjqolzE=IkSPx zd*5g7aL&1h2$AVtkq{69{ujV$Zm~|A@7NsigKb*e=8T83;vaCC76ZIuz%wkDwhI0L z2_ABYDs0w>3-uEC16aJpBs%1Xuq?hA1Fq3`n7m_!JQ-$*G0%1Ce01FH)0CeL0hYsl zj{?y##YxJ1@z{?MAVEhi*dRG^muJ}w2B=GUO_O6$cKrh^Z29!MBwh}(gQk4a6+h+iscd#ng}h73 z$bOEVSnIcIL}S$4s-a-l_0ZeZtOt!jvX!p z9e(4~|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?H@w58Pkj_3j&+nco(g6O=~G=WkKx z$-&j^;{Fsb>76#~R)pq#vC~dQ28EX` zg8%)PA$hNQvd6BsPYx$MT=FHzYSw;c=IFCirMEQdzMB?gJ98>mrHoF2`8ro&(KN$? zLq;6eEsi*JnsBu5ICg-0ufm(hH_M#FT9of3J?ID($lK80XsIdVu{%sqUTTG`IE z%F_IAZfVbDpL*}1(7rV<)A`oT%lo!WNPN!hC40?{(?z~=?ahAfb5Z5J`h)2;|0n+E m@m=+TO(=7^cI_YGAB>{YCan_sd1o=ucMP7celF{r5}E*-^@JJ# literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1b41f037163a02862327f74fb73cbf235682e2 GIT binary patch literal 423 zcmV;Y0a*TtP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00AFKL_t(I%e9oTN&`Ujd{R0$n-KL!ePRN)8@gTbe!+z-}t5A(F-bWdjD%PlX=xnte6rAlIqfpyFM z@6ZFP>3~JrwiMz^Jj=6nTP$c`lTX!N%_3QjmD^!G1`eD7h6Dt1dQW>XFv;7{hijA5 zJ!}nKjY6{N47W5`Vun*934d|IG|M!(ahGr8_13x&;5;2rCbHW8r%&Kd{Q}_UO=~G=WkKx zz|+Ms#NzbY%WHWLIY=}-^q$HbaDHqh6fehZj$p7jN6i_h171u_>mfn3}6K zcO))3Xk$Dfjx%8y^Xz=p9|`IS-AjB~e*I8-aQSz$@g+are=naM;9o4qq_<&B;!U7m O7(8A5T-G@yGywpo8FeH8 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_add_white_24dp.png similarity index 100% rename from src/main/res/drawable-mdpi/ic_add_white_48dp.png rename to src/main/res/drawable-xhdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xhdpi/ic_attach_file_white_24dp.png similarity index 100% rename from src/main/res/drawable-mdpi/ic_attach_file_white_48dp.png rename to src/main/res/drawable-xhdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png deleted file mode 100644 index 1230ab39288425ee3a32ab8ec474b2d13141fde2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcg6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g&? zz`)q+>EaktaqI1EYrn$|BCQXT=dFui)>UA6!w`7TZi2ugMHMrFX$(x-r`%RBY-I6Z z6iwnTDXiczl~gxYllpn*Nd@cw^t&HR6Vv&&t@mMIWD#&^Flq3WNnk%6k+EY#fBBuo zz00i{WWsN_yOk`KwX$&5=bP|Y>~_oLPaU!I16VZ*Jgh$C?mxr6W}&yKO+9;N_6MCG z4c>Ev>`S<0S{cqqsI%=!Qf2vZK*(@`iyYIJ4JY>QbZXf2@v3SA0~3eA#fB^IJ@Z~M z)}G;3015~&zYw3v;LB`hXnvF7m$ME?jlzM52K_U);!>D6CP++BwOaxbn$eJdhC{)@ zi{Y=5umb~Q4|83{{_8>w54(Om=#>7@6neWMdrkzKMb3h3$%5wO_de20HVOPoLmQkM zi|zMw9r)(#*lB)ep|Qp9|Ew_!T(@1%Vtn!GH6zF8*9;n;A2Tlbxsl=49}9-UI-UkA zdme@J{ERO?yEF4V>1Ud8LY~iHl08p?+J317js08~HceS?zl&7>=!j*qAGklLd}Wjp S`?LxeTMVAAelF{r5}E+iBfoh7 diff --git a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..68ccece61d349fda144356ca660bbc4d154bf749 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tg=CK)Uj~LMH3o);76yi2K%s^g z3=E|}g|8AA7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+;1OBOz`!jG!i)^F=12eq zcX+xuhD02Gd&7|LkO5EY!~MptG0N^Q?#L?gF~>0G1(&*=kzp+4WYIESGf`nu?nS*l zXA1Y7n5cUEYFlBrsp^CqmyN#9OJEgB7n`UZ)z}xR!yfkFpc9jbbz*USr=WsE0|O%yiv{E1G)AU>d=fMMZu|K+ z=g@S=1DEqg1$HX_@Nt6MFV_j}lL4yykVD*`oM&*PX>cKQMT@`njxg HN@xNA2WM@y literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bb43e8bd3e3e8155083c05eeef03d9bd054c6c GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tg=CK)Uj~LMH3o);76yi2K%s^g z3=E|}g|8AA7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+;1OBOz`!jG!i)^F=12eq z+dW+zLn00*>!dEwO_14|aD|B@BVomHrCS^#%ez=_^r~OtdL#Bn-Q31acfl;y!^-l1 zmfKXg=}G`qHU)CS8Evhs@e(^c4gPU6>#r2cN&29Au!)zaaY@vIg9S~E^F1ElH;yp4 zqqH}7)xirV9~?R0Y*6scV9H~ox-HVyS&XI(3{77h75Cjv0eP3f)78&qol`;+0Fbp; AQ2+n{ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png similarity index 100% rename from src/main/res/drawable-mdpi/ic_delete_white_48dp.png rename to src/main/res/drawable-xhdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4c95bd5770afb117fc5363e259ee6232d445b2af GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tg=CK)Uj~LMH3o);76yi2K%s^g z3=E|}g|8AA7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+;1OBOz`!jG!i)^F=12eq zKYO}3hD02Gd;K8iAqRohhpevy4EJ`huNIucmE*YPK-ivJjw0OxN4gg&sqEfty}MF> zd+NLY?2{E${O;^{tQF8WC-Ow(yrKywEgY21D{G&x5ZqJKlJG2)iFsRGoZwiq2=cf$URo!}Gi#t-jyA5l9qoiS>k zzr*`Q5&ztE0u`o)m&dd5oO{mbV8`C@$&BHduEN~?H-4HpoLJ7_Wyd$+lVQWO>x@Zp z%xnJ0{NAMeytZN9cgCuF>@R-CJg_pE&(82uhT+t0h8f!#EatOu{QNaNlJVFc#>L;y VrKz=k004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00S&ZL_t(|+U=Z8YZFlvhToK?Nrbwvx~R5_AQcoWp;g>S zVcb;EtwMJ$Y!=-VyYV0B&V~I*gFismiXV%{>Q+&TP^d@@sl|oON-Rl`yskuMCNp#A z^G@kGS)I(B-22Qu_sn^RBpG6VTOR~K076-REEnYx3`}AS!x#kc3qP=h52)fjx{;5@ zXkVjzz#Tf-Ht+L9v?E6OVMn>j4!x|+6%M5lV1`Yq+AeRU3n0r1{n|47(*kgaFBrt0 zvycXWEMGFHJqy1Inb5671$P{de8nc30ETc5XB^I1#+=?VI@9yY)_B)aE=Rb)de3uj z>P(?yJu1&{&O0PVmJ8goo&S?Z^Z~5erc>v6*N6*j*kTrS0gT#iTi-b18FiA|mZ%nw z2cJclW^N8ylfQ@S`0g3izzwua@8m*laj`zuW>~~cD%*3MY{#u1CO*!ADF_!DE2@RAGPgJqUg03yjP&4 zv&3LFdeP#uZ5!+Ul-HYv~85x*lCi{~j2}C&zP$aePku9@s#|@z}EG^i$Cb z<+ahrmM_Fe%ujT^TqXlRwM zoaONfQyQlK2G^q4#6SzvSWUS45KAi4_w%*Oe;PLzd*Sq@p)>No5&|Fq0w4ef8sINP Wne;?e8Yo5p0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00Bu!L_t(o!|m8#OTthX$MNBXqdAh^L=4}GC|;NdhOa8< zMMR1sUGy5d2ux-~#Hen=@DJ$Cw~G#k=G4zsYbJ*-0kY`XLa z*svksnsaQEK$~~A>y4Hfpui<@bwNQN_&I*Xmn=9G7aciZ8mKU0$!}}H5N{u#!Y8UVixN>_gia08fu$BOPX}}>2XY_@m{7%` zL=8U+V8XHNDJKxhKsD4=HxF#@DvSfAtbtmnt6?7SDa)P{9004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00Z<%L_t(|+U=TeNS#$2$M3zGqNy_{Ehs`}tygo=h7qGz zTgG09vD#iO3ihTKU8nAafz+mwnnmGQAvHEC{}jZ8jScoksFgd%gF0e$R0aoO9k?p8GxD&%Nh4=RCjX8zB!&24 z{Qv=8<4>g860an%9}qwWCy;LM-kVCz%I5(9WYd?_$`swisi2f1vdAExQua{8SIi{+ zUKg2~{Qv;6xR}tw93AXTx>xL`lUoVD|C8Y}VSpHC6AV5YG z?$SbTS~{EglvVoxuNsFKrOeY(u$L*j08bis+;7P9yc9pe6?*_NzBkB!Ow89_p2K-t z0B;z?KM^OgW~q};^lzUJrJQ<`)%69 z0rb~~hvWcqnN!4<*&%9wx3<V-!G`{#e4a4kQJ3NwDUaHO zv5!;1rxr6gm#_>t&q>OS39Ntc%Q=}O}VINOWOg0a&iEX?< z9X*D<&*HxKb_j4 zImqB^A;(zoWPX7LAG^3{^f-??hSM@XOx(YDIe@kP3?K00xI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g$s z6!h_QaSX}0_x8$0K?Va3=8Xm=&)RukSZI9Vj+pv*e>AHAItU2%%VA<<{Hdsb1{SR4 YnyapE*ik!UG0004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00KBkL_t(o!|j+$D}+%P$H#S)I|-kGSh%HJA`7u08^wYT zAVvSiWkDjbU}0s0#bh!cLe#{9vXLlkn1HVMd=?1PbK4p7Yks>}hpSwNRLzyu2zHwW;tfR*n7 zns7;}_2J)Hn8E`Kc)%nw!@7FPx~6O!fD^}|^nLV^c?aR%HF1G^10l!fMP+%C=n+pS5;9i*4f2LX2(D( z0*rbUIl4xR$BdNXQcjv7Njr@=`(bw_Bo!zDMS}7yl3^DsJ(W`lND`DU(FQz6b{>fH zvrq{r7L);dKmz8ZHyBU?h9&K+c%c!esgEfACaK!f&p@lab?pWdrIf|ya!Vl%!1)K*1QH%YX$!|dXGjb?6%e8$H08ovi6h7O!p zdPhYSEf@jJtIISOcR#kj(N9yCMf@0%rB&6Z@8m=rhJ?H5K?WV9=UVeKIvg|6i@or5 zEx~RUHIk+K%hfy`V~X3-Ek>vxK6N!%CS1e!F25^^gEY$5_t9v7fOMJzRIz{xbAUV+ mkZtlac1yDN{r{ElTL2%8ev{aB*JYFd0000sr0|dc+J6crtpi;Cnwd}J>YA&9dp1? zn;}f*DdW7GZ#CHqPL}cK?A*Y9Z)IK{Z%?85CKk4u>kayBWe1q|-Hm2kzGm-%S;Eo} zre28CX~>>cHkIp3gb9=UmrD)ONwb$QIM*#cz<>DLfyJLU-Ti#n_cqh>9G3%ao68PF zzqR_qaOM`n(&zh}86HkBI~vH$;(SZS-BN%jvslK|L1D>8i&Kpb9?6AQ&PZRXkTIR@ z-C(FGeUu?y#&mUSh?x6L_it@LiuXZFh?Kh}kd$+`ED#8)1WLDr2)mzE(^KeNoc4P{ x+oKu#GDTM$H>~}y$b0l+(&l&Wdzf?1$>+CltTtOy01R9P22WQ%mvv4FO#r6!u1){| literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png similarity index 100% rename from src/main/res/drawable-hdpi/ic_add_white_48dp.png rename to src/main/res/drawable-xxhdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png deleted file mode 100644 index b12e040e08381c707280252703332741c447dcba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ(J6g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t(u z1@CyeIEGZ*dVA|2FM|RPv*D)y7YrC{G7p+NK8;_J#y6Ks!J&bHk%@&vKmkGmxtsz} zK@YH0M!5@A1zagUMm$sLPX=Cuu|T!9EGcW4z;@u%2y=%+gBG(WAIuFL6X2GE90@i+ e1w`(;#ngD<2_vKVEGD2o89ZJ6T-G@yGywqeeno!( diff --git a/src/main/res/drawable-hdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_attach_file_white_24dp.png similarity index 100% rename from src/main/res/drawable-hdpi/ic_attach_file_white_48dp.png rename to src/main/res/drawable-xxhdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png deleted file mode 100644 index b50e51612548c9820f2dfbb9cf1884fbd3896b0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1642 zcmYk7c{CJy6vuxfOEcn`j8WEXW9vvI~%c!6|Lcp?D8;=2I>^uhxG2)wtz8r#Q=E)=;2N|+)#cb=@a_0woqot!nW+_0}o z?dGPqST(H*y5GJFnMquqEK40NDRI88GUM}S|48|G15VN7pMkU#lp1E0U(Vp#TaKw! zA_CQs0oIJ|Z<`+bM)Mn^qnXU;==krOQ4K_&_2_6$PfsuhyVp+fE|d?VOybW1%hmno z?L!Xgc`4m4e;&?;|0D#qJ$5RYqM#EfZ3kAM3URUaHJOQT zD5#OHaK$xpw8N!vN!81yiOZ2bhmjb&@7R;v-*qbl*w%=E(~|x{xh~}3Kxn-DU=JRR zef&;t)+|t{$hJ$2Av;^}disTzAsLkbZwj+TxW3T+c2PzZZlW(3DuOZ6up^%_yuL4a zMYTrm%Jf{awusWO!xzur>#ejV*-wot-A-SSdndD{GTck|oQ7O1o@iU$x>eZ`KLvv9 z532@MiMbi~q--=p(luy#LGD`O6MKZpakUX+>vw67M2$*k(l0gFABjwI7TX$0aLK>n zs}MZkh`fhb#2X9UIg$CTqu?1{0>ftxpruP{r!MIVDfhpW{jr(-KjXPu5x!xm|@BNmpq)4l*@qC+j%lmv4KkK`IKOf(DB3 zJ8wz~m7?4GA2G=OwI;QZXi?1EdZPaH^JhX2knV~DSPT7`F46J_5u3SG|5pVB;rYDY zz@ggQVO?L!(Q%(lqtVYpF2s$|E^19YM3;-wOk#{DEWgRXWfUJ#NQaK;3I>+Oh#bMA zAD_=qtyB6WT6ggTOT_F{h!<@0keExW=s;uNeJf(=8F$n#+Cztn^%w&Y()9$iz|Rpg zqUo9}U!T^M6822W#;efmKp5UKZT`FHikD@w@Qs`o9O=<8xIyc9&slo1XVaN&+1bRF zxmcQpxHQVQ6rNdbA^`)GGWnwG3aR;bR37G7=O%VY`J&s4t{|#M`E)Wr91nhI6e%3s zi8F5)uy|PD&1Ck*4Pu281j-$2pEB(d8`F^AV7633*s-@J{30mlDNT$oq8m2I5cJz) zX;s(kNJ`alT_#pRaHmQ-YbH4acTHNQ)10NXL5yW>(ejS>+I50@>q^z&Dj&>xFqoB0 zREK&?rP>E-jAf0? z4(ujWdz!zJ?Jiv)Vh*V)e*GBYvUf z%JKQ9!#0D=w9YZAWU6h*SFc~a{o7G45sbHPs!us(Py$`Tb*jzS=6-RE&Px5XUq|8l zgl_iKp)3-nCR^T*g|Vtqmt$8>{4vN>yZ3;vH>LyUE&W_UCbV(b!Y)rAwqGPhW}^)C zi8*@yc+$YqGe(8rYV`$z_>f|{6hiT*Zm@L?O1bq@O>_%)r1c48n{Iv*t(u zRk(V(IEGZ*dV6Q1*Wmz(qaP;+#dbvt9&x>>yU(STHBhin*TQPW>Zax&Z0n*{={;y`<+Wn15GWY4Y=5`d07yIkSJ)I!dW3tus+z;818_U;+_J42&Ulv*yje zeXY}~>*_VHqx(PlB-g%(t*!l8WAiB@Z2Ol5&9_Q(*O|w@+--4TrQFq3FMrN_5p(|N zJV)_YSEspWz4W~9Dpj&X+;wX`-~5%+`7?s&M;R9c`fgc1-^TsTIhOt_muly+FgHb1%?Qls}zd>SU(fT zf>UXy7Q8q&gKeiV%Za&;uN=Kfd%*!L!Quzi+ja%3rN(9q9p8yI$Hb zcus${``;at-p{Mo%|8BVfkk+Hp;-S>Heb_g0nFFWZsk}IeRsnesVAE3D~{QuGF+Xt z+#=v?Wf#-cdCMgxFwRqIUc@=?53kXo$>Jw?{OuH+Z7LglKDIDRKIUXKIxftXGC`f? zgi62tgh07?h0Qi~4sDe+4L+Y!m?fW|WHLJcn62qJCriJ|_4@J&b8g!>u)yM&se@t4 aO#5xqB0b*E+@lUmWelFKelF{r5}E+1VG|Gl diff --git a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_content_copy_grey600_36dp.png rename to src/main/res/drawable-xxhdpi/ic_content_copy_grey600_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png deleted file mode 100644 index 72b3474b0bd83c2f6143afb25cca644aff91b1ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=eq$Zg=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t)J zFfhLNba4!+xb^nVMz6yTGRHs0FA|Aeb60BzhhJG)COdbm$U)B|7Z>V3c(BMhxQkhrkpEa<%v*A zDm?YoS9I$-pBCFyvv>9iZ>V^)dfD3(_F2c@b)=Rop8UnvHC$JAN#RF}`Q_ItBI3kf z#=Kh{<)xmZzm~H~do8Ec>+H-k@;Nb0a<{x@y%B9>WM<=uI3oH*M=*5i+sp;)=6w}q z)%m6MJJvV$)!AnuXI}X6Puy=4adG7?t((m|vyOiIq_BQ@=9Ui|DptQq-8yA6WB2}3 zaoq15BO-)Wy*Xgl(yF@f)VWm|a?^UWb|={N9}P^MzSa2BBxC;1*RPbm-mr`R*(Odl zHXaFsgaZvAyYVn)OqBQ@y~-^rv2>Xds&eDVjB`TH_bXL?Kh3;({n5;J-Yr&_g1QqU zemz^BWG?u5ZL-|A84TAPazAf)mZSb}?Xk7{)Z=3`T6e!}w+T&3-TTUdL#%G+{!6tz zYy4%i64d)Et%8iVU0n6zXk633z|h^7I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g$s z6g=zc;uw-~@9hn1KE_0mwuj}bIHLnDaQC)^<#UTI5b7<}2+67rc_cPCoawag&9pN2)`m#Zu461z%)M z1ywvIEPwpnF;n&}h^YWlFNDOnaKGu@5k?F1SqmN5*%%!-4+kt@UCpq-@^!$187*p^(8X7Mv$rM@lsZ)2h&23G#Rhl3Zzr3_zTw9)M7{`CL Q6X-DpPgg&ebxsLQ07*}D?f?J) literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png similarity index 100% rename from src/main/res/drawable-hdpi/ic_delete_white_48dp.png rename to src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png deleted file mode 100644 index a8d8ca84dffd42fbaab75704348af80c5102df32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ(J6g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t)J zFfeZOba4!+xb^nBtzJu@$nl5&Jpux>RqPgR;R%d5=&~Z$L1o1SkAM|lmC`tsHgYdL z=DzrRj6dW2D7=^$jkUOD`vt&lI-9Ech z4>Op*9yexLw9Db|=MeQ(oFQ$?jRI{K6xoD!W-(5Ey3*r{{Dt_Nf>uD?aATNEoE-i` zjQXPA5HeGnyqYG=09$0 zC@a1tbs1>P{!zV1cfxg9`?uoUsWrCEj9$-*C*^(Z{5CP}+ozB}Ns<>h zw@&!FCdJZtro@lHkF$Q?dAjRL!g^*CBSd&0f_2|l)(Ce&f!NwKb6~VGc)I$ztaD0e F0sv6F!TtaM diff --git a/src/main/res/drawable-xhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_edit_grey600_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_edit_grey600_36dp.png rename to src/main/res/drawable-xxhdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png deleted file mode 100644 index 21b617a9f1ab66c30e6c5ed59cf9eaea4db72994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656 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 T?ry6DCQJrTS3j3^P6O>_%)r1c48n{Iv*t)J zFtCbwx;TbZ+zs|zmtA#dRV$piPl*R9uvv5<86muxwGNH`eVBy6P zS2WnPM4q+@X-bK7{IQfU-Lj2MMS$-pQ`8#Ao_j8e$2uZ-n4YO_b6OK(Td-i_&D!#` z@_X;j{I)q>S-$+O`tJ8{&iu1-{jVe%=E|hv06_;s56Qe++NJew(UhQs4#jgtlP1@k zWth$-zG6<=tCi25O-OdLI3{Oh8J^)_x+U;yf>wNvh6cO)ehEwLBMp@DpZZp3Ei7g2pqer@etG1wqj5_#9-C~}y7m82 znci-uEe&z0zs2VHFZeF26S(dC^7En#rdRsjw41$HOkN@E^Db?N_n&tZ9kYA6OLL{C zufpn@l$w6^7{*_dvRt#}KMTLwKmWJrTKC>KwO;NEnp&c3Pp-Y2^E}h_wSNjw(Ol22 zYoR47SN=;~(~8nJxGB0o@TtOonfE{uqkBRBt|VNTp!{j(YWvKk#`_&s z=jcp`Uc0R!d}dff)Q$ zSa+czY_nhXxod$L4&|SdpRgYdG`cmJmw%a*?ZoZ>&2L(sXI|jd7cBH}hhmyh#EjFj zXW#S`gecp#?!3cz;aHoDyH5Jz!1MQXcA9OR+u3M-U1;&@ za+fcSUxFkvwck$Zu$$ngrJS2OLCEl?nn4wm$=EgPlt;AWQkOH^w0fsOm_Fva&&~xg zm${tT?#%}@@BK3)zs@5!3!;I-_fLpws|uB${+7M6hjZoZ5S2+ng~gZu+e~BNoPa={ eKu+X}{|w4&W#!+9IBozIn+%?=elF{r5}E+FX>ry7 diff --git a/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png deleted file mode 100644 index f57082d8b276aa04bb7b13ec86c539617918b2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ(J6g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t)J zFtCbxx;TbZ+zs|zmtA#dRV$piPl*R9uvv5<86muxwGNH`eVBy6P zS2WnPM4q+@X-bK7{IQfU-Lj2MMS$-pQ`8#Ao_j8e$2uZ-n4YO_b6OK(Td-i_&D!#` z@_X;j{I)q>`MoyEuJZfbxp(C+FRGu&wOWZ$NCAu%JkUzy`yS*fS{~@7X>dd!-SVX8 zzO)AKR_+i#>l&e1kmAa!fS<6|A}@e8N(%4mu#h`MHU`#~-9nuYhv z7jT(vvN-m8cf`TS`bMc6j*(~N#4Ee*+A)cKHe1X2_0}OSw?9l;$@-?8->f}s5C3EE zea7%z<<4hmxhH$%9a3wiS)31DRLQfGKg1`0k^1!;R!5w-?eBiWoST~2viRQv33Z7S zi5VwC(gJ)lTfXN$W8K~;_2OKi%QU}TKe{gd@4fG0>T6OM-S=JpQF3{s)(^WcyVOrx zZEHQ}w$#SETH}&y+K1Vz9qyX6#EI^g$duDc4}Nj=yI<5DmQ_y!PH6p=ym$4*)l<(V zg#M4I=8l~05YM9L*}n4mg0$^cWyRhHvfXFAmJ8sW&sJ9@mi0MC^_KV#&0YPB*BicV zHh3^qeXHNPja#RzWnBN}apLxdQzUwRh z%tM_G-0i73MVv2+pJ^PAf7Cl;Zv4a0rxp9>vi8a@5ZZKV{bilYN%xm%JT}>`b?pD6 zGQHhQTN>h?{t%nzzu-6DG>zlWFF)tHaC*-&nfYe}yTt`oSKbv}@Vzo-XVUzVyOXXg zQJWANXSDCQ@H&QC&#g&Y`hRkMegC}f=!?L`?VgXBO1iv`W)ywT+xB@&(ie53bqs&c zsT_TwWhL}#f7{lsi`+hCtQjtrC+&}0bAF9K7JX`d)ElmVfXjWr z*%z~(&yc+P(??$8#mbe^SI<@5cBr*^U~oZQX9MpS?O+);sgzZ@3npIC)%sHRJL$H= zHt|K8(FWWT7&vjE0ItS$OI za$CtG->_(zOHYub9fPZXr^FJYJM5P{p|p2r#&QrJlYa5PKaKH|>zqAu0%s-oQ^vbCNL~z^e{6&8CbQlXG^Huw&R7>&8lyw zbl6RZ(^Ae|I#=i-(6gya*75`?soiFA^M^7W0)r(pwHHt6xEZ$eVi1J+GHv@#km%tl z9Y4!XCa&!HGB@U!=0pqWyw$;yFK6#eTI%vB?`ECuR71tm?k<-grLzC`_OPouFsUF= e5RfDG%Kqn4P5DbJ{@(004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00MAHL_t(&-tC&tYZE~f$GA*^?>jW+CAVzE=gNm%VWvwb%QAoa+xpboF1$tkAgIdWWAqwZG$o+dd;xehj;;B&O!#^xv8i+Ul6<5l9j>v&JoB99eZ|!gi`1sbH$Vo+ z039o!mgv0u`apG2pt?TLhA7awehF)#f}#-4HqPl^dbV%@H6fhYFdX!_IJbC{6*d#Q qp>FamZ!i}%XUcqGWq=Hju>1iAuTa5a>{Dg{0000d8XZ!-4<<)p?m6D6=k0x-&*$^K{``KwACjZJ)wZp>wgLdK&BofoNgOE~+yWM> zorC64aoFo;?PLc4*Y*QI;-3JpEN&%^0zjlL0F3zp04fgv6vJrsXH3L{P1w^`7Qi}@ z+|eSgq{6J-2ml}r+aL%ipeX?WxZcJB?Hv7K@{>iIM%KUe7E7y&7OdKH_m!vocY2U(#N{$gO zR=-%9d{){bs4NsL92c$8o9_@B1Tplc`PCC$LQ$d6|5y`x|K> zWy()D?snSQ7T?!nuhMDYgxRdy4mOXqOZB#lYsQ~ig%J4>J(wW+ozW7a5pw+7Dn?jg z?@bBJx4S!ZwXTnAI@)?D=N`^>gvv6}NL$k}>+I1<86voiM>#~$TdA{E%?xc1V|%Ls zG8)QDw`flfCJVR6SbM%u&Z_N=rPgHsk&v(co{+idiWSQjt$@6_%)_s8!+WCHEK<~t zB4%>Df6J|UQL(pQ;J3YH!zx6Cig#10H!qKO|0S#WI|cS|DgN%SxL>F&pE)?LczNW4r@t`ab$hMl`fZ6YlD(qIa$oY`MPfGU z<5F9v>^BeHm=uUwRJY86u)Mk?sod`kKe(7UycrQwJ5%)B%S8&DQ7VlpnZxURt{cET z2~e$or$ztW*v6%`Cd#y#N1SX>L!ZbnaO{d? zVKw+#etNhkp)0nzM``{vgwlw*xr`_;IEcnNQk1i;rZQ7yBm(;0zz3fcpNXeQ)YbuNU&I2ou+QY)nZTp=ykSMS~a`4Y`p20 z?RVs6@I5OaPGyFiA;x5g98T$9!oF?^?e@{2QqwzJ_1PHPS<`}ITH!?LWx5U`eh4$K z&wP;lYDiBRrmdV~#dPlN^`Xu*1@I~(MwPIfiO7|AYFCgQYD>*bFBwKmH1dO82%V4# zF*fnZ=7YP!tqq~hGshYTUUwHK8BRR|@V1&&cx_nKV|WcE`RSAy1hRJe`GGg_RJ8VL z@CXwtTNTo%@MZbDBIKro^YdHu(E0i7>Vd_D196MHurWzP*X1V;Swha~Kf^xjFyJIK zIec({Fq4Lt`qlDRfKN7U??(}3ssRkib+b9N1YdO0nz#lng|*&hNg{rK{6@l7azt0l v>Pd|MZv^7rFC+M=ZZd7+J^jSNwIz5~%6B0%YoDCh+5j7jy~V>*zDfTAKzD16 diff --git a/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png deleted file mode 100644 index 87ab2d6409856edb6de19d330c8586c19746841f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1704 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 REQA06002ovPDHLkV1hu?13mx% diff --git a/src/main/res/drawable-xhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_settings_grey600_36dp.png rename to src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png deleted file mode 100644 index d47d042e6dd0965eb656b1a7ba0c61d8ecc0af19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1486 zcmV;<1u^=GP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00l-#L_t(|+U=ZOY!p=#$2)BoD4_U}AmKp;1eUr9#=aOd zC55C_n-XK|#uy;+1Cyo3659V-3<@S%i8e}YVl)~*LMU6Sfye`*K>0G!2Sp^BsEHDsePj>VK^E8% zd%#Yyz)sr&R)k>|n8GwWz+y}+g~fJ&J;Da7wgU`outqz;-e-e-Xb0GSHrT<51S`Q> z(n~%Wf3v~5Fqv@Y#i&JzG+6xV6#gBa#8l6#X5c0Cu(1>r{>4Vz=y~6%cnaS`L17q= zNrK&g(;0*4M=N6Eu8Ckh&T2u8L@(-GDzq3{$CN-_m@Wsl#bp>ru?ka0uecw-8bOW3 z3EVe&&nZ}qZ(Xi=T?%X-E_w{34{sxi2(~clFaP?i35AGatLO8-h`BOgyL?}LB^>|w z{C%ec*mCh2rzkS3pldO}n&6{a24^vA^1pjW3#Gg9*8XoETECMdM|c^!Q3 zzL_Aq-Kdd}A}BP;HznE#vM>T`Bq)3$4@Rk{YmC6+1clx5V225^QTHoS4ZYX#}=`pzyIgSTkvrF#)6G92CN z%ZLhxF-r=pl$7j@{6}@cIvB3k5(%(%ton8c#hUxChFCTFb7o-Eu!CIy9?*Et9CGz= zEw*LZmf-_7U$dK8pOY+cd>qF-y{1IJrp1y*B@3$xgPKa`yp_DB-dBz6w+jrkDkJ-C z7@Ilv+eU$=Tm#`$w0wU0xwN=DeP+m*#*{%$jNK($#CF-Vqs-;WtLxJLJ6F;9EJfV!btuzvp?=eFVQ*f%S`5Qk<<-U;|jW zPUf*E@L0R`QmSacH?Um7eBC5?YoNj2)X(m3!kNHg^<>!`O{m8bfdzZUbR*{RKw|xX zeA5cLERbLiNO&G!_!JH&#fR;8$CQkjGskm#`Wd`|yHJ45f(t_$FC!ld(2QQsYVUR_ z`>n~fD0w_%=UEAkiD3PRdoxbSJmFf{ydvi-P9M{S?!#LyE%X8;472ubBwYHHi~e`C z;AD0ahwB7aU#*^wU}eU^kMXWnlF^7C+c2-sGT@@o!ytoLA?@AYgEhFDWQOyPS^Y&a zu48zbG=iKRjN8Ws+hfOxzxUW+t#*L%cShCO0meTrTxkaw|A6+?wdAR@MWM1eQq z|7p+HA$YqFzqSXA_o0$^?E&L`T4udHV2{ciya^uI9gK!U8nf*I%flL?ztw})xfwyO oz$QFGun;T+3&BFL5X|Pd4CBFCK3xNn?f?J)07*qoM6N<$f?0vHX#fBK diff --git a/src/main/res/drawable-xhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxhdpi/ic_warning_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_warning_white_36dp.png rename to src/main/res/drawable-xxhdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png deleted file mode 100644 index a6e5788ba59741c2e137969f4428116f0c4252cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=eq$Zg=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t)J zFfdQ@ba4!+xb^mqwNG%M%<+%$oS7zx2^Sp2Wm%jPJ_yQQ@SNLna>LBLwzELuRmv_& zv%_gOcxLCkTEZhG&&(?r6H#)Zv9YB^;MIa${k`k|d!M&7e{MeYc5(hE&*^ISr$n(| zjnO@%qyt4Bvl%x;*+$6bmKe1DU3G9)1=E7gu&oKpKZ+_dlo|HPhc@Xx&U+ua*lI)O zp4WTdJ+QjAic$IydyLngzk=a~5v(_C<}F>P)5RLqYj=67e|n-;$4BY)4V=1x4k z?1SWC$?NSxiihMLCcf-E{_xPd(7Sp0nW$85ZD6>} zF|If_Ep*$4roWziX8u_}nP021cT1*nOGnsS-mqEwkX>h{j857l-7gysK1nca&RN*L zbh7ie>5reNJ5|1#6de&(w4q_;=2o$3b7j65ly19l@YAGbR-c)=B^&-cSC0o!l8_lj{L&u+>$->fJzg$O*mk2@*tDi zDKQ}leajb#i*gRO7fuH1ouK=}pswh`VV0Xs+>=$d}7Ke-9|U|d+>>ApA}0rh$<@BI4LKP zXR%uQ|F372cS6|g;v0Yrmc{Dq<{J(n7!&y)tFVV}Xv&$${#cd0e8U|GWBTcnVmA%) ziVAkl$(hLeSdD%A=`&)HK%W)t?a7(g<~gbPb!tktiO(dNJNi>~*%CKBc~G}9$B<*P zD!aVd1l_(vOHLka=S}HW@tG&{=f=dGi7h85H|u++blU;FTob7j{Uvc%yycHgaob)T z+OogsL+aj~i>*H=%IJJEk3RC>TQpHn41p?t^O`9|3p_BrP!G(q44$rjF6*2UngEbC B#6AE3 diff --git a/src/main/res/drawable-xhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_add_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png deleted file mode 100644 index cd32f0a82b21aaa2ddda9bafc79813aa0818ba4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 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%0A8qP8w^Vf zZ&?0NKePM5+E;84S%bDLSYY%lyuiS8Vdlg0%zqpj*+8MwP}{)P&~WrNdxf3{vyP*} z0SPXISs~1z&|DyOo;8z!5pKyF=3mRJx^B(-&L-ik>j-s%Lc&Lu8|)ddz^_{V(`LbI ziB~%nV5S}5VXBc{1#>ajO*541gaS^hGi6nJJLn2CW!=n>F_J!irat$u{HMR`bDjm5 znJ(yK_x+fCV1x3DO|uJBzt4Jnz2RZS%;KMk>M=*#V{(P<8J&;TYrem=cS?hz*!<6x zSHB(I*Y~da)6TiYx$FO_-t3d@4Rz~(`d7~OH2bus^7huhOxKFL7w?+A z;fFVC$NrFpAKu3UK2A4t__LJhNW2ybW!2WTe+%OyeNlyfK`7KE!;n8qc?IfMGJKrQ sMGWG+|CP5nn;Doelj)T|Y-#$H3%GgbEoA@#Pgg&ebxsLQ09gHh{{R30 diff --git a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb62d42cc29809e63fba66881578e1b52427587 GIT binary patch literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcg6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g&? zz`)q(>EaktaqI0JLq8@*kz*h8C#(>ebFhNRIk$&%>b%1*wy7K|ju2p7ne$dhXGy?g z!JetJB>EZMVzY0=9{Bp!N9~WiXp7Ii{>nWMby><6?N|(SmKM{NE7w;a^U~h;*Z9@W zezPlA9c8Qo&imG{m^;IJg|z>#%7!qVqrog5N$;KB-e8n2WZV>+QTl4%V-+@_D}io$ z*19q7%H?Z&Ok&bj_={Vd_;Z$fCEKfvl-*1wD$FtiJRuGFBD=1n~ala@J!jSUiJoA-rJi0 zO!xVf@qNqUKFQpEd%%5y_^-Qs1@bHf>Fh76wPu|(lD)w=uSfZ=Uz;N4_Y7 bH{TD|SNA3}d^^u`5@fljtDnm{r-UW|KV`;Q literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png deleted file mode 100644 index 435c087abbf580a64f51729d7a96ffd6ed040b06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ(J6g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t(u zRTOx-IEGZ*dVAO2KR8h0_{aR!79Q?Sha5O%UwRib9c=6jan4iOAenA@=$s1M<5iu( z$qQ6!d25BE(hU3zn7UaCNavcI5nJ7-GiI$pM{i)oi^HFVd%oHjFEAfUVdaol4==Chad zto_X{lO#Sj> zei;kc&M(p`2%E{xJ;f!gB+T;=ldfC1ihe6=mK*yP0kI4%s|7DN?7eYhZuI1j&+q46 zR^I({;+v;#AP0h7d4fX)=x9z50e3l2LPY>93nGjlvLGc`wM{jBSzaD;q>v442)aqi zP}BeWx|J{gn|f;PH}h86-|sgVzcAT#vQS9ug@M(Ax`+jFB@TNxIQ))rKU(anu5&@~ z?urJ!ACkXj+<&4ZHP3k4q3e#v_jIwnP~G2F{o&x`z<+Pb^(v$o&r9!n7V7za)3M5f z;^Bvu+eG);&MM)mS`@p{eRA{dJ(K<|z4tq{uSHdChTJ>l(BynAzZaJm8{au8%5)+x gP66b!Ui*56^V>bn&8S(!15A(%p00i_>zopr0F{g`;s5{u diff --git a/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e218123bb5fd9b9c893c4ecc10fb1bbbb2f917 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcg6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g&? zz`)4m>EaktaqI0ZUA{vO0!KfFGw)?%YkVo_Q4q64!9mdEDI3SWL!JgL$_fH3hizA# z6195cw^`-?MeTd~Gq*=>yczZ1RuX777&u5Zc+H-szJ1jt<}Lm5Qw6vay5%PduqX7( z_g;{@P;%D~tZITt!*vY?hPzWNnW6d!P!2{7QMSi_Y%R(^5bf-Kz*{;0fM>D$fjIAc zhlTB>{=9#+zIFQV3)~(U3LcoGaHWD|25J7%V)m% zWZcD%^PiTTTeZF+{%63qU-mIoe{{nfiuB`)mp)N`@i%q{r~3V(fKR{b_y75EdriZW zD7&YQ8$Z^ctNZunke`KT-E-HvDN_H{^rL(B-;KObI8RLJ#*@g^yeYd6?$~}#J-d_B?a`NA4$JKN54*f4TU;kO_`tCbrvd?n6)#txuQaRacbAGbT znYnjPU0oahdAa3DEBBu}{%l(<&XD_54kaQP8U%sK5GiU6eEu_}e*L9se#tSJ0SG)@ L{an^LB{Ts5VA1dF diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0fd76f6216a0e3bb12b25442df5c51c4b49c2c GIT binary patch literal 639 zcmV-_0)YLAP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00H+&L_t(|+U?t|PQ*YIhT(55k}E)CP-sFzg1}dgjebUb9PtwsCb#EgFIKTl8aDW3G z;DEmXIKmj4c*GT^c&iW4VDhy;#{pjI0<7jo5-b3I=0_3ufVTVy0vphkFD7sSefdHH z6A;Q55qN+-+=z|~5UihpAi?$;SQ7T}Uf&d2-DX|Kl?SZjDS>d04I6+4$JoVPG~pF% z766OXhXlecw)uc%W<22#*KEM|#5lqPGxiw$ohK)p;F5hKYfqCAdh^Qwx-X6}A&_4J z(7!zU3Bml~0pS7JO%UV{4UpYs+XPl_8&Eu77eL6@1W@wz0Hk~^04-k!K+M+wQ1kNvR%;cv54CSW)Oy$P|jOE7y%;m=c4CcoGOyrEk)IAQlJ7slIluu9aDW3G;DG-P Z_ymJI>_HjUNHhQd002ovPDHLkV1jrk0aE|~ literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png deleted file mode 100644 index 1361eedcdae97ba425432beb5f864c9b73b908a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ(J6g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_%)r1c48n{Iv*t(u zRUGqlaSW-r_4clPmzbjf>jz(v9+u6bA%F7Jb28>0$d;(!OXlSXGZ1PH-P6c+y6sic zhPo5y%C7H!8UD4x{Dl@oqZCMUk=mJOfF)ygw2Un_fDWGj4J zY%6$NVk@q=)K*M!nOhO!GQ*~SiVc_274;WWr7|XQeCP2}a;odT+2Ln>#!+lh@y_ds zleP)$eX+6oW#_$6CaV*(?ORvrU+lMXs6T#a`#Bf;)eLui&hB%0pUohvFFMa9U9{of z{hfO{?0RFl71u41a}ocD!{SZ`AJs;)3UMgBIK5VoEn%aUfFIIx*-LT~!)7mEL$>zB>TRVq-BpQo_M%SO>7oh(^Y%6*RD5G(dUTVSqf1?$qeoquqfcF&V}iOc$0T)rjw$Ng9Mjao)T&7AV;SI;2)4HE?}&VVL^pBfHkI$GjnZ$HiAD z^s5JW%GobiWE1C*T3OS;^|^v!>a&f^qR%%nO?|$R(e%MahOG}SGP{1ViEel2zS8E- zex<{m`AS#1+zQF_Isw-6EElxd7(3`z9&4QSsfTInQ%TmW)5cs^rltEUaLoJL;85|6 zsp;WOc8-p8{ss9SHa{H_Y;HOf*z9y@u$k#F!KTt-flZ{t1{+I<12&Ql7i>N{Jg~Xw z@WE!I18ap+qt}NcjG_-anY0cIGlz7jGp!KeuW$2JfG4pd0`RoPWXLk>WIkV=eOmeC SslW`uz~JfX=d#Wzp$P!)6-Ju? diff --git a/src/main/res/drawable-xhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_edit_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_edit_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png deleted file mode 100644 index 736806495cda3ada8a955e409798a33cd73c690d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmbVLZA?>V6h61TKtBM9B~aw6QcD~tEx`m3Sg#Ifkq--70-Gc4Aafuzkg1hHXk55q%D$2CJ0PTm;|X2rjt!(yHPH7x4R@u{55~<$8%1ebCPqO z=f~5i$dUPQwr~KzCqtf^M|aBxSU6qR?sb1cH$kyHFB_mb5&+c$tkWa(1mLIy;He5= zcRN5}rRiF3GQD6FWy(^)eX?o7Ofz<+{O!X4T;2vSIAh`iFh?^|_q zP#vQ7;gB_@YygxD>?( zKmEC1!qQ5pWjTg=moez7WmZvb2`4SF`YCuY6_+KdoLms2W7PM!S?h3e6hikdhVw6$ zBHCQvB}HdQ4}1i>dwapuB}M^cFz-)%I!gbhK?m>rQX!w_63ebh);cH_$m$ym7h)b>+_-U!hqgkTghK%GR*ftsNAy89%XmrRx-l5#ooNV4A nsMYQKPg7p6NY2YheX|lDa$6K$S2dqYM-DR5a#DNusto@CcT}=U diff --git a/src/main/res/drawable-xhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_add_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_group_add_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_group_add_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png deleted file mode 100644 index 7e9d67f631a69c226b802b086f0f4a43e836fe2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1935 zcmb_dc{J3E7yr(L8N*l}&x|F_vyO}~B4in|&4`e(L}-|7)g!&v%;>#lvi*j^u??~` zXrfXEB}I+oj4&Z7YsSk~O7<;Yz471gch2vx-}(J(RUIrrXk?z#7Tm|mW)aF`kl z0021N&B;d`+x849A@*BuZ?ePz74GKa0RS{T0H7xWz&CM<{t*CvGXa44FaWSF0sur@ z=@V}oF##sIyE*|s(z1noF_MmR3rqk28Kpe~0oO~B004pDog92AqYGt0=ah*W0zR9| z#WC(<9_m8f3{eG@E*Z&?9&^*+bnrz*)-Qj7sz5(8pQ#@3Vz%GaQ%h1aKx&~}Py@&+ zBd3@)RH5H5sFbGu7RT5g5hTeWBC+?&_sGb;Z-4AqMqZ7a-Q75zc(%6~uVmt&SLT5O zDYtn6k|xSHkgTK^aO{7Ctj%PfN#sRSxGpjcJdIMv9lh?Ikyq31aJZwbr}I)i2U?}z zpz>sDc3m@mTZuh4&0Aw14AizNFQN`qbemlnKfilr1jEnp7$xUT(@=H9SuThEtf68^ z^y%uGgR$If-KW{UcUOEoaTUAh`kMroQ}0ZO#f3iL?wcMYk33;RE%_1Fm@HAt)@16R zZV=unCy_(ap#etAb5Crdi9;de5EvAlcj2{Lb^fVAi<8BOnY>xyz7klx#0a6*<+x*6 zy)PW*OZ5y*|Cq55^Ge=n$#j6lwey{|G78(TcYB4f{GeV~-Q7AS$UNy~=NV4NHY!R+ zndMuhGw;|$CbrSmXCYbv;h0q}w(qs3f`GcV$rz)z^pC_cRV_K)2@fEcP3|`1Oi?V_ zJ4KUNo(@dCbhI_Raxzxy@?^3o@%pYU3L(EOC}+w}-8gf)JPCYj`(n1yng0 zdbz-Eg!i{USxgAF2?t__L#l-dUN}bGn&XQN!)_ah_&11w!4d;j zg59{1)V%3HoJ_pl#@!W-1&{}22=Vo(VD|cbp?C!V)iRUOEtFD5x{laaxE0Jr$peQz znEy6Q3s1;g?%%brNs|PEyzX`Hs0C$`*#@f`c9I|*D2u`$R$ss5&2kq^)jZTp9a+*? z1mTRzR}Q=D)2!=O&?JTGtkky7lzCsaJs42&QS*^xsACDjf|(`(Zca$Krs zXlzJ6)j%7-`kxBF|2bXAt0mWAjZ-9Wf|v59Z`Yo(c(s3di_b=yo;)p?ok1*_3B*6T zb$~d-ih97`JteqBta`MQoD?YPm|095te~cCrik*!MAaFYc?L=U+DtVtZu=BRQu(*< zbJ#_E74A3P08+tddIbOrL({>?d&wH#Ke5`8toA4tPC`-E*#es*%~2ZaXY@ol?dzSw z^iCp5opbHfgbx`3S8e{4W~%6n%*M!zcJ}GVX}HECUE_$+p?+Gd7~iU?AE+=i!8_dm z?Rdiy|K2id(Tf4=lmF0ct~#75`SH1_?+0}a*23@P1{t?bW#Nl+IKc3 zozhp1s*HE+z!Fj+CAI z6U92hBFj-H;q7-FT08Vv))Ce;^|ga5{iCtW$R!3O1mU9h41&4bw9UX^%=4EvCf~^l z-COB_aaN7+F=N`aEt>+WDpLs?O|082Uc~Q;=)bR5^L4TJQvDCFty<1i>b?d$ZYf>R z_gLSeS(+W16zjo%SAw=5+R^P6Ve*{+I850838F?;5gDLq#m_8Jj94cDytAj%eaEnC F{{Vt!NizTd diff --git a/src/main/res/drawable-xhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_group_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_group_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png deleted file mode 100644 index 2a27316be64bf69abeb9fc989f17640b25662830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmb7_`8U*E9LK+dvM-qop~x~l#}>-YP?3@0j5T{>%Mu-ojE2U9nuMr?F(YHC$Cgma zl3jL#%Fc{+qA)R(LB})xfS&U_KYZ@z{kgBtIiGXyx#xY8khYe>0@4Bi00>*b&Fwk4 z~gm7%K&go69B%U0KhOC03^f6^>)S_z~y6Y zX$~9^()yb@6@M7q6%7D_;KKj`IbIKma|V|U7? z*y7b&c>XgK{~G-nbh0ZqhS|R#aG#EO|CvQXH^scfP<>x^h&|6J@?sqQ!*IB$f9g;c|wCX-c;?1d>I>bJVgl7Nq8dG&SjftnunZ(!t(781u)x=A> z>R>jN%h^3kqW4IH-Zn?;y1tfZcXB6vi-d?n=~j1BkR&0K=Q{SEKH5kfGGqU6M0=X&nrRlGD(b=rx2H;EyBp6HOmU)L`Z zymG~=DMoZ0g5A!~Q7`Gitb?4${*gRiC#jBD`*bFaTUwz6Hr-O{xY!`*A~!M4-gR6w zx)vY2V^V#zwvDF(YD{nBRZ9!|8F)MyoX6Bac^84Blf@5JRFSZz>IP?Yuwp2lm^6ry zM4kxZM!;j68t@O{GANIE7Fg@}Y1t!@me?lGLq5de9*9HEfXmEA&a-BYkRQAS*+OA- z&z5|+3`J{$eY>Ewwvsgy(_-+*d=$vzEpEc#xYoI&EJlF_`^U^!{&*EP#q6i|&fX;0$(E3-nLFft#|K@HDa2+EAvr^x3=!v+l$^1IGl@An4wf@C62Hgf1-j} z;7W@i-^U~+?8E82`P@9b4Yq96zIEiF-MI*63Yu~Z7$1%=jT?IDr(g<_sp(r=G1g0t znk;nAA?}+Smr^?4xnn53n29o7Ei~uSG|NBfx)*K>S1E7F#B@OYbWKM+pCmZgoJ`LC zh)_Af8#&w)Wc#T*i`*=->01wmP%&+Pe!~aiV|(0JvO6MgUN_XUv(XuG)P8a-1;8%P zoi$vcB#7YVgw)>-L57KH-l`)AKVylMA~G$TbwJmAY}@Tvg|D0Ll)X6+QxlJ<#r~CSbev%<{J}-meP0bs~-YzI6_*LWNyW;*4KT5Q_IFO-b-T1 z5{iSOxaF{zHma+1;G3?HXfFZUk3LcCL+iCO*5IztaIa>9Eq005AduV$_BoT9>^0@> z%dJ|>>K(ijjBzV_@eJZF=F;kwx9`zD{Cz@h>UZc4VgV2arQHFcd*s?|t-24$AEIZj zaBbgBGu|W^=AX=zpou7<>MU^+)(N*#ua4&sgZ{S2_~Aq?bPJ@Ytnat-gfMCl1N-WQ zslEnjIgVT1NE(}4v~ysV_p*P;=C(H4;ORm(8>DoPe9drne=UZ111HtqV35X!we@se z*yI%-YN5Y%-O=X<_1hBHOHLtjcivI^yM*yAx diff --git a/src/main/res/drawable-xhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_import_export_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_import_export_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_import_export_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png deleted file mode 100644 index ea80bc00a0081d1aad62bdc63d7c9ee5d9d24de5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE1xWt5x}*n4DI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=wSJlDE4H!~gdFGy8!&&H|6fVg?3oVGw3ym^DX& zfq}Ww)5S5Q;?~={k$$%mMA{zei&nqbcPo}bk$LZ%36(0!DHA>J9)9T>${E5`_=*49 z$KO$}cu)MRohKzc$>FezP8dKg?fD)`%YnT^V-yy1yrH?fQugQ`4ny>~~wX zE9YtCsS9ytYzohRoIRt)u;jMew=iLbOF7Bb*F+kA+&*$Io6X_e$LkFW?;kEN^D1U| zlw)kY)so@i_MM`cj6j*$Gj$m`w(Gu`GmW9;=CrareukKRwl`GQGMuoiYiG&i-@Zv; ztu5n{8mF|ieiQzdsFd!tk-zNmZ8eu!7WsGGi4R_f0@qey(>UzHU zQ|_-4P2I1%@)yg;^$m01DZQ(e=e*8)Anxpm^bZoEJ06)o{PB4DtXsvbGQam%&VHdY zPskzso!Xxzvs2OwwL_;WToWz0Q2NN&Qf2o&uX_HB6p8&Mix)x=C8zxI*Z`%Csefh%k_uBt8U;O!hLGj0LjhtOFJC9CRcZt?f>j{lsE+#pCtA9yj9CE%=wIb2)89-Sjt2g_lkyoh{d9die`(x$dxo2D z-hA}Gy#AW`>%4|YcJCYwbo{>_A~6Iq=T7V=AXrL zvcK>aa2?cm&$XBNgxmYR`We-={}@vaFMcflBtBM_p-+(K)P`+U3@6zB_wJAHn|hVi z;aa`vzqrV2q4EvWS@wQfv&xTQQ{2sC`Jy$Izf`}*{fVBm>c^*&@Q-|wz-)>aE#Uae ZnDg5<=;G8{Yk_gj;OXk;vd$@?2>^nMmO20c diff --git a/src/main/res/drawable-xhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_lock_open_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png deleted file mode 100644 index f7652e609f529f5df131e30c4a8b1215f191ad9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1872 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 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png similarity index 100% rename from src/main/res/drawable-xhdpi/ic_person_add_white_48dp.png rename to src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png deleted file mode 100644 index 89c1aef24b5515bd6e823b147ff7926e9b4c8e3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 zcma)7eLT|(7ys>dy);X^c}b139*i1mk=Hz$4BO4SUOXDcWFyV!$`$5Ui#4g{T`X4N zc3oi+hAVQ*^stuRu19gpOIwlE6t(cI|L*h0{d}H3zUO?-_nh;``Fzg#9$rv@uf85i z4*&ptGKm1lEH4&Ue`qyy)Kp1`l45$!n1OOdZGSPGYPyd;_oW(eB#B5+s z+Nh6ccxO9#qocl4axPP5TO0k#GWOLfID-Y?CsEclLKy&m#M9>2;X4x%?O z&?;n6n;F-=cmj57) z6oYU+uoY&2wj_XOv`7#ifPZg*hV2C{2_#5s&EF>1R&ABGH$!?q*wmeMzbOGb6_~!{ z@c3xtZQYEMJGt4yU@4`}VWw`is3s>O@met0ZCUC47~g4L?Q$REB(sBYtjngm{iJ}$ z=-u!H#fQ(CMY!d=g*z~YgMG4s2J*eH?)0+l!n1bn^1kFx_SJ?Jxu43!yV48Uu)UGgd*e~mfS=bu<7@IGy~O#`BYz~=E-P&+ z{nLnTh$RW>waUCCQ;3ttIaGHbgJ+brS_>ZYNgr4<$7#~gIA#Pj$;62E>kb7sv8~(` zK5N_z!F%pj5KB6RZwIHXQ?l~Qgp#2nZilf{ag&1UURn>XOkmsf<)>9td5!G%WpFo^ zS}?ERQa03sjmfQ1X!0 z$uQpaLj-R~L>u>Q4Ld`)S;rYUJNKd@`h?!}B_N4H!KZi3c@gXgkj zZx_bI-;XImVokMwkH|}$*vLoeaXRddpG~fZj4Ge=66o5oBQvV;AX1RT`v4&i(eVDC zaW{AiW8pA-@ubmG`N|`sjBKmcMLqd^|2n3fWNfn5Wx%wDy&C0Qv@*UOEq~D|@>q@f z4ypbzpzBghgZQZ)RItn8G1uYE)ncbm-S*F=Q`;hyRspxf3uElSCG5Dv7Mf$K4`Tck z&gSF9;c~h%(JAy;hqx30ZOt5}361*>8wQ4W8gJ&f`RrDe&qjTD zp&8ZH_Q)uNJ6L_C)UmGdGtn0yU=Y73o<+3uCr%kUms(P zJ+{zOXH(64lkAiNW~aR7^2Aa}6k}40&T$DYV@lT2ZLRWa&&1^F|Eap%nv!o}_DYzI zuvZOk*43yqccWo~(Wfj=a|sq~ZI zD0ru#WcNU;elM3NbCyz{by{}4Q>f`prJt8N+fF@{xV5RcN5NdtS*!f!*wJTwZcp`R zd3n)B_L8V{=t| z7I;s&4f#?>ozA=0!+v{*;D(Jqfmsf^x7h8~X=ltr?)K}xhGSJ+8Xi<0B53;u)S3S< z`kMJNwM z85F{1o$w+gQKCcUu^g(_+A9U`iRTRSU+)dmdFgCX#_qV-ekTN$W2X9&$~Y+NX9VP2 z0XGosm-*5U`27UbvFHA~!~|Fwrx8*V`0t6ew^+h4Fu`#NO3=qAoDi=B^(^eD`<39k z^R1BJPr4`hs=w`8Z1i6g_J2i{m>(A68l?UI3-4c7tM|kTj8;jzt{`2dXg&)-_6{I6 I?xmjoFC=C9-v9sr diff --git a/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png deleted file mode 100644 index fe0ae13aae3e7af5b8c0f656213b125c2dd78fe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2312 zcmbuB`9BnT7stOdwzMZrBZ`Of5P*6e)ydC=X}oj{hVlHBVATzK4t&_tG?bX(=!r(3r2rde@qm` zok7S^&-4xe0b&5)!T|Vr7U5O_@R0*x9SwkTIskA?cB6^P*#PQbsCx^XM!xQEJ?s9! z=vjLMz{2@k5RjS83jhqKe@nw0`(-P~-`zr+E7H>sDf18Ryc{yhOT*l}$i}OXFZz*# zQ2nKzT?t~}dzkRE9ylR;uVU%0D(=`S!Z1)}G2QsEwKc&3 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 JPDHLkV1jzQPhJ23 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png deleted file mode 100644 index 8fea47f60c027ab7318fa15e8505e6e5fce3a1cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1978 zcmV;r2SxaaP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00%NjL_t(|+U?zIY*a-Q2k`BKT^8(qV-HFkwFBP7E}X(9wI?VQo{l)yknBZ#giL|Y^uossmsexqY!!M59Q9$W z#D#`W9Y-fKKnt2AT#na$>cw5K6t!$P(WpfcIww442(O{M$!9(=0hFHLOgN8X436{n zc{t0C6OA*N80UzCQH=8mQ2XfzTJMu^JxY;_b}^VcwBbaf1ic%M*ABTTMZM2oZ`2Jm zLg;%fM1KU3i%Z&h{<{ypi~t5;iO{(^QYTO{Dg=|R$3Y`F(KzUP-o!?w+;fy1&}5_k zw62(@3#c>BSOIhnUGxAgvw}ymA|TE)2sf<(s>4J4KwGTg@!(-AH_&rd@p$ksh7%~2 zI9byYqgt#HLJa6F>v%kPn8O9sHD*L?Q(Q!Z2WYjGJRUr(8LzY-iiGSTie_M8IiQ|7_a|o#j~gJEaJP+YLUlP?ih~aOtH< z9mjCaieebs7?R>yNHB*XlWhod*QArNPr)C2k@Bd=0`W}bQp+MuCi6A$ zjvPqmt=mvjgQwW>94oNOqVSGK14*fn=wG!t6j1>DFO`Kq=Bcut9d9kYomT98e1a3gA|&yTq=U1^UO`r2Rv- zY&EW}{mk!@OmF@@e^4wj3nV+#C}RgImma7Z1bRpMCe1xq4NDJ~Zz10d(0$mTRBD*Y z3N%A0hjsEZDzb?UR&M7!zzU?g5~K=)bOPnzGNIVXw>i>SLKc_&CYmWgDJUcs?JJo! zCP`H;`$miQi};K75o~9eY{_QC4JeKD z+$`GhG2N%7DvTKhmX}}j8%XhU2xvcx?Bb zAeUZ{AP>|#!TZ6^q7Vb(ZclJhX;WlcWwo|z7_4ly%Si8e{TJG!A5HEcLnP$aY~c?MR*^y5~mydzO< z3b+r}<1g&+-DW#p*`$bt=R>J>zV?`ioj8Us(9>iSr&{!40qSNlXR|;_gcm?YbF&bQUQ zM)Z*VK(yJBjrIc-lYk2C2bw_wnruH1?RDxS?FZ^h0_tf$P%>def7y7p_W&q>Pjogs z*#H#6DuvDBE?~Lek^!55T2(j#2jqYpkOOi+4#)vHAQukE0cnVT0Uh-&u-#LB761SM M07*qoM6N<$f-(hk8~^|S diff --git a/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b80446e7a51cb93982184668cd3d9fd6fdb1eec9 GIT binary patch literal 887 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 20sp - @drawable/ic_group_add_white_48dp - @drawable/ic_person_add_white_48dp + @drawable/ic_group_add_white_24dp + @drawable/ic_person_add_white_24dp @drawable/ic_cancel_white_24dp - @drawable/ic_chat_white_48dp - @drawable/ic_content_copy_grey600_36dp - @drawable/ic_delete_white_48dp + @drawable/ic_content_copy_grey600_24dp + @drawable/ic_delete_white_24dp @drawable/ic_file_download_white_24dp - @drawable/ic_edit_white_48dp - @drawable/ic_edit_grey600_36dp - @drawable/ic_group_white_48dp - @drawable/ic_add_white_48dp - @drawable/ic_attach_file_white_48dp - @drawable/ic_lock_open_white_48dp - @drawable/ic_refresh_white_48dp - @drawable/ic_remove_grey600_36dp - @drawable/ic_search_white_48dp - @drawable/ic_lock_outline_white_48dp - @drawable/ic_settings_grey600_36dp - @drawable/ic_import_export_white_48dp + @drawable/ic_edit_white_24dp + @drawable/ic_edit_grey600_24dp + @drawable/ic_group_white_24dp + @drawable/ic_add_white_24dp + @drawable/ic_attach_file_white_24dp + @drawable/ic_lock_open_white_24dp + @drawable/ic_delete_grey600_24dp + @drawable/ic_search_white_24dp + @drawable/ic_lock_open_white_24dp + @drawable/ic_settings_grey600_24dp + @drawable/ic_import_export_white_24dp From 92d14c4a0090c71842440d96be1f84dab5a82d16 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 14:46:52 +0200 Subject: [PATCH 50/57] increased padding on image buttons on v21 to match material guidelines --- src/main/res/layout/activity_edit_account.xml | 2 +- src/main/res/layout/activity_muc_details.xml | 4 ++-- src/main/res/layout/contact_key.xml | 2 +- src/main/res/values-v21/dimens.xml | 1 + src/main/res/values/dimens.xml | 7 ++++--- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml index 750c28e0b..7d84a4af3 100644 --- a/src/main/res/layout/activity_edit_account.xml +++ b/src/main/res/layout/activity_edit_account.xml @@ -337,7 +337,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_copy" android:visibility="visible" android:contentDescription="@string/copy_otr_clipboard_description"/> diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml index 36873654e..116026512 100644 --- a/src/main/res/layout/activity_muc_details.xml +++ b/src/main/res/layout/activity_muc_details.xml @@ -75,7 +75,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_edit_dark"/> @@ -102,7 +102,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_settings"/> diff --git a/src/main/res/layout/contact_key.xml b/src/main/res/layout/contact_key.xml index 755728776..b7817b383 100644 --- a/src/main/res/layout/contact_key.xml +++ b/src/main/res/layout/contact_key.xml @@ -34,7 +34,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_remove" android:visibility="invisible" /> diff --git a/src/main/res/values-v21/dimens.xml b/src/main/res/values-v21/dimens.xml index 8bc8f3f7b..b689d1008 100644 --- a/src/main/res/values-v21/dimens.xml +++ b/src/main/res/values-v21/dimens.xml @@ -1,4 +1,5 @@ 63dp + 12dp \ No newline at end of file diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index 79e920e98..95e800557 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -1,7 +1,8 @@ - - 8dp - 8dp + + 8dp + 8dp 16dp 288dp + 8dp From d94c231a744900ca7a1297ffd0980536591d61f5 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 16:25:32 +0200 Subject: [PATCH 51/57] adjust dimens slightly to work with v21+ (v21 doesn't count the navigation bar) --- .../fragment_conversations_overview.xml | 0 src/main/res/{values-w600dp => values-w585dp}/dimens.xml | 0 src/main/res/{values-w960dp => values-w945dp}/dimens.xml | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/main/res/{layout-w960dp => layout-w945dp}/fragment_conversations_overview.xml (100%) rename src/main/res/{values-w600dp => values-w585dp}/dimens.xml (100%) rename src/main/res/{values-w960dp => values-w945dp}/dimens.xml (100%) diff --git a/src/main/res/layout-w960dp/fragment_conversations_overview.xml b/src/main/res/layout-w945dp/fragment_conversations_overview.xml similarity index 100% rename from src/main/res/layout-w960dp/fragment_conversations_overview.xml rename to src/main/res/layout-w945dp/fragment_conversations_overview.xml diff --git a/src/main/res/values-w600dp/dimens.xml b/src/main/res/values-w585dp/dimens.xml similarity index 100% rename from src/main/res/values-w600dp/dimens.xml rename to src/main/res/values-w585dp/dimens.xml diff --git a/src/main/res/values-w960dp/dimens.xml b/src/main/res/values-w945dp/dimens.xml similarity index 100% rename from src/main/res/values-w960dp/dimens.xml rename to src/main/res/values-w945dp/dimens.xml From 6a15bc26b6310c5b0915e7511fba4dfa5eb2cae2 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 22:23:45 +0200 Subject: [PATCH 52/57] npe check after reading image uri --- .../eu/siacs/conversations/persistance/FileBackend.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index 9ae56b048..e120adbd1 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -400,7 +400,9 @@ public class FileBackend { options.inSampleSize = calcSampleSize(image,Math.max(newHeight, newWidth)); is = mXmppConnectionService.getContentResolver().openInputStream(image); Bitmap source = BitmapFactory.decodeStream(is, null, options); - + if (source == null) { + return null; + } int sourceWidth = source.getWidth(); int sourceHeight = source.getHeight(); float xScale = (float) newWidth / sourceWidth; @@ -418,8 +420,6 @@ public class FileBackend { return dest; } catch (FileNotFoundException e) { return null; - } catch (IOException e) { - return null; } finally { close(is); } From 06244011379d8ab61cdc032fc88063c54227ed7d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 28 Apr 2015 22:23:59 +0200 Subject: [PATCH 53/57] version bump to 1.3.0-beta --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 370506560..0fe56ff8f 100644 --- a/build.gradle +++ b/build.gradle @@ -44,8 +44,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 21 - versionCode 58 - versionName "1.3.0-beta" + versionCode 59 + versionName "1.3.0-beta2" } compileOptions { From f0d51fcb77a728da12179fb8a044b6a78f71eb44 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 29 Apr 2015 10:19:03 +0200 Subject: [PATCH 54/57] pulled translations from transifex --- src/main/res/values-cs/strings.xml | 12 + src/main/res/values-es/strings.xml | 2 +- src/main/res/values-eu/strings.xml | 11 + src/main/res/values-id/strings.xml | 104 +++++++ src/main/res/values-ja/strings.xml | 10 + src/main/res/values-ko/strings.xml | 447 +++++++++++++++++++++++++++++ src/main/res/values-nl/strings.xml | 11 + src/main/res/values-sv/strings.xml | 11 + 8 files changed, 607 insertions(+), 1 deletion(-) create mode 100644 src/main/res/values-ko/strings.xml diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index 192df52f8..f49cb1b98 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -429,8 +429,20 @@ Přijmout pozici Conversation zavřena Opustil(a) konferenci + Nastavení certifikátu Nedůvěřovat systémovým CA Všechny certifikáty musí být schváleny ručně + Odstranit certifikáty + Smazat ručně povolené certifikáty + Žádné ručně povolené certifikáty + Odstranit certifikáty + Smazat výběr + Zrušit + + %d certifikát smazán + %d certifikáty smazány + %d certifikátů smazáno + Vybrat %d kontakt Vybrat %d kontakty diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 165310730..109715e30 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -436,7 +436,7 @@ Eliminar manualmente certificados aceptados No aceptar certificados manualmente Eliminar Certificados - Deshacer selección + Eliminar seleccionados Cancelar %d certificado eliminado diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index 423096618..ac66bfc1e 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -429,8 +429,19 @@ Kokapena jaso da Elkarrizketa itxi egin da Konferentzia utzi egin da + Ziurtagirien aukerak Sistemaren CAtaz ez fidatu Ziurtagiri guztiak eskuz onartu behar dira + Ziurtagiriak kendu + Eskuz ezabatu onartutako ziurtagiriak + Ez dago eskuz onartutako ziurtagiririk + Ziurtagiriak kendu + Aukeratutakoak ezabatu + Utzi + + Ziurtagiri %d ezabatua + %d ziurtagiri ezabatuak + Hautatu kontaktu %d Hautatu %d kontaktu diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml index 6c2dedb63..69bd09112 100644 --- a/src/main/res/values-id/strings.xml +++ b/src/main/res/values-id/strings.xml @@ -74,6 +74,7 @@ Hapus Riwayat Percakapan Apakah Anda ingin menghapus semua pesan dalam Percakapan ini\n\nPeringatan:ini tidak akan mempengaruhi pesan yang disimpan pada perangkat atau server lain. Hapus pesan + Akhiri percakapan setelahnya Pilih kehadiran untuk kontak Kirim pesan teks biasa Kirim pesan terenskripsi OTR @@ -83,11 +84,13 @@ Kirim tidak terenkripsi Dekripsi gagal. Mungkin Anda tidak memiliki kunci pribadi yang tepat. OpenKeychain + Conversations menggunakan app pihak ke-3 bernama OpenKeychain untuk mengenkripsi dan menerjemahkan pesan dan mengorganisir kunci anda.\n\nOpenKeychain berlisensi GPLv3 dan tersedia fi F-Droid dan Google play.\n\n(Silahkan mulai ulang Conversations setelah menginstall.) Mulai ulang Pasang menawarkan... menunggu... Tidak ada kunci OpenPGP ditemukan + Conversations tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publiknya.\n\nSilakan meminta kontak Anda untuk menyetel OpenPGP Tidak ada kunci OpenPGP ditemukan Percakapan tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publik mereka.\n\nSilakan meminta kontak Anda untuk setup OpenPGP. Pesan terenkripsi diterima. Sentuh untuk membongkar dan melihatnya. @@ -154,8 +157,51 @@ Hapus akun Sementara dimatikan Publikasikan avatar + Publikasikan kunci OpenPGP + Aktifkan Akun + Apakah Anda yakin.? + Jika Anda menghapus akun, semua data percakapan Anda di Conversation akan hilang. + Rekam suara + Jabber ID + Password + username@example.com + Ketik ulang password + Password + Ketik ulang password + Password tidak sama + Jabber ID tidak valid + Memori habis. Gambar terlalu besar + Apakah anda ingin menambahkan %s ke daftar kontak anda? + online + bebas untuk chatting + pergi + pergi lama + jangan ganggu + offline + Conference + Member lainnya + Info Server + XEP-0313: MAM + XEP-0280: Message Carbons + XEP-0352: Client State Indication + XEP-0191: Blocking Command + XEP-0237: Roster Versioning + XEP-0198: Stream Management + XEP-0163: PEP (Avatars) + tersedia + tidak tersedia + Pemberitahuan kunci publik tidak ditemukan + terakhir terlihat sekarang + terakhir terlihat 1 menit lalu + terlihat %d menit lalu + terlihat 1 jam lalu + terlihat %d jam lalu + terlihat 1 hari lalu terlihat %d hari lalu tidak pernah terlihat + Pesan terenskripsi. Pasang OpenKeychain untuk menerjemahkan + Sidik OTR tidak diketahui + pesan terkunci OpenPGP ditemukan Penerimaan gagal Fingerprint Anda OTR fingerprint @@ -176,13 +222,30 @@ room@conference.example.com Simpan sebagai bookmark Hapus bookmark + Bookmark ini sudah ada Anda + Ubah subjek conference Conference tidak ditemukan + Tinggalkan + Kontak ditambahkan ke daftar anda Tambah kembali + %s telah membaca hingga disini + Publikasi + Sentuh Avatar untuk memilih gambar dari gallery + Harap dicatat: Setiap orang yang berlangganan update kehadiran Anda akan diizinkan untuk melihat gambar ini. + Mempublikasi... + Server tidak mengijinkan publikasi Anda + Sesuatu yang salah terjadi ketika mengkonversi gambar anda + Tidak dapat menyimpan Avatar ke memori + (Tekan yang lama untuk mengembalikan semula) + Server Anda tidak mendukung publikasi Avatar + berbisik + kepada %s Kirim pesan pribadi ke %s Hubungkan Akun ini sudah ada Selanjutnya + Sesi saat didirikan Informasi tambahan Lewati Nonaktifkan notifikasi @@ -191,7 +254,13 @@ Aktifkan Conference membutuhkan password Masukan password + Pembaruan kehadiran hilang dari kontak + Silakan meminta pembaruan kehadiran dari kontak Anda lebih dulu.\n\nIni akan digunakan untuk menentukan (klien) mana yang digunakan dikontak Anda. + Request sekarang + Hapus sidik jari + Apakah anda yakin menghapus sidik jari? Abaikan + Perhatian Mengirim ini tanpa kehadiran sesama pembaruan bisa menyebabkan masalah tak terduga.\n\nPergi ke kontak untuk memverifikasi langganan kehadiran anda. Pengaturan enskripsi Paksa enskripsi end-to-end Selalu mengirim pesan terenkripsi (kecuali untuk conferences) @@ -205,9 +274,20 @@ Waktu mulai Waktu selesai Aktifkan waktu sunyi + Pemberitahuan akan disunyukan ketika jam sunyi. Perbesar ukuran huruf + Gunakan ukuran huruf lebih besar diseluruh aplikasi Tombol kirim menunjukan statusnya + Permintaan penerimaan pesan + Pesan yang diterima akan ditambahkan centang hijau jika didukung + Warnai tombol kirim untuk mengindikasikan status kontak Lainnya + nama Conference + Gunakan subjek \'room\' daripada JID untuk mengidentifikasi conferences + sidik jari OTR disalin ke clipboard! + Anda ditendang dari conference ini + Conference ini hanya untuk member terdaftar + Anda telah ditendang dari conference ini menggunakan akun %s Mengecek gambar di host HTTP Berkas gambar telah dihapus @@ -226,11 +306,23 @@ Tampilkan kode QR Tampilkan daftar blokir Detil akun + Verifikasi OTR + Remote Sidik jari + pindai + (atau menyentuh telepon) + Socialist Millionaire Protocol + Petunjuk atau Pertanyaan + Rahasia bersama + Konfirmasi Sedang diproses + Menanggapi Gagal + Rahasia tidak match Coba lagi Selesai Terverifikasi! + Kontak meminta verifikasi SMP + Tidak ada sesi OTR yang valid ditemukan! Percakapan Jaga layanan di latar depan Cegah sistem operasi mematikan koneksi @@ -267,6 +359,8 @@ Tidak dapat mengubah password Kirim pesan untuk memulai obrolan dienkripsi Bertanya + Jika Anda dan kontak Anda memiliki rahasia yang sama yang tidak ada orang lain yang tahu (seperti sebuah lelucon atau hanya apa yang Anda punya untuk makan siang terakhir kali Anda bertemu) Anda dapat menggunakan rahasia itu untuk memverifikasi sidik jari masing-masing.\n\nAnda memberikan petunjuk atau pertanyaan untuk kontak yang akan merespon dengan jawaban case-sensitive. + Kontak Anda ingin memverifikasi sidik jari Anda dengan menantang Anda dengan rahasia bersama. Kontak Anda memberikan petunjuk berikut atau pertanyaan untuk rahasia itu. Petunjuk Anda tidak boleh kosong Rahasia bersama Anda tidak boleh kosong Hati-hati membandingkan sidik jari yang ditunjukkan di bawah dengan sidik jari kontak Anda.\nAnda dapat mengunakan layanan komunikasi terpercaya seperti e-mail terenskripsi atau panggilan telepon untuk menukarkannya. @@ -335,8 +429,18 @@ Lokasi yang diterima Percakapan tertutup Tinggalkan conference + Opsi Sertifikat Jangan percaya sistem CA Semua sertifikat harus disetujui secara manual + Hapus sertifikat + Hapus sertifikat yang disahkan secara manual + Tidak ada sertifikat yang disahkan secara manual + Hapus sertifikat + Hapus seleksi + Batal + + %d sertifikat dihapus + Pilih %d kontak diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 0996334e5..35fb5472e 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -429,8 +429,18 @@ 位置を受信しました 会話が閉じられました 退出した会話 + 証明書オプション システムの CA を信頼しない すべての証明書を手動で承認する必要があります + 証明書を削除 + 手動で承認された証明書を削除します + 手動で承認された証明書はありません + 証明書を削除 + 選択を削除 + キャンセル + + %d 証明書を削除しました + %d 連絡先を選択 diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml new file mode 100644 index 000000000..d00ab0fd0 --- /dev/null +++ b/src/main/res/values-ko/strings.xml @@ -0,0 +1,447 @@ + + + 설정 + 새 대화 + 계정 + 이 대화 + 연락처 정보 + 회의 정보 + 안전한 대화 + 계정 추가 + 이름 편집 + 주소록에 추가 + 명단에서 삭제 + 연락처 + 연락처 차단 해제 + 도메인 차단 + 도메인 차단 해제 + 계정 관리 + 설정 + 회의 정보 + 연락처 정보 + 대화 공유 + 대화 시작 + 연락처 선택 + 목록 차단 + 방금 + 1분 전 + %d 분 전 + 읽지 않은 대화 + 보내는중... + 메세지 복호화중입니다. 기다리세요... + 사용중인 별명입니다 + 관리자 + 소유자 + 중재자 + 참가자 + 방문자 + %s 를 당신의 명단에서 삭제하시겠습니까? 이 연락처와 연관된 대화는 삭제되지 않습니다. + %s 이(가) 당신에게 메세지를 보내지 못하도록 차단할까요? + %s 로부터 메세지를 받을 수 있도록 차단을 해제할까요? + %s 의 모든 연락처를 차단할까요? + %s 의 모든 연락처를 차단 해제할까요? + 연락처 차단됨 + %s 를 즐겨찾기에서 삭제할까요? 이 즐겨찾기와 연관된 대화는 삭제되지 않습니다. + 서버에서 새 계정을 등록 + 서버에서 비밀번호 변경 + 공유 + 대화 시작 + 연락처 초대 + 연락처 + 취소 + 설정 + 추가 + 편집 + 삭제 + 차단 + 차단 해제 + 저장 + 확인 + Conversations가 작동 중지되었습니다 + Stack trace 정보를 보냄으로서 Conversations의 개발에 기여할 수 있습니다. 경고: 이것은 Stack trace 정보를 개발자에게 보내기 위해 당신의 XMPP 계정을 사용할 것입니다. + 지금 보내기 + 더이상 묻지 않기 + 계정에 접속할 수 없습니다 + 다중 계정에 접속할 수 없습니다 + 여기를 선택해 당신의 계정을 관리하세요 + 파일 첨부 + 연락처가 당신의 명단에 없습니다. 추가하시겠습니까? + 연락처 추가 + 전송 실패 + 거부됨 + 이미지 전송 준비중 + 기록 삭제 + 대화 기록 삭제 + 이 대화의 모든 메세지를 삭제하시겠습니까? 경고: 이것은 다른 기기나 서버에 있는 메세지에는 영향을 미치지 않습니다. + 메세지 삭제 + 나중에 이 대화 끝내기 + 연락할 프레즌스 선택 + 평문 메세지 전송 + OTR 암호화된 메세지 전송 + OpenPGP 암호화된 메세지 전송 + 닉네임이 변경되었습니다 + 이미지 다운로드 + 암호화하지 않고 전송 + 복호화 실패. 올바른 개인 키를 가지고 있지 않은 것 같습니다. + OpenKeychain + Conversations는 메세지를 암호화 및 복호화하고 공개 키를 관리하기 위해 OpenKeychain이라는 제 3자 앱을 활용합니다. OpenKeychain은 GPLv3 라이센스를 사용하며 F-Droid와 Google Play에서 구하실 수 있습니다. (이후 Conversations를 재시작하세요) + 재시작 + 설치 + 제공중... + 대기중... + OpenPGP 키가 발견되지 않음 + 당신의 연락처가 그들의 공개 키를 선언하지 않고 있기 때문에 Conversations는 당신의 메세지를 암호화할 수 없습니다. OpenPGP를 설정하도록 당신의 연락처에게 물어보세요. + OpenPGP 키가 발견되지 않음 + 당신의 연락처가 그들의 공개 키를 선언하지 않고 있기 때문에 Conversations는 당신의 메세지를 암호화할 수 없습니다. OpenPGP를 설정하도록 당신의 연락처에게 물어보세요. + 암호화된 메세지 수신됨. 터치해서 복호화 및 열람하세요. + 일반 + XMPP 자원 + 이 클라이언트가 자신을 알아보는 이름 + 파일 수락 + 이 크기보다 작은 파일을 자동으로 수락 + 알림 설정 + 알림 + 새 메세지 도착시 알림 + 진동 + 새 메세지 도착시 진동 + 소리 + 알림과 동시에 벨소리 재생 + 회의 알림 + 새 회의 메세지가 도착시, 강조됐을 때 뿐만 아니라 항상 알림 + 알림 유예 + Carbon Copy 수신 후에 잠시동안 알림 해제 + 추가 설정 + 충돌 보고서 보내지 않음 + Stack trace 정보를 보냄으로서 Conversations의 개발에 기여할 수 있습니다 + 메세지 확인 + 메세지를 수신하고 읽었는지를 연락처에게 알려줌 + 사용자 환경 설정 + OpenKeychain이 오류를 보고합니다 + 파일 복호화 입출력 오류 + 수락 + 오류가 발생했습니다 + 프레즌스 업데이트 허가 + 당신이 추가한 연락처의 프레즌스 구독을 선제적으로 허가 및 요청함 + 구독 + 당신의 계정 + + 프레즌스 업데이트 보내기 + 프레즌스 업데이트 받기 + 프레즌스 업데이트 요청 + 사진 선택 + 사진 찍기 + 구독 요청을 선제적으로 허가 + 선택한 파일은 이미지가 아닙니다 + 이미지 파일 변환 중 오류 발생 + 파일을 찾을 수 없음 + 일반 입출력 오류. 저장소 공간이 부족한 것 같습니다. + 이 이미지를 선택하기 위해 사용한 앱이 이 파일을 읽는데 필요한 충분한 허가를 제공하지 않았습니다. 다른 파일 탐색기를 이용해 이미지를 선택하세요. + 알 수 없음 + 임시로 해제 + 접속중 + 접속중\u2026 + 오프라인 + 승인되지 않음 + 서버를 찾을 수 없음 + 접속할 수 없음 + 등록 실패 + 사용자 이름이 이미 사용중입니다 + 등록 성공 + 서버가 등록을 지원하지 않습니다 + 보안 오류 + 호환되지 않는 서버 + 평문 + OTR + OpenPGP + 계정 편집 + 계정 삭제 + 임시로 해제 + 아바타 공개 + OpenPGP 공개 키 공개 + 계정 사용 + 확실합니까? + 계정을 삭제하면 당신의 모든 대화 기록이 사라집니다 + 녹음 + Jabber ID + 비밀번호 + username@example.com + 암호 확인 + 암호 + 암호 확인 + 암호가 일치하지 않습니다 + 올바른 Jabber ID가 아닙니다 + 메모리 부족. 이미지 용량이 너무 큽니다 + %s를 기기의 연락처 목록에 추가하시겠습니까? + 접속중 + 대화 가능 + 자리 비움 + 장기간 비움 + 방해 금지 + 오프라인 + 회의 + 다른 멤버 + 서버 정보 + XEP-0313: MAM + XEP-0280: Message Carbons + XEP-0352: Client State Indication + XEP-0191: Blocking Command + XEP-0237: Roster Versioning + XEP-0198: Stream Management + XEP-0163: PEP (Avatars) + 가능 + 불가 + 공개 키 선언 누락 + 방금 전까지 접속했었음 + 1분 전까지 접속했었음 + %d 분 전까지 접속했었음 + 1시간 전까지 접속했었음 + %d 시간 전까지 접속했었음 + 1일 전까지 접속했었음 + %d 일 전까지 접속했었음 + 접속한적 없음 + 암호화된 메세지. 복호화하기 위해 OpenKeychain을 설치하세요. + 알 수 없는 OTR 지문 + OpenPGP 암호화 메세지 발견 + 접수 실패 + 당신의 지문 + OTR 지문 + 검증 + 복호화 + 회의 + 검색 + 연락처 생성 + 회의 참석 + 연락처 삭제 + 연락처 정보 보기 + 연락처 차단 + 연락처 차단 해제 + 만들기 + 이미 존재하는 연락처입니다 + 참석 + 회의 주소 + room@conference.example.com + 즐겨찾기로 저장 + 즐겨찾기 삭제 + 즐겨찾기가 이미 존재합니다 + 당신 + 회의 제목 편집 + 회의를 찾을 수 없습니다 + 퇴장 + 연락처가 당신을 연락처 목록에 추가했습니다 + Add back + %s 가 여기까지 읽었습니다 + 공개 + 갤러리에서 사진을 선택하기 위해 아바타를 터치하세요 + 참고하세요: 당신의 프레즌스 업데이트를 구독한 모든 사람들은 이 사진을 볼 수 있습니다 + 공개중... + 서버가 당신의 발표를 거부했습니다 + 사진을 변환하는 중 오류가 발생했습니다 + 아바타를 저장할 수 없습니다 + (혹은 기본값을 되돌리기 위해 길게 누름) + 서버가 아바타 발표를 지원하지 않습니다 + 속삭임 + %s 에게 + %s 에게 개인 매세지 보내기 + 접속 + 계정이 이미 존재합니다 + 다음 + 현재 세션이 수립되었습니다 + 추가 정보 + 건너뛰기 + 알림 해제 + 이 대화의 알림 해제 + 알림이 해제되었습니다 + 사용 + 회의에 암호가 필요합니다 + 암호 입력 + 연락처로부터 프레즌스 업데이트 찾을 수 없음 + 먼저 연락처로부터 프레즌스 업데이트를 요청하세요. 이는 당신의 연락처가 어떤 클라이언트를 사용하는지 결정하는 데 사용됩니다. + 지금 요청 + 지문 삭제 + 이 지문을 삭제하시겠습니까? + 무시 + 경고: 상호간의 프레즌스 업데이트 없이 이것을 보내면 예기치 못한 문제를 발생시킬 수 있습니다. 당신의 프레즌스 구독을 검증하기 위해 연락처 상세 정보로 가세요. + 암호화 설정 + 강제적인 종단간 암호화 + 언제나 암호화 메세지로 전송 (회의 제외) + 암호화된 메세지 저장하지 않음 + 경고: 메세지가 손실될 수 있습니다 + 전문가 설정 + 설정시 주의하시기 바랍니다 + Conversations에 대해서 + 빌드 및 라이센스 정보 + 무음 시간대 + 시작 시간 + 마감 시간 + 무음 시간대 사용 + 무음 시간대에는 알림이 해제됩니다 + 글자 크기 증가 + 앱 전반에 큰 글자 크기를 사용합니다 + 전송 버튼이 상태를 나타냄 + 메세지 영수증 요청 + 만약 지원될 경우, 수신된 메세지는 초록색 기호로 표시됩니다. + 연락처 상태를 표시하기 위해 전송 버튼을 색칠함 + 기타 + 회의 이름 + 회의를 식별하기 위해 JID 대신 방 제목을 사용 + OTR 지문이 클립보드에 복사되었습니다 + 당신은 이 회의에서 금지되었습니다 + 이 회의는 멤버 전용입니다 + 당신은 이 회의에서 추방되었습니다 + using account %s + HTTP 호스트에서 이미지 확인중 + 이미지 파일이 삭제되었습니다 + 접속중이 아닙니다. 다시 시도하세요. + 이미지 파일 크기 확인 + 메세지 설정 + 텍스트 복사 + 원본 URL 복사 + 다시 보내기 + 이미지 URL + 메세지 텍스트 + URL이 클립보드에 복사되었습니다 + 메세지가 클립보드에 복사되었습니다 + 이미지 전송 실패 + QR코드 스캔 + QR코드 보기 + 차단 목록 보기 + 계정 정보 + OTR 검증 + Remote Fingerprint + 스캔 + (혹은 기기 터치) + Socialist Millionaire Protocol + 힌트 혹은 질문 + 공유된 비밀 + 확인 + 진행중 + 응답 + 실패 + 비밀이 일치하지 않습니다 + 다시 시도하세요 + 완료 + 검증 완료 + 연락처가 SMP 검증을 요구했습니다 + 올바른 OTR 세션이 발견되지 않았습니다 + Conversations + 포어그라운드에서 서비스 유지 + 운영체제가 접속을 해제하지 못하도록 예방합니다 + 파일 선택 + 수신중 %1$s (%2$d%% 완료) + %s 다운로드 + 파일 + %s 열기 + 전송중 (%1$d%% 완료) + 파일 전송 준비중 + %s 다운로드 제공됨 + 전송 취소 + 파일 전송 실패 + 파일이 삭제되었습니다 + 파일을 열기 위한 앱이 발견되지 않았습니다 + 지문을 검증할 수 없습니다 + 수동 검증 + 연락처의 OTR 지문을 검증하시겠습니까? + 동적 태그 표시 + 연락처 밑에 읽기 전용 태그 표시 + 알림 사용 + 회의 생성 + 회의 서버가 발견되지 않았습니다 + 회의 생성 실패 + 회의 생성됨 + 비밀 접수됨 + 초기화 + 계정 아바타 + OTR 지문을 클립보드에 복사 + 서버로부터 기록 가져오는중 + 서버에 더이상 기록이 없습니다 + 업데이트중... + 암호 변경됨 + 암호를 변경할 수 없습니다 + 암호화된 대화를 시작하기 위해 메세지 보내기 + 질문하기 + 만약 당신과 당신의 연락처가 다른 사람은 모르는 비밀을 공유하고 있다면, 그 비밀을 서로의 지문을 검증하는 데 사용할 수 있습니다. 대소문자가 구분된 대답을 할 연락처에게 힌트나 질문을 주세요. + 당신의 연락처는 당신의 지문을 검증하고자 공유된 비밀을 확인하려고 합니다. 당신의 연락처는 그 비밀에 관한 다음과 같은 힌트 혹은 질문을 제공했습니다. + 힌트를 반드시 입력해야 합니다 + 공유된 비밀을 반드시 입력해야 합니다 + 아래에 보이는 지문을 당신의 연락처의 지문과 세심하게 비교하세요. 당신은 암호화된 이메일이나 전화와 같은 믿을만한 통신수단으로 이것을 주고 받을 수 있습니다. + 암호 변경 + 현재 암호 + 새 암호 + 암호를 반드시 입력해야 합니다 + 모든 계정 사용 + 모든 계정 해제 + 다음으로 동작을 수행 + 관련 없음 + 역할 없음 + 추방됨 + 멤버 + 고급 모드 + 멤버십 허가 + 멤버십 철회 + 관리자 특권 허가 + 관리자 특권 철회 + 회의에서 제거 + %s 의 관련 여부를 변경할 수 없습니다 + 회의에서 금지 + %s 를 공개 회의에서 제거하려고 하고 있습니다. 유일한 방법은 이 사용자를 앞으로 금지시키는 것입니다. + 지금 금지 + %s 의 역할을 변경할 수 없습니다 + 공개적으로 접근 가능한 회의 + 멤버 전용 사설 회의 + 회의 설정 + 사설 (멤버 전용) + 익명 아님 + 회의 설정 변경됨 + 회의 설정을 변경할 수 없습니다 + 안함 + 30분 + 1시간 + 2시간 + 8시간 + 나중에 알릴때까지 + 입력 설정 + 엔터 키로 전송 + 엔터 키로 메세지를 보냅니다 + 엔터 키 표시 + 이모티콘 키를 엔터 키로 바꿉니다 + 오디오 + 비디오 + 이미지 + PDF 문서 + 안드로이드 앱 + 연락처 + %s 수신 + 포어그라운드 서비스 해제 + 터치해서 Conversations 열기 + 아바타가 공개되었습니다 + %s 전송중 + %s 제공중 + 오프라인 숨기기 + 계정 해제 + %s 이(가) 입력중입니다... + %s 이(가) 입력을 중단했습니다 + 입력 알림 + 새 메세지를 작성할 때 이를 연락처에게 알립니다 + 위치 전송 + 위치 표시 + 위치를 표시할 수 있는 앱이 발견되지 않았습니다 + 위치 + 위치 수신 + 대화 끝남 + 회의에서 나감 + 인증 설정 + 시스템 CA를 신뢰하지 않음 + 모든 인증서는 수동으로 승인되어야 함 + 인증서 삭제 + 수동으로 승인된 인증서 삭제 + 수동으로 승인된 인증서 없음 + 인증서 삭제 + 선택 삭제 + 취소 + + %d 인증서 삭제됨 + + + %d 연락처 선택 + + diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 650e18c44..2532130dd 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -429,8 +429,19 @@ Locatie ontvangen Gesprek gesloten Groepsgesprek verlaten + Certificaatopties Vertrouw geen systeem-CA\'s. Alle certificaten moeten handmatig goedgekeurd worden + Verwijder certificaten + Verwijder handmatig goedgekeurde certificaten + Geen handmatig goedgekeurde certificaten + Verwijder certificaten + Verwijder selectie + Annuleer + + %d certificaat verwijderd + %d certificaten verwijderd + Selecteer %d contact Selecteer %d contacten diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index b411f4844..4f84110b2 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -429,8 +429,19 @@ Mottog position Konversation stängd Lämnade konferens + Certifikatalternativ Lita inte på systemets CAs Alla certifikat måste manuellt godkännas + Ta bort certifikat + Ta bort manuellt accepterade certifikat + Inga manuellt accepterade certifikat + Ta bort certifikat + Ta bort val + Avbryt + + %d certifikat borttaget + %d certifikat borttagna + Välj %d kontakt Välj %d kontakter From bcdfdb9ccf4cdd4e875850bc45852eb14ed6faf1 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 29 Apr 2015 16:15:07 +0200 Subject: [PATCH 55/57] added config option to be a bit more verbose about stanza counts --- .../java/eu/siacs/conversations/Config.java | 1 + .../conversations/xmpp/XmppConnection.java | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java index f38bcbfc5..5cca6c0b7 100644 --- a/src/main/java/eu/siacs/conversations/Config.java +++ b/src/main/java/eu/siacs/conversations/Config.java @@ -28,6 +28,7 @@ public final class Config { public static final boolean NO_PROXY_LOOKUP = false; //useful to debug ibb public static final boolean DISABLE_STRING_PREP = false; // setting to true might increase startup performance + public static final boolean EXTENDED_SM_LOGGING = false; // log stanza counts public static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000; public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY / 2; diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index cf580df1b..0b6bb15b7 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -339,12 +339,18 @@ public class XmppConnection implements Runnable { sendInitialPing(); } else if (nextTag.isStart("r")) { tagReader.readElement(nextTag); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": acknowledging stanza #" + this.stanzasReceived); + } final AckPacket ack = new AckPacket(this.stanzasReceived, smVersion); tagWriter.writeStanzaAsync(ack); } else if (nextTag.isStart("a")) { final Element ack = tagReader.readElement(nextTag); lastPacketReceived = SystemClock.elapsedRealtime(); final int serverSequence = Integer.parseInt(ack.getAttribute("h")); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server acknowledged stanza #" + serverSequence); + } final String msgId = this.messageReceipts.get(serverSequence); if (msgId != null) { if (this.acknowledgedListener != null) { @@ -598,8 +604,10 @@ public class XmppConnection implements Runnable { } else if (this.streamFeatures.hasChild("sm", "urn:xmpp:sm:" + smVersion) && streamId != null) { - final ResumePacket resume = new ResumePacket(this.streamId, - stanzasReceived, smVersion); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": resuming after stanza #"+stanzasReceived); + } + final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion); this.tagWriter.writeStanzaAsync(resume); } else if (this.streamFeatures.hasChild("bind") && shouldBind) { sendBindRequest(); @@ -787,7 +795,7 @@ public class XmppConnection implements Runnable { sendEnableCarbons(); } if (getFeatures().blocking() && !features.blockListRequested) { - Log.d(Config.LOGTAG, "Requesting block list"); + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": Requesting block list"); this.sendIqPacket(getIqGenerator().generateGetBlockList(), mXmppConnectionService.getIqParser()); } } @@ -894,7 +902,9 @@ public class XmppConnection implements Runnable { } tagWriter.writeStanzaAsync(packet); if (packet instanceof MessagePacket && packet.getId() != null && this.streamId != null) { - Log.d(Config.LOGTAG, "request delivery report for stanza " + stanzasSent); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": requesting ack for message stanza #" + stanzasSent); + } this.messageReceipts.put(stanzasSent, packet.getId()); tagWriter.writeStanzaAsync(new RequestPacket(this.smVersion)); } From e1fab8a488ea99271f1920056f58c779bf300bdf Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 1 May 2015 13:52:19 +0200 Subject: [PATCH 56/57] pulled translations from transifex --- src/main/res/values-el/strings.xml | 11 ++++++ src/main/res/values-ru/strings.xml | 59 ++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index ec1da08c4..01b33908d 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -429,8 +429,19 @@ Ελήφθη τοποθεσία Η συζήτηση έκλεισε Έφυγε από την συνδιάσκεψη + Επιλογές πιστοποιητικών Μη έμπιστες αρχές πιστοποίησης συστήματος Όλα τα πιστοποιητικά πρέπει να εγκριθούν χειροκίνητα + Αφαίρεση πιστοποιητικών + Διαγραφή με μη αυτόματο τρόπο των αναγνωρισμένων πιστοποιητικών + Δεν υπάρχουν με μη αυτόματο τρόπο αναγνωρισμένα πιστοποιητικα + Αφαίρεση πιστοποιητικών + Διαγραφή επιλογής + Ακύρωση + + %d πιστοποιητικο διαγραφθηκε + %d πιστοποιητικά διαγραφθηκαν + Επιλογή %d επαφής Επιλογή %d επαφών diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index fb39e24a9..2fc257f7c 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -389,4 +389,63 @@ Публичная конференция Приватная конференция только для членов Настройки конференции + Закрытый доступ (только для участников) + Не анонимно + Настройки конференции изменены! + Не удалось изменить настройки конференции + Никогда + 30 минут + 1 час + 2 часа + 8 часов + До следующего уведомления + Настройки ввода + Отправить на \"Enter\" + Клавиша \"Enter\" отправляет сообщение + Показывать клавишу ввода + Поменять кнопку смайликов на кнопку ввода + аудио + звук + изображение + PDF-документ + Приложение Android + Контакт + Получено %s + Отключить фоновую службу + Коснитесь, чтобы открыть Conversations + Аватар загружен! + Отправляется %s + Предложен %s + Скрыть пользователей вне сети + Отключить учётную запись + %s набирает сообщение... + %s прекратил набор + Оповещения о наборе + Позволяет вашим контактам видеть когда вы пишете новое сообщение + Отправить местоположение + Показать местоположение + Не найдено приложений для отображения местоположения + Местоположение + Получено местоположение + Беседа окончена + Покинул беседу + Опции сертификата + Не доверять системным УЦ + Все сертификаты должны быть подтверждены вручную + Удалить сертификат + Удалить сертификаты, подтверждённые вручную + Не найдено сертификатов, подтверждённых вручную + Удалить сертификаты + Удалить отмеченное + Отмена + + Удалён %d сертификат + Удалено %d сертификатов + Удалено %d сертификатов + + + Выбран %d контакт + Выбрано %d контактов + Выбрано %d контактов + From 8617932aad2f9604d7d5ce1321da6926a7bf2f37 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 1 May 2015 13:52:56 +0200 Subject: [PATCH 57/57] version bump to 1.3.0 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 0fe56ff8f..a4062ec32 100644 --- a/build.gradle +++ b/build.gradle @@ -44,8 +44,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 21 - versionCode 59 - versionName "1.3.0-beta2" + versionCode 60 + versionName "1.3.0" } compileOptions {