Merge branch 'fix_cache_notification' into develop
This commit is contained in:
commit
2d80e89982
|
@ -24,18 +24,13 @@ import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import app.fedilab.android.activities.MainActivity;
|
import app.fedilab.android.activities.MainActivity;
|
||||||
import app.fedilab.android.client.entities.api.Conversation;
|
import app.fedilab.android.client.entities.api.Conversation;
|
||||||
import app.fedilab.android.client.entities.api.Conversations;
|
|
||||||
import app.fedilab.android.client.entities.api.Notification;
|
import app.fedilab.android.client.entities.api.Notification;
|
||||||
import app.fedilab.android.client.entities.api.Notifications;
|
|
||||||
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.exception.DBException;
|
import app.fedilab.android.exception.DBException;
|
||||||
import app.fedilab.android.helper.Helper;
|
import app.fedilab.android.helper.Helper;
|
||||||
import app.fedilab.android.helper.MastodonHelper;
|
import app.fedilab.android.helper.MastodonHelper;
|
||||||
|
@ -247,7 +242,6 @@ public class StatusCache {
|
||||||
}
|
}
|
||||||
Cursor mCount = db.rawQuery("select count(*) from " + Sqlite.TABLE_STATUS_CACHE
|
Cursor mCount = db.rawQuery("select count(*) from " + Sqlite.TABLE_STATUS_CACHE
|
||||||
+ " where " + Sqlite.COL_TYPE + " != '" + Timeline.TimeLineEnum.HOME.getValue() + "'"
|
+ " where " + Sqlite.COL_TYPE + " != '" + Timeline.TimeLineEnum.HOME.getValue() + "'"
|
||||||
+ " AND " + Sqlite.COL_INSTANCE + " = '" + baseAccount.instance + "'"
|
|
||||||
+ " AND " + Sqlite.COL_USER_ID + "= '" + baseAccount.user_id + "'", null);
|
+ " AND " + Sqlite.COL_USER_ID + "= '" + baseAccount.user_id + "'", null);
|
||||||
mCount.moveToFirst();
|
mCount.moveToFirst();
|
||||||
int count = mCount.getInt(0);
|
int count = mCount.getInt(0);
|
||||||
|
@ -266,36 +260,21 @@ public class StatusCache {
|
||||||
if (db == null) {
|
if (db == null) {
|
||||||
throw new DBException("db is null. Wrong initialization.");
|
throw new DBException("db is null. Wrong initialization.");
|
||||||
}
|
}
|
||||||
Cursor mCount = db.rawQuery("select count(*) from " + Sqlite.TABLE_STATUS_CACHE
|
String query = "select count(*) from " + Sqlite.TABLE_STATUS_CACHE
|
||||||
+ " where " + Sqlite.COL_STATUS_ID + " = '" + statusCache.status_id + "'"
|
+ " where " + Sqlite.COL_STATUS_ID + " = '" + statusCache.status_id + "'"
|
||||||
+ " AND " + Sqlite.COL_INSTANCE + " = '" + statusCache.instance + "'"
|
+ " AND " + Sqlite.COL_INSTANCE + " = '" + statusCache.instance + "'"
|
||||||
+ " AND " + Sqlite.COL_USER_ID + "= '" + statusCache.user_id + "'", null);
|
+ " AND " + Sqlite.COL_USER_ID + "= '" + statusCache.user_id + "'";
|
||||||
|
if (statusCache.type != null) {
|
||||||
|
query += " AND " + Sqlite.COL_TYPE + " = '" + statusCache.type.getValue() + "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
Cursor mCount = db.rawQuery(query, null);
|
||||||
mCount.moveToFirst();
|
mCount.moveToFirst();
|
||||||
int count = mCount.getInt(0);
|
int count = mCount.getInt(0);
|
||||||
mCount.close();
|
mCount.close();
|
||||||
return (count > 0);
|
return (count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a status exists in db
|
|
||||||
*
|
|
||||||
* @param status Status {@link Status}
|
|
||||||
* @return boolean - StatusCache exists
|
|
||||||
* @throws DBException Exception
|
|
||||||
*/
|
|
||||||
public boolean statusExist(Status status) throws DBException {
|
|
||||||
if (db == null) {
|
|
||||||
throw new DBException("db is null. Wrong initialization.");
|
|
||||||
}
|
|
||||||
Cursor mCount = db.rawQuery("select count(*) from " + Sqlite.TABLE_STATUS_CACHE
|
|
||||||
+ " where " + Sqlite.COL_STATUS_ID + " = '" + status.id + "'"
|
|
||||||
+ " AND " + Sqlite.COL_INSTANCE + " = '" + MainActivity.currentInstance + "'"
|
|
||||||
+ " AND " + Sqlite.COL_USER_ID + "= '" + MainActivity.currentUserID + "'", null);
|
|
||||||
mCount.moveToFirst();
|
|
||||||
int count = mCount.getInt(0);
|
|
||||||
mCount.close();
|
|
||||||
return (count > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert a status in db
|
* Insert a status in db
|
||||||
|
@ -313,7 +292,9 @@ public class StatusCache {
|
||||||
values.put(Sqlite.COL_INSTANCE, statusCache.instance);
|
values.put(Sqlite.COL_INSTANCE, statusCache.instance);
|
||||||
values.put(Sqlite.COL_SLUG, slug);
|
values.put(Sqlite.COL_SLUG, slug);
|
||||||
values.put(Sqlite.COL_STATUS_ID, statusCache.status_id);
|
values.put(Sqlite.COL_STATUS_ID, statusCache.status_id);
|
||||||
values.put(Sqlite.COL_TYPE, statusCache.type.getValue());
|
if (statusCache.type != null) {
|
||||||
|
values.put(Sqlite.COL_TYPE, statusCache.type.getValue());
|
||||||
|
}
|
||||||
if (statusCache.status != null) {
|
if (statusCache.status != null) {
|
||||||
values.put(Sqlite.COL_STATUS, mastodonStatusToStringStorage(statusCache.status));
|
values.put(Sqlite.COL_STATUS, mastodonStatusToStringStorage(statusCache.status));
|
||||||
}
|
}
|
||||||
|
@ -345,8 +326,6 @@ public class StatusCache {
|
||||||
throw new DBException("db is null. Wrong initialization.");
|
throw new DBException("db is null. Wrong initialization.");
|
||||||
}
|
}
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(Sqlite.COL_USER_ID, statusCache.user_id);
|
|
||||||
values.put(Sqlite.COL_STATUS_ID, statusCache.status_id);
|
|
||||||
if (statusCache.status != null) {
|
if (statusCache.status != null) {
|
||||||
values.put(Sqlite.COL_STATUS, mastodonStatusToStringStorage(statusCache.status));
|
values.put(Sqlite.COL_STATUS, mastodonStatusToStringStorage(statusCache.status));
|
||||||
}
|
}
|
||||||
|
@ -360,8 +339,8 @@ public class StatusCache {
|
||||||
//Inserts token
|
//Inserts token
|
||||||
try {
|
try {
|
||||||
return db.update(Sqlite.TABLE_STATUS_CACHE,
|
return db.update(Sqlite.TABLE_STATUS_CACHE,
|
||||||
values, Sqlite.COL_STATUS_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =?",
|
values, Sqlite.COL_STATUS_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_TYPE + " =? AND " + Sqlite.COL_USER_ID + " =?",
|
||||||
new String[]{statusCache.status_id, statusCache.instance});
|
new String[]{statusCache.status_id, statusCache.instance, statusCache.type != null ? statusCache.type.getValue() : "", statusCache.user_id});
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -485,8 +464,8 @@ public class StatusCache {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return db.delete(Sqlite.TABLE_STATUS_CACHE,
|
return db.delete(Sqlite.TABLE_STATUS_CACHE,
|
||||||
Sqlite.COL_TYPE + " != ? AND " + Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =?",
|
Sqlite.COL_TYPE + " != ? AND " + Sqlite.COL_USER_ID + " = ?",
|
||||||
new String[]{Timeline.TimeLineEnum.HOME.getValue(), account.user_id, account.instance});
|
new String[]{Timeline.TimeLineEnum.HOME.getValue(), account.user_id});
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -543,10 +522,10 @@ public class StatusCache {
|
||||||
* @param user_id String - us
|
* @param user_id String - us
|
||||||
* @param max_id String - status having max id
|
* @param max_id String - status having max id
|
||||||
* @param min_id String - status having min id
|
* @param min_id String - status having min id
|
||||||
* @return Statuses
|
* @return List<Notification>
|
||||||
* @throws DBException - throws a db exception
|
* @throws DBException - throws a db exception
|
||||||
*/
|
*/
|
||||||
public Notifications getNotifications(List<String> exclude_type, String instance, String user_id, String max_id, String min_id, String since_id) throws DBException {
|
public List<Notification> getNotifications(List<String> exclude_type, String instance, String user_id, String max_id, String min_id, String since_id) throws DBException {
|
||||||
if (db == null) {
|
if (db == null) {
|
||||||
throw new DBException("db is null. Wrong initialization.");
|
throw new DBException("db is null. Wrong initialization.");
|
||||||
}
|
}
|
||||||
|
@ -572,8 +551,8 @@ public class StatusCache {
|
||||||
selection += "AND " + Sqlite.COL_SLUG + " NOT IN (" + exclude + ") ";
|
selection += "AND " + Sqlite.COL_SLUG + " NOT IN (" + exclude + ") ";
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + order, limit);
|
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + " + 0 " + order, limit);
|
||||||
return createNotificationReply(cursorToListOfNotifications(c));
|
return cursorToListOfNotifications(c);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
|
@ -588,10 +567,10 @@ public class StatusCache {
|
||||||
* @param user_id String - us
|
* @param user_id String - us
|
||||||
* @param max_id String - status having max id
|
* @param max_id String - status having max id
|
||||||
* @param min_id String - status having min id
|
* @param min_id String - status having min id
|
||||||
* @return Statuses
|
* @return List<Conversation>
|
||||||
* @throws DBException - throws a db exception
|
* @throws DBException - throws a db exception
|
||||||
*/
|
*/
|
||||||
public Conversations getConversations(String instance, String user_id, String max_id, String min_id, String since_id) throws DBException {
|
public List<Conversation> getConversations(String instance, String user_id, String max_id, String min_id, String since_id) throws DBException {
|
||||||
if (db == null) {
|
if (db == null) {
|
||||||
throw new DBException("db is null. Wrong initialization.");
|
throw new DBException("db is null. Wrong initialization.");
|
||||||
}
|
}
|
||||||
|
@ -607,10 +586,9 @@ public class StatusCache {
|
||||||
selection += "AND " + Sqlite.COL_STATUS_ID + " > '" + since_id + "' ";
|
selection += "AND " + Sqlite.COL_STATUS_ID + " > '" + since_id + "' ";
|
||||||
limit = null;
|
limit = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + order, limit);
|
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + " + 0 " + order, limit);
|
||||||
return createConversationReply(cursorToListOfConversations(c));
|
return cursorToListOfConversations(c);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
|
@ -625,10 +603,10 @@ public class StatusCache {
|
||||||
* @param user_id String - us
|
* @param user_id String - us
|
||||||
* @param max_id String - status having max id
|
* @param max_id String - status having max id
|
||||||
* @param min_id String - status having min id
|
* @param min_id String - status having min id
|
||||||
* @return Statuses
|
* @return List<Status>
|
||||||
* @throws DBException - throws a db exception
|
* @throws DBException - throws a db exception
|
||||||
*/
|
*/
|
||||||
public Statuses geStatuses(String slug, String instance, String user_id, String max_id, String min_id, String since_id) throws DBException {
|
public List<Status> geStatuses(String slug, String instance, String user_id, String max_id, String min_id, String since_id) throws DBException {
|
||||||
if (db == null) {
|
if (db == null) {
|
||||||
throw new DBException("db is null. Wrong initialization.");
|
throw new DBException("db is null. Wrong initialization.");
|
||||||
}
|
}
|
||||||
|
@ -645,8 +623,8 @@ public class StatusCache {
|
||||||
limit = null;
|
limit = null;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + order, limit);
|
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + " + 0 " + order, limit);
|
||||||
return createStatusReply(cursorToListOfStatuses(c));
|
return cursorToListOfStatuses(c);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
|
@ -769,75 +747,6 @@ public class StatusCache {
|
||||||
return conversationList;
|
return conversationList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a reply from db in the same way than API call
|
|
||||||
*
|
|
||||||
* @param notificationList List<Notification>
|
|
||||||
* @return Notifications (with pagination)
|
|
||||||
*/
|
|
||||||
private Notifications createNotificationReply(List<Notification> notificationList) {
|
|
||||||
Notifications notifications = new Notifications();
|
|
||||||
notifications.notifications = notificationList;
|
|
||||||
Pagination pagination = new Pagination();
|
|
||||||
if (notificationList != null && notificationList.size() > 0) {
|
|
||||||
//Status list is inverted, it happens for min_id due to ASC ordering
|
|
||||||
if (Helper.compareTo(notificationList.get(0).id, notificationList.get(notificationList.size() - 1).id) < 0) {
|
|
||||||
Collections.reverse(notificationList);
|
|
||||||
notifications.notifications = notificationList;
|
|
||||||
}
|
|
||||||
pagination.max_id = notificationList.get(0).id;
|
|
||||||
pagination.min_id = notificationList.get(notificationList.size() - 1).id;
|
|
||||||
}
|
|
||||||
notifications.pagination = pagination;
|
|
||||||
return notifications;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a reply from db in the same way than API call
|
|
||||||
*
|
|
||||||
* @param conversationList List<Conversation>
|
|
||||||
* @return Conversations (with pagination)
|
|
||||||
*/
|
|
||||||
private Conversations createConversationReply(List<Conversation> conversationList) {
|
|
||||||
Conversations conversations = new Conversations();
|
|
||||||
conversations.conversations = conversationList;
|
|
||||||
Pagination pagination = new Pagination();
|
|
||||||
if (conversationList != null && conversationList.size() > 0) {
|
|
||||||
//Status list is inverted, it happens for min_id due to ASC ordering
|
|
||||||
if (Helper.compareTo(conversationList.get(0).id, conversationList.get(conversationList.size() - 1).id) < 0) {
|
|
||||||
Collections.reverse(conversationList);
|
|
||||||
conversations.conversations = conversationList;
|
|
||||||
}
|
|
||||||
pagination.max_id = conversationList.get(0).id;
|
|
||||||
pagination.min_id = conversationList.get(conversationList.size() - 1).id;
|
|
||||||
}
|
|
||||||
conversations.pagination = pagination;
|
|
||||||
return conversations;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a reply from db in the same way than API call
|
|
||||||
*
|
|
||||||
* @param statusList List<Status>
|
|
||||||
* @return Statuses (with pagination)
|
|
||||||
*/
|
|
||||||
private Statuses createStatusReply(List<Status> statusList) {
|
|
||||||
Statuses statuses = new Statuses();
|
|
||||||
statuses.statuses = statusList;
|
|
||||||
Pagination pagination = new Pagination();
|
|
||||||
if (statusList != null && statusList.size() > 0) {
|
|
||||||
//Status list is inverted, it happens for min_id due to ASC ordering
|
|
||||||
if (Helper.compareTo(statusList.get(0).id, statusList.get(statusList.size() - 1).id) < 0) {
|
|
||||||
Collections.reverse(statusList);
|
|
||||||
statuses.statuses = statusList;
|
|
||||||
}
|
|
||||||
pagination.max_id = statusList.get(0).id;
|
|
||||||
pagination.min_id = statusList.get(statusList.size() - 1).id;
|
|
||||||
}
|
|
||||||
statuses.pagination = pagination;
|
|
||||||
return statuses;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read cursor and hydrate without closing it
|
* Read cursor and hydrate without closing it
|
||||||
|
|
|
@ -177,7 +177,6 @@ public class TimelineHelper {
|
||||||
public static List<Notification> filterNotification(Context context, List<Notification> notifications) {
|
public static List<Notification> filterNotification(Context context, List<Notification> notifications) {
|
||||||
//A security to make sure filters have been fetched before displaying messages
|
//A security to make sure filters have been fetched before displaying messages
|
||||||
List<Notification> notificationToRemove = new ArrayList<>();
|
List<Notification> notificationToRemove = new ArrayList<>();
|
||||||
|
|
||||||
if (!BaseMainActivity.filterFetched) {
|
if (!BaseMainActivity.filterFetched) {
|
||||||
try {
|
try {
|
||||||
FiltersVM filtersVM = new ViewModelProvider((ViewModelStoreOwner) context).get(FiltersVM.class);
|
FiltersVM filtersVM = new ViewModelProvider((ViewModelStoreOwner) context).get(FiltersVM.class);
|
||||||
|
|
|
@ -112,24 +112,24 @@ public class NotificationsVM extends AndroidViewModel {
|
||||||
if (notificationsResponse.isSuccessful()) {
|
if (notificationsResponse.isSuccessful()) {
|
||||||
List<Notification> notFiltered = notificationsResponse.body();
|
List<Notification> notFiltered = notificationsResponse.body();
|
||||||
notifications.notifications = TimelineHelper.filterNotification(getApplication().getApplicationContext(), notFiltered);
|
notifications.notifications = TimelineHelper.filterNotification(getApplication().getApplicationContext(), notFiltered);
|
||||||
addFetchMoreNotifications(notifications.notifications, notificationList, timelineParams);
|
|
||||||
notifications.pagination = MastodonHelper.getPagination(notificationsResponse.headers());
|
notifications.pagination = MastodonHelper.getPagination(notificationsResponse.headers());
|
||||||
|
|
||||||
if (notifications.notifications != null && notifications.notifications.size() > 0) {
|
if (notifications.notifications != null && notifications.notifications.size() > 0) {
|
||||||
addFetchMoreNotifications(notifications.notifications, notificationList, timelineParams);
|
addFetchMoreNotifications(notifications.notifications, notificationList, timelineParams);
|
||||||
for (Notification notification : notifications.notifications) {
|
if (notFiltered != null && notFiltered.size() > 0) {
|
||||||
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
for (Notification notification : notFiltered) {
|
||||||
StatusCache statusCache = new StatusCache();
|
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
||||||
statusCache.instance = timelineParams.instance;
|
StatusCache statusCache = new StatusCache();
|
||||||
statusCache.user_id = timelineParams.userId;
|
statusCache.instance = timelineParams.instance;
|
||||||
statusCache.notification = notification;
|
statusCache.user_id = timelineParams.userId;
|
||||||
statusCache.slug = notification.type;
|
statusCache.notification = notification;
|
||||||
statusCache.type = Timeline.TimeLineEnum.NOTIFICATION;
|
statusCache.slug = notification.type;
|
||||||
statusCache.status_id = notification.id;
|
statusCache.type = Timeline.TimeLineEnum.NOTIFICATION;
|
||||||
try {
|
statusCache.status_id = notification.id;
|
||||||
statusCacheDAO.insertOrUpdate(statusCache, notification.type);
|
try {
|
||||||
} catch (DBException e) {
|
statusCacheDAO.insertOrUpdate(statusCache, notification.type);
|
||||||
e.printStackTrace();
|
} catch (DBException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,41 +146,39 @@ public class NotificationsVM extends AndroidViewModel {
|
||||||
return notificationsMutableLiveData;
|
return notificationsMutableLiveData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<Notifications> getNotificationCache(List<Notification> notificationList, TimelinesVM.TimelineParams timelineParams) {
|
public LiveData<Notifications> getNotificationCache(List<Notification> timelineNotification, TimelinesVM.TimelineParams timelineParams) {
|
||||||
notificationsMutableLiveData = new MutableLiveData<>();
|
notificationsMutableLiveData = new MutableLiveData<>();
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
||||||
Notifications notifications = null;
|
Notifications notifications = new Notifications();
|
||||||
|
List<Notification> notificationsDb;
|
||||||
try {
|
try {
|
||||||
notifications = statusCacheDAO.getNotifications(timelineParams.excludeType, timelineParams.instance, timelineParams.userId, timelineParams.maxId, timelineParams.minId, timelineParams.sinceId);
|
notificationsDb = statusCacheDAO.getNotifications(timelineParams.excludeType, timelineParams.instance, timelineParams.userId, timelineParams.maxId, timelineParams.minId, timelineParams.sinceId);
|
||||||
if (notifications != null) {
|
if (notificationsDb != null && notificationsDb.size() > 0) {
|
||||||
if (notifications.notifications != null && notifications.notifications.size() > 0) {
|
if (timelineNotification != null) {
|
||||||
if (notificationList != null) {
|
List<Notification> notPresentNotifications = new ArrayList<>();
|
||||||
List<Notification> notPresentNotifications = new ArrayList<>();
|
for (Notification notification : notificationsDb) {
|
||||||
for (Notification notification : notifications.notifications) {
|
if (!timelineNotification.contains(notification)) {
|
||||||
if (!notificationList.contains(notification)) {
|
notification.cached = true;
|
||||||
notification.cached = true;
|
notPresentNotifications.add(notification);
|
||||||
notPresentNotifications.add(notification);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//Only not already present statuses are added
|
|
||||||
notifications.notifications = notPresentNotifications;
|
|
||||||
}
|
|
||||||
TimelineHelper.filterNotification(getApplication().getApplicationContext(), notifications.notifications);
|
|
||||||
if (notifications.notifications.size() > 0) {
|
|
||||||
addFetchMoreNotifications(notifications.notifications, notificationList, timelineParams);
|
|
||||||
notifications.pagination = new Pagination();
|
|
||||||
notifications.pagination.min_id = notifications.notifications.get(0).id;
|
|
||||||
notifications.pagination.max_id = notifications.notifications.get(notifications.notifications.size() - 1).id;
|
|
||||||
}
|
}
|
||||||
|
//Only not already present statuses are added
|
||||||
|
notificationsDb = notPresentNotifications;
|
||||||
|
}
|
||||||
|
notifications.notifications = TimelineHelper.filterNotification(getApplication().getApplicationContext(), notificationsDb);
|
||||||
|
if (notifications.notifications.size() > 0) {
|
||||||
|
addFetchMoreNotifications(notifications.notifications, timelineNotification, timelineParams);
|
||||||
|
notifications.pagination = new Pagination();
|
||||||
|
notifications.pagination.min_id = notifications.notifications.get(0).id;
|
||||||
|
notifications.pagination.max_id = notifications.notifications.get(notifications.notifications.size() - 1).id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (DBException e) {
|
} catch (DBException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
Notifications finalNotifications = notifications;
|
Runnable myRunnable = () -> notificationsMutableLiveData.setValue(notifications);
|
||||||
Runnable myRunnable = () -> notificationsMutableLiveData.setValue(finalNotifications);
|
|
||||||
mainHandler.post(myRunnable);
|
mainHandler.post(myRunnable);
|
||||||
}).start();
|
}).start();
|
||||||
return notificationsMutableLiveData;
|
return notificationsMutableLiveData;
|
||||||
|
|
|
@ -463,21 +463,21 @@ public class TimelinesVM extends AndroidViewModel {
|
||||||
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
||||||
Statuses statuses = new Statuses();
|
Statuses statuses = new Statuses();
|
||||||
try {
|
try {
|
||||||
Statuses statusesDb = statusCacheDAO.geStatuses(timelineParams.slug, timelineParams.instance, timelineParams.userId, timelineParams.maxId, timelineParams.minId, timelineParams.sinceId);
|
List<Status> statusesDb = statusCacheDAO.geStatuses(timelineParams.slug, timelineParams.instance, timelineParams.userId, timelineParams.maxId, timelineParams.minId, timelineParams.sinceId);
|
||||||
if (statusesDb != null && statusesDb.statuses != null && statusesDb.statuses.size() > 0) {
|
if (statusesDb != null && statusesDb.size() > 0) {
|
||||||
if (timelineStatuses != null) {
|
if (timelineStatuses != null) {
|
||||||
List<Status> notPresentStatuses = new ArrayList<>();
|
List<Status> notPresentStatuses = new ArrayList<>();
|
||||||
for (Status status : statusesDb.statuses) {
|
for (Status status : statusesDb) {
|
||||||
if (!timelineStatuses.contains(status)) {
|
if (!timelineStatuses.contains(status)) {
|
||||||
status.cached = true;
|
status.cached = true;
|
||||||
notPresentStatuses.add(status);
|
notPresentStatuses.add(status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Only not already present statuses are added
|
//Only not already present statuses are added
|
||||||
statusesDb.statuses = notPresentStatuses;
|
statusesDb = notPresentStatuses;
|
||||||
}
|
}
|
||||||
statuses.statuses = TimelineHelper.filterStatus(getApplication().getApplicationContext(), statusesDb.statuses, timelineParams.type);
|
statuses.statuses = TimelineHelper.filterStatus(getApplication().getApplicationContext(), statusesDb, timelineParams.type);
|
||||||
if (statuses.statuses != null && statuses.statuses.size() > 0) {
|
if (statuses.statuses.size() > 0) {
|
||||||
addFetchMore(statuses.statuses, timelineStatuses, timelineParams);
|
addFetchMore(statuses.statuses, timelineStatuses, timelineParams);
|
||||||
statuses.pagination = new Pagination();
|
statuses.pagination = new Pagination();
|
||||||
statuses.pagination.min_id = statuses.statuses.get(0).id;
|
statuses.pagination.min_id = statuses.statuses.get(0).id;
|
||||||
|
@ -528,21 +528,16 @@ public class TimelinesVM extends AndroidViewModel {
|
||||||
conversationListMutableLiveData = new MutableLiveData<>();
|
conversationListMutableLiveData = new MutableLiveData<>();
|
||||||
MastodonTimelinesService mastodonTimelinesService = init(timelineParams.instance);
|
MastodonTimelinesService mastodonTimelinesService = init(timelineParams.instance);
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
Conversations conversations = null;
|
Conversations conversations = new Conversations();
|
||||||
Call<List<Conversation>> conversationsCall = mastodonTimelinesService.getConversations(timelineParams.token, timelineParams.maxId, timelineParams.sinceId, timelineParams.minId, timelineParams.limit);
|
Call<List<Conversation>> conversationsCall = mastodonTimelinesService.getConversations(timelineParams.token, timelineParams.maxId, timelineParams.sinceId, timelineParams.minId, timelineParams.limit);
|
||||||
if (conversationsCall != null) {
|
if (conversationsCall != null) {
|
||||||
conversations = new Conversations();
|
|
||||||
try {
|
try {
|
||||||
Response<List<Conversation>> conversationsResponse = conversationsCall.execute();
|
Response<List<Conversation>> conversationsResponse = conversationsCall.execute();
|
||||||
if (conversationsResponse.isSuccessful()) {
|
if (conversationsResponse.isSuccessful()) {
|
||||||
List<Conversation> conversationList = conversationsResponse.body();
|
conversations.conversations = conversationsResponse.body();
|
||||||
conversations.conversations = conversationList;
|
|
||||||
conversations.pagination = MastodonHelper.getPagination(conversationsResponse.headers());
|
conversations.pagination = MastodonHelper.getPagination(conversationsResponse.headers());
|
||||||
|
if (conversations.conversations != null && conversations.conversations.size() > 0) {
|
||||||
if (conversationList != null && conversationList.size() > 0) {
|
addFetchMoreConversation(conversations.conversations, conversationsTimeline, timelineParams);
|
||||||
|
|
||||||
addFetchMoreConversation(conversationList, conversationsTimeline, timelineParams);
|
|
||||||
|
|
||||||
for (Conversation conversation : conversations.conversations) {
|
for (Conversation conversation : conversations.conversations) {
|
||||||
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
||||||
StatusCache statusCache = new StatusCache();
|
StatusCache statusCache = new StatusCache();
|
||||||
|
@ -564,8 +559,7 @@ public class TimelinesVM extends AndroidViewModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
Conversations finalConversations = conversations;
|
Runnable myRunnable = () -> conversationListMutableLiveData.setValue(conversations);
|
||||||
Runnable myRunnable = () -> conversationListMutableLiveData.setValue(finalConversations);
|
|
||||||
mainHandler.post(myRunnable);
|
mainHandler.post(myRunnable);
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
|
@ -577,36 +571,34 @@ public class TimelinesVM extends AndroidViewModel {
|
||||||
conversationListMutableLiveData = new MutableLiveData<>();
|
conversationListMutableLiveData = new MutableLiveData<>();
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
StatusCache statusCacheDAO = new StatusCache(getApplication().getApplicationContext());
|
||||||
Conversations conversations = null;
|
Conversations conversations = new Conversations();
|
||||||
try {
|
try {
|
||||||
conversations = statusCacheDAO.getConversations(timelineParams.instance, timelineParams.userId, timelineParams.maxId, timelineParams.minId, timelineParams.sinceId);
|
List<Conversation> conversationsDb = statusCacheDAO.getConversations(timelineParams.instance, timelineParams.userId, timelineParams.maxId, timelineParams.minId, timelineParams.sinceId);
|
||||||
if (conversations != null) {
|
if (conversationsDb != null && conversationsDb.size() > 0) {
|
||||||
if (conversations.conversations != null && conversations.conversations.size() > 0) {
|
if (timelineConversations != null) {
|
||||||
if (timelineConversations != null) {
|
List<Conversation> notPresentConversations = new ArrayList<>();
|
||||||
List<Conversation> notPresentConversations = new ArrayList<>();
|
for (Conversation conversation : conversationsDb) {
|
||||||
for (Conversation conversation : conversations.conversations) {
|
if (!timelineConversations.contains(conversation)) {
|
||||||
if (!timelineConversations.contains(conversation)) {
|
conversation.cached = true;
|
||||||
conversation.cached = true;
|
timelineConversations.add(conversation);
|
||||||
timelineConversations.add(conversation);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//Only not already present statuses are added
|
|
||||||
conversations.conversations = notPresentConversations;
|
|
||||||
}
|
|
||||||
if (conversations.conversations.size() > 0) {
|
|
||||||
addFetchMoreConversation(conversations.conversations, timelineConversations, timelineParams);
|
|
||||||
conversations.pagination = new Pagination();
|
|
||||||
conversations.pagination.min_id = conversations.conversations.get(0).id;
|
|
||||||
conversations.pagination.max_id = conversations.conversations.get(conversations.conversations.size() - 1).id;
|
|
||||||
}
|
}
|
||||||
|
//Only not already present statuses are added
|
||||||
|
conversationsDb = notPresentConversations;
|
||||||
|
}
|
||||||
|
conversations.conversations = conversationsDb;
|
||||||
|
if (conversations.conversations.size() > 0) {
|
||||||
|
addFetchMoreConversation(conversations.conversations, timelineConversations, timelineParams);
|
||||||
|
conversations.pagination = new Pagination();
|
||||||
|
conversations.pagination.min_id = conversations.conversations.get(0).id;
|
||||||
|
conversations.pagination.max_id = conversations.conversations.get(conversations.conversations.size() - 1).id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (DBException e) {
|
} catch (DBException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
Conversations finalConversations = conversations;
|
Runnable myRunnable = () -> conversationListMutableLiveData.setValue(conversations);
|
||||||
Runnable myRunnable = () -> conversationListMutableLiveData.setValue(finalConversations);
|
|
||||||
mainHandler.post(myRunnable);
|
mainHandler.post(myRunnable);
|
||||||
}).start();
|
}).start();
|
||||||
return conversationListMutableLiveData;
|
return conversationListMutableLiveData;
|
||||||
|
|
|
@ -71,6 +71,22 @@
|
||||||
app:iconTint="@color/cyanea_accent_dark_reference"
|
app:iconTint="@color/cyanea_accent_dark_reference"
|
||||||
app:strokeColor="@color/cyanea_accent_dark_reference" />
|
app:strokeColor="@color/cyanea_accent_dark_reference" />
|
||||||
|
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/domain_block"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:paddingVertical="12dp"
|
||||||
|
android:text="@string/blocked_domains"
|
||||||
|
android:textAlignment="textStart"
|
||||||
|
android:textColor="@color/cyanea_accent_dark_reference"
|
||||||
|
app:icon="@drawable/ic_baseline_navigate_next_24"
|
||||||
|
app:iconGravity="end"
|
||||||
|
app:iconTint="@color/cyanea_accent_dark_reference"
|
||||||
|
app:strokeColor="@color/cyanea_accent_dark_reference" />
|
||||||
|
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
<androidx.fragment.app.FragmentContainerView
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
|
|
@ -1906,4 +1906,5 @@
|
||||||
<string name="notif_signed_up">Signed up</string>
|
<string name="notif_signed_up">Signed up</string>
|
||||||
<string name="Suggestions">Suggestions</string>
|
<string name="Suggestions">Suggestions</string>
|
||||||
<string name="not_interested">Not interested</string>
|
<string name="not_interested">Not interested</string>
|
||||||
|
<string name="blocked_domains">Blocked domains</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in New Issue