M src/main/java/eu/siacs/conversations/services/AvatarService.java => src/main/java/eu/siacs/conversations/services/AvatarService.java +12 -1
@@ 125,6 125,17 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
return avatar;
}
+ public Bitmap getRoundedShortcut(final MucOptions mucOptions) {
+ final DisplayMetrics metrics = mXmppConnectionService.getResources().getDisplayMetrics();
+ final int size = Math.round(metrics.density * 48);
+ Bitmap bitmap = FileBackend.drawDrawable(get(mucOptions, size, false));
+ final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(output);
+ final Paint paint = new Paint();
+ drawAvatar(bitmap, canvas, paint);
+ return output;
+ }
+
public Bitmap getRoundedShortcut(final Contact contact) {
return getRoundedShortcut(contact, false);
}
@@ 148,7 159,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
return output;
}
- private void drawAvatar(Bitmap bitmap, Canvas canvas, Paint paint) {
+ private static void drawAvatar(Bitmap bitmap, Canvas canvas, Paint paint) {
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
M src/main/java/eu/siacs/conversations/services/NotificationService.java => src/main/java/eu/siacs/conversations/services/NotificationService.java +7 -1
@@ 1373,12 1373,19 @@ public class NotificationService {
}
}
}
+ final ShortcutInfoCompat info;
if (conversation.getMode() == Conversation.MODE_SINGLE) {
Contact contact = conversation.getContact();
Uri systemAccount = contact.getSystemAccount();
if (systemAccount != null) {
mBuilder.addPerson(systemAccount.toString());
}
+ info = mXmppConnectionService.getShortcutService().getShortcutInfoCompat(contact);
+ } else {
+ info =
+ mXmppConnectionService
+ .getShortcutService()
+ .getShortcutInfoCompat(conversation.getMucOptions());
}
mBuilder.setWhen(conversation.getLatestMessage().getTimeSent());
mBuilder.setSmallIcon(R.drawable.ic_notification);
@@ 1388,7 1395,6 @@ public class NotificationService {
mBuilder.setSubText(conversation.getAccount().getJid().asBareJid().toString());
}
- ShortcutInfoCompat info = mXmppConnectionService.getShortcutService().getShortcutInfoCompat(conversation.getContact());
mBuilder.setShortcutInfo(info);
if (Build.VERSION.SDK_INT >= 30) {
mXmppConnectionService.getSystemService(ShortcutManager.class).pushDynamicShortcut(info.toShortcutInfo());
M src/main/java/eu/siacs/conversations/services/ShortcutService.java => src/main/java/eu/siacs/conversations/services/ShortcutService.java +49 -13
@@ 21,7 21,7 @@ import java.util.List;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
-import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.ui.StartConversationActivity;
import eu.siacs.conversations.ui.ConversationsActivity;
import eu.siacs.conversations.utils.ReplacingSerialSingleThreadExecutor;
@@ 101,6 101,24 @@ public class ShortcutService {
.build();
}
+ public ShortcutInfoCompat getShortcutInfoCompat(final MucOptions mucOptions) {
+ final ShortcutInfoCompat.Builder builder =
+ new ShortcutInfoCompat.Builder(xmppConnectionService, getShortcutId(mucOptions))
+ .setShortLabel(mucOptions.getConversation().getName())
+ .setIntent(getShortcutIntent(mucOptions))
+ .setIsConversation();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ builder.setIcon(
+ IconCompat.createFromIcon(
+ xmppConnectionService,
+ Icon.createWithBitmap(
+ xmppConnectionService
+ .getAvatarService()
+ .getRoundedShortcut(mucOptions))));
+ }
+ return builder.build();
+ }
+
@TargetApi(Build.VERSION_CODES.N_MR1)
private ShortcutInfo getShortcutInfo(Contact contact) {
return getShortcutInfoCompat(contact).toShortcutInfo();
@@ 129,22 147,40 @@ public class ShortcutService {
return contact.getAccount().getJid().asBareJid().toEscapedString()+"#"+contact.getJid().asBareJid().toEscapedString();
}
- private Intent getShortcutIntent(Contact contact) {
- final Conversation conversation = xmppConnectionService.find(contact.getAccount(), contact.getJid());
+ private static String getShortcutId(final MucOptions mucOptions) {
+ final Account account = mucOptions.getAccount();
+ final Jid jid = mucOptions.getConversation().getJid();
+ return account.getJid().asBareJid().toEscapedString()
+ + "#"
+ + jid.asBareJid().toEscapedString();
+ }
+
+ private Intent getShortcutIntent(final MucOptions mucOptions) {
+ final Account account = mucOptions.getAccount();
+ return getShortcutIntent(
+ account,
+ Uri.parse(
+ String.format(
+ "xmpp:%s?join",
+ mucOptions
+ .getConversation()
+ .getJid()
+ .asBareJid()
+ .toEscapedString())));
+ }
- if (conversation != null) {
- Intent intent = new Intent(xmppConnectionService, ConversationsActivity.class);
- intent.setAction(ConversationsActivity.ACTION_VIEW_CONVERSATION);
- intent.putExtra(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid());
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
- return intent;
- }
+ private Intent getShortcutIntent(final Contact contact) {
+ return getShortcutIntent(
+ contact.getAccount(),
+ Uri.parse("xmpp:" + contact.getJid().asBareJid().toEscapedString()));
+ }
+ private Intent getShortcutIntent(final Account account, final Uri uri) {
Intent intent = new Intent(xmppConnectionService, StartConversationActivity.class);
intent.setAction(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("xmpp:"+contact.getJid().asBareJid().toEscapedString()));
- intent.putExtra("account",contact.getAccount().getJid().asBareJid().toString());
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.setData(uri);
+ intent.putExtra("account", account.getJid().asBareJid().toString());
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
return intent;
}
M src/main/java/eu/siacs/conversations/services/XmppConnectionService.java => src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +7 -1
@@ 5042,8 5042,14 @@ public class XmppConnectionService extends Service {
}
public Conversation findFirstMuc(Jid jid) {
+ return findFirstMuc(jid, null);
+ }
+
+ public Conversation findFirstMuc(Jid jid, String accountJid) {
for (Conversation conversation : getConversations()) {
- if (conversation.getAccount().isEnabled() && conversation.getJid().asBareJid().equals(jid.asBareJid()) && conversation.getMode() == Conversation.MODE_MULTI) {
+ if ((conversation.getAccount().isEnabled() || accountJid != null)
+ && (accountJid == null || accountJid.equals(conversation.getAccount().getJid().asBareJid().toString()))
+ && conversation.getJid().asBareJid().equals(jid.asBareJid()) && conversation.getMode() == Conversation.MODE_MULTI) {
return conversation;
}
}
M src/main/java/eu/siacs/conversations/ui/ConversationFragment.java => src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +6 -1
@@ 1999,7 1999,12 @@ public class ConversationFragment extends XmppFragment
}
private void addShortcut() {
- ShortcutInfoCompat info = activity.xmppConnectionService.getShortcutService().getShortcutInfoCompat(conversation.getContact());
+ ShortcutInfoCompat info;
+ if (conversation.getMode() == Conversation.MODE_MULTI) {
+ info = activity.xmppConnectionService.getShortcutService().getShortcutInfoCompat(conversation.getMucOptions());
+ } else {
+ info = activity.xmppConnectionService.getShortcutService().getShortcutInfoCompat(conversation.getContact());
+ }
ShortcutManagerCompat.requestPinShortcut(activity, info, null);
}
M src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java => src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +3 -3
@@ 1018,9 1018,9 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
}
private boolean handleJid(Invite invite) {
- List<Contact> contacts = xmppConnectionService.findContacts(invite.getJid(), invite.account);
- if (invite.isAction(XmppUri.ACTION_JOIN)) {
- Conversation muc = xmppConnectionService.findFirstMuc(invite.getJid());
+ final List<Contact> contacts = xmppConnectionService.findContacts(invite.getJid(), invite.account);
+ final Conversation muc = xmppConnectionService.findFirstMuc(invite.getJid(), invite.account);
+ if (invite.isAction(XmppUri.ACTION_JOIN) || (contacts.isEmpty() && muc != null)) {
if (muc != null && !invite.forceDialog) {
switchToConversationDoNotAppend(muc, invite.getBody());
return true;