1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.net;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.CalledByNative;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.JNINamespace;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.NativeClassQualifiedName;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.ObserverList;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.ArrayList;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Triggers updates to the underlying network state in Chrome.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * By default, connectivity is assumed and changes must pushed from the embedder via the
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * forceConnectivityState function.
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Embedders may choose to have this class auto-detect changes in network connectivity by invoking
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the setAutoDetectConnectivityState function.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * WARNING: This class is not thread-safe.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@JNINamespace("net")
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public class NetworkChangeNotifier {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Alerted when the connection type of the network changes.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The alert is fired on the UI thread.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public interface ConnectionTypeObserver {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        public void onConnectionTypeChanged(int connectionType);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These constants must always match the ones in network_change_notifier.h.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_UNKNOWN = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_ETHERNET = 1;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_WIFI = 2;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_2G = 3;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_3G = 4;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_4G = 5;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static final int CONNECTION_NONE = 6;
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    public static final int CONNECTION_BLUETOOTH = 7;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final Context mContext;
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private final ArrayList<Long> mNativeChangeNotifiers;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private final ObserverList<ConnectionTypeObserver> mConnectionTypeObservers;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private NetworkChangeNotifierAutoDetect mAutoDetector;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private int mCurrentConnectionType = CONNECTION_UNKNOWN;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static NetworkChangeNotifier sInstance;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private NetworkChangeNotifier(Context context) {
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        mContext = context.getApplicationContext();
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        mNativeChangeNotifiers = new ArrayList<Long>();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mConnectionTypeObservers = new ObserverList<ConnectionTypeObserver>();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Initializes the singleton once.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static NetworkChangeNotifier init(Context context) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (sInstance == null) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sInstance = new NetworkChangeNotifier(context);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return sInstance;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static boolean isInitialized() {
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return sInstance != null;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static void resetInstanceForTests(Context context) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sInstance = new NetworkChangeNotifier(context);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public int getCurrentConnectionType() {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return mCurrentConnectionType;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Adds a native-side observer.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void addNativeObserver(long nativeChangeNotifier) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mNativeChangeNotifiers.add(nativeChangeNotifier);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Removes a native-side observer.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void removeNativeObserver(long nativeChangeNotifier) {
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        mNativeChangeNotifiers.remove(nativeChangeNotifier);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Returns the singleton instance.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static NetworkChangeNotifier getInstance() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert sInstance != null;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return sInstance;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Enables auto detection of the current network state based on notifications from the system.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Note that passing true here requires the embedding app have the platform ACCESS_NETWORK_STATE
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * permission.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param shouldAutoDetect true if the NetworkChangeNotifier should listen for system changes in
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *    network connectivity.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static void setAutoDetectConnectivityState(boolean shouldAutoDetect) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        getInstance().setAutoDetectConnectivityStateInternal(shouldAutoDetect);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void destroyAutoDetector() {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (mAutoDetector != null) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mAutoDetector.destroy();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mAutoDetector = null;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void setAutoDetectConnectivityStateInternal(boolean shouldAutoDetect) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (shouldAutoDetect) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (mAutoDetector == null) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mAutoDetector = new NetworkChangeNotifierAutoDetect(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    new NetworkChangeNotifierAutoDetect.Observer() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        @Override
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        public void onConnectionTypeChanged(int newConnectionType) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            updateCurrentConnectionType(newConnectionType);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    mContext);
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                updateCurrentConnectionType(mAutoDetector.getCurrentConnectionType());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            destroyAutoDetector();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Updates the perceived network state when not auto-detecting changes to connectivity.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param networkAvailable True if the NetworkChangeNotifier should perceive a "connected"
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *    state, false implies "disconnected".
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static void forceConnectivityState(boolean networkAvailable) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setAutoDetectConnectivityState(false);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        getInstance().forceConnectivityStateInternal(networkAvailable);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void forceConnectivityStateInternal(boolean forceOnline) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        boolean connectionCurrentlyExists = mCurrentConnectionType != CONNECTION_NONE;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (connectionCurrentlyExists != forceOnline) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updateCurrentConnectionType(forceOnline ? CONNECTION_UNKNOWN : CONNECTION_NONE);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void updateCurrentConnectionType(int newConnectionType) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mCurrentConnectionType = newConnectionType;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        notifyObserversOfConnectionTypeChange(newConnectionType);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Alerts all observers of a connection change.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void notifyObserversOfConnectionTypeChange(int newConnectionType) {
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        for (Long nativeChangeNotifier : mNativeChangeNotifiers) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            nativeNotifyConnectionTypeChanged(nativeChangeNotifier, newConnectionType);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (ConnectionTypeObserver observer : mConnectionTypeObservers) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer.onConnectionTypeChanged(newConnectionType);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds an observer for any connection type changes.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static void addConnectionTypeObserver(ConnectionTypeObserver observer) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        getInstance().addConnectionTypeObserverInternal(observer);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void addConnectionTypeObserverInternal(ConnectionTypeObserver observer) {
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mConnectionTypeObservers.addObserver(observer);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Removes an observer for any connection type changes.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static void removeConnectionTypeObserver(ConnectionTypeObserver observer) {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        getInstance().removeConnectionTypeObserverInternal(observer);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void removeConnectionTypeObserverInternal(ConnectionTypeObserver observer) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mConnectionTypeObservers.removeObserver(observer);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @NativeClassQualifiedName("NetworkChangeNotifierDelegateAndroid")
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private native void nativeNotifyConnectionTypeChanged(long nativePtr, int newConnectionType);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For testing only.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static NetworkChangeNotifierAutoDetect getAutoDetectorForTest() {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return getInstance().mAutoDetector;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Checks if there currently is connectivity.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static boolean isOnline() {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int connectionType = getInstance().getCurrentConnectionType();
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return connectionType != CONNECTION_UNKNOWN && connectionType != CONNECTION_NONE;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
219