diff options
Diffstat (limited to 'app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline')
8 files changed, 387 insertions, 297 deletions
diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonAccount.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonAccount.java index 4e26ec8ea..f55c74922 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonAccount.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonAccount.java @@ -15,6 +15,7 @@ package app.fedilab.android.mastodon.ui.fragment.timeline; * see <http://www.gnu.org/licenses>. */ +import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.currentToken; import static app.fedilab.android.mastodon.helper.MastodonHelper.ACCOUNTS_PER_CALL; @@ -38,14 +39,15 @@ import java.util.List; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.databinding.FragmentPaginationBinding; import app.fedilab.android.mastodon.activities.SearchResultTabActivity; import app.fedilab.android.mastodon.client.entities.api.Account; import app.fedilab.android.mastodon.client.entities.api.Accounts; import app.fedilab.android.mastodon.client.entities.api.Pagination; import app.fedilab.android.mastodon.client.entities.api.RelationShip; +import app.fedilab.android.mastodon.client.entities.app.CachedBundle; import app.fedilab.android.mastodon.client.entities.app.Timeline; +import app.fedilab.android.mastodon.exception.DBException; import app.fedilab.android.mastodon.helper.Helper; import app.fedilab.android.mastodon.helper.MastodonHelper; import app.fedilab.android.mastodon.ui.drawer.AccountAdapter; @@ -77,19 +79,49 @@ public class FragmentMastodonAccount extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - if (getArguments() != null) { - search = getArguments().getString(Helper.ARG_SEARCH_KEYWORD, null); - accountTimeline = (Account) getArguments().getSerializable(Helper.ARG_ACCOUNT); - followType = (FedilabProfileTLPageAdapter.follow_type) getArguments().getSerializable(Helper.ARG_FOLLOW_TYPE); - viewModelKey = getArguments().getString(Helper.ARG_VIEW_MODEL_KEY, ""); - timelineType = (Timeline.TimeLineEnum) getArguments().get(Helper.ARG_TIMELINE_TYPE); - order = getArguments().getString(Helper.ARG_DIRECTORY_ORDER, "active"); - local = getArguments().getBoolean(Helper.ARG_DIRECTORY_LOCAL, false); - checkRemotely = getArguments().getBoolean(Helper.ARG_CHECK_REMOTELY, false); - } + instance = currentInstance; token = currentToken; + flagLoading = false; + binding = FragmentPaginationBinding.inflate(inflater, container, false); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); + boolean displayScrollBar = sharedpreferences.getBoolean(getString(R.string.SET_TIMELINE_SCROLLBAR), false); + binding.recyclerView.setVerticalScrollBarEnabled(displayScrollBar); + if (getArguments() != null) { + long bundleId = getArguments().getLong(Helper.ARG_INTENT_ID, -1); + if (bundleId != -1) { + new CachedBundle(requireActivity()).getBundle(bundleId, currentAccount, this::initializeAfterBundle); + } else { + if (getArguments().containsKey(Helper.ARG_CACHED_ACCOUNT_ID)) { + try { + accountTimeline = new CachedBundle(requireActivity()).getCachedAccount(currentAccount, getArguments().getString(Helper.ARG_CACHED_ACCOUNT_ID)); + } catch (DBException e) { + e.printStackTrace(); + } + } + initializeAfterBundle(getArguments()); + } + } else { + initializeAfterBundle(null); + } + + return binding.getRoot(); + } + + private void initializeAfterBundle(Bundle bundle) { + if (bundle != null) { + search = bundle.getString(Helper.ARG_SEARCH_KEYWORD, null); + if (bundle.containsKey(Helper.ARG_ACCOUNT)) { + accountTimeline = (Account) bundle.getSerializable(Helper.ARG_ACCOUNT); + } + followType = (FedilabProfileTLPageAdapter.follow_type) bundle.getSerializable(Helper.ARG_FOLLOW_TYPE); + viewModelKey = bundle.getString(Helper.ARG_VIEW_MODEL_KEY, ""); + timelineType = (Timeline.TimeLineEnum) bundle.get(Helper.ARG_TIMELINE_TYPE); + order = bundle.getString(Helper.ARG_DIRECTORY_ORDER, "active"); + local = bundle.getBoolean(Helper.ARG_DIRECTORY_LOCAL, false); + checkRemotely = bundle.getBoolean(Helper.ARG_CHECK_REMOTELY, false); + } if (checkRemotely) { String[] acctArray = accountTimeline.acct.split("@"); if (acctArray.length > 1) { @@ -102,20 +134,6 @@ public class FragmentMastodonAccount extends Fragment { token = currentToken; } } - - flagLoading = false; - binding = FragmentPaginationBinding.inflate(inflater, container, false); - SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); - boolean displayScrollBar = sharedpreferences.getBoolean(getString(R.string.SET_TIMELINE_SCROLLBAR), false); - binding.recyclerView.setVerticalScrollBarEnabled(displayScrollBar); - return binding.getRoot(); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - binding.loader.setVisibility(View.VISIBLE); - binding.recyclerView.setVisibility(View.GONE); accountsVM = new ViewModelProvider(FragmentMastodonAccount.this).get(viewModelKey, AccountsVM.class); max_id = null; offset = 0; @@ -126,6 +144,14 @@ public class FragmentMastodonAccount extends Fragment { router(true); } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + binding.loader.setVisibility(View.VISIBLE); + binding.recyclerView.setVisibility(View.GONE); + + } + /** * Router for timelines */ @@ -206,7 +232,7 @@ public class FragmentMastodonAccount extends Fragment { } } else if (timelineType == Timeline.TimeLineEnum.MUTED_TIMELINE_HOME) { if (firstLoad) { - accountsVM.getMutedHome(MainActivity.currentAccount) + accountsVM.getMutedHome(currentAccount) .observe(getViewLifecycleOwner(), this::initializeAccountCommonView); } } else if (timelineType == Timeline.TimeLineEnum.BLOCKED_TIMELINE) { diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonContext.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonContext.java index 3adf0c1f4..e8d6bc388 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonContext.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonContext.java @@ -14,6 +14,7 @@ package app.fedilab.android.mastodon.ui.fragment.timeline; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ +import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.mastodon.activities.ContextActivity.displayCW; import static app.fedilab.android.mastodon.activities.ContextActivity.expand; @@ -21,7 +22,6 @@ import android.content.BroadcastReceiver; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; -import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -31,7 +31,6 @@ import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; - import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.LinearLayoutManager; @@ -44,6 +43,7 @@ import app.fedilab.android.databinding.FragmentPaginationBinding; import app.fedilab.android.mastodon.activities.ContextActivity; import app.fedilab.android.mastodon.client.entities.api.Context; import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.client.entities.app.CachedBundle; import app.fedilab.android.mastodon.client.entities.app.Timeline; import app.fedilab.android.mastodon.helper.DividerDecoration; import app.fedilab.android.mastodon.helper.Helper; @@ -59,75 +59,79 @@ public class FragmentMastodonContext extends Fragment { private StatusesVM statusesVM; private List<Status> statuses; private StatusAdapter statusAdapter; - private boolean refresh; //Handle actions that can be done in other fragments private final BroadcastReceiver receive_action = new BroadcastReceiver() { @Override public void onReceive(android.content.Context context, Intent intent) { - Bundle b = intent.getExtras(); - if (b != null) { - Status receivedStatus = (Status) b.getSerializable(Helper.ARG_STATUS_ACTION); - String delete_statuses_for_user = b.getString(Helper.ARG_STATUS_ACCOUNT_ID_DELETED); - Status status_to_delete = (Status) b.getSerializable(Helper.ARG_STATUS_DELETED); - Status statusPosted = (Status) b.getSerializable(Helper.ARG_STATUS_POSTED); - Status status_to_update = (Status) b.getSerializable(Helper.ARG_STATUS_UPDATED); - if (receivedStatus != null && statusAdapter != null) { - int position = getPosition(receivedStatus); - if (position >= 0) { - statuses.get(position).reblog = receivedStatus.reblog; - statuses.get(position).reblogged = receivedStatus.reblogged; - statuses.get(position).favourited = receivedStatus.favourited; - statuses.get(position).bookmarked = receivedStatus.bookmarked; - statuses.get(position).reblogs_count = receivedStatus.reblogs_count; - statuses.get(position).favourites_count = receivedStatus.favourites_count; - statusAdapter.notifyItemChanged(position); - } - } else if (delete_statuses_for_user != null && statusAdapter != null) { - List<Status> statusesToRemove = new ArrayList<>(); - for (Status status : statuses) { - if (status.account.id.equals(delete_statuses_for_user)) { - statusesToRemove.add(status); + Bundle args = intent.getExtras(); + if (args != null) { + long bundleId = args.getLong(Helper.ARG_INTENT_ID, -1); + new CachedBundle(requireActivity()).getBundle(bundleId, currentAccount, bundle -> { + Status receivedStatus = (Status) bundle.getSerializable(Helper.ARG_STATUS_ACTION); + String delete_statuses_for_user = bundle.getString(Helper.ARG_STATUS_ACCOUNT_ID_DELETED); + Status status_to_delete = (Status) bundle.getSerializable(Helper.ARG_STATUS_DELETED); + Status statusPosted = (Status) bundle.getSerializable(Helper.ARG_STATUS_POSTED); + Status status_to_update = (Status) bundle.getSerializable(Helper.ARG_STATUS_UPDATED); + if (receivedStatus != null && statusAdapter != null) { + int position = getPosition(receivedStatus); + if (position >= 0) { + statuses.get(position).reblog = receivedStatus.reblog; + statuses.get(position).reblogged = receivedStatus.reblogged; + statuses.get(position).favourited = receivedStatus.favourited; + statuses.get(position).bookmarked = receivedStatus.bookmarked; + statuses.get(position).reblogs_count = receivedStatus.reblogs_count; + statuses.get(position).favourites_count = receivedStatus.favourites_count; + statusAdapter.notifyItemChanged(position); } - } - for (Status statusToRemove : statusesToRemove) { - int position = getPosition(statusToRemove); + } else if (delete_statuses_for_user != null && statusAdapter != null) { + List<Status> statusesToRemove = new ArrayList<>(); + for (Status status : statuses) { + if (status.account.id.equals(delete_statuses_for_user)) { + statusesToRemove.add(status); + } + } + for (Status statusToRemove : statusesToRemove) { + int position = getPosition(statusToRemove); + if (position >= 0) { + statuses.remove(position); + statusAdapter.notifyItemRemoved(position); + } + } + } else if (status_to_delete != null && statusAdapter != null) { + int position = getPosition(status_to_delete); if (position >= 0) { statuses.remove(position); statusAdapter.notifyItemRemoved(position); } - } - } else if (status_to_delete != null && statusAdapter != null) { - int position = getPosition(status_to_delete); - if (position >= 0) { - statuses.remove(position); - statusAdapter.notifyItemRemoved(position); - } - } else if (status_to_update != null && statusAdapter != null) { - int position = getPosition(status_to_update); - if (position >= 0) { - statuses.set(position, status_to_update); - statusAdapter.notifyItemChanged(position); - } - } else if (statusPosted != null && statusAdapter != null) { - if (requireActivity() instanceof ContextActivity) { - int i = 0; - for (Status status : statuses) { - if (status.id.equals(statusPosted.in_reply_to_id)) { - statuses.add((i + 1), statusPosted); - statusAdapter.notifyItemInserted((i + 1)); - if (requireActivity() instanceof ContextActivity) { - //Redraw decorations - statusAdapter.notifyItemRangeChanged(0, statuses.size()); + } else if (status_to_update != null && statusAdapter != null) { + int position = getPosition(status_to_update); + if (position >= 0) { + statuses.set(position, status_to_update); + statusAdapter.notifyItemChanged(position); + } + } else if (statusPosted != null && statusAdapter != null) { + if (requireActivity() instanceof ContextActivity) { + int i = 0; + for (Status status : statuses) { + if (status.id.equals(statusPosted.in_reply_to_id)) { + statuses.add((i + 1), statusPosted); + statusAdapter.notifyItemInserted((i + 1)); + if (requireActivity() instanceof ContextActivity) { + //Redraw decorations + statusAdapter.notifyItemRangeChanged(0, statuses.size()); + } + break; } - break; + i++; } - i++; } } - } + }); + } } }; + private boolean refresh; private Status focusedStatus; private String remote_instance, focusedStatusURI; private Status firstStatus; @@ -160,10 +164,21 @@ public class FragmentMastodonContext extends Fragment { pullToRefresh = false; focusedStatusURI = null; refresh = true; + binding = FragmentPaginationBinding.inflate(inflater, container, false); if (getArguments() != null) { - focusedStatus = (Status) getArguments().getSerializable(Helper.ARG_STATUS); - remote_instance = getArguments().getString(Helper.ARG_REMOTE_INSTANCE, null); - focusedStatusURI = getArguments().getString(Helper.ARG_FOCUSED_STATUS_URI, null); + long bundleId = getArguments().getLong(Helper.ARG_INTENT_ID, -1); + new CachedBundle(requireActivity()).getBundle(bundleId, currentAccount, this::initializeAfterBundle); + } else { + initializeAfterBundle(null); + } + return binding.getRoot(); + } + + private void initializeAfterBundle(Bundle bundle) { + if (bundle != null) { + focusedStatus = (Status) bundle.getSerializable(Helper.ARG_STATUS); + remote_instance = bundle.getString(Helper.ARG_REMOTE_INSTANCE, null); + focusedStatusURI = bundle.getString(Helper.ARG_FOCUSED_STATUS_URI, null); } if (remote_instance != null) { user_instance = remote_instance; @@ -176,7 +191,7 @@ public class FragmentMastodonContext extends Fragment { getChildFragmentManager().beginTransaction().remove(this).commit(); } - binding = FragmentPaginationBinding.inflate(inflater, container, false); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); boolean displayScrollBar = sharedpreferences.getBoolean(getString(R.string.SET_TIMELINE_SCROLLBAR), false); binding.recyclerView.setVerticalScrollBarEnabled(displayScrollBar); @@ -204,9 +219,9 @@ public class FragmentMastodonContext extends Fragment { } ContextCompat.registerReceiver(requireActivity(), receive_action, new IntentFilter(Helper.RECEIVE_STATUS_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED); - return binding.getRoot(); } + public void refresh() { if (statuses != null) { for (Status status : statuses) { diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java index 3c0a6164b..0459e1194 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonDirectMessage.java @@ -50,7 +50,6 @@ import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; - import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.work.Data; @@ -83,6 +82,7 @@ import app.fedilab.android.mastodon.client.entities.api.Context; import app.fedilab.android.mastodon.client.entities.api.Mention; import app.fedilab.android.mastodon.client.entities.api.Poll; import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.client.entities.app.CachedBundle; import app.fedilab.android.mastodon.client.entities.app.StatusDraft; import app.fedilab.android.mastodon.exception.DBException; import app.fedilab.android.mastodon.helper.Helper; @@ -112,17 +112,19 @@ public class FragmentMastodonDirectMessage extends Fragment { private final BroadcastReceiver broadcast_data = new BroadcastReceiver() { @Override public void onReceive(android.content.Context context, Intent intent) { - Bundle b = intent.getExtras(); - if (b != null) { - - if (b.getBoolean(Helper.RECEIVE_NEW_MESSAGE, false)) { - Status statusReceived = (Status) b.getSerializable(Helper.RECEIVE_STATUS_ACTION); - if (statusReceived != null) { - statuses.add(statusReceived); - statusDirectMessageAdapter.notifyItemInserted(statuses.size() - 1); - initiliazeStatus(); + Bundle args = intent.getExtras(); + if (args != null) { + long bundleId = args.getLong(Helper.ARG_INTENT_ID, -1); + new CachedBundle(requireActivity()).getBundle(bundleId, currentAccount, bundle -> { + if (bundle.getBoolean(Helper.RECEIVE_NEW_MESSAGE, false)) { + Status statusReceived = (Status) bundle.getSerializable(Helper.RECEIVE_STATUS_ACTION); + if (statusReceived != null) { + statuses.add(statusReceived); + statusDirectMessageAdapter.notifyItemInserted(statuses.size() - 1); + initiliazeStatus(); + } } - } + }); } } }; @@ -132,8 +134,21 @@ public class FragmentMastodonDirectMessage extends Fragment { focusedStatus = null; pullToRefresh = false; + binding = FragmentDirectMessageBinding.inflate(inflater, container, false); if (getArguments() != null) { - focusedStatus = (Status) getArguments().getSerializable(Helper.ARG_STATUS); + long bundleId = getArguments().getLong(Helper.ARG_INTENT_ID, -1); + new CachedBundle(requireActivity()).getBundle(bundleId, currentAccount, this::initializeAfterBundle); + } else { + initializeAfterBundle(null); + } + return binding.getRoot(); + } + + + private void initializeAfterBundle(Bundle bundle) { + + if (bundle != null) { + focusedStatus = (Status) bundle.getSerializable(Helper.ARG_STATUS); } user_instance = MainActivity.currentInstance; user_token = MainActivity.currentToken; @@ -141,7 +156,7 @@ public class FragmentMastodonDirectMessage extends Fragment { if (focusedStatus == null) { getChildFragmentManager().beginTransaction().remove(this).commit(); } - binding = FragmentDirectMessageBinding.inflate(inflater, container, false); + statusesVM = new ViewModelProvider(FragmentMastodonDirectMessage.this).get(StatusesVM.class); binding.recyclerView.setNestedScrollingEnabled(true); this.statuses = new ArrayList<>(); @@ -217,10 +232,8 @@ public class FragmentMastodonDirectMessage extends Fragment { } }); - return binding.getRoot(); } - private void onSubmit(StatusDraft statusDraft) { new Thread(() -> { if (statusDraft.instance == null) { diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonNotification.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonNotification.java index e5f09fa76..f9fbaf8b6 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonNotification.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonNotification.java @@ -14,12 +14,13 @@ package app.fedilab.android.mastodon.ui.fragment.timeline; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ +import static app.fedilab.android.BaseMainActivity.currentAccount; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.LayoutInflater; @@ -31,7 +32,6 @@ import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; - import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -49,6 +49,7 @@ import app.fedilab.android.databinding.FragmentPaginationBinding; import app.fedilab.android.mastodon.client.entities.api.Notification; import app.fedilab.android.mastodon.client.entities.api.Notifications; import app.fedilab.android.mastodon.client.entities.api.Status; +import app.fedilab.android.mastodon.client.entities.app.CachedBundle; import app.fedilab.android.mastodon.client.entities.app.StatusCache; import app.fedilab.android.mastodon.client.entities.app.Timeline; import app.fedilab.android.mastodon.exception.DBException; @@ -73,43 +74,46 @@ public class FragmentMastodonNotification extends Fragment implements Notificati private final BroadcastReceiver receive_action = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Bundle b = intent.getExtras(); - if (b != null) { - Status receivedStatus = (Status) b.getSerializable(Helper.ARG_STATUS_ACTION); - String delete_all_for_account_id = b.getString(Helper.ARG_DELETE_ALL_FOR_ACCOUNT_ID); - boolean refreshNotifications = b.getBoolean(Helper.ARG_REFRESH_NOTFICATION, false); - if (refreshNotifications) { - scrollToTop(); - } else if (receivedStatus != null && notificationAdapter != null) { - int position = getPosition(receivedStatus); - if (position >= 0) { - if (notificationList.get(position).status != null) { - notificationList.get(position).status.reblog = receivedStatus.reblog; - notificationList.get(position).status.reblogged = receivedStatus.reblogged; - notificationList.get(position).status.favourited = receivedStatus.favourited; - notificationList.get(position).status.bookmarked = receivedStatus.bookmarked; - notificationList.get(position).status.favourites_count = receivedStatus.favourites_count; - notificationList.get(position).status.reblogs_count = receivedStatus.reblogs_count; - notificationAdapter.notifyItemChanged(position); + Bundle args = intent.getExtras(); + if (args != null) { + long bundleId = args.getLong(Helper.ARG_INTENT_ID, -1); + new CachedBundle(requireActivity()).getBundle(bundleId, currentAccount, bundle -> { + Status receivedStatus = (Status) bundle.getSerializable(Helper.ARG_STATUS_ACTION); + String delete_all_for_account_id = bundle.getString(Helper.ARG_DELETE_ALL_FOR_ACCOUNT_ID); + boolean refreshNotifications = bundle.getBoolean(Helper.ARG_REFRESH_NOTFICATION, false); + if (refreshNotifications) { + scrollToTop(); + } else if (receivedStatus != null && notificationAdapter != null) { + int position = getPosition(receivedStatus); + if (position >= 0) { + if (notificationList.get(position).status != null) { + notificationList.get(position).status.reblog = receivedStatus.reblog; + notificationList.get(position).status.reblogged = receivedStatus.reblogged; + notificationList.get(position).status.favourited = receivedStatus.favourited; + notificationList.get(position).status.bookmarked = receivedStatus.bookmarked; + notificationList.get(position).status.favourites_count = receivedStatus.favourites_count; + notificationList.get(position).status.reblogs_count = receivedStatus.reblogs_count; + notificationAdapter.notifyItemChanged(position); + } } - } - } else if (delete_all_for_account_id != null) { - List<Notification> toRemove = new ArrayList<>(); - if (notificationList != null) { - for (int position = 0; position < notificationList.size(); position++) { - if (notificationList.get(position).account.id.equals(delete_all_for_account_id)) { - toRemove.add(notificationList.get(position)); + } else if (delete_all_for_account_id != null) { + List<Notification> toRemove = new ArrayList<>(); + if (notificationList != null) { + for (int position = 0; position < notificationList.size(); position++) { + if (notificationList.get(position).account.id.equals(delete_all_for_account_id)) { + toRemove.add(notificationList.get(position)); + } } } - } - if (toRemove.size() > 0) { - for (int i = 0; i < toRemove.size(); i++) { - int position = getPosition(toRemove.get(i)); - notificationList.remove(position); - notificationAdapter.notifyItemRemoved(position); + if (toRemove.size() > 0) { + for (int i = 0; i < toRemove.size(); i++) { + int position = getPosition(toRemove.get(i)); + notificationList.remove(position); + notificationAdapter.notifyItemRemoved(position); + } } } - } + }); } } }; diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTag.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTag.java index d0027c980..0682ceef2 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTag.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTag.java @@ -170,7 +170,7 @@ public class FragmentMastodonTag extends Fragment { Collections.sort(tags, (obj1, obj2) -> Integer.compare(obj2.getWeight(), obj1.getWeight())); boolean isInCollection = false; for (Tag tag : tags) { - if (tag.name.compareToIgnoreCase(search) == 0) { + if (tag.name.trim().compareToIgnoreCase(search.trim()) == 0) { isInCollection = true; break; } diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java index 64ee72688..6a64147cb 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java @@ -15,6 +15,7 @@ package app.fedilab.android.mastodon.ui.fragment.timeline; * see <http://www.gnu.org/licenses>. */ +import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.networkAvailable; @@ -35,7 +36,6 @@ import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; - import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -57,10 +57,12 @@ import app.fedilab.android.mastodon.client.entities.api.Pagination; import app.fedilab.android.mastodon.client.entities.api.Status; import app.fedilab.android.mastodon.client.entities.api.Statuses; import app.fedilab.android.mastodon.client.entities.app.BubbleTimeline; +import app.fedilab.android.mastodon.client.entities.app.CachedBundle; import app.fedilab.android.mastodon.client.entities.app.PinnedTimeline; import app.fedilab.android.mastodon.client.entities.app.RemoteInstance; import app.fedilab.android.mastodon.client.entities.app.TagTimeline; import app.fedilab.android.mastodon.client.entities.app.Timeline; +import app.fedilab.android.mastodon.exception.DBException; import app.fedilab.android.mastodon.helper.CrossActionHelper; import app.fedilab.android.mastodon.helper.GlideApp; import app.fedilab.android.mastodon.helper.Helper; @@ -92,88 +94,91 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. private final BroadcastReceiver receive_action = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Bundle b = intent.getExtras(); - if (b != null) { - Status receivedStatus = (Status) b.getSerializable(Helper.ARG_STATUS_ACTION); - String delete_statuses_for_user = b.getString(Helper.ARG_STATUS_ACCOUNT_ID_DELETED); - String delete_all_for_account_id = b.getString(Helper.ARG_DELETE_ALL_FOR_ACCOUNT_ID); - Status status_to_delete = (Status) b.getSerializable(Helper.ARG_STATUS_DELETED); - Status status_to_update = (Status) b.getSerializable(Helper.ARG_STATUS_UPDATED); - Status statusPosted = (Status) b.getSerializable(Helper.ARG_STATUS_DELETED); - boolean refreshAll = b.getBoolean(Helper.ARG_TIMELINE_REFRESH_ALL, false); - if (receivedStatus != null && statusAdapter != null) { - int position = getPosition(receivedStatus); - if (position >= 0) { - if (receivedStatus.reblog != null) { - timelineStatuses.get(position).reblog = receivedStatus.reblog; - } - if (timelineStatuses.get(position).reblog != null) { - timelineStatuses.get(position).reblog.reblogged = receivedStatus.reblogged; - timelineStatuses.get(position).reblog.favourited = receivedStatus.favourited; - timelineStatuses.get(position).reblog.bookmarked = receivedStatus.bookmarked; - timelineStatuses.get(position).reblog.reblogs_count = receivedStatus.reblogs_count; - timelineStatuses.get(position).reblog.favourites_count = receivedStatus.favourites_count; - } else { - timelineStatuses.get(position).reblogged = receivedStatus.reblogged; - timelineStatuses.get(position).favourited = receivedStatus.favourited; - timelineStatuses.get(position).bookmarked = receivedStatus.bookmarked; - timelineStatuses.get(position).reblogs_count = receivedStatus.reblogs_count; - timelineStatuses.get(position).favourites_count = receivedStatus.favourites_count; - } + Bundle args = intent.getExtras(); + if (args != null) { + long bundleId = args.getLong(Helper.ARG_INTENT_ID, -1); + new CachedBundle(requireActivity()).getBundle(bund |