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