182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori/* 282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Copyright (C) 2010 The Android Open Source Project 382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Licensed under the Apache License, Version 2.0 (the "License"); 582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * you may not use this file except in compliance with the License. 682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * You may obtain a copy of the License at 782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * http://www.apache.org/licenses/LICENSE-2.0 982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 1082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Unless required by applicable law or agreed to in writing, software 1182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * distributed under the License is distributed on an "AS IS" BASIS, 1282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * See the License for the specific language governing permissions and 1482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * limitations under the License. 1582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 1682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 1782e891b3259350a92b55969a6380ca1240ee0829Vasu Noripackage com.android.frameworks.downloadmanagertests; 1882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 1982e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.app.DownloadManager; 2082e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.app.DownloadManager.Query; 2182e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.BroadcastReceiver; 2282e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.Context; 2382e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.Intent; 2482e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.IntentFilter; 2582e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.database.Cursor; 2682e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.net.ConnectivityManager; 2782e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.net.NetworkInfo; 2882e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.net.wifi.WifiManager; 2982e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.os.Environment; 3082e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.os.ParcelFileDescriptor; 3182e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.os.SystemClock; 3282e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.provider.Settings; 3382e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.test.InstrumentationTestCase; 3482e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.util.Log; 3582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 3682e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.io.File; 3782e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.util.Collections; 3882e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.util.HashSet; 3982e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.util.Set; 40b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkeyimport java.util.concurrent.TimeoutException; 4182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 4282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori/** 4382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Base class for Instrumented tests for the Download Manager. 4482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 4582e891b3259350a92b55969a6380ca1240ee0829Vasu Noripublic class DownloadManagerBaseTest extends InstrumentationTestCase { 4682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 4782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected DownloadManager mDownloadManager = null; 4882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected String mFileType = "text/plain"; 4982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected Context mContext = null; 5082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected MultipleDownloadsCompletedReceiver mReceiver = null; 5182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int DEFAULT_FILE_SIZE = 10 * 1024; // 10kb 5282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int FILE_BLOCK_READ_SIZE = 1024 * 1024; 5382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 5482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final String LOG_TAG = "android.net.DownloadManagerBaseTest"; 5582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int HTTP_OK = 200; 5682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int HTTP_REDIRECT = 307; 5782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int HTTP_PARTIAL_CONTENT = 206; 5882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int HTTP_NOT_FOUND = 404; 5982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int HTTP_SERVICE_UNAVAILABLE = 503; 6082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 6182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int DEFAULT_MAX_WAIT_TIME = 2 * 60 * 1000; // 2 minutes 6282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int DEFAULT_WAIT_POLL_TIME = 5 * 1000; // 5 seconds 6382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 6482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int WAIT_FOR_DOWNLOAD_POLL_TIME = 1 * 1000; // 1 second 6582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int MAX_WAIT_FOR_DOWNLOAD_TIME = 5 * 60 * 1000; // 5 minutes 6682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected static final int MAX_WAIT_FOR_LARGE_DOWNLOAD_TIME = 15 * 60 * 1000; // 15 minutes 6782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 6882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public static class MultipleDownloadsCompletedReceiver extends BroadcastReceiver { 6982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private volatile int mNumDownloadsCompleted = 0; 7082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private Set<Long> downloadIds = Collections.synchronizedSet(new HashSet<Long>()); 7182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 7282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 7382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * {@inheritDoc} 7482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 7582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori @Override 7682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public void onReceive(Context context, Intent intent) { 7782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (intent.getAction().equalsIgnoreCase(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) { 7882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori synchronized(this) { 7982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori long id = intent.getExtras().getLong(DownloadManager.EXTRA_DOWNLOAD_ID); 8082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Received Notification for download: " + id); 8182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (!downloadIds.contains(id)) { 8282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori ++mNumDownloadsCompleted; 8382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "MultipleDownloadsCompletedReceiver got intent: " + 8482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori intent.getAction() + " --> total count: " + mNumDownloadsCompleted); 8582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori downloadIds.add(id); 8682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 8782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori DownloadManager dm = (DownloadManager)context.getSystemService( 8882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Context.DOWNLOAD_SERVICE); 8982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 9082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Cursor cursor = dm.query(new Query().setFilterById(id)); 9182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 9282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (cursor.moveToFirst()) { 9382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int status = cursor.getInt(cursor.getColumnIndex( 9482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori DownloadManager.COLUMN_STATUS)); 9582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Download status is: " + status); 9682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } else { 9782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori fail("No status found for completed download!"); 9882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 9982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } finally { 10082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.close(); 10182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 10282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } else { 10382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Notification for id: " + id + " has already been made."); 10482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 10582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 10682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 10782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 10882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 10982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 11082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Gets the number of times the {@link #onReceive} callback has been called for the 111b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey * {@link DownloadManager#ACTION_DOWNLOAD_COMPLETE} action, indicating the number of 11282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * downloads completed thus far. 11382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 11482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return the number of downloads completed so far. 11582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 11682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public int numDownloadsCompleted() { 11782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return mNumDownloadsCompleted; 11882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 11982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 12082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 12182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Gets the list of download IDs. 12282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return A Set<Long> with the ids of the completed downloads. 12382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 12482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public Set<Long> getDownloadIds() { 12582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori synchronized(this) { 12682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Set<Long> returnIds = new HashSet<Long>(downloadIds); 12782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return returnIds; 12882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 12982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 13082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 13182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 13282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 13382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public static class WiFiChangedReceiver extends BroadcastReceiver { 13482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private Context mContext = null; 13582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 13682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 13782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Constructor 13882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 13982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Sets the current state of WiFi. 14082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 14182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param context The current app {@link Context}. 14282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 14382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public WiFiChangedReceiver(Context context) { 14482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mContext = context; 14582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 14682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 14782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 14882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * {@inheritDoc} 14982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 15082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori @Override 15182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public void onReceive(Context context, Intent intent) { 15282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (intent.getAction().equalsIgnoreCase(ConnectivityManager.CONNECTIVITY_ACTION)) { 15382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "ConnectivityManager state change: " + intent.getAction()); 15482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori synchronized (this) { 15582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori this.notify(); 15682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 15782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 15882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 15982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 16082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 16182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Gets the current state of WiFi. 16282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 16382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return Returns true if WiFi is on, false otherwise. 16482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 16582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public boolean getWiFiIsOn() { 16682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori ConnectivityManager connManager = (ConnectivityManager)mContext.getSystemService( 16782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Context.CONNECTIVITY_SERVICE); 16882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori NetworkInfo info = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 16982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "WiFi Connection state is currently: " + info.isConnected()); 17082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return info.isConnected(); 17182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 17282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 17382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 17482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 17582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * {@inheritDoc} 17682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 17782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori @Override 17882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori public void setUp() throws Exception { 17982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mContext = getInstrumentation().getContext(); 18082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mDownloadManager = (DownloadManager)mContext.getSystemService(Context.DOWNLOAD_SERVICE); 18182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mReceiver = registerNewMultipleDownloadsReceiver(); 18282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 18382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 18482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 18582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to verify the size of a file. 18682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 18782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param pfd The input file to compare the size of 18882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param size The expected size of the file 18982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 19082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void verifyFileSize(ParcelFileDescriptor pfd, long size) { 19182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori assertEquals(pfd.getStatSize(), size); 19282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 19382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 19482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 19582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to create and register a new MultipleDownloadCompletedReciever 19682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 19782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * This is used to track many simultaneous downloads by keeping count of all the downloads 19882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * that have completed. 19982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 20082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return A new receiver that records and can be queried on how many downloads have completed. 20182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 20282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected MultipleDownloadsCompletedReceiver registerNewMultipleDownloadsReceiver() { 20382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori MultipleDownloadsCompletedReceiver receiver = new MultipleDownloadsCompletedReceiver(); 20482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mContext.registerReceiver(receiver, new IntentFilter( 20582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 20682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return receiver; 20782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 20882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 20982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 21082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Enables or disables WiFi. 21182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 21282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Note: Needs the following permissions: 21382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * android.permission.ACCESS_WIFI_STATE 21482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * android.permission.CHANGE_WIFI_STATE 21582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param enable true if it should be enabled, false if it should be disabled 21682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 21782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void setWiFiStateOn(boolean enable) throws Exception { 21882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Setting WiFi State to: " + enable); 21982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori WifiManager manager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE); 22082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 22182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori manager.setWifiEnabled(enable); 22282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 22382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori String timeoutMessage = "Timed out waiting for Wifi to be " 22482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori + (enable ? "enabled!" : "disabled!"); 22582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 22682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori WiFiChangedReceiver receiver = new WiFiChangedReceiver(mContext); 22782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mContext.registerReceiver(receiver, new IntentFilter( 22882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori ConnectivityManager.CONNECTIVITY_ACTION)); 22982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 23082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori synchronized (receiver) { 23182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori long timeoutTime = SystemClock.elapsedRealtime() + DEFAULT_MAX_WAIT_TIME; 23282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori boolean timedOut = false; 23382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 23482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (receiver.getWiFiIsOn() != enable && !timedOut) { 23582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 23682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori receiver.wait(DEFAULT_WAIT_POLL_TIME); 23782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 23882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (SystemClock.elapsedRealtime() > timeoutTime) { 23982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori timedOut = true; 24082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 24182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 24282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori catch (InterruptedException e) { 24382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // ignore InterruptedExceptions 24482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 24582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 24682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (timedOut) { 24782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori fail(timeoutMessage); 24882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 24982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 25082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori assertEquals(enable, receiver.getWiFiIsOn()); 25182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 25282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 25382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 25482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to enables or disables airplane mode. If successful, it also broadcasts an intent 25582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * indicating that the mode has changed. 25682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 25782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Note: Needs the following permission: 25882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * android.permission.WRITE_SETTINGS 25982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param enable true if airplane mode should be ON, false if it should be OFF 26082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 26182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void setAirplaneModeOn(boolean enable) throws Exception { 26282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int state = enable ? 1 : 0; 26382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 26482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // Change the system setting 26535fae68cc3eb21c15069c58d275a46537cc04f4aTsu Chiang Chuang Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 26682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori state); 26782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 26882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori String timeoutMessage = "Timed out waiting for airplane mode to be " + 26982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori (enable ? "enabled!" : "disabled!"); 27082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 27182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // wait for airplane mode to change state 27282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 27382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (Settings.System.getInt(mContext.getContentResolver(), 27435fae68cc3eb21c15069c58d275a46537cc04f4aTsu Chiang Chuang Settings.Global.AIRPLANE_MODE_ON, -1) != state) { 27582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori timeoutWait(currentWaitTime, DEFAULT_WAIT_POLL_TIME, DEFAULT_MAX_WAIT_TIME, 27682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori timeoutMessage); 27782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 27882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 27982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // Post the intent 28082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 28182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori intent.putExtra("state", true); 28282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mContext.sendBroadcast(intent); 28382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 28482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 28582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 28682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to wait for a particular download to finish, or else a timeout to occur 28782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 28882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Does not wait for a receiver notification of the download. 28982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 29082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param id The download id to query on (wait for) 29182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 292fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen protected void waitForDownloadOrTimeout_skipNotification(long id) throws TimeoutException, 29382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori InterruptedException { 294fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen doWaitForDownloadsOrTimeout(new Query().setFilterById(id), 295fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME); 29682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 29782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 29882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 29982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to wait for a particular download to finish, or else a timeout to occur 30082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 30182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Also guarantees a notification has been posted for the download. 30282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 30382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param id The download id to query on (wait for) 30482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 30582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void waitForDownloadOrTimeout(long id) throws TimeoutException, 30682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori InterruptedException { 307fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen waitForDownloadOrTimeout(id, WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME); 30882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 30982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 31082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 31182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to wait for a particular download to finish, or else a timeout to occur 31282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 31382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Also guarantees a notification has been posted for the download. 31482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 31582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param id The download id to query on (wait for) 31682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param poll The amount of time to wait 31782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param timeoutMillis The max time (in ms) to wait for the download(s) to complete 31882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 31982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void waitForDownloadOrTimeout(long id, long poll, long timeoutMillis) 32082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori throws TimeoutException, InterruptedException { 32182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori doWaitForDownloadsOrTimeout(new Query().setFilterById(id), poll, timeoutMillis); 32282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori waitForReceiverNotifications(1); 32382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 32482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 32582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 32682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to wait for all downloads to finish, or else a specified timeout to occur 32782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 32882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Makes no guaranee that notifications have been posted for all downloads. 32982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 33082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param poll The amount of time to wait 33182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param timeoutMillis The max time (in ms) to wait for the download(s) to complete 33282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 33382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void waitForDownloadsOrTimeout(long poll, long timeoutMillis) throws TimeoutException, 33482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori InterruptedException { 33582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori doWaitForDownloadsOrTimeout(new Query(), poll, timeoutMillis); 33682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 33782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 33882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 33982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to wait for all downloads to finish, or else a timeout to occur, but does not throw 34082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 34182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Also guarantees a notification has been posted for the download. 34282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 34382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param id The id of the download to query against 34482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param poll The amount of time to wait 34582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param timeoutMillis The max time (in ms) to wait for the download(s) to complete 34682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return true if download completed successfully (didn't timeout), false otherwise 34782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 34882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private boolean waitForDownloadOrTimeoutNoThrow(long id, long poll, long timeoutMillis) { 34982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 35082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori doWaitForDownloadsOrTimeout(new Query().setFilterById(id), poll, timeoutMillis); 35182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori waitForReceiverNotifications(1); 35282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } catch (TimeoutException e) { 35382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return false; 35482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 35582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return true; 35682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 35782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 35882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 35982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper function to synchronously wait, or timeout if the maximum threshold has been exceeded. 36082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 36182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param currentTotalWaitTime The total time waited so far 36282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param poll The amount of time to wait 36382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param maxTimeoutMillis The total wait time threshold; if we've waited more than this long, 36482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * we timeout and fail 36582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param timedOutMessage The message to display in the failure message if we timeout 36682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return The new total amount of time we've waited so far 36782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @throws TimeoutException if timed out waiting for SD card to mount 36882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 36982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private int timeoutWait(int currentTotalWaitTime, long poll, long maxTimeoutMillis, 37082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori String timedOutMessage) throws TimeoutException { 37182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori long now = SystemClock.elapsedRealtime(); 37282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori long end = now + poll; 37382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 37482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // if we get InterruptedException's, ignore them and just keep sleeping 37582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (now < end) { 37682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 37782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Thread.sleep(end - now); 37882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } catch (InterruptedException e) { 37982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // ignore interrupted exceptions 38082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 38182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori now = SystemClock.elapsedRealtime(); 38282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 38382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 38482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentTotalWaitTime += poll; 38582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (currentTotalWaitTime > maxTimeoutMillis) { 38682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori throw new TimeoutException(timedOutMessage); 38782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 38882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return currentTotalWaitTime; 38982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 39082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 39182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 39282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to wait for all downloads to finish, or else a timeout to occur 39382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 39482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param query The query to pass to the download manager 39582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param poll The poll time to wait between checks 39682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param timeoutMillis The max amount of time (in ms) to wait for the download(s) to complete 39782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 39882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private void doWaitForDownloadsOrTimeout(Query query, long poll, long timeoutMillis) 39982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori throws TimeoutException { 40082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 40182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (true) { 40282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori query.setFilterByStatus(DownloadManager.STATUS_PENDING | DownloadManager.STATUS_PAUSED 40382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori | DownloadManager.STATUS_RUNNING); 40482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Cursor cursor = mDownloadManager.query(query); 40582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 40682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 40782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (cursor.getCount() == 0) { 40882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "All downloads should be done..."); 40982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori break; 41082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 41182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime = timeoutWait(currentWaitTime, poll, timeoutMillis, 41282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori "Timed out waiting for all downloads to finish"); 41382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } finally { 41482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.close(); 41582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 41682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 41782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 41882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 41982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 42082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Synchronously waits for external store to be mounted (eg: SD Card). 42182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 42282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @throws InterruptedException if interrupted 42382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @throws Exception if timed out waiting for SD card to mount 42482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 42582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void waitForExternalStoreMount() throws Exception { 42682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori String extStorageState = Environment.getExternalStorageState(); 42782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 42882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (!extStorageState.equals(Environment.MEDIA_MOUNTED)) { 42982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Waiting for SD card..."); 43082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime = timeoutWait(currentWaitTime, DEFAULT_WAIT_POLL_TIME, 43182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori DEFAULT_MAX_WAIT_TIME, "Timed out waiting for SD Card to be ready!"); 43282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori extStorageState = Environment.getExternalStorageState(); 43382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 43482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 43582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 43682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 43782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Synchronously waits for a download to start. 43882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 43982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param dlRequest the download request id used by Download Manager to track the download. 44082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @throws Exception if timed out while waiting for SD card to mount 44182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 44282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void waitForDownloadToStart(long dlRequest) throws Exception { 44382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Cursor cursor = getCursor(dlRequest); 44482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 44582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 44682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int value = cursor.getInt(columnIndex); 44782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 44882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 44982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (value != DownloadManager.STATUS_RUNNING && 45082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori (value != DownloadManager.STATUS_FAILED) && 45182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori (value != DownloadManager.STATUS_SUCCESSFUL)) { 45282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Waiting for download to start..."); 45382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME, 45482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for download to start!"); 45582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.requery(); 45682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori assertTrue(cursor.moveToFirst()); 45782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 45882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori value = cursor.getInt(columnIndex); 45982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 46082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori assertFalse("Download failed immediately after start", 46182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori value == DownloadManager.STATUS_FAILED); 46282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } finally { 46382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.close(); 46482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 46582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 46682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 46782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 46882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Synchronously waits for our receiver to receive notification for a given number of 46982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * downloads. 47082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 47182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param targetNumber The number of notifications for unique downloads to wait for; pass in 47282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * -1 to not wait for notification. 47382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @throws Exception if timed out while waiting 47482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 47582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private void waitForReceiverNotifications(int targetNumber) throws TimeoutException { 47682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int count = mReceiver.numDownloadsCompleted(); 47782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 47882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 47982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (count < targetNumber) { 48082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Waiting for notification of downloads..."); 48182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME, 48282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for download notifications!" 48382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori + " Received " + count + "notifications."); 48482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori count = mReceiver.numDownloadsCompleted(); 48582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 48682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 48782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 48882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 48982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Synchronously waits for a file to increase in size (such as to monitor that a download is 49082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * progressing). 49182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 49282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param file The file whose size to track. 49382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @throws Exception if timed out while waiting for the file to grow in size. 49482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 49582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void waitForFileToGrow(File file) throws Exception { 49682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 49782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 49882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // File may not even exist yet, so wait until it does (or we timeout) 49982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (!file.exists()) { 50082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Waiting for file to exist..."); 50182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME, 50282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for file to be created."); 50382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 50482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 50582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori // Get original file size... 50682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori long originalSize = file.length(); 50782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 50882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (file.length() <= originalSize) { 50982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Waiting for file to be written to..."); 51082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME, 51182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for file to be written to."); 51282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 51382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 51482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 51582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 51682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to remove all downloads that are registered with the DL Manager. 51782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 51882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Note: This gives us a clean slate b/c it includes downloads that are pending, running, 51982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * paused, or have completed. 52082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 52182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected void removeAllCurrentDownloads() { 52282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Log.i(LOG_TAG, "Removing all current registered downloads..."); 52382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Cursor cursor = mDownloadManager.query(new Query()); 52482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 52582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (cursor.moveToFirst()) { 52682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori do { 52782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int index = cursor.getColumnIndex(DownloadManager.COLUMN_ID); 52882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori long downloadId = cursor.getLong(index); 52982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 53082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori mDownloadManager.remove(downloadId); 53182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } while (cursor.moveToNext()); 53282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 53382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } finally { 53482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.close(); 53582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 53682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 53782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 53882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 53982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Helper to verify an int value in a Cursor 54082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 54182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param cursor The cursor containing the query results 54282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param columnName The name of the column to query 54382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param expected The expected int value 54482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 54582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori private void verifyInt(Cursor cursor, String columnName, int expected) { 54682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int index = cursor.getColumnIndex(columnName); 54782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int actual = cursor.getInt(index); 54882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori assertEquals(expected, actual); 54982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 55082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 55182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori /** 55282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Performs a query based on ID and returns a Cursor for the query. 55382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * 55482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @param id The id of the download in DL Manager; pass -1 to query all downloads 55582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * @return A cursor for the query results 55682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */ 55782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori protected Cursor getCursor(long id) throws Exception { 55882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Query query = new Query(); 55982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (id != -1) { 56082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori query.setFilterById(id); 56182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 56282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 56382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Cursor cursor = mDownloadManager.query(query); 56482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori int currentWaitTime = 0; 56582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori 56682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori try { 56782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori while (!cursor.moveToFirst()) { 56882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori Thread.sleep(DEFAULT_WAIT_POLL_TIME); 56982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori currentWaitTime += DEFAULT_WAIT_POLL_TIME; 57082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori if (currentWaitTime > DEFAULT_MAX_WAIT_TIME) { 57182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori fail("timed out waiting for a non-null query result"); 57282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 57382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.requery(); 57482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 57582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } catch (Exception e) { 57682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori cursor.close(); 57782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori throw e; 57882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 57982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori return cursor; 58082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori } 581fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen} 582