From 510ec5f7c773f5f4712fe0ec81551d65d5cf31b9 Mon Sep 17 00:00:00 2001
From: Peter Serwylo <peter@serwylo.com>
Date: Wed, 5 Apr 2017 12:03:50 +1000
Subject: [PATCH] Adding ability to query last repo update and number of repos.

This will be used to improve the empty state handling of the main list
of latest apps.
---
 .../org/fdroid/fdroid/data/RepoProvider.java  | 35 ++++++++++++
 .../fdroid/fdroid/data/RepoProviderTest.java  | 53 +++++++++++++++++++
 2 files changed, 88 insertions(+)

diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java
index e8491f00b..ac0dd0198 100644
--- a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java
+++ b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java
@@ -16,6 +16,7 @@ import org.fdroid.fdroid.data.Schema.RepoTable;
 import org.fdroid.fdroid.data.Schema.RepoTable.Cols;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 public class RepoProvider extends FDroidProvider {
@@ -251,6 +252,40 @@ public class RepoProvider extends FDroidProvider {
             }
             return count;
         }
+
+        @Nullable
+        public static Date lastUpdate(Context context) {
+            ContentResolver resolver = context.getContentResolver();
+            final String[] projection = {Cols.LAST_UPDATED};
+            final String selection = Cols.IN_USE + " = 1";
+            Cursor cursor = resolver.query(getContentUri(), projection, selection, null, Cols.LAST_UPDATED + " DESC");
+
+            Date lastUpdate = null;
+            if (cursor != null) {
+                if (cursor.getCount() > 0) {
+                    cursor.moveToFirst();
+                    lastUpdate = Utils.parseDate(cursor.getString(0), null);
+                }
+                cursor.close();
+            }
+
+            return lastUpdate;
+        }
+
+        public static int countEnabledRepos(Context context) {
+            ContentResolver resolver = context.getContentResolver();
+            final String[] projection = {Cols._ID};
+            final String selection = Cols.IN_USE + " = 1";
+            Cursor cursor = resolver.query(getContentUri(), projection, selection, null, null);
+
+            int count = 0;
+            if (cursor != null) {
+                count = cursor.getCount();
+                cursor.close();
+            }
+
+            return count;
+        }
     }
 
     private static final String PROVIDER_NAME = "RepoProvider";
diff --git a/app/src/test/java/org/fdroid/fdroid/data/RepoProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/RepoProviderTest.java
index ae6495920..2570ade73 100644
--- a/app/src/test/java/org/fdroid/fdroid/data/RepoProviderTest.java
+++ b/app/src/test/java/org/fdroid/fdroid/data/RepoProviderTest.java
@@ -36,6 +36,7 @@ import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
+import java.util.Date;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -48,6 +49,58 @@ public class RepoProviderTest extends FDroidProviderTest {
 
     private static final String[] COLS = RepoTable.Cols.ALL;
 
+    @Test
+    public void countEnabledRepos() {
+
+        // By default, f-droid is enabled.
+        assertEquals(1, RepoProvider.Helper.countEnabledRepos(context));
+
+        Repo gpRepo = RepoProvider.Helper.findByAddress(context, "https://guardianproject.info/fdroid/repo");
+        gpRepo = setEnabled(gpRepo, true);
+        assertEquals(2, RepoProvider.Helper.countEnabledRepos(context));
+
+        Repo fdroidRepo = RepoProvider.Helper.findByAddress(context, "https://f-droid.org/repo");
+        setEnabled(fdroidRepo, false);
+        setEnabled(gpRepo, false);
+
+        assertEquals(0, RepoProvider.Helper.countEnabledRepos(context));
+    }
+
+    private Repo setEnabled(Repo repo, boolean enabled) {
+        ContentValues enable = new ContentValues(1);
+        enable.put(RepoTable.Cols.IN_USE, enabled);
+        RepoProvider.Helper.update(context, repo, enable);
+        return RepoProvider.Helper.findByAddress(context, repo.address);
+    }
+
+    @Test
+    public void lastUpdated() {
+        assertNull(RepoProvider.Helper.lastUpdate(context));
+
+        Repo gpRepo = RepoProvider.Helper.findByAddress(context, "https://guardianproject.info/fdroid/repo");
+
+        // Set date to 2017-04-05 11:56:38
+        setLastUpdate(gpRepo, new Date(1491357408643L));
+
+        // GP is not yet enabled, so it is not counted.
+        assertNull(RepoProvider.Helper.lastUpdate(context));
+
+        // Set date to 2017-04-04 11:56:38
+        Repo fdroidRepo = RepoProvider.Helper.findByAddress(context, "https://f-droid.org/repo");
+        setLastUpdate(fdroidRepo, new Date(1491357408643L - (1000 * 60 * 60 * 24)));
+        assertEquals("2017-04-04", Utils.formatDate(RepoProvider.Helper.lastUpdate(context), null));
+
+        setEnabled(gpRepo, true);
+        assertEquals("2017-04-05", Utils.formatDate(RepoProvider.Helper.lastUpdate(context), null));
+    }
+
+    private Repo setLastUpdate(Repo repo, Date date) {
+        ContentValues values = new ContentValues(1);
+        values.put(RepoTable.Cols.LAST_UPDATED, Utils.formatDate(date, null));
+        RepoProvider.Helper.update(context, repo, values);
+        return RepoProvider.Helper.findByAddress(context, repo.address);
+    }
+
     @Test
     public void findByUrl() {