Brion VIBBER has submitted this change and it was merged.

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(-)

Approvals:
  Brion VIBBER: Verified; Looks good to me, approved



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: merged
Gerrit-Change-Id: I4bbc9c15568b351053114b0a6ed05e5df59b5503
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[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