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