diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/MediaViewer.java b/app/src/main/java/org/nuclearfog/twidda/activity/MediaViewer.java index 9d3b6d84..1e923ee8 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/MediaViewer.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/MediaViewer.java @@ -48,9 +48,10 @@ public class MediaViewer extends AppCompatActivity implements OnImageClickListen /// Media Types private static final int MEDIAVIEWER_NONE = 0; - public static final int MEDIAVIEWER_IMAGE = 1; - public static final int MEDIAVIEWER_VIDEO = 2; - public static final int MEDIAVIEWER_ANGIF = 3; + public static final int MEDIAVIEWER_IMG_S = 1; + public static final int MEDIAVIEWER_IMAGE = 2; + public static final int MEDIAVIEWER_VIDEO = 3; + public static final int MEDIAVIEWER_ANGIF = 4; private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.GERMANY); private static final String[] REQ_WRITE_SD = {WRITE_EXTERNAL_STORAGE}; @@ -99,6 +100,8 @@ public class MediaViewer extends AppCompatActivity implements OnImageClickListen if (link != null && link.length > 0) { switch (type) { + case MEDIAVIEWER_IMG_S: + adapter.disableSaveButton(); case MEDIAVIEWER_IMAGE: imageWindow.setVisibility(VISIBLE); imageList.setLayoutManager(new LinearLayoutManager(this, HORIZONTAL, false)); @@ -150,7 +153,7 @@ public class MediaViewer extends AppCompatActivity implements OnImageClickListen @Override - public void onImageTouch(Bitmap image) { + public void onSaveClick(Bitmap image) { boolean accessGranted = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int check = checkSelfPermission(WRITE_EXTERNAL_STORAGE); diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java index c300905f..382a4cfa 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/MessagePopup.java @@ -38,7 +38,7 @@ import static android.view.Window.FEATURE_NO_TITLE; import static android.widget.Toast.LENGTH_SHORT; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_LINK; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_TYPE; -import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMAGE; +import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMG_S; public class MessagePopup extends AppCompatActivity implements OnClickListener, OnDismissListener { @@ -161,7 +161,7 @@ public class MessagePopup extends AppCompatActivity implements OnClickListener, else { Intent image = new Intent(this, MediaViewer.class); image.putExtra(KEY_MEDIA_LINK, new String[]{mediaPath}); - image.putExtra(KEY_MEDIA_TYPE, MEDIAVIEWER_IMAGE); + image.putExtra(KEY_MEDIA_TYPE, MEDIAVIEWER_IMG_S); startActivity(image); } break; diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java index 3883b679..886433ca 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java @@ -48,7 +48,7 @@ import static android.widget.Toast.LENGTH_LONG; import static android.widget.Toast.LENGTH_SHORT; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_LINK; import static org.nuclearfog.twidda.activity.MediaViewer.KEY_MEDIA_TYPE; -import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMAGE; +import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_IMG_S; import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_VIDEO; @@ -267,7 +267,7 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo case GIF: case IMAGE: - image.putExtra(KEY_MEDIA_TYPE, MEDIAVIEWER_IMAGE); + image.putExtra(KEY_MEDIA_TYPE, MEDIAVIEWER_IMG_S); startActivity(image); break; } diff --git a/app/src/main/java/org/nuclearfog/twidda/adapter/ImageAdapter.java b/app/src/main/java/org/nuclearfog/twidda/adapter/ImageAdapter.java index 642c4fd5..05775d6c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/adapter/ImageAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/adapter/ImageAdapter.java @@ -1,8 +1,11 @@ package org.nuclearfog.twidda.adapter; import android.graphics.Bitmap; +import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout.LayoutParams; import android.widget.ProgressBar; @@ -12,11 +15,13 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView.Adapter; import androidx.recyclerview.widget.RecyclerView.ViewHolder; +import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.holder.ImageHolder; import java.util.LinkedList; import java.util.List; +import static android.view.View.VISIBLE; import static android.widget.ListPopupWindow.MATCH_PARENT; import static android.widget.ListPopupWindow.WRAP_CONTENT; import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; @@ -30,13 +35,13 @@ public class ImageAdapter extends Adapter { private OnImageClickListener itemClickListener; private List images; - private boolean loading; + private boolean loading = false; + private boolean saveImg = true; public ImageAdapter(OnImageClickListener itemClickListener) { this.itemClickListener = itemClickListener; images = new LinkedList<>(); - loading = false; } @@ -58,6 +63,11 @@ public class ImageAdapter extends Adapter { } + public void disableSaveButton() { + saveImg = false; + } + + public boolean isEmpty() { return images.isEmpty(); } @@ -83,11 +93,9 @@ public class ImageAdapter extends Adapter { @Override public ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) { if (viewType == PICTURE) { - ImageView preview = new ImageView(parent.getContext()); - preview.setBackgroundColor(0xffffffff); - preview.setPadding(1, 1, 1, 1); - final ImageItem item = new ImageItem(preview); - preview.setOnClickListener(new View.OnClickListener() { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); + final ImageItem item = new ImageItem(view); + item.preview.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int pos = item.getAdapterPosition(); @@ -97,17 +105,19 @@ public class ImageAdapter extends Adapter { } } }); - preview.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - int pos = item.getAdapterPosition(); - if (pos != NO_POSITION) { - Bitmap img = images.get(pos).getOriginalImage(); - itemClickListener.onImageTouch(img); + if (saveImg) { + item.saveButton.setVisibility(VISIBLE); + item.saveButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + int pos = item.getAdapterPosition(); + if (pos != NO_POSITION) { + Bitmap img = images.get(pos).getOriginalImage(); + itemClickListener.onSaveClick(img); + } } - return true; - } - }); + }); + } return item; } else { ProgressBar circle = new ProgressBar(parent.getContext()); @@ -132,10 +142,12 @@ public class ImageAdapter extends Adapter { */ class ImageItem extends ViewHolder { final ImageView preview; + final ImageButton saveButton; - ImageItem(ImageView preview) { - super(preview); - this.preview = preview; + ImageItem(View view) { + super(view); + preview = view.findViewById(R.id.item_image_preview); + saveButton = view.findViewById(R.id.item_image_save); } } @@ -165,6 +177,6 @@ public class ImageAdapter extends Adapter { * * @param image selected image_add bitmap */ - void onImageTouch(Bitmap image); + void onSaveClick(Bitmap image); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java b/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java index 5cfcdc82..a56812d6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java @@ -1048,6 +1048,7 @@ public class TwitterEngine { * @return bitmap image * @throws EngineException if image loading failed */ + @Nullable public Bitmap getImage(String link) throws EngineException { try { Proxy proxy; diff --git a/app/src/main/res/drawable/save_img.xml b/app/src/main/res/drawable/save_img.xml new file mode 100644 index 00000000..5e4030f4 --- /dev/null +++ b/app/src/main/res/drawable/save_img.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml new file mode 100644 index 00000000..1b617764 --- /dev/null +++ b/app/src/main/res/layout/item_image.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 99c52444..2a891454 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -147,4 +147,6 @@ Datei nicht gefunden! Mehr laden Bild konnte nicht geladen werden! + Bildvorschau + Bild speichern \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e76dc559..7cf2fc10 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -67,4 +67,7 @@ 5dp 18sp 8dp + 5dp + 30dp + 2dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7899d49b..29ee5d54 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,4 +150,6 @@ File not found! Load more Could not load image! + image preview + save image \ No newline at end of file