1e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard/* 2e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Copyright (C) 2010 The Android Open Source Project 3e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * 4e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Licensed under the Apache License, Version 2.0 (the "License"); 5e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * you may not use this file except in compliance with the License. 6e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * You may obtain a copy of the License at 7e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * 8e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * http://www.apache.org/licenses/LICENSE-2.0 9e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * 10e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Unless required by applicable law or agreed to in writing, software 11e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * distributed under the License is distributed on an "AS IS" BASIS, 12e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * See the License for the specific language governing permissions and 14e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * limitations under the License. 15e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard */ 16e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 17e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardpackage com.android.providers.downloads; 18e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 198ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport static android.app.DownloadManager.STATUS_FAILED; 208ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport static android.app.DownloadManager.STATUS_SUCCESSFUL; 217ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS; 228ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS; 238ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 24a1448628237471a7a2aeb67b560b1502c2bd5ba8Steve Howardimport android.app.DownloadManager; 254f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkeyimport android.content.ContentResolver; 264f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkeyimport android.content.ContextWrapper; 27e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.database.Cursor; 28e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.net.Uri; 29e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.os.ParcelFileDescriptor; 308ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport android.os.SystemClock; 315d217003acf21aea852975af0dff3b398cea6768Vasu Noriimport android.util.Log; 32e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 33dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.IoUtils; 34dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.Streams; 35dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey 36e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.io.InputStream; 37e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.net.MalformedURLException; 38ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeyimport java.net.UnknownHostException; 398ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport java.util.concurrent.TimeoutException; 40e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 41e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard/** 42e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Code common to tests that use the download manager public API. 43e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard */ 44ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeypublic abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunctionalTest { 45e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 46e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard class Download { 47e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard final long mId; 48e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 49e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard private Download(long downloadId) { 50e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard this.mId = downloadId; 51e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 52e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 53e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard public int getStatus() { 54e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return (int) getLongField(DownloadManager.COLUMN_STATUS); 55e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 56e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 5758eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey public int getReason() { 5858eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey return (int) getLongField(DownloadManager.COLUMN_REASON); 5958eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey } 6058eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey 615d217003acf21aea852975af0dff3b398cea6768Vasu Nori public int getStatusIfExists() { 625d217003acf21aea852975af0dff3b398cea6768Vasu Nori Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 635d217003acf21aea852975af0dff3b398cea6768Vasu Nori try { 645d217003acf21aea852975af0dff3b398cea6768Vasu Nori if (cursor.getCount() > 0) { 655d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.moveToFirst(); 665d217003acf21aea852975af0dff3b398cea6768Vasu Nori return (int) cursor.getLong(cursor.getColumnIndexOrThrow( 675d217003acf21aea852975af0dff3b398cea6768Vasu Nori DownloadManager.COLUMN_STATUS)); 685d217003acf21aea852975af0dff3b398cea6768Vasu Nori } else { 695d217003acf21aea852975af0dff3b398cea6768Vasu Nori // the row doesn't exist 705d217003acf21aea852975af0dff3b398cea6768Vasu Nori return -1; 715d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 725d217003acf21aea852975af0dff3b398cea6768Vasu Nori } finally { 735d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.close(); 745d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 755d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 765d217003acf21aea852975af0dff3b398cea6768Vasu Nori 77e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard String getStringField(String field) { 78e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 79e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard try { 80e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard assertEquals(1, cursor.getCount()); 81e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.moveToFirst(); 82e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return cursor.getString(cursor.getColumnIndexOrThrow(field)); 83e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } finally { 84e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.close(); 85e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 86e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 87e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 88e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard long getLongField(String field) { 89e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 90e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard try { 91e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard assertEquals(1, cursor.getCount()); 92e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.moveToFirst(); 93e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return cursor.getLong(cursor.getColumnIndexOrThrow(field)); 94e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } finally { 95e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.close(); 96e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 97e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 98e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 99dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey byte[] getRawContents() throws Exception { 100e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard ParcelFileDescriptor downloadedFile = mManager.openDownloadedFile(mId); 101e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard assertTrue("Invalid file descriptor: " + downloadedFile, 102e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard downloadedFile.getFileDescriptor().valid()); 103dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream( 10458eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey downloadedFile); 105e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard try { 106dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey return Streams.readFully(is); 107e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } finally { 108dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey IoUtils.closeQuietly(is); 109e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 110e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 111e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 112dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey String getContents() throws Exception { 113dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey return new String(getRawContents()); 114dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey } 115dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey 1168ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey void runUntilStatus(int status) throws TimeoutException { 1170de55602ec6d350548248feddc68c91b29326effJeff Sharkey final long startMillis = mSystemFacade.currentTimeMillis(); 1183a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey startDownload(mId); 1190de55602ec6d350548248feddc68c91b29326effJeff Sharkey waitForStatus(status, startMillis); 1208ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey } 1218ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1227ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey void runUntilStatus(int status, long timeout) throws TimeoutException { 1237ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey final long startMillis = mSystemFacade.currentTimeMillis(); 1243a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey startDownload(mId); 1257ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey waitForStatus(status, startMillis, timeout); 1267ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1277ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey 1280de55602ec6d350548248feddc68c91b29326effJeff Sharkey void waitForStatus(int expected, long afterMillis) throws TimeoutException { 1297ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey waitForStatus(expected, afterMillis, 15 * SECOND_IN_MILLIS); 1307ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1317ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey 1327ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey void waitForStatus(int expected, long afterMillis, long timeout) throws TimeoutException { 1338ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey int actual = -1; 1348ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1357ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey final long elapsedTimeout = SystemClock.elapsedRealtime() + timeout; 1367ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey while (SystemClock.elapsedRealtime() < elapsedTimeout) { 1370de55602ec6d350548248feddc68c91b29326effJeff Sharkey if (getLongField(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP) >= afterMillis) { 1380de55602ec6d350548248feddc68c91b29326effJeff Sharkey actual = getStatus(); 1390de55602ec6d350548248feddc68c91b29326effJeff Sharkey if (actual == STATUS_SUCCESSFUL || actual == STATUS_FAILED) { 1400de55602ec6d350548248feddc68c91b29326effJeff Sharkey assertEquals(expected, actual); 1410de55602ec6d350548248feddc68c91b29326effJeff Sharkey return; 1420de55602ec6d350548248feddc68c91b29326effJeff Sharkey } else if (actual == expected) { 1430de55602ec6d350548248feddc68c91b29326effJeff Sharkey return; 1440de55602ec6d350548248feddc68c91b29326effJeff Sharkey } 1457ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey 1467ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey if (timeout > MINUTE_IN_MILLIS) { 1477ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey final int percent = (int) (100 1487ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey * getLongField(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR) 1497ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey / getLongField(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 1507ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey Log.d(LOG_TAG, percent + "% complete"); 1517ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1528ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey } 1538ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1547ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey if (timeout > MINUTE_IN_MILLIS) { 1557ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey SystemClock.sleep(SECOND_IN_MILLIS * 3); 1567ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } else { 1577ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey SystemClock.sleep(100); 1587ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1598ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey } 1608ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1618ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey throw new TimeoutException("Expected status " + expected + "; only reached " + actual); 162e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 1635d217003acf21aea852975af0dff3b398cea6768Vasu Nori 1645d217003acf21aea852975af0dff3b398cea6768Vasu Nori // max time to wait before giving up on the current download operation. 1655d217003acf21aea852975af0dff3b398cea6768Vasu Nori private static final int MAX_TIME_TO_WAIT_FOR_OPERATION = 5; 1665d217003acf21aea852975af0dff3b398cea6768Vasu Nori // while waiting for the above time period, sleep this long to yield to the 1675d217003acf21aea852975af0dff3b398cea6768Vasu Nori // download thread 1685d217003acf21aea852975af0dff3b398cea6768Vasu Nori private static final int TIME_TO_SLEEP = 1000; 1695d217003acf21aea852975af0dff3b398cea6768Vasu Nori 1705d217003acf21aea852975af0dff3b398cea6768Vasu Nori // waits until progress_so_far is >= (progress)% 1715d217003acf21aea852975af0dff3b398cea6768Vasu Nori boolean runUntilProgress(int progress) throws InterruptedException { 1723a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey startDownload(mId); 1738ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1745d217003acf21aea852975af0dff3b398cea6768Vasu Nori int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP; 1755d217003acf21aea852975af0dff3b398cea6768Vasu Nori int numBytesReceivedSoFar = 0; 1765d217003acf21aea852975af0dff3b398cea6768Vasu Nori int totalBytes = 0; 1775d217003acf21aea852975af0dff3b398cea6768Vasu Nori for (int i = 0; i < sleepCounter; i++) { 1785d217003acf21aea852975af0dff3b398cea6768Vasu Nori Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 1795d217003acf21aea852975af0dff3b398cea6768Vasu Nori try { 1805d217003acf21aea852975af0dff3b398cea6768Vasu Nori assertEquals(1, cursor.getCount()); 1815d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.moveToFirst(); 1825d217003acf21aea852975af0dff3b398cea6768Vasu Nori numBytesReceivedSoFar = cursor.getInt( 1835d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.getColumnIndexOrThrow( 1845d217003acf21aea852975af0dff3b398cea6768Vasu Nori DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); 1855d217003acf21aea852975af0dff3b398cea6768Vasu Nori totalBytes = cursor.getInt( 1865d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 1875d217003acf21aea852975af0dff3b398cea6768Vasu Nori } finally { 1885d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.close(); 1895d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 1905d217003acf21aea852975af0dff3b398cea6768Vasu Nori Log.i(LOG_TAG, "in runUntilProgress, numBytesReceivedSoFar: " + 1915d217003acf21aea852975af0dff3b398cea6768Vasu Nori numBytesReceivedSoFar + ", totalBytes: " + totalBytes); 1925d217003acf21aea852975af0dff3b398cea6768Vasu Nori if (totalBytes == 0) { 1935d217003acf21aea852975af0dff3b398cea6768Vasu Nori fail("total_bytes should not be zero"); 1945d217003acf21aea852975af0dff3b398cea6768Vasu Nori return false; 1955d217003acf21aea852975af0dff3b398cea6768Vasu Nori } else { 1965d217003acf21aea852975af0dff3b398cea6768Vasu Nori if (numBytesReceivedSoFar * 100 / totalBytes >= progress) { 1975d217003acf21aea852975af0dff3b398cea6768Vasu Nori // progress_so_far is >= progress%. we are done 1985d217003acf21aea852975af0dff3b398cea6768Vasu Nori return true; 1995d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 2005d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 2015d217003acf21aea852975af0dff3b398cea6768Vasu Nori // download not done yet. sleep a while and try again 2025d217003acf21aea852975af0dff3b398cea6768Vasu Nori Thread.sleep(TIME_TO_SLEEP); 2035d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 2045d217003acf21aea852975af0dff3b398cea6768Vasu Nori Log.i(LOG_TAG, "FAILED in runUntilProgress, numBytesReceivedSoFar: " + 2055d217003acf21aea852975af0dff3b398cea6768Vasu Nori numBytesReceivedSoFar + ", totalBytes: " + totalBytes); 2065d217003acf21aea852975af0dff3b398cea6768Vasu Nori return false; // failed 2075d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 208e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 209e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 210e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected static final String PACKAGE_NAME = "my.package.name"; 211e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected static final String REQUEST_PATH = "/path"; 212e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 213e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected DownloadManager mManager; 214e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 215e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard public AbstractPublicApiTest(FakeSystemFacade systemFacade) { 216e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard super(systemFacade); 217e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 218e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 219e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard @Override 220e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected void setUp() throws Exception { 221e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard super.setUp(); 2224f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey mManager = new DownloadManager(new ContextWrapper(mContext) { 2234f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey @Override 2244f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey public ContentResolver getContentResolver() { 2254f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey return mResolver; 2264f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey } 2274f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey 2284f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey @Override 2294f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey public String getPackageName() { 2304f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey return PACKAGE_NAME; 2314f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey } 2324f69f18892f2b246d74b985d68e9236e7530d9abJeff Sharkey }); 2333a5f5eafb34eaa4963c801882148e8f61514a61bJeff Sharkey mManager.setAccessFilename(true); 234e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 235e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 236ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey protected DownloadManager.Request getRequest() 237ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey throws MalformedURLException, UnknownHostException { 238e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return getRequest(getServerUri(REQUEST_PATH)); 239e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 240e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 241e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected DownloadManager.Request getRequest(String path) { 242e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return new DownloadManager.Request(Uri.parse(path)); 243e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 244e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 245e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected Download enqueueRequest(DownloadManager.Request request) { 246e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return new Download(mManager.enqueue(request)); 247e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 248e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard} 249