summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas <tschneider.ac@gmail.com>2022-12-16 18:21:27 +0100
committerThomas <tschneider.ac@gmail.com>2022-12-16 18:21:27 +0100
commit376daf7c6307a35c338c774c68b94d271ab4e6e9 (patch)
tree0697609da8b923ce35830af58f512f500ea4ec65
parent2a675da7c272ac7dae21561e962fa800d26272dd (diff)
parentf858a870bde155fb0c28b97553e0b55f47babfcc (diff)
Merge branch 'develop'3.11.3
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/main/assets/release_notes/notes.json5
-rw-r--r--app/src/main/java/app/fedilab/android/BaseMainActivity.java40
-rw-r--r--app/src/main/java/app/fedilab/android/client/entities/api/Status.java2
-rw-r--r--app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java2
-rw-r--r--app/src/main/java/app/fedilab/android/helper/Helper.java2
-rw-r--r--app/src/main/java/app/fedilab/android/helper/SpannableHelper.java26
-rw-r--r--app/src/main/java/app/fedilab/android/helper/TimelineHelper.java39
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java14
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentLanguageSettings.java3
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java27
-rw-r--r--app/src/main/java/app/fedilab/android/viewmodel/mastodon/NotificationsVM.java2
-rw-r--r--app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java4
-rw-r--r--app/src/main/res/drawable/shape_counter.xml2
-rw-r--r--app/src/main/res/layout/notification_badge.xml2
-rw-r--r--app/src/main/res/values/strings.xml44
-rw-r--r--src/fdroid/fastlane/metadata/android/en/changelogs/449.txt9
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/422.txt13
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/423.txt5
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/424.txt4
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/425.txt9
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/426.txt9
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/427.txt16
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/428.txt14
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/429.txt2
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/430.txt5
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/431.txt14
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/432.txt13
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/433.txt18
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/434.txt12
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/435.txt9
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/436.txt10
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/437.txt14
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/439.txt6
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/440.txt4
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/441.txt3
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/442.txt11
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/443.txt16
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/444.txt4
-rw-r--r--src/fdroid/fastlane/metadata/android/fr/changelogs/445.txt11
40 files changed, 393 insertions, 56 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 413135ac4..4182bde72 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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"
diff --git a/app/src/main/assets/release_notes/notes.json b/app/src/main/assets/release_notes/notes.json
index 36a49beec..b72d5facc 100644
--- a/app/src/main/assets/release_notes/notes.json
+++ b/app/src/main/assets/release_notes/notes.json
@@ -1,5 +1,10 @@
[
{
+ "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",
"note": "Added:\n- Mute/Unmute accounts in the Home timeline from their messages or their profiles\n- Add all users from a list to \"Muted home\" in one click\n- Display/Manage users that are muted for home\n\nFixed:\n- Timeline crashes"
diff --git a/app/src/main/java/app/fedilab/android/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/BaseMainActivity.java
index 09fdb201b..0ebb6a3ba 100644
--- a/app/src/main/java/app/fedilab/android/BaseMainActivity.java
+++ b/app/src/main/java/app/fedilab/android/BaseMainActivity.java
@@ -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 {
diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Status.java b/app/src/main/java/app/fedilab/android/client/entities/api/Status.java
index 7c39f4874..585eccec2 100644
--- a/app/src/main/java/app/fedilab/android/client/entities/api/Status.java
+++ b/app/src/main/java/app/fedilab/android/client/entities/api/Status.java
@@ -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;
diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java b/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java
index 5932aac33..a1d3b2194 100644
--- a/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java
+++ b/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java
@@ -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;
}
}
diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java
index e1d55937b..3b9855918 100644
--- a/app/src/main/java/app/fedilab/android/helper/Helper.java
+++ b/app/src/main/java/app/fedilab/android/helper/Helper.java
@@ -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)
diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java
index 03e9a52c5..6179f6b92 100644
--- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java
+++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java
@@ -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,
diff --git a/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java
index 66b01ba87..589528a8c 100644
--- a/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java
+++ b/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java
@@ -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;
}
}
}
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java
index fc8733487..7c079c84e 100644
--- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java
@@ -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
diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentLanguageSettings.java b/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentLanguageSettings.java
index 2415154d4..dba3431c6 100644
--- a/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentLanguageSettings.java
+++ b/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentLanguageSettings.java
@@ -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());
}
}
diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
index 1ae410459..cdc3462a4 100644
--- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
+++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
@@ -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;
}
}
}
diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/NotificationsVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/NotificationsVM.java
index cb9d624c9..d7ee2dd4b 100644
--- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/NotificationsVM.java
+++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/NotificationsVM.java
@@ -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;
}
diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java
index 4b98de70e..a40ddaa13 100644
--- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java
+++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java
@@ -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 ha