diff --git a/commons/pom.xml b/commons/pom.xml
index 86939fbe1..3f024c02e 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -35,6 +35,11 @@
de.akquinet.android.androlog
androlog
+
+ com.nostra13.universalimageloader
+ universal-image-loader
+ 1.7.1
+
diff --git a/commons/src/main/java/org/wikimedia/commons/CommonsApplication.java b/commons/src/main/java/org/wikimedia/commons/CommonsApplication.java
index edd8429b2..e6a3b7ed4 100644
--- a/commons/src/main/java/org/wikimedia/commons/CommonsApplication.java
+++ b/commons/src/main/java/org/wikimedia/commons/CommonsApplication.java
@@ -1,15 +1,21 @@
package org.wikimedia.commons;
import java.io.IOException;
+import java.io.InputStream;
import java.io.StringWriter;
+import java.net.URI;
import javax.xml.transform.*;
import android.accounts.*;
import android.app.Application;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
+import com.nostra13.universalimageloader.core.ImageLoader;
+import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
+import com.nostra13.universalimageloader.core.download.ImageDownloader;
import org.mediawiki.api.*;
import org.w3c.dom.Node;
import org.wikimedia.commons.auth.WikiAccountAuthenticator;
@@ -39,6 +45,21 @@ public class CommonsApplication extends Application {
return dbOpenHelper;
}
+ public class ContentUriImageDownloader extends ImageDownloader {
+
+ @Override
+ protected InputStream getStreamFromNetwork(URI uri) throws IOException {
+ return super.getStream(uri); // Pass back to parent code, which handles http, https, etc
+ }
+
+ @Override
+ protected InputStream getStreamFromOtherSource(URI imageUri) throws IOException {
+ if(imageUri.getScheme().equals("content")) {
+ return getContentResolver().openInputStream(Uri.parse(imageUri.toString()));
+ }
+ throw new RuntimeException("Not a content URI: " + imageUri);
+ }
+ }
@Override
public void onCreate() {
@@ -47,6 +68,11 @@ public class CommonsApplication extends Application {
// Fire progress callbacks for every 3% of uploaded content
System.setProperty("in.yuvi.http.fluent.PROGRESS_TRIGGER_THRESHOLD", "3.0");
api = createMWApi();
+
+
+ ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(getApplicationContext())
+ .imageDownloader(new ContentUriImageDownloader()).build();
+ ImageLoader.getInstance().init(imageLoaderConfiguration);
}
public MWApi getApi() {
diff --git a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsActivity.java b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsActivity.java
index 4ec587c00..d7fbf863e 100644
--- a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsActivity.java
+++ b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsActivity.java
@@ -1,5 +1,6 @@
package org.wikimedia.commons.contributions;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
@@ -17,6 +18,13 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragmentActivity;
+import com.nostra13.universalimageloader.core.DisplayImageOptions;
+import com.nostra13.universalimageloader.core.ImageLoader;
+import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
+import com.nostra13.universalimageloader.core.assist.FailReason;
+import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
+import com.nostra13.universalimageloader.core.assist.ImageScaleType;
+import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import org.wikimedia.commons.ImageLoaderTask;
import org.wikimedia.commons.R;
import org.wikimedia.commons.UploadService;
@@ -50,8 +58,9 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
ImageView image = (ImageView)view.findViewById(R.id.contributionImage);
TextView title = (TextView)view.findViewById(R.id.contributionTitle);
- ImageLoaderTask imageLoader = new ImageLoaderTask(image);
- imageLoader.execute(Uri.parse(cursor.getString(COLUMN_LOCALURI)));
+ Uri imageUri = Uri.parse(cursor.getString(COLUMN_LOCALURI));
+
+ ImageLoader.getInstance().displayImage(imageUri.toString(), image, contributionDisplayOptions);
title.setText(cursor.getString(COLUMN_FILENAME));
@@ -60,8 +69,11 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
private LocalBroadcastManager localBroadcastManager;
private ListView contributionsList;
+
private ContributionAdapter contributionsAdapter;
+ private DisplayImageOptions contributionDisplayOptions;
+
private String[] broadcastsToReceive = {
UploadService.INTENT_CONTRIBUTION_STATE_CHANGED
};
@@ -100,6 +112,11 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
@Override
protected void onAuthCookieAcquired(String authCookie) {
+ contributionDisplayOptions = new DisplayImageOptions.Builder().cacheInMemory()
+ .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
+ .displayer(new FadeInBitmapDisplayer(300))
+ .resetViewBeforeLoading().build();
+
Cursor allContributions = getContentResolver().query(ContributionsContentProvider.BASE_URI, CONTRIBUTIONS_PROJECTION, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT);
contributionsAdapter = new ContributionAdapter(this, allContributions, 0);
contributionsList.setAdapter(contributionsAdapter);