Yuvipanda has uploaded a new change for review.
https://gerrit.wikimedia.org/r/102743
Change subject: Download all the images in an article while saving page
......................................................................
Download all the images in an article while saving page
Doesn't actually use the images anywhere yet.
Change-Id: I4bbc9c15568b351053114b0a6ed05e5df59b5503
---
M wikipedia/assets/main.js
M wikipedia/pom.xml
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/Utils.java
A
wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/DownloadImageTask.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/SavePageTask.java
7 files changed, 157 insertions(+), 7 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/43/102743/1
diff --git a/wikipedia/assets/main.js b/wikipedia/assets/main.js
index c980742..77d82a7 100644
--- a/wikipedia/assets/main.js
+++ b/wikipedia/assets/main.js
@@ -32,6 +32,15 @@
} );
});
+ bridge.registerListener( "requestImagesList", function ( payload ) {
+ var imageURLs = [];
+ var images = document.querySelectorAll( "img" );
+ for ( var i = 0; i < images.length; i++ ) {
+ imageURLs.push( images[i].src );
+ }
+ bridge.sendMessage( "imagesListResponse", { "images": imageURLs });
+ } );
+
document.onclick = function() {
if ( event.target.tagName === "A" ) {
bridge.sendMessage( 'linkClicked', { href:
event.target.getAttribute( "href" ) });
diff --git a/wikipedia/pom.xml b/wikipedia/pom.xml
index 2a1f2eb..7ea1a58 100644
--- a/wikipedia/pom.xml
+++ b/wikipedia/pom.xml
@@ -47,7 +47,12 @@
<artifactId>acra</artifactId>
<version>4.5.0</version>
</dependency>
- </dependencies>
+ <dependency>
+ <groupId>com.squareup.okhttp</groupId>
+ <artifactId>okhttp</artifactId>
+ <version>1.2.1</version>
+ </dependency>
+ </dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
index e2c01bc..4572877 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
@@ -75,7 +75,7 @@
@Subscribe
public void onPageSaveEvent(SavePageEvent event) {
- new SavePageTask(this, curPageFragment.getPage()).execute();
+ curPageFragment.savePage();
}
@Subscribe
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
index cdfbea6..0806594 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageViewFragment.java
@@ -9,6 +9,7 @@
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
+import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -17,6 +18,7 @@
import org.wikimedia.wikipedia.history.HistoryEntry;
import org.wikimedia.wikipedia.pageimages.PageImageSaveTask;
import org.wikimedia.wikipedia.savedpages.LoadSavedPageTask;
+import org.wikimedia.wikipedia.savedpages.SavePageTask;
import java.util.ArrayList;
import java.util.List;
@@ -217,7 +219,7 @@
private class RestSectionsFetchTask extends SectionsFetchTask {
public RestSectionsFetchTask() {
- super(api, title, "1-");
+ super(api, title, "1-");
}
@Override
@@ -243,4 +245,18 @@
setState(STATE_COMPLETE_FETCH);
}
}
+
+ public void savePage() {
+ new SavePageTask(getActivity(), bridge, page) {
+ @Override
+ public void onBeforeExecute() {
+ Toast.makeText(getActivity(), R.id.toast_saving_page,
Toast.LENGTH_LONG).show();
+ }
+
+ @Override
+ public void onFinish(Void result) {
+ Toast.makeText(getActivity(), R.id.toast_saved_page,
Toast.LENGTH_LONG).show();
+ }
+ }.execute();
+ }
}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/Utils.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/Utils.java
index 2f321bc..175bfdb 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/Utils.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/Utils.java
@@ -6,6 +6,7 @@
import android.view.View;
import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -71,4 +72,16 @@
throw new RuntimeException(e);
}
}
-}
+
+ /**
+ * Returns the local file name for a remote image.
+ *
+ * Warning: Should be kept stable between releases.
+ * @param url URL of the thumbnail image. Expects them in Mediawiki format
+ * @return
+ */
+ public static final String imageUrlToFileName(String url) {
+ String[] urlParts = url.split("/");
+ return "saved-image-" + urlParts[urlParts.length - 1];
+ }
+}
\ No newline at end of file
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/DownloadImageTask.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/DownloadImageTask.java
new file mode 100644
index 0000000..7bcd652
--- /dev/null
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/DownloadImageTask.java
@@ -0,0 +1,48 @@
+package org.wikimedia.wikipedia.savedpages;
+
+import android.content.Context;
+import com.squareup.okhttp.OkHttpClient;
+import org.wikimedia.wikipedia.Utils;
+import org.wikimedia.wikipedia.concurrency.ExecutorService;
+import org.wikimedia.wikipedia.concurrency.SaneAsyncTask;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class DownloadImageTask extends SaneAsyncTask<Boolean> {
+ private final Context context;
+ private final URL imageUrl;
+
+ public DownloadImageTask(Context context, String imageUrl) {
+
super(ExecutorService.getSingleton().getExecutor(DownloadImageTask.class, 4));
+ this.context = context;
+ try {
+ this.imageUrl = new URL(imageUrl);
+ } catch (MalformedURLException e) {
+ // Stupid Java is stupid.
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public Boolean performTask() throws Throwable {
+ OkHttpClient client = new OkHttpClient();
+ HttpURLConnection conn = client.open(imageUrl);
+ InputStream in = conn.getInputStream();
+ OutputStream out =
context.openFileOutput(Utils.imageUrlToFileName(imageUrl.toString()),
Context.MODE_PRIVATE);
+
+ byte[] buffer = new byte[1024 * 16];
+ int len;
+
+ while ((len = in.read(buffer)) != -1) {
+ out.write(buffer, 0, len);
+ }
+ in.close();
+ out.close();
+
+ return true;
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/SavePageTask.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/SavePageTask.java
index e469dac..19731ac 100644
---
a/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/SavePageTask.java
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/savedpages/SavePageTask.java
@@ -1,22 +1,42 @@
package org.wikimedia.wikipedia.savedpages;
import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.wikimedia.wikipedia.CommunicationBridge;
import org.wikimedia.wikipedia.Page;
import org.wikimedia.wikipedia.WikipediaApp;
import org.wikimedia.wikipedia.concurrency.ExecutorService;
import org.wikimedia.wikipedia.concurrency.SaneAsyncTask;
-import java.io.FileOutputStream;
-import java.util.concurrent.Executor;
+import java.util.HashSet;
+import java.util.concurrent.CountDownLatch;
public class SavePageTask extends SaneAsyncTask<Void> {
private final WikipediaApp app;
private final Page page;
+ private final CommunicationBridge bridge;
- public SavePageTask(Context context, Page page) {
+ /**
+ * Latch that opens when the imagesDownloadedLatch has been initialized.
+ * This is needed because the count of the imagesDownloadedLatch needs to
+ * be asynchronously determined, and will be null until that can be
+ * determined. So we have another single counter latch that is just to
check
+ * for the imagesDownloadedLatch being initialized
+ */
+ private CountDownLatch imagesDownloadLatchInitialized;
+ private CountDownLatch imagesDownloadedLatch;
+
+ public SavePageTask(Context context, CommunicationBridge bridge, Page
page) {
super(ExecutorService.getSingleton().getExecutor(SavePageTask.class,
1));
app = (WikipediaApp) context.getApplicationContext();
this.page = page;
+ this.bridge = bridge;
+
+ imagesDownloadLatchInitialized = new CountDownLatch(1);
}
@Override
@@ -25,6 +45,45 @@
persister.savePageContent(page);
+ final CommunicationBridge.JSEventListener processImages = new
CommunicationBridge.JSEventListener() {
+ // This runs on the main thread
+ @Override
+ public void onMessage(String messageType, JSONObject
messagePayload) {
+ final JSONArray imagesList =
messagePayload.optJSONArray("images");
+ final HashSet<String> hashSet = new HashSet<String>();
+ imagesDownloadedLatch = new
CountDownLatch(imagesList.length());
+ imagesDownloadLatchInitialized.countDown();
+ for (int i = 0; i < imagesList.length(); i++) {
+ final String imageUrl = imagesList.optString(i);
+ if (!hashSet.contains(imageUrl)) {
+ hashSet.add(imageUrl);
+ new DownloadImageTask(app, imageUrl) {
+ @Override
+ public void onFinish(Boolean result) {
+ imagesDownloadedLatch.countDown();
+ Log.d("Wikipedia", "Downloaded image " +
imageUrl);
+ }
+ }.execute();
+ }
+ }
+ }
+ };
+
+ Handler mainThreadHandler = new Handler(app.getMainLooper(), new
Handler.Callback() {
+ // This also runs on the main thread - you can access the bridge
only from the Main thread
+ @Override
+ public boolean handleMessage(Message msg) {
+ bridge.addListener("imagesListResponse", processImages);
+ bridge.sendMessage("requestImagesList", new JSONObject());
+ return true;
+ }
+ });
+
+ mainThreadHandler.sendEmptyMessage(0);
+
+ imagesDownloadLatchInitialized.await();
+ imagesDownloadedLatch.await();
+
SavedPage savedPage = new SavedPage(page.getTitle());
persister.upsert(savedPage);
--
To view, visit https://gerrit.wikimedia.org/r/102743
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I4bbc9c15568b351053114b0a6ed05e5df59b5503
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits