diff options
Diffstat (limited to 'src')
7 files changed, 99 insertions, 64 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 186b01f1..4007e761 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -247,7 +247,7 @@ public final class DownloadProvider extends ContentProvider { @Override public boolean onCreate() { if (mSystemFacade == null) { - mSystemFacade = new RealSystemFacade(); + mSystemFacade = new RealSystemFacade(getContext()); } mOpenHelper = new DatabaseHelper(getContext()); diff --git a/src/com/android/providers/downloads/DownloadReceiver.java b/src/com/android/providers/downloads/DownloadReceiver.java index e8f10e7d..0b4a12da 100644 --- a/src/com/android/providers/downloads/DownloadReceiver.java +++ b/src/com/android/providers/downloads/DownloadReceiver.java @@ -38,7 +38,13 @@ import java.io.File; */ public class DownloadReceiver extends BroadcastReceiver { + SystemFacade mSystemFacade = null; + public void onReceive(Context context, Intent intent) { + if (mSystemFacade == null) { + mSystemFacade = new RealSystemFacade(context); + } + if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { if (Constants.LOGVV) { Log.v(Constants.TAG, "Receiver onBoot"); @@ -52,7 +58,7 @@ public class DownloadReceiver extends BroadcastReceiver { intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null && info.isConnected()) { if (Constants.LOGX) { - if (Helpers.isNetworkAvailable(context)) { + if (Helpers.isNetworkAvailable(mSystemFacade)) { Log.i(Constants.TAG, "Broadcast: Network Up"); } else { Log.i(Constants.TAG, "Broadcast: Network Up, Actually Down"); @@ -61,7 +67,7 @@ public class DownloadReceiver extends BroadcastReceiver { context.startService(new Intent(context, DownloadService.class)); } else { if (Constants.LOGX) { - if (Helpers.isNetworkAvailable(context)) { + if (Helpers.isNetworkAvailable(mSystemFacade)) { Log.i(Constants.TAG, "Broadcast: Network Down, Actually Up"); } else { Log.i(Constants.TAG, "Broadcast: Network Down"); diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java index 2e713fbf..b5cb2d45 100644 --- a/src/com/android/providers/downloads/DownloadService.java +++ b/src/com/android/providers/downloads/DownloadService.java @@ -16,9 +16,6 @@ package com.android.providers.downloads; -import com.google.android.collect.Lists; -import com.google.common.annotations.VisibleForTesting; - import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; @@ -45,11 +42,13 @@ import android.provider.Downloads; import android.util.Config; import android.util.Log; +import com.google.android.collect.Lists; +import com.google.common.annotations.VisibleForTesting; + import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; -import java.util.List; /** @@ -205,7 +204,7 @@ public class DownloadService extends Service { } if (mSystemFacade == null) { - mSystemFacade = new RealSystemFacade(); + mSystemFacade = new RealSystemFacade(this); } mDownloads = Lists.newArrayList(); @@ -311,8 +310,8 @@ public class DownloadService extends Service { } mPendingUpdate = false; } - boolean networkAvailable = Helpers.isNetworkAvailable(DownloadService.this); - boolean networkRoaming = Helpers.isNetworkRoaming(DownloadService.this); + boolean networkAvailable = Helpers.isNetworkAvailable(mSystemFacade); + boolean networkRoaming = Helpers.isNetworkRoaming(mSystemFacade); long now = mSystemFacade.currentTimeMillis(); Cursor cursor = getContentResolver().query(Downloads.Impl.CONTENT_URI, diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java index 8188eaae..e7763e4e 100644 --- a/src/com/android/providers/downloads/DownloadThread.java +++ b/src/com/android/providers/downloads/DownloadThread.java @@ -211,13 +211,13 @@ http_request_loop: break http_request_loop; } catch (IOException ex) { if (Constants.LOGX) { - if (Helpers.isNetworkAvailable(mContext)) { + if (Helpers.isNetworkAvailable(mSystemFacade)) { Log.i(Constants.TAG, "Execute Failed " + mInfo.mId + ", Net Up"); } else { Log.i(Constants.TAG, "Execute Failed " + mInfo.mId + ", Net Down"); } } - if (!Helpers.isNetworkAvailable(mContext)) { + if (!Helpers.isNetworkAvailable(mSystemFacade)) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; @@ -446,13 +446,13 @@ http_request_loop: entityStream = response.getEntity().getContent(); } catch (IOException ex) { if (Constants.LOGX) { - if (Helpers.isNetworkAvailable(mContext)) { + if (Helpers.isNetworkAvailable(mSystemFacade)) { Log.i(Constants.TAG, "Get Failed " + mInfo.mId + ", Net Up"); } else { Log.i(Constants.TAG, "Get Failed " + mInfo.mId + ", Net Down"); } } - if (!Helpers.isNetworkAvailable(mContext)) { + if (!Helpers.isNetworkAvailable(mSystemFacade)) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; @@ -479,7 +479,7 @@ http_request_loop: bytesRead = entityStream.read(data); } catch (IOException ex) { if (Constants.LOGX) { - if (Helpers.isNetworkAvailable(mContext)) { + if (Helpers.isNetworkAvailable(mSystemFacade)) { Log.i(Constants.TAG, "Read Failed " + mInfo.mId + ", Net Up"); } else { Log.i(Constants.TAG, "Read Failed " + mInfo.mId + ", Net Down"); @@ -501,7 +501,7 @@ http_request_loop: "can't resume interrupted download with no ETag"); } finalStatus = Downloads.Impl.STATUS_PRECONDITION_FAILED; - } else if (!Helpers.isNetworkAvailable(mContext)) { + } else if (!Helpers.isNetworkAvailable(mSystemFacade)) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; @@ -538,7 +538,7 @@ http_request_loop: mInfo.mId); } finalStatus = Downloads.Impl.STATUS_LENGTH_REQUIRED; - } else if (!Helpers.isNetworkAvailable(mContext)) { + } else if (!Helpers.isNetworkAvailable(mSystemFacade)) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) { finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED; diff --git a/src/com/android/providers/downloads/Helpers.java b/src/com/android/providers/downloads/Helpers.java index 2705a7cb..4a0f860b 100644 --- a/src/com/android/providers/downloads/Helpers.java +++ b/src/com/android/providers/downloads/Helpers.java @@ -514,58 +514,15 @@ public class Helpers { /** * Returns whether the network is available */ - public static boolean isNetworkAvailable(Context context) { - ConnectivityManager connectivity = - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - if (connectivity == null) { - Log.w(Constants.TAG, "couldn't get connectivity manager"); - } else { - NetworkInfo[] info = connectivity.getAllNetworkInfo(); - if (info != null) { - for (int i = 0; i < info.length; i++) { - if (info[i].getState() == NetworkInfo.State.CONNECTED) { - if (Constants.LOGVV) { - Log.v(Constants.TAG, "network is available"); - } - return true; - } - } - } - } - if (Constants.LOGVV) { - Log.v(Constants.TAG, "network is not available"); - } - return false; + public static boolean isNetworkAvailable(SystemFacade system) { + return !system.getConnectedNetworkTypes().isEmpty(); } /** * Returns whether the network is roaming */ - public static boolean isNetworkRoaming(Context context) { - ConnectivityManager connectivity = - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - if (connectivity == null) { - Log.w(Constants.TAG, "couldn't get connectivity manager"); - } else { - NetworkInfo info = connectivity.getActiveNetworkInfo(); - if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE) { - if (TelephonyManager.getDefault().isNetworkRoaming()) { - if (Constants.LOGVV) { - Log.v(Constants.TAG, "network is roaming"); - } - return true; - } else { - if (Constants.LOGVV) { - Log.v(Constants.TAG, "network is not roaming"); - } - } - } else { - if (Constants.LOGVV) { - Log.v(Constants.TAG, "not using mobile network"); - } - } - } - return false; + public static boolean isNetworkRoaming(SystemFacade system) { + return system.isNetworkRoaming(); } /** diff --git a/src/com/android/providers/downloads/RealSystemFacade.java b/src/com/android/providers/downloads/RealSystemFacade.java index 88f10d8c..41ca6b6e 100644 --- a/src/com/android/providers/downloads/RealSystemFacade.java +++ b/src/com/android/providers/downloads/RealSystemFacade.java @@ -1,7 +1,65 @@ package com.android.providers.downloads; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.telephony.TelephonyManager; +import android.util.Log; + +import java.util.BitSet; + class RealSystemFacade implements SystemFacade { + private Context mContext; + + public RealSystemFacade(Context context) { + mContext = context; + } + public long currentTimeMillis() { return System.currentTimeMillis(); } + + public BitSet getConnectedNetworkTypes() { + BitSet connectedTypes = new BitSet(); + + ConnectivityManager connectivity = + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivity == null) { + Log.w(Constants.TAG, "couldn't get connectivity manager"); + return connectedTypes; + } + + NetworkInfo[] infos = connectivity.getAllNetworkInfo(); + if (infos != null) { + for (NetworkInfo info : infos) { + if (info.getState() == NetworkInfo.State.CONNECTED) { + connectedTypes.set(info.getType()); + } + } + } + + if (Constants.LOGVV) { + boolean isConnected = !connectedTypes.isEmpty(); + Log.v(Constants.TAG, "network is " + (isConnected ? "" : "not ") + "available"); + } + return connectedTypes; + } + + public boolean isNetworkRoaming() { + ConnectivityManager connectivity = + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivity == null) { + Log.w(Constants.TAG, "couldn't get connectivity manager"); + return false; + } + + NetworkInfo info = connectivity.getActiveNetworkInfo(); + boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE); + boolean isRoaming = isMobile && TelephonyManager.getDefault().isNetworkRoaming(); + if (Constants.LOGVV) { + Log.v(Constants.TAG, "network is mobile: " + isMobile); + Log.v(Constants.TAG, "network is roaming: " + isRoaming); + } + return isMobile && isRoaming; + } } diff --git a/src/com/android/providers/downloads/SystemFacade.java b/src/com/android/providers/downloads/SystemFacade.java index 4498877d..e16e6a06 100644 --- a/src/com/android/providers/downloads/SystemFacade.java +++ b/src/com/android/providers/downloads/SystemFacade.java @@ -1,6 +1,21 @@ package com.android.providers.downloads; +import java.util.BitSet; + interface SystemFacade { + /** + * @see System#currentTimeMillis() + */ public long currentTimeMillis(); + + /** + * @return Network types (as in ConnectivityManager.TYPE_*) of all connected networks. + */ + public BitSet getConnectedNetworkTypes(); + + /** + * @see android.telephony.TelephonyManager#isNetworkRoaming + */ + public boolean isNetworkRoaming(); } |