From af28400b74de05862b470412a5c92f68e99f59f8 Mon Sep 17 00:00:00 2001 From: Steve Howard Date: Thu, 15 Jul 2010 15:57:31 -0700 Subject: Introduce a seam to ConnectivityManager and TelephonyManager This change abstracts access to ConnectivityManager and TelephonyManager behind methods on SystemFacade, moving the code from Helpers into RealSystemFacade and adding fake implementations to FakeSystemFacade. This facilitates new connectivity tests. Change-Id: Id6c6b861e1d4ca45b3c1572bfb8ae0aa26af756b --- .../providers/downloads/DownloadProvider.java | 2 +- .../providers/downloads/DownloadReceiver.java | 10 +++- .../providers/downloads/DownloadService.java | 13 +++-- .../providers/downloads/DownloadThread.java | 14 +++--- src/com/android/providers/downloads/Helpers.java | 51 ++----------------- .../providers/downloads/RealSystemFacade.java | 58 ++++++++++++++++++++++ .../android/providers/downloads/SystemFacade.java | 15 ++++++ 7 files changed, 99 insertions(+), 64 deletions(-) (limited to 'src/com/android/providers/downloads') 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(); } -- cgit v1.2.3