From bc1ff7d8c88cfdc37384ca37dde73dcfba865879 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Fri, 17 Mar 2017 09:15:47 +1100 Subject: [PATCH] Show abstract art behind categories without predefined images. In the process refactored the FeatureImage class to not be dependant on an instance of Palette for its colours. --- .../main/java/org/fdroid/fdroid/AppDetails2.java | 3 ++- .../fdroid/fdroid/views/apps/FeatureImage.java | 16 ++++++++-------- .../views/categories/AppCardController.java | 5 +++-- .../views/categories/CategoryController.java | 15 +++++++++------ app/src/main/res/layout/category_item.xml | 2 +- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index ffb259ce8..24c9701e1 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -10,6 +10,7 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.CoordinatorLayout; @@ -108,7 +109,7 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog new Palette.Builder(loadedImage).generate(new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { - featureImage.setPalette(palette); + featureImage.setColour(palette.getDominantColor(Color.LTGRAY)); } }); } diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/FeatureImage.java b/app/src/main/java/org/fdroid/fdroid/views/apps/FeatureImage.java index b43dc2bb9..08dd3cdcd 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/FeatureImage.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/FeatureImage.java @@ -8,7 +8,9 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; +import android.graphics.PorterDuff; import android.os.Build; +import android.support.annotation.ColorInt; import android.support.annotation.Nullable; import android.support.v7.graphics.Palette; import android.support.v7.widget.AppCompatImageView; @@ -71,8 +73,8 @@ public class FeatureImage extends AppCompatImageView { * then creates a second variation that is slightly dimmer still. These two colours are then * randomly allocated to each triangle which is expected to be rendered. */ - public void setPalette(@Nullable Palette palette) { - if (palette == null) { + public void setColour(@ColorInt int colour) { + if (colour == 0) { trianglePaints = null; return; } @@ -80,7 +82,7 @@ public class FeatureImage extends AppCompatImageView { // It is easier to dull al colour in the HSV space, so convert to that then adjust the // saturation down and the colour value down. float[] hsv = new float[3]; - Color.colorToHSV(palette.getDominantColor(Color.LTGRAY), hsv); + Color.colorToHSV(colour, hsv); hsv[1] *= 0.5f; hsv[2] *= 0.7f; int colourOne = Color.HSVToColor(hsv); @@ -187,9 +189,8 @@ public class FeatureImage extends AppCompatImageView { /** * First try to draw whatever image was given to this view. If that doesn't exist, try to draw - * a geometric pattern based on the palette that was given to us. If we haven't had a palette - * assigned to us (using {@link FeatureImage#setPalette(Palette)}) then clear the - * view by filling it with white. + * a geometric pattern based on the palette that was given to us. If we haven't had a colour + * assigned to us (using {@link #setColour(int)}) then clear the view by filling it with white. */ @Override protected void onDraw(Canvas canvas) { @@ -200,12 +201,11 @@ public class FeatureImage extends AppCompatImageView { paint.setAlpha(currentAlpha); } - canvas.drawRect(0, 0, getWidth(), getHeight(), WHITE_PAINT); for (int i = 0; i < triangles.length; i++) { canvas.drawPath(triangles[i], trianglePaints[i]); } } else { - canvas.drawRect(0, 0, getWidth(), getHeight(), WHITE_PAINT); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); } } diff --git a/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java b/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java index cefe85d6f..bf80ab41a 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java @@ -3,6 +3,7 @@ package org.fdroid.fdroid.views.categories; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.annotation.IdRes; @@ -111,7 +112,7 @@ public class AppCardController extends RecyclerView.ViewHolder implements ImageL } if (featuredImage != null) { - featuredImage.setPalette(null); + featuredImage.setColour(0); featuredImage.setImageDrawable(null); } @@ -154,7 +155,7 @@ public class AppCardController extends RecyclerView.ViewHolder implements ImageL new Palette.Builder(loadedImage).generate(new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { - featuredImage.setPalette(palette); + featuredImage.setColour(palette.getDominantColor(Color.LTGRAY)); } }); } diff --git a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java index dda8778c5..aeb65eedd 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java @@ -8,6 +8,7 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Rect; import android.os.Bundle; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.v4.app.LoaderManager; import android.support.v4.content.ContextCompat; @@ -18,7 +19,6 @@ import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; -import android.widget.ImageView; import android.widget.TextView; import com.nostra13.universalimageloader.core.DisplayImageOptions; @@ -30,13 +30,14 @@ import org.fdroid.fdroid.R; import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.views.apps.AppListActivity; +import org.fdroid.fdroid.views.apps.FeatureImage; import java.util.Random; public class CategoryController extends RecyclerView.ViewHolder implements LoaderManager.LoaderCallbacks { private final Button viewAll; private final TextView heading; - private final ImageView image; + private final FeatureImage image; private final AppPreviewAdapter appCardsAdapter; private final FrameLayout background; @@ -58,7 +59,7 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade viewAll.setOnClickListener(onViewAll); heading = (TextView) itemView.findViewById(R.id.name); - image = (ImageView) itemView.findViewById(R.id.category_image); + image = (FeatureImage) itemView.findViewById(R.id.category_image); background = (FrameLayout) itemView.findViewById(R.id.category_background); RecyclerView appCards = (RecyclerView) itemView.findViewById(R.id.app_cards); @@ -85,13 +86,15 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade loaderManager.initLoader(currentCategory.hashCode(), null, this); loaderManager.initLoader(currentCategory.hashCode() + 1, null, this); - background.setBackgroundColor(getBackgroundColour(activity, categoryName)); + @ColorInt int backgroundColour = getBackgroundColour(activity, categoryName); + background.setBackgroundColor(backgroundColour); int categoryImageId = getCategoryResource(activity, categoryName, "drawable", true); if (categoryImageId == 0) { - image.setVisibility(View.GONE); + image.setColour(backgroundColour); + image.setImageDrawable(null); } else { - image.setVisibility(View.VISIBLE); + image.setColour(0); ImageLoader.getInstance().displayImage("drawable://" + categoryImageId, image, displayImageOptions); } } diff --git a/app/src/main/res/layout/category_item.xml b/app/src/main/res/layout/category_item.xml index ffc22b8b4..100142f88 100644 --- a/app/src/main/res/layout/category_item.xml +++ b/app/src/main/res/layout/category_item.xml @@ -52,7 +52,7 @@ app:layout_constraintEnd_toEndOf="parent" tools:background="#ffffbbbb" /> -