From 4ecd525f1359e882c7b05777512b1c6316d6f4e9 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Wed, 1 Mar 2023 21:44:11 +0100 Subject: [PATCH] feat(tabs/notifications): add unread badge --- .../android/GlobalUserPreferences.java | 3 ++ .../android/fragments/HomeFragment.java | 42 +++++++++++++++++++ .../drawable/ic_notifications_tab_badged.xml | 10 +++++ 3 files changed, 55 insertions(+) create mode 100644 mastodon/src/main/res/drawable/ic_notifications_tab_badged.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index c338d7561..cf88ad534 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -47,6 +47,7 @@ public class GlobalUserPreferences{ public static boolean collapseLongPosts; public static boolean spectatorMode; public static boolean autoHideFab; + public static long lastNotificationOpenedTime; public static String publishButtonText; public static ThemePreference theme; public static ColorPreference color; @@ -101,6 +102,7 @@ public class GlobalUserPreferences{ collapseLongPosts=prefs.getBoolean("collapseLongPosts", true); spectatorMode=prefs.getBoolean("spectatorMode", false); autoHideFab=prefs.getBoolean("autoHideFab", true); + lastNotificationOpenedTime=prefs.getLong("lastNotificationOpenedTime", 0); publishButtonText=prefs.getString("publishButtonText", ""); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>()); @@ -150,6 +152,7 @@ public class GlobalUserPreferences{ .putBoolean("collapseLongPosts", collapseLongPosts) .putBoolean("spectatorMode", spectatorMode) .putBoolean("autoHideFab", autoHideFab) + .putLong("lastNotificationOpenedTime", lastNotificationOpenedTime) .putString("publishButtonText", publishButtonText) .putBoolean("bottomEncoding", bottomEncoding) .putInt("theme", theme.ordinal()) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java index 2dcd2a382..81915a575 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java @@ -16,21 +16,32 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.markers.SaveMarkers; import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.discover.DiscoverFragment; import org.joinmastodon.android.model.Account; +import org.joinmastodon.android.model.Notification; +import org.joinmastodon.android.model.PaginatedResponse; import org.joinmastodon.android.ui.AccountSwitcherSheet; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.TabBar; import org.parceler.Parcels; +import java.time.Instant; import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import androidx.annotation.IdRes; import androidx.annotation.Nullable; import me.grishka.appkit.FragmentStackActivity; +import me.grishka.appkit.api.Callback; +import me.grishka.appkit.api.ErrorResponse; +import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.fragments.AppKitFragment; import me.grishka.appkit.fragments.LoaderFragment; import me.grishka.appkit.fragments.OnBackPressedListener; @@ -52,6 +63,8 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene private TabBar tabBar; private View tabBarWrap; private ImageView tabBarAvatar; + private ImageView notificationTabIcon; + private boolean notificationBadged = false; @IdRes private int currentTab=R.id.tab_home; @@ -117,6 +130,23 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene Account self=AccountSessionManager.getInstance().getAccount(accountID).self; ViewImageLoader.load(tabBarAvatar, null, new UrlImageLoaderRequest(self.avatar, V.dp(28), V.dp(28))); + notificationTabIcon=content.findViewById(R.id.tab_notifications); + + AccountSessionManager.getInstance() + .getAccount(accountID).getCacheController() + .getNotifications(null, 1, false, false, true, new Callback<>() { + @Override + public void onSuccess(PaginatedResponse> result) { + notificationBadged = result.items.get(0).createdAt.isAfter(Instant.ofEpochMilli(GlobalUserPreferences.lastNotificationOpenedTime)); + setNotificationBadge(); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }); + if(savedInstanceState==null){ getChildFragmentManager().beginTransaction() .add(R.id.fragment_wrap, homeTabFragment) @@ -255,6 +285,14 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene scrollable.scrollToTop(); return; } + + if(tab == R.id.tab_notifications){ + notificationBadged=false; + GlobalUserPreferences.lastNotificationOpenedTime = System.currentTimeMillis(); + GlobalUserPreferences.save(); + setNotificationBadge(); + } + getChildFragmentManager().beginTransaction().hide(fragmentForTab(currentTab)).show(newFragment).commit(); maybeTriggerLoading(newFragment); currentTab=tab; @@ -327,4 +365,8 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene // getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment); // getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment); } + + private void setNotificationBadge() { + notificationTabIcon.setImageDrawable(getContext().getDrawable(notificationBadged ? R.drawable.ic_notifications_tab_badged : R.drawable.ic_fluent_alert_28_selector)); + } } diff --git a/mastodon/src/main/res/drawable/ic_notifications_tab_badged.xml b/mastodon/src/main/res/drawable/ic_notifications_tab_badged.xml new file mode 100644 index 000000000..c5608a960 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_notifications_tab_badged.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file