From 7dbe06d4789db6184f21f16fb07240cffc18a250 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 25 Apr 2023 22:03:04 -0500 Subject: [PATCH] Allow adding WebXDC app to homescreen --- .../java/com/cheogram/android/WebxdcPage.java | 28 +++++++++++++++++-- src/cheogram/res/layout/webxdc_page.xml | 2 +- .../ui/ConversationFragment.java | 11 ++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/cheogram/java/com/cheogram/android/WebxdcPage.java b/src/cheogram/java/com/cheogram/android/WebxdcPage.java index ca66fc9e4353f4ff39f9ec27aa672a80fc0f9d8f..37b61319f7f2da55eb66c42c18ef7f319d8b7acb 100644 --- a/src/cheogram/java/com/cheogram/android/WebxdcPage.java +++ b/src/cheogram/java/com/cheogram/android/WebxdcPage.java @@ -5,7 +5,9 @@ package com.cheogram.android; import android.content.Context; import android.content.Intent; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.graphics.ImageDecoder; import android.graphics.Rect; import android.net.Uri; @@ -27,6 +29,9 @@ import android.widget.TextView; import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; +import androidx.core.content.pm.ShortcutInfoCompat; +import androidx.core.content.pm.ShortcutManagerCompat; +import androidx.core.graphics.drawable.IconCompat; import androidx.databinding.DataBindingUtil; import com.google.common.io.ByteStreams; @@ -57,6 +62,7 @@ import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.services.XmppConnectionService; +import eu.siacs.conversations.ui.ConversationsActivity; import eu.siacs.conversations.utils.Consumer; import eu.siacs.conversations.utils.MimeUtils; import eu.siacs.conversations.utils.UIHelper; @@ -268,7 +274,7 @@ public class WebxdcPage implements ConversationPage { binding.webview.loadUrl(baseUrl + "/index.html"); - binding.actions.setAdapter(new ArrayAdapter(context, R.layout.simple_list_item, new String[]{"Close"}) { + binding.actions.setAdapter(new ArrayAdapter(context, R.layout.simple_list_item, new String[]{"Add to Home Screen", "Close"}) { @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); @@ -280,7 +286,25 @@ public class WebxdcPage implements ConversationPage { } }); binding.actions.setOnItemClickListener((parent, v, pos, id) -> { - remover.accept(WebxdcPage.this); + if (pos == 0) { + Intent intent = new Intent(xmppConnectionService, ConversationsActivity.class); + intent.setAction(ConversationsActivity.ACTION_VIEW_CONVERSATION); + intent.putExtra(ConversationsActivity.EXTRA_CONVERSATION, ((Conversation) source.getConversation()).getUuid()); + intent.putExtra(ConversationsActivity.EXTRA_POST_INIT_ACTION, "webxdc"); + intent.putExtra(ConversationsActivity.EXTRA_DOWNLOAD_UUID, source.getUuid()); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); + + ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(xmppConnectionService, "webxdc:" + source.getUuid()) + .setShortLabel(getTitle()) + .setIntent(intent); + Drawable icon = getIcon(); + if (icon != null && icon instanceof BitmapDrawable) { + builder = builder.setIcon(IconCompat.createFromIcon(Icon.createWithBitmap(((BitmapDrawable) icon).getBitmap()))); + } + ShortcutManagerCompat.requestPinShortcut(xmppConnectionService, builder.build(), null); + } else { + remover.accept(WebxdcPage.this); + } }); return getView(); diff --git a/src/cheogram/res/layout/webxdc_page.xml b/src/cheogram/res/layout/webxdc_page.xml index 87def9cef099eda1a99711c4d448a8dd5f1c1507..7e4b744046ea3802cf5a962545eba4722c74a570 100644 --- a/src/cheogram/res/layout/webxdc_page.xml +++ b/src/cheogram/res/layout/webxdc_page.xml @@ -22,7 +22,7 @@ android:layout_alignParentBottom="true" android:horizontalSpacing="0dp" android:verticalSpacing="0dp" - android:numColumns="1" /> + android:numColumns="2" /> diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 478d7d07cb96a806a630878da5abf6e3f740cb55..fd2c8a96fbd481791515a22c7dbb4c5bf8833901 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -72,6 +72,7 @@ import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import com.cheogram.android.BobTransfer; +import com.cheogram.android.WebxdcPage; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; @@ -3034,6 +3035,16 @@ public class ConversationFragment extends XmppFragment } final Message message = downloadUuid == null ? null : conversation.findMessageWithFileAndUuid(downloadUuid); + if ("webxdc".equals(postInitAction)) { + if (message == null) return; + + Cid webxdcCid = message.getFileParams().getCids().get(0); + WebxdcPage webxdc = new WebxdcPage(webxdcCid, message, activity.xmppConnectionService); + Conversation conversation = (Conversation) message.getConversation(); + if (!conversation.switchToSession("webxdc\0" + message.getUuid())) { + conversation.startWebxdc(webxdc); + } + } if (message != null) { startDownloadable(message); }