aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Wharton <jakewharton@gmail.com>2012-06-13 16:41:53 -0700
committerJake Wharton <jakewharton@gmail.com>2012-06-13 16:41:53 -0700
commite469d257b5d044d7ae1fa6461583ec64c4b6ff6c (patch)
treee549c934466ecf39dc740d67820c574aa9516ae8
parent3b87fb6907bc76d4477361ea106d26ca58609940 (diff)
parent8d43136901df7ca0edea058d2b041edff293fd67 (diff)
downloadrobolectric-shadows-e469d257b5d044d7ae1fa6461583ec64c4b6ff6c.tar.gz
Merge pull request #60 from square/dimitris/download-manager
Adds DownloadManager support in Robolectric.
-rw-r--r--src/main/java/com/xtremelabs/robolectric/Robolectric.java3
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowContext.java1
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowDownloadManager.java224
-rw-r--r--src/main/java/com/xtremelabs/robolectric/shadows/ShadowEnvironment.java7
4 files changed, 235 insertions, 0 deletions
diff --git a/src/main/java/com/xtremelabs/robolectric/Robolectric.java b/src/main/java/com/xtremelabs/robolectric/Robolectric.java
index 525fe9d0c..fe39b8866 100644
--- a/src/main/java/com/xtremelabs/robolectric/Robolectric.java
+++ b/src/main/java/com/xtremelabs/robolectric/Robolectric.java
@@ -165,6 +165,9 @@ public class Robolectric {
ShadowDrawable.class,
ShadowDialog.class,
ShadowDialogPreference.class,
+ ShadowDownloadManager.class,
+ ShadowDownloadManager.ShadowRequest.class,
+ ShadowDownloadManager.ShadowQuery.class,
ShadowEditText.class,
ShadowEnvironment.class,
ShadowExpandableListView.class,
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowContext.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowContext.java
index e56312c64..da8f31479 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowContext.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowContext.java
@@ -26,6 +26,7 @@ abstract public class ShadowContext {
public static final File CACHE_DIR = new File(System.getProperty("java.io.tmpdir"), "android-cache");
public static final File EXTERNAL_CACHE_DIR = new File(System.getProperty("java.io.tmpdir"), "android-external-cache");
public static final File FILES_DIR = new File(System.getProperty("java.io.tmpdir"), "android-tmp");
+ public static final File DOWNLOADS_DIR = new File(System.getProperty("java.io.tmpdir"), "android-dls");
@RealObject private Context realContext;
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowDownloadManager.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowDownloadManager.java
new file mode 100644
index 000000000..2eb91964b
--- /dev/null
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowDownloadManager.java
@@ -0,0 +1,224 @@
+package com.xtremelabs.robolectric.shadows;
+
+import android.app.DownloadManager;
+import android.database.Cursor;
+import com.xtremelabs.robolectric.internal.Implementation;
+import com.xtremelabs.robolectric.internal.Implements;
+import com.xtremelabs.robolectric.internal.RealObject;
+import com.xtremelabs.robolectric.tester.android.database.TestCursor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.xtremelabs.robolectric.Robolectric.shadowOf;
+import static com.xtremelabs.robolectric.Robolectric.shadowOf_;
+
+/**
+ * Shadows Androids DownloadManager
+ */
+@Implements(DownloadManager.class)
+public class ShadowDownloadManager {
+
+ private Map<Long, DownloadManager.Request> requestMap = new HashMap<Long, DownloadManager.Request>();
+ private long queueCounter = -1; // First request starts at 0 just like in the real DownloadManager.
+
+ @Implementation
+ public long enqueue(DownloadManager.Request request) {
+ queueCounter++;
+ requestMap.put(queueCounter, request);
+
+ return queueCounter;
+ }
+
+ @Implementation
+ public int remove(long... ids) {
+ int removeCount = 0;
+ for (long id : ids) {
+ if (requestMap.remove(id) != null) {
+ removeCount++;
+ }
+ }
+ return removeCount;
+ }
+
+ @Implementation
+ public Cursor query(DownloadManager.Query query) {
+ ShadowQuery shadow = shadowOf_(query);
+ long[] ids = shadow.getIds();
+
+ ResultCursor result = new ResultCursor();
+ for (long id : ids) {
+ DownloadManager.Request request = requestMap.get(id);
+ if (request != null) {
+ result.requests.add(request);
+ }
+ }
+
+ return result;
+ }
+
+ public DownloadManager.Request getRequest(long id) {
+ return requestMap.get(id);
+ }
+
+ public int getRequestCount() {
+ return requestMap.size();
+ }
+
+ @Implements(DownloadManager.Request.class)
+ public static class ShadowRequest {
+ @RealObject
+ DownloadManager.Request realObject;
+
+ private CharSequence description;
+ private int status;
+
+ @Implementation
+ public DownloadManager.Request setAllowedNetworkTypes(int flags) {
+ return realObject;
+ }
+
+ @Implementation
+ public DownloadManager.Request setMimeType(String mimeType) {
+ return realObject;
+ }
+
+ @Implementation
+ public DownloadManager.Request setTitle(CharSequence title) {
+ return realObject;
+ }
+
+ @Implementation
+ public DownloadManager.Request setDescription(CharSequence description) {
+ this.description = description;
+ return realObject;
+ }
+
+ @Implementation
+ public DownloadManager.Request setAllowedOverRoaming(boolean allowed) {
+ return realObject;
+ }
+
+ @Implementation
+ public DownloadManager.Request setDestinationInExternalPublicDir(String dirType, String subPath) {
+ return realObject;
+ }
+
+ public CharSequence getDescription() {
+ return this.description;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public int getStatus() {
+ return this.status;
+ }
+ }
+
+ @Implements(DownloadManager.Query.class)
+ public static class ShadowQuery {
+
+ @RealObject
+ private DownloadManager.Query realObject;
+
+ private long[] ids = null;
+
+ @Implementation
+ public DownloadManager.Query setFilterById(long... ids) {
+ this.ids = ids;
+ return realObject;
+ }
+
+ public long[] getIds() {
+ return this.ids;
+ }
+ }
+
+ private class ResultCursor extends TestCursor {
+
+ private static final int COLUMN_INDEX_LOCAL_FILENAME = 0;
+ private static final int COLUMN_INDEX_DESCRIPTION = 1;
+ private static final int COLUMN_INDEX_REASON = 2;
+ private static final int COLUMN_INDEX_STATUS = 3;
+
+ public List<DownloadManager.Request> requests = new ArrayList<DownloadManager.Request>();
+ private int positionIndex;
+ private boolean closed;
+
+ @Override
+ public int getCount() {
+ checkClosed();
+ return requests.size();
+ }
+
+ @Override
+ public boolean moveToFirst() {
+ checkClosed();
+ positionIndex = 0;
+ return !requests.isEmpty();
+ }
+
+ @Override
+ public int getColumnIndex(String columnName) {
+ checkClosed();
+
+ if (DownloadManager.COLUMN_LOCAL_FILENAME.equals(columnName)) {
+ return COLUMN_INDEX_LOCAL_FILENAME;
+ } else if (DownloadManager.COLUMN_DESCRIPTION.equals(columnName)) {
+ return COLUMN_INDEX_DESCRIPTION;
+ } else if (DownloadManager.COLUMN_REASON.equals(columnName)) {
+ return COLUMN_INDEX_REASON;
+ } else if (DownloadManager.COLUMN_STATUS.equals(columnName)) {
+ return COLUMN_INDEX_STATUS;
+ }
+
+ return 0;
+ }
+
+ @Override
+ public void close() {
+ this.closed = true;
+ }
+
+ @Override
+ public boolean isClosed() {
+ return closed;
+ }
+
+ @Override
+ public String getString(int columnIndex) {
+ checkClosed();
+ ShadowRequest request = shadowOf_(requests.get(positionIndex));
+ switch (columnIndex) {
+ case COLUMN_INDEX_LOCAL_FILENAME:
+ return "local file name not implemented";
+ case COLUMN_INDEX_DESCRIPTION:
+ return request.getDescription().toString();
+ case COLUMN_INDEX_REASON:
+ return "reason not implemented";
+ }
+
+ return "Unknown ColumnIndex " + columnIndex;
+ }
+
+ @Override
+ public int getInt(int columnIndex) {
+ checkClosed();
+ ShadowRequest request = shadowOf_(requests.get(positionIndex));
+ if (columnIndex == COLUMN_INDEX_STATUS) {
+ return request.getStatus();
+ }
+ return 0;
+ }
+
+ private void checkClosed() {
+ if (closed) {
+ throw new IllegalStateException("Cursor is already closed.");
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowEnvironment.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowEnvironment.java
index e56ada126..c2273bc45 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowEnvironment.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowEnvironment.java
@@ -12,6 +12,7 @@ public class ShadowEnvironment {
private static final String MEDIA_REMOVED = "removed";
private static String externalStorageState = MEDIA_REMOVED;
+ public static final String DIRECTORY_DOWNLOADS = "Download";
@Implementation
public static String getExternalStorageState() {
@@ -26,5 +27,11 @@ public class ShadowEnvironment {
public static File getExternalStorageDirectory() {
return ShadowContext.EXTERNAL_CACHE_DIR;
}
+
+ @Implementation
+ public static File getExternalStoragePublicDirectory(String type) {
+ // For now always return this and ignore the type.
+ return ShadowContext.DOWNLOADS_DIR;
+ }
}