padding images with darken header color, remove outline artifacts behind thumbnail on card lists

This commit is contained in:
Katharine
2021-11-09 15:31:10 +08:00
parent 127d288ace
commit 1fd0acf6e4
3 changed files with 45 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.drawable.Drawable;
import android.util.SparseBooleanArray;
import android.util.TypedValue;
@@ -12,6 +13,7 @@ import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
@@ -73,6 +75,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
// Invisible until we want to show something more
inputHolder.mDivider.setVisibility(View.GONE);
// remove outline shadow
inputHolder.mThumbnailContainer.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
outline.setAlpha(0f);
}
});
int size = mSettings.getFontSizeMax(mSettings.getSmallFont());
if (mDarkModeEnabled) {
@@ -279,11 +290,13 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public MaterialCardView mRow;
public View mDivider;
public RelativeLayout mThumbnailFrontContainer, mThumbnailBackContainer;
public MaterialCardView mThumbnailContainer;
public LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener) {
super(inputView);
mRow = inputView.findViewById(R.id.row);
mDivider = inputView.findViewById(R.id.info_divider);
mThumbnailContainer = inputView.findViewById(R.id.thumbnail_container);
mThumbnailFrontContainer = inputView.findViewById(R.id.thumbnail_front);
mThumbnailBackContainer = inputView.findViewById(R.id.thumbnail_back);
mInformationContainer = inputView.findViewById(R.id.information_container);

View File

@@ -3,8 +3,10 @@ package protect.card_locker;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
@@ -12,8 +14,11 @@ import java.util.List;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.ColorUtils;
import androidx.core.graphics.drawable.IconCompat;
import org.jetbrains.annotations.NotNull;
class ShortcutHelper {
// Android documentation says that no more than 5 shortcuts
// are supported. However, that may be too many, as not all
@@ -22,6 +27,14 @@ class ShortcutHelper {
// chance of being shown.
private static final int MAX_SHORTCUTS = 3;
// https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html
private static final int ADAPTIVE_BITMAP_SCALE = 1;
private static final int ADAPTIVE_BITMAP_SIZE = 108 * ADAPTIVE_BITMAP_SCALE;
private static final int ADAPTIVE_BITMAP_VISIBLE_SIZE = 72 * ADAPTIVE_BITMAP_SCALE;
private static final int ADAPTIVE_BITMAP_IMAGE_SIZE = ADAPTIVE_BITMAP_VISIBLE_SIZE + 5 * ADAPTIVE_BITMAP_SCALE;
private static final int PADDING_COLOR = Color.argb(255, 255, 255, 255);
private static final int PADDING_COLOR_OVERLAY = Color.argb(127, 0, 0, 0);
/**
* Add a card to the app shortcuts, and maintain a list of the most
* recently used cards. If there is already a shortcut for the card,
@@ -106,6 +119,22 @@ class ShortcutHelper {
ShortcutManagerCompat.setDynamicShortcuts(context, list);
}
static @NotNull Bitmap createAdaptiveBitmap(@NotNull Bitmap in, int paddingColor){
int[] basePixels = new int[ADAPTIVE_BITMAP_SIZE * ADAPTIVE_BITMAP_SIZE];
paddingColor = ColorUtils.compositeColors(PADDING_COLOR_OVERLAY, paddingColor);
Arrays.fill(basePixels, paddingColor);
Bitmap ret = Bitmap.createBitmap(ADAPTIVE_BITMAP_SIZE, ADAPTIVE_BITMAP_SIZE, Bitmap.Config.ARGB_8888);
ret.setPixels(basePixels, 0, ADAPTIVE_BITMAP_SIZE, 0, 0, ADAPTIVE_BITMAP_SIZE, ADAPTIVE_BITMAP_SIZE);
Bitmap resized = Utils.resizeBitmap(in, ADAPTIVE_BITMAP_IMAGE_SIZE);
int[] inputPixels = new int[resized.getHeight() * resized.getWidth()];
resized.getPixels(inputPixels, 0, resized.getWidth(), 0, 0, resized.getWidth(), resized.getHeight());
for(int i = 0;i < inputPixels.length; i++) {
inputPixels[i] = ColorUtils.compositeColors(inputPixels[i], paddingColor);
}
ret.setPixels(inputPixels, 0, resized.getWidth(), (ADAPTIVE_BITMAP_SIZE - resized.getWidth()) / 2, (ADAPTIVE_BITMAP_SIZE - resized.getHeight()) / 2, resized.getWidth(), resized.getHeight());
return ret;
}
static ShortcutInfoCompat.Builder createShortcutBuilder(Context context, LoyaltyCard loyaltyCard) {
Intent intent = new Intent(context, LoyaltyCardViewActivity.class);
intent.setAction(Intent.ACTION_MAIN);
@@ -120,6 +149,8 @@ class ShortcutHelper {
Bitmap iconBitmap = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon);
if (iconBitmap == null) {
iconBitmap = Utils.generateIcon(context, loyaltyCard, true).getLetterTile();
}else{
iconBitmap = createAdaptiveBitmap(iconBitmap, loyaltyCard.headerColor == null ? PADDING_COLOR : loyaltyCard.headerColor);
}
IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap);