From a210ef3136b9e08888ef4afdc131f8fa685bdb2f Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 22 Jul 2019 20:54:41 -0400 Subject: [PATCH] Added ability to save image captures to external storage. --- res/drawable-hdpi/ic_download_32.png | Bin 0 -> 1936 bytes res/drawable-mdpi/ic_download_32.png | Bin 0 -> 1367 bytes res/drawable-xhdpi/ic_download_32.png | Bin 0 -> 3147 bytes res/drawable-xxhdpi/ic_download_32.png | Bin 0 -> 4900 bytes res/drawable-xxxhdpi/ic_download_32.png | Bin 0 -> 7751 bytes res/layout/image_editor_hud.xml | 9 ++++ .../mediasend/MediaSendActivity.java | 8 ++-- .../scribbles/ImageEditorFragment.java | 42 ++++++++++++++++++ .../securesms/scribbles/ImageEditorHud.java | 10 ++++- 9 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 res/drawable-hdpi/ic_download_32.png create mode 100644 res/drawable-mdpi/ic_download_32.png create mode 100644 res/drawable-xhdpi/ic_download_32.png create mode 100644 res/drawable-xxhdpi/ic_download_32.png create mode 100644 res/drawable-xxxhdpi/ic_download_32.png diff --git a/res/drawable-hdpi/ic_download_32.png b/res/drawable-hdpi/ic_download_32.png new file mode 100644 index 0000000000000000000000000000000000000000..38e7786c2b1a5877652bf104f0ff0f7bd67ffe84 GIT binary patch literal 1936 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 @@ -41,6 +42,14 @@ android:padding="8dp" android:src="@drawable/ic_undo_32" /> + + { dialog = new AlertDialog.Builder(new ContextThemeWrapper(MediaSendActivity.this, R.style.TextSecure_MediaSendProgressDialog)) - .setView(R.layout.progress_dialog) - .setCancelable(false) - .create(); + .setView(R.layout.progress_dialog) + .setCancelable(false) + .create(); dialog.show(); dialog.getWindow().setLayout(getResources().getDimensionPixelSize(R.dimen.mediasend_progress_dialog_size), - getResources().getDimensionPixelSize(R.dimen.mediasend_progress_dialog_size)); + getResources().getDimensionPixelSize(R.dimen.mediasend_progress_dialog_size)); }; Util.runOnMainDelayed(progressTimer, 250); } diff --git a/src/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/src/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java index fe7cb36d80..50ab3041ad 100644 --- a/src/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java +++ b/src/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java @@ -1,6 +1,8 @@ package org.thoughtcrime.securesms.scribbles; +import android.Manifest; import android.content.Intent; +import android.graphics.Bitmap; import android.graphics.Paint; import android.net.Uri; import android.os.Bundle; @@ -10,6 +12,7 @@ import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.imageeditor.ColorableRenderer; @@ -22,9 +25,18 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mediasend.MediaSendPageFragment; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.mms.PushMediaConstraints; +import org.thoughtcrime.securesms.permissions.Permissions; +import org.thoughtcrime.securesms.providers.BlobProvider; import org.thoughtcrime.securesms.scribbles.widget.VerticalSlideColorPicker; +import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.ParcelUtil; +import org.thoughtcrime.securesms.util.SaveAttachmentTask; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; +import org.thoughtcrime.securesms.util.concurrent.SimpleTask; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; import static android.app.Activity.RESULT_OK; @@ -287,6 +299,36 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu refreshUniqueColors(); } + @Override + public void onSave() { + SaveAttachmentTask.showWarningDialog(requireContext(), (dialogInterface, i) -> { + Permissions.with(this) + .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) + .ifNecessary() + .withPermanentDenialDialog(getString(R.string.MediaPreviewActivity_signal_needs_the_storage_permission_in_order_to_write_to_external_storage_but_it_has_been_permanently_denied)) + .onAnyDenied(() -> Toast.makeText(requireContext(), R.string.MediaPreviewActivity_unable_to_write_to_external_storage_without_permission, Toast.LENGTH_LONG).show()) + .onAllGranted(() -> { + SimpleTask.run(() -> { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + Bitmap image = imageEditorView.getModel().render(requireContext()); + + image.compress(Bitmap.CompressFormat.JPEG, 80, outputStream); + + return BlobProvider.getInstance() + .forData(outputStream.toByteArray()) + .withMimeType(MediaUtil.IMAGE_JPEG) + .createForSingleUseInMemory(); + + }, uri -> { + SaveAttachmentTask saveTask = new SaveAttachmentTask(requireContext()); + SaveAttachmentTask.Attachment attachment = new SaveAttachmentTask.Attachment(uri, MediaUtil.IMAGE_JPEG, System.currentTimeMillis(), null); + saveTask.executeOnExecutor(SignalExecutors.BOUNDED, attachment); + }); + }) + .execute(); + }); + } + @Override public void onFlipHorizontal() { imageEditorView.getModel().flipHorizontal(); diff --git a/src/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java b/src/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java index 85ada5c0a1..efc062b14d 100644 --- a/src/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java +++ b/src/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java @@ -36,6 +36,7 @@ public final class ImageEditorHud extends LinearLayout { private View textButton; private View stickerButton; private View undoButton; + private View saveButton; private View deleteButton; private View confirmButton; private VerticalSlideColorPicker colorPicker; @@ -81,6 +82,7 @@ public final class ImageEditorHud extends LinearLayout { textButton = findViewById(R.id.scribble_text_button); stickerButton = findViewById(R.id.scribble_sticker_button); undoButton = findViewById(R.id.scribble_undo_button); + saveButton = findViewById(R.id.scribble_save_button); deleteButton = findViewById(R.id.scribble_delete_button); confirmButton = findViewById(R.id.scribble_confirm_button); colorPicker = findViewById(R.id.scribble_color_picker); @@ -100,7 +102,7 @@ public final class ImageEditorHud extends LinearLayout { } private void initializeVisibilityMap() { - setVisibleViewsWhenInMode(Mode.NONE, drawButton, highlightButton, textButton, stickerButton, cropButton, undoButton); + setVisibleViewsWhenInMode(Mode.NONE, drawButton, highlightButton, textButton, stickerButton, cropButton, undoButton, saveButton); setVisibleViewsWhenInMode(Mode.DRAW, confirmButton, undoButton, colorPicker, colorPalette); @@ -145,6 +147,7 @@ public final class ImageEditorHud extends LinearLayout { highlightButton.setOnClickListener(v -> setMode(Mode.HIGHLIGHT)); textButton.setOnClickListener(v -> setMode(Mode.TEXT)); stickerButton.setOnClickListener(v -> setMode(Mode.MOVE_DELETE)); + saveButton.setOnClickListener(v -> eventListener.onSave()); } public void setColorPalette(@NonNull Set colors) { @@ -241,6 +244,7 @@ public final class ImageEditorHud extends LinearLayout { void onColorChange(int color); void onUndo(); void onDelete(); + void onSave(); void onFlipHorizontal(); void onRotate90AntiClockwise(); void onCropAspectLock(boolean locked); @@ -266,6 +270,10 @@ public final class ImageEditorHud extends LinearLayout { public void onDelete() { } + @Override + public void onSave() { + } + @Override public void onFlipHorizontal() { }