use link icon instead of emoji when showing hidden urls (#4031)

Looks way better imho. Also closes #4028.

Before vs After:


![Screenshot_20230924_163714](https://github.com/tuskyapp/Tusky/assets/10157047/5b0b745a-4574-4e37-988e-b04997ac55f1)


![Screenshot_20230924_162657](https://github.com/tuskyapp/Tusky/assets/10157047/58a3482f-6afb-4b10-9891-f7a86af7f2bf)
This commit is contained in:
UlrichKu 2023-09-26 21:46:05 +02:00 committed by GitHub
commit 2dc27bca2a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 62 additions and 67 deletions

View File

@ -34,6 +34,7 @@ import android.view.MotionEvent.ACTION_UP
import android.view.View
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.appcompat.content.res.AppCompatResources
import androidx.browser.customtabs.CustomTabColorSchemeParams
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.net.toUri
@ -43,6 +44,7 @@ import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.entity.HashTag
import com.keylesspalace.tusky.entity.Status.Mention
import com.keylesspalace.tusky.interfaces.LinkListener
import java.lang.ref.WeakReference
import java.net.URI
import java.net.URISyntaxException
@ -65,7 +67,7 @@ fun getDomain(urlString: String?): String {
* @param listener to notify about particular spans that are clicked
*/
fun setClickableText(view: TextView, content: CharSequence, mentions: List<Mention>, tags: List<HashTag>?, listener: LinkListener) {
val spannableContent = markupHiddenUrls(view.context, content)
val spannableContent = markupHiddenUrls(view, content)
view.text = spannableContent.apply {
getSpans(0, spannableContent.length, URLSpan::class.java).forEach {
@ -76,7 +78,7 @@ fun setClickableText(view: TextView, content: CharSequence, mentions: List<Menti
}
@VisibleForTesting
fun markupHiddenUrls(context: Context, content: CharSequence): SpannableStringBuilder {
fun markupHiddenUrls(view: TextView, content: CharSequence): SpannableStringBuilder {
val spannableContent = SpannableStringBuilder(content)
val originalSpans = spannableContent.getSpans(0, content.length, URLSpan::class.java)
val obscuredLinkSpans = originalSpans.filter {
@ -99,8 +101,22 @@ fun markupHiddenUrls(context: Context, content: CharSequence): SpannableStringBu
val start = spannableContent.getSpanStart(span)
val end = spannableContent.getSpanEnd(span)
val originalText = spannableContent.subSequence(start, end)
val replacementText = context.getString(R.string.url_domain_notifier, originalText, getDomain(span.url))
val replacementText = view.context.getString(R.string.url_domain_notifier, originalText, getDomain(span.url))
spannableContent.replace(start, end, replacementText) // this also updates the span locations
val linkDrawable = AppCompatResources.getDrawable(view.context, R.drawable.ic_link)!!
// ImageSpan does not always align the icon correctly in the line, let's use our custom emoji span for this
val linkDrawableSpan = EmojiSpan(WeakReference(view))
linkDrawableSpan.imageDrawable = linkDrawable
val placeholderIndex = replacementText.indexOf("🔗")
spannableContent.setSpan(
linkDrawableSpan,
start + placeholderIndex,
start + placeholderIndex + "🔗".length,
0
)
}
return spannableContent

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/tusky_blue"
android:pathData="M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z" />
</vector>

View File

@ -625,7 +625,6 @@
<string name="description_post_language">لغة المنشور</string>
<string name="delete_scheduled_post_warning">هل تريد حذف هذا المنشور المُبَرمَج؟</string>
<string name="tips_push_notification_migration">أعد تسجيل الدخول إلى جميع الحسابات لتمكين دعم الإشعارات.</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">ضبط نقطة التركيز</string>
<string name="action_edit_image">تعديل الصورة</string>
<string name="action_add_reaction">إضافة رد فعل</string>

View File

@ -606,7 +606,6 @@
<string name="wellbeing_hide_stats_posts">Схаваць колькасную статыстыку допісаў</string>
<string name="wellbeing_hide_stats_profile">Схаваць колькасную статыстыку профіляў</string>
<string name="report_category_violation">Парушэнне правіла</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="instance_rule_title">Правілы %s</string>
<string name="language_display_name_format">%s (%s)</string>
<string name="delete_scheduled_post_warning">Выдаліць гэты запланаваны допіс\?</string>

View File

@ -591,7 +591,6 @@
<string name="action_unfollow_hashtag_format">Deixar de seguir #%s\?</string>
<string name="compose_unsaved_changes">Tens canvis no desats.</string>
<string name="set_focus_description">Toqueu o arrossegueu el cercle per triar el punt focal que sempre serà visible a les miniatures.</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_title_show_self_username">Mostra el nom d\'usuari a les barres d\'eines</string>
<string name="action_set_focus">Estableix el punt d\'enfocament</string>
<string name="description_login">Funciona en la majoria dels casos. No es filtra cap dada a altres aplicacions.</string>

View File

@ -534,7 +534,6 @@
<string name="duration_14_days">14 dní</string>
<string name="duration_30_days">30 dní</string>
<string name="drafts_post_reply_removed">Příspěvek, na který jste připravili odpověď, byl odstraněn</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Nastavit bod zaostření</string>
<string name="tips_push_notification_migration">Znovu se přihlaste ke všem účtům, abyste povolili podporu push oznámení.</string>
<string name="dialog_push_notification_migration">Aby bylo možné používat push oznámení prostřednictvím UnifiedPush, Tusky potřebuje oprávnění k odběru oznámení na vašem serveru Mastodon. To vyžaduje opětovné přihlášení ke změně rozsahů OAuth udělených aplikaci Tusky. Použitím možnosti opětovného přihlášení zde nebo v předvolbách účtu zachováte všechny vaše místní koncepty a mezipaměť.</string>

View File

@ -306,7 +306,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="notification_clear_text">Ydych chi\'n siŵr eich bod chi am glirio\'ch holl hysbysiadau\'n barhaol\?</string>
<string name="error_multimedia_size_limit">Ni all ffeiliau fideo a sain fod yn fwy na %s MB.</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="error_following_hashtag_format">Gwall wrth ddilyn #%s</string>
<string name="error_unfollowing_hashtag_format">Gwall wrth ddad-ddilyn #%s</string>
<string name="action_unmute_domain">Dad-dewi %s</string>
@ -734,4 +733,4 @@
<string name="dialog_delete_filter_positive_action">Dileu</string>
<string name="dialog_delete_filter_text">Dileu\'r hidlydd \'%1$s\'\?</string>
<string name="dialog_save_profile_changes_message">Hoffech gadw eich newidiadau proffil\?</string>
</resources>
</resources>

View File

@ -561,7 +561,6 @@
<string name="pref_show_self_username_never">Niemals</string>
<string name="filter_expiration_format">%s (%s)</string>
<string name="description_post_language">Sprache des Beitrags</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Fokuspunkt setzen</string>
<string name="action_add_reaction">Reaktion hinzufügen</string>
<string name="failed_to_remove_from_list">Das Konto konnte nicht aus der Liste entfernt werden</string>

View File

@ -561,5 +561,4 @@
<string name="description_post_language">Mesaĝolingvo</string>
<string name="dialog_push_notification_migration">Por ricevi sciigoj per UnifiedPush, Tusky bezonas taŭgan permeson el Mastodon-servilo. Tio postulas re-ensaluton por ŝanĝi OAuth-rajtoj donitaj al Tusky. Se vi uzas la opcion re-ensaluti ĉi tie aŭ en la agordoj de la konto, viaj malnetoj kaj kaŝmemoroj estos konservitaj.</string>
<string name="dialog_push_notification_migration_other_accounts">Vi re-ensalutis en tiu konto por doni sciigo-permeson al Tusky. Vi havas tamen aliajn kontojn, ĉe kiuj vi devas re-sensaluti. Iru al ili, kaj re-ensalutu por ebligi ricevon de sciigoj per UnifiedPush.</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
</resources>

View File

@ -560,7 +560,6 @@
<string name="failed_to_pin">Fallo al fijar</string>
<string name="failed_to_unpin">Fallo al quitarlo</string>
<string name="pref_show_self_username_disambiguate">Cuando hay varias cuentas ingresadas</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="notification_sign_up_description">Notificaciones de nuevos usuarios</string>
<string name="notification_update_name">Ediciones de una publicación</string>
<string name="notification_update_description">Notificaciones cuando se editan publicaciones con las que has interactuado</string>

View File

@ -550,7 +550,6 @@
<string name="pref_show_self_username_disambiguate">هنگام ورود چندین حساب</string>
<string name="pref_show_self_username_never">هرگز</string>
<string name="pref_title_show_self_username">نمایش نام کاربری در نوارابزارها</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_add_reaction">افزودن واکنش</string>
<string name="action_set_focus">تنظیم نقطهٔ تمرکز</string>
<string name="duration_no_change">(بدون تغییر)</string>
@ -703,4 +702,4 @@
\n این سیاهه‌ها می‌توانند به عنوان زبانه‌ای در زبانه‌های ترجیحات حساب [iconics gmd_account_circle] [iconics gmd_navigate_next] استفاده شوند. </string>
<string name="error_blocking_domain">شکست در خموش کردن %1$s: %2$s</string>
<string name="error_unblocking_domain">شکست در ناخموش کردن %1$s: %2$s</string>
</resources>
</resources>

View File

@ -563,7 +563,6 @@
<string name="pref_show_self_username_never">Jamais</string>
<string name="description_post_language">Langue du message</string>
<string name="duration_no_change">(Aucune modification)</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_add_reaction">ajouter une réaction</string>
<string name="instance_rule_title">%s règles</string>
<string name="a11y_label_loading_thread">Chargement du fil</string>
@ -682,4 +681,4 @@
<string name="filter_keyword_addition_title">Ajouter un mot-clé</string>
<string name="filter_edit_keyword_title">Modifier mot-clé</string>
<string name="filter_description_format">%s : %s</string>
</resources>
</resources>

View File

@ -565,7 +565,6 @@
<string name="pref_show_self_username_disambiguate">Nuair a bhios iomadh cunntas air an clàradh a-steach</string>
<string name="pref_show_self_username_never">Chan ann idir</string>
<string name="filter_expiration_format">%s (%s)</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Suidhich puing an fhòcais</string>
<string name="delete_scheduled_post_warning">A bheil thu airson am post sgeidealaichte seo a sguabadh às\?</string>
<string name="instance_rule_info">Le clàradh a-steach, bidh tu ag aontachadh ri riaghailtean %s.</string>

View File

@ -535,7 +535,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="error_multimedia_size_limit">Os ficheiros de vídeo e audio non poden superar os %s MB.</string>
<string name="description_post_language">Idioma de publicación</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Establece foco</string>
<string name="error_following_hashtag_format">Erro ao seguir #%s</string>
<string name="error_unfollowing_hashtag_format">Error ao retirar seguimento de #%s</string>
@ -696,4 +695,4 @@
\nEstas listas pódense usar como lapelas configurando as Lapelas nas Preferencias da Conta [iconics gmd_account_circle] [iconics gmd_navigate_next]. </string>
<string name="error_blocking_domain">Non se acalou a %1$s: %2$s</string>
<string name="error_unblocking_domain">Non se reactivou a %1$s: %2$s</string>
</resources>
</resources>

View File

@ -549,7 +549,6 @@
<string name="pref_show_self_username_disambiguate">Ha több fiók is be van jelentkezve</string>
<string name="pref_show_self_username_never">Soha</string>
<string name="duration_no_change">(Nincs változás)</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Fókuszpont beállítása</string>
<string name="error_following_hashtag_format">Hiba a #%s követésekor</string>
<string name="error_unfollowing_hashtag_format">Hiba a #%s követésének befejezésekor</string>

View File

@ -250,7 +250,7 @@
<string name="about_powered_by_tusky">Keyrir á Tusky</string>
<string name="about_tusky_license">Tusky er frjáls hugbúnaður með opinn grunnkóða. Hann er gefinn út með GNU General Public notkunarleyfi, útgáfu 3. Þú getur skoðað notkunarleyfið hér: https://www.gnu.org/licenses/gpl-3.0.en.html</string>
<string name="about_project_site">Vefsvæði verkefnisins: https://tusky.app</string>
<string name="about_bug_feature_request_site">Villutilkynningar og beiðnir um nýja eiginleika:
<string name="about_bug_feature_request_site">Villutilkynningar og beiðnir um nýja eiginleika:
\nhttps://github.com/tuskyapp/Tusky/issues</string>
<string name="about_tusky_account">Notandasnið Tusky</string>
<string name="post_share_content">Deila efni úr færslu</string>
@ -546,7 +546,6 @@
<string name="failed_to_unpin">Mistókst að losa</string>
<string name="pref_show_self_username_always">Alltaf</string>
<string name="pref_show_self_username_disambiguate">Þegar er skráð inn á mörgum aðgöngum</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Setja virknistað</string>
<string name="pref_show_self_username_never">Aldrei</string>
<string name="pref_title_show_self_username">Birta notandanafn á verkfærastikum</string>
@ -696,4 +695,4 @@
\n ATHUGAÐU: þú getur bara bætt notendaaðgöngum sem þú fylgist með á listana þína.
\n
\n Þessa lista má nota sem flipa í flipum [iconics gmd_account_circle] [iconics gmd_navigate_next] Kjörstillingar aðgangs. </string>
</resources>
</resources>

View File

@ -568,7 +568,6 @@
<string name="pref_show_self_username_disambiguate">Quando connesso con più account</string>
<string name="duration_no_change">(nessuna modifica)</string>
<string name="pref_title_show_self_username">Mostra nome utente nelle barre strumenti</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_add_or_remove_from_list">Aggiunti o rimuovi dalla lista</string>
<string name="failed_to_add_to_list">Aggiunta dell\'account alla lista fallita</string>
<string name="failed_to_remove_from_list">Rimozione dell\'account dalla lista fallita</string>
@ -702,4 +701,4 @@
<string name="about_copied">Versione e informazioni dispositivo copiate</string>
<string name="dialog_save_profile_changes_message">Vuoi salvare le modifiche al tuo profilo\?</string>
<string name="error_media_upload_sending_fmt">Il caricamento è fallito: %s</string>
</resources>
</resources>

View File

@ -500,7 +500,6 @@
<string name="error_multimedia_size_limit">ビデオと音声ファイルのサイズは %s MB を超えることはできません。</string>
<string name="error_image_edit_failed">画像が編集できませんでした。</string>
<string name="title_login">ログイン</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_edit_image">画像の編集</string>
<string name="instance_rule_title">%s のルール</string>
<string name="error_following_hashtags_unsupported">このインスタンスはハッシュタグのフォローに対応していません。</string>

View File

@ -260,7 +260,6 @@
<string name="pref_title_http_proxy_server">HTTP starpniekserveris</string>
<string name="pref_title_http_proxy_port_message">Portam būtu jābūt starp %d un %d</string>
<string name="action_view_account_preferences">Konta iestatījumi</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="mute_domain_warning">Vai tiešām vēlaties bloķēt visu %s\? Šī domēna saturs netiks rādīts ne publiskajās laika līnijās, ne paziņojumos. Jūsu sekotāji no šī domēna tiks noņemti.</string>
<string name="send_post_notification_saved_content">Ieraksta kopija tika saglabāta tavos melnrakstos</string>
<string name="restart_emoji">Lai pielietotu šīs izmaiņas, ir jāpārstartē Tusky</string>

View File

@ -539,7 +539,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="duration_no_change">(Ingen endring)</string>
<string name="description_post_language">Innleggspråk</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Sett fokuspunkt</string>
<string name="set_focus_description">Trykk eller dra sirkelen for å velge fokuspunktet som alltid skal være synlig i miniatyrbilder.</string>
<string name="pref_show_self_username_always">Alltid</string>

View File

@ -543,7 +543,6 @@
<string name="set_focus_description">Tik of sleep de cirkel naar een centraal focuspunt dat op elke thumbnail zichtbaar moet blijven.</string>
<string name="dialog_push_notification_migration">Om pushmeldingen via UnifiedPush te kunnen gebruiken, moet Tusky zich op meldingen van jouw Mastodon-server abonneren. Dit betekent dat je opnieuw moet inloggen om de OAuth-toestemmingen voor Tusky te wijzigen. Het hier of onder accountvoorkeuren opnieuw inloggen behoudt jouw lokale concepten en buffer.</string>
<string name="dialog_push_notification_migration_other_accounts">Je hebt opnieuw op jouw huidige account ingelogd om toestemming voor pushmeldingen aan Tusky te verlenen. Je hebt echter nog andere accounts die nog niet op deze manier zijn overgezet. Ga naar deze accounts en log één voor één opnieuw in om UnifiedPush-meldingen ook daar in te schakelen.</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_show_self_username_always">Altijd</string>
<string name="pref_show_self_username_disambiguate">Wanneer meerdere accounts zijn ingelogd</string>
<string name="pref_show_self_username_never">Nooit</string>
@ -667,4 +666,4 @@
<string name="notification_prune_cache">Cache onderhoud…</string>
<string name="about_device_info_title">Je apparaat</string>
<string name="dialog_save_profile_changes_message">Wil je de wijzigingen aan je profiel bewaren\?</string>
</resources>
</resources>

View File

@ -523,7 +523,6 @@
<string name="tusky_compose_post_quicksetting_label">Compausar una publicacion</string>
<string name="account_date_joined">Arribada del %1$s</string>
<string name="saving_draft">Enregistrament del borrolhon…</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="error_image_edit_failed">Se podiá pas modificar limatge.</string>
<string name="pref_title_wellbeing_mode">Benestar</string>
<string name="duration_no_change">(Cap de modificacion)</string>

View File

@ -570,7 +570,6 @@
<string name="error_multimedia_size_limit">Pliki wideo i audio nie mogą przekraczać rozmiarem %s MB.</string>
<string name="filter_expiration_format">%s (%s)</string>
<string name="description_post_language">Język wpisu</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="duration_no_change">(bez zmian)</string>
<string name="error_following_hashtag_format">Wystąpił błąd podczas obserwowania #%s</string>
<string name="error_unfollowing_hashtag_format">Wystąpił błąd podczas odobserwowywania #%s</string>

View File

@ -566,7 +566,6 @@
<string name="report_category_violation">Violação de regra</string>
<string name="report_category_spam">Spam</string>
<string name="report_category_other">Outros</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_show_self_username_disambiguate">Quando várias contas estão conectadas</string>
<string name="pref_title_http_proxy_port_message">A porta deve estar entre %d e %d</string>
<string name="status_count_one_plus">1+</string>
@ -633,4 +632,4 @@
<string name="about_copy">Copiar a versão e as informações do dispositivo</string>
<string name="load_newest_notifications">Carregar notificações mais recentes</string>
<string name="compose_delete_draft">Excluir rascunho\?</string>
</resources>
</resources>

View File

@ -550,7 +550,6 @@
<string name="set_focus_description">Toca ou arrasta o círculo para escolher o ponto de focagem que estará sempre visível nas pré-visualizações.</string>
<string name="filter_expiration_format">%s(%s)</string>
<string name="duration_no_change">(Sem alteração)</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_show_self_username_always">Sempre</string>
<string name="pref_show_self_username_disambiguate">Quando autenticado em várias contas</string>
<string name="pref_show_self_username_never">Nunca</string>

View File

@ -479,7 +479,6 @@
<string name="duration_365_days">३६५ दिनानि</string>
<string name="duration_no_change">(परिवर्तनं नास्ति)</string>
<string name="review_notifications">सूचनाः सम्दृश्यन्ताम्</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_show_self_username_never">न कदापि</string>
<string name="pref_default_post_language">पूर्वनिविष्टा प्रकाशका भाषा</string>
<string name="notification_report_name">आवेदनानि</string>

View File

@ -266,5 +266,4 @@
<string name="action_links">සබැඳි</string>
<string name="pref_title_browser_settings">අතිරික්සුව</string>
<string name="abbreviated_seconds_ago">තත්. %d</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
</resources>

View File

@ -511,7 +511,6 @@
<string name="dialog_push_notification_migration_other_accounts">Du har loggat in igen på ditt konto för att ge Tusky tillgång till push-prenumeration. Dock har du andra konton som inte har migrerats såhär ännu. Växla till dem och logga in igen för att aktivera stöd för UnifiedPush-notiser.</string>
<string name="action_unsubscribe_account">Sluta prenumerera</string>
<string name="description_post_language">Inläggsspråk</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_show_self_username_disambiguate">När flera konton är inloggade</string>
<string name="pref_show_self_username_never">Aldrig</string>
<string name="notification_sign_up_name">Registreringar</string>
@ -707,4 +706,4 @@
\n
\nTill exempel kan du starta på ett kontos profil och trycka på skapa-knappen [iconics gmd_edit], och ändra synligheten. </string>
<string name="error_media_upload_sending_fmt">Uppladdningen misslyckades: %s</string>
</resources>
</resources>

View File

@ -214,7 +214,7 @@
* the url can be changed to link to the localized version of the license.
-->
<string name="about_project_site">Proje web sayfası: https://tusky.app</string>
<string name="about_bug_feature_request_site">"Hata raporları ve özellik istekleri:
<string name="about_bug_feature_request_site">"Hata raporları ve özellik istekleri:
\nhttps://github.com/tuskyapp/Tusky/issues"</string>
<string name="about_tusky_account">Tusky\'nin Profili</string>
<string name="post_share_content">Gönderinin içeriğini paylaş</string>
@ -517,7 +517,6 @@
<string name="duration_180_days">180 gün</string>
<string name="duration_60_days">60 gün</string>
<string name="duration_90_days">90 gün</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="pref_default_post_language">Varsayılan gönderme dili</string>
<string name="notification_report_name">Raporlar</string>
<string name="notification_report_description">Denetleme raporlarıyla ilgili bildirimler</string>
@ -703,4 +702,4 @@
<string name="following_hashtag_success_format">Şimdi etiketi takip edin #%s</string>
<string name="unfollowing_hashtag_success_format">Artık etiketi takip etmiyorum #%s</string>
<string name="error_unblocking_domain">Sesi açılamadı %1$s: %2$s</string>
</resources>
</resources>

View File

@ -560,7 +560,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="description_post_language">Мова допису</string>
<string name="duration_no_change">(Не змінено)</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Налаштувати точку фокусування</string>
<string name="pref_show_self_username_always">Завжди</string>
<string name="set_focus_description">Торкніться або перетягніть коло, щоб вибрати точку фокусування, яку завжди буде видно на мініатюрах.</string>
@ -720,4 +719,4 @@
<string name="unfollowing_hashtag_success_format">Хештег #%s більше не відстежується</string>
<string name="error_blocking_domain">Не вдається ігнорувати %1$s: %2$s</string>
<string name="error_unblocking_domain">Не вдалося перестати ігнорувати %1$s: %2$s</string>
</resources>
</resources>

View File

@ -525,7 +525,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="duration_no_change">(Không đổi)</string>
<string name="description_post_language">Ngôn ngữ đăng</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">Chọn tâm điểm</string>
<string name="set_focus_description">Nhấn hoặc kéo vòng tròn để chọn tiêu điểm sẽ hiển thị trong hình thu nhỏ.</string>
<string name="pref_title_show_self_username">Hiện URL của tôi trên tab</string>
@ -685,4 +684,4 @@
<string name="unfollowing_hashtag_success_format">Đã bỏ theo dõi hashtag #%s</string>
<string name="error_blocking_domain">Không thể ẩn %1$s: %2$s</string>
<string name="error_unblocking_domain">Không thể bỏ ẩn %1$s: %2$s</string>
</resources>
</resources>

View File

@ -539,7 +539,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="duration_no_change">(无更改)</string>
<string name="description_post_language">嘟文语言</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="action_set_focus">设置焦点</string>
<string name="set_focus_description">轻按或拖动圆圈选择始终在缩略图中可见的焦点。</string>
<string name="pref_show_self_username_disambiguate">登录多个账户时</string>
@ -699,4 +698,4 @@
\n 这些列表可被用作“账户选项” [iconics gmd_account_circle] [iconics gmd_navigate_next] 选项卡中的标签页。 </string>
<string name="error_blocking_domain">未能静音 %1$s: %2$s</string>
<string name="error_unblocking_domain">未能取消对 %1$s: %2$s的静音</string>
</resources>
</resources>

View File

@ -524,7 +524,6 @@
<string name="filter_expiration_format">%s (%s)</string>
<string name="set_focus_description">輕按或拖動圓圈來選擇總是在縮圖中可視的關注點。</string>
<string name="description_post_language">嘟文語言</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="compose_save_draft_loses_media">是否要儲存草稿?(當你重開草稿時附檔將會被再次上傳。)</string>
<string name="tusky_compose_post_quicksetting_label">編寫嘟文</string>
<string name="failed_to_pin">釘選失敗</string>

View File

@ -252,4 +252,6 @@
<item>NEWEST_FIRST</item>
</string-array>
<string name="url_domain_notifier" translatable="false">%s (🔗 %s)</string>
</resources>

View File

@ -757,7 +757,6 @@
<string name="tips_push_notification_migration">Re-login all accounts to enable push notification support.</string>
<string name="dialog_push_notification_migration">In order to use push notifications via UnifiedPush, Tusky needs permission to subscribe to notifications on your Mastodon server. This requires a re-login to change the OAuth scopes granted to Tusky. Using the re-login option here or in "Account preferences" will preserve all of your local drafts and cache.</string>
<string name="dialog_push_notification_migration_other_accounts">You have re-logged into your current account to grant push subscription permission to Tusky. However, you still have other accounts that have not been migrated this way. Switch to them and re-login one by one in order to enable UnifiedPush notifications support.</string>
<string name="url_domain_notifier">%s (🔗 %s)</string>
<string name="delete_scheduled_post_warning">Delete this scheduled post?</string>

View File

@ -1,8 +1,8 @@
package com.keylesspalace.tusky.util
import android.content.Context
import android.text.SpannableStringBuilder
import android.text.style.URLSpan
import android.widget.TextView
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.keylesspalace.tusky.R
@ -33,8 +33,8 @@ class LinkHelperTest {
HashTag("mastodev", "https://example.com/Tags/mastodev")
)
private val context: Context
get() = InstrumentationRegistry.getInstrumentation().targetContext
private val textView: TextView
get() = TextView(InstrumentationRegistry.getInstrumentation().targetContext)
@Test
fun whenSettingClickableText_mentionUrlsArePreserved() {
@ -168,8 +168,8 @@ class LinkHelperTest {
content.append(displayedContent, URLSpan(maliciousUrl), 0)
val oldContent = content.toString()
Assert.assertEquals(
context.getString(R.string.url_domain_notifier, displayedContent, maliciousDomain),
markupHiddenUrls(context, content).toString()
textView.context.getString(R.string.url_domain_notifier, displayedContent, maliciousDomain),
markupHiddenUrls(textView, content).toString()
)
Assert.assertEquals(oldContent, content.toString())
}
@ -182,8 +182,8 @@ class LinkHelperTest {
val content = SpannableStringBuilder()
content.append(displayedContent, URLSpan(maliciousUrl), 0)
Assert.assertEquals(
context.getString(R.string.url_domain_notifier, displayedContent, maliciousDomain),
markupHiddenUrls(context, content).toString()
textView.context.getString(R.string.url_domain_notifier, displayedContent, maliciousDomain),
markupHiddenUrls(textView, content).toString()
)
}
@ -196,9 +196,9 @@ class LinkHelperTest {
content.append(displayedContent, URLSpan("https://$domain/foo/bar"), 0)
}
val markedUpContent = markupHiddenUrls(context, content)
val markedUpContent = markupHiddenUrls(textView, content)
for (domain in domains) {
Assert.assertTrue(markedUpContent.contains(context.getString(R.string.url_domain_notifier, displayedContent, domain)))
Assert.assertTrue(markedUpContent.contains(textView.context.getString(R.string.url_domain_notifier, displayedContent, domain)))
}
}
@ -215,7 +215,7 @@ class LinkHelperTest {
.append("$domain/", URLSpan("https://$domain"), 0)
.append("$domain/", URLSpan("https://www.$domain"), 0)
val markedUpContent = markupHiddenUrls(context, content)
val markedUpContent = markupHiddenUrls(textView, content)
Assert.assertFalse(markedUpContent.contains("🔗"))
}
@ -228,7 +228,7 @@ class LinkHelperTest {
.append("Some Place | https://some.place/", URLSpan("https://some.place/"), 0)
.append("Some Place https://some.place/path", URLSpan("https://some.place/path"), 0)
val markedUpContent = markupHiddenUrls(context, content)
val markedUpContent = markupHiddenUrls(textView, content)
Assert.assertFalse(markedUpContent.contains("🔗"))
}
@ -241,7 +241,7 @@ class LinkHelperTest {
.append("Another Place | https://another.place/", URLSpan("https://some.place/"), 0)
.append("Another Place https://another.place/path", URLSpan("https://some.place/path"), 0)
val markedUpContent = markupHiddenUrls(context, content)
val markedUpContent = markupHiddenUrls(textView, content)
val asserts = listOf(
"Another Place: another.place",
"Another Place: another.place/",
@ -250,7 +250,7 @@ class LinkHelperTest {
"Another Place https://another.place/path"
)
asserts.forEach {
Assert.assertTrue(markedUpContent.contains(context.getString(R.string.url_domain_notifier, it, "some.place")))
Assert.assertTrue(markedUpContent.contains(textView.context.getString(R.string.url_domain_notifier, it, "some.place")))
}
}
@ -262,7 +262,7 @@ class LinkHelperTest {
builder.append(" ")
}
val markedUpContent = markupHiddenUrls(context, builder)
val markedUpContent = markupHiddenUrls(textView, builder)
for (mention in mentions) {
Assert.assertFalse(markedUpContent.contains("${getDomain(mention.url)})"))
}
@ -276,7 +276,7 @@ class LinkHelperTest {
builder.append(" ")
}
val markedUpContent = markupHiddenUrls(context, builder)
val markedUpContent = markupHiddenUrls(textView, builder)
for (mention in mentions) {
Assert.assertFalse(markedUpContent.contains("${getDomain(mention.url)})"))
}
@ -290,7 +290,7 @@ class LinkHelperTest {
builder.append(" ")
}
val markedUpContent = markupHiddenUrls(context, builder)
val markedUpContent = markupHiddenUrls(textView, builder)
for (tag in tags) {
Assert.assertFalse(markedUpContent.contains("${getDomain(tag.url)})"))
}
@ -304,7 +304,7 @@ class LinkHelperTest {
builder.append(" ")
}
val markedUpContent = markupHiddenUrls(context, builder)
val markedUpContent = markupHiddenUrls(textView, builder)
for (tag in tags) {
Assert.assertFalse(markedUpContent.contains("${getDomain(tag.url)})"))
}