commit b14eca5853be01b630f908feddc936b3c8da37d0
Author: JabJab <noreply@xmpp.tel>
Date: Sat Aug 1 20:19:41 2026 +0300
Fix crash-report fallback and 'about' version issue
---
build.gradle | 2 +-
conversations.doap | 2 +-
.../tel/xmpp/jabjab/ui/WebStickerPackActivity.java | 26 ++++++++++++++++++----
.../tel/xmpp/jabjab/utils/ExceptionHandler.java | 1 +
.../tel/xmpp/jabjab/utils/ExceptionHelper.java | 23 ++++++++++++++++---
.../java/tel/xmpp/jabjab/xmpp/XmppConnection.java | 3 +++
src/main/res/values/strings.xml | 6 +++++
7 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/build.gradle b/build.gradle
index d8125f6..b897948 100644
--- a/build.gradle
+++ b/build.gradle
@@ -113,7 +113,7 @@ android {
defaultConfig {
minSdkVersion 23
- versionCode 42304
+ versionCode 42305
versionName "1.0.5"
applicationId "tel.xmpp.jabjab"
resValue "string", "applicationId", applicationId
diff --git a/conversations.doap b/conversations.doap
index b3bc0f3..ed082d0 100644
--- a/conversations.doap
+++ b/conversations.doap
@@ -589,7 +589,7 @@
<release>
<Version>
- <revision>2.17.10</revision>
+ <revision>2.20.1</revision>
<created>2025-02-04</created>
<file-release rdf:resource="https://codeberg.org/iNPUTmice/Conversations/archive/2.17.10.tar.gz"/>
</Version>
diff --git a/src/main/java/tel/xmpp/jabjab/ui/WebStickerPackActivity.java b/src/main/java/tel/xmpp/jabjab/ui/WebStickerPackActivity.java
index caecf25..88f8a0a 100644
--- a/src/main/java/tel/xmpp/jabjab/ui/WebStickerPackActivity.java
+++ b/src/main/java/tel/xmpp/jabjab/ui/WebStickerPackActivity.java
@@ -275,11 +275,19 @@ public class WebStickerPackActivity extends XmppActivity {
executor.execute(() -> {
try {
final String packName = resolvedPackName != null ? resolvedPackName : "Web Pack";
- Log.d(Config.LOGTAG, "WebStickerPack: installing pack=" + packName + " stickers=" + stickers.size());
- final StickerStore.Pack pack = StickerStore.createPack(this, packName);
- if (resolvedSlug != null) {
+ // Re-installing a pack the user already has (matched by source_slug) should
+ // sync new stickers into the existing pack rather than creating a duplicate —
+ // importStickerIfNew() below already skips exact duplicates via SHA-256 hash.
+ final StickerStore.Pack existing =
+ resolvedSlug != null ? StickerStore.packForSlug(this, resolvedSlug) : null;
+ final boolean updating = existing != null;
+ final StickerStore.Pack pack = updating ? existing : StickerStore.createPack(this, packName);
+ Log.d(Config.LOGTAG, "WebStickerPack: " + (updating ? "updating" : "installing")
+ + " pack=" + packName + " stickers=" + stickers.size());
+ if (!updating && resolvedSlug != null) {
StickerStore.setPackSourceSlug(pack, resolvedSlug);
}
+ int added = 0;
for (int i = 0; i < stickers.size(); i++) {
final StickerItem item = stickers.get(i);
Log.d(Config.LOGTAG, "WebStickerPack: downloading " + (i+1) + "/" + stickers.size() + " url=" + item.url());
@@ -295,6 +303,7 @@ public class WebStickerPackActivity extends XmppActivity {
final java.io.File f =
StickerStore.importStickerIfNew(pack, filename, is);
if (f != null) {
+ added++;
StickerStore.setStickerUrl(pack, f, item.url());
if (!item.emoji().isEmpty()) {
StickerStore.setStickerEmoji(pack, f, item.emoji());
@@ -322,8 +331,17 @@ public class WebStickerPackActivity extends XmppActivity {
} else {
Log.w(Config.LOGTAG, "WebStickerPack: xmppConnectionService null — skipping PubSub publish");
}
+ final int addedCount = added;
runOnUiThread(() -> {
- Toast.makeText(this, R.string.sticker_pack_installed, Toast.LENGTH_SHORT).show();
+ if (updating) {
+ final String message = addedCount > 0
+ ? getResources().getQuantityString(
+ R.plurals.sticker_pack_updated, addedCount, addedCount)
+ : getString(R.string.sticker_pack_up_to_date);
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(this, R.string.sticker_pack_installed, Toast.LENGTH_SHORT).show();
+ }
finish();
});
} catch (final Exception e) {
diff --git a/src/main/java/tel/xmpp/jabjab/utils/ExceptionHandler.java b/src/main/java/tel/xmpp/jabjab/utils/ExceptionHandler.java
index 887abcf..c5797f6 100644
--- a/src/main/java/tel/xmpp/jabjab/utils/ExceptionHandler.java
+++ b/src/main/java/tel/xmpp/jabjab/utils/ExceptionHandler.java
@@ -49,6 +49,7 @@ public class ExceptionHandler implements UncaughtExceptionHandler {
ImmutableList.of(
String.format(
"Version: %s %s", BuildConfig.APP_NAME, BuildConfig.VERSION_NAME),
+ String.format("Build: %s", BuildConfig.VERSION_CODE),
String.format("Manufacturer: %s", Strings.nullToEmpty(Build.MANUFACTURER)),
String.format("Device: %s", Strings.nullToEmpty(Build.DEVICE)),
String.format("Timestamp: %s", DATE_FORMAT.format(new Date())),
diff --git a/src/main/java/tel/xmpp/jabjab/utils/ExceptionHelper.java b/src/main/java/tel/xmpp/jabjab/utils/ExceptionHelper.java
index 31f7e25..d57427b 100644
--- a/src/main/java/tel/xmpp/jabjab/utils/ExceptionHelper.java
+++ b/src/main/java/tel/xmpp/jabjab/utils/ExceptionHelper.java
@@ -65,9 +65,19 @@ public class ExceptionHelper {
Log.d(Config.LOGTAG, "deleted crash report file");
}
- // Pick the pre-saved account, fall back to first enabled
+ // Pick the pre-saved account. If it's gone (deleted/disabled since last time), don't just
+ // fall back to whatever happens to be first in the account list — that JID may be on a
+ // server with no S2S route to Config.BUG_REPORTS's domain, silently blackholing the
+ // report. Prefer an account already on that domain (delivery needs no S2S hop at all).
final String savedJid = appSettings.getCrashReportAccount();
- final int[] selectedIndex = {0};
+ int fallbackIndex = -1;
+ for (int i = 0; i < enabled.size(); i++) {
+ if (Config.BUG_REPORTS.getDomain().equals(enabled.get(i).getJid().getDomain())) {
+ fallbackIndex = i;
+ break;
+ }
+ }
+ final int[] selectedIndex = {fallbackIndex >= 0 ? fallbackIndex : 0};
if (savedJid != null) {
for (int i = 0; i < enabled.size(); i++) {
if (enabled.get(i).getJid().asBareJid().toString().equals(savedJid)) {
@@ -80,8 +90,15 @@ public class ExceptionHelper {
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity);
builder.setTitle(
activity.getString(R.string.crash_report_title, activity.getString(R.string.app_name)));
+ // Always name the account it'll actually be sent from — even with only one enabled
+ // account (no chooser list shown below) — so a stale/unexpected account never sends
+ // silently without the user having a chance to notice and back out.
builder.setMessage(
- activity.getString(R.string.crash_report_message, activity.getString(R.string.app_name)));
+ activity.getString(R.string.crash_report_message, activity.getString(R.string.app_name))
+ + "\n\n"
+ + activity.getString(
+ R.string.crash_report_account,
+ enabled.get(selectedIndex[0]).getJid().asBareJid().toString()));
// Show account chooser only when there is more than one option
if (enabled.size() > 1) {
diff --git a/src/main/java/tel/xmpp/jabjab/xmpp/XmppConnection.java b/src/main/java/tel/xmpp/jabjab/xmpp/XmppConnection.java
index bd3bd40..e514e54 100644
--- a/src/main/java/tel/xmpp/jabjab/xmpp/XmppConnection.java
+++ b/src/main/java/tel/xmpp/jabjab/xmpp/XmppConnection.java
@@ -2468,6 +2468,9 @@ public class XmppConnection implements Runnable {
if (stanza instanceof im.conversations.android.xmpp.model.stanza.Message packet) {
final String id = packet.getId();
final Jid to = packet.getTo();
+ if (to == null) {
+ continue;
+ }
mXmppConnectionService.markMessage(
account, to.asBareJid(), id, Message.STATUS_SEND_FAILED, error);
}
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 1af955c..18479b6 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -119,6 +119,11 @@
<string name="tap_to_open_sticker_pack">Tap to open sticker pack</string>
<string name="install_sticker_pack_from_peer">Install sender\'s sticker pack</string>
<string name="sticker_pack_installed">Sticker pack installed</string>
+ <string name="sticker_pack_up_to_date">Sticker pack already up to date</string>
+ <plurals name="sticker_pack_updated">
+ <item quantity="one">Added %d new sticker</item>
+ <item quantity="other">Added %d new stickers</item>
+ </plurals>
<string name="sticker_pack_fetch_failed">Failed to install sticker pack</string>
<string name="fetching_sticker_pack">Downloading sticker pack…</string>
<string name="import_sticker_pack">Import sticker pack</string>
@@ -129,6 +134,7 @@
<string name="ok">OK</string>
<string name="crash_report_title">%1$s has crashed</string>
<string name="crash_report_message">Using your XMPP account to send in stack traces helps the ongoing development of %1$s.</string>
+ <string name="crash_report_account">Sending from: %1$s</string>
<string name="send_now">Send now</string>
<string name="send_never">Never ask again</string>
<string name="problem_connecting_to_account">Could not connect to account</string>
Built with passion for open-source software, XMPP, privacy, and security —
the belief that people deserve communication tools that serve them, not surveil them.
Dedicated to every brave man and woman who stands up against tyranny and oppression across the world.
And in memory of those who were silenced before they could speak freely.