diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/CategorySpan.java b/app/src/main/java/org/fdroid/fdroid/views/apps/CategorySpan.java index bbfbfe9a7..d2c145f58 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/CategorySpan.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/CategorySpan.java @@ -107,7 +107,7 @@ public class CategorySpan extends ReplacementSpan { // The background which goes behind the text. Paint backgroundPaint = new Paint(); - backgroundPaint.setColor(CategoryController.getBackgroundColour(categoryName.toString())); + backgroundPaint.setColor(CategoryController.getBackgroundColour(context, categoryName.toString())); backgroundPaint.setAntiAlias(true); canvas.drawRoundRect(backgroundRect, cornerRadius, cornerRadius, backgroundPaint); 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 d18dc6bb1..403aa2587 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 @@ -9,6 +9,7 @@ import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.LoaderManager; +import android.support.v4.content.ContextCompat; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.view.ViewCompat; @@ -16,6 +17,7 @@ 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 org.fdroid.fdroid.R; @@ -28,6 +30,7 @@ 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 AppPreviewAdapter appCardsAdapter; private final FrameLayout background; @@ -48,7 +51,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); background = (FrameLayout) itemView.findViewById(R.id.category_background); RecyclerView appCards = (RecyclerView) itemView.findViewById(R.id.app_cards); @@ -58,25 +61,47 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade void bindModel(@NonNull String categoryName) { currentCategory = categoryName; - heading.setText(translateCategory(categoryName)); + + int categoryNameId = getCategoryResource(activity, categoryName, "string", false); + String translatedName = categoryNameId == 0 ? categoryName : activity.getString(categoryNameId); + heading.setText(translatedName); + viewAll.setVisibility(View.INVISIBLE); + loaderManager.initLoader(currentCategory.hashCode(), null, this); loaderManager.initLoader(currentCategory.hashCode() + 1, null, this); - background.setBackgroundColor(getBackgroundColour(categoryName)); + background.setBackgroundColor(getBackgroundColour(activity, categoryName)); + + int categoryImageId = getCategoryResource(activity, categoryName, "drawable", true); + if (categoryImageId == 0) { + image.setVisibility(View.GONE); + } else { + image.setVisibility(View.VISIBLE); + image.setImageDrawable(ContextCompat.getDrawable(activity, categoryImageId)); + } } /** - * Attempt to translate category name with fallback to default name if no translation available + * @param requiresLowerCaseId Previously categories were translated using strings such as "category_Reading" for + * the "Reading" category. Now we also need to have drawable resources such as + * "category_reading". Note how drawables must have only lower case letters, whereas + * we already have upper case letters in strings.xml. Hence this flag. */ - private String translateCategory(@NonNull String categoryName) { - String resId = categoryName.replace(" & ", "_").replace(" ", "_").replace("'", ""); - int id = activity.getResources().getIdentifier("category_" + resId, "string", activity.getPackageName()); - return id == 0 ? categoryName : activity.getString(id); - + private static int getCategoryResource(Context context, @NonNull String categoryName, String resourceType, boolean requiresLowerCaseId) { + String suffix = categoryName.replace(" & ", "_").replace(" ", "_").replace("'", ""); + if (requiresLowerCaseId) { + suffix = suffix.toLowerCase(); + } + return context.getResources().getIdentifier("category_" + suffix, resourceType, context.getPackageName()); } - public static int getBackgroundColour(@NonNull String categoryName) { + public static int getBackgroundColour(Context context, @NonNull String categoryName) { + int colourId = getCategoryResource(context, categoryName, "color", false); + if (colourId > 0) { + return ContextCompat.getColor(context, colourId); + } + // Seed based on the categoryName, so that each time we try to choose a colour for the same // category it will look the same for each different user, and each different session. Random random = new Random(categoryName.toLowerCase().hashCode()); diff --git a/app/src/main/res/drawable/category_connectivity.png b/app/src/main/res/drawable/category_connectivity.png new file mode 100644 index 000000000..716b40123 Binary files /dev/null and b/app/src/main/res/drawable/category_connectivity.png differ diff --git a/app/src/main/res/drawable/category_development.png b/app/src/main/res/drawable/category_development.png new file mode 100644 index 000000000..1090030ad Binary files /dev/null and b/app/src/main/res/drawable/category_development.png differ diff --git a/app/src/main/res/drawable/category_graphics.png b/app/src/main/res/drawable/category_graphics.png new file mode 100644 index 000000000..f434775d0 Binary files /dev/null and b/app/src/main/res/drawable/category_graphics.png differ diff --git a/app/src/main/res/drawable/category_internet.png b/app/src/main/res/drawable/category_internet.png new file mode 100644 index 000000000..716b40123 Binary files /dev/null and b/app/src/main/res/drawable/category_internet.png differ diff --git a/app/src/main/res/drawable/category_money.png b/app/src/main/res/drawable/category_money.png new file mode 100644 index 000000000..c28c26ddf Binary files /dev/null and b/app/src/main/res/drawable/category_money.png differ diff --git a/app/src/main/res/drawable/category_navigation.png b/app/src/main/res/drawable/category_navigation.png new file mode 100644 index 000000000..0aabe7b29 Binary files /dev/null and b/app/src/main/res/drawable/category_navigation.png differ diff --git a/app/src/main/res/drawable/category_reading.png b/app/src/main/res/drawable/category_reading.png new file mode 100644 index 000000000..6b34b55e2 Binary files /dev/null and b/app/src/main/res/drawable/category_reading.png differ diff --git a/app/src/main/res/drawable/category_science_education.png b/app/src/main/res/drawable/category_science_education.png new file mode 100644 index 000000000..0895f1b5a Binary files /dev/null and b/app/src/main/res/drawable/category_science_education.png differ diff --git a/app/src/main/res/drawable/category_security.png b/app/src/main/res/drawable/category_security.png new file mode 100644 index 000000000..e9b3941d3 Binary files /dev/null and b/app/src/main/res/drawable/category_security.png differ diff --git a/app/src/main/res/drawable/category_system.png b/app/src/main/res/drawable/category_system.png new file mode 100644 index 000000000..6eba35151 Binary files /dev/null and b/app/src/main/res/drawable/category_system.png differ diff --git a/app/src/main/res/drawable/category_theming.png b/app/src/main/res/drawable/category_theming.png new file mode 100644 index 000000000..afa70277f Binary files /dev/null and b/app/src/main/res/drawable/category_theming.png differ diff --git a/app/src/main/res/drawable/category_writing.png b/app/src/main/res/drawable/category_writing.png new file mode 100644 index 000000000..7f143cb69 Binary files /dev/null and b/app/src/main/res/drawable/category_writing.png differ diff --git a/app/src/main/res/layout/category_item.xml b/app/src/main/res/layout/category_item.xml index d2e516f80..667b801c2 100644 --- a/app/src/main/res/layout/category_item.xml +++ b/app/src/main/res/layout/category_item.xml @@ -50,14 +50,19 @@ app:layout_constraintBottom_toBottomOf="@+id/app_cards" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - tools:background="#ffffbbbb"/> + tools:background="#ffffbbbb" /> + android:layout_marginRight="8dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d3e57d942..b7025b7d9 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,6 +5,24 @@ #ff999999 #ffdd2c00 + #CBEFEC + #E2D6BC + #6D6862 + #F25050 + #DBDDC9 + #DDDDD0 + #FF7F66 + #94D6FD + #F3CFC0 + #D6A07A + #F4F4EC + #6D6862 + #72C7EA + #D3DB77 + #DEEFE9 + #FF7043 + #F2E9CE + #ff1976d2 #ff0d47a1 #ff042570