aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-04-23 21:13:12 +0200
committerChristian Schneppe <christian@pix-art.de>2018-04-23 21:13:12 +0200
commit80064f6040cab219702d8221a052eace5f47661c (patch)
tree67c0676deebe0a6f899989eac3a96db5f4f2a167
parent44cf4a0ecbfef6303872316d20e4b18444f6932f (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
-rw-r--r--src/main/AndroidManifest.xml10
-rw-r--r--src/main/java/de/pixart/messenger/services/AvatarService.java35
-rw-r--r--src/main/java/de/pixart/messenger/services/ShortcutService.java42
-rw-r--r--src/main/java/de/pixart/messenger/ui/ShortcutActivity.java68
-rw-r--r--src/main/res/values/strings.xml1
5 files changed, 148 insertions, 8 deletions
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 28e47675b..c28dbbafe 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -131,6 +131,9 @@
android:label="@string/title_activity_start_conversation"
android:configChanges="orientation|screenSize"
android:launchMode="singleTop">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ </intent-filter>
</activity>
<activity
android:name=".ui.WelcomeActivity"
@@ -261,6 +264,13 @@
android:launchMode="singleTask"
android:theme="@style/ConversationsTheme">
</activity>
+ <activity
+ android:name=".ui.ShortcutActivity"
+ android:label="@string/contact">
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_SHORTCUT" />
+ </intent-filter>
+ </activity>
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
<activity android:name=".ui.MemorizingActivity" />
<service android:name=".services.ExportLogsService" />
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
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index bf6647b6e..9b5ebaee2 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -780,4 +780,5 @@
<string name="small">Small</string>
<string name="medium">Medium</string>
<string name="large">Large</string>
+ <string name="create_shortcut">Create Shortcut</string>
</resources>