From 61cc97ff1fe06d71c3b6cad8489d8cc5c179225a Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Mon, 30 Sep 2024 10:09:35 -0500 Subject: [PATCH] Show unread counts for accounts --- .../ui/ConversationsActivity.java | 122 ++++++++++-------- 1 file changed, 66 insertions(+), 56 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index 40b11fcddfcfa1cc62e5fe19d3c0eeb6a61117af..59b3a4456faa217339c72689afa5b6026cc5d10a 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java @@ -199,62 +199,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio if (accountHeader == null) return; - accountHeader.apply(ah -> { - if (!refreshAccounts) return kotlin.Unit.INSTANCE; - refreshAccounts = false; - final var accounts = xmppConnectionService.getAccounts(); - final var inHeader = new HashSet<>(); - for (final var p : ImmutableList.copyOf(accountHeader.getProfiles())) { - if (p instanceof com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem) continue; - if (accounts.contains(p.getTag()) || (accounts.size() > 1 && p.getTag() == null)) { - inHeader.add(p.getTag()); - } else { - accountHeader.removeProfile(p); - } - } - - if (accounts.size() > 1 && !inHeader.contains(null)) { - final var all = new com.mikepenz.materialdrawer.model.ProfileDrawerItem(); - all.setIdentifier(100); - com.mikepenz.materialdrawer.model.interfaces.DescribableKt.setDescriptionText(all, "All Accounts"); - com.mikepenz.materialdrawer.model.interfaces.IconableKt.setIconRes(all, R.drawable.main_logo); - accountHeader.addProfile(all, 0); - } - - accountHeader.removeProfileByIdentifier(DRAWER_MANAGE_PHONE_ACCOUNTS); - final var hasPhoneAccounts = accounts.stream().anyMatch(a -> a.getGateways("pstn").size() > 0); - if (hasPhoneAccounts) { - final var phoneAccounts = new com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem(); - phoneAccounts.setIdentifier(DRAWER_MANAGE_PHONE_ACCOUNTS); - com.mikepenz.materialdrawer.model.interfaces.NameableKt.setNameText(phoneAccounts, "Manage Phone Accounts"); - com.mikepenz.materialdrawer.model.interfaces.IconableKt.setIconRes(phoneAccounts, R.drawable.ic_call_24dp); - accountHeader.addProfile(phoneAccounts, accountHeader.getProfiles().size() - 1); - } - - long id = 101; - for (final var a : accounts) { - final var size = (int) getResources().getDimension(R.dimen.avatar_on_drawer); - final var avatar = xmppConnectionService.getAvatarService().get(a, size, true); - if (avatar == null) { - final var task = new AvatarWorkerTask(this, R.dimen.avatar_on_drawer); - try { task.execute(a); } catch (final RejectedExecutionException ignored) { } - refreshAccounts = true; - } - final var p = new com.mikepenz.materialdrawer.model.ProfileDrawerItem(); - p.setIdentifier(id++); - p.setTag(a); - com.mikepenz.materialdrawer.model.interfaces.NameableKt.setNameText(p, a.getDisplayName() == null ? "" : a.getDisplayName()); - com.mikepenz.materialdrawer.model.interfaces.DescribableKt.setDescriptionText(p, a.getJid().asBareJid().toString()); - if (avatar != null) com.mikepenz.materialdrawer.model.interfaces.IconableKt.setIconBitmap(p, FileBackend.drawDrawable(avatar).copy(Bitmap.Config.ARGB_8888, false)); - if (inHeader.contains(a)) { - accountHeader.updateProfile(p); - } else { - accountHeader.addProfile(p, accountHeader.getProfiles().size() - (hasPhoneAccounts ? 2 : 1)); - } - } - return kotlin.Unit.INSTANCE; - }); - + final var accountUnreads = new HashMap(); binding.drawer.apply(dr -> { final var items = binding.drawer.getItemAdapter().getAdapterItems(); final var tags = new TreeMap(); @@ -271,6 +216,9 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio } else { dmUnread += unread; } + var accountUnread = accountUnreads.get(c.getAccount()); + if (accountUnread == null) accountUnread = 0; + accountUnreads.put(c.getAccount(), accountUnread + unread); for (final var tag : c.getTags(this)) { if ("Channel".equals(tag.getName())) continue; var count = tags.get(tag); @@ -333,6 +281,68 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio binding.drawer.getItemAdapter().getFastAdapter().notifyDataSetChanged(); return kotlin.Unit.INSTANCE; }); + + + accountHeader.apply(ah -> { + // if (!refreshAccounts) return kotlin.Unit.INSTANCE; + refreshAccounts = false; + final var accounts = xmppConnectionService.getAccounts(); + final var inHeader = new HashSet<>(); + for (final var p : ImmutableList.copyOf(accountHeader.getProfiles())) { + if (p instanceof com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem) continue; + if (accounts.contains(p.getTag()) || (accounts.size() > 1 && p.getTag() == null)) { + inHeader.add(p.getTag()); + } else { + accountHeader.removeProfile(p); + } + } + + if (accounts.size() > 1 && !inHeader.contains(null)) { + final var all = new com.mikepenz.materialdrawer.model.ProfileDrawerItem(); + all.setIdentifier(100); + com.mikepenz.materialdrawer.model.interfaces.DescribableKt.setDescriptionText(all, "All Accounts"); + com.mikepenz.materialdrawer.model.interfaces.IconableKt.setIconRes(all, R.drawable.main_logo); + accountHeader.addProfile(all, 0); + } + + accountHeader.removeProfileByIdentifier(DRAWER_MANAGE_PHONE_ACCOUNTS); + final var hasPhoneAccounts = accounts.stream().anyMatch(a -> a.getGateways("pstn").size() > 0); + if (hasPhoneAccounts) { + final var phoneAccounts = new com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem(); + phoneAccounts.setIdentifier(DRAWER_MANAGE_PHONE_ACCOUNTS); + com.mikepenz.materialdrawer.model.interfaces.NameableKt.setNameText(phoneAccounts, "Manage Phone Accounts"); + com.mikepenz.materialdrawer.model.interfaces.IconableKt.setIconRes(phoneAccounts, R.drawable.ic_call_24dp); + accountHeader.addProfile(phoneAccounts, accountHeader.getProfiles().size() - 1); + } + + long id = 101; + for (final var a : accounts) { + final var size = (int) getResources().getDimension(R.dimen.avatar_on_drawer); + final var avatar = xmppConnectionService.getAvatarService().get(a, size, true); + if (avatar == null) { + final var task = new AvatarWorkerTask(this, R.dimen.avatar_on_drawer); + try { task.execute(a); } catch (final RejectedExecutionException ignored) { } + refreshAccounts = true; + } + final var p = new com.mikepenz.materialdrawer.model.ProfileDrawerItem(); + p.setIdentifier(id++); + p.setTag(a); + com.mikepenz.materialdrawer.model.interfaces.NameableKt.setNameText(p, a.getDisplayName() == null ? "" : a.getDisplayName()); + com.mikepenz.materialdrawer.model.interfaces.DescribableKt.setDescriptionText(p, a.getJid().asBareJid().toString()); + if (avatar != null) com.mikepenz.materialdrawer.model.interfaces.IconableKt.setIconBitmap(p, FileBackend.drawDrawable(avatar).copy(Bitmap.Config.ARGB_8888, false)); + final var color = MaterialColors.getColor(binding.drawer, com.google.android.material.R.attr.colorPrimaryContainer); + final var textColor = MaterialColors.getColor(binding.drawer, com.google.android.material.R.attr.colorOnPrimaryContainer); + p.setBadgeStyle(new com.mikepenz.materialdrawer.holder.BadgeStyle(com.mikepenz.materialdrawer.R.drawable.material_drawer_badge, color, color, textColor)); + final var badgeNumber = accountUnreads.get(a); + p.setBadge(new com.mikepenz.materialdrawer.holder.StringHolder(badgeNumber == null ? null : badgeNumber.toString())); + if (inHeader.contains(a)) { + accountHeader.updateProfile(p); + } else { + accountHeader.addProfile(p, accountHeader.getProfiles().size() - (hasPhoneAccounts ? 2 : 1)); + } + } + return kotlin.Unit.INSTANCE; + }); } @Override