Commit a7ae77fd authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Add and enforce ALLOW_METERED column.

Include flag with each download to indicate if its allowed to proceed
over metered networks.  Downloads are left in WAITING_FOR_NETWORK
state, similar to how ALLOWED_NETWORK_TYPES is handled.

Also keep blocked downloads in WAITING_FOR_NETWORK state instead
of marking them as failed.

Bug: 3001465, 5734560
Change-Id: I80bb9aa9bd25ddf6f7a2472db344b6ba6878bd74
parent 9b606340
......@@ -92,6 +92,7 @@ public class DownloadInfo {
info.mIsPublicApi = getInt(Downloads.Impl.COLUMN_IS_PUBLIC_API) != 0;
info.mAllowedNetworkTypes = getInt(Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES);
info.mAllowRoaming = getInt(Downloads.Impl.COLUMN_ALLOW_ROAMING) != 0;
info.mAllowMetered = getInt(Downloads.Impl.COLUMN_ALLOW_METERED) != 0;
info.mTitle = getString(Downloads.Impl.COLUMN_TITLE);
info.mDescription = getString(Downloads.Impl.COLUMN_DESCRIPTION);
info.mBypassRecommendedSizeLimit =
......@@ -221,6 +222,7 @@ public class DownloadInfo {
public boolean mIsPublicApi;
public int mAllowedNetworkTypes;
public boolean mAllowRoaming;
public boolean mAllowMetered;
public String mTitle;
public String mDescription;
public int mBypassRecommendedSizeLimit;
......@@ -352,6 +354,9 @@ public class DownloadInfo {
if (!isRoamingAllowed() && mSystemFacade.isNetworkRoaming()) {
return NETWORK_CANNOT_USE_ROAMING;
}
if (!mAllowMetered && mSystemFacade.isActiveNetworkMetered()) {
return NETWORK_TYPE_DISALLOWED_BY_REQUESTOR;
}
return checkIsNetworkTypeAllowed(info.getType());
}
......@@ -518,6 +523,7 @@ public class DownloadInfo {
pw.printPair("mAllowedNetworkTypes", mAllowedNetworkTypes);
pw.printPair("mAllowRoaming", mAllowRoaming);
pw.printPair("mAllowMetered", mAllowMetered);
pw.println();
pw.decreaseIndent();
......
......@@ -63,7 +63,7 @@ public final class DownloadProvider extends ContentProvider {
/** Database filename */
private static final String DB_NAME = "downloads.db";
/** Current database version */
private static final int DB_VERSION = 107;
private static final int DB_VERSION = 108;
/** Name of table in the database */
private static final String DB_TABLE = "downloads";
......@@ -308,6 +308,11 @@ public final class DownloadProvider extends ContentProvider {
addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ERROR_MSG, "TEXT");
break;
case 108:
addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ALLOW_METERED,
"INTEGER NOT NULL DEFAULT 1");
break;
default:
throw new IllegalStateException("Don't know how to upgrade to " + version);
}
......@@ -632,6 +637,7 @@ public final class DownloadProvider extends ContentProvider {
if (isPublicApi) {
copyInteger(Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES, values, filteredValues);
copyBoolean(Downloads.Impl.COLUMN_ALLOW_ROAMING, values, filteredValues);
copyBoolean(Downloads.Impl.COLUMN_ALLOW_METERED, values, filteredValues);
}
if (Constants.LOGVV) {
......@@ -767,6 +773,7 @@ public final class DownloadProvider extends ContentProvider {
values.remove(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE); // checked later in insert()
values.remove(Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES);
values.remove(Downloads.Impl.COLUMN_ALLOW_ROAMING);
values.remove(Downloads.Impl.COLUMN_ALLOW_METERED);
values.remove(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI);
values.remove(Downloads.Impl.COLUMN_MEDIA_SCANNED);
Iterator<Map.Entry<String, Object>> iterator = values.valueSet().iterator();
......
......@@ -270,8 +270,6 @@ public class DownloadThread extends Thread {
} else if (networkUsable == DownloadInfo.NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE) {
status = Downloads.Impl.STATUS_QUEUED_FOR_WIFI;
mInfo.notifyPauseDueToSize(false);
} else if (networkUsable == DownloadInfo.NETWORK_BLOCKED) {
status = Downloads.Impl.STATUS_BLOCKED;
}
throw new StopRequestException(status,
mInfo.getLogMessageForNetworkError(networkUsable));
......@@ -806,8 +804,6 @@ public class DownloadThread extends Thread {
case DownloadInfo.NETWORK_UNUSABLE_DUE_TO_SIZE:
case DownloadInfo.NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE:
return Downloads.Impl.STATUS_QUEUED_FOR_WIFI;
case DownloadInfo.NETWORK_BLOCKED:
return Downloads.Impl.STATUS_BLOCKED;
default:
return Downloads.Impl.STATUS_WAITING_FOR_NETWORK;
}
......
......@@ -42,6 +42,12 @@ class RealSystemFacade implements SystemFacade {
return activeInfo;
}
@Override
public boolean isActiveNetworkMetered() {
final ConnectivityManager conn = ConnectivityManager.from(mContext);
return conn.isActiveNetworkMetered();
}
public boolean isNetworkRoaming() {
ConnectivityManager connectivity =
(ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
......
......@@ -19,6 +19,8 @@ interface SystemFacade {
*/
public NetworkInfo getActiveNetworkInfo(int uid);
public boolean isActiveNetworkMetered();
/**
* @see android.telephony.TelephonyManager#isNetworkRoaming
*/
......
......@@ -18,6 +18,7 @@ public class FakeSystemFacade implements SystemFacade {
long mTimeMillis = 0;
Integer mActiveNetworkType = ConnectivityManager.TYPE_WIFI;
boolean mIsRoaming = false;
boolean mIsMetered = false;
Long mMaxBytesOverMobile = null;
Long mRecommendedMaxBytesOverMobile = null;
List<Intent> mBroadcastsSent = new ArrayList<Intent>();
......@@ -45,6 +46,11 @@ public class FakeSystemFacade implements SystemFacade {
}
}
@Override
public boolean isActiveNetworkMetered() {
return mIsMetered;
}
public boolean isNetworkRoaming() {
return mIsRoaming;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment