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;
274d2fcaba7fb8eb1723943ac9a10e76d509330bd1Jonathan Dixonimport android.webkit.WebViewClassic;
288233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2996497838babbaeb143b0fbc7d0de9c695e56e9f7Victoria Leaseimport com.android.browser.BrowserSettings;
3096497838babbaeb143b0fbc7d0de9c695e56e9f7Victoria Lease
318233facddcc51865d612a919d450db6954aa48e3Michael Kolb/**
328233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Handle network state changes
338233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
348233facddcc51865d612a919d450db6954aa48e3Michael Kolbpublic class NetworkStateHandler {
358233facddcc51865d612a919d450db6954aa48e3Michael Kolb
368233facddcc51865d612a919d450db6954aa48e3Michael Kolb    Activity mActivity;
378233facddcc51865d612a919d450db6954aa48e3Michael Kolb    Controller mController;
388233facddcc51865d612a919d450db6954aa48e3Michael Kolb
398233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // monitor platform changes
408233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private IntentFilter mNetworkStateChangedFilter;
418233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private BroadcastReceiver mNetworkStateIntentReceiver;
428233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private boolean mIsNetworkUp;
438233facddcc51865d612a919d450db6954aa48e3Michael Kolb
448233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public NetworkStateHandler(Activity activity, Controller controller) {
458233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity = activity;
468233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mController = controller;
478233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Find out if the network is currently up.
488233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ConnectivityManager cm = (ConnectivityManager) mActivity
498233facddcc51865d612a919d450db6954aa48e3Michael Kolb                .getSystemService(Context.CONNECTIVITY_SERVICE);
508233facddcc51865d612a919d450db6954aa48e3Michael Kolb        NetworkInfo info = cm.getActiveNetworkInfo();
518233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (info != null) {
528233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mIsNetworkUp = info.isAvailable();
538233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
548233facddcc51865d612a919d450db6954aa48e3Michael Kolb
558233facddcc51865d612a919d450db6954aa48e3Michael Kolb        /*
568233facddcc51865d612a919d450db6954aa48e3Michael Kolb         * enables registration for changes in network status from http stack
578233facddcc51865d612a919d450db6954aa48e3Michael Kolb         */
588233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mNetworkStateChangedFilter = new IntentFilter();
598233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mNetworkStateChangedFilter.addAction(
608233facddcc51865d612a919d450db6954aa48e3Michael Kolb                ConnectivityManager.CONNECTIVITY_ACTION);
618233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mNetworkStateIntentReceiver = new BroadcastReceiver() {
628233facddcc51865d612a919d450db6954aa48e3Michael Kolb            @Override
638233facddcc51865d612a919d450db6954aa48e3Michael Kolb            public void onReceive(Context context, Intent intent) {
648233facddcc51865d612a919d450db6954aa48e3Michael Kolb                if (intent.getAction().equals(
658233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        ConnectivityManager.CONNECTIVITY_ACTION)) {
668233facddcc51865d612a919d450db6954aa48e3Michael Kolb
678233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    NetworkInfo info = intent.getParcelableExtra(
688233facddcc51865d612a919d450db6954aa48e3Michael Kolb                            ConnectivityManager.EXTRA_NETWORK_INFO);
698233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    String typeName = info.getTypeName();
708233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    String subtypeName = info.getSubtypeName();
718233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    sendNetworkType(typeName.toLowerCase(),
728233facddcc51865d612a919d450db6954aa48e3Michael Kolb                            (subtypeName != null ? subtypeName.toLowerCase() : ""));
7396497838babbaeb143b0fbc7d0de9c695e56e9f7Victoria Lease                    BrowserSettings.getInstance().updateConnectionType();
748233facddcc51865d612a919d450db6954aa48e3Michael Kolb
75bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt                    boolean noConnection = intent.getBooleanExtra(
76bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt                            ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
77bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt
78bf57471e0220ca6db8cb81471dc2b3ddb2863f5bRobert Greenwalt                    onNetworkToggle(!noConnection);
798233facddcc51865d612a919d450db6954aa48e3Michael Kolb                }
808233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
818233facddcc51865d612a919d450db6954aa48e3Michael Kolb        };
828233facddcc51865d612a919d450db6954aa48e3Michael Kolb
838233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
848233facddcc51865d612a919d450db6954aa48e3Michael Kolb
858233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onPause() {
868233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // unregister network state listener
878233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity.unregisterReceiver(mNetworkStateIntentReceiver);
888233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
898233facddcc51865d612a919d450db6954aa48e3Michael Kolb
908233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onResume() {
918233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity.registerReceiver(mNetworkStateIntentReceiver,
928233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mNetworkStateChangedFilter);
9396497838babbaeb143b0fbc7d0de9c695e56e9f7Victoria Lease        BrowserSettings.getInstance().updateConnectionType();
948233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
958233facddcc51865d612a919d450db6954aa48e3Michael Kolb
968233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
978233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * connectivity manager says net has come or gone... inform the user
988233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * @param up true if net has come up, false if net has gone down
998233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
1008233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void onNetworkToggle(boolean up) {
1018233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (up == mIsNetworkUp) {
1028233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1048471e9f6aa91a7e97a307304483ec8bcb61b8fddJohn Reck        mIsNetworkUp = up;
1058233facddcc51865d612a919d450db6954aa48e3Michael Kolb        WebView w = mController.getCurrentWebView();
1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (w != null) {
1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb            w.setNetworkAvailable(up);
1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb    boolean isNetworkUp() {
1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return mIsNetworkUp;
1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private void sendNetworkType(String type, String subtype) {
1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb        WebView w = mController.getCurrentWebView();
1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (w != null) {
1184d2fcaba7fb8eb1723943ac9a10e76d509330bd1Jonathan Dixon            WebViewClassic.fromWebView(w).setNetworkType(type, subtype);
1198233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1208233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1218233facddcc51865d612a919d450db6954aa48e3Michael Kolb}
122