package com.example.wilson.mymediacodecfpvplayer;

import android.content.Context;
import android.net.wifi.WifiManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

public class TestActivity extends AppCompatActivity {
    Context mContext;
    TestThread mTestThread;
    TextView mTextView;
    TextView mTextView2;
    TextView mTextView3;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        mTextView=(TextView)findViewById(R.id.textView);
        mTextView2=(TextView)findViewById(R.id.textView2);
        mTextView3=(TextView)findViewById(R.id.textView3);
        mContext=this;
        mTestThread=new TestThread();
    }

    @Override
    protected void onPause(){
        super.onPause();
        if(mTestThread != null){
            mTestThread.interrupt();
        }
        System.out.println("onPause");
    }

    @Override
    protected void onResume(){
        super.onResume();
        System.out.println("0nResume");
        if(mTestThread == null) {
            mTestThread = new TestThread();
        }
        mTestThread.start();

    }

    private class TestThread extends Thread{
        long number_received_bytes=0;
        long number_received_NALU=0;
        boolean running=false;
        DatagramPacket p=null;
        DatagramSocket s=null;
        byte[] message = new byte[1024];

        public TestThread(){
        }
        public void interrupt(){
            running=false;
            if(s != null){
                s.close();
            }
        }
        public void run(){
            printLocalIpAddresses();
            running=true;
            makeToast("Opening udp port 5000");
            p = new DatagramPacket(message, message.length);
            try {
                s = new DatagramSocket(5000);
                    s.setSoTimeout(3000);
                } catch (SocketException e) {e.printStackTrace();}
                if(s==null){makeToast("Couldn't open port");return;}
                makeToast("Port opened. Trying to receive data");
            while (running==true && s != null) {
                try {
                    s.receive(p);
                    if(p.getLength()>0){
                        number_received_bytes+=p.getLength();
                        makeText("" +number_received_bytes + " bytes received",mTextView);
                        parseDatagram(message,p.getLength());
                    }
                } catch (IOException e) {
                    makeToast("couldn't receive any bytes");
                }
            }

        }
        private void parseDatagram(byte[] p, int plen) {
            int nalu_data_position=0;
            int NALU_MAXLEN = 1024 * 1024;
            int nalu_search_state=0;
            try {
                for (int i = 0; i < plen; ++i) {
                    nalu_data_position++;
                    if (nalu_data_position == NALU_MAXLEN - 1) {
                        Log.w("parseDatagram", "NALU Overflow");
                        makeToast("Nalu overflow !");
                        nalu_data_position = 0;
                    }
                    switch (nalu_search_state) {
                        case 0:
                        case 1:
                        case 2:
                            if (p[i] == 0)
                                nalu_search_state++;
                            else
                                nalu_search_state = 0;
                            break;
                        case 3:
                            if (p[i] == 1) {
                                number_received_NALU++;
                                makeText(""+ number_received_NALU + "Nalu's (~frames)",mTextView2);
                                nalu_data_position = 4;
                            }
                            nalu_search_state = 0;
                            break;
                        default:
                            break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        private void makeToast(final String message){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(mContext,message,Toast.LENGTH_SHORT).show();
                }
            });
        }
        private void makeText(final String message, final TextView textView){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(message);
                }
            });
        }
        public void printLocalIpAddresses(){
            String s="";
            try{
                for(Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
                    NetworkInterface intf=en.nextElement();
                    for(Enumeration<InetAddress> enumIpAddr=intf.getInetAddresses();enumIpAddr.hasMoreElements();){
                        InetAddress inetAddress=enumIpAddr.nextElement();
                        if(!intf.isLoopback()){
                            s+="Interface "+intf.getName()+": "+inetAddress.getHostAddress()+"\n";
                        }
                    }
                }
                makeText(s,mTextView3);
            }catch(Exception e){e.printStackTrace();}
        }
    }

}