diff options
author | Jake Wharton <jakewharton@gmail.com> | 2012-06-13 16:41:53 -0700 |
---|---|---|
committer | Jake Wharton <jakewharton@gmail.com> | 2012-06-13 16:41:53 -0700 |
commit | e469d257b5d044d7ae1fa6461583ec64c4b6ff6c (patch) | |
tree | e549c934466ecf39dc740d67820c574aa9516ae8 | |
parent | 3b87fb6907bc76d4477361ea106d26ca58609940 (diff) | |
parent | 8d43136901df7ca0edea058d2b041edff293fd67 (diff) | |
download | robolectric-shadows-e469d257b5d044d7ae1fa6461583ec64c4b6ff6c.tar.gz |
Merge pull request #60 from square/dimitris/download-manager
Adds DownloadManager support in Robolectric.
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; + } } |