Update bottom navigation inbox badge when inbox changes (#7398)

This commit is contained in:
ByteHamster 2024-09-14 11:20:07 +02:00 committed by GitHub
parent 4f10efee7a
commit b776e44717
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 28 additions and 7 deletions

View File

@ -37,6 +37,7 @@ import androidx.work.WorkInfo;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.badge.BadgeDrawable;
import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.navigation.NavigationBarView; import com.google.android.material.navigation.NavigationBarView;
@ -45,6 +46,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.EpisodeDownloadEvent;
import de.danoeh.antennapod.event.FeedUpdateRunningEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
import de.danoeh.antennapod.event.MessageEvent; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.model.download.DownloadStatus;
import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.FeedItemFilter;
import de.danoeh.antennapod.net.download.service.feed.FeedUpdateManagerImpl; import de.danoeh.antennapod.net.download.service.feed.FeedUpdateManagerImpl;
@ -83,6 +85,7 @@ import de.danoeh.antennapod.ui.screen.subscriptions.SubscriptionFragment;
import de.danoeh.antennapod.ui.view.LockableBottomSheetBehavior; import de.danoeh.antennapod.ui.view.LockableBottomSheetBehavior;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
@ -114,6 +117,7 @@ public class MainActivity extends CastEnabledActivity {
private @Nullable DrawerLayout drawerLayout; private @Nullable DrawerLayout drawerLayout;
private @Nullable ActionBarDrawerToggle drawerToggle; private @Nullable ActionBarDrawerToggle drawerToggle;
private BottomNavigationView bottomNavigationView; private BottomNavigationView bottomNavigationView;
private Disposable bottomNavigationBadgeLoader = null;
private View navDrawer; private View navDrawer;
private LockableBottomSheetBehavior sheetBehavior; private LockableBottomSheetBehavior sheetBehavior;
private RecyclerView.RecycledViewPool recycledViewPool = new RecyclerView.RecycledViewPool(); private RecyclerView.RecycledViewPool recycledViewPool = new RecyclerView.RecycledViewPool();
@ -330,6 +334,10 @@ public class MainActivity extends CastEnabledActivity {
if (drawerLayout != null && drawerToggle != null) { if (drawerLayout != null && drawerToggle != null) {
drawerLayout.removeDrawerListener(drawerToggle); drawerLayout.removeDrawerListener(drawerToggle);
} }
if (bottomNavigationBadgeLoader != null) {
bottomNavigationBadgeLoader.dispose();
bottomNavigationBadgeLoader = null;
}
} }
private void checkFirstLaunch() { private void checkFirstLaunch() {
@ -516,15 +524,28 @@ public class MainActivity extends CastEnabledActivity {
MenuItem moreItem = menu.add(0, R.id.bottom_navigation_more, 0, getString(R.string.searchpreference_more)); MenuItem moreItem = menu.add(0, R.id.bottom_navigation_more, 0, getString(R.string.searchpreference_more));
moreItem.setIcon(R.drawable.dots_vertical); moreItem.setIcon(R.drawable.dots_vertical);
bottomNavigationView.setOnItemSelectedListener(bottomItemSelectedListener); bottomNavigationView.setOnItemSelectedListener(bottomItemSelectedListener);
updateBottomNavigationBadgeIfNeeded(null);
}
if (bottomNavigationView.getMenu().findItem(R.id.bottom_navigation_inbox) != null) { @Subscribe
Observable.fromCallable(() -> DBReader.getTotalEpisodeCount(new FeedItemFilter(FeedItemFilter.NEW))) public void updateBottomNavigationBadgeIfNeeded(@Nullable UnreadItemsUpdateEvent ignore) {
if (bottomNavigationView == null) {
return;
} else if (bottomNavigationView.getMenu().findItem(R.id.bottom_navigation_inbox) == null) {
return;
}
if (bottomNavigationBadgeLoader != null) {
bottomNavigationBadgeLoader.dispose();
}
bottomNavigationBadgeLoader = Observable.fromCallable(
() -> DBReader.getTotalEpisodeCount(new FeedItemFilter(FeedItemFilter.NEW)))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> .subscribe(result -> {
bottomNavigationView.getOrCreateBadge(R.id.bottom_navigation_inbox).setNumber(result), BadgeDrawable badge = bottomNavigationView.getOrCreateBadge(R.id.bottom_navigation_inbox);
error -> Log.e(TAG, Log.getStackTraceString(error))); badge.setVisible(result > 0);
} badge.setNumber(result);
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
} }
private final NavigationBarView.OnItemSelectedListener bottomItemSelectedListener = item -> { private final NavigationBarView.OnItemSelectedListener bottomItemSelectedListener = item -> {