diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/eu/siacs/conversations/entities/Account.java | 5 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/entities/Conversation.java | 11 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 20 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java | 22 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 17 | ||||
-rw-r--r-- | src/main/res/values-eu/strings.xml | 8 | ||||
-rw-r--r-- | src/main/res/values-fr/strings.xml | 2 | ||||
-rw-r--r-- | src/main/res/values-ro-rRO/strings.xml | 12 | ||||
-rw-r--r-- | src/main/res/values-sr/strings.xml | 8 | ||||
-rw-r--r-- | src/main/res/values-tr-rTR/strings.xml | 23 | ||||
-rw-r--r-- | src/main/res/values/strings.xml | 1 |
11 files changed, 109 insertions, 20 deletions
diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 7085c7ba..b77d85c4 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -111,7 +111,8 @@ public class Account extends AbstractEntity { REGISTRATION_PLEASE_WAIT(true), STREAM_ERROR(true), POLICY_VIOLATION(true), - REGISTRATION_PASSWORD_TOO_WEAK(true); + REGISTRATION_PASSWORD_TOO_WEAK(true), + PAYMENT_REQUIRED(true); private final boolean isError; @@ -169,6 +170,8 @@ public class Account extends AbstractEntity { return R.string.registration_password_too_weak; case STREAM_ERROR: return R.string.account_status_stream_error; + case PAYMENT_REQUIRED: + return R.string.payment_required; default: return R.string.account_status_unknown; } diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 56739f40..3c00fd59 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -803,19 +803,18 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } public long getLastMessageTransmitted() { - long last_clear = getLastClearHistory(); - if (last_clear != 0) { - return last_clear; - } + final long last_clear = getLastClearHistory(); + long last_received = 0; synchronized (this.messages) { for(int i = this.messages.size() - 1; i >= 0; --i) { Message message = this.messages.get(i); if (message.getStatus() == Message.STATUS_RECEIVED || message.isCarbon()) { - return message.getTimeSent(); + last_received = message.getTimeSent(); + break; } } } - return 0; + return Math.max(last_clear,last_received); } public void setMutedTill(long value) { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 426c6f1a..2f5262de 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -193,15 +193,12 @@ public class XmppConnectionService extends Service { sendUnsentMessages(conversation); } } else { - if (contact.getPresences().size() >= 1) { - if (conversation.hasValidOtrSession()) { - String otrResource = conversation.getOtrSession().getSessionID().getUserID(); - if (!(Arrays.asList(contact.getPresences().toResourceArray()).contains(otrResource))) { - conversation.endOtrIfNeeded(); - } + //check if the resource we are haveing a conversation with is still online + if (conversation.hasValidOtrSession()) { + String otrResource = conversation.getOtrSession().getSessionID().getUserID(); + if (!(Arrays.asList(contact.getPresences().toResourceArray()).contains(otrResource))) { + conversation.endOtrIfNeeded(); } - } else { - conversation.endOtrIfNeeded(); } } } @@ -784,7 +781,12 @@ public class XmppConnectionService extends Service { restoreFromDatabase(); getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver); - this.fileObserver.startWatching(); + new Thread(new Runnable() { + @Override + public void run() { + fileObserver.startWatching(); + } + }).start(); if (Config.supportOpenPgp()) { this.pgpServiceConnection = new OpenPgpServiceConnection(getApplicationContext(), "org.sufficientlysecure.keychain", new OpenPgpServiceConnection.OnBound() { @Override diff --git a/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java b/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java index e6993bfe..ab4dead8 100644 --- a/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java +++ b/src/main/java/eu/siacs/conversations/utils/ConversationsFileObserver.java @@ -37,7 +37,10 @@ public abstract class ConversationsFileObserver { } for(File file : files) { if (file.isDirectory() && !file.getName().equals(".") && !file.getName().equals("..")) { - stack.push(file.getPath()); + final String currentPath = file.getAbsolutePath(); + if (depth(file) <= 8 && !stack.contains(currentPath) && !observing(currentPath)) { + stack.push(currentPath); + } } } } @@ -46,6 +49,23 @@ public abstract class ConversationsFileObserver { } } + private static int depth(File file) { + int depth = 0; + while((file = file.getParentFile()) != null) { + depth++; + } + return depth; + } + + private boolean observing(String path) { + for(SingleFileObserver observer : mObservers) { + if(path.equals(observer.path)) { + return true; + } + } + return false; + } + public synchronized void stopWatching() { for(FileObserver observer : mObservers) { observer.stopWatching(); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 89ffa05d..6e36a546 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -384,6 +384,8 @@ public class XmppConnection implements Runnable { this.changeStatus(Account.State.SECURITY_ERROR); } catch (final UnauthorizedException e) { this.changeStatus(Account.State.UNAUTHORIZED); + } catch (final PaymentRequiredException e) { + this.changeStatus(Account.State.PAYMENT_REQUIRED); } catch (final UnknownHostException | ConnectException e) { this.changeStatus(Account.State.SERVER_NOT_FOUND); } catch (final SocksSocketFactory.SocksProxyNotFoundException e) { @@ -505,7 +507,16 @@ public class XmppConnection implements Runnable { } break; } else if (nextTag.isStart("failure")) { - throw new UnauthorizedException(); + final Element failure = tagReader.readElement(nextTag); + final String accountDisabled = failure.findChildContent("account-disabled"); + if (accountDisabled != null + && accountDisabled.contains("renew") + && Config.MAGIC_CREATE_DOMAIN != null + && accountDisabled.contains(Config.MAGIC_CREATE_DOMAIN)) { + throw new PaymentRequiredException(); + } else { + throw new UnauthorizedException(); + } } else if (nextTag.isStart("challenge")) { final String challenge = tagReader.readElement(nextTag).getContent(); final Element response = new Element("response"); @@ -1535,6 +1546,10 @@ public class XmppConnection implements Runnable { } + private class PaymentRequiredException extends IOException { + + } + public enum Identity { FACEBOOK, SLACK, diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index e731b0d0..61adf4a5 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -157,7 +157,9 @@ <string name="account_status_regis_success">Erregistroa burutu da</string> <string name="account_status_regis_not_sup">Zerbitzariak ez du erregistratzea onartzen</string> <string name="account_status_security_error">Segurtasun akatsa</string> + <string name="account_status_policy_violation">Politikaren urraketa</string> <string name="account_status_incompatible_server">Zerbitzari ez bateragarria</string> + <string name="account_status_stream_error">Akatsa korrontean</string> <string name="encryption_choice_unencrypted">Enkriptatu gabe</string> <string name="encryption_choice_otr">OTR</string> <string name="encryption_choice_pgp">OpenPGP</string> @@ -218,6 +220,8 @@ <string name="reception_failed">Jasotzeak huts egin du</string> <string name="your_fingerprint">Zure hatz-marka</string> <string name="otr_fingerprint">OTR hatz-marka</string> + <string name="otr_fingerprint_selected_message">Mezuaren OTR hatz-marka</string> + <string name="openpgp_key_id">OpenPGP gakoaren nortasuna</string> <string name="omemo_fingerprint">OMEMO hatz-marka</string> <string name="omemo_fingerprint_x509">v\\OMEMO hatz-marka</string> <string name="omemo_fingerprint_selected_message">Mezuaren OMEMO hatz-marka</string> @@ -512,6 +516,7 @@ <string name="pref_use_white_background_summary">Jasotako mezuak testu beltza atzeko-plano zuri baten gainean bezala erakutsi</string> <string name="account_status_tor_unavailable">Tor sarea ez dago eskuragarri</string> <string name="account_status_bind_failure">Estekatzeak hust egin du</string> + <string name="account_status_host_unknown">Zerbitzaria ez da domeinuaren erantzule</string> <string name="server_info_broken">Hondatuta</string> <string name="pref_presence_settings">Presentzia</string> <string name="pref_away_when_screen_off">Urrun pantaila itzalita dagoenean</string> @@ -610,6 +615,7 @@ <string name="device_does_not_support_battery_op">Zure gailuak ez du bateria optimizatzeko aukerarik ematen</string> <string name="show_password">Pasahitza erakutsi</string> <string name="registration_please_wait">Erregistroak huts egin du: saiatu berriz beranduago</string> + <string name="registration_password_too_weak">Erregistroa huts egin du: pasahitza ahulegia da</string> <string name="create_conference">Konferentzia sortu</string> <string name="join_or_create_conference">Konferentzia batera batu edo sortu</string> <string name="conference_subject">Gaia</string> @@ -628,4 +634,6 @@ <string name="pref_theme_dark">Gai iluna</string> <string name="pref_use_green_background">Atzealde berdea</string> <string name="pref_use_green_background_summary">Atzealde berdea erabili jasotako mezuentzat</string> + <string name="unable_to_connect_to_keychain">Ezin izan da OpenKeychainekin konektatu</string> + <string name="this_device_is_no_longer_in_use">Gailu hau ez da gehiago erabiltzen</string> </resources> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 05340340..165727d9 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -157,6 +157,7 @@ <string name="account_status_regis_success">Enregistrement réussi</string> <string name="account_status_regis_not_sup">Le serveur ne permet pas l\'enregistrement</string> <string name="account_status_security_error">Erreur de sécurité</string> + <string name="account_status_policy_violation">Violation de politique</string> <string name="account_status_incompatible_server">Serveur incompatible</string> <string name="account_status_stream_error">Erreur de flux</string> <string name="encryption_choice_unencrypted">Non chiffré</string> @@ -515,6 +516,7 @@ <string name="pref_use_white_background_summary">Afficher les messages reçus en texte noir sur fond blanc.</string> <string name="account_status_tor_unavailable">Réseau Tor inaccessible</string> <string name="account_status_bind_failure">La liaison a échoué</string> + <string name="account_status_host_unknown">Le serveur n\'est pas responsable du domaine</string> <string name="server_info_broken">Détraqué</string> <string name="pref_presence_settings">Disponibilité</string> <string name="pref_away_when_screen_off">Absent quand l\'écran est éteint</string> diff --git a/src/main/res/values-ro-rRO/strings.xml b/src/main/res/values-ro-rRO/strings.xml index 0bcbb958..e1c94f12 100644 --- a/src/main/res/values-ro-rRO/strings.xml +++ b/src/main/res/values-ro-rRO/strings.xml @@ -101,7 +101,7 @@ <string name="contacts_have_no_pgp_keys">Conversations nu poate cripta mesajele tale pentru contactele tale care nu isi anunta cheia publica.\n\n<small>Te rog cere contactelor sa configureze OpenPGP.</small></string> <string name="pref_general">General</string> <string name="pref_xmpp_resource">Nume client XMPP</string> - <string name="pref_xmpp_resource_summary">Numele cu care acest client se identifica</string> + <string name="pref_xmpp_resource_summary">Identificatorul acestui client</string> <string name="pref_accept_files">Accepta fisiere</string> <string name="pref_accept_files_summary">Accepta automat fisiere mai mici decat...</string> <string name="pref_attachments">Atasamente</string> @@ -157,7 +157,9 @@ <string name="account_status_regis_success">Inregistrare completa</string> <string name="account_status_regis_not_sup">Acest server nu permite inregistrarea</string> <string name="account_status_security_error">Eroare de securitate</string> + <string name="account_status_policy_violation">Incalcare conditii serviciu</string> <string name="account_status_incompatible_server">Server incompatibil</string> + <string name="account_status_stream_error">Eroare de date</string> <string name="encryption_choice_unencrypted">Ne criptat</string> <string name="encryption_choice_otr">OTR</string> <string name="encryption_choice_pgp">OpenGPG</string> @@ -218,6 +220,8 @@ <string name="reception_failed">Receptie esuata</string> <string name="your_fingerprint">Amprenta ta</string> <string name="otr_fingerprint">Amprenta OTR</string> + <string name="otr_fingerprint_selected_message">Amprenta OTR a mesajului</string> + <string name="openpgp_key_id">ID cheie OpenPGP</string> <string name="omemo_fingerprint">Amprenta OMEMO</string> <string name="omemo_fingerprint_x509">Amprenta v\\OMEMO</string> <string name="omemo_fingerprint_selected_message">Amprenta OMEMO a mesajului</string> @@ -514,6 +518,7 @@ <string name="pref_use_white_background_summary">Arata mesajele primite cu negru pe fond alb</string> <string name="account_status_tor_unavailable">Reteaua Tor nu este disponibila</string> <string name="account_status_bind_failure">Eroare de conexiune</string> + <string name="account_status_host_unknown">Gazda fara domeniu</string> <string name="server_info_broken">Deteriorat</string> <string name="pref_presence_settings">Setari de prezenta</string> <string name="pref_away_when_screen_off">Plecat cand ecranul este oprit</string> @@ -614,6 +619,7 @@ Emitent</string> <string name="device_does_not_support_battery_op">Dispozitivul dumneavoastra nu suporta dezactivarea optimizarii de baterie pentru aceasta aplicatie</string> <string name="show_password">Arata parola</string> <string name="registration_please_wait">Inregistrarea a esuat: Incercati mai tarziu</string> + <string name="registration_password_too_weak">Inregistrare esuata: Parola slaba</string> <string name="create_conference">Creeaza conferinta</string> <string name="join_or_create_conference">Alatura-te sau creeaza conferinta</string> <string name="conference_subject">Subiect</string> @@ -623,7 +629,7 @@ Emitent</string> <string name="gp_short">Scurt</string> <string name="gp_medium">Mediu</string> <string name="gp_long">Lung</string> - <string name="pref_broadcast_last_activity">Notifica momentul ultimei interactiuni cu aplicatia</string> + <string name="pref_broadcast_last_activity">Notifica ultima interactiune</string> <string name="pref_broadcast_last_activity_summary">Anunta contactele cand folosesti Conversations</string> <string name="pref_privacy">Intimitate</string> <string name="pref_theme_options">Tema</string> @@ -632,4 +638,6 @@ Emitent</string> <string name="pref_theme_dark">Tema intunecata</string> <string name="pref_use_green_background">Fundal verde</string> <string name="pref_use_green_background_summary">Foloseste la mesajele primite un fundal verde</string> + <string name="unable_to_connect_to_keychain">Nu s-a putut contacta OpenKeychain</string> + <string name="this_device_is_no_longer_in_use">Acest dispozitiv nu mai este in uz</string> </resources> diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index dc04c310..358f2b28 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -157,7 +157,9 @@ <string name="account_status_regis_success">Регистрација завршена</string> <string name="account_status_regis_not_sup">Сервер не подржава регистрацију</string> <string name="account_status_security_error">Безбедносна грешка</string> + <string name="account_status_policy_violation">Нарушавање полисе</string> <string name="account_status_incompatible_server">Некомпатибилан сервер</string> + <string name="account_status_stream_error">Грешка тока</string> <string name="encryption_choice_unencrypted">Нешифровано</string> <string name="encryption_choice_otr">ОТР</string> <string name="encryption_choice_pgp">ОпенПГП</string> @@ -218,6 +220,8 @@ <string name="reception_failed">Примање није успело</string> <string name="your_fingerprint">Ваш отисак</string> <string name="otr_fingerprint">ОТР отисак</string> + <string name="otr_fingerprint_selected_message">ОТР отисак поруке</string> + <string name="openpgp_key_id">ИД ОпенПГП кључа</string> <string name="omemo_fingerprint">ОМЕМО отисак</string> <string name="omemo_fingerprint_x509">v\\ОМЕМО отисак</string> <string name="omemo_fingerprint_selected_message">ОМЕМО отисак поруке</string> @@ -514,6 +518,7 @@ <string name="pref_use_white_background_summary">Приказ примљених порука црним текстом на белој позадини</string> <string name="account_status_tor_unavailable">Тор мрежа недоступна</string> <string name="account_status_bind_failure">Неуспех свезивања</string> + <string name="account_status_host_unknown">Сервер није одговоран за домен</string> <string name="server_info_broken">Оштећен</string> <string name="pref_presence_settings">Присутност</string> <string name="pref_away_when_screen_off">Одсутан кад је екран искључен</string> @@ -612,6 +617,7 @@ <string name="device_does_not_support_battery_op">Ваш уређај не подржава искључивање оптимизације батерије</string> <string name="show_password">Прикажи лозинку</string> <string name="registration_please_wait">Регистрација није успела: покушајте поново касније</string> + <string name="registration_password_too_weak">Регистрација није успела: лозинка преслаба</string> <string name="create_conference">Направи групно ћаскање</string> <string name="join_or_create_conference">Придружи се или направи групно ћаскање</string> <string name="conference_subject">Предмет</string> @@ -630,4 +636,6 @@ <string name="pref_theme_dark">Тамна тема</string> <string name="pref_use_green_background">Зелена позадина</string> <string name="pref_use_green_background_summary">Зелена позадина за примљене поруке</string> + <string name="unable_to_connect_to_keychain">Не могох да се повежем са Отвореним кључарником</string> + <string name="this_device_is_no_longer_in_use">Овај уређај више није у употреби</string> </resources> diff --git a/src/main/res/values-tr-rTR/strings.xml b/src/main/res/values-tr-rTR/strings.xml index 664eaca8..bd3d7e2d 100644 --- a/src/main/res/values-tr-rTR/strings.xml +++ b/src/main/res/values-tr-rTR/strings.xml @@ -116,6 +116,8 @@ <string name="pref_led_summary">Yeni bir ileti geldiğinde bildirim ışığı yanıp sönsün</string> <string name="pref_sound">Zil sesi</string> <string name="pref_sound_summary">Yeni bir ileti geldiğinde sesli bildir</string> + <string name="pref_notification_grace_period">Mühlet</string> + <string name="pref_notification_grace_period_summary">Başka bir cihaz üstünde etkinlik algılandığında Conversations\'ın sessiz kalma süresi</string> <string name="pref_advanced_options">Gelişmiş</string> <string name="pref_never_send_crash">Asla çöküş raporu gönderme</string> <string name="pref_never_send_crash_summary">Çöküş raporu göndermeniz Conversations\n’ın geliştirilmesine katkıda bulunacaktır.</string> @@ -155,7 +157,9 @@ <string name="account_status_regis_success">Hesap oluşturuldu</string> <string name="account_status_regis_not_sup">Sunucu hesap oluşturma işlemini desteklemiyor</string> <string name="account_status_security_error">Güvenlik hatası</string> + <string name="account_status_policy_violation">Politika ihlali</string> <string name="account_status_incompatible_server">Sunucu uyuşmazlığı</string> + <string name="account_status_stream_error">Akış hatası</string> <string name="encryption_choice_unencrypted">Şifrelenmemiş</string> <string name="encryption_choice_otr">OTR</string> <string name="encryption_choice_pgp">OpenPGP</string> @@ -216,6 +220,8 @@ <string name="reception_failed">Alınamadı</string> <string name="your_fingerprint">Parmak iziniz</string> <string name="otr_fingerprint">OTR parmak izi</string> + <string name="otr_fingerprint_selected_message">İletinin OTR parmak izi</string> + <string name="openpgp_key_id">OpenPGP Anahtar ID</string> <string name="omemo_fingerprint">OMEMO parmak izi</string> <string name="omemo_fingerprint_x509">v\\OMEMO parmak izi</string> <string name="omemo_fingerprint_selected_message">İletinin OMEMO parmak izi</string> @@ -503,10 +509,12 @@ <string name="download_failed_server_not_found">İndirme başarısız: Sunucu bulunamadı</string> <string name="download_failed_file_not_found">İndirme başarısız: Dosya bulunamadı</string> <string name="download_failed_could_not_connect">İndirme başarısız: Sunucuya bağlanılamadı</string> + <string name="download_failed_could_not_write_file">İndirme başarısız: Dosya yazılamıyor</string> <string name="pref_use_white_background">Beyaz arka plan kullan</string> <string name="pref_use_white_background_summary">Alınan iletileri beyaz arka plan üzerinde siyah yazıyla göster</string> <string name="account_status_tor_unavailable">Tor ağına erişilemiyor</string> <string name="account_status_bind_failure">Bağlantı başarısız</string> + <string name="account_status_host_unknown">Sunucu alan adı için sorumlu değil</string> <string name="server_info_broken">Bozuk</string> <string name="pref_presence_settings">Durum</string> <string name="pref_away_when_screen_off">Ekran kapandığında uzakta</string> @@ -604,10 +612,25 @@ <string name="device_does_not_support_battery_op">Cihazınız pil optimizasyonunu devre dışı bırakmayı desteklemiyor</string> <string name="show_password">Parola göster</string> <string name="registration_please_wait">Hesap oluşturulamadı: Sonra tekrar deneyin</string> + <string name="registration_password_too_weak">Kayıt Başarısız: Parola çok zayıf</string> <string name="create_conference">Grup Sohbet başlat</string> <string name="join_or_create_conference">Grup Sohbete katıl veya başlat</string> <string name="conference_subject">Konu</string> <string name="choose_participants">Katılımcıları seç</string> <string name="creating_conference">Grup Sohbet başlatılıyor...</string> <string name="invite_again">Yeniden davet et</string> + <string name="gp_short">Kısa</string> + <string name="gp_medium">Orta</string> + <string name="gp_long">Uzun</string> + <string name="pref_broadcast_last_activity">Son kullanıcı etkileşimini yayınla</string> + <string name="pref_broadcast_last_activity_summary">Tüm kişileriniz ne zaman Conversations kullandığınızı görsün</string> + <string name="pref_privacy">Mahremiyet</string> + <string name="pref_theme_options">Tema</string> + <string name="pref_theme_options_summary">Renk paletini seçin</string> + <string name="pref_theme_light">Açık tema</string> + <string name="pref_theme_dark">Koyu tema</string> + <string name="pref_use_green_background">Yeşil arka plan</string> + <string name="pref_use_green_background_summary">Gelen iletiler için yeşil arka plan kullan</string> + <string name="unable_to_connect_to_keychain">OpenKeychain\'e bağlanılamıyor</string> + <string name="this_device_is_no_longer_in_use">Bu cihaz artık kullanılmıyor</string> </resources> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 766cb9fe..ab175a36 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -674,4 +674,5 @@ <string name="type_tablet">Tablet</string> <string name="type_web">Web browser</string> <string name="type_console">Console</string> + <string name="payment_required">Payment required</string> </resources> |