Support different width ranges for different brushes.

fork-5.53.8
Alex Hart 2021-09-08 08:37:56 -03:00 zatwierdzone przez Greyson Parrelli
rodzic 38f6efbcae
commit f86c1fe508
4 zmienionych plików z 85 dodań i 17 usunięć

Wyświetl plik

@ -0,0 +1,42 @@
package org.thoughtcrime.securesms.keyvalue
internal class ImageEditorValues internal constructor(store: KeyValueStore) : SignalStoreValues(store) {
companion object {
private const val KEY_IMAGE_EDITOR_MARKER_WIDTH = "image.editor.marker.width"
private const val KEY_IMAGE_EDITOR_HIGHLIGHTER_WIDTH = "image.editor.highlighter.width"
private const val KEY_IMAGE_EDITOR_BLUR_WIDTH = "image.editor.blur.width"
}
public override fun onFirstEverAppLaunch() = Unit
public override fun getKeysToIncludeInBackup(): List<String> = listOf(
KEY_IMAGE_EDITOR_MARKER_WIDTH,
KEY_IMAGE_EDITOR_HIGHLIGHTER_WIDTH,
KEY_IMAGE_EDITOR_BLUR_WIDTH
)
fun setMarkerPercentage(markerPercentage: Int) {
putInteger(KEY_IMAGE_EDITOR_MARKER_WIDTH, markerPercentage)
}
fun setHighlighterPercentage(highlighterPercentage: Int) {
putInteger(KEY_IMAGE_EDITOR_HIGHLIGHTER_WIDTH, highlighterPercentage)
}
fun setBlurPercentage(blurPercentage: Int) {
putInteger(KEY_IMAGE_EDITOR_BLUR_WIDTH, blurPercentage)
}
fun getMarkerPercentage(): Int = getInteger(KEY_IMAGE_EDITOR_MARKER_WIDTH, 0)
fun getHighlighterPercentage(): Int = getInteger(KEY_IMAGE_EDITOR_HIGHLIGHTER_WIDTH, 0)
fun getBlurPercentage(): Int = getInteger(KEY_IMAGE_EDITOR_BLUR_WIDTH, 0)
fun getMarkerWidthRange(): Pair<Float, Float> = Pair(0.01f, 0.05f)
fun getHighlighterWidthRange(): Pair<Float, Float> = Pair(0.03f, 0.08f)
fun getBlurWidthRange(): Pair<Float, Float> = Pair(0.052f, 0.092f)
}

Wyświetl plik

@ -37,6 +37,7 @@ public final class SignalStore {
private final ProxyValues proxyValues;
private final RateLimitValues rateLimitValues;
private final ChatColorsValues chatColorsValues;
private final ImageEditorValues imageEditorValues;
private SignalStore() {
this.store = new KeyValueStore(ApplicationDependencies.getApplication());
@ -59,6 +60,7 @@ public final class SignalStore {
this.proxyValues = new ProxyValues(store);
this.rateLimitValues = new RateLimitValues(store);
this.chatColorsValues = new ChatColorsValues(store);
this.imageEditorValues = new ImageEditorValues(store);
}
public static void onFirstEverAppLaunch() {
@ -81,6 +83,7 @@ public final class SignalStore {
proxy().onFirstEverAppLaunch();
rateLimit().onFirstEverAppLaunch();
chatColorsValues().onFirstEverAppLaunch();
imageEditorValues().onFirstEverAppLaunch();
}
public static List<String> getKeysToIncludeInBackup() {
@ -104,6 +107,7 @@ public final class SignalStore {
keys.addAll(proxy().getKeysToIncludeInBackup());
keys.addAll(rateLimit().getKeysToIncludeInBackup());
keys.addAll(chatColorsValues().getKeysToIncludeInBackup());
keys.addAll(imageEditorValues().getKeysToIncludeInBackup());
return keys;
}
@ -192,6 +196,10 @@ public final class SignalStore {
return INSTANCE.chatColorsValues;
}
public static @NonNull ImageEditorValues imageEditorValues() {
return INSTANCE.imageEditorValues;
}
public static @NonNull GroupsV2AuthorizationSignalStoreCache groupsV2AuthorizationCache() {
return new GroupsV2AuthorizationSignalStoreCache(getStore());
}

Wyświetl plik

@ -43,6 +43,7 @@ import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.SelectableRenderer;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.thoughtcrime.securesms.imageeditor.renderers.BezierDrawingRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.FaceBlurRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.MultiLineTextRenderer;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@ -414,12 +415,12 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
case DRAW:
case HIGHLIGHT: {
onBrushWidthChange(imageEditorHud.getActiveBrushWidth());
onBrushWidthChange();
break;
}
case BLUR: {
onBrushWidthChange(imageEditorHud.getActiveBrushWidth());
onBrushWidthChange();
imageEditorHud.setBlurFacesToggleEnabled(imageEditorView.getModel().hasFaceRenderer());
break;
}
@ -479,15 +480,10 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
onColorChange(imageEditorHud.getActiveColor());
}
private static final float MINIMUM_DRAW_WIDTH = 0.01f;
private static final float MAXIMUM_DRAW_WIDTH = 0.05f;
@Override
public void onBrushWidthChange(int widthPercentage) {
public void onBrushWidthChange() {
ImageEditorHudV2.Mode mode = imageEditorHud.getMode();
float interpolatedWidth = MINIMUM_DRAW_WIDTH + (MAXIMUM_DRAW_WIDTH - MINIMUM_DRAW_WIDTH) * (widthPercentage / 100f);
imageEditorView.startDrawing(interpolatedWidth, mode == ImageEditorHudV2.Mode.HIGHLIGHT ? Paint.Cap.SQUARE : Paint.Cap.ROUND, mode == ImageEditorHudV2.Mode.BLUR);
imageEditorView.startDrawing(imageEditorHud.getActiveBrushWidth(), mode == ImageEditorHudV2.Mode.HIGHLIGHT ? Paint.Cap.SQUARE : Paint.Cap.ROUND, mode == ImageEditorHudV2.Mode.BLUR);
}
@Override
@ -828,7 +824,12 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
return;
}
setCurrentSelection(editorElement);
if (editorElement == null || editorElement.getRenderer() instanceof BezierDrawingRenderer) {
setCurrentSelection(null);
} else {
setCurrentSelection(editorElement);
}
if (imageEditorView.getMode() == ImageEditorView.Mode.MoveAndResize) {
imageEditorHud.setMode(ImageEditorHudV2.Mode.DELETE);
} else {

Wyświetl plik

@ -14,7 +14,6 @@ import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.SeekBar
import androidx.annotation.IntRange
import androidx.appcompat.widget.AppCompatSeekBar
import androidx.constraintlayout.widget.Guideline
import androidx.core.animation.doOnEnd
@ -23,6 +22,7 @@ import com.airbnb.lottie.SimpleColorFilter
import com.google.android.material.switchmaterial.SwitchMaterial
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.TooltipPopup
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.getColor
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.setColor
@ -171,7 +171,14 @@ class ImageEditorHudV2 @JvmOverloads constructor(
widthSeekBar.thumb = HSVColorSlider.createThumbDrawable(Color.WHITE)
widthSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
listener?.onBrushWidthChange(progress)
listener?.onBrushWidthChange()
when (currentMode) {
Mode.DRAW -> SignalStore.imageEditorValues().setMarkerPercentage(progress)
Mode.BLUR -> SignalStore.imageEditorValues().setBlurPercentage(progress)
Mode.HIGHLIGHT -> SignalStore.imageEditorValues().setHighlighterPercentage(progress)
else -> Unit
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit
@ -187,8 +194,6 @@ class ImageEditorHudV2 @JvmOverloads constructor(
v.onTouchEvent(event)
}
widthSeekBar.progress = 20
}
private fun animateWidthSeekbarIn() {
@ -233,8 +238,9 @@ class ImageEditorHudV2 @JvmOverloads constructor(
updateColorIndicator()
}
fun getActiveBrushWidth(): Int {
return widthSeekBar.progress
fun getActiveBrushWidth(): Float {
val (minimum, maximum) = DRAW_WIDTH_BOUNDARIES[currentMode] ?: throw IllegalStateException("Cannot get width in mode $currentMode")
return minimum + (maximum - minimum) * (widthSeekBar.progress / 100f)
}
fun setBlurFacesToggleEnabled(enabled: Boolean) {
@ -377,6 +383,7 @@ class ImageEditorHudV2 @JvmOverloads constructor(
private fun presentModeDraw() {
drawButton.isSelected = true
brushToggle.setImageResource(R.drawable.ic_draw_white_24)
widthSeekBar.progress = SignalStore.imageEditorValues().getMarkerPercentage()
listener?.onColorChange(getActiveColor())
updateColorIndicator()
animateModeChange(
@ -389,6 +396,7 @@ class ImageEditorHudV2 @JvmOverloads constructor(
private fun presentModeHighlight() {
drawButton.isSelected = true
brushToggle.setImageResource(R.drawable.ic_marker_24)
widthSeekBar.progress = SignalStore.imageEditorValues().getHighlighterPercentage()
listener?.onColorChange(getActiveColor())
updateColorIndicator()
animateModeChange(
@ -400,6 +408,9 @@ class ImageEditorHudV2 @JvmOverloads constructor(
private fun presentModeBlur() {
blurButton.isSelected = true
widthSeekBar.progress = SignalStore.imageEditorValues().getBlurPercentage()
listener?.onColorChange(getActiveColor())
updateColorIndicator()
animateModeChange(
inSet = drawButtonRow + blurTools,
outSet = allModeTools
@ -535,6 +546,12 @@ class ImageEditorHudV2 @JvmOverloads constructor(
private const val ANIMATION_DURATION = 250L
private val DRAW_WIDTH_BOUNDARIES: Map<Mode, Pair<Float, Float>> = mapOf(
Mode.DRAW to SignalStore.imageEditorValues().getMarkerWidthRange(),
Mode.HIGHLIGHT to SignalStore.imageEditorValues().getHighlighterWidthRange(),
Mode.BLUR to SignalStore.imageEditorValues().getBlurWidthRange()
)
private fun withHighlighterAlpha(color: Int): Int {
return color and 0xFF000000.toInt().inv() or 0x60000000
}
@ -543,7 +560,7 @@ class ImageEditorHudV2 @JvmOverloads constructor(
interface EventListener {
fun onModeStarted(mode: Mode, previousMode: Mode)
fun onColorChange(color: Int)
fun onBrushWidthChange(@IntRange(from = 0, to = 100) widthPercentage: Int)
fun onBrushWidthChange()
fun onBlurFacesToggled(enabled: Boolean)
fun onUndo()
fun onClearAll()