18233facddcc51865d612a919d450db6954aa48e3Michael Kolb/*
28233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Copyright (C) 2010 The Android Open Source Project
38233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
48233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
58233facddcc51865d612a919d450db6954aa48e3Michael Kolb * you may not use this file except in compliance with the License.
68233facddcc51865d612a919d450db6954aa48e3Michael Kolb * You may obtain a copy of the License at
78233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
88233facddcc51865d612a919d450db6954aa48e3Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
98233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Unless required by applicable law or agreed to in writing, software
118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * See the License for the specific language governing permissions and
148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * limitations under the License.
158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
168233facddcc51865d612a919d450db6954aa48e3Michael Kolb
178233facddcc51865d612a919d450db6954aa48e3Michael Kolbpackage com.android.browser;
188233facddcc51865d612a919d450db6954aa48e3Michael Kolb
198233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.app.Activity;
208233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.BroadcastReceiver;
218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.Context;
228233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.Intent;
238233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.IntentFilter;
248233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.ConnectivityManager;
258233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.NetworkInfo;
268233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.WebView;
278233facddcc51865d612a919d450db6954aa48e3Michael Kolb
288233facddcc51865d612a919d450db6954aa48e3Michael Kolb/**
298233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Handle network state changes
308233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
318233facddcc51865d612a919d450db6954aa48e3Michael Kolbpublic class NetworkStateHandler {
328233facddcc51865d612a919d450db6954aa48e3Michael Kolb
338233facddcc51865d612a919d450db6954aa48e3Michael Kolb    Activity mActivity;
348233facddcc51865d612a919d450db6954aa48e3Michael Kolb    Controller mController;
358233facddcc51865d612a919d450db6954aa48e3Michael Kolb
368233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // monitor platform changes
378233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private IntentFilter mNetworkStateChangedFilter;
388233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private BroadcastReceiver mNetworkStateIntentReceiver;
398233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private boolean mIsNetworkUp;
408233facddcc51865d612a919d450db6954aa48e3Michael Kolb
418233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public NetworkStateHandler(Activity activity, Controller controller) {
428233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity = activity;
438233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mController = controller;
448233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Find out if the network is currently up.
458233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ConnectivityManager cm = (ConnectivityManager) mActivity
468233facddcc51865d612a919d450db6954aa48e3Michael Kolb                .getSystemService(Context.CONNECTIVITY_SERVICE);
478233facddcc51865d612a919d450db6954aa48e3Michael Kolb        NetworkInfo info = cm.getActiveNetworkInfo();
488233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (info != null) {
498233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mIsNetworkUp = info.isAvailable();
508233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
518233facddcc51865d612a919d450db6954aa48e3Michael Kolb
528233facddcc51865d612a919d450db6954aa48e3Michael Kolb        /*
538233facddcc51865d612a919d450db6954aa48e3Michael Kolb         * enables registration for changes in network status from http stack
548233facddcc51865d612a919d450db6954aa48e3Michael Kolb         */
558233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mNetworkStateChangedFilter = new IntentFilter();
568233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mNetworkStateChangedFilter.addAction(
578233facddcc51865d612a919d450db6954aa48e3Michael Kolb                ConnectivityManager.CONNECTIVITY_ACTION);
588233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mNetworkStateIntentReceiver = new BroadcastReceiver() {
598233facddcc51865d612a919d450db6954aa48e3Michael Kolb            @Override
608233facddcc51865d612a919d450db6954aa48e3Michael Kolb            public void onReceive(Context context, Intent intent) {
618233facddcc51865d612a919d450db6954aa48e3Michael Kolb                if (intent.getAction().equals(
628233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        ConnectivityManager.CONNECTIVITY_ACTION)) {
638233facddcc51865d612a919d450db6954aa48e3Michael Kolb
648233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    NetworkInfo info = intent.getParcelableExtra(
658233facddcc51865d612a919d450db6954aa48e3Michael Kolb                            ConnectivityManager.EXTRA_NETWORK_INFO);
668233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    String typeName = info.getTypeName();
678233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    String subtypeName = info.getSubtypeName();
688233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    sendNetworkType(typeName.toLowerCase(),
698233facddcc51865d612a919d450db6954aa48e3Michael Kolb                            (subtypeName != null ? subtypeName.toLowerCase() : ""));
708233facddcc51865d612a919d450db6954aa48e3Michael Kolb
71bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt                    boolean noConnection = intent.getBooleanExtra(
72bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt                            ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
73bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt
74bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt                    onNetworkToggle(!noConnection);
758233facddcc51865d612a919d450db6954aa48e3Michael Kolb                }
768233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
778233facddcc51865d612a919d450db6954aa48e3Michael Kolb        };
788233facddcc51865d612a919d450db6954aa48e3Michael Kolb
798233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
808233facddcc51865d612a919d450db6954aa48e3Michael Kolb
818233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onPause() {
828233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // unregister network state listener
838233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity.unregisterReceiver(mNetworkStateIntentReceiver);
848233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
858233facddcc51865d612a919d450db6954aa48e3Michael Kolb
868233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onResume() {
878233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity.registerReceiver(mNetworkStateIntentReceiver,
888233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mNetworkStateChangedFilter);
898233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
908233facddcc51865d612a919d450db6954aa48e3Michael Kolb
918233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
928233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * connectivity manager says net has come or gone... inform the user
938233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * @param up true if net has come up, false if net has gone down
948233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
958233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onNetworkToggle(boolean up) {
968233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (up == mIsNetworkUp) {
978233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
988233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
998471e9f6aa91a7e97a307304483ec8bcb61b8fddJohn Reck        mIsNetworkUp = up;
1008233facddcc51865d612a919d450db6954aa48e3Michael Kolb        WebView w = mController.getCurrentWebView();
1018233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (w != null) {
1028233facddcc51865d612a919d450db6954aa48e3Michael Kolb            w.setNetworkAvailable(up);
1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1048233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1058233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb    boolean isNetworkUp() {
1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return mIsNetworkUp;
1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private void sendNetworkType(String type, String subtype) {
1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb        WebView w = mController.getCurrentWebView();
1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (w != null) {
1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb            w.setNetworkType(type, subtype);
1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb}
118