Merge branch 'develop'

This commit is contained in:
Thomas 2022-12-16 18:21:27 +01:00
commit 376daf7c63
40 changed files with 393 additions and 56 deletions

View file

@ -13,8 +13,8 @@ android {
defaultConfig {
minSdk 21
targetSdk 32
versionCode 448
versionName "3.11.2"
versionCode 449
versionName "3.11.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
flavorDimensions "default"

View file

@ -1,4 +1,9 @@
[
{
"version": "3.11.3",
"code": "449",
"note": "Added:\n- Add more targeted languages in picker for translations\n- Add account name in push notifications\n\nFixed:\n- Fix a crash when changing language\n- Fix counter colors\n- Fix default link color\n- Fix a crash when clicking on mentions"
},
{
"version": "3.11.2",
"code": "448",

View file

@ -322,7 +322,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
binding.compose.setOnClickListener(v -> startActivity(new Intent(this, ComposeActivity.class)));
headerMenuOpen = false;
PushHelper.startStreaming(BaseMainActivity.this);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
@ -564,21 +564,15 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
//Update account details
new Thread(() -> {
try {
currentAccount = new Account(BaseMainActivity.this).getConnectedAccount();
//Delete cache older than 7 days
new StatusCache(BaseMainActivity.this).deleteForAllAccountAfter7Days();
MutedAccounts mutedAccounts = new MutedAccounts(BaseMainActivity.this).getMutedAccount(currentAccount);
if (mutedAccounts != null && mutedAccounts.accounts != null) {
filteredAccounts = mutedAccounts.accounts;
if (currentToken == null) {
currentToken = sharedpreferences.getString(Helper.PREF_USER_TOKEN, null);
}
currentAccount = new Account(BaseMainActivity.this).getConnectedAccount();
} catch (DBException e) {
e.printStackTrace();
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> {
if (currentToken == null) {
currentToken = sharedpreferences.getString(Helper.PREF_USER_TOKEN, null);
}
if (currentAccount == null) {
//It is not, the user is redirected to the login page
Intent myIntent = new Intent(BaseMainActivity.this, LoginActivity.class);
@ -747,7 +741,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
return false;
});
PushHelper.startStreaming(BaseMainActivity.this);
binding.toolbarSearch.setOnSearchClickListener(v -> binding.tabLayout.setVisibility(View.VISIBLE));
//For receiving data from other activities
@ -764,6 +758,30 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
}
}).start();
}
//Fetch some db values to initialize data
new Thread(() -> {
try {
if (currentAccount == null) {
if (currentToken == null || currentToken.trim().isEmpty()) {
currentToken = sharedpreferences.getString(Helper.PREF_USER_TOKEN, null);
}
try {
currentAccount = new Account(BaseMainActivity.this).getConnectedAccount();
} catch (DBException e) {
e.printStackTrace();
}
}
MutedAccounts mutedAccounts = new MutedAccounts(BaseMainActivity.this).getMutedAccount(currentAccount);
if (mutedAccounts != null && mutedAccounts.accounts != null) {
filteredAccounts = mutedAccounts.accounts;
}
//Delete cache older than 7 days
new StatusCache(BaseMainActivity.this).deleteForAllAccountAfter7Days();
} catch (DBException e) {
e.printStackTrace();
}
}).start();
//Fetch recent used accounts
new Thread(() -> {
try {

View file

@ -103,8 +103,6 @@ public class Status implements Serializable, Cloneable {
public boolean isTruncated = true;
public boolean isFetchMore = false;
public PositionFetchMore positionFetchMore = PositionFetchMore.BOTTOM;
public boolean isMediaDisplayed = false;
public boolean isMediaObfuscated = true;
public boolean isChecked = false;
public String translationContent;
public boolean translationShown;

View file

@ -197,7 +197,7 @@ public class MutedAccounts implements Serializable {
MutedAccounts mutedAccounts = getMutedAccount(forAccount);
if (mutedAccounts != null && mutedAccounts.accounts != null) {
for (Account account : mutedAccounts.accounts) {
if (account.id.equals(target.id)) {
if (account != null && target != null && account.id.equals(target.id)) {
return true;
}
}

View file

@ -1537,7 +1537,7 @@ public class Helper {
}
notificationBuilder.setContentTitle(title);
notificationBuilder.setLargeIcon(icon);
notificationBuilder.setSubText(String.format("@%s@%s", account.mastodon_account.username, account.instance));
Notification summaryNotification = new NotificationCompat.Builder(context, channelId)
.setContentTitle(title)

View file

@ -125,7 +125,7 @@ public class SpannableHelper {
linkColor = link_color;
}
} else {
linkColor = ThemeHelper.getAttColor(context, R.attr.linkColor);
linkColor = -1;
}
SpannableString initialContent;
@ -474,7 +474,9 @@ public class SpannableHelper {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(linkColor);
if (linkColor != -1) {
ds.setColor(linkColor);
}
}
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
@ -701,7 +703,9 @@ public class SpannableHelper {
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(linkColor);
if (linkColor != -1) {
ds.setColor(linkColor);
}
}
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
@ -735,7 +739,9 @@ public class SpannableHelper {
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(linkColor);
if (linkColor != -1) {
ds.setColor(linkColor);
}
}
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
@ -772,7 +778,9 @@ public class SpannableHelper {
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(linkColor);
if (linkColor != -1) {
ds.setColor(linkColor);
}
}
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
@ -929,7 +937,9 @@ public class SpannableHelper {
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(linkColor);
if (linkColor != -1) {
ds.setColor(linkColor);
}
}
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
@ -1078,7 +1088,9 @@ public class SpannableHelper {
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setColor(linkColor);
if (linkColor != -1) {
ds.setColor(linkColor);
}
}
},
startPosition, endPosition,

View file

@ -137,6 +137,8 @@ public class TimelineHelper {
if (m.find()) {
status.filteredByApp = filter;
continue;
} else {
status.filteredByApp = null;
}
if (status.spoiler_text != null) {
String spoilerText;
@ -147,24 +149,29 @@ public class TimelineHelper {
Matcher ms = p.matcher(spoilerText);
if (ms.find()) {
status.filteredByApp = filter;
continue;
} else {
status.filteredByApp = null;
}
}
if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
if (filteredAccounts != null && filteredAccounts.size() > 0) {
for (Account account : filteredAccounts) {
if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) {
Filter filterCustom = new Filter();
filterCustom.filter_action = "hide";
ArrayList<String> contextCustom = new ArrayList<>();
contextCustom.add("home");
filterCustom.title = "Fedilab";
filterCustom.context = contextCustom;
status.filteredByApp = filterCustom;
}
}
}
}
}
}
}
if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
if (filteredAccounts != null && filteredAccounts.size() > 0) {
for (Status status : statuses) {
if (status.filteredByApp != null) {
continue;
}
for (Account account : filteredAccounts) {
if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) {
Filter filterCustom = new Filter();
filterCustom.filter_action = "hide";
ArrayList<String> contextCustom = new ArrayList<>();
contextCustom.add("home");
filterCustom.title = "Fedilab";
filterCustom.context = contextCustom;
status.filteredByApp = filterCustom;
}
}
}

View file

@ -1021,11 +1021,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
new WeakReference<>(holder.binding.spoiler), () -> recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()))),
TextView.BufferType.SPANNABLE);
statusToDeal.isExpended = true;
statusToDeal.isMediaDisplayed = true;
} else {
holder.binding.spoilerExpand.setOnClickListener(v -> {
statusToDeal.isExpended = !statusToDeal.isExpended;
statusToDeal.isMediaDisplayed = !statusToDeal.isMediaDisplayed;
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
});
holder.binding.spoilerExpand.setVisibility(View.VISIBLE);
@ -2025,7 +2023,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
layoutMediaBinding.viewDescription.setVisibility(View.GONE);
}
if (!mediaObfuscated(statusToDeal) || expand_media) {
if (!statusToDeal.sensitive || expand_media) {
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24);
RequestBuilder<Drawable> requestBuilder = Glide.with(layoutMediaBinding.media.getContext())
.load(attachment.preview_url);
@ -2051,8 +2049,8 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}
layoutMediaBinding.media.setOnClickListener(v -> {
if (statusToDeal.isMediaObfuscated && mediaObfuscated(statusToDeal) && !expand_media) {
statusToDeal.isMediaObfuscated = false;
if (statusToDeal.sensitive && !expand_media) {
statusToDeal.sensitive = false;
int position = holder.getBindingAdapterPosition();
adapter.notifyItemChanged(position);
@ -2062,7 +2060,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}
public void onFinish() {
statusToDeal.isMediaObfuscated = true;
statusToDeal.sensitive = true;
adapter.notifyItemChanged(position);
}
}.start();
@ -2099,7 +2097,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
mRecyclerView = recyclerView;
}
private static boolean mediaObfuscated(Status status) {
/* private static boolean mediaObfuscated(Status status) {
//Media is not sensitive and doesn't have a spoiler text
if (!status.isMediaObfuscated) {
return false;
@ -2112,7 +2110,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
} else {
return status.sensitive;
}
}
}*/
/**
* Send a broadcast to other open fragments that content a timeline

View file

@ -55,7 +55,8 @@ public class FragmentLanguageSettings extends PreferenceFragmentCompat implement
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.compareToIgnoreCase(getString(R.string.SET_DEFAULT_LOCALE_NEW)) == 0 || key.compareToIgnoreCase(getString(R.string.SET_TRANSLATE_VALUES_RESET)) == 0) {
requireActivity().recreate();
requireActivity().finish();
startActivity(requireActivity().getIntent());
Helper.recreateMainActivity(requireActivity());
}
}

View file

@ -177,7 +177,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
private String publicTrendsDomain;
private int lockForResumeCall;
private boolean isNotPinnedTimeline;
private int extraCalls;
//Allow to recreate data when detaching/attaching fragment
public void recreate() {
initialStatuses = null;
@ -290,6 +290,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
//Only fragment in main view pager should not have the view initialized
//AND Only the first fragment will initialize its view
flagLoading = false;
extraCalls = -1;
}
@ -454,12 +455,34 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
min_id = fetched_statuses.pagination.min_id;
}
}
int sizeBeforeFilter = 0;
int filteredMessage = 0;
int requestedMessages = MastodonHelper.statusesPerCall(requireActivity());
sizeBeforeFilter = fetched_statuses.statuses.size();
for (Status status : fetched_statuses.statuses) {
if (status.filteredByApp != null) {
filteredMessage++;
}
}
//TODO: keep for an improvement in beta
/*
int displayedMessages = sizeBeforeFilter - filteredMessage;
if(displayedMessages < 5 && extraCalls < 8) {
router(direction);
if(extraCalls == -1) {
extraCalls = 1;
} else {
extraCalls++;
}
}*/
} else if (direction == DIRECTION.BOTTOM) {
flagLoading = true;
}
if (direction == DIRECTION.SCROLL_TOP) {
binding.recyclerView.scrollToPosition(0);
}
}
/**
@ -568,6 +591,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
flagLoading = true;
binding.loadingNextElements.setVisibility(View.VISIBLE);
router(DIRECTION.BOTTOM);
extraCalls = -1;
}
} else {
binding.loadingNextElements.setVisibility(View.GONE);
@ -577,6 +601,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
flagLoading = true;
binding.loadingNextElements.setVisibility(View.VISIBLE);
router(DIRECTION.TOP);
extraCalls = -1;
}
}
}

View file

@ -74,7 +74,7 @@ public class NotificationsVM extends AndroidViewModel {
sortDesc(notificationList);
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
if (notificationList.get(notificationList.size() - 1).id.compareToIgnoreCase(timelineNotifications.get(0).id) > 0) {
if (!timelineNotifications.contains(notificationList.get(notificationList.size() - 1))) {
notificationList.get(notificationList.size() - 1).isFetchMore = true;
notificationList.get(notificationList.size() - 1).positionFetchMore = Notification.PositionFetchMore.TOP;
}

View file

@ -105,7 +105,7 @@ public class TimelinesVM extends AndroidViewModel {
sortDesc(statusList);
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
if (statusList.get(statusList.size() - 1).id.compareToIgnoreCase(timelineStatuses.get(0).id) > 0) {
if (!timelineStatuses.contains(statusList.get(statusList.size() - 1))) {
statusList.get(statusList.size() - 1).isFetchMore = true;
statusList.get(statusList.size() - 1).positionFetchMore = Status.PositionFetchMore.TOP;
}
@ -128,7 +128,7 @@ public class TimelinesVM extends AndroidViewModel {
sortDescConv(conversationList);
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
if (conversationList.get(conversationList.size() - 1).id.compareToIgnoreCase(timelineConversations.get(0).id) > 0) {
if (!timelineConversations.contains(conversationList.get(conversationList.size() - 1))) {
conversationList.get(conversationList.size() - 1).isFetchMore = true;
conversationList.get(conversationList.size() - 1).positionFetchMore = Conversation.PositionFetchMore.TOP;
}

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?attr/colorAccent" />
<solid android:color="?colorPrimary" />
<padding
android:left="2dp"
android:right="2dp" />

View file

@ -11,7 +11,7 @@
android:background="@drawable/shape_counter"
android:gravity="center"
android:padding="3dp"
android:textColor="@color/white"
android:textColor="?colorOnPrimary"
android:textSize="11sp"
tools:text="9+" />
</merge>

View file

@ -1232,6 +1232,27 @@
<item>sr</item>
<item>uk</item>
<item>ru</item>
<item>az</item>
<item>ca</item>
<item>cz</item>
<item>da</item>
<item>nl</item>
<item>eo</item>
<item>fi</item>
<item>el</item>
<item>he</item>
<item>hi</item>
<item>hu</item>
<item>id</item>
<item>ga</item>
<item>ko</item>
<item>fa</item>
<item>pl</item>
<item>sk</item>
<item>sv</item>
<item>tr</item>
<item>uk</item>
<item>vi</item>
</string-array>
<string-array name="SET_LIVE_TRANSLATE_VALUES" translatable="false">
<item>-----</item>
@ -1240,13 +1261,34 @@
<item>Deutsch</item>
<item>Italiano</item>
<item>日本語</item>
<item>繁體中文</item>
<item>中文</item>
<item>العربية</item>
<item>Português</item>
<item>Español</item>
<item>Српски</item>
<item>Українська</item>
<item>Русский</item>
<item>azərbaycan dili</item>
<item>Català</item>
<item>Czech</item>
<item>Danish</item>
<item>Nederlands</item>
<item>Esperanto</item>
<item>suomi</item>
<item>Ελληνικά</item>
<item>עברית</item>
<item>हिन्दी</item>
<item>magyar</item>
<item>Bahasa Indonesia</item>
<item>Gaeilge</item>
<item>한국어</item>
<item>فارسی</item>
<item>Polski</item>
<item>Slovakia</item>
<item>Svenska</item>
<item>Türkçe</item>
<item>Українська</item>
<item>Tiếng Việt</item>
</string-array>
<string-array name="SET_TRANSLATE_VALUES" translatable="false">
<item>English</item>

View file

@ -0,0 +1,9 @@
Added:
- Add more targeted languages in picker for translations
- Add account name in push notifications
Fixed:
- Fix a crash when changing language
- Fix counter colors
- Fix default link color
- Fix a crash when clicking on mentions

View file

@ -0,0 +1,13 @@
Ajouté :
- Affichage du client dans les messages détaillés
- Support du visuel pour les citations commençant par ">"
- Augmentation de l'indentation des fils (zéro à 20, défaut 5)
- Visibilité des réponses publiques définies comme non-listée (peut être désactivé)
Changé :
- Réduction de la taille du titre quand le texte est agrandi.
Résolu :
- Filtres non-appliqués
- Bloquer un compte ne retire pas les messages du cache
- Quelques plantages

View file

@ -0,0 +1,5 @@
Résolu :
- Ordre des notifications
- URL lors du partage des messages boostés
- Pages vides au redémarrage
- Quelques plantages

View file

@ -0,0 +1,4 @@
Résolu :
- Problèmes avec des messages/notifications affichés incorrectement
- Friendica : problèmes avec les mentions et étiquettes (ouvrir le navigateur)
- Amélioration du partage

View file

@ -0,0 +1,9 @@
Changé :
- Les étiquettes sont classés par ordre de popularité dans la recherche
Résolu :
- Impossible d'obtenir l'ID du client sur certains appareils
- Les messages/notifications n'étaient pas affichés correctement
- Notifications non-reçues
- Friendica : problèmes avec les mentions et les étiquettes (ouvre le navigateur)
- Amélioration du partage

View file

@ -0,0 +1,9 @@
Ajouté :
- 2 nouveaux thèmes clairs
- Fonctionnalités de modération
Résolu :
- Filtres non-fonctionnels
- Plantages avec les tendances
- Contenu effacé lors de l'envoi de messages (mentions)
- Autres corrections de bugs

View file

@ -0,0 +1,16 @@
Ajouté :
- Suivi des balises (entrée dédiée dans le menu)
- Réduction de la liste des langues lors de la rédaction (Paramètres > Composer)
- Indicateur de langue lors de la rédaction
- Les réponses sont automatiquement définies sur la langue du premier message
- Deux nouveaux thèmes de jour
- Plus de fonctionnalités de modération
- Le nom de la liste peut être modifié
Résolu :
- Le filtre ne fonctionne pas
- Plantage avec les tendances
- Problème avec les thèmes
- Certains contenus perdus lors de l'envoi de messages (mentions)
- Correction des blocages dans les fils chronologiques
- Quelques autres correctifs

View file

@ -0,0 +1,14 @@
Ajouté :
- Prise en charge des liens ouverts contenant /@display_name/ dans leur chemin (fonctionne sur les appareils plus anciens)
- Afficher le nombre de réponses lorsque les compteurs sont activés
- Ajout de la prise en charge du filtrage des messages de profil
Modifié :
- La vue Composer prend toute la largeur même dans les fils
- Réinitialiser le marqueur de notification push lors de la suppression du cache
Résolu :
- Brouillon stocké lors de la réponse "non" ou l'invite de dialogue sans modifications
- Les filtres ne fonctionnent pas avec les balises
- Ajout d'un message d'erreur spécifique pour les balises suivies
- Pages vides au démarrage de l'application

View file

@ -0,0 +1,2 @@
Ajouté :
- Support complet des nouveaux filtres de Mastodon 4

View file

@ -0,0 +1,5 @@
Ajouté :
- Visiter les profils sans être authentifié / Autoriser l'affichage de tous leurs messages
Corrigé :
- L'enregistrement des médias échoue sur certains appareils

View file

@ -0,0 +1,14 @@
Ajouté :
- Prise en charge complète des nouveaux filtres pour Mastodon 4
- Visiter les profils sans être authentifié / Autoriser l'affichage de tous leurs messages
Modifié :
- La vue Composer prend toute la largeur même dans les fils
- Les comptes peuvent être mis en sourdine à partir de leur profil
Résolu :
- Brouillon stocké lors de la réponse "non" ou de l'invite de dialogue sans modifications
- Pages vides au démarrage de l'application
- L'enregistrement et le partage de médias échouent sur certains appareils
- Ajout de la prise en charge des notifications d'administration
- Copier le contenu d'un message

View file

@ -0,0 +1,13 @@
Ajouté :
- Liste des domaines bloqués (permet de débloquer)
- Prise en charge des liens gemini
- Suggestion de Suiveurs
Modifié :
- Autoriser la modification du terme de recherche
Fixé :
- Brouillons supprimés sans avertissement
- L'application plante lorsque le proxy est défini
- Filtre non synchronisé après avoir été modifié
- Quelques plantages

View file

@ -0,0 +1,18 @@
Ajouté :
- Liste des domaines bloqués (permet de débloquer)
- Prise en charge des liens gemini
- Suiveurs suggérés
- Mod/Adm : gérer les domaines bloqués par l'instance
- Ouvrir des messages avec un autre compte
- Autoriser à désactiver les notifications pour les administrateurs
- Trier les listes
Modifié :
- Autoriser la modification du terme de recherche
Fixé :
- Brouillons supprimés sans avertissement
- Supprimer les listes de "Gérer les chronologies"
- L'application plante lorsque le proxy est défini
- Filtre non synchronisé après avoir été modifié
- Quelques plantages / améliorations

View file

@ -0,0 +1,12 @@
Ajouté :
- Silencer les tags par un appui long dans les timelines
Changé :
- Les messages de comptes silencés sont à présent retirés du cache
Résolu :
- Ouvrir avec un autre compte
- Correction des sauts dans les profils
- Médias non-affichés dans les albums → Force l'indexation
- Le navigateur web intégré n'affiche pas le niveau admin
- Quelques plantages

View file

@ -0,0 +1,9 @@
Ajouté :
- Migration vers Material Design 3
- 5 thèmes (Clair, Sombre, Solarized Clair/Sombre, Noir)
- Basculement automatique entre Clair/Sombre
- Les thèmes Clair et Sombre peuvent être définis en fonction de l'heure
- Android 12+ : Couleur dynamique
Résolu :
- Sauts dans les timelines

View file

@ -0,0 +1,10 @@
Changé :
- Retrait du support du navigateur web intégré
- Plus d'espace entre les boutons d'action des messages
Résolu :
- Problème de taille du texte
- Chevauchement de texte
- Mauvais fond pour le thème Solarized Sombre
- Mélange entre les thèmes Clair et Sombre
- Bouton de sauvegarde caché

View file

@ -0,0 +1,14 @@
Ajouté :
- Nouvelle apparence avec 5 thèmes
Changé :
- Retrait du support du navigateur web intégré
- Ajuster l'image d'aperçu affiche l'image verticalement
- Ajout des compteurs à côté des images
Résolu :
- Saut dans les timelines
- Réponses aux mauvais messages avec les instances suivies
- Bogue avec Supprimer & Réécrire avec un média
- Liste ne peut pas être caché
- Quelques plantages

View file

@ -0,0 +1,6 @@
Changé :
- Retrait de la carte de présentation
- Couleur des liens pour le thème Sombre
Résolu :
- Crash lors du changement de thème

View file

@ -0,0 +1,4 @@
Résolu :
- Les émojis personnalisés ne sont pas toujours affichés
- Sauts dans les timelines quand "ajuster les images" est utilisé
- Thème sombre : boutons de timeline sans toggle

View file

@ -0,0 +1,3 @@
Résolu :
- Sauts lors du défilement avec ajustement des images
- Bouton de récupération cassé avec le cache

View file

@ -0,0 +1,11 @@
Ajouté :
- Thème Dracula
Changé :
- Couleurs des thèmes Clair/Sombre/Noir
Résolu :
- Images animés de profils non-affichées
- Mentions cassées dans les descriptions et champs de profil
- Les modèles de balises dans les URL cassent les liens
- Faute de frappe dans les tags suivis

View file

@ -0,0 +1,16 @@
Ajouté :
- Thème Dracula
- Couleurs de messages personnalisées
- Activer/Désactiver les cartes de présentation
Changé :
- Couleurs pour certains thèmes
- Espaces entre les boutons
Résolu :
- Images animés sur les profils non-affichées
- Mentions cassées dans les descriptions et champs de profil
- Sauts lors du défilement avec les ajustements de miniatures
- Bouton de récupération cassé avec le cache
- Les modèles de balises dans les URL cassent les liens
- Faute de frappe dans les tags suivis

View file

@ -0,0 +1,4 @@
Ajouté :
- Afficher tous les messages d'une enfilade depuis l'instance distante (si possible)
* Seulement pour les messages publiques des instances utilisant l'API Mastodon
* Un bouton dédié est affiché en haut à droite quand les conditions sont remplies.

View file

@ -0,0 +1,11 @@
Ajouté :
- Permettre de rétablir/ne plus suivre/désépingler une étiquette depuis les timelines des étiquettes
- Automatiquement ajouter l'étiquette quand on écrit depuis une timeline d'étiquette
- Ajout d'un bouton de traduction en bas des messages (par défaut : désactivé)
- Ajout des rôles de comptes dans les profils
Résolu :
- Contact impossible quand on écrit
- Barre de status pour le thème Noir
- Message dupliqué dans les conversations lorsque édité
- Problème de couleur sur Android 5