mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 00:59:49 +01:00
Add ability to configure locale specific media quality settings.
Part 1 of improve media quality controls. User selection coming soon.
This commit is contained in:
@@ -5,6 +5,7 @@ import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.IntRange;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.signal.core.util.logging.Log;
|
||||
@@ -43,6 +44,10 @@ public abstract class MediaConstraints {
|
||||
public abstract int getGifMaxSize(Context context);
|
||||
public abstract int getVideoMaxSize(Context context);
|
||||
|
||||
public @IntRange(from = 0, to = 100) int getImageCompressionQualitySetting(@NonNull Context context) {
|
||||
return 70;
|
||||
}
|
||||
|
||||
public int getUncompressedVideoMaxSize(Context context) {
|
||||
return getVideoMaxSize(context);
|
||||
}
|
||||
|
||||
@@ -2,21 +2,30 @@ package org.thoughtcrime.securesms.mms;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.IntRange;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.util.LocaleFeatureFlags;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class PushMediaConstraints extends MediaConstraints {
|
||||
|
||||
private static final int MAX_IMAGE_DIMEN_LOWMEM = 768;
|
||||
private static final int MAX_IMAGE_DIMEN = 1600;
|
||||
private static final int KB = 1024;
|
||||
private static final int MB = 1024 * KB;
|
||||
|
||||
private static final int[] FALLBACKS = { MAX_IMAGE_DIMEN, 1024, 768, 512 };
|
||||
private static final int[] FALLBACKS_LOWMEM = { MAX_IMAGE_DIMEN_LOWMEM, 512 };
|
||||
private final MediaConfig currentConfig;
|
||||
|
||||
public PushMediaConstraints() {
|
||||
currentConfig = getCurrentConfig(ApplicationDependencies.getApplication());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getImageMaxWidth(Context context) {
|
||||
return Util.isLowMemory(context) ? MAX_IMAGE_DIMEN_LOWMEM : MAX_IMAGE_DIMEN;
|
||||
return currentConfig.imageSizeTargets[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -26,13 +35,12 @@ public class PushMediaConstraints extends MediaConstraints {
|
||||
|
||||
@Override
|
||||
public int getImageMaxSize(Context context) {
|
||||
//noinspection PointlessArithmeticExpression
|
||||
return 1 * MB;
|
||||
return currentConfig.maxImageFileSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getImageDimensionTargets(Context context) {
|
||||
return Util.isLowMemory(context) ? FALLBACKS_LOWMEM : FALLBACKS;
|
||||
return currentConfig.imageSizeTargets;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,4 +74,57 @@ public class PushMediaConstraints extends MediaConstraints {
|
||||
public int getDocumentMaxSize(Context context) {
|
||||
return 100 * MB;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getImageCompressionQualitySetting(@NonNull Context context) {
|
||||
return currentConfig.qualitySetting;
|
||||
}
|
||||
|
||||
private static @NonNull MediaConfig getCurrentConfig(@NonNull Context context) {
|
||||
if (Util.isLowMemory(context)) {
|
||||
return MediaConfig.LEVEL_1_LOW_MEMORY;
|
||||
}
|
||||
|
||||
return LocaleFeatureFlags.getMediaQualityLevel().orElse(MediaConfig.getDefault(context));
|
||||
}
|
||||
|
||||
public enum MediaConfig {
|
||||
LEVEL_1_LOW_MEMORY(true, 1, MB, new int[] { 768, 512 }, 70),
|
||||
|
||||
LEVEL_1(false, 1, MB, new int[] { 1600, 1024, 768, 512 }, 70),
|
||||
LEVEL_2(false, 2, (int) (1.5 * MB), new int[] { 2048, 1600, 1024, 768, 512 }, 75),
|
||||
LEVEL_3(false, 3, (int) (2.5 * MB), new int[] { 3072, 2048, 1600, 1024, 768, 512 }, 80);
|
||||
|
||||
private final boolean isLowMemory;
|
||||
private final int level;
|
||||
private final int maxImageFileSize;
|
||||
private final int[] imageSizeTargets;
|
||||
private final int qualitySetting;
|
||||
|
||||
MediaConfig(boolean isLowMemory,
|
||||
int level,
|
||||
int maxImageFileSize,
|
||||
@NonNull int[] imageSizeTargets,
|
||||
@IntRange(from = 0, to = 100) int qualitySetting)
|
||||
{
|
||||
this.isLowMemory = isLowMemory;
|
||||
this.level = level;
|
||||
this.maxImageFileSize = maxImageFileSize;
|
||||
this.imageSizeTargets = imageSizeTargets;
|
||||
this.qualitySetting = qualitySetting;
|
||||
}
|
||||
|
||||
public static @Nullable MediaConfig forLevel(int level) {
|
||||
boolean isLowMemory = Util.isLowMemory(ApplicationDependencies.getApplication());
|
||||
|
||||
return Arrays.stream(values())
|
||||
.filter(v -> v.level == level && v.isLowMemory == isLowMemory)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public static @NonNull MediaConfig getDefault(Context context) {
|
||||
return Util.isLowMemory(context) ? LEVEL_1_LOW_MEMORY : LEVEL_1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user