diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 3d146d645..957746579 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -101,7 +101,7 @@ public final class Utils { // The date format used for storing dates (e.g. lastupdated, added) in the // database. - private static final SimpleDateFormat DATE_FORMAT = + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); private static final SimpleDateFormat TIME_FORMAT = 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 389555883..04f450ea5 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -506,6 +506,9 @@ public class AppProvider extends FDroidProvider { return Uri.withAppendedPath(getContentUri(), PATH_CALC_SUGGESTED_APKS); } + /** + * Get all {@link App} entries in the given {@code category} + */ public static Uri getCategoryUri(String category) { return getContentUri().buildUpon() .appendPath(PATH_CATEGORY) @@ -519,6 +522,13 @@ public class AppProvider extends FDroidProvider { .build(); } + /** + * Get the top {@link App} entries in the given {@code category} to display + * in the overview screen in {@link org.fdroid.fdroid.views.categories.CategoryController}. + * The number of entries is defined by {@code limit}. + * + * @see org.fdroid.fdroid.views.categories.CategoryController#onCreateLoader(int, android.os.Bundle) + */ public static Uri getTopFromCategoryUri(String category, int limit) { return getContentUri().buildUpon() .appendPath(PATH_TOP_FROM_CATEGORY) @@ -842,7 +852,6 @@ public class AppProvider extends FDroidProvider { case TOP_FROM_CATEGORY: selection = selection.add(queryCategory(pathSegments.get(2))); limit = Integer.parseInt(pathSegments.get(1)); - sortOrder = getTableName() + "." + Cols.LAST_UPDATED + " DESC"; includeSwap = false; break; @@ -881,6 +890,12 @@ public class AppProvider extends FDroidProvider { /** * Helper method used by both the genuine {@link AppProvider} and the temporary version used * by the repo updater ({@link TempAppProvider}). + *
+ * Query the database table specified by {@code uri}, which is usually (always?)
+ * {@link AppMetadataTable} with specified {@code selection} and {@code sortOrder}.
+ * WARNING: This contains a hack if {@code sortOrder} is equal to {@link Cols#NAME},
+ * i.e. not a complete table.column name, but just that single column name. In that case,
+ * a {@code sortOrder} is built out into a {@code sortOrder} that includes localized sorting.
*/
protected Cursor runQuery(Uri uri, AppQuerySelection selection, String[] projection, boolean includeSwap, String sortOrder, int limit) {
if (!includeSwap) {
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 a0997b4cf..a0c2ffe94 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
@@ -1,6 +1,5 @@
package org.fdroid.fdroid.views.categories;
-import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -8,18 +7,19 @@ import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.loader.app.LoaderManager;
-import androidx.core.content.ContextCompat;
-import androidx.loader.content.CursorLoader;
-import androidx.loader.content.Loader;
-import androidx.core.view.ViewCompat;
-import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.CursorLoader;
+import androidx.loader.content.Loader;
+import androidx.recyclerview.widget.RecyclerView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
@@ -27,6 +27,7 @@ import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Schema;
+import org.fdroid.fdroid.data.Schema.AppMetadataTable.Cols;
import org.fdroid.fdroid.views.apps.AppListActivity;
import org.fdroid.fdroid.views.apps.FeatureImage;
@@ -133,9 +134,24 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade
return Color.HSVToColor(hsv);
}
+ /**
+ * Return either the total apps in the category, or the entries to display
+ * for a category, depending on the value of {@code id}. This uses a sort
+ * similar to the one in {@link org.fdroid.fdroid.views.main.LatestViewBinder#onCreateLoader(int, Bundle)}.
+ * The difference is that this does not treat "new" app any differently.
+ *
+ * @see AppProvider#getCategoryUri(String)
+ * @see AppProvider#getTopFromCategoryUri(String, int)
+ * @see AppProvider#query(android.net.Uri, String[], String, String[], String)
+ * @see AppProvider#TOP_FROM_CATEGORY
+ * @see org.fdroid.fdroid.views.main.LatestViewBinder#onCreateLoader(int, Bundle)
+ */
@NonNull
@Override
public Loader