diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java index c66908fc04..750ae7ae68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java @@ -320,7 +320,7 @@ public final class ImageEditorView extends FrameLayout { private EditSession startADrawingSession(@NonNull PointF point) { BezierDrawingRenderer renderer = new BezierDrawingRenderer(color, thickness * Bounds.FULL_BOUNDS.width(), cap, model.findCropRelativeToRoot()); - EditorElement element = new EditorElement(renderer); + EditorElement element = new EditorElement(renderer, EditorModel.Z_DRAWING); model.addElementCentered(element, 1); Matrix elementInverseMatrix = model.findElementInverseMatrix(element, viewMatrix); diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java index 9460907f90..cb30c3106f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java @@ -3,12 +3,15 @@ package org.thoughtcrime.securesms.imageeditor.model; import android.graphics.Matrix; import android.os.Parcel; import android.os.Parcelable; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.imageeditor.Renderer; import org.thoughtcrime.securesms.imageeditor.RendererContext; +import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -32,10 +35,13 @@ import java.util.UUID; */ public final class EditorElement implements Parcelable { + private static final Comparator Z_ORDER_COMPARATOR = (e1, e2) -> Integer.compare(e1.zOrder, e2.zOrder); + private final UUID id; private final EditorFlags flags; private final Matrix localMatrix = new Matrix(); private final Matrix editorMatrix = new Matrix(); + private final int zOrder; @Nullable private final Renderer renderer; @@ -54,9 +60,14 @@ public final class EditorElement implements Parcelable { private AlphaAnimation alphaAnimation = AlphaAnimation.NULL_1; public EditorElement(@Nullable Renderer renderer) { + this(renderer, 0); + } + + public EditorElement(@Nullable Renderer renderer, int zOrder) { this.id = UUID.randomUUID(); this.flags = new EditorFlags(); this.renderer = renderer; + this.zOrder = zOrder; } private EditorElement(Parcel in) { @@ -64,6 +75,7 @@ public final class EditorElement implements Parcelable { flags = new EditorFlags(in.readInt()); ParcelUtils.readMatrix(localMatrix, in); renderer = in.readParcelable(Renderer.class.getClassLoader()); + zOrder = in.readInt(); in.readTypedList(children, EditorElement.CREATOR); } @@ -127,6 +139,7 @@ public final class EditorElement implements Parcelable { public void addElement(@NonNull EditorElement element) { children.add(element); + Collections.sort(children, Z_ORDER_COMPARATOR); } public Matrix getLocalMatrix() { @@ -328,6 +341,7 @@ public final class EditorElement implements Parcelable { dest.writeInt(this.flags.asInt()); ParcelUtils.writeMatrix(dest, localMatrix); dest.writeParcelable(renderer, flags); + dest.writeInt(zOrder); dest.writeTypedList(children); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java index a102642d9d..358800c13a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java @@ -35,6 +35,10 @@ import java.util.UUID; */ public final class EditorModel implements Parcelable, RendererContext.Ready { + public static final int Z_DRAWING = 0; + public static final int Z_STICKERS = 0; + public static final int Z_TEXT = 1; + private static final Runnable NULL_RUNNABLE = () -> { }; diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java index 92cc62f44a..44c8b6bf23 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java @@ -50,8 +50,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu private static final String KEY_IMAGE_URI = "image_uri"; private static final String KEY_IS_AVATAR_MODE = "avatar_mode"; - private static final int SELECT_OLD_STICKER_REQUEST_CODE = 123; - private static final int SELECT_NEW_STICKER_REQUEST_CODE = 124; + private static final int SELECT_STICKER_REQUEST_CODE = 124; private EditorModel restoredModel; @@ -241,7 +240,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu String initialText = ""; int color = imageEditorHud.getActiveColor(); MultiLineTextRenderer renderer = new MultiLineTextRenderer(initialText, color); - EditorElement element = new EditorElement(renderer); + EditorElement element = new EditorElement(renderer, EditorModel.Z_TEXT); imageEditorView.getModel().addElementCentered(element, 1); imageEditorView.invalidate(); @@ -254,20 +253,11 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && requestCode == SELECT_NEW_STICKER_REQUEST_CODE && data != null) { + if (resultCode == RESULT_OK && requestCode == SELECT_STICKER_REQUEST_CODE && data != null) { final Uri uri = data.getData(); if (uri != null) { UriGlideRenderer renderer = new UriGlideRenderer(uri, true, imageMaxWidth, imageMaxHeight); - EditorElement element = new EditorElement(renderer); - imageEditorView.getModel().addElementCentered(element, 0.2f); - currentSelection = element; - imageEditorHud.setMode(ImageEditorHud.Mode.MOVE_DELETE); - } - } else if (resultCode == RESULT_OK && requestCode == SELECT_OLD_STICKER_REQUEST_CODE && data != null) { - final Uri uri = data.getData(); - if (uri != null) { - UriGlideRenderer renderer = new UriGlideRenderer(uri, false, imageMaxWidth, imageMaxHeight); - EditorElement element = new EditorElement(renderer); + EditorElement element = new EditorElement(renderer, EditorModel.Z_STICKERS); imageEditorView.getModel().addElementCentered(element, 0.2f); currentSelection = element; imageEditorHud.setMode(ImageEditorHud.Mode.MOVE_DELETE); @@ -307,7 +297,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu case INSERT_STICKER: { Intent intent = new Intent(getContext(), ImageEditorStickerSelectActivity.class); - startActivityForResult(intent, SELECT_NEW_STICKER_REQUEST_CODE); + startActivityForResult(intent, SELECT_STICKER_REQUEST_CODE); break; }