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 195d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_MOBILE; 205d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI; 215d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 22d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkeyimport android.content.Intent; 235d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport android.net.ConnectivityManager; 245d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport android.net.NetworkInfo; 255d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeyimport android.os.Build; 265d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 275d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey/** 285d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Helper for accessing features in {@link ConnectivityManager} introduced after 295d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * API level 16 in a backwards compatible fashion. 305d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey */ 315d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkeypublic class ConnectivityManagerCompat { 325d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 335d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey interface ConnectivityManagerCompatImpl { 345d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey boolean isActiveNetworkMetered(ConnectivityManager cm); 355d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 365d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 375d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static class BaseConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl { 385d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 395d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 405d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey final NetworkInfo info = cm.getActiveNetworkInfo(); 415d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey if (info == null) { 425d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey // err on side of caution 435d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return true; 445d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 455d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 465d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey final int type = info.getType(); 475d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey switch (type) { 485d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey case TYPE_MOBILE: 495d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return true; 505d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey case TYPE_WIFI: 515d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return false; 525d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey default: 535d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey // err on side of caution 545d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return true; 555d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 565d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 575d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 585d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 595d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static class GingerbreadConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl { 605d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 615d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 625d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return ConnectivityManagerCompatGingerbread.isActiveNetworkMetered(cm); 635d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 645d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 655d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 665d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static class HoneycombMR2ConnectivityManagerCompatImpl 675d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey implements ConnectivityManagerCompatImpl { 685d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 695d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 705d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return ConnectivityManagerCompatHoneycombMR2.isActiveNetworkMetered(cm); 715d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 725d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 735d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 745d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static class JellyBeanConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl { 755d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey @Override 765d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey public boolean isActiveNetworkMetered(ConnectivityManager cm) { 775d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return ConnectivityManagerCompatJellyBean.isActiveNetworkMetered(cm); 785d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 795d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 805d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 815d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey private static final ConnectivityManagerCompatImpl IMPL; 825d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 835d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey static { 845d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey if (Build.VERSION.SDK_INT >= 16) { 855d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new JellyBeanConnectivityManagerCompatImpl(); 865d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } else if (Build.VERSION.SDK_INT >= 13) { 875d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new HoneycombMR2ConnectivityManagerCompatImpl(); 885d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } else if (Build.VERSION.SDK_INT >= 8) { 895d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new GingerbreadConnectivityManagerCompatImpl(); 905d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } else { 915d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey IMPL = new BaseConnectivityManagerCompatImpl(); 925d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 935d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 945d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey 955d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey /** 965d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * Returns if the currently active data network is metered. A network is 975d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * classified as metered when the user is sensitive to heavy data usage on 985d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * that connection. You should check this before doing large data transfers, 995d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * and warn the user or delay the operation until another network is 1005d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey * available. 1015d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey */ 102d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey public static boolean isActiveNetworkMetered(ConnectivityManager cm) { 1035d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey return IMPL.isActiveNetworkMetered(cm); 1045d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey } 105d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey 106d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey /** 107d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * Return the {@link NetworkInfo} that caused the given 108d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcast. This obtains 109d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * the current state from {@link ConnectivityManager} instead of using the 110d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * potentially-stale value from 111d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey * {@link ConnectivityManager#EXTRA_NETWORK_INFO}. 112d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey */ 113d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) { 114d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 115d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey return cm.getNetworkInfo(info.getType()); 116d5e609a825a32049f519b7bd23a1caad8aaee088Jeff Sharkey } 1175d79c2b6211936177817f2492816c1dba76dac3eJeff Sharkey} 118