From 9bc9c510b332c32f822c448c03334e2cc404f6d0 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 4 Sep 2026 13:46:04 -0300 Subject: [PATCH] Update theme guide color. --- .../screens/edit/image/ImageEditor.kt | 4 ++++ .../imageeditor/core/RendererContext.java | 20 +++++++++++++++++++ .../core/renderers/CropAreaRenderer.java | 2 +- .../core/renderers/OvalGuideRenderer.java | 2 +- .../renderers/SelectedElementGuideRenderer.kt | 3 +++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/image/ImageEditor.kt b/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/image/ImageEditor.kt index 8fad8a9b2e..e0944341f2 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/image/ImageEditor.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/screens/edit/image/ImageEditor.kt @@ -66,6 +66,9 @@ internal fun ImageEditor( // Masks everything outside the image, so it has to match the surface the editor is drawn on to read as a background. val blackoutColor = MaterialTheme.colorScheme.surface.toArgb() + // Crop thumbs and selection guides are light-on-dark by default, which disappears against a light surface. + val decorationColor = MaterialTheme.colorScheme.onSurface.toArgb() + DisposableEffect(state) { state.attach() onDispose { state.detach() } @@ -96,6 +99,7 @@ internal fun ImageEditor( val nativeCanvas = drawContext.canvas.nativeCanvas val rendererContext = state.getOrCreateRendererContext(context, nativeCanvas) rendererContext.setBlackoutColor(blackoutColor) + rendererContext.setDecorationColor(decorationColor) rendererContext.save() try { rendererContext.canvasMatrix.initial(state.viewMatrix) diff --git a/lib/image-editor/src/main/java/org/signal/imageeditor/core/RendererContext.java b/lib/image-editor/src/main/java/org/signal/imageeditor/core/RendererContext.java index 5769e8ae30..1f2a367da7 100644 --- a/lib/image-editor/src/main/java/org/signal/imageeditor/core/RendererContext.java +++ b/lib/image-editor/src/main/java/org/signal/imageeditor/core/RendererContext.java @@ -57,6 +57,10 @@ public final class RendererContext { @Nullable private Integer blackoutColor; + @ColorInt + @Nullable + private Integer decorationColor; + private List children = Collections.emptyList(); private Paint maskPaint; @@ -123,6 +127,22 @@ public final class RendererContext { return blackoutColor == null ? modelColor : ColorUtils.setAlphaComponent(blackoutColor, Color.alpha(modelColor)); } + /** + * Overrides the color the editor draws its chrome -- crop thumbs, guides -- with, for a caller whose background is + * not always dark. Pass null to fall back to the default light-on-dark chrome. + */ + public void setDecorationColor(@ColorInt @Nullable Integer decorationColor) { + this.decorationColor = decorationColor; + } + + /** + * Resolves a decoration color against any override set for this render, preserving the alpha the caller baked in. + */ + @ColorInt + public int resolveDecorationColor(@ColorInt int defaultColor) { + return decorationColor == null ? defaultColor : ColorUtils.setAlphaComponent(decorationColor, Color.alpha(defaultColor)); + } + /** * Persist the current state on to a stack, must be complimented by a call to {@link #restore()}. */ diff --git a/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/CropAreaRenderer.java b/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/CropAreaRenderer.java index 920c0bcd1c..00f0221e65 100644 --- a/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/CropAreaRenderer.java +++ b/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/CropAreaRenderer.java @@ -50,7 +50,7 @@ public final class CropAreaRenderer implements Renderer { final int thickness = resources.getDimensionPixelSize(R.dimen.crop_area_renderer_edge_thickness); final int size = (int) Math.min(resources.getDimensionPixelSize(R.dimen.crop_area_renderer_edge_size), Math.min(dst.width(), dst.height()) / 3f - 10); - paint.setColor(ResourcesCompat.getColor(resources, R.color.crop_area_renderer_edge_color, null)); + paint.setColor(rendererContext.resolveDecorationColor(ResourcesCompat.getColor(resources, R.color.crop_area_renderer_edge_color, null))); rendererContext.canvasMatrix.setToIdentity(); screenClipPath.reset(); diff --git a/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/OvalGuideRenderer.java b/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/OvalGuideRenderer.java index 918f75fabe..36f2c6a825 100644 --- a/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/OvalGuideRenderer.java +++ b/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/OvalGuideRenderer.java @@ -38,7 +38,7 @@ public final class OvalGuideRenderer implements Renderer { float halfStroke = stroke / 2f; this.paint.setStrokeWidth(stroke); - paint.setColor(ContextCompat.getColor(context, ovalGuideColor)); + paint.setColor(rendererContext.resolveDecorationColor(ContextCompat.getColor(context, ovalGuideColor))); rendererContext.mapRect(dst, Bounds.FULL_BOUNDS); dst.set(dst.left + halfStroke, dst.top + halfStroke, dst.right - halfStroke, dst.bottom - halfStroke); diff --git a/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/SelectedElementGuideRenderer.kt b/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/SelectedElementGuideRenderer.kt index 35706b5c3a..78cf3f1144 100644 --- a/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/SelectedElementGuideRenderer.kt +++ b/lib/image-editor/src/main/java/org/signal/imageeditor/core/renderers/SelectedElementGuideRenderer.kt @@ -58,6 +58,9 @@ class SelectedElementGuideRenderer : Renderer { private fun performRender(rendererContext: RendererContext) { rendererContext.save() + guidePaint.color = rendererContext.resolveDecorationColor(Color.WHITE) + circlePaint.color = rendererContext.resolveDecorationColor(Color.WHITE) + rendererContext.canvasMatrix.setToIdentity() path.reset()