From b76a4cfcf5ce81928a95c74d4cef8b62f7308afb Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 9 Jan 2021 17:18:32 +0100 Subject: [PATCH] Fix issue #160 #87 #88 - Notification counter + mark them all as read --- .../fedilab/fedilabtube/AccountActivity.java | 46 +++++++++++++++++-- .../app/fedilab/fedilabtube/MainActivity.java | 8 +++- .../fedilabtube/client/PeertubeService.java | 7 +++ .../client/RetrofitPeertubeAPI.java | 26 +++++++++++ .../PeertubeNotificationsListAdapter.java | 29 +++++++++++- .../fedilab/fedilabtube/helper/Helper.java | 2 + .../res/drawable/ic_baseline_fiber_new_24.xml | 10 ++++ app/src/main/res/layout/activity_account.xml | 2 +- .../layout/drawer_peertube_notification.xml | 25 ++++++++-- app/src/main/res/values/strings.xml | 2 + 10 files changed, 144 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_fiber_new_24.xml diff --git a/app/src/main/java/app/fedilab/fedilabtube/AccountActivity.java b/app/src/main/java/app/fedilab/fedilabtube/AccountActivity.java index 3088fe2..7fcca2a 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/AccountActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/AccountActivity.java @@ -19,6 +19,8 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.text.Html; import android.text.SpannableString; import android.text.Spanned; @@ -52,6 +54,8 @@ import app.fedilab.fedilabtube.helper.SwitchAccountHelper; import app.fedilab.fedilabtube.sqlite.AccountDAO; import app.fedilab.fedilabtube.sqlite.Sqlite; +import static app.fedilab.fedilabtube.MainActivity.badgeCount; + public class AccountActivity extends AppCompatActivity { @@ -112,9 +116,13 @@ public class AccountActivity extends AppCompatActivity { }); - + TabLayout.Tab notificationTab = binding.accountTabLayout.newTab(); if (Helper.isLoggedIn(AccountActivity.this)) { - binding.accountTabLayout.addTab(binding.accountTabLayout.newTab().setText(getString(R.string.title_notifications))); + if (badgeCount > 0) { + binding.accountTabLayout.addTab(notificationTab.setText(getString(R.string.title_notifications) + " (" + badgeCount + ")")); + } else { + binding.accountTabLayout.addTab(notificationTab.setText(getString(R.string.title_notifications))); + } binding.accountTabLayout.addTab(binding.accountTabLayout.newTab().setText(getString(R.string.title_muted))); binding.accountTabLayout.addTab(binding.accountTabLayout.newTab().setText(getString(R.string.title_channel))); @@ -159,9 +167,29 @@ public class AccountActivity extends AppCompatActivity { fragment = (Fragment) binding.accountViewpager.getAdapter().instantiateItem(binding.accountViewpager, tab.getPosition()); switch (tab.getPosition()) { case 0: - if (fragment != null) { - DisplayNotificationsFragment displayNotificationsFragment = ((DisplayNotificationsFragment) fragment); - displayNotificationsFragment.scrollToTop(); + if (badgeCount > 0) { + android.app.AlertDialog.Builder builder; + builder = new android.app.AlertDialog.Builder(AccountActivity.this); + builder.setMessage(R.string.mark_all_notifications_as_read_confirm); + builder.setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(R.string.mark_all_as_read, (dialog, which) -> { + new Thread(() -> { + new RetrofitPeertubeAPI(AccountActivity.this).markAllAsRead(); + Handler mainHandler = new Handler(Looper.getMainLooper()); + badgeCount = 0; + Runnable myRunnable = () -> binding.accountTabLayout.getTabAt(0).setText(getString(R.string.title_notifications)); + mainHandler.post(myRunnable); + }).start(); + + dialog.dismiss(); + }) + .setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss()) + .show(); + } else { + if (fragment != null) { + DisplayNotificationsFragment displayNotificationsFragment = ((DisplayNotificationsFragment) fragment); + displayNotificationsFragment.scrollToTop(); + } } break; case 1: @@ -195,6 +223,14 @@ public class AccountActivity extends AppCompatActivity { } } + public void updateCounter() { + if (badgeCount > 0) { + binding.accountTabLayout.getTabAt(0).setText(getString(R.string.title_notifications) + " (" + badgeCount + ")"); + } else { + binding.accountTabLayout.getTabAt(0).setText(getString(R.string.title_notifications)); + } + } + @Override protected void onResume() { super.onResume(); diff --git a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java index d3a259a..25e494f 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java @@ -119,7 +119,7 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen private DisplayVideosFragment recentFragment, locaFragment, trendingFragment, subscriptionFragment, mostLikedFragment; private DisplayOverviewFragment overviewFragment; private ActivityMainBinding binding; - private int badgeCount; + public static int badgeCount; private final BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = item -> { int itemId = item.getItemId(); @@ -566,6 +566,12 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen } } + @Override + public void onResume() { + super.onResume(); + invalidateOptionsMenu(); + } + private void refreshToken() { new Thread(() -> { final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java index 6768354..17bf2fc 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java @@ -287,6 +287,13 @@ public interface PeertubeService { @GET("users/me/notifications?start=0&count=0&unread=true") Call countNotifications(@Header("Authorization") String credentials); + @POST("users/me/notifications/read-all") + Call markAllAsRead(@Header("Authorization") String credentials); + + @FormUrlEncoded + @POST("users/me/notifications/read") + Call markAsRead(@Header("Authorization") String credentials, @Field("ids[]") List ids); + //Update Notification settings @PUT("users/me/notification-settings") Call updateNotifications(@Header("Authorization") String credentials, @Body NotificationSettings notificationSettings); diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java b/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java index 11340da..01031d6 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java @@ -301,6 +301,32 @@ public class RetrofitPeertubeAPI { return 0; } + /** + * Mark all notifications as read + */ + public void markAllAsRead() { + PeertubeService peertubeService = init(); + Call notificationsCall = peertubeService.markAllAsRead("Bearer " + token); + try { + Response response = notificationsCall.execute(); + } catch (IOException ignored) { + } + } + + /** + * Mark a notification as read + */ + public void markAsRead(String id) { + PeertubeService peertubeService = init(); + ArrayList ids = new ArrayList<>(); + ids.add(id); + Call notificationsCall = peertubeService.markAsRead("Bearer " + token, ids); + try { + Response response = notificationsCall.execute(); + } catch (IOException ignored) { + } + } + /** * Retrieve notifications * diff --git a/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeNotificationsListAdapter.java b/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeNotificationsListAdapter.java index 5c184b8..b6dee41 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeNotificationsListAdapter.java +++ b/app/src/main/java/app/fedilab/fedilabtube/drawer/PeertubeNotificationsListAdapter.java @@ -31,10 +31,12 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.List; +import app.fedilab.fedilabtube.AccountActivity; import app.fedilab.fedilabtube.PeertubeActivity; import app.fedilab.fedilabtube.R; import app.fedilab.fedilabtube.ShowAccountActivity; import app.fedilab.fedilabtube.ShowChannelActivity; +import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI; import app.fedilab.fedilabtube.client.data.AccountData; import app.fedilab.fedilabtube.client.data.ChannelData; import app.fedilab.fedilabtube.client.data.NotificationData.Notification; @@ -43,6 +45,8 @@ import app.fedilab.fedilabtube.fragment.DisplayNotificationsFragment; import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.HelperInstance; +import static app.fedilab.fedilabtube.MainActivity.badgeCount; + public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter { @@ -72,6 +76,11 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter markAsRead(notification, position)); } else if (notification.getComment() != null) { //Comment Notification String profileUrl = notification.getComment().getAccount().getAvatar() != null ? notification.getComment().getAccount().getAvatar().getPath() : null; Helper.loadGiF(context, profileUrl, holder.peertube_notif_pp); @@ -112,6 +122,7 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter markAsRead(notification, position)); } else if (notification.getAbuse() != null) { clickableNotification = false; if (notification.getType() == DisplayNotificationsFragment.MY_VIDEO_REPPORT_SUCCESS) { @@ -172,6 +185,7 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter markAsRead(notification, position)); } } holder.peertube_notif_date.setText(Helper.dateDiff(context, notification.getCreatedAt())); @@ -197,6 +211,17 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter new RetrofitPeertubeAPI(context).markAsRead(notification.getId())).start(); + } + } @Override public long getItemId(int position) { @@ -212,7 +237,7 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter + + diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml index b384728..27fca8d 100644 --- a/app/src/main/res/layout/activity_account.xml +++ b/app/src/main/res/layout/activity_account.xml @@ -46,7 +46,7 @@ android:id="@+id/instance" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginTop="5dp" android:gravity="center" android:textColor="@android:color/white" android:textSize="18sp" diff --git a/app/src/main/res/layout/drawer_peertube_notification.xml b/app/src/main/res/layout/drawer_peertube_notification.xml index aadbbae..ea96026 100644 --- a/app/src/main/res/layout/drawer_peertube_notification.xml +++ b/app/src/main/res/layout/drawer_peertube_notification.xml @@ -15,6 +15,7 @@ see . --> @@ -38,13 +39,27 @@ android:layout_weight="1" android:orientation="vertical"> - + android:orientation="horizontal"> + + + + + Subscription cancelled! Cancel subscription Are you sure, you want to cancel that subscription? + Are you sure you want to mark all notifications as read? + Mark all as read \ No newline at end of file