vuhung3990
9/11/2015 - 3:32 AM

wifi change receiver

wifi change receiver

package com.example.hungvu.testpack;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.CountDownTimer;
import android.util.Log;

/**
 * <pre>
 * require:
 *  - android.permission.ACCESS_NETWORK_STATE
 *  - android.permission.ACCESS_WIFI_STATE
 * </pre>
 */
public class WifiChangeReceiver extends BroadcastReceiver {
    private static final long COUNT_DOWN_TIME = 5000; // 5seconds
    private onWifiChangeListener listener;
    /**
     * don't receive on fist time (no need)
     */
    private boolean fistTime;

    /**
     * last state of wifi connection
     */
    private LastWifiState lastState;
    /**
     * save current wifi info
     */
    private WifiInfo currentWifiInfo = null;

    /**
     * constant last wifi connection state
     */
    public enum LastWifiState {
        CONNECT_FAIL, CHANGED
    }

    /**
     * please call this before register receiver
     *
     * @param listener callback
     */
    public void setListener(onWifiChangeListener listener) {
        fistTime = true;
        this.listener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (listener != null) {
            ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = conMan.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting() && netInfo.getType() == ConnectivityManager.TYPE_WIFI) {

                // skip first time because it is current connection
                if (!fistTime) {
                    WifiManager mainWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                    WifiInfo currentWifi = mainWifi.getConnectionInfo();

                    // save current state
                    lastState = LastWifiState.CHANGED;
                    currentWifiInfo = currentWifi;
                }
            } else {
                // save current state
                lastState = LastWifiState.CONNECT_FAIL;
                currentWifiInfo = null;
            }

            // allow receive on wifi change
            fistTime = false;
        }
    }

    /**
     * call onActivityResult when back from wifi setting
     *
     * @param context for unregister this broadcast
     */
    public void waitForUnregister(final Context context) {
        // (COUNT_DOWN_TIME - 50) is step of timer, don't care it
        // after COUNT_DOWN_TIME (milliseconds) will call onFinish
        new CountDownTimer(COUNT_DOWN_TIME, COUNT_DOWN_TIME - 50) {
            @Override
            public void onTick(long millisUntilFinished) {
            }

            @Override
            public void onFinish() {
                // unregister receiver
                context.unregisterReceiver(WifiChangeReceiver.this);
                if (listener != null) {
                    listener.OnFinish(lastState, currentWifiInfo);
                }
            }
        }.start();
    }

    public interface onWifiChangeListener {
        /**
         * after unregister {@link WifiChangeReceiver}
         *
         * @param lastState       {@link WifiChangeReceiver.LastWifiState }
         * @param currentWifiInfo return current wifi info, null if <b>lastState</b> = CONNECT_FAIL
         */
        void OnFinish(LastWifiState lastState, WifiInfo currentWifiInfo);
    }
}
package com.example.hungvu.testpack;

import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiInfo;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity implements WifiChangeReceiver.onWifiChangeListener {

    private static final int REQUEST_CODE = 1001;
    private WifiChangeReceiver receiver;
    private IntentFilter filter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        receiver = new WifiChangeReceiver();
        receiver.setListener(this);

        // -------------------------------------- //;
        // register receiver
        registerReceiver(receiver, filter);
        // start setting activity
        startActivityForResult(new Intent(Settings.ACTION_WIFI_SETTINGS), REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == REQUEST_CODE){
            Log.d("aaa", "timer");
            receiver.waitForUnregister(this);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void OnFinish(WifiChangeReceiver.LastWifiState lastState, WifiInfo currentWifiInfo) {
        Log.d("aaa", "|====| lastState="+lastState+", currentWifiInfo="+currentWifiInfo);
    }
}