package org.thoughtcrime.securesms.connect; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutManager; import android.graphics.Bitmap; import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; import androidx.core.graphics.drawable.IconCompat; import com.b44t.messenger.DcChat; import com.b44t.messenger.DcChatlist; import com.b44t.messenger.DcContext; import com.bumptech.glide.load.engine.DiskCacheStrategy; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; import org.thoughtcrime.securesms.ShareActivity; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.GlideRequest; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.DrawableUtil; import org.thoughtcrime.securesms.util.Util; /** * The Signal code has a similar class called ConversationUtil. * *
This class uses the Sharing Shortcuts API to publish dynamic launcher shortcuts (the ones that * appear when you long-press on an app) and direct-sharing-shortcuts. * *
It replaces the class DirectShareService, because DirectShareService used the
* ChooserTargetService API, which was replaced by the Sharing Shortcuts API.
*/
public class DirectShareUtil {
private static final String TAG = "DirectShareUtil";
private static final String SHORTCUT_CATEGORY = "android.shortcut.conversation";
public static void clearShortcut(@NonNull Context context, int chatId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Util.runOnAnyBackgroundThread(
() -> {
try {
ShortcutManagerCompat.removeDynamicShortcuts(
context, Collections.singletonList(Integer.toString(chatId)));
} catch (Exception e) {
Log.e(TAG, "Clearing shortcut failed", e);
}
});
}
}
public static void resetAllShortcuts(@NonNull Context context) {
Util.runOnBackground(
() -> {
try {
ShortcutManagerCompat.removeAllDynamicShortcuts(context);
triggerRefreshDirectShare(context);
} catch (Exception e) {
Log.e(TAG, "Resetting shortcuts failed", e);
}
});
}
public static void triggerRefreshDirectShare(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Util.runOnBackgroundDelayed(
() -> {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1
&& context.getSystemService(ShortcutManager.class).isRateLimitingActive()) {
return;
}
int maxShortcuts = ShortcutManagerCompat.getMaxShortcutCountPerActivity(context);
List