package com.xypower.mpapp;

import android.Manifest;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Environment;
import android.os.FileObserver;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
import android.os.StrictMode;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;

import com.dev.devapi.api.SysApi;
import com.xypower.common.CameraUtils;
import com.xypower.common.MicroPhotoContext;
import com.xypower.mpapp.databinding.ActivityMainBinding;
import com.xypower.mpapp.utils.RandomReader;


import java.io.File;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MPLOG";
    private static int MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE = 100;

    public static final int MSG_WHAT_LOG_OBSERVER = MicroPhotoService.MSG_WHAT_MAX + 10;

    // Used to load the 'microphoto' library on application startup.


    public static final int MAX_LOG_LINES = 480;
    public static final int MIN_LOG_LINES = 120;

    private ActivityMainBinding binding;

    private Handler mHandler = null;
    private Messenger mMessenger = null;

    private LogFileObserver mLogFileObserver = null;

    private class LogFileObserver extends FileObserver {

        private long mOffset = 0;
        private String mPath = null;
        public LogFileObserver(String path) {
            super(path, FileObserver.MODIFY | FileObserver.CREATE);

            mPath = path;
            File file = new File(path);
            if (file.exists()) {
                mOffset = file.length();
            }
        }
        @Override
        public void onEvent(int event, String s) {
            int e = event & FileObserver.ALL_EVENTS;

            if (e == FileObserver.MODIFY) {
                File file = new File(mPath);
                long newOffset = file.length();
                if (newOffset > mOffset) {
                    RandomReader reader = new RandomReader(mPath, mOffset);

                    byte[] bytes = new byte[(int)(newOffset - mOffset)];
                    int bytesRead = reader.read(bytes);
                    mOffset += bytesRead;

                    Message msg = Message.obtain();
                    msg.what = MSG_WHAT_LOG_OBSERVER;
                    msg.obj = bytes;
                    msg.arg1 = bytesRead;
                    mHandler.sendMessage(msg);
                }
            } else if (e == FileObserver.CREATE) {
                mOffset = 0;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        // getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

        // InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        // imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

        // ViewUtils.hideSoftKeyboard(this);

        ActionBar actionBar = getSupportActionBar();

        // String buildTime = BuildConfig.BUILD_
        Date date = new Date(BuildConfig.BUILD_TIMESTAMP);
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        actionBar.setTitle(actionBar.getTitle().toString() + " v" + MicroPhotoContext.getVersionName(getApplicationContext()) + "  " + sdf.format(date));

        // CompactSpinnerAdapter adapter = new CompactSpinnerAdapter(this, R.array.networkProtocols, R.layout.spinner_dropdown_item);
        // adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // binding.networkProtocol.setAdapter(adapter);


        // ArrayAdapter adapter1 = ArrayAdapter.createFromResource(this, R.array.networkProtocols, android.R.layout.simple_spinner_item);
        // adapter1.setDropDownViewResource(R.layout.spinner_dropdown_item);
        // binding.protocol.setAdapter(adapter1);

        binding.logs.setText("");
        binding.logs.setMovementMethod(ScrollingMovementMethod.getInstance());
        binding.logs.setScrollbarFadingEnabled(false);

        mHandler = new Handler(Looper.myLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                switch (msg.what) {
                    case MSG_WHAT_LOG_OBSERVER:
                    {
                        byte[] bytes = (byte[])msg.obj;
                        int bytesRead = msg.arg1;
                        String log = null;
                        try {
                            log = new String(bytes, 0, bytesRead, "UTF-8");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        if (log != null) {
                            binding.logs.append(log);
                            int offset = binding.logs.getLineCount() * binding.logs.getLineHeight();
                            if (offset > binding.logs.getHeight()) {
                                binding.logs.scrollTo(0, offset - binding.logs.getHeight() + binding.logs.getLineHeight());
                            }
                        }
                    }
                    break;

                }

            }
        };
        // mMessenger = new Messenger(new Handler());

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        Intent intent = getIntent();
        final int noDelay = intent.getIntExtra("noDelay", 0);
        int rebootFlag = intent.getIntExtra("reboot", 0);
        if (rebootFlag == 1) {
            // SysApi.enableAirPlane(MainActivity.this, true);
            Log.i(TAG, "After Reboot");
        }

        Log.d(TAG, "MainActivity: reboot=" + rebootFlag + " noDelay=" + noDelay);

        MicroPhotoContext.AppConfig appConfig = getAppConfig();
        if (TextUtils.isEmpty(appConfig.cmdid)) {
            binding.cmdid.setText(MicroPhotoService.getSerialNumber());
        } else {
            binding.cmdid.setText(appConfig.cmdid);
        }
        binding.server.setText(appConfig.server);
        binding.port.setText(appConfig.port != 0 ? Integer.toString(appConfig.port) : "");
        String protocolStr = appConfig.protocol + "-";
        for (int idx = 0; idx < binding.protocol.getCount(); idx++) {
            String item = binding.protocol.getItemAtPosition(idx).toString();
            if (item.startsWith(protocolStr)) {
                binding.protocol.setSelection(idx);
                break;
            }
        }

        if (appConfig.networkProtocol < binding.networkProtocol.getCount()) {
            binding.networkProtocol.setSelection(appConfig.networkProtocol);
        }
        if (appConfig.encryption < binding.encryptions.getCount()) {
            binding.encryptions.setSelection(appConfig.encryption);
        }
        binding.heartbeat.setText((appConfig.heartbeat > 0) ? Integer.toString(appConfig.heartbeat) : "");
        binding.packetSize.setText((appConfig.packetSize > 0) ? Integer.toString(appConfig.packetSize) : "");

        if (appConfig.network < binding.network.getCount()) {
            binding.network.setSelection(appConfig.network);
        }

        this.binding.btnStartServ.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String[] accessPermissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.FOREGROUND_SERVICE, Manifest.permission.READ_PHONE_STATE,
                        /*Manifest.permission.PACKAGE_USAGE_STATS,*/
                        /*Manifest.permission.SET_TIME,*/};
                boolean needRequire = false;
                for (String access : accessPermissions) {
                    int curPermission = ActivityCompat.checkSelfPermission(MainActivity.this, access);
                    if (curPermission != PackageManager.PERMISSION_GRANTED) {
                        needRequire = true;
                        break;
                    }
                }
                if (needRequire) {
                    ActivityCompat.requestPermissions(MainActivity.this, accessPermissions, MY_PERMISSIONS_REQUEST_FOREGROUND_SERVICE);
                    // return;
                }

                binding.logs.setText("");
                MicroPhotoContext.AppConfig curAppConfig = retrieveAndSaveAppConfig();

                startMicroPhotoService(MainActivity.this.getApplicationContext(), appConfig, mMessenger);

                binding.btnStartServ.setEnabled(false);
                binding.btnStopServ.setEnabled(true);
            }
        });

        this.binding.btnSaveCfg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {

                MicroPhotoContext.AppConfig appCfg =  MicroPhotoContext.getMpAppConfig(getApplicationContext());

                String protocolStr = MainActivity.this.binding.protocol.getSelectedItem().toString();
                int protocol = MicroPhotoContext.DEFAULT_PROTOCOL;
                String[] parts = protocolStr.split("-");
                if (parts != null) {
                    protocol = Integer.parseInt(parts[0]);
                }

                if (appCfg.protocol != protocol) {

                    AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
                    builder.setTitle(R.string.confirm_change_protocol);
                    builder.setMessage(R.string.confirm_change_protocol_text);
                    builder.setCancelable(true);
                    builder.setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();

                            retrieveAndSaveAppConfig();
                            MicroPhotoContext.removeMpConfigFiles(getApplicationContext());
                            MicroPhotoService.updateConfigs(MainActivity.this.getApplicationContext());
                        }
                    });
                    builder.setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    });
                    builder.show();
                } else {
                    retrieveAndSaveAppConfig();
                    MicroPhotoService.updateConfigs(MainActivity.this.getApplicationContext());
                }

            }
        });

        this.binding.btnTakePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(1, 255, true);
            }
        });
        this.binding.btnTakePhoto2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(2, 255, true);
            }
        });
        this.binding.btnTakePhoto3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(3, 255, true);
            }
        });
        this.binding.btnTakePhoto4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(4, 255, true);
            }
        });

        this.binding.takeVideoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(1, 255, false);
            }
        });
        this.binding.takeVideoBtn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(2, 255, false);
            }
        });
        this.binding.takeVideoBtn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(3, 255, false);
            }
        });
        this.binding.takeVideoBtn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhoto(4, 255, false);
            }
        });

        this.binding.btnStopServ.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Intent intent = new Intent(MainActivity.this, MicroPhotoService.class);
                // intent.setAction(MicroPhotoService.ACTION_STOP);

                // MainActivity.this.stopService(intent);

                MicroPhotoService.stopTerminalService(getApplicationContext());

                binding.btnStartServ.setEnabled(true);
                binding.btnStopServ.setEnabled(false);
            }
        });

        binding.simchange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // defaultDataSubId = getDefaultDataSubId();
                // System.out.println(defaultDataSubId);

            }
        });
        binding.simchange2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*
                if (defaultDataSubId == 0) {
                    setDefaultDataSubId(1);
                } else {
                    if (defaultDataSubId == 1) {
                        setDefaultDataSubId(2);
                    } else {
                        setDefaultDataSubId(1);
                    }
                }
                 */
            }
        });

        binding.btnChannels.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, ChannelActivity.class);
                startActivity(intent);
            }
        });

        binding.gps.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                gpsTake();
                startLocate();
//                LocationUtils.unregister();
            }
        });


        binding.netgps.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                startLocate();
                boolean gpsEnabled = LocationUtil.isGpsEnabled(MainActivity.this);
                System.out.printf("g" + gpsEnabled);
                LocationUtil.register(MainActivity.this, 0, 0, new LocationUtil.OnLocationChangeListener() {
                    @Override
                    public void getLastKnownLocation(Location location) {
                        Log.e("xyh", "onLocationChanged: " + location.getLatitude());
                    }

                    @Override
                    public void onLocationChanged(Location location) {
                        //位置信息变化时触发
                        Log.e("xyh", "定位方式：" + location.getProvider());
                        Log.e("xyh", "纬度：" + location.getLatitude());
                        Log.e("xyh", "经度：" + location.getLongitude());
                        Log.e("xyh", "海拔：" + location.getAltitude());
                        Log.e("xyh", "时间：" + location.getTime());
                        Log.e("xyh", "国家：" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude()));
                        Log.e("xyh", "获取地理位置：" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude()));
                        Log.e("xyh", "所在地：" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude()));
                        Log.e("xyh", "所在街道：" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude()));

                    }

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {
                        System.out.println("dfsad");
                    }
                });
            }
        });

        if (!MicroPhotoService.isRunning && !TextUtils.isEmpty(appConfig.cmdid) && !TextUtils.isEmpty(appConfig.server) && appConfig.port != 0) {
            Handler handler = new Handler();
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    if (binding.btnStartServ.isEnabled()) {
                        binding.btnStartServ.performClick();
                    }
                }
            };
            handler.postDelayed(runnable, noDelay != 0 ? 1000 : 5000);
        }
        binding.btnStartServ.setEnabled(!MicroPhotoService.isRunning);
        binding.btnStopServ.setEnabled(MicroPhotoService.isRunning);

        binding.tcpudp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                initSocket();
            }
        });
        binding.tcpudpsend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                byte[] bytes = {(byte) 0xA5, 0x5A, 0x04, 0x00, 0x58, 0x59, 0x49, 0x47, 0x51, 0x31, 0x30, 0x44, 0x32, 0x32, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x07, (byte) 0xE7, 0x37, (byte) 0x86, (byte) 0x96, (byte) 0xD4, 0x64, (byte) 0xB5, (byte) 0xFB, (byte) 0x96};
                byte[] bytes = {(byte) 0xA5, 0x5A, 0x04, 0x00, 0x58, 0x59, 0x49, 0x47, 0x51, 0x31, 0x30, 0x44, 0x32, 0x32, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x07, (byte) 0xE6, (byte) 0xEA, 0x52, (byte) 0xB7, (byte) 0xD4, 0x64, 0x5C, 0x7E, (byte) 0x96};
//                NettyChatClient.getInstance().sendByteMessage(bytes);

            }
        });

        binding.video.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            }
        });
        binding.video2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

        binding.btnSendHb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MicroPhotoService.sendHeartbeat(getApplicationContext());
            }
        });

        binding.btnRestartApp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext().getApplicationContext();
                MicroPhotoService.restartApp(context, context.getPackageName());
            }
        });

        binding.btnReboot.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(final View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle(R.string.confirm_reboot);
                builder.setMessage(R.string.text_confirm_reboot);
                builder.setCancelable(true);
                builder.setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                        SysApi.reboot(v.getContext().getApplicationContext());
                    }
                });
                builder.setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                });
                builder.show();
            }
        });

        binding.btnCameraInfo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MicroPhotoService.setOtgState(true);

                // SysApi.setOtgState(true);
                MicroPhotoService.setCam3V3Enable(true);

                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        String cameraInfo = CameraUtils.getAllCameraInfo(view.getContext());

                        Log.d(TAG, cameraInfo);

                        MicroPhotoService.setCam3V3Enable(false);
                        MicroPhotoService.setOtgState(false);

                        binding.logs.append(cameraInfo + "\r\n");
                        Toast.makeText(view.getContext(), cameraInfo, Toast.LENGTH_LONG).show();
                    }
                };

                mHandler.postDelayed(runnable, 1500);
            }
        });

    }

    public static void startMicroPhotoService(Context context, MicroPhotoContext.AppConfig curAppConfig, Messenger messenger) {

        if (TextUtils.isEmpty(curAppConfig.cmdid) || TextUtils.isEmpty(curAppConfig.server) || curAppConfig.port == 0) {
            return;
        }
        Intent intent = new Intent(context, MicroPhotoService.class);
        intent.setAction(MicroPhotoService.ACTION_START);
        intent.putExtra("cmdid", curAppConfig.cmdid);
        intent.putExtra("server", curAppConfig.server);
        intent.putExtra("port", curAppConfig.port);
        intent.putExtra("protocol", curAppConfig.protocol);
        intent.putExtra("networkProtocol", curAppConfig.networkProtocol);
        intent.putExtra("encryption", curAppConfig.encryption);
        intent.putExtra("network", curAppConfig.network);
        if (messenger != null) {
            intent.putExtra("messenger", messenger);
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent);
        } else {
            context.startService(intent);
        }
    }

    private void takePhoto(int channel, int preset, boolean photoOrVideo) {
        MicroPhotoService.takePhoto(this.getApplicationContext(), channel, preset, photoOrVideo);
    }

    @Override
    protected void onResume() {
        // call the superclass method first
        super.onResume();

        try {
            String logFilePath = MicroPhotoContext.buildAppDir(this.getApplicationContext());
            logFilePath += "logs";
            File file = new File(logFilePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            logFilePath += "/log.txt";
            file = new File(logFilePath);
            if (!file.exists()) {
                file.createNewFile();
            }

            mLogFileObserver = new LogFileObserver(logFilePath);
            mLogFileObserver.startWatching();
            Log.i(TAG, "Log Observer Started");

            int lines = binding.logs.getLineCount();
            if (lines > MAX_LOG_LINES) {
                int excessLineNumber = lines - MIN_LOG_LINES;
                int eolIndex = -1;
                CharSequence charSequence = binding.logs.getText();
                for (int i = 0; i < excessLineNumber; i++) {
                    do {
                        eolIndex++;
                    } while (eolIndex < charSequence.length() && charSequence.charAt(eolIndex) != '\n');
                }
                if (eolIndex < charSequence.length()) {
                    binding.logs.getEditableText().delete(0, eolIndex + 1);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onPause() {
        // call the superclass method first
        super.onPause();

        try {
            if (mLogFileObserver != null) {
                mLogFileObserver.stopWatching();
                mLogFileObserver = null;
                Log.i(TAG, "Log Observer Stopped");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    private void setDefaultDataSubId(int subId) {
        SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        try {
            Method method = subscriptionManager.getClass().getDeclaredMethod("setDefaultDataSubId", int.class);
            method.invoke(subscriptionManager, subId);
            TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            Method method1 = telephonyManager.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
            method1.invoke(telephonyManager, true);
        } catch (Exception e) {
            Log.e(TAG, "wjz debug setDefaultDataSubId: error is " + e.getMessage());
        }
    }

    private MicroPhotoContext.AppConfig retrieveAndSaveAppConfig() {
        MicroPhotoContext.AppConfig appConfig = new MicroPhotoContext.AppConfig();

        appConfig.cmdid = MainActivity.this.binding.cmdid.getText().toString();
        appConfig.server = MainActivity.this.binding.server.getText().toString();
        String portStr = MainActivity.this.binding.port.getText().toString();
        appConfig.port = TextUtils.isEmpty(portStr) ? 0 : Integer.parseInt(portStr);
        String protocolStr = MainActivity.this.binding.protocol.getSelectedItem().toString();
        appConfig.protocol = MicroPhotoContext.DEFAULT_PROTOCOL;
        String[] parts = protocolStr.split("-");
        if (parts != null) {
            appConfig.protocol = Integer.parseInt(parts[0]);
        }
        appConfig.networkProtocol = MainActivity.this.binding.networkProtocol.getSelectedItemPosition();
        appConfig.encryption = MainActivity.this.binding.encryptions.getSelectedItemPosition();

        appConfig.heartbeat = TextUtils.isEmpty(binding.heartbeat.getText().toString()) ? 0 : Integer.parseInt(binding.heartbeat.getText().toString());
        appConfig.packetSize = TextUtils.isEmpty(binding.packetSize.getText().toString()) ? 0 : Integer.parseInt(binding.packetSize.getText().toString());

        appConfig.network = MainActivity.this.binding.network.getSelectedItemPosition();

        saveAppConfig(appConfig);

        return appConfig;
    }

    private MicroPhotoContext.AppConfig getAppConfig() {
        return MicroPhotoContext.getMpAppConfig(this.getApplicationContext());
    }

    private void saveAppConfig(MicroPhotoContext.AppConfig appConfig) {
        MicroPhotoContext.saveMpAppConfig(getApplicationContext(), appConfig);
    }

    private int getDefaultDataSubId() {
        SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        try {
            Method method = subscriptionManager.getClass().getDeclaredMethod("getDefaultDataSubscriptionId");
            return (int) method.invoke(subscriptionManager);
        } catch (Exception e) {
            Log.e(TAG, "wjz debug getDefaultDataSubId: error is " + e.getMessage());
        }
        return 0;
    }

    public native boolean takePhoto(int channel, int preset, String path, String fileName);


    private void gpsTake() {
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

// 注册位置监听器
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (lastKnownLocation != null) {
            double latitude = lastKnownLocation.getLatitude();
            double longitude = lastKnownLocation.getLongitude();
            // 处理最新位置信息
            System.out.printf("gps" + latitude + "fds:" + longitude);
        }
    }

    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            // 处理位置更新事件
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            // ...

            Log.e("xyh", "定位方式：" + location.getProvider());
            Log.e("xyh", "纬度：" + location.getLatitude());
            Log.e("xyh", "经度：" + location.getLongitude());
            Log.e("xyh", "海拔：" + location.getAltitude());
            Log.e("xyh", "时间：" + location.getTime());
            Log.e("xyh", "国家：" + LocationUtil.getCountryName(MainActivity.this, location.getLatitude(), location.getLongitude()));
            Log.e("xyh", "获取地理位置：" + LocationUtil.getAddress(MainActivity.this, location.getLatitude(), location.getLongitude()));
            Log.e("xyh", "所在地：" + LocationUtil.getLocality(MainActivity.this, location.getLatitude(), location.getLongitude()));
            Log.e("xyh", "所在街道：" + LocationUtil.getStreet(MainActivity.this, location.getLatitude(), location.getLongitude()));

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // 处理位置状态变化事件
            System.out.printf("fsdaf");
        }

        @Override
        public void onProviderEnabled(String provider) {
            // 处理位置提供者启用事件
            System.out.printf("fsdaf");
        }

        @Override
        public void onProviderDisabled(String provider) {

            // 处理位置提供者禁用事件
            System.out.printf("fsdaf");
        }
    };


    private void startLocate() {
        LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean providerEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (providerEnabled) { //GPS已开启
            /**
             * 绑定监听
             * 参数1，设备：有GPS_PROVIDER和NETWORK_PROVIDER两种，前者是GPS,后者是GPRS以及WIFI定位
             * 参数2，位置信息更新周期.单位是毫秒
             * 参数3，位置变化最小距离：当位置距离变化超过此值时，将更新位置信息
             * 参数4，监听
             * 备注：参数2和3，如果参数3不为0，则以参数3为准；参数3为0，则通过时间来定时更新；两者为0，则随时刷新
             */
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        } else {
            Toast.makeText(this, "请打开GPS", Toast.LENGTH_SHORT).show();
        }
    }

    //    private void initSocket() {
//        NettyChatClient nettyChatClient = NettyChatClient.newInstance("47.96.238.157", 6891);
////        NettyChatClient nettyChatClient = NettyChatClient.newInstance("180.166.218.222", 40032);
//        nettyChatClient.init(new INettyMessageListener() {
//            @Override
//            public void onReceive(String message) {
////                for (INettyMessageListener nettyMessageListener : mIMessageListenerList) {
////                    nettyMessageListener.onReceive(message);
////                }
//                System.out.println("dsfa");
//            }
//
//            @Override
//            public void onConnectSuccess() {
////                for (INettyMessageListener nettyMessageListener : mIMessageListenerList) {
////                    nettyMessageListener.onConnectSuccess();
////                }
//                System.out.println("dsfa");
//            }
//
//            @Override
//            public void onError() {
////                for (INettyMessageListener nettyMessageListener : mIMessageListenerList) {
////                    nettyMessageListener.onError();
////                }
//                System.out.println("dsfa");
//            }
//        });
//        nettyChatClient.connect();
//         }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // Back pressed
            return true; // disable it
        }

        return super.onKeyDown(keyCode, event);
    }


}