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