From 9ad896ecd7b6034f5390991ce6d1fa5346d56229 Mon Sep 17 00:00:00 2001 From: Floens Date: Sun, 21 Jul 2019 16:28:22 +0200 Subject: [PATCH] ui refresher replace "No." with "#". show gray background for postthumbnails, to indicate that it's still loading (like a placeholder). round thumbnails more in thread and album view. animate the rounding from/to the image viewer. when browsing threads and clicking a thimbnail, hide the image for the transitions, so it looks like the thumbnail itself is moved, instead of a "copy". use theme background for post replies popup. --- .../floens/chan/ui/cell/AlbumViewCell.java | 10 ++ .../org/floens/chan/ui/cell/PostCell.java | 11 +- .../controller/AlbumDownloadController.java | 1 + .../ui/controller/AlbumViewController.java | 42 +++++-- .../ui/controller/ImageViewerController.java | 18 +-- .../ui/controller/PostRepliesController.java | 25 +++- .../chan/ui/controller/ThreadController.java | 37 +++++- .../chan/ui/helper/PostPopupHelper.java | 4 + .../floens/chan/ui/layout/ThreadLayout.java | 8 ++ .../chan/ui/layout/ThreadListLayout.java | 21 ++++ .../floens/chan/ui/view/ThumbnailView.java | 108 +++++++++++++++--- .../chan/ui/view/TransitionImageView.java | 19 ++- .../org/floens/chan/utils/AndroidUtils.java | 10 ++ .../res/drawable-hdpi/dialog_full_dark.9.png | Bin 1482 -> 0 bytes .../res/drawable-hdpi/dialog_full_light.9.png | Bin 1515 -> 0 bytes .../res/drawable-mdpi/dialog_full_dark.9.png | Bin 935 -> 0 bytes .../res/drawable-mdpi/dialog_full_light.9.png | Bin 944 -> 0 bytes .../res/drawable-xhdpi/dialog_full_dark.9.png | Bin 2201 -> 0 bytes .../drawable-xhdpi/dialog_full_light.9.png | Bin 2231 -> 0 bytes .../drawable-xxhdpi/dialog_full_dark.9.png | Bin 4143 -> 0 bytes .../drawable-xxhdpi/dialog_full_light.9.png | Bin 4272 -> 0 bytes .../drawable/album_cell_info_background.xml | 24 ++++ .../main/res/drawable/dialog_full_light.xml | 22 ++++ .../src/main/res/layout/cell_album_view.xml | 2 +- .../main/res/layout/layout_post_replies.xml | 4 +- 25 files changed, 319 insertions(+), 47 deletions(-) delete mode 100644 Clover/app/src/main/res/drawable-hdpi/dialog_full_dark.9.png delete mode 100644 Clover/app/src/main/res/drawable-hdpi/dialog_full_light.9.png delete mode 100644 Clover/app/src/main/res/drawable-mdpi/dialog_full_dark.9.png delete mode 100644 Clover/app/src/main/res/drawable-mdpi/dialog_full_light.9.png delete mode 100644 Clover/app/src/main/res/drawable-xhdpi/dialog_full_dark.9.png delete mode 100644 Clover/app/src/main/res/drawable-xhdpi/dialog_full_light.9.png delete mode 100644 Clover/app/src/main/res/drawable-xxhdpi/dialog_full_dark.9.png delete mode 100644 Clover/app/src/main/res/drawable-xxhdpi/dialog_full_light.9.png create mode 100644 Clover/app/src/main/res/drawable/album_cell_info_background.xml create mode 100644 Clover/app/src/main/res/drawable/dialog_full_light.xml diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/AlbumViewCell.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/AlbumViewCell.java index af61511c..653395e9 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/AlbumViewCell.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/cell/AlbumViewCell.java @@ -19,6 +19,7 @@ package org.floens.chan.ui.cell; import android.content.Context; import android.util.AttributeSet; +import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import android.widget.TextView; @@ -53,6 +54,7 @@ public class AlbumViewCell extends FrameLayout { protected void onFinishInflate() { super.onFinishInflate(); thumbnailView = findViewById(R.id.thumbnail_view); + thumbnailView.setRounding(dp(8)); text = findViewById(R.id.text); } @@ -89,4 +91,12 @@ public class AlbumViewCell extends FrameLayout { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } + + public void hideLabel() { + text.setAlpha(0f); + } + + public void showLabel() { + text.animate().alpha(1f).setDuration(200).setInterpolator(new DecelerateInterpolator(2f)); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java index 148f935a..5d630083 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java @@ -84,6 +84,7 @@ import static android.text.TextUtils.isEmpty; import static org.floens.chan.Chan.injector; import static org.floens.chan.utils.AndroidUtils.ROBOTO_CONDENSED_REGULAR; import static org.floens.chan.utils.AndroidUtils.dp; +import static org.floens.chan.utils.AndroidUtils.enableHighEndAnimations; import static org.floens.chan.utils.AndroidUtils.getString; import static org.floens.chan.utils.AndroidUtils.setRoundItemBackground; import static org.floens.chan.utils.AndroidUtils.sp; @@ -160,7 +161,7 @@ public class PostCell extends LinearLayout implements PostCellInterface { filterMatchColor = findViewById(R.id.filter_match_color); int textSizeSp = Integer.parseInt(ChanSettings.fontSize.get()); - paddingPx = dp(textSizeSp - 6); + paddingPx = dp(textSizeSp - 7); detailsSizePx = sp(textSizeSp - 4); title.setTextSize(textSizeSp); title.setPadding(paddingPx, paddingPx, dp(52), 0); @@ -378,7 +379,7 @@ public class PostCell extends LinearLayout implements PostCellInterface { time = DateUtils.getRelativeTimeSpanString(post.time * 1000L, Time.get(), DateUtils.SECOND_IN_MILLIS, 0); } - String noText = "No." + post.no; + String noText = "#" + post.no; SpannableString date = new SpannableString(noText + " " + time); date.setSpan(new ForegroundColorSpanHashed(theme.detailsColor), 0, date.length(), 0); date.setSpan(new AbsoluteSizeSpanHashed(detailsSizePx), 0, date.length(), 0); @@ -565,10 +566,14 @@ public class PostCell extends LinearLayout implements PostCellInterface { p.addRule(RelativeLayout.BELOW, lastId); } + p.topMargin = paddingPx; + p.leftMargin = paddingPx; + p.bottomMargin = paddingPx; + v.setPostImage(image, size, size); v.setClickable(true); v.setOnClickListener(v2 -> callback.onThumbnailClicked(post, image, v)); - v.setRounding(dp(2)); + v.setRounding(dp(enableHighEndAnimations() ? 8 : 2)); relativeLayoutContainer.addView(v, p); thumbnailViews.add(v); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java index 9b558029..1450f8fa 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java @@ -225,6 +225,7 @@ public class AlbumDownloadController extends Controller implements View.OnClickL itemView.getLayoutParams().height = recyclerView.getRealSpanWidth(); checkbox = itemView.findViewById(R.id.checkbox); thumbnailView = itemView.findViewById(R.id.thumbnail_view); + thumbnailView.setRounding(dp(4)); itemView.setOnClickListener(this); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java index ea445154..90b26c0f 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java @@ -93,26 +93,44 @@ public class AlbumViewController extends Controller implements @Override public ThumbnailView getPreviewImageTransitionView(ImageViewerController imageViewerController, PostImage postImage) { - ThumbnailView thumbnail = null; + AlbumViewCell cell = findCellForImage(postImage); + if (cell != null) { + return cell.getThumbnailView(); + } + return null; + } + + @Override + public void onPreviewCreate(ImageViewerController imageViewerController, PostImage postImage) { + } + + @Override + public void onBeforePreviewDestroy(ImageViewerController imageViewerController, PostImage postImage) { + AlbumViewCell cell = findCellForImage(postImage); + if (cell != null) { + cell.hideLabel(); + } + } + + @Override + public void onPreviewDestroy(ImageViewerController imageViewerController, PostImage postImage) { + AlbumViewCell cell = findCellForImage(postImage); + if (cell != null) { + cell.showLabel(); + } + } + + private AlbumViewCell findCellForImage(PostImage postImage) { for (int i = 0; i < recyclerView.getChildCount(); i++) { View view = recyclerView.getChildAt(i); if (view instanceof AlbumViewCell) { AlbumViewCell cell = (AlbumViewCell) view; if (postImage == cell.getPostImage()) { - thumbnail = cell.getThumbnailView(); - break; + return cell; } } } - return thumbnail; - } - - @Override - public void onPreviewCreate(ImageViewerController imageViewerController) { - } - - @Override - public void onPreviewDestroy(ImageViewerController imageViewerController) { + return null; } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java index a4f3a7e1..7a05c547 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java @@ -388,7 +388,8 @@ public class ImageViewerController extends Controller implements ImageViewerPres startAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - imageViewerCallback.onPreviewCreate(ImageViewerController.this); + imageViewerCallback.onPreviewCreate( + ImageViewerController.this, postImage); } @Override @@ -486,16 +487,17 @@ public class ImageViewerController extends Controller implements ImageViewerPres endAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - previewOutAnimationEnded(); + previewOutAnimationEnded(postImage); } }); endAnimation.start(); + imageViewerCallback.onBeforePreviewDestroy(this, postImage); } - private void previewOutAnimationEnded() { + private void previewOutAnimationEnded(PostImage postImage) { setBackgroundAlpha(0f); - imageViewerCallback.onPreviewDestroy(this); + imageViewerCallback.onPreviewDestroy(this, postImage); navigationController.stopPresenting(false); } @@ -513,7 +515,7 @@ public class ImageViewerController extends Controller implements ImageViewerPres startView.getLocationInWindow(loc); Point windowLocation = new Point(loc[0], loc[1]); Point size = new Point(startView.getWidth(), startView.getHeight()); - previewImage.setSourceImageView(windowLocation, size, bitmap); + previewImage.setSourceImageView(windowLocation, size, bitmap, startView.getRounding()); return true; } @@ -556,9 +558,11 @@ public class ImageViewerController extends Controller implements ImageViewerPres public interface ImageViewerCallback { ThumbnailView getPreviewImageTransitionView(ImageViewerController imageViewerController, PostImage postImage); - void onPreviewCreate(ImageViewerController imageViewerController); + void onPreviewCreate(ImageViewerController imageViewerController, PostImage postImage); - void onPreviewDestroy(ImageViewerController imageViewerController); + void onBeforePreviewDestroy(ImageViewerController imageViewerController, PostImage postImage); + + void onPreviewDestroy(ImageViewerController imageViewerController, PostImage postImage); void scrollToImage(PostImage postImage); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/PostRepliesController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/PostRepliesController.java index bc7fbb6c..72567ed1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/PostRepliesController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/PostRepliesController.java @@ -44,6 +44,8 @@ import org.floens.chan.ui.helper.PostPopupHelper; import org.floens.chan.ui.view.LoadView; import org.floens.chan.ui.view.ThumbnailView; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.floens.chan.ui.theme.ThemeHelper.theme; @@ -125,6 +127,28 @@ public class PostRepliesController extends Controller { } } + public List getThumbnails() { + if (listView == null) { + return Collections.emptyList(); + } else { + List thumbnails = new ArrayList<>(7); + for (int i = 0; i < listView.getChildCount(); i++) { + View view = listView.getChildAt(i); + if (view instanceof PostCellInterface) { + PostCellInterface postView = (PostCellInterface) view; + Post post = postView.getPost(); + + if (!post.images.isEmpty()) { + for (int j = 0; j < post.images.size(); j++) { + thumbnails.add(postView.getThumbnailView(post.images.get(j))); + } + } + } + } + return thumbnails; + } + } + public void setPostRepliesData(PostPopupHelper.RepliesData data) { displayData(data); } @@ -180,7 +204,6 @@ public class PostRepliesController extends Controller { } else { repliesBackText.setTextColor(0xffffffff); repliesCloseText.setTextColor(0xffffffff); - dataView.findViewById(R.id.container).setBackgroundResource(R.drawable.dialog_full_dark); } ArrayAdapter adapter = new ArrayAdapter(context, 0) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java index d4709675..0d639551 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java @@ -194,18 +194,45 @@ public abstract class ThreadController extends Controller implements return threadLayout.getThumbnail(postImage); } - public void onPreviewCreate(ImageViewerController imageViewerController) { -// presentingImageView.setVisibility(View.INVISIBLE); + public void onPreviewCreate(ImageViewerController imageViewerController, PostImage postImage) { + ThumbnailView thumbnailView = getPreviewImageTransitionView(imageViewerController, postImage); + if (thumbnailView != null) { + thumbnailView.hide(false); + } } @Override - public void onPreviewDestroy(ImageViewerController imageViewerController) { -// presentingImageView.setVisibility(View.VISIBLE); -// presentingImageView = null; + public void onBeforePreviewDestroy(ImageViewerController imageViewerController, PostImage postImage) { + } + + @Override + public void onPreviewDestroy(ImageViewerController imageViewerController, PostImage postImage) { + ThumbnailView thumbnail = threadLayout.getThumbnail(postImage); + if (thumbnail != null) { + thumbnail.show(false); + } } @Override public void scrollToImage(PostImage postImage) { + ThumbnailView focused = threadLayout.getThumbnail(postImage); + if (focused != null) { + focused.hide(true); + } else { + AndroidUtils.waitForLayout(threadLayout, (v) -> { + ThumbnailView focused2 = threadLayout.getThumbnail(postImage); + if (focused2 != null) { + focused2.hide(true); + } + return true; + }); + } + for (ThumbnailView visible : threadLayout.getAllVisibleThumbnails()) { + if (visible != focused) { + visible.show(true); + } + } + threadLayout.getPresenter().scrollToImage(postImage, true); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/helper/PostPopupHelper.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/PostPopupHelper.java index 6882f524..98d37dea 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/helper/PostPopupHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/PostPopupHelper.java @@ -87,6 +87,10 @@ public class PostPopupHelper { return presentingController.getThumbnail(postImage); } + public List getThumbnails() { + return presentingController.getThumbnails(); + } + public void postClicked(Post p) { popAll(); presenter.highlightPost(p); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index 018226aa..2a0528de 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -509,6 +509,14 @@ public class ThreadLayout extends CoordinatorLayout implements } } + public List getAllVisibleThumbnails() { + if (postPopupHelper.isOpen()) { + return postPopupHelper.getThumbnails(); + } else { + return threadListLayout.getThumbnails(); + } + } + public boolean postRepliesOpen() { return postPopupHelper.isOpen(); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java index 15863af4..bbb997cf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java @@ -56,6 +56,7 @@ import org.floens.chan.ui.view.FastScrollerHelper; import org.floens.chan.ui.view.ThumbnailView; import org.floens.chan.utils.AndroidUtils; +import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -457,6 +458,26 @@ public class ThreadListLayout extends FrameLayout implements ReplyLayout.ReplyLa return null; } + public List getThumbnails() { + List thumbnails = new ArrayList<>(7); + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + + for (int i = 0; i < layoutManager.getChildCount(); i++) { + View view = layoutManager.getChildAt(i); + if (view instanceof PostCellInterface) { + PostCellInterface postView = (PostCellInterface) view; + Post post = postView.getPost(); + + if (!post.images.isEmpty()) { + for (PostImage image : post.images) { + thumbnails.add(postView.getThumbnailView(image)); + } + } + } + } + return thumbnails; + } + public void scrollTo(int displayPosition, boolean smooth) { if (displayPosition < 0) { int bottom = postAdapter.getItemCount() - 1; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java index 7bd18f36..03c297ab 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java @@ -17,6 +17,9 @@ */ package org.floens.chan.ui.view; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; @@ -49,6 +52,8 @@ import static org.floens.chan.utils.AndroidUtils.sp; public class ThumbnailView extends View implements ImageLoader.ImageListener { private ImageLoader.ImageContainer container; private int fadeTime = 200; + private ValueAnimator fadeAnimation; + private boolean hidden = false; private boolean circular = false; private int rounding = 0; @@ -62,7 +67,8 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { private Matrix matrix = new Matrix(); BitmapShader bitmapShader; - private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + private Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private boolean foregroundCalculate = false; private Drawable foreground; @@ -90,6 +96,14 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { private void init() { textPaint.setColor(0xff000000); textPaint.setTextSize(sp(14)); + backgroundPaint.setColor(0x22000000); + endAnimations(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + endAnimations(); } public void setUrl(String url, int width, int height) { @@ -117,6 +131,10 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { this.rounding = rounding; } + public int getRounding() { + return rounding; + } + @SuppressWarnings({"deprecation", "ConstantConditions"}) @Override public void setClickable(boolean clickable) { @@ -153,6 +171,30 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { return bitmap; } + public void hide(boolean animateIfNeeded) { + hidden = true; + if (getAlpha() == 0f) return; + + if (animateIfNeeded && fadeAnimation == null && bitmap != null && !calculate) { + animate().alpha(0f).setDuration(150); + } else { + setAlpha(0f); + } + endAnimations(); + } + + public void show(boolean animateIfNeeded) { + hidden = false; + if (getAlpha() == 1f) return; + + if (animateIfNeeded && fadeAnimation == null && bitmap != null && !calculate) { + animate().alpha(1f).setDuration(150); + } else { + setAlpha(1f); + } + endAnimations(); + } + @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { if (response.getBitmap() != null) { @@ -180,7 +222,7 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { if (error) { textPaint.setAlpha(alpha); } else { - paint.setAlpha(alpha); + bitmapPaint.setAlpha(alpha); } invalidate(); @@ -196,14 +238,11 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { @Override protected void onDraw(Canvas canvas) { - if (getAlpha() == 0f) { - return; - } - int width = getWidth() - getPaddingLeft() - getPaddingRight(); int height = getHeight() - getPaddingTop() - getPaddingBottom(); if (error) { + // Render a simple text if there was an error. canvas.save(); textPaint.getTextBounds(errorText, 0, errorText.length(), tmpTextRect); @@ -213,10 +252,23 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { canvas.restore(); } else { + outputRect.set(getPaddingLeft(), getPaddingTop(), + getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); + + // Gray background if thumbnail is not yet loaded. + if (bitmap == null || fadeAnimation != null) { + if (circular) { + canvas.drawRoundRect(outputRect, width / 2.0f, height / 2.0f, backgroundPaint); + } else { + canvas.drawRoundRect(outputRect, rounding, rounding, backgroundPaint); + } + } + if (bitmap == null) { return; } + // If needed, calculate positions. if (calculate) { calculate = false; bitmapRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); @@ -231,21 +283,20 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { drawRect.set(-offsetX, -offsetY, scaledX - offsetX, scaledY - offsetY); drawRect.offset(getPaddingLeft(), getPaddingTop()); - outputRect.set(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); - matrix.setRectToRect(bitmapRect, drawRect, Matrix.ScaleToFit.FILL); bitmapShader.setLocalMatrix(matrix); - paint.setShader(bitmapShader); + bitmapPaint.setShader(bitmapShader); } canvas.save(); canvas.clipRect(outputRect); + // Draw rounded bitmap. if (circular) { - canvas.drawRoundRect(outputRect, width / 2, height / 2, paint); + canvas.drawRoundRect(outputRect, width / 2.0f, height / 2.0f, bitmapPaint); } else { - canvas.drawRoundRect(outputRect, rounding, rounding, paint); + canvas.drawRoundRect(outputRect, rounding, rounding, bitmapPaint); } canvas.restore(); @@ -298,9 +349,8 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { private void onImageSet(boolean isImmediate) { clearAnimation(); - if (fadeTime > 0 && !isImmediate) { - setAlpha(0f); - animate().alpha(1f).setDuration(fadeTime); + if (fadeTime > 0 && !isImmediate && !hidden) { + runFadeInAnimation(); } else { setAlpha(1f); } @@ -308,13 +358,41 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener { private void setImageBitmap(Bitmap bitmap) { bitmapShader = null; - paint.setShader(null); + bitmapPaint.setShader(null); this.bitmap = bitmap; if (bitmap != null) { calculate = true; bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); } + endAnimations(); invalidate(); } + + private void runFadeInAnimation() { + fadeAnimation = ValueAnimator.ofFloat(0.0f, 1.0f); + fadeAnimation.setDuration(fadeTime); + fadeAnimation.addUpdateListener(v -> { + bitmapPaint.setAlpha((int) (((float) v.getAnimatedValue()) * 255)); + invalidate(); + }); + fadeAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + fadeAnimation = null; + if (bitmapPaint.getAlpha() != ((int) getAlpha() * 255)) { + bitmapPaint.setAlpha((int) (getAlpha() * 255)); + invalidate(); + } + } + }); + fadeAnimation.start(); + } + + private void endAnimations() { + if (fadeAnimation != null) { + fadeAnimation.end(); + fadeAnimation = null; + } + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/TransitionImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/TransitionImageView.java index 090a7bf0..450ef709 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/TransitionImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/TransitionImageView.java @@ -22,12 +22,15 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Point; import android.graphics.PointF; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; +import static org.floens.chan.utils.AndroidUtils.enableHighEndAnimations; + public class TransitionImageView extends View { private static final String TAG = "TransitionImageView"; @@ -44,6 +47,8 @@ public class TransitionImageView extends View { private float stateBitmapScaleDiff; private PointF stateBitmapSize; private PointF statePos; + private float fromRounding = 0.0f; + private Path roundingPath = new Path(); public TransitionImageView(Context context) { super(context); @@ -84,8 +89,10 @@ public class TransitionImageView extends View { matrix.setRectToRect(bitmapRect, destRect, Matrix.ScaleToFit.FILL); } - public void setSourceImageView(Point windowLocation, Point viewSize, Bitmap bitmap) { + public void setSourceImageView(Point windowLocation, Point viewSize, Bitmap bitmap, + float rounding) { this.bitmap = bitmap; + this.fromRounding = rounding; bitmapRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); if (stateBitmapSize != null) { @@ -174,9 +181,17 @@ public class TransitionImageView extends View { if (bitmap != null) { canvas.save(); if (progress < 1f) { - canvas.clipRect(destClip); + if (!enableHighEndAnimations()) { + canvas.clipRect(destClip); + } else { + float rounding = lerp(fromRounding, 0.0f, progress); + roundingPath.reset(); + roundingPath.addRoundRect(destClip, rounding, rounding, Path.Direction.CW); + canvas.clipPath(roundingPath); + } } canvas.drawBitmap(bitmap, matrix, paint); + canvas.restore(); } } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index b408942d..cc8aa1f3 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -20,6 +20,7 @@ package org.floens.chan.utils; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; +import android.app.ActivityManager; import android.app.Application; import android.app.Dialog; import android.content.ActivityNotFoundException; @@ -43,6 +44,7 @@ import android.os.Looper; import android.preference.PreferenceManager; import android.support.customtabs.CustomTabsIntent; import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityManagerCompat; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -71,6 +73,7 @@ public class AndroidUtils { @SuppressLint("StaticFieldLeak") private static Application application; private static ConnectivityManager connectivityManager; + private static ActivityManager activityManager; private static final Handler mainHandler = new Handler(Looper.getMainLooper()); @@ -84,6 +87,8 @@ public class AndroidUtils { connectivityManager = (ConnectivityManager) application.getSystemService(Context.CONNECTIVITY_SERVICE); + activityManager = (ActivityManager) + application.getSystemService(Context.ACTIVITY_SERVICE); } } @@ -452,4 +457,9 @@ public class AndroidUtils { NetworkInfo networkInfo = connectivityManager.getNetworkInfo(type); return networkInfo != null && networkInfo.isConnected(); } + + public static boolean enableHighEndAnimations() { + boolean lowRamDevice = ActivityManagerCompat.isLowRamDevice(activityManager); + return !lowRamDevice && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; + } } diff --git a/Clover/app/src/main/res/drawable-hdpi/dialog_full_dark.9.png b/Clover/app/src/main/res/drawable-hdpi/dialog_full_dark.9.png deleted file mode 100644 index 911f3fee413bdde6b548d92c4e211e342d0d0132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1482 zcmV;*1vUDKP)t2eGVTvAWr^8X-Z~2Q)-UY>GgCs9s2x zocA8iIh=t%r?N2`UM+$5rht(F5BS;8Ct*wj6UoSeiDYEKL^86lcxAn_rg_HbIe8kE zB2r8mcfvl#u*Br>;#F(2s9Z6Tw1YXc<z-l zjf;>(DTQ!QWYR>ELdY^xUcuhWdd7H=Vt4>`vt6_I{8baGBU4}3CI#v%p$G-#z42?1 z(L;(+2a03cvEu>giljv&F3P+qa$CwIqmwZ_G74!DRZZdBQYbYl#l}cdBob$Fd3pKa z`uh6oYPGuY-v8D*+rS09*oD26I(-)gL;I%wuG~+n*LU35F;dPW<(TIjKlZ(I?!U4u z|GB%n`{Vifd8_T#ymq>^Sofnvp#_zztE)ff^ZDnerzccZWmkVEz-%_da=AoRRe#^! z-hKg4vce;k7M;|KwlW%Vk(L0K+wJz|@$nI5S(-!>p{{G}_j^=Tb%UmzacFZsgb7Zf z7C2ZH8ymHv5rB)LC_c?*c6DWHG(q7LfC~USv}bC378jkh#blyrv<9&D-diM^C{4Sr z(H)%6aGcE%FG7XZk+eZJg}YVuvp2@Z3hkNPym{4R0-#U-wJ{QPYb%&YZ-EsK;*>bF zJ4qz{c)K)$ZH;N8U67C7 z8Wf92q5F{RYX0=m+B|eeEP(!q#NX5Yc5P((@OIXQI%)-o9VOC2i%8QarOlJ3|5_#M z*4`E;wRxXNCXPWwU9jw1H* zL_~5#qMf-!WNEqCY`*XJ`#fiEjE1VJu-$I|g`Qk1I;;sj?8pV8ZAvOoJUl%7RTRZ? zy#Cc<)l-AW8vX58x*bNwt0e*aFx9 zcy6}0&F8yjKdMKPc>vx6J|!Zxq7nP?1&&>#XZtMKcP7#}ki!(-mU|pTq4Kl&Oh%<> zM3N$DQ+^VJew-o}Nkk_`xsyV92aVy7?MZFAM^`2(lI-Ht*_#%TLWArA?MHZluH9Nr z9l%5y8o8j%dl=r!P&Y?%6-XR(bCGybQY{q9hvm3LS{789xZM~QzQD+%5|@bzNkvhq zcNw5BA~_rvAgPPmq1)|IYC!(403;ICHHJfGrsdiF`LKmYCz)qEIU?~Nm3=DEj#hM1 zeB7jEu%LP-(y+)h$8y-B38f`#53X*3`@1_yI{KKA@IS$i_zFL%SX1HGllqA=J=XG)XD4zKJw0wEKxPS^5O>;*EFSd%(G% kX&Pq7v^hxz0Px=Z57&IqwkwoWPyhe`07*qoM6N<$f==(jmH+?% diff --git a/Clover/app/src/main/res/drawable-hdpi/dialog_full_light.9.png b/Clover/app/src/main/res/drawable-hdpi/dialog_full_light.9.png deleted file mode 100644 index 2129567f2fa4e8a8b9322cdaca6bbd036346fabe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 zcmVMRV(R;R@hBXl>Bu%u%K1R2M<&#g*1uMyzp%) zlp2*nVGTJz1^Swo6opVEQfbhhS)XD?=oTqA7q0fEScy;qnA$Z6TQwtfSE$fIW*u!zFLqJyZwhF^bt7u@TC*j-(B; zscY+OaBX}u#wgF^M){*A699esFK2ALYa7EvdJl|IjEfQ!5=lQcU6XI1qpcrN_hupu zpE2@@6{>56>bjs5Nv=xsu8qrN3>z*HUw8&QXD*sVB-zE8NW(`)Bk4nh&>Y^ovfbYC z8a;(aBY7TGMH8vX`8H$NXyYR7GNBEjt}S%Z))+S03HjiqL7|A`yAH|D<_{mO&3#wI z0;rEj{5kD!=SGGPZ)a_&qgH^}Q6eq0h%|hfw0WcHzgEe*wfDtVZC)pmiDM8!7i_#^ zw1SCbw1SCbw1SCbw1SCbw1SCbw1SCbw1SCbw1SCbv_hRocHfaf1YKwvk+eKH#<1C{ z&80|MC7GPbWEwtA+Pw6dFCs}3`E9#0Uyd<6v_uiKtp*ZJB$-2yCuFkj?R}uNxyjdz4>vTNbC}QPPw-2$*;UpJ&Dx|y zWa;Ya>gunDhX^^VxOpHQ8smTrO^I zZvH+yJNt5ffByjBDK87Gb0xh1SfZT8Z6la=hXB7dn{pzNNFVd^J=Riv%wM16`;A#W ze!H(-vfC}ZcS%uXVtd6}ju)(jdB$3vdA|LOLZl_DM2lk$c)DPq^g}3D^iiktPyrL|O94}RnB56~85`?~-A{I$R2S&M*pkW>_vYL@}(B2tupAy9NtFQ|5VG|S`v z3P2)JU86f>W?G)zpATDjbdq_t8%HGmrLs>2%F&7rijSML3>H++MCulq=2#9}G@-O) z?cUYx(5#I|CHXp8ttDjAW@{!=x5)FSzW*Rup)6J7Maepm0R3!#hH}bW`%|0#BlBj5 zgp%8}=i0RCzt)Ax?k*)eRkzS_*W=s&1jlsR%w R421vy002ovPDHLkV1gH##(@9; diff --git a/Clover/app/src/main/res/drawable-mdpi/dialog_full_dark.9.png b/Clover/app/src/main/res/drawable-mdpi/dialog_full_dark.9.png deleted file mode 100644 index dc37316094b66bc2c334cd40564a1486d0f6a259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmV;Y16cftP)OL*95T%V0v1dSIU!jV&RAW?!#97w5glIY&o) z*NO%Joeb-}nY9;q@Y(-vgb^?ydcv?{z0QM(k!0&2&?ZD|c&AcZ9V6hQ`;-WcvRH`N z(2mf3xhSvenjirmUDs4X_$cq9x~(1|#?OF3dDZuhw3i$+o~Gf8@~ZFUvl?0mF{l`N zP^Mv&Qi2$10ahxxvb-SJZe5mnNOw&lf*5{ueSQ6PJRaW^MRA#ILCb<9RsNP`+w$*O zr>#tXmSx%R`F#HU?(Xg<^_R9liQq^JA#eN;I0Z(t+3d%|!^5Sm0C(mp%d#8b7xi&L zCmnOd@<`F}J5NGO3jMsBPHFijhcHZ2ZpFX`>r zYD-(C^#l{5CzudD!G!1uCPYs#A$o!d(GyIFp0G`bwr~(*H@4a_B}5$l(TF%Oc1GJW zDM~Cve4Z+&NydJN9h2wP(6S{<{a7#0^L+Zg?L1tHqId*yDtjh-7`?@k6sLo(zpWO&XUIEX*9GC%9;7^$z%ls3tDC@0&wFe&``shftTz%(Q32B@D9wU0j8ApQW>b}z$ArZ>rW>BfDymI-HzE$Pl)UbilG9h6 zk0Uu!SNq3M9c|orizwdSs0rc0JMTR>w{b(tEWICFcTK%_{{Ys1Zo{)>p7j6#002ov JPDHLkV1fWpuL1x7 diff --git a/Clover/app/src/main/res/drawable-mdpi/dialog_full_light.9.png b/Clover/app/src/main/res/drawable-mdpi/dialog_full_light.9.png deleted file mode 100644 index 0c5770a36f60d9298c4cb784a7f2090d263a3092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmV;h15f;kP)(~$!EHa<8vUjsetoeCn|4p3t z9_Jh#@m)I_0CX~}_h!~!;K66F{SZdLgy;!_j{Q0hB1V$dL7+*9*ziu3ranf%NB1ca zYHhI)v7sFye7UHu`0T#TD&Kg6;C6%|kjgi3no&;pOG!=aZ9@Z_c^H7k%*fSYn^cJ@cNg~7o zn4h1Ye?L1r`!XJnYw0vi|E);1cWG;@$8AsTzs|F@wa0yCv)T0G;^I3YgG0m+`&PU{ zf1{kr?GcXl-T`CaJ@BC@W8jeT3|98pjbP*lLdwh?FaxH*pQ79p^;_V+==T8RzDTFh z=uEYR`qCl6;J#?TS8XOlKtj))U^5ZpZ*eaWo^i&R;0tx%X^fBzWpOhoRn}gx@*sRmiT@iB zr&vl|ho$87RoCN8j?~ruF;qnxH{K$Ow>K(6c<|1956-PzHk+l_qjgWhd-oqEJxc1M ScWJo*0000|%e(eR4vP{&2WL5@qhf=U8ll7h zcApYc& z)y9C+5(1zq2w@rEA z!rOOhe`gplqp20u+=ZfzO zO2+RVc~kvanx;Y1 zGzcO5c6xgH(~~Dpe#b`SEjC7IF-)1n91=Ay4prKcQ6n$)5hE;O`@{3+&p$gmJ3|P8 zkG_#NPE}P{EEZoc7K={+e1oCbrL`kXzz(BEHka3V{zX~@pkA-n528b90&*>c5YTlU z`o4dFZRR3_Gg_y;c`tb#K@T+vwl0vDPKg=-w*VZqZTn&0_cQ^yR=TbOfDZv2W0MX6 zTe0gjNDr|B6C;8qWsC+u!$?5pBI>Te@B*8(ULEX`s}Wq$V;cz?0Jk%J5OQ7I#?}lS zF4qf^I_-R~kvDv*jUg=|b0Q|Nk-^h&@x4Z=TPZ~JN9uJ8n~@_z=HwPOI+Z#>bnT@` zt|7)A)%2o)9yO8|A#UID0`0qjHXAWXLIkF1Z@yP=EQs6WzsV*Q-)7dX%Qm= znHw7oa>j5eO^sldi+=zi*T7gLxN>TgONs386d`kA>w(EBQb~UAU5t>H5rNzUQlc-e z6Fej2KIDZM8iCBsR9#-$w#$eQO+aoUMOTnhOdUQY5EC1T+F6pb-cGKqC+W zfJPt$0F6Kh02+Z105k$20B8h40MH180H6^F0YD=V0)R#!1VFhF_?_?MZKX)Nj0l8a zHzTAbe@{c0%yD4V>>GeA#))*%xQJfcb}$6 z8G_M(+!Q=r7Hc$Rgp}B2y;rYp@*xwlUu51i9T_~`CXG=N5o{;ki;y|FvPM(iR96xS zBpP&W+rEl(-V$fn-ZTxG=H35-?5cXVzv}5G|9&9^ z^nH)jYV~-zT>gTs7F%p1Lx+5NG*};-Ix3ZK4br2tv$H=!2n~Rb>$?7^uIp==U~u36 ztX=zi)1sN$|2~fACKzo*6TInk^jv92ad{D!Z^!l| zzV}{i-;eE`*q+4wj^pQVsebJIR^D-t!$L$VA{Jqv$K`cwUt@FDe-*dAjO{YEXR&=1 z_glqQ`e|`FS|9)+7ZH**0fxnL9e;qd6}A&UpU3?w^-DJDbNn`KB3ONia61fzY||iV z$D#s|i3%wrNUb1OjrD;+wKAWr%xWlR2(j-r?sJaqOq>#NIPDa%=!g)o75Q4VEw+(i zg^jk>u|3CSgJ^RA2{U*`@ODf^1ZxoKPa*-ZomxtYY|jXc3WtrC8i^5l42>WWqQy}7 zsiD)9o(JS2f}}K1%Q8kPLa$XTeTi$ExGc3n75A}oTmdw~p<~l<5wm0$k{U_7!mwso ztG0umD%tyy222?>l8&??bgCq&kxqYXO&}3LPyb1XAVQT^7q{97IwI)WVXRh2l8Xp> zS<)N{S(R$V6e4)332F>SiN@x?C5MX_5p3ZsqewbcvJpbp2VN9N8log3*aHNHkwMP- z)*v;uQ9{=Q-puGU!eQf$P-+p25n9#egr6HZav6&Vwuq7U^l+%8H#!A6$F?T0#j#f; z(+G!6N^f5AtWzdEysC|oySltnM395i2damnv>9Zd+Po)`Lq`G{foM`jNJR!4Av&|~ zq-X&60<;q~Yw^}*xxp~?vFkP!s-1ob5v*`a4B;8X))<~4f?CL4Sxz0KEbHM_sAbvD zrb3e^fhGq>?rw%u5q+gdAfzs+X;Eur_|q$lE44i}I+VMBMpGOnxeH$UYH-RBxmJJH zjRrz#jUb5lz2PW(`?eI+Gy=&n#R%T$Wk~GjttXi>JGnQZvzPOa37=^Z$zcm;y__;e zYP;>nTi>Zhkcc4YI>C+7YV%nl2joCpsI>L;C6DA4-;}lt|VRn b2%-8PH~%shVHNw_00000NkvXXu0mjfC1>AC diff --git a/Clover/app/src/main/res/drawable-xhdpi/dialog_full_light.9.png b/Clover/app/src/main/res/drawable-xhdpi/dialog_full_light.9.png deleted file mode 100644 index d9bd3375fd4cad8696585d302aa1612061fd65c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2231 zcmV;o2uSydP)%{LKI6CYzUMqAqYSy`#uRm zRskA;5YPyO0H6^F0YD=V0)R#!1OPBxQa?+-5kW`?u6-k*s}b4+UqqG{?T@S%If4$( za!g0r2FW!-jsfgGIi{cyh$bf7*!xAjEww#${3UHhXcKUeShmM^jTU5m@vi!MS+}ue zO{*bNM)1Vy30)hYjBJnfNkb5g6{$?fX$r0x=(J? zmoaYoTvz>n6GAwxs_Ngv!^5ARJ$rU|aBy%6|LUJAzAwoc`;VnU!}`4;fa2ib;QI#; z9{jkyz5QJX0n_Oeq<>aj(2FA9s60JA{p0oP*S|b^^yp8_L|$QLgbK}+NdzfTL%56{ zsWb?2Edo%MW%*?YfhHg~N(ceN;qWWWGZz`0(K?-)_oDX^^iY#v>jHV{ zh%msc78p(@le>e#0EFB$MN!-Zu!Y&xADD|>r$Ks%6>!Xu`xti27y|$UMg!6pweALJ zj#%1J%2rZ$mR-?f9tj2j?j-skh_)KRiw1hsNM3~WiPoZh>LIIE zNJRv1=+s7q4cvme$mF9(G&n{xMbg@ZX|p3j$_%ni97sr?$OYPa7S5(bE;-K{c@Ndu zs6a@cY+!bUA7VCAq>Ul^O^)x|t9jeAN8acWBLe9gt4FUcNNGDN;@HSh?A`()eG?VS=Jrd=s-xHc;9#F^qrS3!>6&dh!KJGjg1B=W4Pp|Mlj3SA3(?r&=v`< zof@T5B0D@qNMG1`pmU0plizzcBcx?SAge%3^x1WSXN1&2UWlO)NZ)kT<&|xVjQG$5 zWEIJ}gB+vl@F^j;jin5q60#Q12!wz}AOrx7KnMUDfe-*R0wDls1VRAN2!sHj5eNZ5 zBM<_BMj!+LjX($h8i5c1`9|PxzLVQZmUbBt2*F}Th)w=XNS|Cwm!1()op_Tv(+s3< z+?g^n_Xp4(5$pucc3sa@NJw9Z4pUm~^xLN~VuoNeAgh9>%WRFtj1UvMtm}DeC!J53 zkmVxtrs>Gw={9PNoQPmMx$@$Snxto1HQLre?3e0tB7sDM$-8&&KAfMQFZ@>!vItdG z;pF7x6txam=97Z(?J^XARr%a<>I!(59M=8<87bb8cSZ<{(QmTxuEqZcn;{5=|tUOjp8vo@=bshZXPL*g_0?tnoX_m~d0o$;%l^wamqq$rWdG4h>J7tNvNN?X+%B>h?q3p4Iz}>Q?%xa5Y*W03j6-qBQ}U#d2AHfV2hX z6F-mZ{R;I*4%Bh{HEkkTeTi@Vn&c!LGBvs6N74HK3kd9P|OhO zzN>nlG3GOIO2px`Q^cYpLcm<)7pko=j|?Nsv~^LpV_Y?eHU|(fgJ%S9$5=$L29f?G z5&-k5rKHIAjKHX{-gv2z7-5R05hOxXXbL|zbQ;rhgH%M2lm=>9?jnoOOVvtW;@UyI zEVV&V?_=k<0%(MF$EM*TX2~ujHIjCOX3cP++6nwr$v%(Npv$O{bfgWTQzc1_boyg! z0*MHE`cFax5vsJhxYb6`5kc1uZM8y_R7B9rlIBRrDpV_`5W!1LP@*|X)HeSuSzo+} zU<+p%MbfE~jS#v%@S;G}5IGUSo*>YS406@C1}QO*61pbvW=5wG)*EkxQj1uOP^mU0 z{M5*iOIt*+MU1?sheIX3(J9av^P0dG$6k?4Bdj+uy?Mp6PMP%Zsy0gM?(#wrK~7Ge zs2+;aW{`bK^PWTw9SLXzqKO$H78z`Wn3#P#MFYSWU}2WEcuTW9Kr{8R>oyfCoqh=s ztZ;J-;Tgo%7@i@5T1ehmj-8||>)}f;HYX%R_b3unC?Ge&H??Z;bRs78>8Am}>5jugQx195W^ z0;EOji8~buy#AsTAq1c(vJY@Oxz53aT$5{w7XU&i{sV+H)1k;Fq)h+-002ovPDHLk FV1h&Y8two9 diff --git a/Clover/app/src/main/res/drawable-xxhdpi/dialog_full_dark.9.png b/Clover/app/src/main/res/drawable-xxhdpi/dialog_full_dark.9.png deleted file mode 100644 index b029809dfbd57151bcc3b75145a96d9dc24356af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4143 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 F`!6v-GwA>T diff --git a/Clover/app/src/main/res/drawable/album_cell_info_background.xml b/Clover/app/src/main/res/drawable/album_cell_info_background.xml new file mode 100644 index 00000000..fc8ec281 --- /dev/null +++ b/Clover/app/src/main/res/drawable/album_cell_info_background.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/Clover/app/src/main/res/drawable/dialog_full_light.xml b/Clover/app/src/main/res/drawable/dialog_full_light.xml new file mode 100644 index 00000000..2c038d31 --- /dev/null +++ b/Clover/app/src/main/res/drawable/dialog_full_light.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/Clover/app/src/main/res/layout/cell_album_view.xml b/Clover/app/src/main/res/layout/cell_album_view.xml index 7f8d8e32..6272cd39 100644 --- a/Clover/app/src/main/res/layout/cell_album_view.xml +++ b/Clover/app/src/main/res/layout/cell_album_view.xml @@ -31,7 +31,7 @@ along with this program. If not, see . android:layout_width="match_parent" android:layout_height="32dp" android:layout_gravity="bottom" - android:background="#8a000000" + android:background="@drawable/album_cell_info_background" android:gravity="center_vertical" android:maxLines="2" android:paddingLeft="8dp" diff --git a/Clover/app/src/main/res/layout/layout_post_replies.xml b/Clover/app/src/main/res/layout/layout_post_replies.xml index c68cde92..c59414bc 100644 --- a/Clover/app/src/main/res/layout/layout_post_replies.xml +++ b/Clover/app/src/main/res/layout/layout_post_replies.xml @@ -26,10 +26,12 @@ along with this program. If not, see . android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:layout_margin="10dp" android:background="@drawable/dialog_full_light" + android:elevation="8dp" android:minWidth="320dp" android:orientation="vertical" - tools:ignore="UselessParent"> + tools:ignore="UnusedAttribute,UselessParent">