From 9db29abcf014079ed645d41b43628431a62dca4a Mon Sep 17 00:00:00 2001 From: staccatomamba Date: Thu, 3 Nov 2016 15:26:12 +0100 Subject: [PATCH] =?UTF-8?q?=C3=84nderungen=20von=20bis=20zur=20Messe=20ein?= =?UTF-8?q?gecheckt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android/BewoMitarbeiterApp/app/app.iml | 1 + .../main/java/Database/DatabaseHandler.java | 72 +++----- .../BeWoChatApplication.java | 170 +++++++++++++----- .../bewomitarbeiterapp/ChatActivity.java | 71 ++++++-- .../bewomitarbeiterapp/KontaktAdapter.java | 33 ++-- .../KontaktChatActivity.java | 87 ++++++--- .../bewomitarbeiterapp/LoginActivity.java | 20 +-- .../bewomitarbeiterapp/MessageAdapter.java | 2 +- .../bewomitarbeiterapp/WebdokuActivity.java | 6 +- .../src/main/java/entities/ChatMessage.java | 58 ++++++ .../src/main/java/soapConnection/Packet.java | 100 +++++++++-- .../main/java/soapConnection/SoapCalls.java | 2 +- .../{LoginCallback.java => Callback.java} | 2 +- .../java/tcpConnection/SocketManager.java | 71 +++----- .../app/src/main/java/util/BeWoLog.java | 14 +- .../app/src/main/java/util/Util.java | 45 ++--- .../res/drawable-xxhdpi-v11/statusteam.png | Bin 0 -> 195 bytes BeWoChatServer/Server.cs | 23 ++- Data/Access/SearchDAO.cs | 2 +- 19 files changed, 534 insertions(+), 245 deletions(-) rename Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/{LoginCallback.java => Callback.java} (74%) create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable-xxhdpi-v11/statusteam.png diff --git a/Android/BewoMitarbeiterApp/app/app.iml b/Android/BewoMitarbeiterApp/app/app.iml index 5c1f8f22c..a8696e47b 100644 --- a/Android/BewoMitarbeiterApp/app/app.iml +++ b/Android/BewoMitarbeiterApp/app/app.iml @@ -84,6 +84,7 @@ + diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java index 5166a061c..6f447fe09 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java @@ -18,7 +18,6 @@ import java.util.Locale; import beyondsoft.bewomitarbeiterapp.ContactListItem; import entities.ChatMessage; import soapConnection.SoapConnectionManager; -import util.BeWoLog; /** * Created by bib on 07.06.2016. @@ -121,15 +120,15 @@ public class DatabaseHandler extends SQLiteOpenHelper { public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + - KEY_ID + " INTEGER PRIMARY KEY," + - KEY_KONTAKT_NAME + " TEXT,"+ - KEY_PERSONOID + " INTEGER," + - KEY_PICTURE_BLOB + " BLOB, " + - KEY_IS_TEAM + " INTEGER, " + - KEY_TEAM_MEMBER_NAMES + " TEXT, " + - KEY_TEAM_MEMBER_OIDS + " TEXT, " + - KEY_VERSION + " INTEGER, " + - KEY_IS_EMPLOYEE + " INTEGER)"; + KEY_ID + " INTEGER PRIMARY KEY," + + KEY_KONTAKT_NAME + " TEXT,"+ + KEY_PERSONOID + " INTEGER," + + KEY_PICTURE_BLOB + " BLOB, " + + KEY_IS_TEAM + " INTEGER, " + + KEY_TEAM_MEMBER_NAMES + " TEXT, " + + KEY_TEAM_MEMBER_OIDS + " TEXT, " + + KEY_VERSION + " INTEGER, " + + KEY_IS_EMPLOYEE + " INTEGER)"; db.execSQL(CREATE_CONTACTS_TABLE); @@ -335,7 +334,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { Date sendDate = null; if(cursor.getString(9) != null) { - sendDate = getDateFromString(cursor.getString(9)); + sendDate = getDateFromString(cursor.getString(9)); } cursor.close(); @@ -356,16 +355,16 @@ public class DatabaseHandler extends SQLiteOpenHelper { SQLiteDatabase readableDatabase = this.getReadableDatabase(); Cursor cursor = readableDatabase.query( - TABLE_CHATMESSAGE, - CHAT_MESSAGE_COLUMNS, - KEY_IS_TEAM_CHATMESSAGE + " = 0 AND ((" + - KEY_SENDER_PERSON_OID_CHATMESSAGE + "=? AND " + - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=?) OR (" + - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + - KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?))" - , - new String[] {String.valueOf(SoapConnectionManager.getUser().getPersonOid()), String.valueOf(recipientOid), String.valueOf(SoapConnectionManager.getUser().getPersonOid()), String.valueOf(recipientOid)}, - null, null, null, null); + TABLE_CHATMESSAGE, + CHAT_MESSAGE_COLUMNS, + KEY_IS_TEAM_CHATMESSAGE + " = 0 AND ((" + + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=? AND " + + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=?) OR (" + + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?))" + , + new String[] {String.valueOf(SoapConnectionManager.getUser().getPersonOid()), String.valueOf(recipientOid), String.valueOf(SoapConnectionManager.getUser().getPersonOid()), String.valueOf(recipientOid)}, + null, null, null, null); if(cursor.moveToFirst()) { do{ @@ -445,15 +444,15 @@ public class DatabaseHandler extends SQLiteOpenHelper { if(cursor != null) { cursor.moveToFirst(); - int contactId = cursor.getInt(0); - String contactName = cursor.getString(1); - int contactPersonOid = cursor.getInt(2); - byte[] contactPicture = cursor.getBlob(3); - boolean contactIsTeam = cursor.getInt(4) == 1; - String teamMemberOids = cursor.getString(5); + int contactId = cursor.getInt(0); + String contactName = cursor.getString(1); + int contactPersonOid = cursor.getInt(2); + byte[] contactPicture = cursor.getBlob(3); + boolean contactIsTeam = cursor.getInt(4) == 1; + String teamMemberOids = cursor.getString(5); String teamMemberNames = cursor.getString(6); - int contactVersion = cursor.getInt(7); - boolean isEmployee = cursor.getInt(8) == 1; + int contactVersion = cursor.getInt(7); + boolean isEmployee = cursor.getInt(8) == 1; ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames, contactVersion, isEmployee); @@ -631,8 +630,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } public ArrayList getUnsentChatMessages() { - BeWoLog.writeToLogFile("Lade unverschickte Nachrichten aus der Datenbank. (getUnsentMessages)"); - ArrayList messages = new ArrayList<>(); SQLiteDatabase readableDatabase = this.getReadableDatabase(); @@ -657,8 +654,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { cursor.getString(8) ); - BeWoLog.writeToLogFile("MessageId: " + message.MessageId + "; IsDelivered: " + message.IsDelivered + "; Name der IsDelivered-Spalte: " + cursor.getColumnName(5) + ". (getUnsentMessages)"); - if(cursor.getString(9) != null) { message.SendDate = getDateFromString(cursor.getString(9)); } @@ -673,15 +668,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } public ArrayList getChatMessagesByMessageIds(ArrayList messageIds) { - String abc = ""; - for(String mid : messageIds) { - abc += messageIds; - if(messageIds.indexOf(mid) != (messageIds.size() - 1)) { - abc += "\n"; - } - } - BeWoLog.writeToLogFile(abc); - ArrayList result = new ArrayList<>(); SQLiteDatabase readableDatabase = this.getReadableDatabase(); @@ -717,8 +703,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { blubb += "" + i + ". " + cursor.getColumnName(i) + "; "; } - BeWoLog.writeToLogFile(blubb); - if(cursor.getString(9) != null) { message.SendDate = getDateFromString(cursor.getString(9)); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java index ab451dc28..dc279b5c5 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java @@ -3,6 +3,7 @@ package beyondsoft.bewomitarbeiterapp; import android.app.Application; import android.app.NotificationManager; import android.content.Context; +import android.content.SharedPreferences; import android.util.Log; import com.google.gson.Gson; @@ -17,10 +18,11 @@ import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapPrimitive; import java.lang.reflect.Type; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; +import java.util.Locale; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -33,13 +35,12 @@ import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; -import tcpConnection.LoginCallback; +import tcpConnection.Callback; import tcpConnection.SocketManager; import util.BeWoLog; -import util.ChatMessageDeserializer; import util.ConnectivityReceiver; +import util.Util; -import static soapConnection.SoapCalls.CHECK_MESSAGE_IDS; /** * Created by JettenM on 24.08.2016. @@ -66,6 +67,7 @@ public class BeWoChatApplication extends Application { private static BeWoChatApplication mInstance; private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private static final ScheduledExecutorService schedulerTCP = Executors.newScheduledThreadPool(1); public static Date lastOnlineTS; @@ -82,11 +84,47 @@ public class BeWoChatApplication extends Application { public void onCreate() { super.onCreate(); + SharedPreferences prefs = getSharedPreferences(Util.PREFS_NAME, MODE_PRIVATE); + if(!prefs.contains(Util.PREFS_FIRST_RUN_KEY)) { + prefs.edit().putBoolean(Util.PREFS_FIRST_RUN_KEY, false).commit(); + + Boolean isDeleted = BeWoLog.deleteLogFile(); + Log.i("BEWO_CHAT_APPLICATION", "Löschen des Logs war" + (isDeleted ? "" : " nicht") + " erfolgreich"); + } + mInstance = this; spiceManager.start(this); keepAlive(); + keepAliveTCP(); + } + + public void keepAliveTCP() { + final Runnable blubb = new Runnable() { + @Override + public void run() { + if(ConnectivityReceiver.isConnected()) { + Packet packet = new Packet(); + packet.ChatDataIdentifier = DataIdentifier.KEEP_ALIVE; + packet.ChatName = SoapConnectionManager.getUser().getFullName(); + packet.IsEmployee = SoapConnectionManager.getUser().getIsEmployee(); + packet.Tenant = SoapConnectionManager.getUser().getTenant(); + packet.MessageTimeStamp = Calendar.getInstance().getTime(); + + SocketManager.sendMessage(packet); + } + } + }; + + final ScheduledFuture blubbHandle = schedulerTCP.scheduleAtFixedRate(blubb, refreshIntervalInMinutes, refreshIntervalInMinutes, TimeUnit.MINUTES); + + schedulerTCP.schedule(new Runnable() { + @Override + public void run() { + blubbHandle.cancel(true); + } + }, 10, TimeUnit.DAYS); } public void keepAlive() { @@ -97,11 +135,14 @@ public class BeWoChatApplication extends Application { if(ConnectivityReceiver.isConnected()) { if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < getRefreshIntervalInMilliseconds()) { + BeWoLog.writeToLogFile("Schicke KeepAlive zum SOAP-Server. (SOAP-KeepAlive)"); spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); + } else { + BeWoLog.writeToLogFile("Das Intervall von " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten wurde überschritten. Sende kein KeepAlive an den SOAP-Server. (SOAP-KeepAlive)"); } + } else { + BeWoLog.writeToLogFile("Bin offline. Sende kein KeepAlive an den SOAP-Server. (SOAP-KeepAlive)"); } - - Log.i("LOOPER", "Halte Verbindung zum Soap-Server am leben..."); } }; @@ -142,7 +183,6 @@ public class BeWoChatApplication extends Application { Log.e("UNCAUGHT_EXCEPTION", "Eine unbehandelte Ausnahme ist aufgetreten!\n" + ex.getMessage()); ex.printStackTrace(); - writeExceptionToLog(ex); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); @@ -162,18 +202,18 @@ public class BeWoChatApplication extends Application { public void onRequestFailure(SpiceException spiceException) { Log.e("BEWOAPP", "Fehler beim am Leben erhalten!"); - BeWoLog.writeToLogFile("Verbindungserneuerung ist fehlgeschlagen (JsonSoapPrimitiveRequestListener->onRequestFailure)"); + BeWoLog.writeToLogFile("Das JSON-Keep-Alives ist fehlgeschlagen (JsonSoapPrimitiveRequestListener->onRequestFailure)"); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { Log.e("BEWOAPP", "Antwort ist null!"); - BeWoLog.writeToLogFile("Die Verbindungserneuerung lieferte Null zurück. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); + BeWoLog.writeToLogFile("Das JSON-Keep-Alives lieferte Null zurück. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); } else { BeWoChatApplication.lastOnlineTS = Calendar.getInstance().getTime(); BeWoLog.writeToLogFile("Erneuere die Verbindung. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); - Log.i("BEWOAPP", "Die Antwort hat einen Wert"); + Log.i("BEWOAPP", "Die Antwort des JSON-Keep-Alives hat einen Wert"); } } } @@ -182,6 +222,12 @@ public class BeWoChatApplication extends Application { private final static String LOGTAG = "UUID_CHECK"; + private ArrayList messageIdsWithoutResponse; + + public JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener(ArrayList messageIdsWithoutResponse) { + this.messageIdsWithoutResponse = messageIdsWithoutResponse; + } + @Override public void onRequestFailure(SpiceException spiceException) { Log.e(LOGTAG, "Die Anfrage an den Server ist gescheitert! (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestFailure)"); @@ -207,11 +253,14 @@ public class BeWoChatApplication extends Application { final ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); if(result != null) { + String blubb = ""; + if(result.size() == 0) { + blubb = "keine"; return; } - String blubb = ""; + for(String ms : result) { blubb += ms; @@ -219,34 +268,63 @@ public class BeWoChatApplication extends Application { blubb += "\n"; } } - BeWoLog.writeToLogFile("Vom Server zurückgelieferte MessageIds: " + blubb); + BeWoLog.writeToLogFile("Vom Server zurückgelieferte MessageIds:\n" + blubb); DatabaseHandler databaseHandler = DatabaseHandler.getInstance(BeWoChatApplication.getInstance()); - ArrayList messages2send = databaseHandler.getChatMessagesByMessageIds(result); + ArrayList demServerBekannteChatMessages = databaseHandler.getChatMessagesByMessageIds(result); - BeWoLog.writeToLogFile("Es existieren " + messages2send.size() + " Nachrichten, deren Response verloren gegangen ist. (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + String blubb2 = ""; - for(ChatMessage cm : messages2send) { - final Packet unsentPacket = new Packet(); + if(demServerBekannteChatMessages.size() == 0) { + blubb2 = "keine"; + } else { + for (ChatMessage cm : demServerBekannteChatMessages) { + blubb2 += cm.MessageId; - unsentPacket.ChatDataIdentifier = cm.IsTeam ? DataIdentifier.TEAM : DataIdentifier.MESSAGE; - unsentPacket.ChatMessage = cm.ChatText; - unsentPacket.ChatName = SoapConnectionManager.getUser().getFullName(); - unsentPacket.RecipientPersonOid = cm.RecipientPersonOid; - unsentPacket.ClientseitigeOid = cm.Id; - unsentPacket.MessageTimeStamp = cm.InsTs; - unsentPacket.SenderPersonOid = cm.SenderPersonOid; - unsentPacket.Tenant = SoapConnectionManager.getUser().getTenant(); - unsentPacket.IsDelivered = cm.IsDelivered; - unsentPacket.MessageId = cm.MessageId; + if (demServerBekannteChatMessages.indexOf(cm) != (demServerBekannteChatMessages.size() - 1)) { + blubb2 += "\n"; + } + } + } - BeWoLog.writeToLogFile("Verschicke Nachricht, deren Response verloren gegangen ist. ("+unsentPacket.MessageId+") (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)" + unsentPacket.toString()); - SocketManager.sendMessage(unsentPacket); + BeWoLog.writeToLogFile("Es existieren " + demServerBekannteChatMessages.size() + " Nachrichten, deren Response verloren gegangen ist. (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + BeWoLog.writeToLogFile("Die da wären: \n" + blubb2); - try { - Thread.sleep(75); - } catch (InterruptedException e) { - e.printStackTrace(); + ArrayList checkedMessages = DatabaseHandler.getInstance(BeWoChatApplication.mInstance).getChatMessagesByMessageIds(messageIdsWithoutResponse); + + for(ChatMessage cm : checkedMessages) { + if(demServerBekannteChatMessages.contains(cm)) { + BeWoLog.writeToLogFile("ChatMessage ist dem Server bereits bekannt. IsDelivered wird auf true gesetzt. (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + + cm.IsDelivered = true; + int affectedRowsCount = DatabaseHandler.getInstance(BeWoChatApplication.mInstance).updateChatMessage(cm); + + boolean isRemovalSuccessful = messageIdsWithoutResponse.remove(cm.MessageId); + + BeWoLog.writeToLogFile("ChatMessage wurde erfolgreich geändert: " + (affectedRowsCount > 0) + " und aus der Liste der responselosen entfernt: " + isRemovalSuccessful + ". (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + } else { + final Packet unsentPacket = new Packet(); + + unsentPacket.ChatDataIdentifier = cm.IsTeam ? DataIdentifier.TEAM : DataIdentifier.MESSAGE; + unsentPacket.ChatMessage = cm.ChatText; + unsentPacket.ChatName = SoapConnectionManager.getUser().getFullName(); + unsentPacket.RecipientPersonOid = cm.RecipientPersonOid; + unsentPacket.ClientseitigeOid = cm.Id; + unsentPacket.MessageTimeStamp = cm.InsTs; + unsentPacket.SenderPersonOid = cm.SenderPersonOid; + unsentPacket.Tenant = SoapConnectionManager.getUser().getTenant(); + unsentPacket.IsDelivered = cm.IsDelivered; + unsentPacket.MessageId = cm.MessageId; + + BeWoLog.writeToLogFile("Verschicke Nachricht, deren Response verloren gegangen ist. ("+unsentPacket.MessageId+") (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)\n\t" + unsentPacket.toString()); + SocketManager.sendMessage(unsentPacket); + + try { + Thread.currentThread().sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + writeExceptionToLog(e); + } } } } else { @@ -261,10 +339,9 @@ public class BeWoChatApplication extends Application { if(isConnected) { try { BeWoLog.writeToLogFile("Setze Socket zurück.(reconnectWithServer)"); -// SocketManager.shutDownConnectionToServer("reconnectWithServer"); BeWoLog.writeToLogFile("Setze LoginCallback des Sockets. (reconnectWithServer)"); - SocketManager.loginCallback = new LoginCallback() { + SocketManager.loginCallback = new Callback() { @Override public void doCallback() { Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Verschicke nicht verschickte Nachrichten..."); @@ -296,21 +373,22 @@ public class BeWoChatApplication extends Application { @Override public void run() { try { - BeWoLog.writeToLogFile("Lade nicht verschickte Nachrichten aus der Datenbank zum verschicken."); + BeWoLog.writeToLogFile("Lade nicht verschickte Nachrichten aus der Datenbank zum verschicken. (sendUnsentMessages)"); DatabaseHandler databaseHandler = DatabaseHandler.getInstance(context); ArrayList unsentMessages = databaseHandler.getUnsentChatMessages(); ArrayList messagesWithoutResponse = new ArrayList<>(); if(unsentMessages.size() > 0) { - BeWoLog.writeToLogFile("Habe " + unsentMessages.size() + " Nachrichten gefunden."); + BeWoLog.writeToLogFile("Habe " + unsentMessages.size() + " Nachrichten gefunden. (sendUnsentMessages)"); } else { - BeWoLog.writeToLogFile("Habe keine nicht verschickten Nachrichten gefunden."); + BeWoLog.writeToLogFile("Habe keine nicht verschickten Nachrichten gefunden. (sendUnsentMessages)"); } for(ChatMessage cm : unsentMessages) { if (cm.SendDate == null) { + Log.i("SEND_UNSENT_MESSAGES", "Die Nachricht wurde erst gar nicht verschickt: " + cm.ChatText); final Packet unsentPacket = new Packet(); unsentPacket.ChatDataIdentifier = cm.IsTeam ? DataIdentifier.TEAM : DataIdentifier.MESSAGE; @@ -324,19 +402,27 @@ public class BeWoChatApplication extends Application { unsentPacket.IsDelivered = cm.IsDelivered; unsentPacket.MessageId = cm.MessageId; - BeWoLog.writeToLogFile("Verschicke Nachricht("+unsentPacket.ChatMessage+") mit MessageId (" + unsentPacket.MessageId + ") "); + BeWoLog.writeToLogFile("Verschicke Nachricht(" + unsentPacket.ChatMessage + ") mit MessageId (" + unsentPacket.MessageId + "). (sendUnsentMessages)"); SocketManager.sendMessage(unsentPacket); - Thread.sleep(75); + + Thread.currentThread().sleep(100); } else { + Log.i("SEND_UNSENT_MESSAGES", "Bei der Nachricht wurde die MESSAGE_RESPONSE nicht empfangen: " + cm.ChatText + " " + cm.SendDate); messagesWithoutResponse.add(cm); } } - BeWoLog.writeToLogFile("Habe " + messagesWithoutResponse.size() + " Nachrichten gefunden, deren Message-Response verloren gegangen ist."); + BeWoLog.writeToLogFile("Habe " + messagesWithoutResponse.size() + " Nachrichten gefunden, deren Message-Response verloren gegangen ist. (sendUnsentMessages)"); + if(messagesWithoutResponse.size() == 0) { + return; + } + + ArrayList messageIds = new ArrayList<>(); String pExceptions = ""; for(int i = 0; i < messagesWithoutResponse.size(); i++) { pExceptions += messagesWithoutResponse.get(i).MessageId; + messageIds.add(messagesWithoutResponse.get(i).MessageId); if(i != (messagesWithoutResponse.size() - 1)) { pExceptions += ";"; @@ -346,7 +432,9 @@ public class BeWoChatApplication extends Application { ArrayList propertyInfos = new ArrayList<>(); propertyInfos.add(SoapConnectionManager.BuildProperty("messageIds", pExceptions, String.class)); JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.CHECK_MESSAGE_IDS, propertyInfos); - spiceManager.execute(request, new JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener()); + + BeWoLog.writeToLogFile("Führe Anfrage durch, ob der Server Nachrichten ohne Message-Response kennt. (sendUnsentMessages)"); + spiceManager.execute(request, new JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener(messageIds)); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java index 4f8f9bf69..da41ae1fd 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java @@ -43,11 +43,13 @@ import org.ksoap2.serialization.SoapPrimitive; import java.io.ByteArrayInputStream; import java.lang.reflect.Type; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.UUID; import Database.DatabaseHandler; @@ -59,7 +61,7 @@ import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; -import tcpConnection.LoginCallback; +import tcpConnection.Callback; import tcpConnection.SocketManager; import tcpConnection.UIHandler; import util.BeWoLog; @@ -200,16 +202,22 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei public void updateUserInterface(final Packet chatPacket) { try { Log.i(LOGTAG, "Identifier: " + chatPacket.ChatDataIdentifier.name()); + BeWoLog.writeToLogFile("Packet erhalten mit DataIdentifier: " + chatPacket.ChatDataIdentifier.name() + ". (ChatActivity)"); switch(chatPacket.ChatDataIdentifier) { case MESSAGE: listView.post(new Runnable() { @Override public void run() { - if(chatPacket.SenderPersonOid == recipientPersonOid && BeWoChatApplication.isActivityVisible()) { - chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false, chatPacket.MessageId)); + if(chatPacket.SenderPersonOid == recipientPersonOid) { + chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, false, chatPacket.MessageId)); adapter.sort(DATE_COMPARATOR); adapter.notifyDataSetChanged(); + + if(!BeWoChatApplication.isActivityVisible()) { + Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, chatPacket.IsEmployee, getApplicationContext()); + } + } else { Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, chatPacket.IsEmployee, getApplicationContext()); } @@ -217,17 +225,15 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei }); break; - case MESSAGE_RESPONSE: + BeWoLog.writeToLogFile("Empfange Response für Message: " + chatPacket.MessageId); + runOnUiThread(new Runnable() { @Override public void run() { for(ChatMessage cm : chatMessages) { - Log.i("RESPONSE", "lokale Id: " + cm.Id); - if(cm.Id == chatPacket.ClientseitigeOid) { - cm.ServerseitigeOid = chatPacket.ServerseitigeOid; - Log.i("RESPONSE", "COid: " + cm.Id + "; Text: " + cm.ChatText + "; " + cm.ServerseitigeOid); - break; + if(cm.MessageId.equals(chatPacket.MessageId)) { + cm.IsDelivered = true; } } @@ -237,7 +243,6 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei }); break; - case STATUS_NOTIFICATION_LOGIN: BeWoLog.writeToLogFile("Benutzer " + chatPacket.ChatName + " ist jetzt online. (ChatActivity)"); if(chatPacket.SenderPersonOid == recipientPersonOid) { @@ -259,7 +264,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei public void run() { ImageView status = (ImageView) mCustomView.findViewById(R.id.status); status.setImageResource(R.drawable.statusoffline); - } + } }); } @@ -357,7 +362,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei final JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_ALL_CHAT_MESSAGES, propertyInfos); - final LoginCallback corruptedSpiceCallback = new LoginCallback() { + final Callback corruptedSpiceCallback = new Callback() { @Override public void doCallback() { BeWoLog.writeToLogFile("Callback bei erneutem Login auf dem Soap-Server wird ausgeführt. (ChatActivity)"); @@ -365,15 +370,22 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei spiceManager.shouldStop(); spiceManager.start(ChatActivity.this); - SocketManager.loginCallbackAfterConnectionLost = new LoginCallback() { + SocketManager.loginCallbackAfterConnectionLost = new Callback() { @Override public void doCallback() { //ReloadChatView(contactName, recipientOid, contactImage, isTeam, teamMemberOids, teamMemberNames, isEmployee); + runOnUiThread(new Runnable() { + @Override + public void run() { + adapter.sort(DATE_COMPARATOR); + adapter.notifyDataSetChanged(); + } + }); + } }; -// SocketManager.shutDownConnectionToServer("ChatActivity->corruptedSpiceCallback"); SocketManager.connectToServer("ChatActivity -> corruptedSpiceCallback"); } }; @@ -383,8 +395,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei BeWoLog.writeToLogFile("Lade alle Nachrichten für diesen Chat herunter. (ChatActivity)"); spiceManager.execute(request, new JsonSoapPrimitiveRequestListener(corruptedSpiceCallback)); } else { -// SocketManager.shutDownConnectionToServer("ChatActivity->Letzter Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her"); - SocketManager.loginCallbackAfterConnectionLost = new LoginCallback() { + SocketManager.loginCallbackAfterConnectionLost = new Callback() { @Override public void doCallback() { BeWoLog.writeToLogFile("Lade alle Nachrichten für diesen Chat nach fehlgeschlagenem ersten Versuch herunter. (ChatActivity)"); @@ -420,6 +431,9 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei BeWoChatApplication.getInstance().setConnectivityListener(this); + adapter.sort(DATE_COMPARATOR); + adapter.notifyDataSetChanged(); + super.onResume(); } @@ -470,6 +484,27 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei ChatActivity.this.startActivity(dokuActivity); return true; + +// case R.id.action_show_unsent_messages: +// +// String message = ""; +// ArrayList unsentMessages = DatabaseHandler.getInstance(ChatActivity.this).getUnsentChatMessages(); +// for(ChatMessage cm : unsentMessages) { +// String sendDateStr = ""; +// +// if(cm.SendDate != null) { +// SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMAN); +// sendDateStr = dateFormat.format(cm.SendDate); +// } else { +// sendDateStr = "null"; +// } +// +// message += cm.MessageId + "; " + cm.IsDelivered + "; " + sendDateStr + "\n"; +// } +// +// Util.buildAlert(ChatActivity.this, message); +// +// return true; default: return super.onOptionsItemSelected(item); } @@ -527,9 +562,9 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei private final class JsonSoapPrimitiveRequestListener implements RequestListener { - public LoginCallback corruptedRequestCallback; + Callback corruptedRequestCallback; - public JsonSoapPrimitiveRequestListener(LoginCallback corruptedRequestCallback) { + JsonSoapPrimitiveRequestListener(Callback corruptedRequestCallback) { this.corruptedRequestCallback = corruptedRequestCallback; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java index 354b2577e..c8bf7306c 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java @@ -53,32 +53,34 @@ public class KontaktAdapter extends ArrayAdapter { ImageView onlinestats = (ImageView) rowView.findViewById(R.id.status); imageView = (ImageView) rowView.findViewById(R.id.logo); - textView.setText(values.get(position).getChatName()); + ContactListItem currentContact = values.get(position); - messagePreview.setText(values.get(position).getMessagePreview()); - messagePreview.setTypeface(messagePreview.getTypeface(), values.get(position).getIsNewMessage2Preview() ? 1 : 0); + textView.setText(currentContact.getChatName()); - if(values.get(position).isTeam) { - minitext.setText(values.get(position).teamMemberNames); + messagePreview.setText(currentContact.getMessagePreview()); + messagePreview.setTypeface(messagePreview.getTypeface(), currentContact.getIsNewMessage2Preview() ? 1 : 0); + + + + if(currentContact.isTeam) { + minitext.setText(currentContact.teamMemberNames); } Thread getPic; - if(values.get(position).getPicture() != null) { + if(currentContact.getPicture() != null) { Log.i("Kontakt", "PersonOid hat Bild"); - byte[] imageAsByteArray = values.get(position).getPicture(); + byte[] imageAsByteArray = currentContact.getPicture(); Bitmap i = BitmapFactory.decodeByteArray(imageAsByteArray, 0, imageAsByteArray.length); getPic = new Thread(new CircleBitmapCreator(i)); getPic.start(); } else { - ContactListItem cli = values.get(position); - int bildId = R.drawable.mitarbeiter_avatar; - if(cli.isTeam) { + if(currentContact.isTeam) { bildId = R.drawable.mitarbeiter_team_avatar; - } else if(!cli.getIsEmployee()) { + } else if(!currentContact.getIsEmployee()) { bildId = R.drawable.klient_avatar; } @@ -87,7 +89,14 @@ public class KontaktAdapter extends ArrayAdapter { imageView.setImageBitmap(ImageConverter.getRoundedCornerBitmap(bitmap, bitmap.getWidth() / 2)); } - onlinestats.setImageResource((values.get(position).isOnline ? R.drawable.statusonline : R.drawable.statusoffline)); + int resourceId; + if(currentContact.isTeam) { + resourceId = R.drawable.statusteam; + } else { + resourceId = currentContact.isOnline ? R.drawable.statusonline : R.drawable.statusoffline; + } + + onlinestats.setImageResource(resourceId); return rowView; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java index b74116868..3aaff2ccb 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -47,7 +47,7 @@ import soapConnection.OnRequestSuccessCallback; import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; -import tcpConnection.LoginCallback; +import tcpConnection.Callback; import tcpConnection.SocketManager; import tcpConnection.UIHandler; import util.BeWoLog; @@ -166,9 +166,16 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi @Override public void run() { isDownloadOfContacsInProgress = false; + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + } + }); + BeWoLog.writeToLogFile("isDownloadOfContacsInProgress wird nach 10 Sekunden zurückgesetzt."); } - }, 10*1000); + }, 10 * 1000); BeWoLog.writeToLogFile("Lade Kontakte (updateContactList)"); swipeRefreshLayout.setRefreshing(true); @@ -191,12 +198,17 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi final JsonSoapPrimitiveRequest getContactsRequest = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); if(ConnectivityReceiver.isConnected()) { - BeWoLog.writeToLogFile("App ist mit dem Internet verbunden (updateContactList)"); + BeWoLog.writeToLogFile("App ist mit dem Internet verbunden (updateContactList -> isConnected(✓))"); + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { - BeWoLog.writeToLogFile("Jetzt - letzter Serverkontakt ist kleiner als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten. (updateContactList)"); - spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveRequestListener(new OnRequestSuccessCallback() { + + BeWoLog.writeToLogFile("Jetzt - letzter Serverkontakt ist kleiner als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten. (updateContactList -> isConnected(✓) -> IntervallCheck(✓))"); + + spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveContactsRequestListener(new OnRequestSuccessCallback() { @Override public void doCallback() { + BeWoLog.writeToLogFile("Führe Callback des Kontakteladens durch. (updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓)"); + BeWoChatApplication.sendStatusRequest(); swipeRefreshLayout.setRefreshing(false); @@ -207,30 +219,40 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi final JsonSoapPrimitiveRequest getNewestMessagesRequest = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); if(ConnectivityReceiver.isConnected()) { + + BeWoLog.writeToLogFile("(updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> isConnected(✓)"); + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { + + BeWoLog.writeToLogFile("(updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> isConnected(✓) -> IntervallCheck(✓)"); + spiceManager.execute(getNewestMessagesRequest, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + } else { + BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her. Starte Verbindung zum SocketServer neu. (updateContactlist)"); + + SocketManager.loginCallbackAfterConnectionLost = new Callback() { + @Override + public void doCallback() { + BeWoLog.writeToLogFile("(updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> IntervallCheck(x)"); + + spiceManager.execute(getNewestMessagesRequest, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + } + }; + + SocketManager.connectToServer("KontaktChatActivity -> zweiten Intervall-Check nicht bestanden"); } } else { -// SocketManager.shutDownConnectionToServer("KontaktChatAcvitity->Letzer Kontakt ist weniger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her, aber die Internetverbindung war erneut weg"); - SocketManager.loginCallbackAfterConnectionLost = new LoginCallback() { - @Override - public void doCallback() { - spiceManager.execute(getNewestMessagesRequest, new JsonSoapPrimitiveRequestListenerForNewestMessages()); - } - }; - - SocketManager.connectToServer("KontaktChatActivity -> Intervall nicht erreicht"); + BeWoLog.writeToLogFile("updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> isConnected(x)"); } } })); } else { - BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her. Starte Verbindung zum SocketServer neu. (updateContactlist)"); + BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her. Starte Verbindung zum SocketServer neu. (updateContactlist -> isConnected(✓) -> IntervallCheck(x))"); -// SocketManager.shutDownConnectionToServer("KontaktChatAcitivty->Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her"); - SocketManager.loginCallback2 = new LoginCallback() { + SocketManager.loginCallback2 = new Callback() { @Override public void doCallback() { - spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveRequestListener(new OnRequestSuccessCallback() { + spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveContactsRequestListener(new OnRequestSuccessCallback() { @Override public void doCallback() { BeWoLog.writeToLogFile("LoginCallback mit Abruf der neuesten Nachrichten und den Kontakten wird aufgerufen. (updateContactlist)"); @@ -245,18 +267,22 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi final JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); if(ConnectivityReceiver.isConnected()) { - BeWoLog.writeToLogFile("LoginCallback ist mit dem Internet verbunden. (updateContactlist)"); + BeWoLog.writeToLogFile("LoginCallback ist mit dem Internet verbunden. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(✓))"); + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { BeWoLog.writeToLogFile("LoginCallback "); spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + } else { + BeWoLog.writeToLogFile("LoginCallback ist mit dem Internet verbunden. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(✓) -> IntervallCheck(x)"); } } else { - BeWoLog.writeToLogFile("LoginCallback ist nicht mit dem Internet verbunden. (updateContactlist)"); -// SocketManager.shutDownConnectionToServer("KontaktChatActivity->"); - SocketManager.loginCallbackAfterConnectionLost = new LoginCallback() { + //TODO: Das ist irgendwie sinnlos, wenn keine Verbindung zum Internet besteht... + BeWoLog.writeToLogFile("LoginCallback ist nicht mit dem Internet verbunden. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(x))"); + + SocketManager.loginCallbackAfterConnectionLost = new Callback() { @Override public void doCallback() { - BeWoLog.writeToLogFile("loginCallbackAfterConnectionLost im normalen LoginCallback aufgerufen, weil offline. (updateContactlist)"); + BeWoLog.writeToLogFile("loginCallbackAfterConnectionLost im normalen LoginCallback aufgerufen, weil offline. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(x))"); spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); } }; @@ -387,10 +413,17 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi runOnUiThread(new Runnable() { @Override public void run() { - KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); + KontaktAdapter ka = ((KontaktAdapter) listView.getAdapter()); + + int onlineEntitiesCount = SocketManager.onlineEntities.size(); + int onlinePersonOidsCount = SocketManager.onlinePersonOids.size(); + + Log.i(LOGTAG, "onlineEntities: " + onlineEntitiesCount + "; onlinePersonOids: " + onlinePersonOidsCount); for(ContactListItem item : ka.values) { - item.isOnline = SocketManager.onlinePersonOids.contains(item.getPersonOid()); + if(!item.isTeam) { + item.isOnline = SocketManager.onlinePersonOids.contains(item.getPersonOid()); + } } ka.notifyDataSetChanged(); @@ -599,11 +632,11 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi } } - private final class JsonSoapPrimitiveRequestListener implements RequestListener { + private final class JsonSoapPrimitiveContactsRequestListener implements RequestListener { OnRequestSuccessCallback callback; - JsonSoapPrimitiveRequestListener(OnRequestSuccessCallback callback) { + JsonSoapPrimitiveContactsRequestListener(OnRequestSuccessCallback callback) { this.callback = callback; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java index 0234bf04a..a9672d017 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java @@ -48,7 +48,7 @@ import soapConnection.ApplicationUser; import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; -import tcpConnection.LoginCallback; +import tcpConnection.Callback; import tcpConnection.SocketManager; import util.BeWoLog; import util.SecurityUtils; @@ -76,7 +76,7 @@ public class LoginActivity extends ActionBarActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); - SocketManager.connectionFailureCallback = new LoginCallback() { + SocketManager.connectionFailureCallback = new Callback() { @Override public void doCallback() { runOnUiThread(new Runnable() { @@ -89,7 +89,7 @@ public class LoginActivity extends ActionBarActivity { } }; - SocketManager.sendFailureCallback = new LoginCallback() { + SocketManager.sendFailureCallback = new Callback() { @Override public void doCallback() { runOnUiThread(new Runnable() { @@ -262,13 +262,13 @@ public class LoginActivity extends ActionBarActivity { // return; // } - ArrayList propertyInfos = new ArrayList<>(); - propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", tenant, String.class)); - propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", username, String.class)); - propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", password, String.class)); + ArrayList propertyInfos = new ArrayList<>(); + propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", tenant, String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", username, String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", password, String.class)); - JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); - spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); + JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); // } // }, new Response.ErrorListener() { // @Override @@ -384,7 +384,7 @@ public class LoginActivity extends ActionBarActivity { SocketManager.tenant = mTenantView.getText().toString(); - SocketManager.initialLoginCallback = new LoginCallback() { + SocketManager.initialLoginCallback = new Callback() { @Override public void doCallback() { Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Ist verbunden und ruft die ChatActivity nun auf."); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java index a68e76179..ce26010f2 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java @@ -50,7 +50,7 @@ public class MessageAdapter extends ArrayAdapter { holder.msg.setText(chatMessage.ChatText); - if(holder.pending_msg_image != null && chatMessage.ServerseitigeOid != 0) { + if(holder.pending_msg_image != null && chatMessage.IsDelivered) { holder.pending_msg_image.setVisibility(View.INVISIBLE); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java index 216e20371..20b5ea663 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java @@ -1,6 +1,5 @@ package beyondsoft.bewomitarbeiterapp; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; @@ -49,8 +48,9 @@ public class WebdokuActivity extends ActionBarActivity { case R.id.action_Logout: SocketManager.logout(); - finish(); - System.exit(0); + Intent intent = new Intent(WebdokuActivity.this, LoginActivity.class); + WebdokuActivity.this.startActivity(intent); + return true; default: return super.onOptionsItemSelected(item); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java index 63e5958d8..78df293e9 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java @@ -3,6 +3,7 @@ package entities; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import java.util.Objects; /** * Created by JettenM on 26.07.2016. @@ -47,6 +48,63 @@ public class ChatMessage implements Comparable { return dateFormat.format(InsTs); } + @Override + public boolean equals(Object other) { + if(other == null || !(other instanceof ChatMessage)) { + return false; + } + + if(other == this) { + return true; + } + + ChatMessage om = (ChatMessage) other; + + boolean chatTextsAreEqual = false; + if(this.ChatText != null) { + chatTextsAreEqual = this.ChatText.equals(om.ChatText); + } else { + chatTextsAreEqual = om.ChatText == null; + } + + boolean messageIdsAreEqual = false; + if(this.MessageId != null) { + messageIdsAreEqual = this.MessageId.equals(om.MessageId); + } else { + messageIdsAreEqual = om.MessageId == null; + } + + boolean insTsAreEqual = false; + if(this.InsTs != null) { + insTsAreEqual = InsTs.equals(om.InsTs); + } else { + insTsAreEqual = om.InsTs == null; + } + + boolean sendDatesAreEqual = false; + if(this.SendDate != null) { + sendDatesAreEqual = SendDate.equals(om.SendDate); + } else { + sendDatesAreEqual = om.SendDate == null; + } + + boolean a = this.Id == om.Id; + boolean b = this.SenderPersonOid == om.SenderPersonOid; + boolean c = this.RecipientPersonOid == om.RecipientPersonOid; + boolean d = insTsAreEqual; + boolean e = chatTextsAreEqual; + boolean f = this.IsDelivered == om.IsDelivered; + boolean g = this.ServerseitigeOid == om.ServerseitigeOid; + boolean h = this.IsTeam == om.IsTeam; + boolean i = messageIdsAreEqual; + boolean j = sendDatesAreEqual; + + boolean areEqual = this.Id == om.Id && this.SenderPersonOid == om.SenderPersonOid && this.RecipientPersonOid == om.RecipientPersonOid && this.InsTs == om.InsTs && chatTextsAreEqual && + this.IsDelivered == om.IsDelivered && this.ServerseitigeOid == om.ServerseitigeOid && this.IsTeam == om.IsTeam && messageIdsAreEqual && this.SendDate == om.SendDate; + + return areEqual; + } + @Override public int compareTo(ChatMessage cm) { if(InsTs == null || cm.InsTs == null) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java index 250eda146..6701c41d6 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java @@ -50,7 +50,7 @@ public class Packet { // die ersten fünf ";" ignorieren // SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;ServerseitigeOid;ClientseitigeOid;Tenant;IsEmployee;MessageId;[ClientName][ChatMessage][MessageTimeStamp][IsDelivered] - //23;281;20;389;1;38;932;[Tenant];1; 10 Semikola + //23;281;20;389;1;38;932;[Tenant];1; 9 Semikola public Packet(String message) { Log.i("PACKET_CONSTRUCTOR_MSG", message); @@ -86,7 +86,7 @@ public class Packet { ChatMessage = actualMessage.substring(chatNameLength, chatMessageLength + chatNameLength); - String dateString = actualMessage.substring(chatMessageLength + chatNameLength, actualMessage.length() - 1); + String dateString = actualMessage.substring(chatMessageLength + chatNameLength, chatMessageLength + chatNameLength + 19); DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMAN); @@ -123,20 +123,92 @@ public class Packet { Log.i("PACKET_LOG", prefix + ": SenderPersonOid: " + SenderPersonOid + "\nRecipientPersonOid: " + RecipientPersonOid + "\nChatDataIdentifier: " + ChatDataIdentifier.name() + "\nChatName: " + ChatName + "\nChatMessage: " + ChatMessage + "\nTenant: " + Tenant + "\nIsDelivered: " + IsDelivered + "\nMessageTimeStamp: " + MessageTimeStamp + "\nServerseitigeOid: " + ServerseitigeOid + "\nClientseitigeOid: " + ClientseitigeOid + "\nIsEmployee: " + IsEmployee + "\nMessageId: " + MessageId); } - @Override public String toString() { return "SenderPersonOid: " + SenderPersonOid + - "\nRecipientPersonOid: " + RecipientPersonOid + - "\nChatDataIdentifier: " + ChatDataIdentifier.name() + - "\nChatName: " + ChatName + - "\nChatMessage: " + ChatMessage + - "\nTenant: " + Tenant + - "\nIsDelivered: " + IsDelivered + - "\nMessageTimeStamp: " + MessageTimeStamp + - "\nServerseitigeOid: " + ServerseitigeOid + - "\nClientseitigeOid: " + ClientseitigeOid + - "\nIsEmployee: " + IsEmployee + - "\nMessageId: " + MessageId; + "\n\tRecipientPersonOid: " + RecipientPersonOid + + "\n\tChatDataIdentifier: " + ChatDataIdentifier.name() + + "\n\tChatName: " + ChatName + + "\n\tChatMessage: " + ChatMessage + + "\n\tTenant: " + Tenant + + "\n\tIsDelivered: " + IsDelivered + + "\n\tMessageTimeStamp: " + MessageTimeStamp + + "\n\tServerseitigeOid: " + ServerseitigeOid + + "\n\tClientseitigeOid: " + ClientseitigeOid + + "\n\tIsEmployee: " + IsEmployee + + "\n\tMessageId: " + MessageId; + } + + public static int analyzingPackets(String packetString) { + int packetCount = 0; + + + String[] gesplittet = packetString.split(";"); + + Log.i("PACKET_ANALYZER", "Anzahl Semikola: " + (gesplittet.length - 1)); + Log.i("PACKET_ANALYZER", "Zu analysierender String: " + packetString); + + //z.B. Header: 11;3;15;17;0;2657;43;demoapp4;1;5a50002f-464b-4763-91e2-d261463477e0; + + // 11;3;15;17;0;2657;43;demoapp4;1;5a50002f-464b-4763-91e2-d261463477e0;Elliot Aldersonnoch eine antwort03.11.2016 14:14:150 + // 11;3;15;17;0;2657;43;demoapp4;1;5a50002f-464b-4763-91e2-d261463477e0;Elliot Alderson --> 84 Zeichen + // noch eine antwort --> 17 Zeichen + // 03.11.2016 14:14:150 --> 20 Zeichen --> 84 + 17 + 20 = 121 + + int senderPersonOidLength = gesplittet[0].length(); // 2 + int recipientPersonOidLength = gesplittet[1].length(); // 1 + int chatNameLength = gesplittet[2].length(); // 2 + int chatMessageLength = gesplittet[3].length(); // 2 + int chatIdentifierLength = gesplittet[4].length(); // 1 + int serverseitigeOidLength = gesplittet[5].length(); // 4 + int clientseitigeOidLength = gesplittet[6].length(); // 2 + int tenantLength = gesplittet[7].length(); // 8 + int isEmployeeLength = gesplittet[8].length(); // 1 + int messageIdLength = gesplittet[9].length(); // 36 + + int headerLength = gesplittet.length - 1 + + senderPersonOidLength + + recipientPersonOidLength + + chatNameLength + + chatMessageLength + + chatIdentifierLength + + serverseitigeOidLength + + clientseitigeOidLength + + tenantLength + + isEmployeeLength + + messageIdLength + + Integer.parseInt(gesplittet[2]); + + Log.i("PACKET_ANALYZER", "Testausgabe: " + packetString.substring(0, headerLength)); + + /* + SenderPersonOid = Integer.parseInt(senderPersonOidString); + RecipientPersonOid = Integer.parseInt(recipientPersonOidString); + ServerseitigeOid = Integer.parseInt(serverseitigeOidString); + ClientseitigeOid = Integer.parseInt(clientseitigeOidString); + IsEmployee = Integer.parseInt(isEmployeeString) == 1; + + + + Logout von Elliot Alderson: + + SenderPersonOid RecipientPersonOid ChatNameLength ChatMessageLength ChatIdentifier ServerseitigeOid ClientseitigeOid Tenant IsEmployee MessageId ChatName TimeStamp IsDelivered + 11; 0; 15; 0; 5; 0; 0; ; 1; ; Elliot Alderson 03.11.2016 15:00:05 0 + + + + */ + + int actualChatNameLength = Integer.parseInt(gesplittet[2]); // 15 bei Elliot Alderson + + int actualChatMessageLength = Integer.parseInt(gesplittet[3]); + // + 20 -> 19 für den Timestamp und 1 für IsDelivered + int firstMessageLength = headerLength + actualChatMessageLength + 20; + + Log.i("PACKET_ANALYZER", "Header-Length: " + headerLength); + Log.i("PACKET_ANALYZER", "Länge der ersten Nachricht: " + firstMessageLength); + Log.i("PACKET_ANALYZER", "Erste Nachricht: " + packetString.substring(0, firstMessageLength)); + + return packetCount; } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java index d987f06b3..3ce0d67bf 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java @@ -19,7 +19,7 @@ public class SoapCalls { public static String TOKEN_CHECK_URL = "https://" + DESTINATION_ADDRESS + "/mobil/main/checktoken?token="; - public static String WEB_DOKU_URL = "https://" + DESTINATION_ADDRESS + "/mobil/login/demo"; + public static String WEB_DOKU_URL = "https://app1.bewoplaner.de/mobil/login/1234567890"; public static String WSDL_TARGET_NAME = "bliblablubb.org/"; public static String SOAP_ADDRESS = "https://" + DESTINATION_ADDRESS + "/BeWoPlanerAndroid/AndroidSoapService.asmx"; diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/Callback.java similarity index 74% rename from Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java rename to Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/Callback.java index 00a0c00c8..e16d94ea1 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/Callback.java @@ -4,6 +4,6 @@ package tcpConnection; /** * Created by JettenM on 08.09.2016. */ -public interface LoginCallback { +public interface Callback { void doCallback(); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java index b5f7ccdab..637e4e767 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java @@ -1,7 +1,6 @@ package tcpConnection; import android.util.Log; -import android.widget.Toast; import java.io.DataOutputStream; import java.io.IOException; @@ -44,29 +43,24 @@ public class SocketManager { private static Thread listenerThread; private static SocketListener socketListener; public static UIHandler uiHandler; - public static LoginCallback loginCallback; - public static LoginCallback initialLoginCallback; - public static LoginCallback connectionFailureCallback; - public static LoginCallback loginCallbackAfterConnectionLost; - public static LoginCallback sendFailureCallback; + public static Callback loginCallback; + public static Callback initialLoginCallback; + public static Callback connectionFailureCallback; + public static Callback loginCallbackAfterConnectionLost; + public static Callback sendFailureCallback; private static DataOutputStream dataOutputStream; public static ArrayList onlinePersonOids = new ArrayList<>(); public static ArrayList onlineEntities = new ArrayList<>(); public static HashMap notificationEntities = new HashMap<>(); - public static LoginCallback loginCallback2; - public static LoginCallback socketConnectionFailedCallback; + public static Callback loginCallback2; + private static Callback socketConnectionFailedCallback; public static void connectToServer(String herkunft){ BeWoLog.writeToLogFile("connectToServer wird aufgerufen von " + herkunft); new Thread(new ConnectionOpener()).start(); } - public static void shutDownConnectionToServer(String herkunft){ - BeWoLog.writeToLogFile("Aufruf von " + herkunft + ". (shutDownConnectionToServer)"); - new Thread(new ConnectionCloser()).start(); - } - public static void sendMessage(Packet packet) { new Thread(new MessageSender(packet.getDataStream())).start(); } @@ -177,7 +171,7 @@ public class SocketManager { } } - public static void loginOnServer() { + private static void loginOnServer() { if(socket != null && socket.isConnected()) { try { Packet packet = new Packet(); @@ -197,29 +191,6 @@ public class SocketManager { } } - public static class ConnectionCloser implements Runnable{ - public void run(){ - try { - BeWoLog.writeToLogFile("Schließe die Verbindung zum TCP-Server. (ConnectionCloser)"); - - if (dataOutputStream != null) { - dataOutputStream.flush(); - dataOutputStream.close(); - } else { - BeWoLog.writeToLogFile("dataOutputStream ist null. (ConnectionCloser)"); - } - - if (socket != null) { - socket.close(); - } - - } catch (IOException se) { - BeWoChatApplication.writeExceptionToLog(se); - se.printStackTrace(); - } - } - } - private static class MessageSender implements Runnable { byte[] packetToSend; @@ -238,8 +209,6 @@ public class SocketManager { if ((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { if(socket != null && dataOutputStream != null) { try { - //TODO: mit Versenden der nicht verschickten Nachrichten synchronisieren - dataOutputStream.write(packetToSend); dataOutputStream.flush(); @@ -252,6 +221,7 @@ public class SocketManager { sentMessage.SendDate = Calendar.getInstance().getTime(); int affectedRows = db.updateChatMessage(sentMessage); Log.i("MESSAGE_SENDER", "SendDate wurde erfolgreich aktualisiert: " + (affectedRows == 1)); + BeWoLog.writeToLogFile("SendDate wurde erfolgreich aktualisiert: " + (affectedRows == 1)); } } catch (IOException e) { BeWoChatApplication.writeExceptionToLog(e); @@ -263,12 +233,15 @@ public class SocketManager { DatabaseHandler db = DatabaseHandler.getInstance(BeWoChatApplication.getInstance().getApplicationContext()); ChatMessage undeliveredMessage = db.getChatMessageById(packet.ClientseitigeOid); if(undeliveredMessage != null) { + + Log.i(LOGTAG, "Bisheriger Wert von IsDelivered: " + undeliveredMessage.IsDelivered + (undeliveredMessage.IsDelivered ? "" : ". Diese Aktion war unnötig.")); + undeliveredMessage.IsDelivered = false; int affectedRows = db.updateChatMessage(undeliveredMessage); + BeWoLog.writeToLogFile("Nicht verschickte Nachricht "); } } -// SocketManager.shutDownConnectionToServer("MessageSender->Socket ist nicht erreichbar."); SocketManager.connectToServer("MessageSender beim gescheiterten Versenden einer Nachricht."); } catch (UnsupportedEncodingException e1) { BeWoChatApplication.writeExceptionToLog(e1); @@ -278,7 +251,6 @@ public class SocketManager { e.printStackTrace(); } } else { -// SocketManager.shutDownConnectionToServer("MessageSender->Socket und/oder OutputStream sind null"); SocketManager.connectToServer("MessageSender. Socket und/oder OutputStream sind null"); } } else { @@ -306,7 +278,6 @@ public class SocketManager { try { while (isRunning) { Thread.currentThread().sleep(1000); - Log.i("SOCKET_MANAGER", "Lausche..."); if (socket != null) { if (socket.isConnected()) { @@ -325,6 +296,8 @@ public class SocketManager { stream.read(message, 0, size); try { + Packet.analyzingPackets(new String(message, "UTF-8")); + chatPacket = new Packet(new String(message, "UTF-8")); } catch(Exception e) { BeWoChatApplication.writeExceptionToLog(e); @@ -360,9 +333,11 @@ public class SocketManager { switch (chatPacket.ChatDataIdentifier) { case KEEP_ALIVE: + BeWoLog.writeToLogFile("KeepAlive-Antwort erhalten. (SocketManger)"); + break; case MESSAGE: - BeWoLog.writeToLogFile("Empfange Nacahricht. (SocketManager)"); + BeWoLog.writeToLogFile("Empfange Nacahricht(" + chatPacket.MessageId + "). (SocketManager)"); Log.i(LOGTAG, "Empfange Nacahricht"); databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false, chatPacket.MessageId)); @@ -370,19 +345,21 @@ public class SocketManager { break; case TEAM: - BeWoLog.writeToLogFile("Empfange Team-Nacahricht. (SocketManager)"); + BeWoLog.writeToLogFile("Empfange Team-Nacahricht(" + chatPacket.MessageId + "). (SocketManager)"); databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, true, chatPacket.MessageId)); break; case MESSAGE_RESPONSE: - BeWoLog.writeToLogFile("Empfange Zustellbestätigung. (SocketManager)"); + BeWoLog.writeToLogFile("Empfange Response für Message: " + chatPacket.MessageId + "; (SocketManager)"); ChatMessage cm = databaseHandler.getChatMessageById(chatPacket.ClientseitigeOid); - cm.ServerseitigeOid = chatPacket.ServerseitigeOid; + cm.MessageId = chatPacket.MessageId; cm.IsDelivered = true; - databaseHandler.updateChatMessage(cm); + int affectedRows = databaseHandler.updateChatMessage(cm); + BeWoLog.writeToLogFile("Durch das Aktualisieren der ChatMessage bei Response betroffene Datensätze: " + affectedRows + ". (SocketManager -> MESSAGE_RESPONSE)"); + break; case STATUS_NOTIFICATION_LOGIN: BeWoLog.writeToLogFile("Benutzer " + chatPacket.ChatName + " ist jetzt online. (SocketManager)"); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java index 81f392493..d1aadb83b 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java @@ -31,7 +31,7 @@ public class BeWoLog { File root = android.os.Environment.getExternalStorageDirectory(); - File dir = new File(root.getAbsolutePath() + "/BeWo"); + File dir = new File(root.getAbsolutePath() + "/" + Util.LOGFILEDIRECTORYNAME); dir.mkdirs(); File file = new File(dir, Util.LOGFILENAME); @@ -48,4 +48,16 @@ public class BeWoLog { ioException.printStackTrace(); } } + + public static Boolean deleteLogFile() { + if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + Log.e("BEWOLOG", "Kein externes Speichermedium vorhanden."); + return false; + } + + File root = android.os.Environment.getExternalStorageDirectory(); + File logFile = new File(root.getAbsolutePath() + "/" + Util.LOGFILEDIRECTORYNAME + "/" + Util.LOGFILENAME); + + return logFile.delete(); + } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java index de177ec29..818772d16 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java @@ -12,9 +12,6 @@ import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.util.Log; -import com.octo.android.robospice.SpiceManager; -import com.octo.android.robospice.UncachedSpiceService; - import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -23,16 +20,13 @@ import java.util.Map; import java.util.Random; import Database.DatabaseHandler; +import beyondsoft.bewomitarbeiterapp.BeWoChatApplication; import beyondsoft.bewomitarbeiterapp.ChatActivity; +import beyondsoft.bewomitarbeiterapp.ContactListItem; import beyondsoft.bewomitarbeiterapp.KontaktChatActivity; import beyondsoft.bewomitarbeiterapp.R; import entities.ChatEntity; -import entities.ChatMessage; import entities.NotificationLog; -import soapConnection.DataIdentifier; -import soapConnection.Packet; -import soapConnection.SoapConnectionManager; -import tcpConnection.LoginCallback; import tcpConnection.SocketManager; /** @@ -48,15 +42,23 @@ public class Util { public static final String PREFS_USERNAME_KEY = "username"; public static final String PREFS_PASSWORD = "password"; - public static final String NOTIFICATION_CANCELLED = "notification_cancelled"; + public static final String PREFS_FIRST_RUN_KEY = "firstRunKey"; - public static int conversationsCount = 0; + static final String NOTIFICATION_CANCELLED = "notification_cancelled"; - public static HashMap entity2MessagesCountRel = new HashMap<>(); + static String LOGFILENAME = "BeWoLog.txt"; + static String LOGFILEDIRECTORYNAME = "BeWo"; + + static int conversationsCount = 0; + + private static HashMap entity2MessagesCountRel = new HashMap<>(); //TODO: Notifications zählen. Bei Nachrichten verschiedener Unterhaltungen nur noch eine kleine Notification anzeigen mit "Sie haben x Nachrichten in y Unterhaltungen public static void SetNotify(String username, String message, int recipientOid, boolean isTeam, String teamMemberOids, String teamMemberNames, boolean isEmployee, Context packageContext) { - int unreadMessagesCount = entity2MessagesCountRel.size() + 1; + ChatEntity chatEntity = new ChatEntity(recipientOid, isTeam, isEmployee); + updateMessagesCount(chatEntity, 1); + + int unreadMessagesCount = entity2MessagesCountRel.get(chatEntity); if(SocketManager.notificationEntities.keySet().size() >= 1) { conversationsCount = SocketManager.notificationEntities.keySet().size(); @@ -100,13 +102,6 @@ public class Util { Random random = new Random(); int notificationId = 1; - ChatEntity chatEntity = new ChatEntity(recipientOid, isTeam, isEmployee); - - - - // TODO: in entity2MessagesCountRels einfügen und Anzahl der Nachrichten aktualisieren - updateMessagesCount(chatEntity, 1); - NotificationLog notificationLog = new NotificationLog(notificationId, Calendar.getInstance().getTime()); @@ -135,7 +130,7 @@ public class Util { mNotifyMgr.notify(notificationId, mBuilder.build()); } - protected static PendingIntent getDeletedIntent(Context context, int recipientOid, boolean isTeam) { + private static PendingIntent getDeletedIntent(Context context, int recipientOid, boolean isTeam) { Intent intent = new Intent(context, NotificationBroadcastReceiver.class); intent.setAction(Util.NOTIFICATION_CANCELLED); @@ -174,13 +169,21 @@ public class Util { } private static void updateMessagesCount(ChatEntity entity, int value2add) { + ContactListItem cli = DatabaseHandler.getInstance(BeWoChatApplication.getInstance()).getContactByPersonOid(Long.valueOf(entity.getOid()).intValue(), entity.getIsTeam()); + BeWoLog.writeToLogFile("Aktualisiere die Anzahl der ungelesenen Nachrichten von " + cli.getChatName() + " (updateMessagesCount)"); + int newValue = value2add; if(entity2MessagesCountRel.containsKey(entity)) { + BeWoLog.writeToLogFile("Der Chatpartner ist in der Liste der ungelesenen Nachrichten vorhanden. (updateMessagesCount)"); newValue = entity2MessagesCountRel.get(entity) + value2add; + BeWoLog.writeToLogFile("Alter Wert: " + entity2MessagesCountRel.get(entity) + ". Wert, der addiert wird: " + value2add + ". Neuer Wert: " + newValue + " (updateMessagesCount)"); + } else { + BeWoLog.writeToLogFile("Der Chatpartner ist nicht in der Liste der ungelesenen Nachrichten vorhanden. (updateMessagesCount)"); } entity2MessagesCountRel.put(entity, newValue); + BeWoLog.writeToLogFile("Jetzt in der Liste: " + entity2MessagesCountRel.get(entity) + ". (updateMessagesCount)"); } public static void removeMessagesCount(ChatEntity entity) { @@ -209,6 +212,4 @@ public class Util { public static boolean contains(final Integer[] array, final int key) { return Arrays.asList(array).contains(key); } - - public static String LOGFILENAME = "BeWoLog.txt"; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable-xxhdpi-v11/statusteam.png b/Android/BewoMitarbeiterApp/app/src/main/res/drawable-xxhdpi-v11/statusteam.png new file mode 100644 index 0000000000000000000000000000000000000000..ac09b4f8e119991cf821b56d40ae636d0d8ffbb1 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^jv&mz1|<8wpL7LMY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPNmxzF<`oTjpU4TNenIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P+Z;9#WAGf*4u-Oyg=Te1>gO1`OFspnJ8d~xsxjcqy5I1 PSdg%%tDnm{r-UW|c!Vyk literal 0 HcmV?d00001 diff --git a/BeWoChatServer/Server.cs b/BeWoChatServer/Server.cs index 98d16cbc4..6c4e3aba1 100644 --- a/BeWoChatServer/Server.cs +++ b/BeWoChatServer/Server.cs @@ -147,6 +147,21 @@ namespace BeWoChatServer switch(dataPacket.DataIdentifier) { case DataIdentifier.KeepAlive: + //spiele Ping-Pong + + var keepAlivePacket = new Packet( + dataPacket.Socket, + dataPacket.ClientName, + dataPacket.SenderPersonOid, + 0, + dataPacket.IsEmployee) + { + DataIdentifier = DataIdentifier.KeepAlive, + Tenant = dataPacket.Tenant + }; + + dataPacket.Socket.Send(keepAlivePacket.GetDataStream()); + break; case DataIdentifier.Login: @@ -332,7 +347,11 @@ namespace BeWoChatServer Console.WriteLine("Konnte den Client nicht aus der Liste entfernen."); } - var notificationPacketLogout = new Packet(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, 0, dataPacket.IsEmployee) {DataIdentifier = DataIdentifier.StatusNotificationLogout}; + var notificationPacketLogout = new Packet(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, 0, dataPacket.IsEmployee) + { + DataIdentifier = DataIdentifier.StatusNotificationLogout, + Tenant = dataPacket.Tenant + }; Console.WriteLine(DateTime.Now + ": Sende Logout von " + dataPacket.ClientName + " an alle anderen Clients"); foreach (var client in clientList.Where(w => !w.Value.PersonOid.Equals(dataPacket.SenderPersonOid))) @@ -459,7 +478,7 @@ namespace BeWoChatServer var sender = dataPacket.Socket; - var notificationPacketLogout = new Packet(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, 0, dataPacket.IsEmployee) { DataIdentifier = DataIdentifier.StatusNotificationLogout }; + var notificationPacketLogout = new Packet(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, 0, dataPacket.IsEmployee) { DataIdentifier = DataIdentifier.StatusNotificationLogout, Tenant = dataPacket.Tenant}; try { diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs index 4c603b1de..04e11b93a 100644 --- a/Data/Access/SearchDAO.cs +++ b/Data/Access/SearchDAO.cs @@ -1676,7 +1676,7 @@ namespace BeWo.Data.Access public IEnumerable FindNewestChatMessages(long pRecipientPersonOid) { var query2 = Session.CreateSQLQuery(string.Format("SELECT MAX({0}) FROM chatmessages WHERE ({1} = {2} OR {3} = {2}) AND {4} IS NULL OR {4} IS NOT NULL AND {1} IN (SELECT t.{0} FROM Team t JOIN employee2team e ON e.{4} = t.{0}) GROUP BY {1}, {3}", - BeWoEntityBase.PropertyName_Oid, ChatMessage.PropertyName_EmpfaengerPersonOid, pRecipientPersonOid, ChatMessage.PropertyName_SenderPersonOid, "TeamOid")); + BeWoEntityBase.PropertyName_Oid, ChatMessage.PropertyName_EmpfaengerPersonOid, pRecipientPersonOid, ChatMessage.PropertyName_SenderPersonOid, "TeamOid", BeWoEntityBase.PropertyName_InsTs)); var result = query2.List();