diff options
author | Thomas <tschneider.ac@gmail.com> | 2022-12-16 18:21:27 +0100 |
---|---|---|
committer | Thomas <tschneider.ac@gmail.com> | 2022-12-16 18:21:27 +0100 |
commit | 376daf7c6307a35c338c774c68b94d271ab4e6e9 (patch) | |
tree | 0697609da8b923ce35830af58f512f500ea4ec65 | |
parent | 2a675da7c272ac7dae21561e962fa800d26272dd (diff) | |
parent | f858a870bde155fb0c28b97553e0b55f47babfcc (diff) |
Merge branch 'develop'3.11.3
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 greate |