com.wifi.brainbreaker.mydemo.spydroid.ui.HandsetFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.wifi.brainbreaker.mydemo.spydroid.ui.HandsetFragment.java

Source

/*
 * Copyright (C) 2011-2013 GUIGUI Simon, fyhertz@gmail.com
 * 
 * This file is part of Spydroid (http://code.google.com/p/spydroid-ipcamera/)
 * 
 * Spydroid is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This source code is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this source code; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package com.wifi.brainbreaker.mydemo.spydroid.ui;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.wifi.brainbreaker.mydemo.http.TinyHttpServer;
import com.wifi.brainbreaker.mydemo.R;
import com.wifi.brainbreaker.mydemo.spydroid.SpydroidApplication;
import com.wifi.brainbreaker.mydemo.spydroid.Utilities;
import com.wifi.brainbreaker.mydemo.spydroid.api.CustomHttpServer;
import com.wifi.brainbreaker.mydemo.spydroid.api.CustomRtspServer;
import com.wifi.brainbreaker.mydemo.streaming.rtsp.RtspServer;

import java.util.Locale;

public class HandsetFragment extends Fragment {

    public final static String TAG = "HandsetFragment";

    private TextView mDescription1, mDescription2, mLine1, mLine2, mVersion, mSignWifi, mTextBitrate;
    private LinearLayout mSignInformation, mSignStreaming;
    private Animation mPulseAnimation;

    private SpydroidApplication mApplication;
    private CustomHttpServer mHttpServer;
    private RtspServer mRtspServer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mApplication = (SpydroidApplication) getActivity().getApplication();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.main, container, false);
        mLine1 = (TextView) rootView.findViewById(R.id.line1);
        mLine2 = (TextView) rootView.findViewById(R.id.line2);
        mDescription1 = (TextView) rootView.findViewById(R.id.line1_description);
        mDescription2 = (TextView) rootView.findViewById(R.id.line2_description);
        mVersion = (TextView) rootView.findViewById(R.id.version);
        mSignWifi = (TextView) rootView.findViewById(R.id.advice);
        mSignStreaming = (LinearLayout) rootView.findViewById(R.id.streaming);
        mSignInformation = (LinearLayout) rootView.findViewById(R.id.information);
        mPulseAnimation = AnimationUtils.loadAnimation(mApplication.getApplicationContext(), R.anim.pulse);
        mTextBitrate = (TextView) rootView.findViewById(R.id.bitrate);
        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();

        // Print version number
        Context mContext = mApplication.getApplicationContext();
        try {
            mVersion.setText(
                    "v" + mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName);
        } catch (Exception e) {
            mVersion.setText("v???");
        }

    }

    @Override
    public void onPause() {
        super.onPause();
        update();
        getActivity().unregisterReceiver(mWifiStateReceiver);
        getActivity().unbindService(mHttpServiceConnection);
        getActivity().unbindService(mRtspServiceConnection);
    }

    @Override
    public void onResume() {
        super.onResume();
        getActivity().bindService(new Intent(getActivity(), CustomHttpServer.class), mHttpServiceConnection,
                Context.BIND_AUTO_CREATE);
        getActivity().bindService(new Intent(getActivity(), CustomRtspServer.class), mRtspServiceConnection,
                Context.BIND_AUTO_CREATE);
        getActivity().registerReceiver(mWifiStateReceiver,
                new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));
    }

    public void update() {
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mDescription1 != null) {
                    if (mHttpServer != null && mRtspServer != null) {
                        if (!mHttpServer.isHttpEnabled() && !mHttpServer.isHttpsEnabled()) {
                            mDescription1.setVisibility(View.INVISIBLE);
                            mLine1.setVisibility(View.INVISIBLE);
                        } else {
                            mDescription1.setVisibility(View.VISIBLE);
                            mLine1.setVisibility(View.VISIBLE);
                        }
                        if (!mRtspServer.isEnabled()) {
                            mDescription2.setVisibility(View.INVISIBLE);
                            mLine2.setVisibility(View.INVISIBLE);
                        } else {
                            mDescription2.setVisibility(View.VISIBLE);
                            mLine2.setVisibility(View.VISIBLE);
                        }
                        if (!mHttpServer.isStreaming() && !mRtspServer.isStreaming())
                            displayIpAddress();
                        else
                            streamingState(1);
                    }
                }
            }
        });
    }

    private void streamingState(int state) {
        if (state == 0) {
            // Not streaming
            mSignStreaming.clearAnimation();
            mSignWifi.clearAnimation();
            mSignStreaming.setVisibility(View.GONE);
            mSignInformation.setVisibility(View.VISIBLE);
            mSignWifi.setVisibility(View.GONE);
        } else if (state == 1) {
            // Streaming
            mSignWifi.clearAnimation();
            mSignStreaming.setVisibility(View.VISIBLE);
            mSignStreaming.startAnimation(mPulseAnimation);
            mHandler.post(mUpdateBitrate);
            mSignInformation.setVisibility(View.INVISIBLE);
            mSignWifi.setVisibility(View.GONE);
        } else if (state == 2) {
            // No wifi !
            mSignStreaming.clearAnimation();
            mSignStreaming.setVisibility(View.GONE);
            mSignInformation.setVisibility(View.INVISIBLE);
            mSignWifi.setVisibility(View.VISIBLE);
            mSignWifi.startAnimation(mPulseAnimation);
        }
    }

    private void displayIpAddress() {
        WifiManager wifiManager = (WifiManager) mApplication.getApplicationContext()
                .getSystemService(Context.WIFI_SERVICE);
        WifiInfo info = wifiManager.getConnectionInfo();
        String ipaddress = null;
        if (info != null && info.getNetworkId() > -1) {
            int i = info.getIpAddress();
            String ip = String.format(Locale.ENGLISH, "%d.%d.%d.%d", i & 0xff, i >> 8 & 0xff, i >> 16 & 0xff,
                    i >> 24 & 0xff);
            mLine1.setText(mHttpServer.isHttpsEnabled() ? "https://" : "http://");
            mLine1.append(ip);
            mLine1.append(":" + mHttpServer.getHttpPort());
            mLine2.setText("rtsp://");
            mLine2.append(ip);
            mLine2.append(":" + mRtspServer.getPort());
            streamingState(0);
        } else if ((ipaddress = Utilities.getLocalIpAddress(true)) != null) {
            mLine1.setText(mHttpServer.isHttpsEnabled() ? "https://" : "http://");
            mLine1.append(ipaddress);
            mLine1.append(":" + mHttpServer.getHttpPort());
            mLine2.setText("rtsp://");
            mLine2.append(ipaddress);
            mLine2.append(":" + mRtspServer.getPort());
            streamingState(0);
        } else {
            streamingState(2);
        }

    }

    private final ServiceConnection mRtspServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mRtspServer = (RtspServer) ((RtspServer.LocalBinder) service).getService();
            update();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

    };

    private final ServiceConnection mHttpServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mHttpServer = (CustomHttpServer) ((TinyHttpServer.LocalBinder) service).getService();
            update();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

    };

    // BroadcastReceiver that detects wifi state changements
    private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // This intent is also received when app resumes even if wifi state hasn't changed :/
            if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
                update();
            }
        }
    };

    private final Handler mHandler = new Handler();

    private Runnable mUpdateBitrate = new Runnable() {
        @Override
        public void run() {
            if ((mRtspServer != null && mRtspServer.isStreaming())
                    || (mHttpServer != null && mHttpServer.isStreaming())) {
                long bitrate = 0;
                bitrate += mRtspServer != null ? mRtspServer.getBitrate() : 0;
                bitrate += mHttpServer != null ? mHttpServer.getBitrate() : 0;
                mTextBitrate.setText("" + bitrate / 1000 + " kbps");
                mHandler.postDelayed(mUpdateBitrate, 1000);
            } else {
                mTextBitrate.setText("0 kbps");
            }
        }
    };

}