mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 18:00:02 +01:00
Restrict video send duration.
This commit is contained in:
@@ -14,12 +14,15 @@ import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
|
||||
public final class VideoUtil {
|
||||
|
||||
public static final int AUDIO_BIT_RATE = 192_000;
|
||||
public static final int VIDEO_FRAME_RATE = 30;
|
||||
public static final int VIDEO_BIT_RATE = 2_000_000;
|
||||
public static final int VIDEO_LONG_WIDTH = 1280;
|
||||
public static final int VIDEO_SHORT_WIDTH = 720;
|
||||
public static final int VIDEO_MAX_LENGTH_S = 30;
|
||||
public static final int AUDIO_BIT_RATE = 192_000;
|
||||
public static final int VIDEO_FRAME_RATE = 30;
|
||||
public static final int VIDEO_BIT_RATE = 2_000_000;
|
||||
|
||||
static final int VIDEO_SHORT_WIDTH = 720;
|
||||
|
||||
private static final int VIDEO_LONG_WIDTH = 1280;
|
||||
private static final int VIDEO_MAX_RECORD_LENGTH_S = 30;
|
||||
private static final int VIDEO_MAX_UPLOAD_LENGTH_S = 120;
|
||||
|
||||
private static final int TOTAL_BYTES_PER_SECOND = (VIDEO_BIT_RATE / 8) + (AUDIO_BIT_RATE / 8);
|
||||
|
||||
@@ -38,11 +41,15 @@ public final class VideoUtil {
|
||||
: new Size(VIDEO_LONG_WIDTH, VIDEO_SHORT_WIDTH);
|
||||
}
|
||||
|
||||
public static int getMaxVideoDurationInSeconds(@NonNull Context context, @NonNull MediaConstraints mediaConstraints) {
|
||||
public static int getMaxVideoRecordDurationInSeconds(@NonNull Context context, @NonNull MediaConstraints mediaConstraints) {
|
||||
int allowedSize = mediaConstraints.getCompressedVideoMaxSize(context);
|
||||
int duration = (int) Math.floor((float) allowedSize / TOTAL_BYTES_PER_SECOND);
|
||||
|
||||
return Math.min(duration, VIDEO_MAX_LENGTH_S);
|
||||
return Math.min(duration, VIDEO_MAX_RECORD_LENGTH_S);
|
||||
}
|
||||
|
||||
public static int getMaxVideoUploadDurationInSeconds() {
|
||||
return VIDEO_MAX_UPLOAD_LENGTH_S;
|
||||
}
|
||||
|
||||
@RequiresApi(21)
|
||||
|
||||
@@ -11,12 +11,14 @@ import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.Px;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.logging.Log;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -24,6 +26,8 @@ import java.util.concurrent.TimeUnit;
|
||||
@RequiresApi(api = 23)
|
||||
public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView {
|
||||
|
||||
private static final String TAG = Log.tag(VideoThumbnailsRangeSelectorView.class);
|
||||
|
||||
private static final long MINIMUM_SELECTABLE_RANGE = TimeUnit.MILLISECONDS.toMicros(500);
|
||||
private static final int ANIMATION_DURATION_MS = 100;
|
||||
|
||||
@@ -63,6 +67,7 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
|
||||
@ColorInt private int thumbHintBackgroundColor;
|
||||
private long dragStartTimeMs;
|
||||
private long dragEndTimeMs;
|
||||
private long maximumSelectableRangeMicros;
|
||||
|
||||
public VideoThumbnailsRangeSelectorView(final Context context) {
|
||||
super(context);
|
||||
@@ -137,6 +142,13 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
|
||||
}
|
||||
}
|
||||
|
||||
if (setMinValue(getMinValue())) {
|
||||
Log.d(TAG, "Clamped video duration to " + getMaxValue());
|
||||
if (onRangeChangeListener != null) {
|
||||
onRangeChangeListener.onRangeDragEnd(getMinValue(), getMaxValue(), getDuration(), Thumb.MAX);
|
||||
}
|
||||
}
|
||||
|
||||
invalidate();
|
||||
}
|
||||
|
||||
@@ -310,11 +322,18 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
|
||||
final long duration = getDuration();
|
||||
|
||||
final long minDiff = Math.max(MINIMUM_SELECTABLE_RANGE, pixelToDuration(thumbSizePixels * 2.5f));
|
||||
final long maxDiff = maximumSelectableRangeMicros <= MINIMUM_SELECTABLE_RANGE ? 0 : Math.max(maximumSelectableRangeMicros, pixelToDuration(thumbSizePixels * 2.5f));
|
||||
|
||||
if (thumb == Thumb.MIN) {
|
||||
newMin = clamp(newMin, 0, currentMax - minDiff);
|
||||
if (maxDiff > 0) {
|
||||
newMax = clamp(newMax, newMin + minDiff, Math.min(newMin + maxDiff, duration));
|
||||
}
|
||||
} else {
|
||||
newMax = clamp(newMax, currentMin + minDiff, duration);
|
||||
if (maxDiff > 0) {
|
||||
newMin = clamp(newMin, Math.max(0, newMax - maxDiff), newMax - minDiff);
|
||||
}
|
||||
}
|
||||
|
||||
if (newMin != currentMin || newMax != currentMax) {
|
||||
@@ -425,6 +444,10 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
|
||||
}
|
||||
}
|
||||
|
||||
public void setTimeLimit(int t, @NonNull TimeUnit timeUnit) {
|
||||
maximumSelectableRangeMicros = timeUnit.toMicros(t);
|
||||
}
|
||||
|
||||
public enum Thumb {
|
||||
MIN,
|
||||
MAX,
|
||||
|
||||
Reference in New Issue
Block a user