ConnectivityManagerCompat.java revision c725e0cfeb10019175b9a7e1eba80081848f7484
15d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey/* 25d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Copyright (C) 2012 The Android Open Source Project 35d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * 45d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 55d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * you may not use this file except in compliance with the License. 65d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * You may obtain a copy of the License at 75d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * 85d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 95d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * 105d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Unless required by applicable law or agreed to in writing, software 115d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 125d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * See the License for the specific language governing permissions and 145d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * limitations under the License. 155d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey */ 165d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 175d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeypackage android.support.v4.net; 185d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 19d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkeyimport android.content.Intent; 205d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport android.net.ConnectivityManager; 215d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport android.net.NetworkInfo; 225d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport android.os.Build; 23ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viveretteimport android.support.annotation.IntDef; 24ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 25ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viveretteimport java.lang.annotation.Retention; 26ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viveretteimport java.lang.annotation.RetentionPolicy; 275d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 28f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_MOBILE; 29f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_MOBILE_DUN; 30f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI; 31f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_MOBILE_MMS; 32f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_MOBILE_SUPL; 33f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_WIFI; 34f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikovimport static android.net.ConnectivityManager.TYPE_WIMAX; 35f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikov 365d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey/** 375d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Helper for accessing features in {@link ConnectivityManager} introduced after 385d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * API level 16 in a backwards compatible fashion. 395d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey */ 40c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class ConnectivityManagerCompat { 415d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 425d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey interface ConnectivityManagerCompatImpl { 435d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey boolean isActiveNetworkMetered(ConnectivityManager cm); 44ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 45ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette @RestrictBackgroundStatus 46ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette int getRestrictBackgroundStatus(ConnectivityManager cm); 47ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette } 48ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 49ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette /** @hide */ 50ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette @Retention(RetentionPolicy.SOURCE) 51ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette @IntDef(flag = false, value = { 52ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette RESTRICT_BACKGROUND_STATUS_DISABLED, 53ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette RESTRICT_BACKGROUND_STATUS_WHITELISTED, 54ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette RESTRICT_BACKGROUND_STATUS_ENABLED, 55ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette }) 56ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public @interface RestrictBackgroundStatus { 575d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 585d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 59ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette /** 60ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * Device is not restricting metered network activity while application is running on 61ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * background. 62ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette */ 63ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; 64ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 65ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette /** 66ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * Device is restricting metered network activity while application is running on background, 67ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * but application is allowed to bypass it. 68ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * <p> 69ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * In this state, application should take action to mitigate metered network access. 70ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * For example, a music streaming application should switch to a low-bandwidth bitrate. 71ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette */ 72ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; 73ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 74ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette /** 75ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * Device is restricting metered network activity while application is running on background. 76ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * <p> 77ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * In this state, application should not try to use the network while running on background, 78ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * because it would be denied. 79ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette */ 80ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; 81ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 825d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static class BaseConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl { 835d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 845d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 855d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey final NetworkInfo info = cm.getActiveNetworkInfo(); 865d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey if (info == null) { 875d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey // err on side of caution 885d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return true; 895d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 905d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 915d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey final int type = info.getType(); 925d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey switch (type) { 935d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey case TYPE_MOBILE: 94f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikov case TYPE_MOBILE_DUN: 95f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikov case TYPE_MOBILE_HIPRI: 96f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikov case TYPE_MOBILE_MMS: 97f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikov case TYPE_MOBILE_SUPL: 98f185f104c4786740765e549d535f9ba1052f96ccKirill Grouchnikov case TYPE_WIMAX: 995d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return true; 1005d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey case TYPE_WIFI: 1015d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return false; 1025d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey default: 1035d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey // err on side of caution 1045d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return true; 1055d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1065d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 107ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 108ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette @Override 109ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public int getRestrictBackgroundStatus(ConnectivityManager cm) { 110ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette return RESTRICT_BACKGROUND_STATUS_ENABLED; 111ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette } 1125d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1135d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 1145d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static class HoneycombMR2ConnectivityManagerCompatImpl 115ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette extends BaseConnectivityManagerCompatImpl { 1165d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 1175d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 1185d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return ConnectivityManagerCompatHoneycombMR2.isActiveNetworkMetered(cm); 1195d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1205d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1215d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 122ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette static class JellyBeanConnectivityManagerCompatImpl 123ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette extends HoneycombMR2ConnectivityManagerCompatImpl { 1245d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 1255d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 1265d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return ConnectivityManagerCompatJellyBean.isActiveNetworkMetered(cm); 1275d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1285d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1295d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 130ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette static class Api24ConnectivityManagerCompatImpl 131ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette extends JellyBeanConnectivityManagerCompatImpl { 132ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette @Override 133ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public int getRestrictBackgroundStatus(ConnectivityManager cm) { 134ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette //noinspection ResourceType 135ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette return ConnectivityManagerCompatApi24.getRestrictBackgroundStatus(cm); 136ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette } 137ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette } 138ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 1395d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey private static final ConnectivityManagerCompatImpl IMPL; 1405d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 1415d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static { 142ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette if (Build.VERSION.SDK_INT >= 24) { 143ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette IMPL = new Api24ConnectivityManagerCompatImpl(); 144ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette } else if (Build.VERSION.SDK_INT >= 16) { 1455d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new JellyBeanConnectivityManagerCompatImpl(); 1465d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } else if (Build.VERSION.SDK_INT >= 13) { 1475d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new HoneycombMR2ConnectivityManagerCompatImpl(); 1485d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } else { 1495d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new BaseConnectivityManagerCompatImpl(); 1505d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1515d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 1525d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 1535d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey /** 1545d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Returns if the currently active data network is metered. A network is 1555d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * classified as metered when the user is sensitive to heavy data usage on 156c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * that connection due to monetary costs, data limitations or 157c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * battery/performance issues. You should check this before doing large 158c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * data transfers, and warn the user or delay the operation until another 159c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * network is available. 160c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * <p>This method requires the caller to hold the permission 161c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. 162c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * 163c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * @return {@code true} if large transfers should be avoided, otherwise 164c725e0cfeb10019175b9a7e1eba80081848f7484Alan Viverette * {@code false}. 1655d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey */ 166d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey public static boolean isActiveNetworkMetered(ConnectivityManager cm) { 1675d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return IMPL.isActiveNetworkMetered(cm); 1685d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 169d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey 170d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey /** 171d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * Return the {@link NetworkInfo} that caused the given 172d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcast. This obtains 173d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * the current state from {@link ConnectivityManager} instead of using the 174d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * potentially-stale value from 175ae9236048961df9576210e7db8424d7c93a1a8adJeff Sharkey * {@link ConnectivityManager#EXTRA_NETWORK_INFO}. May be {@code null}. 176d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey */ 177d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) { 178d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 179ae9236048961df9576210e7db8424d7c93a1a8adJeff Sharkey if (info != null) { 180ae9236048961df9576210e7db8424d7c93a1a8adJeff Sharkey return cm.getNetworkInfo(info.getType()); 181ae9236048961df9576210e7db8424d7c93a1a8adJeff Sharkey } else { 182ae9236048961df9576210e7db8424d7c93a1a8adJeff Sharkey return null; 183ae9236048961df9576210e7db8424d7c93a1a8adJeff Sharkey } 184d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey } 185c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes 186ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette /** 187ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * Determines if the calling application is subject to metered network restrictions while 188ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * running on background. 189ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * 190ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * @return {@link #RESTRICT_BACKGROUND_STATUS_DISABLED}, 191ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * {@link #RESTRICT_BACKGROUND_STATUS_ENABLED}, 192ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette * or {@link #RESTRICT_BACKGROUND_STATUS_WHITELISTED} 193ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette */ 194ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette @RestrictBackgroundStatus 195ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette public static int getRestrictBackgroundStatus(ConnectivityManager cm) { 196ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette return IMPL.getRestrictBackgroundStatus(cm); 197ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette } 198ca7861c8ce16f632aa0026910b0f6dc5db0ad812Alan Viverette 199c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes private ConnectivityManagerCompat() {} 2005d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey} 201