From fba83e57a7b67b20d59c63c96521aee521f9b3e4 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 28 Feb 2023 00:41:05 -0500 Subject: [PATCH] Easy import of stickers from signal --- .../android/DownloadDefaultStickers.java | 23 ++++++++- src/main/AndroidManifest.xml | 19 +++++++ .../conversations/ui/UriHandlerActivity.java | 51 +++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/cheogram/java/com/cheogram/android/DownloadDefaultStickers.java b/src/cheogram/java/com/cheogram/android/DownloadDefaultStickers.java index b593dc5380b2dd504dcf355df4710c755fa048aa..e230636a311d15fb08c8cff5231e2874bc42fc1d 100644 --- a/src/cheogram/java/com/cheogram/android/DownloadDefaultStickers.java +++ b/src/cheogram/java/com/cheogram/android/DownloadDefaultStickers.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.util.HashSet; import java.util.concurrent.atomic.AtomicBoolean; import org.json.JSONArray; @@ -55,6 +56,7 @@ public class DownloadDefaultStickers extends Service { private NotificationManager notificationManager; private File mStickerDir; private OkHttpClient http = new OkHttpClient(); + private HashSet pendingPacks = new HashSet(); @Override public void onCreate() { @@ -65,6 +67,9 @@ public class DownloadDefaultStickers extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { + synchronized(pendingPacks) { + pendingPacks.add(intent.getData() == null ? Uri.parse("https://stickers.cheogram.com/index.json") : intent.getData()); + } if (RUNNING.compareAndSet(false, true)) { new Thread(() -> { try { @@ -124,13 +129,22 @@ public class DownloadDefaultStickers extends Service { } private void download() throws Exception { + Uri jsonUri; + synchronized(pendingPacks) { + if (pendingPacks.iterator().hasNext()) { + jsonUri = pendingPacks.iterator().next(); + } else { + return; + } + } + NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getBaseContext(), "backup"); - mBuilder.setContentTitle("Downloading Default Stickers") + mBuilder.setContentTitle("Downloading Stickers") .setSmallIcon(R.drawable.ic_archive_white_24dp) .setProgress(1, 0, false); startForeground(NOTIFICATION_ID, mBuilder.build()); - Response r = http.newCall(new Request.Builder().url("https://stickers.cheogram.com/index.json").build()).execute(); + Response r = http.newCall(new Request.Builder().url(jsonUri.toString()).build()).execute(); JSONArray stickers = new JSONArray(r.body().string()); final Progress progress = new Progress(mBuilder, 1, 0); @@ -140,6 +154,11 @@ public class DownloadDefaultStickers extends Service { final int percentage = i * 100 / stickers.length(); notificationManager.notify(NOTIFICATION_ID, progress.build(percentage)); } + + synchronized(pendingPacks) { + pendingPacks.remove(jsonUri); + } + download(); } private File stickerDir() { diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 9f64fd245e06e721f74ba986c05cc046daab0014..0d6f508764b21f06a337e45a81e5b0b251f160e6 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -166,6 +166,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java b/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java index fc25079b2c5e93d9bdb33fca4912635fc1d73e2f..5e5dd5f9f8a1c0f1285388b80ab04c918b6bfc40 100644 --- a/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java @@ -18,6 +18,8 @@ import androidx.databinding.DataBindingUtil; import com.google.common.base.Strings; +import com.cheogram.android.DownloadDefaultStickers; + import org.jetbrains.annotations.NotNull; import java.io.IOException; @@ -52,6 +54,7 @@ public class UriHandlerActivity extends AppCompatActivity { private static final Pattern LINK_HEADER_PATTERN = Pattern.compile("<(.*?)>"); private ActivityUriHandlerBinding binding; private Call call; + private Uri stickers; public static void scan(final Activity activity) { scan(activity, false); @@ -109,6 +112,26 @@ public class UriHandlerActivity extends AppCompatActivity { handleIntent(intent); } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults.length > 0) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + downloadStickers(); + } + } + finish(); + } + + private void downloadStickers() { + Intent intent = new Intent(this, DownloadDefaultStickers.class); + intent.setData(stickers); + ContextCompat.startForegroundService(this, intent); + Toast.makeText(this, "Sticker download started", Toast.LENGTH_SHORT).show(); + finish(); + } + private boolean handleUri(final Uri uri) { return handleUri(uri, false); } @@ -118,6 +141,21 @@ public class UriHandlerActivity extends AppCompatActivity { final XmppUri xmppUri = new XmppUri(uri); final List accounts = DatabaseBackend.getInstance(this).getAccountJids(true); + if (uri.getScheme().equals("sgnl")) { + stickers = Uri.parse("https://stickers.cheogram.com/signal/" + uri.getQueryParameter("pack_id") + "," + uri.getQueryParameter("pack_key")); + if (hasStoragePermission(1)) downloadStickers(); + return false; + } + + if (uri.getScheme().equals("https") && uri.getHost().equals("signal.art")) { + android.net.UrlQuerySanitizer q = new android.net.UrlQuerySanitizer(); + q.setAllowUnregisteredParamaters(true); + q.parseQuery(uri.getFragment()); + stickers = Uri.parse("https://stickers.cheogram.com/signal/" + q.getValue("pack_id") + "," + q.getValue("pack_key")); + if (hasStoragePermission(1)) downloadStickers(); + return false; + } + if (SignupUtils.isSupportTokenRegistry() && xmppUri.isValidJid()) { final String preAuth = xmppUri.getParameter(XmppUri.PARAMETER_PRE_AUTH); final Jid jid = xmppUri.getJid(); @@ -329,4 +367,17 @@ public class UriHandlerActivity extends AppCompatActivity { final String trimmed = Strings.nullToEmpty(input).trim(); return trimmed.charAt(0) == '{' && trimmed.charAt(trimmed.length() - 1) == '}'; } + + protected boolean hasStoragePermission(int requestCode) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); + return false; + } else { + return true; + } + } else { + return true; + } + } }