diff options
author | Christian Schneppe <christian@pix-art.de> | 2018-04-23 21:13:12 +0200 |
---|---|---|
committer | Christian Schneppe <christian@pix-art.de> | 2018-04-23 21:13:12 +0200 |
commit | 80064f6040cab219702d8221a052eace5f47661c (patch) | |
tree | 67c0676deebe0a6f899989eac3a96db5f4f2a167 /src/main/java/de/pixart/messenger | |
parent | 44cf4a0ecbfef6303872316d20e4b18444f6932f (diff) |
support contact shortcuts
* support contact shortcuts
* make ShortcutActivity extends AbstractSearchableListItemActivity
* Draw the app icon in the corner of the icon and modify the name of the widget
* updated label and icon size
Diffstat (limited to 'src/main/java/de/pixart/messenger')
3 files changed, 137 insertions, 8 deletions
diff --git a/src/main/java/de/pixart/messenger/services/AvatarService.java b/src/main/java/de/pixart/messenger/services/AvatarService.java index e7096a558..766c2e240 100644 --- a/src/main/java/de/pixart/messenger/services/AvatarService.java +++ b/src/main/java/de/pixart/messenger/services/AvatarService.java @@ -1,6 +1,8 @@ package de.pixart.messenger.services; +import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; @@ -21,6 +23,7 @@ import java.util.Locale; import java.util.Set; import de.pixart.messenger.Config; +import de.pixart.messenger.R; import de.pixart.messenger.entities.Account; import de.pixart.messenger.entities.Bookmark; import de.pixart.messenger.entities.Contact; @@ -80,21 +83,47 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { } public Bitmap getRoundedShortcut(final Contact contact) { + return getRoundedShortcut(contact, false); + } + + public Bitmap getRoundedShortcutWithIcon(final Contact contact) { + return getRoundedShortcut(contact, true); + } + + private Bitmap getRoundedShortcut(final Contact contact, boolean withIcon) { DisplayMetrics metrics = mXmppConnectionService.getResources().getDisplayMetrics(); int size = Math.round(metrics.density * 48); Bitmap bitmap = get(contact, size); Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); - final Paint paint = new Paint(); - final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + drawAvatar(bitmap, canvas, paint); + if (withIcon) { + drawIcon(canvas, paint); + } + return output; + } + private 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); canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); - return output; + } + + private void drawIcon(Canvas canvas, Paint paint) { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inSampleSize = 3; + Resources resources = mXmppConnectionService.getResources(); + Bitmap icon = BitmapFactory.decodeResource(resources, R.drawable.ic_launcher, opts); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); + + int left = canvas.getWidth() - icon.getWidth(); + int top = canvas.getHeight() - icon.getHeight(); + final Rect rect = new Rect(left, top, left + icon.getWidth(), top + icon.getHeight()); + canvas.drawBitmap(icon, null, rect, paint); } public Bitmap get(final MucOptions.User user, final int size, boolean cachedOnly) { diff --git a/src/main/java/de/pixart/messenger/services/ShortcutService.java b/src/main/java/de/pixart/messenger/services/ShortcutService.java index c5d73d5b1..0578a8ce5 100644 --- a/src/main/java/de/pixart/messenger/services/ShortcutService.java +++ b/src/main/java/de/pixart/messenger/services/ShortcutService.java @@ -4,9 +4,11 @@ import android.annotation.TargetApi; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; +import android.graphics.Bitmap; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Build; +import android.support.annotation.NonNull; import android.util.Log; import java.util.ArrayList; @@ -74,11 +76,7 @@ public class ShortcutService { } List<ShortcutInfo> newDynamicShortCuts = new ArrayList<>(); for (Contact contact : contacts) { - ShortcutInfo shortcut = new ShortcutInfo.Builder(xmppConnectionService, getShortcutId(contact)) - .setShortLabel(contact.getDisplayName()) - .setIntent(getShortcutIntent(contact)) - .setIcon(Icon.createWithBitmap(xmppConnectionService.getAvatarService().getRoundedShortcut(contact))) - .build(); + ShortcutInfo shortcut = getShortcutInfo(contact); newDynamicShortCuts.add(shortcut); } if (shortcutManager.setDynamicShortcuts(newDynamicShortCuts)) { @@ -88,6 +86,15 @@ public class ShortcutService { } } + @TargetApi(Build.VERSION_CODES.N_MR1) + private ShortcutInfo getShortcutInfo(Contact contact) { + return new ShortcutInfo.Builder(xmppConnectionService, getShortcutId(contact)) + .setShortLabel(contact.getDisplayName()) + .setIntent(getShortcutIntent(contact)) + .setIcon(Icon.createWithBitmap(xmppConnectionService.getAvatarService().getRoundedShortcut(contact))) + .build(); + } + private static boolean contactsChanged(List<Contact> needles, List<ShortcutInfo> haystack) { for (Contact needle : needles) { if (!contactExists(needle, haystack)) { @@ -119,6 +126,31 @@ public class ShortcutService { return intent; } + @NonNull + public Intent createShortcut(Contact contact) { + Intent intent; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + ShortcutInfo shortcut = getShortcutInfo(contact); + ShortcutManager shortcutManager = xmppConnectionService.getSystemService(ShortcutManager.class); + intent = shortcutManager.createShortcutResultIntent(shortcut); + } else { + intent = createShortcutResultIntent(contact); + } + return intent; + } + + @NonNull + private Intent createShortcutResultIntent(Contact contact) { + Intent intent; + AvatarService avatarService = xmppConnectionService.getAvatarService(); + Bitmap icon = avatarService.getRoundedShortcutWithIcon(contact); + intent = new Intent(); + intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, contact.getDisplayName()); + intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon); + intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, getShortcutIntent(contact)); + return intent; + } + public static class FrequentContact { private final String account; private final Jid contact; diff --git a/src/main/java/de/pixart/messenger/ui/ShortcutActivity.java b/src/main/java/de/pixart/messenger/ui/ShortcutActivity.java new file mode 100644 index 000000000..52f87c5a3 --- /dev/null +++ b/src/main/java/de/pixart/messenger/ui/ShortcutActivity.java @@ -0,0 +1,68 @@ +package de.pixart.messenger.ui; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import java.util.Collections; + +import de.pixart.messenger.R; +import de.pixart.messenger.entities.Account; +import de.pixart.messenger.entities.Contact; +import de.pixart.messenger.entities.ListItem; + +public class ShortcutActivity extends AbstractSearchableListItemActivity { + + @Override + protected void refreshUiReal() { + + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getListView().setOnItemClickListener((parent, view, position, id) -> { + final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(getSearchEditText().getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY); + + ListItem listItem = getListItems().get(position); + Intent shortcut = xmppConnectionService.getShortcutService().createShortcut(((Contact) listItem)); + setResult(RESULT_OK, shortcut); + finish(); + }); + binding.fab.setVisibility(View.GONE); + } + + @Override + protected void onStart() { + super.onStart(); + ActionBar bar = getSupportActionBar(); + if (bar != null) { + bar.setTitle(R.string.create_shortcut); + } + } + + @Override + protected void filterContacts(String needle) { + getListItems().clear(); + if (xmppConnectionService == null) { + getListItemAdapter().notifyDataSetChanged(); + return; + } + for (final Account account : xmppConnectionService.getAccounts()) { + if (account.getStatus() != Account.State.DISABLED) { + for (final Contact contact : account.getRoster().getContacts()) { + if (contact.showInRoster() + && contact.match(this, needle)) { + getListItems().add(contact); + } + } + } + } + Collections.sort(getListItems()); + getListItemAdapter().notifyDataSetChanged(); + } +}
\ No newline at end of file |