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:
Cody Henthorne
2021-05-03 11:44:20 -04:00
parent 85e0e74bc6
commit 2aad00df85
9 changed files with 195 additions and 106 deletions

View File

@@ -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);
}

View File

@@ -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;
}
}
}