diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index 122885612..c4cf76521 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -790,7 +790,11 @@ public class AppProvider extends FDroidProvider { break; case RECENTLY_UPDATED: - sortOrder = getTableName() + "." + Cols.LAST_UPDATED + " DESC"; + String table = getTableName(); + String isNew = table + "." + Cols.LAST_UPDATED + " <= " + table + "." + Cols.ADDED + " DESC"; + String lastUpdated = table + "." + Cols.LAST_UPDATED + " DESC"; + sortOrder = lastUpdated + ", " + isNew; + selection = selection.add(queryRecentlyUpdated()); includeSwap = false; break; 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 f9213c5ca..cefe85d6f 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 @@ -23,32 +23,39 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import org.fdroid.fdroid.AppDetails; import org.fdroid.fdroid.AppDetails2; -import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.views.apps.FeatureImage; -import java.util.Date; - /** * The {@link AppCardController} can bind an app to several different layouts, as long as the layout * contains the following elements: * + {@link R.id#icon} ({@link ImageView}, required) * + {@link R.id#summary} ({@link TextView}, required) + * + {@link R.id#new_tag} ({@link TextView}, optional) * + {@link R.id#featured_image} ({@link ImageView}, optional) - * + {@link R.id#status} ({@link TextView}, optional) */ public class AppCardController extends RecyclerView.ViewHolder implements ImageLoadingListener, View.OnClickListener { @NonNull private final ImageView icon; + /** + * Text starting with the app name (in bold) followed by a short summary of the app. + */ @NonNull private final TextView summary; + /** + * A little blue tag which says "New" to indicate an app was added to the repository recently. + */ @Nullable - private final TextView status; + private final TextView newTag; + /** + * Wide and short image for branding the app. If it is not present in the metadata then F-Droid + * will draw some abstract art instead. + */ @Nullable private final FeatureImage featuredImage; @@ -58,20 +65,16 @@ public class AppCardController extends RecyclerView.ViewHolder implements ImageL private final Activity activity; private final DisplayImageOptions displayImageOptions; - private final Date recentCuttoffDate; - public AppCardController(Activity activity, View itemView) { super(itemView); this.activity = activity; - recentCuttoffDate = Preferences.get().calcMaxHistory(); - icon = (ImageView) findViewAndEnsureNonNull(itemView, R.id.icon); summary = (TextView) findViewAndEnsureNonNull(itemView, R.id.summary); featuredImage = (FeatureImage) itemView.findViewById(R.id.featured_image); - status = (TextView) itemView.findViewById(R.id.status); + newTag = (TextView) itemView.findViewById(R.id.new_tag); displayImageOptions = Utils.getImageLoadingOptions().build(); @@ -99,15 +102,11 @@ public class AppCardController extends RecyclerView.ViewHolder implements ImageL summary.setText(Utils.formatAppNameAndSummary(app.name, app.summary)); - if (status != null) { - if (app.added != null && app.added.after(recentCuttoffDate) && (app.lastUpdated == null || app.added.equals(app.lastUpdated))) { - status.setText(activity.getString(R.string.category_Whats_New)); - status.setVisibility(View.VISIBLE); - } else if (app.lastUpdated != null && app.lastUpdated.after(recentCuttoffDate)) { - status.setText(activity.getString(R.string.category_Recently_Updated)); - status.setVisibility(View.VISIBLE); + if (newTag != null) { + if (app.added != null && app.lastUpdated != null && app.added.equals(app.lastUpdated)) { + newTag.setVisibility(View.VISIBLE); } else { - status.setVisibility(View.GONE); + newTag.setVisibility(View.GONE); } } diff --git a/app/src/main/res/drawable/app_tag_new_background.xml b/app/src/main/res/drawable/app_tag_new_background.xml new file mode 100644 index 000000000..1819a007e --- /dev/null +++ b/app/src/main/res/drawable/app_tag_new_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-v14/app_status_new.xml b/app/src/main/res/layout-v14/app_status_new.xml new file mode 100644 index 000000000..0b0e68f04 --- /dev/null +++ b/app/src/main/res/layout-v14/app_status_new.xml @@ -0,0 +1,17 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_card_featured.xml b/app/src/main/res/layout/app_card_featured.xml index 1164db874..d74565aac 100644 --- a/app/src/main/res/layout/app_card_featured.xml +++ b/app/src/main/res/layout/app_card_featured.xml @@ -66,19 +66,14 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - diff --git a/app/src/main/res/layout/app_card_horizontal.xml b/app/src/main/res/layout/app_card_horizontal.xml index d1bfd0e92..3fa5c99de 100644 --- a/app/src/main/res/layout/app_card_horizontal.xml +++ b/app/src/main/res/layout/app_card_horizontal.xml @@ -27,7 +27,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/summary" - android:lines="4" + android:maxLines="4" android:textSize="13sp" android:ellipsize="end" android:layout_marginLeft="8dp" @@ -36,18 +36,14 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintStart_toStartOf="@+id/summary" + app:layout_constraintLeft_toLeftOf="@+id/summary" /> diff --git a/app/src/main/res/layout/app_card_large.xml b/app/src/main/res/layout/app_card_large.xml index 9c48664e8..f0ea45430 100644 --- a/app/src/main/res/layout/app_card_large.xml +++ b/app/src/main/res/layout/app_card_large.xml @@ -42,18 +42,14 @@ app:layout_constraintLeft_toLeftOf="parent" android:layout_marginTop="8dp" /> - + android:id="@+id/new_tag" + android:layout_marginTop="4dp" + app:layout_constraintTop_toBottomOf="@+id/summary" + app:layout_constraintStart_toStartOf="@+id/summary" + app:layout_constraintLeft_toLeftOf="@+id/summary" /> diff --git a/app/src/main/res/layout/app_card_list_item.xml b/app/src/main/res/layout/app_card_list_item.xml index 7c36310d2..4c550ee1a 100644 --- a/app/src/main/res/layout/app_card_list_item.xml +++ b/app/src/main/res/layout/app_card_list_item.xml @@ -37,20 +37,14 @@ app:layout_constraintTop_toTopOf="parent" tools:layout_editor_absoluteY="8dp" /> - + app:layout_constraintStart_toStartOf="@+id/summary" + app:layout_constraintLeft_toLeftOf="@+id/summary" /> diff --git a/app/src/main/res/layout/app_status_new.xml b/app/src/main/res/layout/app_status_new.xml new file mode 100644 index 000000000..796aa6229 --- /dev/null +++ b/app/src/main/res/layout/app_status_new.xml @@ -0,0 +1,16 @@ + + \ 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 b7bdc2516..2ba9f1db1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,6 +66,7 @@ Version %1$s available Version %1$s Version %1$s (Recommended) + New Installed Apps Updates ignored