diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d44b5e82..a2384b14b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased * Allow to clone email chats - +* improve image quality when setting group avatars ## v2.10.0 2025-08 diff --git a/jni/Android.mk b/jni/Android.mk index 65a4d0ad9..286ed6c3d 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -31,5 +31,6 @@ LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS LOCAL_SRC_FILES := dc_wrapper.c +LOCAL_LDFLAGS += -Wl,--build-id=none include $(BUILD_SHARED_LIBRARY) diff --git a/scripts/ndk-make.sh b/scripts/ndk-make.sh index 7812b0fea..c2fffe1e6 100755 --- a/scripts/ndk-make.sh +++ b/scripts/ndk-make.sh @@ -50,6 +50,14 @@ if test -z "$ANDROID_NDK_ROOT"; then exit 1 fi +# for reproducible build: +export RUSTFLAGS="-C link-args=-Wl,--build-id=none --remap-path-prefix=$HOME/.cargo= --remap-path-prefix=$(realpath $(dirname $(dirname "$0")))=" +export SOURCE_DATE_EPOCH=1 +# always use the same path to NDK: +rm -f /tmp/android-ndk-root +ln -s "$ANDROID_NDK_ROOT" /tmp/android-ndk-root +ANDROID_NDK_ROOT=/tmp/android-ndk-root + echo Setting CARGO_TARGET environment variables. if test -z "$NDK_HOST_TAG"; then @@ -66,11 +74,9 @@ if test -z "$NDK_HOST_TAG"; then fi if test -z "$CARGO_TARGET_DIR"; then - CARGO_TARGET_DIR=target + export CARGO_TARGET_DIR=/tmp/deltachat-build fi -unset RUSTFLAGS - TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG" export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang" export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android21-clang" @@ -154,8 +160,6 @@ if test -z $1 || test $1 = x86_64; then cp "$CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a" "$jnidir/x86_64" fi -rm -fr "$TMPLIB" - echo -- ndk-build -- cd ../.. diff --git a/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java b/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java index 18c6b7e83..5f5fbca4d 100644 --- a/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java @@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.mms.AttachmentManager; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.profiles.AvatarHelper; -import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints; import org.thoughtcrime.securesms.scribbles.ScribbleActivity; import org.thoughtcrime.securesms.util.Prefs; import org.thoughtcrime.securesms.util.ViewUtil; @@ -144,14 +143,13 @@ public class CreateProfileActivity extends BaseActionBarActivity { } private void setAvatarView(Uri output) { - final ProfileMediaConstraints constraints = new ProfileMediaConstraints(); GlideApp.with(this) .asBitmap() .load(output) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .centerCrop() - .override(constraints.getImageMaxWidth(this), constraints.getImageMaxHeight(this)) + .override(AvatarHelper.AVATAR_SIZE, AvatarHelper.AVATAR_SIZE) .into(new SimpleTarget() { @Override public void onResourceReady(@NonNull Bitmap resource, Transition transition) { diff --git a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java index b0a8ff03c..58d041ca8 100644 --- a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -54,7 +54,6 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity public static final String CLONE_CHAT_EXTRA = "clone_chat"; private static final int PICK_CONTACT = 1; - public static final int AVATAR_SIZE = 210; private static final int REQUEST_CODE_AVATAR = 2759; private DcContext dcContext; @@ -376,7 +375,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .centerCrop() - .override(AVATAR_SIZE, AVATAR_SIZE) + .override(AvatarHelper.AVATAR_SIZE, AvatarHelper.AVATAR_SIZE) .into(new CustomTarget() { @Override public void onResourceReady(@NonNull Bitmap resource, Transition transition) { diff --git a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java index bc264b516..bdc6b96fc 100644 --- a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java @@ -49,7 +49,6 @@ import org.thoughtcrime.securesms.mms.AttachmentManager; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.profiles.AvatarHelper; -import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints; import org.thoughtcrime.securesms.proxy.ProxySettingsActivity; import org.thoughtcrime.securesms.qr.RegistrationQrActivity; import org.thoughtcrime.securesms.scribbles.ScribbleActivity; @@ -284,14 +283,13 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements } private void setAvatarView(Uri output) { - final ProfileMediaConstraints constraints = new ProfileMediaConstraints(); GlideApp.with(this) .asBitmap() .load(output) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .centerCrop() - .override(constraints.getImageMaxWidth(this), constraints.getImageMaxHeight(this)) + .override(AvatarHelper.AVATAR_SIZE, AvatarHelper.AVATAR_SIZE) .into(new CustomTarget() { @Override public void onResourceReady(@NonNull Bitmap resource, Transition transition) { diff --git a/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java b/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java index 2ebe7afa7..bf98af3d4 100644 --- a/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java +++ b/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java @@ -20,6 +20,8 @@ import java.io.FileOutputStream; import java.io.IOException; public class AvatarHelper { + /* the maximum width/height an avatar should have */ + public static final int AVATAR_SIZE = 640; public static void setGroupAvatar(Context context, int chatId, Bitmap bitmap) { DcContext dcContext = DcHelper.getContext(context); @@ -30,7 +32,7 @@ public class AvatarHelper { try { File avatar = File.createTempFile("groupavatar", ".jpg", context.getCacheDir()); FileOutputStream out = new FileOutputStream(avatar); - bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.close(); dcContext.setChatProfileImage(chatId, avatar.getPath()); // The avatar is copied to the blobs directory here... //noinspection ResultOfMethodCallIgnored diff --git a/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java b/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java deleted file mode 100644 index 72da12bcf..000000000 --- a/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.thoughtcrime.securesms.profiles; - - -import android.content.Context; - -import org.thoughtcrime.securesms.mms.MediaConstraints; - -public class ProfileMediaConstraints extends MediaConstraints { - @Override - public int getImageMaxWidth(Context context) { - return 640; - } - - @Override - public int getImageMaxHeight(Context context) { - return 640; - } - - @Override - public int getImageMaxSize(Context context) { - return 5 * 1024 * 1024; - } -}