Initial modularization of core image editor code.

fork-5.53.8
Alex Hart 2021-09-13 13:16:14 -03:00 zatwierdzone przez Greyson Parrelli
rodzic 5d5251054c
commit 95fabd7ed1
61 zmienionych plików z 422 dodań i 173 usunięć

Wyświetl plik

@ -453,6 +453,7 @@ dependencies {
implementation project(':core-util')
implementation project(':video')
implementation project(':device-transfer')
implementation project(':image-editor')
implementation 'org.signal:zkgroup-android:0.7.0'
implementation "org.whispersystems:signal-client-android:${LIBSIGNAL_CLIENT_VERSION}"

Wyświetl plik

@ -16,7 +16,7 @@ import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.LiveData;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.signal.imageeditor.core.model.EditorModel;
import org.thoughtcrime.securesms.mediasend.v2.gallery.MediaGalleryFragment;
import org.thoughtcrime.securesms.mms.MediaConstraints;
import org.thoughtcrime.securesms.profiles.AvatarHelper;

Wyświetl plik

@ -11,7 +11,7 @@ import androidx.annotation.WorkerThread;
import org.signal.core.util.StreamUtil;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.signal.imageeditor.core.model.EditorModel;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.whispersystems.libsignal.util.guava.Optional;

Wyświetl plik

@ -9,11 +9,11 @@ import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
import org.signal.core.util.ThreadUtil
import org.signal.core.util.logging.Log
import org.signal.imageeditor.core.model.EditorModel
import org.thoughtcrime.securesms.TransportOption
import org.thoughtcrime.securesms.database.AttachmentDatabase.TransformProperties
import org.thoughtcrime.securesms.database.ThreadDatabase
import org.thoughtcrime.securesms.database.model.Mention
import org.thoughtcrime.securesms.imageeditor.model.EditorModel
import org.thoughtcrime.securesms.mediasend.CompositeMediaTransform
import org.thoughtcrime.securesms.mediasend.ImageEditorModelRenderMediaTransform
import org.thoughtcrime.securesms.mediasend.Media

Wyświetl plik

@ -11,7 +11,7 @@ import android.util.AttributeSet
import android.view.View
import androidx.annotation.ColorInt
import androidx.core.animation.doOnEnd
import org.thoughtcrime.securesms.imageeditor.Bounds
import org.signal.imageeditor.core.Bounds
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.visible

Wyświetl plik

@ -34,16 +34,16 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.animation.ResizeAnimation;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
import org.thoughtcrime.securesms.imageeditor.ImageEditorView;
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.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.ColorableRenderer;
import org.signal.imageeditor.core.ImageEditorView;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.SelectableRenderer;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.model.EditorModel;
import org.signal.imageeditor.core.renderers.BezierDrawingRenderer;
import org.signal.imageeditor.core.renderers.FaceBlurRenderer;
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.mediasend.MediaSendPageFragment;
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations;

Wyświetl plik

@ -11,11 +11,11 @@ import android.widget.ImageView
import androidx.appcompat.widget.AppCompatSeekBar
import androidx.fragment.app.FragmentManager
import com.airbnb.lottie.SimpleColorFilter
import org.signal.imageeditor.core.HiddenEditText
import org.signal.imageeditor.core.model.EditorElement
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.KeyboardEntryDialogFragment
import org.thoughtcrime.securesms.imageeditor.HiddenEditText
import org.thoughtcrime.securesms.imageeditor.model.EditorElement
import org.thoughtcrime.securesms.imageeditor.renderers.MultiLineTextRenderer
import org.thoughtcrime.securesms.keyboard.findListener
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.getColor
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.setUpForColor

Wyświetl plik

@ -24,13 +24,13 @@ import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
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.SelectedElementGuideRenderer;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
import org.signal.imageeditor.core.SelectableRenderer;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.model.EditorModel;
import org.signal.imageeditor.core.renderers.SelectedElementGuideRenderer;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.mms.GlideRequest;

Wyświetl plik

@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.wallpaper.crop;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
@ -27,10 +26,10 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BaseActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.conversation.colors.ColorizerView;
import org.thoughtcrime.securesms.imageeditor.ImageEditorView;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.thoughtcrime.securesms.imageeditor.renderers.FaceBlurRenderer;
import org.signal.imageeditor.core.ImageEditorView;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.model.EditorModel;
import org.signal.imageeditor.core.renderers.FaceBlurRenderer;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.scribbles.UriGlideRenderer;
import org.thoughtcrime.securesms.util.AsynchronousCallback;

Wyświetl plik

@ -15,7 +15,7 @@ import androidx.lifecycle.ViewModelProvider;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.signal.imageeditor.core.model.EditorModel;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.AsynchronousCallback;

Wyświetl plik

@ -24,7 +24,7 @@
android:orientation="horizontal"
tools:layout_constraintGuide_end="48dp" />
<org.thoughtcrime.securesms.imageeditor.ImageEditorView
<org.signal.imageeditor.core.ImageEditorView
android:id="@+id/image_editor"
android:layout_width="0dp"
android:layout_height="0dp"

Wyświetl plik

@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.thoughtcrime.securesms.imageeditor.ImageEditorView
<org.signal.imageeditor.core.ImageEditorView
android:id="@+id/image_editor_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

Wyświetl plik

@ -0,0 +1,73 @@
package org.signal.core.util;
import android.content.res.Resources;
import androidx.annotation.Dimension;
import androidx.annotation.Px;
/**
* Core utility for converting different dimensional values.
*/
public enum DimensionUnit {
PIXELS {
@Override
@Px
public float toPixels(@Px float pixels) {
return pixels;
}
@Override
@Dimension(unit = Dimension.DP)
public float toDp(@Px float pixels) {
return pixels / Resources.getSystem().getDisplayMetrics().density;
}
@Override
@Dimension(unit = Dimension.SP)
public float toSp(@Px float pixels) {
return pixels / Resources.getSystem().getDisplayMetrics().scaledDensity;
}
},
DP {
@Override
@Px
public float toPixels(@Dimension(unit = Dimension.DP) float dp) {
return dp * Resources.getSystem().getDisplayMetrics().density;
}
@Override
@Dimension(unit = Dimension.DP)
public float toDp(@Dimension(unit = Dimension.DP) float dp) {
return dp;
}
@Override
@Dimension(unit = Dimension.SP)
public float toSp(@Dimension(unit = Dimension.DP) float dp) {
return PIXELS.toSp(toPixels(dp));
}
},
SP {
@Override
@Px
public float toPixels(@Dimension(unit = Dimension.SP) float sp) {
return sp * Resources.getSystem().getDisplayMetrics().scaledDensity;
}
@Override
@Dimension(unit = Dimension.DP)
public float toDp(@Dimension(unit = Dimension.SP) float sp) {
return PIXELS.toDp(toPixels(sp));
}
@Override
@Dimension(unit = Dimension.SP)
public float toSp(@Dimension(unit = Dimension.SP) float sp) {
return sp;
}
};
public abstract float toPixels(float value);
public abstract float toDp(float value);
public abstract float toSp(float value);
}

Wyświetl plik

@ -4,6 +4,6 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/core_white"
android:fillColor="#FFFFFFFF"
android:pathData="M22,4.5L16.35,4.5a4.45,4.45 0,0 0,-8.7 0L2,4.5L2,6L3.5,6L4.86,20A2.25,2.25 0,0 0,7.1 22h9.8a2.25,2.25 0,0 0,2.24 -2L20.5,6L22,6ZM12,2.5a3,3 0,0 1,2.82 2L9.18,4.5A3,3 0,0 1,12 2.5ZM17.65,19.83a0.76,0.76 0,0 1,-0.75 0.67L7.1,20.5a0.76,0.76 0,0 1,-0.75 -0.67L5,6L19,6ZM11.25,18L11.25,8h1.5L12.75,18ZM14.5,18L15,8h1.5L16,18ZM8,18 L7.5,8L9,8l0.5,10Z"/>
</vector>

1
image-editor/lib/.gitignore vendored 100644
Wyświetl plik

@ -0,0 +1 @@
/build

Wyświetl plik

@ -0,0 +1,47 @@
plugins {
id 'com.android.library'
id 'witness'
id 'kotlin-android'
id 'kotlin-kapt'
}
apply from: 'witness-verifications.gradle'
android {
buildToolsVersion BUILD_TOOL_VERSION
compileSdkVersion COMPILE_SDK
defaultConfig {
minSdkVersion MINIMUM_SDK
targetSdkVersion TARGET_SDK
multiDexEnabled true
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JAVA_VERSION
targetCompatibility JAVA_VERSION
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencyVerification {
configuration = '(debug|release)RuntimeClasspath'
}
dependencies {
lintChecks project(':lintchecks')
implementation project(':core-util')
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.annotation:annotation:1.2.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
kapt 'androidx.annotation:annotation:1.2.0'
}

Wyświetl plik

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

Wyświetl plik

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.signal.imageeditor">
</manifest>

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.RectF;
@ -6,9 +6,11 @@ import android.graphics.RectF;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.imageeditor.core.model.EditorElement;
/**
* The local extent of a {@link org.thoughtcrime.securesms.imageeditor.model.EditorElement}.
* i.e. all {@link org.thoughtcrime.securesms.imageeditor.model.EditorElement}s have a bounding rectangle from:
* The local extent of a {@link EditorElement}.
* i.e. all {@link EditorElement}s have a bounding rectangle from:
* <p>
* {@link #LEFT} to {@link #RIGHT} and from {@link #TOP} to {@link #BOTTOM}.
*/

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Canvas;
import android.graphics.Matrix;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import androidx.annotation.ColorInt;

Wyświetl plik

@ -1,12 +1,12 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.thoughtcrime.securesms.imageeditor.renderers.BezierDrawingRenderer;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.renderers.BezierDrawingRenderer;
/**
* Passes touch events into a {@link BezierDrawingRenderer}.

Wyświetl plik

@ -1,11 +1,11 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.signal.imageeditor.core.model.EditorElement;
/**
* Represents an underway edit of the image.

Wyświetl plik

@ -1,11 +1,11 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.signal.imageeditor.core.model.EditorElement;
final class ElementDragEditSession extends ElementEditSession {

Wyświetl plik

@ -1,11 +1,11 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.signal.imageeditor.core.model.EditorElement;
abstract class ElementEditSession implements EditSession {

Wyświetl plik

@ -1,11 +1,11 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.signal.imageeditor.core.model.EditorElement;
final class ElementScaleEditSession extends ElementEditSession {

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.annotation.SuppressLint;
import android.content.Context;
@ -14,8 +14,8 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.thoughtcrime.securesms.imageeditor.renderers.MultiLineTextRenderer;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer;
/**
* Invisible {@link android.widget.EditText} that is used during in-image text editing.

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.content.Context;
import android.graphics.Canvas;
@ -17,12 +17,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.GestureDetectorCompat;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.thoughtcrime.securesms.imageeditor.model.ThumbRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.BezierDrawingRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.MultiLineTextRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.TrashRenderer;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.model.EditorModel;
import org.signal.imageeditor.core.model.ThumbRenderer;
import org.signal.imageeditor.core.renderers.BezierDrawingRenderer;
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer;
import org.signal.imageeditor.core.renderers.TrashRenderer;
/**
* ImageEditorView

Wyświetl plik

@ -1,11 +1,13 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import org.signal.imageeditor.core.model.EditorElement;
/**
* Responsible for rendering a single {@link org.thoughtcrime.securesms.imageeditor.model.EditorElement} to the canvas.
* Responsible for rendering a single {@link EditorElement} to the canvas.
* <p>
* Because it knows the most about the whereabouts of the image it is also responsible for hit detection.
*/

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.content.Context;
import android.graphics.Canvas;
@ -10,7 +10,7 @@ import android.graphics.RectF;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.signal.imageeditor.core.model.EditorElement;
import java.util.Collections;
import java.util.List;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor
package org.signal.imageeditor.core
/**
* Renderer that can maintain a "selected" state

Wyświetl plik

@ -1,12 +1,12 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
import android.graphics.Matrix;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.model.EditorElement;
import org.thoughtcrime.securesms.imageeditor.model.ThumbRenderer;
import org.signal.imageeditor.core.model.EditorElement;
import org.signal.imageeditor.core.model.ThumbRenderer;
class ThumbDragEditSession extends ElementEditSession {

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor;
package org.signal.imageeditor.core;
public interface UndoRedoStackListener {

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.animation.ValueAnimator;
import android.view.animation.Interpolator;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.animation.ValueAnimator;
import android.graphics.Matrix;
@ -9,7 +9,7 @@ import android.view.animation.Interpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.imageeditor.CanvasMatrix;
import org.signal.imageeditor.core.CanvasMatrix;
/**
* Animation Matrix provides a matrix that animates over time down to the identity matrix.

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.graphics.Matrix;

Wyświetl plik

@ -1,14 +1,14 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.graphics.Matrix;
import android.os.Parcel;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.R;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
import java.util.UUID;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.graphics.Matrix;
import android.os.Parcel;
@ -7,8 +7,8 @@ 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 org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
import java.util.Collections;
import java.util.Comparator;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.graphics.Matrix;
import android.graphics.Point;
@ -8,13 +8,13 @@ import android.graphics.RectF;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.renderers.CropAreaRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.FillRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.InverseFillRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.OvalGuideRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.TrashRenderer;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.R;
import org.signal.imageeditor.core.renderers.CropAreaRenderer;
import org.signal.imageeditor.core.renderers.FillRenderer;
import org.signal.imageeditor.core.renderers.InverseFillRenderer;
import org.signal.imageeditor.core.renderers.OvalGuideRenderer;
import org.signal.imageeditor.core.renderers.TrashRenderer;
/**
* Creates and handles a strict EditorElement Hierarchy.

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import androidx.annotation.NonNull;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.content.Context;
import android.graphics.Bitmap;
@ -14,13 +14,13 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.thoughtcrime.securesms.imageeditor.UndoRedoStackListener;
import org.thoughtcrime.securesms.imageeditor.renderers.FaceBlurRenderer;
import org.thoughtcrime.securesms.imageeditor.renderers.MultiLineTextRenderer;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.ColorableRenderer;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
import org.signal.imageeditor.core.UndoRedoStackListener;
import org.signal.imageeditor.core.renderers.FaceBlurRenderer;
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer;
import java.util.HashMap;
import java.util.LinkedHashSet;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.os.Parcel;
import android.os.Parcelable;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.graphics.Matrix;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.graphics.Matrix;
import android.graphics.RectF;

Wyświetl plik

@ -1,7 +1,7 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import java.util.UUID;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.model;
package org.signal.imageeditor.core.model;
import android.os.Parcel;
import android.os.Parcelable;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.graphics.Canvas;
import android.graphics.Paint;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.graphics.Canvas;
import android.graphics.Paint;
@ -9,8 +9,8 @@ import android.os.Parcel;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.signal.imageeditor.core.ColorableRenderer;
import org.signal.imageeditor.core.RendererContext;
/**
* Renders a {@link AutomaticControlPointBezierLine} with {@link #thickness}, {@link #color} and {@link #cap} end type.

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.content.res.Resources;
import android.graphics.Canvas;
@ -11,10 +11,10 @@ import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.signal.imageeditor.R;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
/**
* Renders a box outside of the current crop area using {@link R.color#crop_area_renderer_outer_color}

Wyświetl plik

@ -1,12 +1,12 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.os.Parcel;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
/**
* A rectangle that will be rendered on the blur mask layer. Intended for blurring faces.

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.graphics.Path;
import android.graphics.RectF;
@ -7,10 +7,10 @@ import android.os.Parcel;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.signal.core.util.DimensionUnit;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
/**
* Renders the {@link color} outside of the {@link Bounds}.
@ -32,7 +32,7 @@ public final class FillRenderer implements Renderer {
rendererContext.canvasMatrix.setToIdentity();
path.reset();
path.addRoundRect(dst, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18), Path.Direction.CW);
path.addRoundRect(dst, DimensionUnit.DP.toPixels(18), DimensionUnit.DP.toPixels(18), Path.Direction.CW);
rendererContext.canvas.clipPath(path);
rendererContext.canvas.drawColor(color);

Wyświetl plik

@ -1,9 +1,9 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
import java.lang.ref.WeakReference;

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.graphics.Path;
import android.graphics.RectF;
@ -7,10 +7,10 @@ import android.os.Parcel;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.signal.core.util.DimensionUnit;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
/**
* Renders the {@link color} outside of the {@link Bounds}.
@ -32,7 +32,7 @@ public final class InverseFillRenderer implements Renderer {
rendererContext.canvasMatrix.setToIdentity();
path.reset();
path.addRoundRect(dst, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18), Path.Direction.CW);
path.addRoundRect(dst, DimensionUnit.DP.toPixels(18), DimensionUnit.DP.toPixels(18), Path.Direction.CW);
rendererContext.canvas.clipPath(path);
rendererContext.canvas.drawColor(color);

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.animation.ValueAnimator;
import android.graphics.Color;
@ -15,11 +15,11 @@ import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.thoughtcrime.securesms.imageeditor.SelectableRenderer;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.signal.core.util.DimensionUnit;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.ColorableRenderer;
import org.signal.imageeditor.core.RendererContext;
import org.signal.imageeditor.core.SelectableRenderer;
import java.util.ArrayList;
import java.util.List;
@ -33,11 +33,11 @@ import static java.util.Collections.emptyList;
*/
public final class MultiLineTextRenderer extends InvalidateableRenderer implements ColorableRenderer, SelectableRenderer {
private static final float HIT_PADDING = ViewUtil.dpToPx(30);
private static final float HIGHLIGHT_HORIZONTAL_PADDING = ViewUtil.dpToPx(8);
private static final float HIGHLIGHT_TOP_PADDING = ViewUtil.dpToPx(10);
private static final float HIGHLIGHT_BOTTOM_PADDING = ViewUtil.dpToPx(6);
private static final float HIGHLIGHT_CORNER_RADIUS = ViewUtil.dpToPx(4);
private static final float HIT_PADDING = DimensionUnit.DP.toPixels(30);
private static final float HIGHLIGHT_HORIZONTAL_PADDING = DimensionUnit.DP.toPixels(8);
private static final float HIGHLIGHT_TOP_PADDING = DimensionUnit.DP.toPixels(10);
private static final float HIGHLIGHT_BOTTOM_PADDING = DimensionUnit.DP.toPixels(6);
private static final float HIGHLIGHT_CORNER_RADIUS = DimensionUnit.DP.toPixels(4);
@NonNull
private String text = "";
@ -334,12 +334,12 @@ public final class MultiLineTextRenderer extends InvalidateableRenderer implemen
modePaint.setAlpha(alpha);
} else if (mode == Mode.UNDERLINE) {
modeBounds.set(textBounds.left, selectionBounds.top, textBounds.right, selectionBounds.bottom);
modeBounds.inset(-ViewUtil.dpToPx(2), -ViewUtil.dpToPx(2));
modeBounds.inset(-DimensionUnit.DP.toPixels(2), -DimensionUnit.DP.toPixels(2));
modeBounds.set(modeBounds.left,
Math.max(modeBounds.top, modeBounds.bottom - ViewUtil.dpToPx(6)),
Math.max(modeBounds.top, modeBounds.bottom - DimensionUnit.DP.toPixels(6)),
modeBounds.right,
modeBounds.bottom - ViewUtil.dpToPx(2));
modeBounds.bottom - DimensionUnit.DP.toPixels(2));
int alpha = modePaint.getAlpha();
modePaint.setAlpha(rendererContext.getAlpha(alpha));
@ -469,7 +469,7 @@ public final class MultiLineTextRenderer extends InvalidateableRenderer implemen
}
if (mode == Mode.OUTLINE) {
modePaint.setStrokeWidth(ViewUtil.dpToPx(15) / 10f);
modePaint.setStrokeWidth(DimensionUnit.DP.toPixels(15) / 10f);
modePaint.setStyle(Paint.Style.STROKE);
} else {
modePaint.setStyle(Paint.Style.FILL);

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
package org.signal.imageeditor.core.renderers;
import android.content.Context;
import android.graphics.Canvas;
@ -10,10 +10,10 @@ import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import org.signal.imageeditor.R;
import org.signal.imageeditor.core.Bounds;
import org.signal.imageeditor.core.Renderer;
import org.signal.imageeditor.core.RendererContext;
/**
* Renders an oval inside of the {@link Bounds}.

Wyświetl plik

@ -1,13 +1,13 @@
package org.thoughtcrime.securesms.imageeditor.renderers
package org.signal.imageeditor.core.renderers
import android.graphics.Color
import android.graphics.DashPathEffect
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
import org.thoughtcrime.securesms.imageeditor.Bounds
import org.thoughtcrime.securesms.imageeditor.RendererContext
import org.thoughtcrime.securesms.util.ViewUtil
import org.signal.core.util.DimensionUnit
import org.signal.imageeditor.core.Bounds
import org.signal.imageeditor.core.RendererContext
class SelectedElementGuideRenderer {
@ -23,11 +23,11 @@ class SelectedElementGuideRenderer {
Bounds.LEFT, Bounds.BOTTOM
)
private val circleRadius = ViewUtil.dpToPx(5).toFloat()
private val circleRadius = DimensionUnit.DP.toPixels(5f)
private val guidePaint = Paint().apply {
isAntiAlias = true
strokeWidth = ViewUtil.dpToPx(15).toFloat() / 10f
strokeWidth = DimensionUnit.DP.toPixels(1.5f)
color = Color.WHITE
style = Paint.Style.STROKE
pathEffect = DashPathEffect(floatArrayOf(15f, 15f), 0f)

Wyświetl plik

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.imageeditor.renderers
package org.signal.imageeditor.core.renderers
import android.graphics.Color
import android.graphics.Paint
@ -6,13 +6,14 @@ import android.graphics.RectF
import android.graphics.drawable.Drawable
import android.os.Parcel
import android.os.Parcelable
import android.view.animation.Interpolator
import androidx.appcompat.content.res.AppCompatResources
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.imageeditor.Bounds
import org.thoughtcrime.securesms.imageeditor.Renderer
import org.thoughtcrime.securesms.imageeditor.RendererContext
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
import org.thoughtcrime.securesms.util.ViewUtil
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import org.signal.core.util.DimensionUnit
import org.signal.imageeditor.R
import org.signal.imageeditor.core.Bounds
import org.signal.imageeditor.core.Renderer
import org.signal.imageeditor.core.RendererContext
internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
@ -20,7 +21,7 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
isAntiAlias = true
color = Color.WHITE
style = Paint.Style.STROKE
strokeWidth = ViewUtil.dpToPx(15) / 10f
strokeWidth = DimensionUnit.DP.toPixels(1.5f)
}
private val shadePaint = Paint().apply {
@ -31,10 +32,11 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
private val bounds = RectF()
private val diameterSmall = ViewUtil.dpToPx(41)
private val diameterLarge = ViewUtil.dpToPx(54)
private val trashSize = ViewUtil.dpToPx(24)
private val padBottom = ViewUtil.dpToPx(16)
private val diameterSmall = DimensionUnit.DP.toPixels(41f)
private val diameterLarge = DimensionUnit.DP.toPixels(54f)
private val trashSize: Int = DimensionUnit.DP.toPixels(24f).toInt()
private val padBottom = DimensionUnit.DP.toPixels(16f)
private val interpolator: Interpolator = FastOutSlowInInterpolator()
private var startTime = 0L
@ -77,12 +79,12 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
private fun getInterpolatedDiameter(timeElapsed: Long): Float {
return if (timeElapsed >= DURATION) {
if (isExpanding) {
diameterLarge.toFloat()
diameterLarge
} else {
diameterSmall.toFloat()
diameterSmall
}
} else {
val interpolatedFraction = MediaAnimations.interpolator.getInterpolation(timeElapsed / DURATION.toFloat())
val interpolatedFraction = interpolator.getInterpolation(timeElapsed / DURATION.toFloat())
if (isExpanding) {
interpolateFromFraction(interpolatedFraction)
} else {

Wyświetl plik

@ -0,0 +1,93 @@
// Auto-generated, use ./gradlew calculateChecksums to regenerate
dependencyVerification {
verify = [
['androidx.activity:activity:1.0.0',
'd1bc9842455c2e534415d88c44df4d52413b478db9093a1ba36324f705f44c3d'],
['androidx.annotation:annotation:1.2.0',
'9029262bddce116e6d02be499e4afdba21f24c239087b76b3b57d7e98b490a36'],
['androidx.appcompat:appcompat-resources:1.2.0',
'c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5'],
['androidx.appcompat:appcompat:1.2.0',
'3d2131a55a61a777322e2126e0018011efa6339e53b44153eb651b16020cca70'],
['androidx.arch.core:core-common:2.1.0',
'fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889'],
['androidx.arch.core:core-runtime:2.0.0',
'87e65fc767c712b437649c7cee2431ebb4bed6daef82e501d4125b3ed3f65f8e'],
['androidx.collection:collection:1.1.0',
'632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72'],
['androidx.core:core-ktx:1.5.0',
'5964cfe7a4882da2a00fb6ca3d3a072d04139208186f7bc4b3cb66022764fc42'],
['androidx.core:core:1.5.0',
'2b279712795689069cfb63e48b3ab63c32a5649bdda44c482eb8f81ca1a72161'],
['androidx.cursoradapter:cursoradapter:1.0.0',
'a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564'],
['androidx.customview:customview:1.0.0',
'20e5b8f6526a34595a604f56718da81167c0b40a7a94a57daa355663f2594df2'],
['androidx.drawerlayout:drawerlayout:1.0.0',
'9402442cdc5a43cf62fb14f8cf98c63342d4d9d9b805c8033c6cf7e802749ac1'],
['androidx.fragment:fragment:1.1.0',
'a14c8b8f2153f128e800fbd266a6beab1c283982a29ec570d2cc05d307d81496'],
['androidx.interpolator:interpolator:1.0.0',
'33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a'],
['androidx.lifecycle:lifecycle-common:2.1.0',
'76db6be533bd730fb361c2feb12a2c26d9952824746847da82601ef81f082643'],
['androidx.lifecycle:lifecycle-livedata-core:2.0.0',
'fde334ec7e22744c0f5bfe7caf1a84c9d717327044400577bdf9bd921ec4f7bc'],
['androidx.lifecycle:lifecycle-livedata:2.0.0',
'c82609ced8c498f0a701a30fb6771bb7480860daee84d82e0a81ee86edf7ba39'],
['androidx.lifecycle:lifecycle-runtime:2.1.0',
'e5173897b965e870651e83d9d5af1742d3f532d58863223a390ce3a194c8312b'],
['androidx.lifecycle:lifecycle-viewmodel:2.1.0',
'ba55fb7ac1b2828d5327cda8acf7085d990b2b4c43ef336caa67686249b8523d'],
['androidx.loader:loader:1.0.0',
'11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025'],
['androidx.savedstate:savedstate:1.0.0',
'2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83'],
['androidx.vectordrawable:vectordrawable-animated:1.1.0',
'76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8'],
['androidx.vectordrawable:vectordrawable:1.1.0',
'46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26'],
['androidx.versionedparcelable:versionedparcelable:1.1.1',
'57e8d93260d18d5b9007c9eed3c64ad159de90c8609ebfc74a347cbd514535a4'],
['androidx.viewpager:viewpager:1.0.0',
'147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682'],
['com.google.protobuf:protobuf-javalite:3.10.0',
'215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'],
['org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32',
'e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145'],
['org.jetbrains.kotlin:kotlin-stdlib:1.4.32',
'13e9fd3e69dc7230ce0fc873a92a4e5d521d179bcf1bef75a6705baac3bfecba'],
['org.jetbrains:annotations:13.0',
'ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478'],
]
}

Wyświetl plik

@ -7,6 +7,7 @@ include ':core-util'
include ':video'
include ':device-transfer'
include ':device-transfer-app'
include ':image-editor'
project(':app').name = 'Signal-Android'
project(':paging').projectDir = file('paging/lib')
@ -17,4 +18,6 @@ project(':device-transfer-app').projectDir = file('device-transfer/app')
project(':libsignal-service').projectDir = file('libsignal/service')
project(':image-editor').projectDir = file('image-editor/lib')
rootProject.name='Signal'