package com.zzx.factorytest.view;
import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import com.zzx.factorytest.R;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class SerialPortDialog extends Dialog implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private CheckBox mUHFCheckBox, mHFCheckBox, mLFCheckBox;
private EditText mUHFEditText, mHFEditText, mLFEditText;
private EditText mUHFUartEditText, mHFUartEditText, mLFUartEditText;
private Button mSubmit, mCancel;
private SharedPreferences mSP;
private int[] mBaudrates;
private Spinner mUHFSpinner, mHFSpinner, mLFSpinner;
private String[] mSerialPortPath;
public SerialPortDialog(Context context) {
this(context, android.R.style.Theme_Holo_Dialog);
}
public SerialPortDialog(Context context, int theme) {
super(context, theme);
init(context);
}
private void init(Context context) {
mBaudrates = context.getResources().getIntArray(R.array.serialport);
mSerialPortPath = context.getResources().getStringArray(R.array.serialport_path);
setTitle(context.getResources().getString(R.string.configuration_serialport_dialog_title));
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.configuration_serialport_dalog_view, null);
findView(view);
setContentView(view);
// Window window = getWindow();
// WindowManager windowManager = getWindow().getWindowManager();
// Display display = windowManager.getDefaultDisplay();
// WindowManager.LayoutParams attributes = window.getAttributes();
// attributes.width = (int) (display.getWidth() * 0.8);
// attributes.height = (int) (display.getHeight() * 0.8);
// window.setAttributes(attributes);
// window.getDecorView().setPadding(0, 0, 0, 0);
}
private void findView(View root) {
mUHFCheckBox = (CheckBox) root.findViewById(R.id.uhf_CheckBox);
mUHFEditText = (EditText) root.findViewById(R.id.uhf_EditText);
mUHFUartEditText = (EditText) root.findViewById(R.id.uhf_uart_EditText);
mUHFSpinner = (Spinner) root.findViewById(R.id.uhf_Spinner);
mHFCheckBox = (CheckBox) root.findViewById(R.id.hf_CheckBox);
mHFEditText = (EditText) root.findViewById(R.id.hf_EditText);
mHFUartEditText = (EditText) root.findViewById(R.id.hf_uart_EditText);
mHFSpinner = (Spinner) root.findViewById(R.id.hf_Spinner);
mLFCheckBox = (CheckBox) root.findViewById(R.id.lf_CheckBox);
mLFEditText = (EditText) root.findViewById(R.id.lf_EditText);
mLFUartEditText = (EditText) root.findViewById(R.id.lf_uart_EditText);
mLFSpinner = (Spinner) root.findViewById(R.id.lf_Spinner);
mSubmit = (Button) root.findViewById(R.id.submit);
mCancel = (Button) root.findViewById(R.id.cancel);
mSubmit.setOnClickListener(this);
mCancel.setOnClickListener(this);
mUHFCheckBox.setOnCheckedChangeListener(this);
mHFCheckBox.setOnCheckedChangeListener(this);
mLFCheckBox.setOnCheckedChangeListener(this);
mSP = getContext().getSharedPreferences("serialport", Context.MODE_PRIVATE);
//波特率
mUHFEditText.setText(String.valueOf(mSP.getInt("uhf_baudrate", 115200)));
mHFEditText.setText(String.valueOf(mSP.getInt("hf_baudrate", 115200)));
mLFEditText.setText(String.valueOf(mSP.getInt("lf_baudrate", 115200)));
//uart
mLFUartEditText.setText(String.valueOf(mSP.getInt("lf_uart", 0)));
mHFUartEditText.setText(String.valueOf(mSP.getInt("hf_uart", 0)));
mUHFUartEditText.setText(String.valueOf(mSP.getInt("uhf_uart", 0)));
//文件路径
mUHFSpinner.setSelection(Arrays.binarySearch(mSerialPortPath, mSP.getString("uhf_path", "/dev/ttyMT0")));
mHFSpinner.setSelection(Arrays.binarySearch(mSerialPortPath, mSP.getString("hf_path", "/dev/ttyMT0")));
mLFSpinner.setSelection(Arrays.binarySearch(mSerialPortPath, mSP.getString("lf_path", "/dev/ttyMT0")));
mUHFCheckBox.setChecked(mSP.getBoolean("uhf", false));
mHFCheckBox.setChecked(mSP.getBoolean("hf", false));
mLFCheckBox.setChecked(mSP.getBoolean("lf", false));
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.submit:
SharedPreferences.Editor editor = mSP.edit();
if (mUHFCheckBox.isChecked()) {
int baudrate = formatBaudrate(mUHFEditText.getText().toString());
if (baudrate < 0) {
Toast.makeText(getContext(), "波特率不正确", Toast.LENGTH_SHORT).show();
mUHFEditText.requestFocus();
return;
}
int uart = Integer.valueOf(mUHFUartEditText.getText().toString());
if (uart < 0 || uart > 8) {
Toast.makeText(getContext(), "uart不正确", Toast.LENGTH_SHORT).show();
mUHFUartEditText.requestFocus();
return;
}
editor.putInt("uhf_uart", uart);
editor.putInt("uhf_baudrate", baudrate);
int itemPosition = mUHFSpinner.getSelectedItemPosition();
String path = (String) mUHFSpinner.getItemAtPosition(itemPosition);
editor.putString("uhf_path", path);
} else {
editor.remove("uhf_baudrate");
editor.remove("uhf_path");
}
if (mHFCheckBox.isChecked()) {
int baudrate = formatBaudrate(mHFEditText.getText().toString());
if (baudrate < 0) {
Toast.makeText(getContext(), "波特率不正确", Toast.LENGTH_SHORT).show();
mHFEditText.requestFocus();
return;
}
int uart = Integer.valueOf(mHFUartEditText.getText().toString());
if (uart < 0 || uart > 8) {
Toast.makeText(getContext(), "uart不正确", Toast.LENGTH_SHORT).show();
mHFUartEditText.requestFocus();
return;
}
editor.putInt("hf_uart", uart);
editor.putInt("hf_baudrate", baudrate);
int itemPosition = mHFSpinner.getSelectedItemPosition();
String path = (String) mHFSpinner.getItemAtPosition(itemPosition);
editor.putString("hf_path", path);
} else {
editor.remove("hf_baudrate");
editor.remove("hf_path");
}
if (mLFCheckBox.isChecked()) {
int baudrate = formatBaudrate(mLFEditText.getText().toString());
if (baudrate < 0) {
Toast.makeText(getContext(), "波特率不正确", Toast.LENGTH_SHORT).show();
mLFEditText.requestFocus();
return;
}
int uart = Integer.valueOf(mLFUartEditText.getText().toString());
if (uart < 0 || uart > 8) {
Toast.makeText(getContext(), "uart不正确", Toast.LENGTH_SHORT).show();
mLFUartEditText.requestFocus();
return;
}
editor.putInt("lf_uart", uart);
editor.putInt("lf_baudrate", baudrate);
int itemPosition = mLFSpinner.getSelectedItemPosition();
String path = (String) mLFSpinner.getItemAtPosition(itemPosition);
editor.putString("lf_path", path);
} else {
editor.remove("lf_baudrate");
editor.remove("lf_path");
}
editor.putBoolean("uhf", mUHFCheckBox.isChecked());
editor.putBoolean("hf", mHFCheckBox.isChecked());
editor.putBoolean("lf", mLFCheckBox.isChecked());
editor.apply();
createXML();
break;
case R.id.cancel:
dismiss();
break;
default:
}
dismiss();
}
private void createXML() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("resources");
if (mUHFCheckBox.isChecked()) {
String baudrate = mUHFEditText.getText().toString();
String uart = mUHFUartEditText.getText().toString();
Element uhf = root.addElement("uhf");
uhf.addAttribute("baudrate", baudrate);
uhf.addAttribute("uart", uart);
uhf.setText((String) mUHFSpinner.getItemAtPosition(mUHFSpinner.getSelectedItemPosition()));
}
if (mHFCheckBox.isChecked()) {
String baudrate = mHFEditText.getText().toString();
String uart = mHFUartEditText.getText().toString();
Element hf = root.addElement("hf");
hf.addAttribute("baudrate", baudrate);
hf.addAttribute("uart", uart);
hf.setText((String) mHFSpinner.getItemAtPosition(mHFSpinner.getSelectedItemPosition()));
}
if (mLFCheckBox.isChecked()) {
String baudrate = mLFEditText.getText().toString();
String uart = mLFUartEditText.getText().toString();
Element lf = root.addElement("lf");
lf.addAttribute("baudrate", baudrate);
lf.addAttribute("uart", uart);
lf.setText((String) mLFSpinner.getItemAtPosition(mLFSpinner.getSelectedItemPosition()));
}
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = null;
try {
File sotenFile = new File(Environment.getDataDirectory(), "soten");
if (!sotenFile.exists()) {
sotenFile.mkdir();
sotenFile.setReadable(true, false);
sotenFile.setExecutable(true, false);
}
File etc = new File(sotenFile, "etc");
if (!etc.exists()) {
etc.mkdir();
etc.setReadable(true, false);
etc.setExecutable(true, false);
}
File configFile = new File(etc, "soten-config.xml");
writer = new XMLWriter(new FileOutputStream(configFile), format);
writer.setEscapeText(false);
writer.write(document);
writer.flush();
configFile.setReadable(true, false);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != writer)
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private int formatBaudrate(String value) {
if (null == value || "".equals(value)) {
return -1;
}
value = value.trim();
try {
Integer baudrate = Integer.valueOf(value);
return checkBaudrate(baudrate) ? baudrate : -1;
} catch (NumberFormatException e) {
e.printStackTrace();
}
return -1;
}
private boolean checkBaudrate(int baudrate) {
return Arrays.binarySearch(mBaudrates, baudrate) >= 0;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.uhf_CheckBox:
mUHFEditText.setEnabled(isChecked);
mUHFSpinner.setEnabled(isChecked);
mUHFUartEditText.setEnabled(isChecked);
break;
case R.id.hf_CheckBox:
mHFEditText.setEnabled(isChecked);
mHFSpinner.setEnabled(isChecked);
mHFUartEditText.setEnabled(isChecked);
break;
case R.id.lf_CheckBox:
mLFEditText.setEnabled(isChecked);
mLFSpinner.setEnabled(isChecked);
mLFUartEditText.setEnabled(isChecked);
break;
}
}
}