Search in sources :

Example 1 with EditorModel

use of org.signal.imageeditor.core.model.EditorModel in project Signal-Android by WhisperSystems.

the class WallpaperCropActivity method setWallpaper.

private void setWallpaper() {
    EditorModel model = imageEditor.getModel();
    Point size = new Point(imageEditor.getWidth(), imageEditor.getHeight());
    AlertDialog dialog = SimpleProgressDialog.show(this);
    viewModel.render(this, model, size, new AsynchronousCallback.MainThread<ChatWallpaper, WallpaperCropViewModel.Error>() {

        @Override
        public void onComplete(@Nullable ChatWallpaper result) {
            dialog.dismiss();
            setResult(RESULT_OK, new Intent().putExtra(ChatWallpaperPreviewActivity.EXTRA_CHAT_WALLPAPER, result));
            finish();
        }

        @Override
        public void onError(@Nullable WallpaperCropViewModel.Error error) {
            dialog.dismiss();
            Toast.makeText(WallpaperCropActivity.this, R.string.WallpaperCropActivity__error_setting_wallpaper, Toast.LENGTH_SHORT).show();
        }
    }.toWorkerCallback());
}
Also used : AlertDialog(androidx.appcompat.app.AlertDialog) EditorModel(org.signal.imageeditor.core.model.EditorModel) ChatWallpaper(org.thoughtcrime.securesms.wallpaper.ChatWallpaper) Intent(android.content.Intent) Point(android.graphics.Point) Nullable(androidx.annotation.Nullable)

Example 2 with EditorModel

use of org.signal.imageeditor.core.model.EditorModel in project Signal-Android by WhisperSystems.

the class WallpaperCropActivity method setupImageEditor.

private void setupImageEditor(@NonNull Uri imageUri) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int height = displayMetrics.heightPixels;
    int width = displayMetrics.widthPixels;
    float ratio = width / (float) height;
    EditorModel editorModel = EditorModel.createForWallpaperEditing(ratio);
    EditorElement image = new EditorElement(new UriGlideRenderer(imageUri, true, width, height, UriGlideRenderer.WEAK_BLUR));
    image.getFlags().setSelectable(false).persist();
    editorModel.addElement(image);
    imageEditor.setModel(editorModel);
    imageEditor.setSizeChangedListener((newWidth, newHeight) -> {
        float newRatio = newWidth / (float) newHeight;
        Log.i(TAG, String.format(Locale.US, "Output size (%d, %d) (ratio %.2f)", newWidth, newHeight, newRatio));
        editorModel.setFixedRatio(newRatio);
    });
}
Also used : UriGlideRenderer(org.thoughtcrime.securesms.scribbles.UriGlideRenderer) EditorModel(org.signal.imageeditor.core.model.EditorModel) EditorElement(org.signal.imageeditor.core.model.EditorElement) DisplayMetrics(android.util.DisplayMetrics) Point(android.graphics.Point)

Example 3 with EditorModel

use of org.signal.imageeditor.core.model.EditorModel in project Signal-Android by WhisperSystems.

the class AvatarSelectionActivity method handleSave.

private void handleSave() {
    ImageEditorFragment fragment = (ImageEditorFragment) getSupportFragmentManager().findFragmentByTag(IMAGE_EDITOR);
    if (fragment == null) {
        throw new AssertionError();
    }
    ImageEditorFragment.Data data = (ImageEditorFragment.Data) fragment.saveState();
    EditorModel model = data.readModel();
    if (model == null) {
        throw new AssertionError();
    }
    MediaRepository.transformMedia(this, Collections.singletonList(currentMedia), Collections.singletonMap(currentMedia, new ImageEditorModelRenderMediaTransform(model, AVATAR_DIMENSIONS)), output -> {
        Media transformed = output.get(currentMedia);
        Intent result = new Intent();
        result.putExtra(EXTRA_MEDIA, transformed);
        setResult(RESULT_OK, result);
        finish();
    });
}
Also used : EditorModel(org.signal.imageeditor.core.model.EditorModel) LiveData(androidx.lifecycle.LiveData) DefaultValueLiveData(org.thoughtcrime.securesms.util.DefaultValueLiveData) Intent(android.content.Intent) ImageEditorFragment(org.thoughtcrime.securesms.scribbles.ImageEditorFragment)

Example 4 with EditorModel

use of org.signal.imageeditor.core.model.EditorModel in project Signal-Android by WhisperSystems.

the class ImageEditorFragment method onViewCreated.

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Mode mode = Mode.getByCode(requireArguments().getString(KEY_MODE));
    imageEditorHud = view.findViewById(R.id.scribble_hud);
    imageEditorView = view.findViewById(R.id.image_editor_view);
    int width = getResources().getDisplayMetrics().widthPixels;
    int height = (int) ((16 / 9f) * width);
    imageEditorView.setMinimumHeight(height);
    imageEditorView.requestLayout();
    imageEditorHud.setBottomOfImageEditorView(getResources().getDisplayMetrics().heightPixels - height);
    imageEditorHud.setEventListener(this);
    imageEditorView.setDragListener(dragListener);
    imageEditorView.setTapListener(selectionListener);
    imageEditorView.setDrawingChangedListener(stillTouching -> onDrawingChanged(stillTouching, true));
    imageEditorView.setUndoRedoStackListener(this::onUndoRedoAvailabilityChanged);
    EditorModel editorModel = null;
    if (restoredModel != null) {
        editorModel = restoredModel;
        restoredModel = null;
    }
    if (editorModel == null) {
        switch(mode) {
            case AVATAR_EDIT:
                editorModel = EditorModel.createForAvatarEdit();
                break;
            case AVATAR_CAPTURE:
                editorModel = EditorModel.createForAvatarCapture();
                break;
            default:
                editorModel = EditorModel.create();
                break;
        }
        EditorElement image = new EditorElement(new UriGlideRenderer(imageUri, true, imageMaxWidth, imageMaxHeight, UriGlideRenderer.STRONG_BLUR, mainImageRequestListener));
        image.getFlags().setSelectable(false).persist();
        editorModel.addElement(image);
    } else {
        controller.onMainImageLoaded();
    }
    if (mode == Mode.AVATAR_CAPTURE || mode == Mode.AVATAR_EDIT) {
        imageEditorHud.setUpForAvatarEditing();
    }
    if (mode == Mode.AVATAR_CAPTURE) {
        imageEditorHud.enterMode(ImageEditorHudV2.Mode.CROP);
    }
    imageEditorView.setModel(editorModel);
    if (!SignalStore.tooltips().hasSeenBlurHudIconTooltip()) {
        imageEditorHud.showBlurHudTooltip();
        SignalStore.tooltips().markBlurHudIconTooltipSeen();
    }
    onDrawingChanged(false, false);
    requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), onBackPressedCallback);
}
Also used : EditorModel(org.signal.imageeditor.core.model.EditorModel) EditorElement(org.signal.imageeditor.core.model.EditorElement) Paint(android.graphics.Paint) Point(android.graphics.Point)

Example 5 with EditorModel

use of org.signal.imageeditor.core.model.EditorModel in project Signal-Android by WhisperSystems.

the class ImageEditorFragment method onBlurFacesToggled.

@Override
public void onBlurFacesToggled(boolean enabled) {
    EditorModel model = imageEditorView.getModel();
    EditorElement mainImage = model.getMainImage();
    if (mainImage == null) {
        imageEditorHud.hideBlurToast();
        return;
    }
    if (!enabled) {
        model.clearFaceRenderers();
        imageEditorHud.hideBlurToast();
        return;
    }
    Matrix inverseCropPosition = model.getInverseCropPosition();
    if (cachedFaceDetection != null) {
        if (cachedFaceDetection.first().equals(getUri()) && cachedFaceDetection.second().position.equals(inverseCropPosition)) {
            renderFaceBlurs(cachedFaceDetection.second());
            imageEditorHud.showBlurToast();
            return;
        } else {
            cachedFaceDetection = null;
        }
    }
    AlertDialog progress = SimpleProgressDialog.show(requireContext());
    mainImage.getFlags().setChildrenVisible(false);
    SimpleTask.run(getLifecycle(), () -> {
        if (mainImage.getRenderer() != null) {
            Bitmap bitmap = ((UriGlideRenderer) mainImage.getRenderer()).getBitmap();
            if (bitmap != null) {
                FaceDetector detector = new AndroidFaceDetector();
                Point size = model.getOutputSizeMaxWidth(1000);
                Bitmap render = model.render(ApplicationDependencies.getApplication(), size);
                try {
                    return new FaceDetectionResult(detector.detect(render), new Point(render.getWidth(), render.getHeight()), inverseCropPosition);
                } finally {
                    render.recycle();
                    mainImage.getFlags().reset();
                }
            }
        }
        return new FaceDetectionResult(Collections.emptyList(), new Point(0, 0), new Matrix());
    }, result -> {
        mainImage.getFlags().reset();
        renderFaceBlurs(result);
        progress.dismiss();
        imageEditorHud.showBlurToast();
    });
}
Also used : AlertDialog(androidx.appcompat.app.AlertDialog) Bitmap(android.graphics.Bitmap) Matrix(android.graphics.Matrix) EditorModel(org.signal.imageeditor.core.model.EditorModel) EditorElement(org.signal.imageeditor.core.model.EditorElement) Point(android.graphics.Point)

Aggregations

EditorModel (org.signal.imageeditor.core.model.EditorModel)16 EditorElement (org.signal.imageeditor.core.model.EditorElement)10 Point (android.graphics.Point)8 Intent (android.content.Intent)4 AlertDialog (androidx.appcompat.app.AlertDialog)4 MultiLineTextRenderer (org.signal.imageeditor.core.renderers.MultiLineTextRenderer)4 Bitmap (android.graphics.Bitmap)2 Matrix (android.graphics.Matrix)2 Paint (android.graphics.Paint)2 DisplayMetrics (android.util.DisplayMetrics)2 MenuItem (android.view.MenuItem)2 Nullable (androidx.annotation.Nullable)2 Toolbar (androidx.appcompat.widget.Toolbar)2 LiveData (androidx.lifecycle.LiveData)2 UriRenderer (org.signal.imageeditor.app.renderers.UriRenderer)2 UrlRenderer (org.signal.imageeditor.app.renderers.UrlRenderer)2 ImageEditorView (org.signal.imageeditor.core.ImageEditorView)2 ImageEditorFragment (org.thoughtcrime.securesms.scribbles.ImageEditorFragment)2 UriGlideRenderer (org.thoughtcrime.securesms.scribbles.UriGlideRenderer)2 DefaultValueLiveData (org.thoughtcrime.securesms.util.DefaultValueLiveData)2