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; 25e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.database.Cursor; 26e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.net.Uri; 27e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport android.os.ParcelFileDescriptor; 288ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport android.os.SystemClock; 295d217003acf21aea852975af0dff3b398cea6768Vasu Noriimport android.util.Log; 30e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 31dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.IoUtils; 32dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkeyimport libcore.io.Streams; 33dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey 34e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.io.InputStream; 35e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howardimport java.net.MalformedURLException; 36ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeyimport java.net.UnknownHostException; 378ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkeyimport java.util.concurrent.TimeoutException; 38e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 39e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard/** 40e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard * Code common to tests that use the download manager public API. 41e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard */ 42ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkeypublic abstract class AbstractPublicApiTest extends AbstractDownloadProviderFunctionalTest { 43e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 44e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard class Download { 45e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard final long mId; 46e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 47e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard private Download(long downloadId) { 48e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard this.mId = downloadId; 49e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 50e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 51e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard public int getStatus() { 52e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return (int) getLongField(DownloadManager.COLUMN_STATUS); 53e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 54e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 5558eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey public int getReason() { 5658eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey return (int) getLongField(DownloadManager.COLUMN_REASON); 5758eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey } 5858eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey 595d217003acf21aea852975af0dff3b398cea6768Vasu Nori public int getStatusIfExists() { 605d217003acf21aea852975af0dff3b398cea6768Vasu Nori Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 615d217003acf21aea852975af0dff3b398cea6768Vasu Nori try { 625d217003acf21aea852975af0dff3b398cea6768Vasu Nori if (cursor.getCount() > 0) { 635d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.moveToFirst(); 645d217003acf21aea852975af0dff3b398cea6768Vasu Nori return (int) cursor.getLong(cursor.getColumnIndexOrThrow( 655d217003acf21aea852975af0dff3b398cea6768Vasu Nori DownloadManager.COLUMN_STATUS)); 665d217003acf21aea852975af0dff3b398cea6768Vasu Nori } else { 675d217003acf21aea852975af0dff3b398cea6768Vasu Nori // the row doesn't exist 685d217003acf21aea852975af0dff3b398cea6768Vasu Nori return -1; 695d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 705d217003acf21aea852975af0dff3b398cea6768Vasu Nori } finally { 715d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.close(); 725d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 735d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 745d217003acf21aea852975af0dff3b398cea6768Vasu Nori 75e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard String getStringField(String field) { 76e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 77e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard try { 78e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard assertEquals(1, cursor.getCount()); 79e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.moveToFirst(); 80e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return cursor.getString(cursor.getColumnIndexOrThrow(field)); 81e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } finally { 82e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.close(); 83e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 84e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 85e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 86e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard long getLongField(String field) { 87e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 88e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard try { 89e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard assertEquals(1, cursor.getCount()); 90e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.moveToFirst(); 91e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return cursor.getLong(cursor.getColumnIndexOrThrow(field)); 92e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } finally { 93e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard cursor.close(); 94e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 95e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 96e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 97dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey byte[] getRawContents() throws Exception { 98e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard ParcelFileDescriptor downloadedFile = mManager.openDownloadedFile(mId); 99e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard assertTrue("Invalid file descriptor: " + downloadedFile, 100e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard downloadedFile.getFileDescriptor().valid()); 101dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream( 10258eee87b70862a7ced85eabc3c225fad24664065Jeff Sharkey downloadedFile); 103e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard try { 104dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey return Streams.readFully(is); 105e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } finally { 106dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey IoUtils.closeQuietly(is); 107e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 108e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 109e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 110dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey String getContents() throws Exception { 111dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey return new String(getRawContents()); 112dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey } 113dffbb9c4567e9d29d19964a83129e38dceab7055Jeff Sharkey 1148ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey void runUntilStatus(int status) throws TimeoutException { 1150de55602ec6d350548248feddc68c91b29326effJeff Sharkey final long startMillis = mSystemFacade.currentTimeMillis(); 1168ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey startService(null); 1170de55602ec6d350548248feddc68c91b29326effJeff Sharkey waitForStatus(status, startMillis); 1188ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey } 1198ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1207ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey void runUntilStatus(int status, long timeout) throws TimeoutException { 1217ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey final long startMillis = mSystemFacade.currentTimeMillis(); 1227ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey startService(null); 1237ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey waitForStatus(status, startMillis, timeout); 1247ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1257ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey 1260de55602ec6d350548248feddc68c91b29326effJeff Sharkey void waitForStatus(int expected, long afterMillis) throws TimeoutException { 1277ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey waitForStatus(expected, afterMillis, 15 * SECOND_IN_MILLIS); 1287ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1297ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey 1307ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey void waitForStatus(int expected, long afterMillis, long timeout) throws TimeoutException { 1318ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey int actual = -1; 1328ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1337ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey final long elapsedTimeout = SystemClock.elapsedRealtime() + timeout; 1347ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey while (SystemClock.elapsedRealtime() < elapsedTimeout) { 1350de55602ec6d350548248feddc68c91b29326effJeff Sharkey if (getLongField(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP) >= afterMillis) { 1360de55602ec6d350548248feddc68c91b29326effJeff Sharkey actual = getStatus(); 1370de55602ec6d350548248feddc68c91b29326effJeff Sharkey if (actual == STATUS_SUCCESSFUL || actual == STATUS_FAILED) { 1380de55602ec6d350548248feddc68c91b29326effJeff Sharkey assertEquals(expected, actual); 1390de55602ec6d350548248feddc68c91b29326effJeff Sharkey return; 1400de55602ec6d350548248feddc68c91b29326effJeff Sharkey } else if (actual == expected) { 1410de55602ec6d350548248feddc68c91b29326effJeff Sharkey return; 1420de55602ec6d350548248feddc68c91b29326effJeff Sharkey } 1437ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey 1447ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey if (timeout > MINUTE_IN_MILLIS) { 1457ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey final int percent = (int) (100 1467ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey * getLongField(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR) 1477ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey / getLongField(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 1487ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey Log.d(LOG_TAG, percent + "% complete"); 1497ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1508ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey } 1518ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1527ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey if (timeout > MINUTE_IN_MILLIS) { 1537ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey SystemClock.sleep(SECOND_IN_MILLIS * 3); 1547ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } else { 1557ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey SystemClock.sleep(100); 1567ce206b2108714035eeed29c1dc268a3f1ccf359Jeff Sharkey } 1578ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey } 1588ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1598ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey throw new TimeoutException("Expected status " + expected + "; only reached " + actual); 160e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 1615d217003acf21aea852975af0dff3b398cea6768Vasu Nori 1625d217003acf21aea852975af0dff3b398cea6768Vasu Nori // max time to wait before giving up on the current download operation. 1635d217003acf21aea852975af0dff3b398cea6768Vasu Nori private static final int MAX_TIME_TO_WAIT_FOR_OPERATION = 5; 1645d217003acf21aea852975af0dff3b398cea6768Vasu Nori // while waiting for the above time period, sleep this long to yield to the 1655d217003acf21aea852975af0dff3b398cea6768Vasu Nori // download thread 1665d217003acf21aea852975af0dff3b398cea6768Vasu Nori private static final int TIME_TO_SLEEP = 1000; 1675d217003acf21aea852975af0dff3b398cea6768Vasu Nori 1685d217003acf21aea852975af0dff3b398cea6768Vasu Nori // waits until progress_so_far is >= (progress)% 1695d217003acf21aea852975af0dff3b398cea6768Vasu Nori boolean runUntilProgress(int progress) throws InterruptedException { 1708ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey startService(null); 1718ac10e0e0667a4fe35191deebb5fa9786bf4226cJeff Sharkey 1725d217003acf21aea852975af0dff3b398cea6768Vasu Nori int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP; 1735d217003acf21aea852975af0dff3b398cea6768Vasu Nori int numBytesReceivedSoFar = 0; 1745d217003acf21aea852975af0dff3b398cea6768Vasu Nori int totalBytes = 0; 1755d217003acf21aea852975af0dff3b398cea6768Vasu Nori for (int i = 0; i < sleepCounter; i++) { 1765d217003acf21aea852975af0dff3b398cea6768Vasu Nori Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId)); 1775d217003acf21aea852975af0dff3b398cea6768Vasu Nori try { 1785d217003acf21aea852975af0dff3b398cea6768Vasu Nori assertEquals(1, cursor.getCount()); 1795d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.moveToFirst(); 1805d217003acf21aea852975af0dff3b398cea6768Vasu Nori numBytesReceivedSoFar = cursor.getInt( 1815d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.getColumnIndexOrThrow( 1825d217003acf21aea852975af0dff3b398cea6768Vasu Nori DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); 1835d217003acf21aea852975af0dff3b398cea6768Vasu Nori totalBytes = cursor.getInt( 1845d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 1855d217003acf21aea852975af0dff3b398cea6768Vasu Nori } finally { 1865d217003acf21aea852975af0dff3b398cea6768Vasu Nori cursor.close(); 1875d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 1885d217003acf21aea852975af0dff3b398cea6768Vasu Nori Log.i(LOG_TAG, "in runUntilProgress, numBytesReceivedSoFar: " + 1895d217003acf21aea852975af0dff3b398cea6768Vasu Nori numBytesReceivedSoFar + ", totalBytes: " + totalBytes); 1905d217003acf21aea852975af0dff3b398cea6768Vasu Nori if (totalBytes == 0) { 1915d217003acf21aea852975af0dff3b398cea6768Vasu Nori fail("total_bytes should not be zero"); 1925d217003acf21aea852975af0dff3b398cea6768Vasu Nori return false; 1935d217003acf21aea852975af0dff3b398cea6768Vasu Nori } else { 1945d217003acf21aea852975af0dff3b398cea6768Vasu Nori if (numBytesReceivedSoFar * 100 / totalBytes >= progress) { 1955d217003acf21aea852975af0dff3b398cea6768Vasu Nori // progress_so_far is >= progress%. we are done 1965d217003acf21aea852975af0dff3b398cea6768Vasu Nori return true; 1975d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 1985d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 1995d217003acf21aea852975af0dff3b398cea6768Vasu Nori // download not done yet. sleep a while and try again 2005d217003acf21aea852975af0dff3b398cea6768Vasu Nori Thread.sleep(TIME_TO_SLEEP); 2015d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 2025d217003acf21aea852975af0dff3b398cea6768Vasu Nori Log.i(LOG_TAG, "FAILED in runUntilProgress, numBytesReceivedSoFar: " + 2035d217003acf21aea852975af0dff3b398cea6768Vasu Nori numBytesReceivedSoFar + ", totalBytes: " + totalBytes); 2045d217003acf21aea852975af0dff3b398cea6768Vasu Nori return false; // failed 2055d217003acf21aea852975af0dff3b398cea6768Vasu Nori } 206e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 207e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 208e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected static final String PACKAGE_NAME = "my.package.name"; 209e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected static final String REQUEST_PATH = "/path"; 210e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 211e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected DownloadManager mManager; 212e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 213e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard public AbstractPublicApiTest(FakeSystemFacade systemFacade) { 214e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard super(systemFacade); 215e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 216e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 217e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard @Override 218e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected void setUp() throws Exception { 219e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard super.setUp(); 220e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard mManager = new DownloadManager(mResolver, PACKAGE_NAME); 221e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 222e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 223ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey protected DownloadManager.Request getRequest() 224ae6856b0fca5215f45619dd031a7e7beae7bd8ccJeff Sharkey throws MalformedURLException, UnknownHostException { 225e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return getRequest(getServerUri(REQUEST_PATH)); 226e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 227e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 228e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected DownloadManager.Request getRequest(String path) { 229e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return new DownloadManager.Request(Uri.parse(path)); 230e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 231e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard 232e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard protected Download enqueueRequest(DownloadManager.Request request) { 233e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard return new Download(mManager.enqueue(request)); 234e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard } 235e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard} 236