From be7d65989d6f181aabcc6bf192eeff15d446620e Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 19 Nov 2022 20:12:52 +0100 Subject: [PATCH] add posts notifications tab closes #38 --- .../android/api/CacheController.java | 29 ++++++++++++++----- .../fragments/NotificationsFragment.java | 15 ++++++++-- .../fragments/NotificationsListFragment.java | 4 ++- mastodon/src/main/res/values/ids.xml | 1 + 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java index 830b5a19a..cd7df3f19 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java @@ -35,7 +35,7 @@ import me.grishka.appkit.utils.WorkerThread; public class CacheController{ private static final String TAG="CacheController"; - private static final int DB_VERSION=2; + private static final int DB_VERSION=3; private static final WorkerThread databaseThread=new WorkerThread("databaseThread"); private static final Handler uiHandler=new Handler(Looper.getMainLooper()); @@ -126,14 +126,15 @@ public class CacheController{ }); } - public void getNotifications(String maxID, int count, boolean onlyMentions, boolean forceReload, Callback>> callback){ + public void getNotifications(String maxID, int count, boolean onlyMentions, boolean onlyPosts, boolean forceReload, Callback>> callback){ cancelDelayedClose(); databaseThread.postRunnable(()->{ try{ List filters=AccountSessionManager.getInstance().getAccount(accountID).wordFilters.stream().filter(f->f.context.contains(Filter.FilterContext.NOTIFICATIONS)).collect(Collectors.toList()); if(!forceReload){ SQLiteDatabase db=getOrOpenDatabase(); - try(Cursor cursor=db.query(onlyMentions ? "notifications_mentions" : "notifications_all", new String[]{"json"}, maxID==null ? null : "`id` result=new ArrayList<>(); cursor.moveToFirst(); @@ -159,7 +160,7 @@ public class CacheController{ Log.w(TAG, "getNotifications: corrupted notification object in database", x); } } - new GetNotifications(maxID, count, onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class)) + new GetNotifications(maxID, count, onlyPosts ? EnumSet.of(Notification.Type.STATUS) : onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class)) .setCallback(new Callback<>(){ @Override public void onSuccess(List result){ @@ -173,7 +174,7 @@ public class CacheController{ } return true; }).collect(Collectors.toList()), result.isEmpty() ? null : result.get(result.size()-1).id)); - putNotifications(result, onlyMentions, maxID==null); + putNotifications(result, onlyMentions, onlyPosts, maxID==null); } @Override @@ -191,9 +192,9 @@ public class CacheController{ }, 0); } - private void putNotifications(List notifications, boolean onlyMentions, boolean clear){ + private void putNotifications(List notifications, boolean onlyMentions, boolean onlyPosts, boolean clear){ runOnDbThread((db)->{ - String table=onlyMentions ? "notifications_mentions" : "notifications_all"; + String table=onlyPosts ? "notifications_posts" : onlyMentions ? "notifications_mentions" : "notifications_all"; if(clear) db.delete(table, null, null); ContentValues values=new ContentValues(3); @@ -317,6 +318,7 @@ public class CacheController{ `type` INTEGER NOT NULL )"""); createRecentSearchesTable(db); + createPostsNotificationsTable(db); } @Override @@ -324,6 +326,9 @@ public class CacheController{ if(oldVersion==1){ createRecentSearchesTable(db); } + if(oldVersion==2){ + createPostsNotificationsTable(db); + } } private void createRecentSearchesTable(SQLiteDatabase db){ @@ -334,6 +339,16 @@ public class CacheController{ `time` INTEGER NOT NULL )"""); } + + private void createPostsNotificationsTable(SQLiteDatabase db){ + db.execSQL(""" + CREATE TABLE `notifications_posts` ( + `id` VARCHAR(25) NOT NULL PRIMARY KEY, + `json` TEXT NOT NULL, + `flags` INTEGER NOT NULL DEFAULT 0, + `type` INTEGER NOT NULL + )"""); + } } @FunctionalInterface diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java index d8042db11..94f3a20c1 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java @@ -31,7 +31,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc private FrameLayout[] tabViews; private TabLayoutMediator tabLayoutMediator; - private NotificationsListFragment allNotificationsFragment, mentionsFragment; + private NotificationsListFragment allNotificationsFragment, mentionsFragment, postsFragment; private String accountID; @@ -57,12 +57,13 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc tabLayout=view.findViewById(R.id.tabbar); pager=view.findViewById(R.id.pager); - tabViews=new FrameLayout[2]; + tabViews=new FrameLayout[3]; for(int i=0;i R.id.notifications_all; case 1 -> R.id.notifications_mentions; + case 2 -> R.id.notifications_posts; default -> throw new IllegalStateException("Unexpected value: "+i); }); tabView.setVisibility(View.GONE); @@ -101,9 +102,15 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc mentionsFragment=new NotificationsListFragment(); mentionsFragment.setArguments(args); + args=new Bundle(args); + args.putBoolean("onlyPosts", true); + postsFragment=new NotificationsListFragment(); + postsFragment.setArguments(args); + getChildFragmentManager().beginTransaction() .add(R.id.notifications_all, allNotificationsFragment) .add(R.id.notifications_mentions, mentionsFragment) + .add(R.id.notifications_posts, postsFragment) .commit(); } @@ -113,6 +120,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc tab.setText(switch(position){ case 0 -> R.string.all_notifications; case 1 -> R.string.mentions; + case 2 -> R.string.posts; default -> throw new IllegalStateException("Unexpected value: "+position); }); tab.view.textView.setAllCaps(true); @@ -143,6 +151,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc return switch(page){ case 0 -> allNotificationsFragment; case 1 -> mentionsFragment; + case 2 -> postsFragment; default -> throw new IllegalStateException("Unexpected value: "+page); }; } @@ -163,7 +172,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc @Override public int getItemCount(){ - return 2; + return 3; } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index 2804be5c4..b09071907 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -34,6 +34,7 @@ import me.grishka.appkit.utils.V; public class NotificationsListFragment extends BaseStatusListFragment{ private boolean onlyMentions; + private boolean onlyPosts; private String maxID; @Override @@ -52,6 +53,7 @@ public class NotificationsListFragment extends BaseStatusListFragment0 ? maxID : null, count, onlyMentions, refreshing, new SimpleCallback<>(this){ + .getNotifications(offset>0 ? maxID : null, count, onlyMentions, onlyPosts, refreshing, new SimpleCallback<>(this){ @Override public void onSuccess(PaginatedResponse> result){ if(getActivity()==null) diff --git a/mastodon/src/main/res/values/ids.xml b/mastodon/src/main/res/values/ids.xml index 6545f9cad..768d97958 100644 --- a/mastodon/src/main/res/values/ids.xml +++ b/mastodon/src/main/res/values/ids.xml @@ -15,4 +15,5 @@ + \ No newline at end of file