Dbrant has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/367895 )

Change subject: WIP: Execute download of compilations.
......................................................................

WIP: Execute download of compilations.

Bug: T164764
Change-Id: If9856d7ffda14b56396ec7e10f91a41d56647422
---
M app/src/main/java/org/wikipedia/Constants.java
M app/src/main/java/org/wikipedia/gallery/MediaDownloadReceiver.java
M app/src/main/java/org/wikipedia/offline/Compilation.java
A app/src/main/java/org/wikipedia/offline/DownloadManagerItem.java
A app/src/main/java/org/wikipedia/offline/DownloadManagerObserver.java
M app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
M app/src/main/java/org/wikipedia/offline/OfflineManager.java
M app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
8 files changed, 177 insertions(+), 47 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/95/367895/1

diff --git a/app/src/main/java/org/wikipedia/Constants.java 
b/app/src/main/java/org/wikipedia/Constants.java
index 0c33248..74721d7 100644
--- a/app/src/main/java/org/wikipedia/Constants.java
+++ b/app/src/main/java/org/wikipedia/Constants.java
@@ -24,6 +24,7 @@
     public static final int ACTIVITY_REQUEST_DESCRIPTION_EDIT_SUCCESS = 54;
     public static final int ACTIVITY_REQUEST_DESCRIPTION_EDIT = 55;
     public static final int ACTIVITY_REQUEST_DESCRIPTION_EDIT_TUTORIAL = 56;
+    public static final int ACTIVITY_REQUEST_DOWNLOAD_COMPILATION = 57;
 
     public static final String INTENT_RETURN_TO_MAIN = "returnToMain";
     public static final String INTENT_SEARCH_FROM_WIDGET = "searchFromWidget";
diff --git a/app/src/main/java/org/wikipedia/gallery/MediaDownloadReceiver.java 
b/app/src/main/java/org/wikipedia/gallery/MediaDownloadReceiver.java
index ec25e91..c2129a2 100644
--- a/app/src/main/java/org/wikipedia/gallery/MediaDownloadReceiver.java
+++ b/app/src/main/java/org/wikipedia/gallery/MediaDownloadReceiver.java
@@ -36,7 +36,7 @@
     public void download(@NonNull Context context, @NonNull Compilation 
compilation) {
         String filename = 
FileUtil.sanitizeFileName(compilation.uri().getLastPathSegment());
         String targetDirectory = Environment.DIRECTORY_DOWNLOADS;
-        performDownloadRequest(context, compilation.uri(), targetDirectory, 
filename, null);
+        performDownloadRequest(context, compilation.uri(), targetDirectory, 
filename, Compilation.MIME_TYPE);
     }
 
     public void download(@NonNull Context context, @NonNull FeaturedImage 
featuredImage) {
diff --git a/app/src/main/java/org/wikipedia/offline/Compilation.java 
b/app/src/main/java/org/wikipedia/offline/Compilation.java
index 874383b..50cc04b 100644
--- a/app/src/main/java/org/wikipedia/offline/Compilation.java
+++ b/app/src/main/java/org/wikipedia/offline/Compilation.java
@@ -23,6 +23,8 @@
 import java.util.List;
 
 public class Compilation {
+    public static final String MIME_TYPE = "application/zim";
+
     @Nullable private String name;
     @Nullable private Uri uri;
     @Nullable private List<String> langCodes;
@@ -88,6 +90,20 @@
         timestamp = other.timestamp();
     }
 
+    public boolean pathNameMatchesUri(@Nullable Uri otherUri) {
+        if (file == null || otherUri == null) {
+            return false;
+        }
+        return file.getName().equals(otherUri.getLastPathSegment());
+    }
+
+    public boolean uriNameMatchesUri(@Nullable Uri otherUri) {
+        if (uri == null || otherUri == null) {
+            return false;
+        }
+        return uri.getLastPathSegment().equals(otherUri.getLastPathSegment());
+    }
+
     public void close() {
         try {
             if (reader != null) {
diff --git a/app/src/main/java/org/wikipedia/offline/DownloadManagerItem.java 
b/app/src/main/java/org/wikipedia/offline/DownloadManagerItem.java
new file mode 100644
index 0000000..120358a
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/offline/DownloadManagerItem.java
@@ -0,0 +1,35 @@
+package org.wikipedia.offline;
+
+import android.net.Uri;
+import android.support.annotation.NonNull;
+
+public class DownloadManagerItem {
+    @NonNull private Uri uri;
+    private int status;
+    private long bytesDownloaded;
+    private long bytesTotal;
+
+    public DownloadManagerItem(@NonNull Uri uri, int status, long 
bytesDownloaded, long bytesTotal) {
+        this.uri = uri;
+        this.status = status;
+        this.bytesDownloaded = bytesDownloaded;
+        this.bytesTotal = bytesTotal;
+    }
+
+    @NonNull
+    public Uri uri() {
+        return uri;
+    }
+
+    public int status() {
+        return status;
+    }
+
+    public long bytesDownloaded() {
+        return bytesDownloaded;
+    }
+
+    public long bytesTotal() {
+        return bytesTotal;
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/offline/DownloadManagerObserver.java 
b/app/src/main/java/org/wikipedia/offline/DownloadManagerObserver.java
new file mode 100644
index 0000000..3a5bf2e
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/offline/DownloadManagerObserver.java
@@ -0,0 +1,74 @@
+package org.wikipedia.offline;
+
+import android.app.DownloadManager;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+import org.wikipedia.WikipediaApp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DownloadManagerObserver {
+    private static final int POLL_INTERVAL_MS = 500;
+
+    public interface Callback {
+        void onDownloadStatus(@NonNull List<DownloadManagerItem> items);
+    }
+
+    @Nullable private DownloadManager downloadManager;
+    @Nullable private Callback callback;
+    @Nullable private Handler handler;
+    private PollRunnable pollRunnable = new PollRunnable();
+
+    public void register(@NonNull Callback callback) {
+        downloadManager = (DownloadManager) 
WikipediaApp.getInstance().getSystemService(Context.DOWNLOAD_SERVICE);
+        handler = new Handler(WikipediaApp.getInstance().getMainLooper());
+        this.callback = callback;
+        handler.postDelayed(pollRunnable, POLL_INTERVAL_MS);
+    }
+
+    public void unregister() {
+        downloadManager = null;
+        callback = null;
+        handler = null;
+    }
+
+    private class PollRunnable implements Runnable {
+        @Override
+        public void run() {
+            if (handler == null) {
+                return;
+            }
+            queryCurrentDownloads();
+            handler.postDelayed(pollRunnable, POLL_INTERVAL_MS);
+        }
+    }
+
+    private void queryCurrentDownloads() {
+        if (downloadManager == null || callback == null) {
+            return;
+        }
+        DownloadManager.Query query = new DownloadManager.Query();
+        Cursor cursor = downloadManager.query(query);
+        List<DownloadManagerItem> items = new ArrayList<>();
+        while (cursor.moveToNext()) {
+            String uri = 
cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
+            String mimeType = 
cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_MEDIA_TYPE));
+            int status = 
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
+            int bytesDownloaded = 
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
+            int bytesTotal = 
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
+            if (!TextUtils.isEmpty(uri) && 
Compilation.MIME_TYPE.equals(mimeType)) {
+                items.add(new DownloadManagerItem(Uri.parse(uri), status, 
bytesDownloaded, bytesTotal));
+            }
+        }
+        if (!items.isEmpty()) {
+            callback.onDownloadStatus(items);
+        }
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java 
b/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
index fe720bb..28a3400 100644
--- a/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
+++ b/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
@@ -1,5 +1,6 @@
 package org.wikipedia.offline;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -18,6 +19,7 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import org.wikipedia.Constants;
 import org.wikipedia.R;
 import org.wikipedia.activity.FragmentUtil;
 import org.wikipedia.history.SearchActionModeCallback;
@@ -108,6 +110,13 @@
         super.onDestroyView();
     }
 
+    @Override public void onActivityResult(int requestCode, int resultCode, 
final Intent data) {
+        if (requestCode == Constants.ACTIVITY_REQUEST_DOWNLOAD_COMPILATION
+                && resultCode == 
RemoteCompilationsFragment.RESULT_DOWNLOAD_COMPILATION) {
+            beginUpdate();
+        }
+    }
+
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.menu_local_compilations, menu);
@@ -130,7 +139,8 @@
     }
 
     @OnClick(R.id.compilations_add_button) void onAddCompilationClick() {
-        startActivity(RemoteCompilationsActivity.newIntent(getContext()));
+        
startActivityForResult(RemoteCompilationsActivity.newIntent(getContext()),
+                Constants.ACTIVITY_REQUEST_DOWNLOAD_COMPILATION);
     }
 
     public void onCompilationsRefreshed() {
diff --git a/app/src/main/java/org/wikipedia/offline/OfflineManager.java 
b/app/src/main/java/org/wikipedia/offline/OfflineManager.java
index aeba0a7..e6eb4f8 100644
--- a/app/src/main/java/org/wikipedia/offline/OfflineManager.java
+++ b/app/src/main/java/org/wikipedia/offline/OfflineManager.java
@@ -82,8 +82,7 @@
     void updateFromRemoteMetadata(@NonNull List<Compilation> 
remoteCompilations) {
         for (Compilation remoteCompilation : remoteCompilations) {
             for (Compilation localCompilation : compilations) {
-                if (remoteCompilation.uri() != null
-                        && new 
File(localCompilation.path()).getName().equals(remoteCompilation.uri().getLastPathSegment()))
 {
+                if 
(localCompilation.pathNameMatchesUri(remoteCompilation.uri())) {
                     localCompilation.copyMetadataFrom(remoteCompilation);
                 }
             }
diff --git 
a/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java 
b/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
index 8f6b63b..90512f2 100644
--- a/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
+++ b/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
@@ -1,9 +1,6 @@
 package org.wikipedia.offline;
 
 import android.app.DownloadManager;
-import android.content.Context;
-import android.content.IntentFilter;
-import android.database.Cursor;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
@@ -38,6 +35,8 @@
 import org.wikipedia.views.SearchEmptyView;
 import org.wikipedia.views.WikiErrorView;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -46,6 +45,8 @@
 import butterknife.Unbinder;
 
 public class RemoteCompilationsFragment extends Fragment {
+    public static final int RESULT_DOWNLOAD_COMPILATION = 1;
+
     @BindView(R.id.compilation_list_toolbar_container) CollapsingToolbarLayout 
toolbarLayout;
     @BindView(R.id.compilation_list_app_bar) AppBarLayout appBarLayout;
     @BindView(R.id.compilation_list_toolbar) Toolbar toolbar;
@@ -67,6 +68,9 @@
     private String currentSearchQuery;
 
     private MediaDownloadReceiver downloadReceiver = new 
MediaDownloadReceiver();
+    private DownloadManagerObserver downloadObserver = new 
DownloadManagerObserver();
+    private DownloadObserverCallback downloadObserverCallback = new 
DownloadObserverCallback();
+    private Compilation pendingDownload;
 
     @NonNull
     public static RemoteCompilationsFragment newInstance() {
@@ -107,14 +111,7 @@
             }
         });
 
-        getContext().registerReceiver(downloadReceiver,
-                new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
-        downloadReceiver.setCallback(new MediaDownloadReceiver.Callback() {
-            @Override
-            public void onSuccess() {
-            }
-        });
-
+        downloadObserver.register(downloadObserverCallback);
         beginUpdate();
         return view;
     }
@@ -127,7 +124,7 @@
 
     @Override
     public void onDestroyView() {
-        downloadReceiver.setCallback(null);
+        downloadObserver.unregister();
         unbinder.unbind();
         unbinder = null;
         super.onDestroyView();
@@ -254,37 +251,7 @@
 
         @Override
         public void onThumbClick(@Nullable Compilation item) {
-
-
-
-
-
-
-
-            DownloadManager.Query query = new DownloadManager.Query();
-            final DownloadManager manager = (DownloadManager) 
getContext().getSystemService(Context.DOWNLOAD_SERVICE);
-
-            Cursor cursor = manager.query(query);
-            while (cursor.moveToNext()) {
-
-                String uri = 
cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
-
-                L.d(">>>>>> downloading: " + uri);
-
-                int bytesDownloaded = 
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
-                int bytesTotal = 
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
-
-            }
-
-
-
-
-
-
-
-
-
-            //onClick(item);
+            onClick(item);
         }
 
         @Override
@@ -349,6 +316,7 @@
                 switch (menuItem.getItemId()) {
                     case R.id.menu_compilation_download:
                         downloadReceiver.download(getContext(), compilation);
+                        pendingDownload = compilation;
                         return false;
                     default:
                         return false;
@@ -358,6 +326,33 @@
         menu.show();
     }
 
+    private class DownloadObserverCallback implements 
DownloadManagerObserver.Callback {
+        @Override
+        public void onDownloadStatus(@NonNull List<DownloadManagerItem> items) 
{
+            if (pendingDownload != null) {
+                for (DownloadManagerItem item : items) {
+                    if (pendingDownload.uriNameMatchesUri(item.uri()) && 
item.status()
+                            == DownloadManager.STATUS_RUNNING) {
+                        finishWithPendingDownload(item, pendingDownload);
+                    }
+                }
+            }
+        }
+    }
+
+    private void finishWithPendingDownload(@NonNull DownloadManagerItem item,
+                                           @NonNull Compilation 
pendingDownload) {
+        try {
+            Compilation c = new Compilation(new File(item.uri().getPath()));
+            c.copyMetadataFrom(pendingDownload);
+            OfflineManager.instance().compilations().add(c);
+            getActivity().setResult(RESULT_DOWNLOAD_COMPILATION);
+            getActivity().finish();
+        } catch (IOException e) {
+            L.w(e);
+        }
+    }
+
     private AppCompatActivity getAppCompatActivity() {
         return (AppCompatActivity) getActivity();
     }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: If9856d7ffda14b56396ec7e10f91a41d56647422
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

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

Reply via email to