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