some fixes

This commit is contained in:
Thomas 2022-06-19 19:46:01 +02:00
parent e1677b82d9
commit 72b5517421
2 changed files with 79 additions and 84 deletions

View file

@ -55,10 +55,47 @@ public class QuickLoad {
db = null; db = null;
} }
private type typeOfFetch;
public QuickLoad(Context context) { public QuickLoad(Context context) {
//Creation of the DB with tables //Creation of the DB with tables
this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
_mContext = context; _mContext = context;
this.typeOfFetch = type.STATUSES;
}
public QuickLoad(Context context, type type) {
//Creation of the DB with tables
this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
_mContext = context;
this.typeOfFetch = type;
}
/**
* Update a QuickLoad in db
*
* @param quickLoad {@link QuickLoad}
* @throws DBException exception with database
*/
private void updateStatus(QuickLoad quickLoad) throws DBException {
if (db == null) {
throw new DBException("db is null. Wrong initialization.");
}
ContentValues values = new ContentValues();
values.put(Sqlite.COL_POSITION, quickLoad.position);
if (quickLoad.statuses != null) {
values.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(quickLoad.statuses));
} else if (quickLoad.notifications != null) {
values.put(Sqlite.COL_STATUSES, Notification.notificationsToStringStorage(quickLoad.notifications));
}
//Inserts token
try {
db.update(Sqlite.TABLE_QUICK_LOAD,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?",
new String[]{quickLoad.user_id, quickLoad.instance, quickLoad.slug});
} catch (Exception e) {
e.printStackTrace();
}
} }
/** /**
@ -474,26 +511,36 @@ public class QuickLoad {
} }
/** /**
* Update a QuickLoad in db * Convert a cursor to QuickLoad
* *
* @param quickLoad {@link QuickLoad} * @param c Cursor
* @throws DBException exception with database * @return QuickLoad
*/ */
private void updateStatus(QuickLoad quickLoad) throws DBException { private QuickLoad cursorToQuickLoad(Cursor c) {
if (db == null) { //No element found
throw new DBException("db is null. Wrong initialization."); if (c.getCount() == 0) {
c.close();
return null;
} }
ContentValues values = new ContentValues(); //Take the first element
values.put(Sqlite.COL_POSITION, quickLoad.position); c.moveToFirst();
values.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(quickLoad.statuses)); QuickLoad quickLoad = new QuickLoad();
//Inserts token quickLoad.id = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_ID));
try { quickLoad.instance = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_INSTANCE));
db.update(Sqlite.TABLE_QUICK_LOAD, quickLoad.user_id = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_USER_ID));
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", quickLoad.slug = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_SLUG));
new String[]{quickLoad.user_id, quickLoad.instance, quickLoad.slug}); if (typeOfFetch == type.STATUSES) {
} catch (Exception e) { quickLoad.statuses = StatusDraft.restoreStatusListFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_STATUSES)));
e.printStackTrace(); } else if (typeOfFetch == type.NOTIFICATIONS) {
quickLoad.notifications = Notification.restoreNotificationsFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_STATUSES)));
} }
quickLoad.position = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_POSITION));
//TimelineHelper.filterStatus(_mContext, quickLoad.statuses, TimelineHelper.FilterTimeLineType.PUBLIC);
quickLoad.statuses = SpannableHelper.convertStatus(_mContext, quickLoad.statuses);
//Close the cursor
c.close();
return quickLoad;
} }
/** /**
@ -536,33 +583,9 @@ public class QuickLoad {
} }
} }
/** enum type {
* Convert a cursor to QuickLoad STATUSES,
* NOTIFICATIONS
* @param c Cursor
* @return QuickLoad
*/
private QuickLoad cursorToQuickLoad(Cursor c) {
//No element found
if (c.getCount() == 0) {
c.close();
return null;
}
//Take the first element
c.moveToFirst();
QuickLoad quickLoad = new QuickLoad();
quickLoad.id = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_ID));
quickLoad.instance = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_INSTANCE));
quickLoad.user_id = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_USER_ID));
quickLoad.slug = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_SLUG));
quickLoad.statuses = StatusDraft.restoreStatusListFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_STATUSES)));
quickLoad.position = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_POSITION));
//TimelineHelper.filterStatus(_mContext, quickLoad.statuses, TimelineHelper.FilterTimeLineType.PUBLIC);
quickLoad.statuses = SpannableHelper.convertStatus(_mContext, quickLoad.statuses);
//Close the cursor
c.close();
return quickLoad;
} }

View file

@ -50,7 +50,6 @@ import app.fedilab.android.client.entities.api.Notification;
import app.fedilab.android.client.entities.api.Notifications; import app.fedilab.android.client.entities.api.Notifications;
import app.fedilab.android.client.entities.api.Pagination; import app.fedilab.android.client.entities.api.Pagination;
import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.client.entities.api.Status;
import app.fedilab.android.client.entities.api.Statuses;
import app.fedilab.android.client.entities.app.QuickLoad; import app.fedilab.android.client.entities.app.QuickLoad;
import app.fedilab.android.databinding.FragmentPaginationBinding; import app.fedilab.android.databinding.FragmentPaginationBinding;
import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.Helper;
@ -65,7 +64,6 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
private FragmentPaginationBinding binding; private FragmentPaginationBinding binding;
private NotificationsVM notificationsVM; private NotificationsVM notificationsVM;
private FragmentMastodonNotification currentFragment;
private boolean flagLoading; private boolean flagLoading;
private static final int NOTIFICATION_PRESENT = -1; private static final int NOTIFICATION_PRESENT = -1;
private static final int NOTIFICATION__AT_THE_BOTTOM = -2; private static final int NOTIFICATION__AT_THE_BOTTOM = -2;
@ -91,7 +89,6 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
} }
} }
}; };
private Notifications notifications;
private String max_id, min_id, min_id_fetch_more; private String max_id, min_id, min_id_fetch_more;
private LinearLayoutManager mLayoutManager; private LinearLayoutManager mLayoutManager;
private String instance, user_id; private String instance, user_id;
@ -122,7 +119,6 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
public View onCreateView(@NonNull LayoutInflater inflater, public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) { ViewGroup container, Bundle savedInstanceState) {
currentFragment = this;
flagLoading = false; flagLoading = false;
instance = MainActivity.currentInstance; instance = MainActivity.currentInstance;
user_id = MainActivity.currentUserID; user_id = MainActivity.currentUserID;
@ -232,7 +228,7 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
if (aggregateNotification) { if (aggregateNotification) {
notifications.notifications = aggregateNotifications(notifications.notifications); notifications.notifications = aggregateNotifications(notifications.notifications);
} }
if (notificationAdapter != null && this.notifications != null) { if (notificationAdapter != null && this.notificationList != null) {
int size = this.notificationList.size(); int size = this.notificationList.size();
this.notificationList.clear(); this.notificationList.clear();
this.notificationList = new ArrayList<>(); this.notificationList = new ArrayList<>();
@ -240,6 +236,7 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
} }
this.notificationList = notifications.notifications; this.notificationList = notifications.notifications;
notificationAdapter = new NotificationAdapter(this.notificationList); notificationAdapter = new NotificationAdapter(this.notificationList);
notificationAdapter.fetchMoreCallBack = this;
mLayoutManager = new LinearLayoutManager(requireActivity()); mLayoutManager = new LinearLayoutManager(requireActivity());
binding.recyclerView.setLayoutManager(mLayoutManager); binding.recyclerView.setLayoutManager(mLayoutManager);
binding.recyclerView.setAdapter(notificationAdapter); binding.recyclerView.setAdapter(notificationAdapter);
@ -296,12 +293,12 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
return; return;
} }
QuickLoad quickLoad = new QuickLoad(requireActivity()).getSavedValue(MainActivity.currentUserID, MainActivity.currentInstance, notificationType); QuickLoad quickLoad = new QuickLoad(requireActivity()).getSavedValue(MainActivity.currentUserID, MainActivity.currentInstance, notificationType);
if (direction != FragmentMastodonTimeline.DIRECTION.REFRESH && !fetchingMissing && !binding.swipeContainer.isRefreshing() && direction == null && quickLoad != null && quickLoad.statuses != null && quickLoad.statuses.size() > 0) { if (direction != FragmentMastodonTimeline.DIRECTION.REFRESH && !fetchingMissing && !binding.swipeContainer.isRefreshing() && direction == null && quickLoad != null && quickLoad.notifications != null && quickLoad.notifications.size() > 0) {
Statuses statuses = new Statuses(); Notifications notifications = new Notifications();
statuses.statuses = quickLoad.statuses; notifications.notifications = quickLoad.notifications;
statuses.pagination = new Pagination(); notifications.pagination = new Pagination();
statuses.pagination.max_id = quickLoad.statuses.get(quickLoad.statuses.size() - 1).id; notifications.pagination.max_id = quickLoad.notifications.get(quickLoad.statuses.size() - 1).id;
statuses.pagination.min_id = quickLoad.statuses.get(0).id; notifications.pagination.min_id = quickLoad.notifications.get(0).id;
Handler mainHandler = new Handler(Looper.getMainLooper()); Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> initializeNotificationView(notifications); Runnable myRunnable = () -> initializeNotificationView(notifications);
mainHandler.post(myRunnable); mainHandler.post(myRunnable);
@ -316,17 +313,17 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
.observe(getViewLifecycleOwner(), this::initializeNotificationView); .observe(getViewLifecycleOwner(), this::initializeNotificationView);
} else if (direction == FragmentMastodonTimeline.DIRECTION.BOTTOM) { } else if (direction == FragmentMastodonTimeline.DIRECTION.BOTTOM) {
notificationsVM.getNotifications(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, max_id, null, null, MastodonHelper.statusesPerCall(requireActivity()), excludeType, null) notificationsVM.getNotifications(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, max_id, null, null, MastodonHelper.statusesPerCall(requireActivity()), excludeType, null)
.observe(getViewLifecycleOwner(), this::initializeNotificationView); .observe(getViewLifecycleOwner(), notificationsBottom -> dealWithPagination(notificationsBottom, FragmentMastodonTimeline.DIRECTION.BOTTOM, false));
} else if (direction == FragmentMastodonTimeline.DIRECTION.TOP) { } else if (direction == FragmentMastodonTimeline.DIRECTION.TOP) {
notificationsVM.getNotifications(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, fetchingMissing ? min_id_fetch_more : min_id, MastodonHelper.statusesPerCall(requireActivity()), excludeType, null) notificationsVM.getNotifications(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, fetchingMissing ? min_id_fetch_more : min_id, MastodonHelper.statusesPerCall(requireActivity()), excludeType, null)
.observe(getViewLifecycleOwner(), this::initializeNotificationView); .observe(getViewLifecycleOwner(), notificationsTop -> dealWithPagination(notificationsTop, FragmentMastodonTimeline.DIRECTION.BOTTOM, fetchingMissing));
} else if (direction == FragmentMastodonTimeline.DIRECTION.REFRESH) { } else if (direction == FragmentMastodonTimeline.DIRECTION.REFRESH) {
notificationsVM.getNotifications(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, null, MastodonHelper.statusesPerCall(requireActivity()), excludeType, null) notificationsVM.getNotifications(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, null, MastodonHelper.statusesPerCall(requireActivity()), excludeType, null)
.observe(getViewLifecycleOwner(), notificationsReceived -> { .observe(getViewLifecycleOwner(), notificationsRefresh -> {
if (notificationAdapter != null) { if (notificationAdapter != null) {
dealWithPagination(notificationsReceived); dealWithPagination(notificationsRefresh, FragmentMastodonTimeline.DIRECTION.REFRESH, true);
} else { } else {
initializeNotificationView(notificationsReceived); initializeNotificationView(notificationsRefresh);
} }
}); });
} }
@ -486,31 +483,6 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
return position; return position;
} }
/**
* Update view and pagination when scrolling down
*
* @param fetched_notifications Notifications
*/
private void dealWithPagination(Notifications fetched_notifications) {
binding.loadingNextElements.setVisibility(View.GONE);
flagLoading = false;
if (currentFragment.notifications != null && fetched_notifications != null && fetched_notifications.notifications != null) {
flagLoading = fetched_notifications.pagination.max_id == null;
if (aggregateNotification) {
fetched_notifications.notifications = aggregateNotifications(fetched_notifications.notifications);
}
int startId = 0;
//There are some statuses present in the timeline
if (currentFragment.notificationList.size() > 0) {
startId = currentFragment.notificationList.size();
}
currentFragment.notificationList.addAll(fetched_notifications.notifications);
max_id = fetched_notifications.pagination.max_id;
notificationAdapter.notifyItemRangeInserted(startId, fetched_notifications.notifications.size());
} else {
flagLoading = true;
}
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {