SuchABot has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/68662


Change subject: Maintain max width / height info to speed up image downloading
......................................................................

Maintain max width / height info to speed up image downloading

If we ever download an image's original, we'll save its width and
height. This ensures that we don't try to fetch thumbnails that are
larger than the image itself too often, reducing 500s and improving
performance much.

TODO: Save image's width / height during upload process itself

Change-Id: Ice11cfabab96999b0d07b965d4515b47c1fff428
GitHub: https://github.com/wikimedia/apps-android-commons/pull/8
---
M commons/src/main/java/org/wikimedia/commons/Media.java
M commons/src/main/java/org/wikimedia/commons/MediaWikiImageView.java
M commons/src/main/java/org/wikimedia/commons/category/Category.java
M commons/src/main/java/org/wikimedia/commons/contributions/Contribution.java
M commons/src/main/java/org/wikimedia/commons/data/DBOpenHelper.java
5 files changed, 70 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/commons 
refs/changes/62/68662/1

diff --git a/commons/src/main/java/org/wikimedia/commons/Media.java 
b/commons/src/main/java/org/wikimedia/commons/Media.java
index cfe177c..9ff0126 100644
--- a/commons/src/main/java/org/wikimedia/commons/Media.java
+++ b/commons/src/main/java/org/wikimedia/commons/Media.java
@@ -103,6 +103,22 @@
         return Utils.makeThumbUrl(imageUrl, filename, width);
     }
 
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public void setHeight(int height) {
+        this.height = height;
+    }
+
     protected Uri localUri;
     protected String imageUrl;
     protected String filename;
@@ -110,6 +126,8 @@
     protected long dataLength;
     protected Date dateCreated;
     protected Date dateUploaded;
+    protected int width;
+    protected int height;
 
 
     protected String creator;
diff --git 
a/commons/src/main/java/org/wikimedia/commons/MediaWikiImageView.java 
b/commons/src/main/java/org/wikimedia/commons/MediaWikiImageView.java
index afa95d8..c69fe55 100644
--- a/commons/src/main/java/org/wikimedia/commons/MediaWikiImageView.java
+++ b/commons/src/main/java/org/wikimedia/commons/MediaWikiImageView.java
@@ -27,6 +27,8 @@
 import com.android.volley.toolbox.ImageLoader;
 import com.android.volley.toolbox.ImageLoader.ImageContainer;
 import com.android.volley.toolbox.ImageLoader.ImageListener;
+import org.wikimedia.commons.contributions.Contribution;
+import org.wikimedia.commons.contributions.ContributionsContentProvider;
 
 
 public class MediaWikiImageView extends ImageView {
@@ -86,7 +88,15 @@
             // Possible a similar size image has already been generated.
             // Reduces Server cache fragmentation, also increases chance of 
cache hit
             // If width is less than 320, we just use that directly, to avoid 
a case of the Maths
-            mUrl = mMedia.getThumbnailUrl(width <= 320 ? width : (width / 320) 
* 320);
+            int bucketedWidth = width <= 320 ? width: (width / 320) * 320;
+            if(mMedia.getWidth() != -0 && mMedia.getWidth() < bucketedWidth) {
+                // If we know that the width of the image is lesser than the 
required width
+                // We don't even try to load the thumbnai, go directly to the 
source
+                loadImageIfNecessary(isInLayoutPass, true);
+                return;
+            } else {
+                mUrl = mMedia.getThumbnailUrl(width <= 320 ? width : (width / 
320) * 320);
+            }
         }
 
         // if the URL to be loaded in this view is empty, cancel any old 
requests and clear the
@@ -151,11 +161,15 @@
                             return;
                         }
 
-
-                        Log.d("Commons", "No-Error: For Url " + mUrl + " value 
is " + tryOriginal);
-
                         if (response.getBitmap() != null) {
                             setImageBitmap(response.getBitmap());
+                            if(tryOriginal && mMedia instanceof Contribution 
&& response.getBitmap().getWidth() > mMedia.getWidth() || 
response.getBitmap().getHeight() > mMedia.getHeight()) {
+                                // If there is no width information for this 
image, save it. This speeds up image loading massively for smaller images
+                                
mMedia.setHeight(response.getBitmap().getHeight());
+                                
mMedia.setWidth(response.getBitmap().getWidth());
+                                
((Contribution)mMedia).setContentProviderClient(MediaWikiImageView.this.getContext().getContentResolver().acquireContentProviderClient(ContributionsContentProvider.AUTHORITY));
+                                ((Contribution)mMedia).save();
+                            }
                             if(loadingView != null) {
                                 loadingView.setVisibility(View.GONE);
                             }
diff --git a/commons/src/main/java/org/wikimedia/commons/category/Category.java 
b/commons/src/main/java/org/wikimedia/commons/category/Category.java
index ae20458..8aaf7e2 100644
--- a/commons/src/main/java/org/wikimedia/commons/category/Category.java
+++ b/commons/src/main/java/org/wikimedia/commons/category/Category.java
@@ -134,6 +134,14 @@
             if(from == 4) {
                 // table added in version 5
                 onCreate(db);
+                from++;
+                onUpdate(db, from, to);
+                return;
+            }
+            if(from == 5) {
+                from++;
+                onUpdate(db, from, to);
+                return;
             }
         }
     }
diff --git 
a/commons/src/main/java/org/wikimedia/commons/contributions/Contribution.java 
b/commons/src/main/java/org/wikimedia/commons/contributions/Contribution.java
index c10727f..25e0554 100644
--- 
a/commons/src/main/java/org/wikimedia/commons/contributions/Contribution.java
+++ 
b/commons/src/main/java/org/wikimedia/commons/contributions/Contribution.java
@@ -189,6 +189,8 @@
         cv.put(Table.COLUMN_DESCRIPTION, description);
         cv.put(Table.COLUMN_CREATOR, creator);
         cv.put(Table.COLUMN_MULTIPLE, isMultiple ? 1 : 0);
+        cv.put(Table.COLUMN_WIDTH, width);
+        cv.put(Table.COLUMN_HEIGHT, height);
         return cv;
     }
 
@@ -220,6 +222,9 @@
         c.description = cursor.getString(10);
         c.creator = cursor.getString(11);
         c.isMultiple = cursor.getInt(12) == 1;
+        c.width = cursor.getInt(13);
+        c.height = cursor.getInt(14);
+
         return c;
     }
 
@@ -252,6 +257,8 @@
         public static final String COLUMN_DESCRIPTION = "description";
         public static final String COLUMN_CREATOR = "creator"; // Initial 
uploader
         public static final String COLUMN_MULTIPLE = "multiple";
+        public static final String COLUMN_WIDTH = "width";
+        public static final String COLUMN_HEIGHT = "height";
 
         // NOTE! KEEP IN SAME ORDER AS THEY ARE DEFINED UP THERE. HELPS HARD 
CODE COLUMN INDICES.
         public static final String[] ALL_FIELDS = {
@@ -267,7 +274,9 @@
                 COLUMN_SOURCE,
                 COLUMN_DESCRIPTION,
                 COLUMN_CREATOR,
-                COLUMN_MULTIPLE
+                COLUMN_MULTIPLE,
+                COLUMN_WIDTH,
+                COLUMN_HEIGHT
         };
 
 
@@ -284,7 +293,9 @@
                 + "source STRING,"
                 + "description STRING,"
                 + "creator STRING,"
-                + "multiple INTEGER"
+                + "multiple INTEGER,"
+                + "width INTEGER,"
+                + "height INTEGER"
         + ");";
 
 
@@ -313,11 +324,23 @@
             if(from == 3) {
                 // Do nothing
                 from++;
+                onUpdate(db, from, to);
                 return;
             }
             if(from == 4) {
                 // Do nothing -- added Category
                 from++;
+                onUpdate(db, from, to);
+                return;
+            }
+            if(from == 5) {
+                // Added width and height fields
+                db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN width 
INTEGER;");
+                db.execSQL("UPDATE " + TABLE_NAME + " SET width = 0");
+                db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN height 
INTEGER;");
+                db.execSQL("UPDATE " + TABLE_NAME + " SET height = 0");
+                from++;
+                onUpdate(db, from, to);
                 return;
             }
         }
diff --git a/commons/src/main/java/org/wikimedia/commons/data/DBOpenHelper.java 
b/commons/src/main/java/org/wikimedia/commons/data/DBOpenHelper.java
index 4430ac5..af68065 100644
--- a/commons/src/main/java/org/wikimedia/commons/data/DBOpenHelper.java
+++ b/commons/src/main/java/org/wikimedia/commons/data/DBOpenHelper.java
@@ -10,7 +10,7 @@
 public class DBOpenHelper  extends SQLiteOpenHelper{
 
     private static final String DATABASE_NAME = "commons.db";
-    private static final int DATABASE_VERSION = 5;
+    private static final int DATABASE_VERSION = 6;
 
     public DBOpenHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);

-- 
To view, visit https://gerrit.wikimedia.org/r/68662
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ice11cfabab96999b0d07b965d4515b47c1fff428
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/commons
Gerrit-Branch: master
Gerrit-Owner: SuchABot <[email protected]>
Gerrit-Reviewer: Yuvipanda <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to