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