diff --git a/Android/BewoKlientenApp/.idea/.name b/Android/BewoKlientenApp/.idea/.name deleted file mode 100644 index 15e5cf632..000000000 --- a/Android/BewoKlientenApp/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -BewoKlientenApp \ No newline at end of file diff --git a/Android/BewoKlientenApp/.idea/gradle.xml b/Android/BewoKlientenApp/.idea/gradle.xml index 508b3d9b8..fe72da507 100644 --- a/Android/BewoKlientenApp/.idea/gradle.xml +++ b/Android/BewoKlientenApp/.idea/gradle.xml @@ -3,20 +3,16 @@ diff --git a/Android/BewoKlientenApp/.idea/misc.xml b/Android/BewoKlientenApp/.idea/misc.xml index e45faed76..1d9d62604 100644 --- a/Android/BewoKlientenApp/.idea/misc.xml +++ b/Android/BewoKlientenApp/.idea/misc.xml @@ -10,7 +10,7 @@ - + diff --git a/Android/BewoKlientenApp/app/app.iml b/Android/BewoKlientenApp/app/app.iml index c68bbd13b..055cf1a62 100644 --- a/Android/BewoKlientenApp/app/app.iml +++ b/Android/BewoKlientenApp/app/app.iml @@ -32,12 +32,14 @@ + + @@ -64,14 +66,6 @@ - - - - - - - - @@ -80,6 +74,14 @@ + + + + + + + + @@ -92,6 +94,7 @@ + diff --git a/Android/BewoKlientenApp/build.gradle b/Android/BewoKlientenApp/build.gradle index cf01e0df4..b8858c3f1 100644 --- a/Android/BewoKlientenApp/build.gradle +++ b/Android/BewoKlientenApp/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.2' + classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/Android/BewoKlientenApp/gradle/wrapper/gradle-wrapper.properties b/Android/BewoKlientenApp/gradle/wrapper/gradle-wrapper.properties index e50b62da3..81ed20c8e 100644 --- a/Android/BewoKlientenApp/gradle/wrapper/gradle-wrapper.properties +++ b/Android/BewoKlientenApp/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon May 09 08:53:20 CEST 2016 +#Fri Oct 07 15:42:19 CEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/Android/BewoMitarbeiterApp/app/app.iml b/Android/BewoMitarbeiterApp/app/app.iml index b3e5de63c..5c1f8f22c 100644 --- a/Android/BewoMitarbeiterApp/app/app.iml +++ b/Android/BewoMitarbeiterApp/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,11 +74,21 @@ + + + + + + + + + + @@ -97,6 +99,8 @@ + + @@ -109,8 +113,10 @@ + + diff --git a/Android/BewoMitarbeiterApp/app/build.gradle b/Android/BewoMitarbeiterApp/app/build.gradle index 3f2bc31d5..c30208740 100644 --- a/Android/BewoMitarbeiterApp/app/build.gradle +++ b/Android/BewoMitarbeiterApp/app/build.gradle @@ -4,8 +4,13 @@ android { compileSdkVersion 21 buildToolsVersion '23.0.3' + dexOptions { + maxProcessCount 2 + javaMaxHeapSize "2g" + } defaultConfig { applicationId "beyondsoft.bewomitarbeiterapp" + multiDexEnabled true minSdkVersion 18 targetSdkVersion 21 versionCode 1 diff --git a/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml b/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml index c9a4c68fc..ba643d480 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml @@ -4,6 +4,8 @@ + + + > diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java index eb4dd7e7d..5166a061c 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java @@ -18,6 +18,7 @@ import java.util.Locale; import beyondsoft.bewomitarbeiterapp.ContactListItem; import entities.ChatMessage; import soapConnection.SoapConnectionManager; +import util.BeWoLog; /** * Created by bib on 07.06.2016. @@ -27,7 +28,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { private static final String LOGTAG = "DATABASE_HANDLER"; //DataBase version - private static final int DATABASE_VERSION = 1; + private static final int DATABASE_VERSION = 8; //Database name private static final String DATABASE_NAME = "Contacts_Manager"; @@ -74,6 +75,21 @@ public class DatabaseHandler extends SQLiteOpenHelper { private static final String KEY_IS_DELIVERED_CHATMESSAGE = "isdelivered"; private static final String KEY_SERVERSEITIGE_OID_CHATMESSAGE = "serverseitigeoid"; private static final String KEY_IS_TEAM_CHATMESSAGE = "isteam"; + private static final String KEY_MESSAGE_ID_CHATMESSAGE = "messageid"; + private static final String KEY_SENDDATE_CHATMESSAGE = "senddate"; + + private static final String[] CHAT_MESSAGE_COLUMNS = new String[] { + KEY_ID_CHATMESSAGE, + KEY_SENDER_PERSON_OID_CHATMESSAGE, + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, + KEY_INSTS_CHATMESSAGE, + KEY_CHAT_TEXT_CHATMESSAGE, + KEY_IS_DELIVERED_CHATMESSAGE, + KEY_SERVERSEITIGE_OID_CHATMESSAGE, + KEY_IS_TEAM_CHATMESSAGE, + KEY_MESSAGE_ID_CHATMESSAGE, + KEY_SENDDATE_CHATMESSAGE + }; private static DatabaseHandler mInstance = null; @@ -126,7 +142,9 @@ public class DatabaseHandler extends SQLiteOpenHelper { KEY_CHAT_TEXT_CHATMESSAGE + " TEXT," + KEY_IS_DELIVERED_CHATMESSAGE + " INTEGER," + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " INTEGER DEFAULT NULL," + - KEY_IS_TEAM_CHATMESSAGE + " INTEGER DEFAULT 0)"; + KEY_IS_TEAM_CHATMESSAGE + " INTEGER DEFAULT 0," + + KEY_MESSAGE_ID_CHATMESSAGE + " TEXT," + + KEY_SENDDATE_CHATMESSAGE + " DATETIME DEFAULT NULL)"; db.execSQL(createChatMessageTable); @@ -168,23 +186,11 @@ public class DatabaseHandler extends SQLiteOpenHelper { public void addChatMessages(ArrayList messages) { SQLiteDatabase db = this.getWritableDatabase(); - ContentValues values = new ContentValues(); - try { db.beginTransaction(); for(ChatMessage message : messages) { - values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); - values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); - values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); - values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); - values.put(KEY_IS_DELIVERED_CHATMESSAGE, message.IsDelivered ? 1 : 0); - values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); - values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam ? 1 : 0); - - db.insertOrThrow(TABLE_CHATMESSAGE, null, values); - - values.clear(); + db.insertOrThrow(TABLE_CHATMESSAGE, null, fillValuesForChatMessage(message)); } db.setTransactionSuccessful(); @@ -211,37 +217,30 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_IS_DELIVERED_CHATMESSAGE, message.IsDelivered ? 1 : 0); values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam ? 1 : 0); + values.put(KEY_MESSAGE_ID_CHATMESSAGE, message.MessageId); + values.put(KEY_SENDDATE_CHATMESSAGE, (message.SendDate == null ? null : getDateTimeString(message.SendDate))); return values; } public int updateChatMessage(ChatMessage message) { SQLiteDatabase writableDatabase = this.getWritableDatabase(); - ContentValues values = new ContentValues(); - values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); - values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); - values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); - values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); - values.put(KEY_IS_DELIVERED_CHATMESSAGE, message.IsDelivered ? 1 : 0); - values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); - values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam ? 1 : 0); - - return writableDatabase.update(TABLE_CHATMESSAGE, values, KEY_ID_CHATMESSAGE + " = ?", new String[] { String.valueOf(message.Id)}); + return writableDatabase.update(TABLE_CHATMESSAGE, fillValuesForChatMessage(message), KEY_ID_CHATMESSAGE + " = ?", new String[] { String.valueOf(message.Id)}); } - public ArrayList getExistingChatMessageIds() { - ArrayList result = new ArrayList(); + public ArrayList getExistingChatMessageUUIDs() { + ArrayList result = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); - String selectQuery = "SELECT "+ KEY_SERVERSEITIGE_OID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " <> 0"; + String selectQuery = "SELECT "+ KEY_MESSAGE_ID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_MESSAGE_ID_CHATMESSAGE + " IS NOT NULL"; Cursor cursor = db.rawQuery(selectQuery, null); if(cursor.moveToFirst()) { do { - result.add(cursor.getInt(0)); + result.add(cursor.getString(0)); } while(cursor.moveToNext()); } @@ -250,18 +249,18 @@ public class DatabaseHandler extends SQLiteOpenHelper { return result; } - public ArrayList getExistingTeamChatMessageIds() { - ArrayList result = new ArrayList(); + public ArrayList getExistingTeamChatMessageUUIDs() { + ArrayList result = new ArrayList(); SQLiteDatabase db = this.getReadableDatabase(); - String selectQuery = "SELECT " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " <> 0 AND " + KEY_IS_TEAM_CHATMESSAGE + " = 1"; + String selectQuery = "SELECT " + KEY_MESSAGE_ID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_MESSAGE_ID_CHATMESSAGE + " IS NOT NULL AND " + KEY_IS_TEAM_CHATMESSAGE + " = 1"; Cursor cursor = db.rawQuery(selectQuery, null); if(cursor.moveToFirst()) { do { - result.add(cursor.getInt(0)); + result.add(cursor.getString(0)); } while(cursor.moveToNext()); } @@ -317,17 +316,8 @@ public class DatabaseHandler extends SQLiteOpenHelper { Cursor cursor = readableDatabase.query( TABLE_CHATMESSAGE, - new String[] { - KEY_ID_CHATMESSAGE, - KEY_SENDER_PERSON_OID_CHATMESSAGE, - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, - KEY_INSTS_CHATMESSAGE, - KEY_CHAT_TEXT_CHATMESSAGE, - KEY_IS_DELIVERED_CHATMESSAGE, - KEY_SERVERSEITIGE_OID_CHATMESSAGE, - KEY_IS_TEAM_CHATMESSAGE - }, - KEY_ID_CHATMESSAGE + "=?", + CHAT_MESSAGE_COLUMNS, + KEY_ID_CHATMESSAGE + " =? ", new String[]{String.valueOf(id)}, null, null, null, null); @@ -341,10 +331,20 @@ public class DatabaseHandler extends SQLiteOpenHelper { boolean isDelivered = cursor.getInt(5) == 1; int serverseitigeOid = cursor.getInt(6); boolean isTeam = cursor.getInt(7) == 1; + String messageUUID = cursor.getString(8); + + Date sendDate = null; + if(cursor.getString(9) != null) { + sendDate = getDateFromString(cursor.getString(9)); + } cursor.close(); - return new ChatMessage(messageId, senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam); + ChatMessage result = new ChatMessage(messageId, senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam, messageUUID); + + result.SendDate = sendDate; + + return result; } return null; @@ -357,23 +357,14 @@ public class DatabaseHandler extends SQLiteOpenHelper { Cursor cursor = readableDatabase.query( TABLE_CHATMESSAGE, - new String[] { - KEY_ID_CHATMESSAGE, - KEY_SENDER_PERSON_OID_CHATMESSAGE, - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, - KEY_INSTS_CHATMESSAGE, - KEY_CHAT_TEXT_CHATMESSAGE, - KEY_IS_DELIVERED_CHATMESSAGE, - KEY_SERVERSEITIGE_OID_CHATMESSAGE, - KEY_IS_TEAM_CHATMESSAGE - }, - KEY_IS_TEAM_CHATMESSAGE + " = 0 AND " + + 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 + "=?) OR (" + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + - KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?" + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?))" , - new String[] {String.valueOf(SoapConnectionManager.User.getPersonOid()), String.valueOf(recipientOid), String.valueOf(SoapConnectionManager.User.getPersonOid()), String.valueOf(recipientOid)}, + 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()) { @@ -386,9 +377,14 @@ public class DatabaseHandler extends SQLiteOpenHelper { cursor.getString(4), cursor.getInt(5) == 1, cursor.getInt(6), - cursor.getInt(7) == 1 + cursor.getInt(7) == 1, + cursor.getString(8) ); + if(cursor.getString(9) != null) { + message.SendDate = getDateFromString(cursor.getString(9)); + } + messages.add(message); } while(cursor.moveToNext()); } @@ -405,7 +401,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { Cursor cursor = readableDatabase.query( TABLE_CHATMESSAGE, - new String[] {KEY_ID_CHATMESSAGE, KEY_SENDER_PERSON_OID_CHATMESSAGE, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, KEY_INSTS_CHATMESSAGE, KEY_CHAT_TEXT_CHATMESSAGE, KEY_IS_DELIVERED_CHATMESSAGE, KEY_SERVERSEITIGE_OID_CHATMESSAGE, KEY_IS_TEAM_CHATMESSAGE}, + CHAT_MESSAGE_COLUMNS, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_IS_TEAM_CHATMESSAGE + "= 1", new String[] {String.valueOf(teamOid)}, null, null, null, null); @@ -420,9 +416,14 @@ public class DatabaseHandler extends SQLiteOpenHelper { cursor.getString(4), cursor.getInt(5) == 1, cursor.getInt(6), - cursor.getInt(7) == 1 + cursor.getInt(7) == 1, + cursor.getString(8) ); + if(cursor.getString(9) != null) { + message.SendDate = getDateFromString(cursor.getString(9)); + } + messages.add(message); } while(cursor.moveToNext()); } @@ -513,9 +514,14 @@ public class DatabaseHandler extends SQLiteOpenHelper { cursor.getString(4), cursor.getInt(5) == 1, cursor.getInt(6), - cursor.getInt(7) == 1 + cursor.getInt(7) == 1, + cursor.getString(8) ); + if(cursor.getString(9) != null) { + message.SendDate = getDateFromString(cursor.getString(9)); + } + result.add(message); } while(cursor.moveToNext()); @@ -612,46 +618,30 @@ public class DatabaseHandler extends SQLiteOpenHelper { return null; } - public boolean GetIsMessageInDatabase(int pServerseitigeOid) { - + public boolean GetIsMessageInDatabase(String pMessageId) { SQLiteDatabase readableDatabase = this.getReadableDatabase(); Cursor cursor = readableDatabase.query(TABLE_CHATMESSAGE, - new String[] { - KEY_ID_CHATMESSAGE, - KEY_SENDER_PERSON_OID_CHATMESSAGE, - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, - KEY_INSTS_CHATMESSAGE, - KEY_CHAT_TEXT_CHATMESSAGE, - KEY_IS_DELIVERED_CHATMESSAGE, - KEY_SERVERSEITIGE_OID_CHATMESSAGE, - KEY_IS_TEAM_CHATMESSAGE - }, - KEY_SERVERSEITIGE_OID_CHATMESSAGE + " =?", - new String[] {String.valueOf(pServerseitigeOid)}, + CHAT_MESSAGE_COLUMNS, + KEY_MESSAGE_ID_CHATMESSAGE + " =? ", + new String[] {pMessageId}, null, null, null, null); return cursor != null && cursor.moveToFirst(); } public ArrayList getUnsentChatMessages() { + BeWoLog.writeToLogFile("Lade unverschickte Nachrichten aus der Datenbank. (getUnsentMessages)"); + ArrayList messages = new ArrayList<>(); SQLiteDatabase readableDatabase = this.getReadableDatabase(); - Cursor cursor = readableDatabase.query(TABLE_CHATMESSAGE, - new String[] { - KEY_ID_CHATMESSAGE, - KEY_SENDER_PERSON_OID_CHATMESSAGE, - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, - KEY_INSTS_CHATMESSAGE, - KEY_CHAT_TEXT_CHATMESSAGE, - KEY_IS_DELIVERED_CHATMESSAGE, - KEY_SERVERSEITIGE_OID_CHATMESSAGE, - KEY_IS_TEAM_CHATMESSAGE - }, - KEY_IS_DELIVERED_CHATMESSAGE + " =? AND " + KEY_SENDER_PERSON_OID_CHATMESSAGE + " =?", - new String[] {String.valueOf(0), String.valueOf(SoapConnectionManager.User.getPersonOid())}, null, null, null, null); + Cursor cursor = readableDatabase.query( + TABLE_CHATMESSAGE, + CHAT_MESSAGE_COLUMNS, + KEY_IS_DELIVERED_CHATMESSAGE + " =? AND " + KEY_SENDER_PERSON_OID_CHATMESSAGE + " =? ", + new String[] {String.valueOf(0), String.valueOf(SoapConnectionManager.getUser().getPersonOid())}, null, null, null, null); if(cursor.moveToFirst()) { do{ @@ -663,9 +653,16 @@ public class DatabaseHandler extends SQLiteOpenHelper { cursor.getString(4), cursor.getInt(5) == 1, cursor.getInt(6), - cursor.getInt(7) == 1 + cursor.getInt(7) == 1, + 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)); + } + messages.add(message); } while(cursor.moveToNext()); } @@ -674,4 +671,62 @@ public class DatabaseHandler extends SQLiteOpenHelper { return messages; } + + 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(); + + String whereClause = ""; + + for(int i = 0; i < messageIds.size(); i++) { + whereClause = whereClause + KEY_MESSAGE_ID_CHATMESSAGE + " = '" + messageIds.get(i) + "' "; + + if(i != (messageIds.size() - 1)) { + whereClause += " OR "; + } + } + + Cursor cursor = readableDatabase.query(TABLE_CHATMESSAGE, CHAT_MESSAGE_COLUMNS, whereClause, null, null, null, null); + + if(cursor.moveToFirst()) { + do{ + ChatMessage message = new ChatMessage( + cursor.getInt(0), + cursor.getInt(1), + cursor.getInt(2), + getDateFromString(cursor.getString(3)), + cursor.getString(4), + cursor.getInt(5) == 1, + cursor.getInt(6), + cursor.getInt(7) == 1, + cursor.getString(8) + ); + + String blubb = ""; + for(int i = 0; i < cursor.getColumnCount(); i++) { + blubb += "" + i + ". " + cursor.getColumnName(i) + "; "; + } + + BeWoLog.writeToLogFile(blubb); + + if(cursor.getString(9) != null) { + message.SendDate = getDateFromString(cursor.getString(9)); + } + + result.add(message); + } while(cursor.moveToNext()); + } + + return result; + } } 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 7e908ea52..ab451dc28 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java @@ -5,6 +5,9 @@ import android.app.NotificationManager; import android.content.Context; import android.util.Log; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; import com.octo.android.robospice.SpiceManager; import com.octo.android.robospice.UncachedSpiceService; import com.octo.android.robospice.persistence.exception.SpiceException; @@ -13,16 +16,31 @@ import com.octo.android.robospice.request.listener.RequestListener; import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapPrimitive; +import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import Database.DatabaseHandler; +import entities.ChatMessage; +import soapConnection.DataIdentifier; import soapConnection.JsonSoapPrimitiveRequest; +import soapConnection.Packet; import soapConnection.SoapCalls; +import soapConnection.SoapConnectionManager; +import tcpConnection.LoginCallback; +import tcpConnection.SocketManager; +import util.BeWoLog; +import util.ChatMessageDeserializer; import util.ConnectivityReceiver; +import static soapConnection.SoapCalls.CHECK_MESSAGE_IDS; + /** * Created by JettenM on 24.08.2016. */ @@ -49,6 +67,17 @@ public class BeWoChatApplication extends Application { private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + public static Date lastOnlineTS; + + private static int refreshIntervalInMinutes = 6; + public static int getRefreshIntervalInMilliseconds() { + return refreshIntervalInMinutes * 60 * 1000; + } + + public static int getRefreshIntervalInMinutes() { + return refreshIntervalInMinutes; + } + @Override public void onCreate() { super.onCreate(); @@ -65,13 +94,18 @@ public class BeWoChatApplication extends Application { @Override public void run() { JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.KEEP_ALIVE, new ArrayList()); - spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); + + if(ConnectivityReceiver.isConnected()) { + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < getRefreshIntervalInMilliseconds()) { + spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); + } + } Log.i("LOOPER", "Halte Verbindung zum Soap-Server am leben..."); } }; - final ScheduledFuture blubbHandle = scheduler.scheduleAtFixedRate(blubb, 10, 10, TimeUnit.MINUTES); + final ScheduledFuture blubbHandle = scheduler.scheduleAtFixedRate(blubb, refreshIntervalInMinutes, refreshIntervalInMinutes, TimeUnit.MINUTES); scheduler.schedule(new Runnable() { @Override @@ -89,6 +123,16 @@ public class BeWoChatApplication extends Application { ConnectivityReceiver.connectivityReceiverListener = listener; } + public static void writeExceptionToLog(Throwable ex) { + String logText = "Ausnahme: " + ex.toString() + "; Message: " + ex.getMessage() + "; Cause: " + ex.getCause(); + for(StackTraceElement ste : ex.getStackTrace()) { + String steAsString = ste.toString(); + logText += "\t" + steAsString; + } + + BeWoLog.writeToLogFile(logText); + } + public BeWoChatApplication() { defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); @@ -98,6 +142,9 @@ 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); nm.cancelAll(); @@ -113,16 +160,210 @@ public class BeWoChatApplication extends Application { @Override public void onRequestFailure(SpiceException spiceException) { + Log.e("BEWOAPP", "Fehler beim am Leben erhalten!"); + BeWoLog.writeToLogFile("Verbindungserneuerung 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)"); } else { + BeWoChatApplication.lastOnlineTS = Calendar.getInstance().getTime(); + BeWoLog.writeToLogFile("Erneuere die Verbindung. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); Log.i("BEWOAPP", "Die Antwort hat einen Wert"); } } } + + private static class JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener implements RequestListener { + + private final static String LOGTAG = "UUID_CHECK"; + + @Override + public void onRequestFailure(SpiceException spiceException) { + Log.e(LOGTAG, "Die Anfrage an den Server ist gescheitert! (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestFailure)"); + BeWoLog.writeToLogFile("Die Anfrage an den Server ist gescheitert. Kann nicht überprüfen, ob die Nachrichten dem Server bekannt sind! Exception: <<" + spiceException.toString() + ">> (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestFailure)"); + } + + @Override + public void onRequestSuccess(SoapPrimitive soapPrimitive) { + if(soapPrimitive == null) { + Log.e(LOGTAG, "Antwort vom Server ist null!"); + BeWoLog.writeToLogFile("Antwort vom Server ist null. Kann nicht überprüfen, ob die Nachrichten dem Server bekannt sind! (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + return; + } + + BeWoLog.writeToLogFile("Die Anfrage an den Server war mit Erfolg gekrönt. Liste mit dem Server bekannten Nachrichten erhalten. (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + + GsonBuilder builder = new GsonBuilder(); + + Gson gson = builder.create(); + + Type listType = new TypeToken>(){}.getType(); + + final ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); + + if(result != null) { + if(result.size() == 0) { + return; + } + + String blubb = ""; + for(String ms : result) { + blubb += ms; + + if(result.indexOf(ms) != (result.size() - 1)) { + blubb += "\n"; + } + } + BeWoLog.writeToLogFile("Vom Server zurückgelieferte MessageIds: " + blubb); + + DatabaseHandler databaseHandler = DatabaseHandler.getInstance(BeWoChatApplication.getInstance()); + ArrayList messages2send = databaseHandler.getChatMessagesByMessageIds(result); + + BeWoLog.writeToLogFile("Es existieren " + messages2send.size() + " Nachrichten, deren Response verloren gegangen ist. (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + + for(ChatMessage cm : messages2send) { + 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)" + unsentPacket.toString()); + SocketManager.sendMessage(unsentPacket); + + try { + Thread.sleep(75); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } else { + BeWoLog.writeToLogFile("Result ist null. Konversion von Json zu Objekten ist gescheitert. (JsonSoapPrimitveCheckingUndeliveredButSentMessagesListener->onRequestSuccess)"); + } + } + } + + public static void reconnectWithServer(boolean isConnected, final Context context) { + Log.e("UTIL", isConnected ? "Ist mit dem Internet/WLAN verbunden" : "Ist mit keinem Netzwerk verbunden"); + + if(isConnected) { + try { + BeWoLog.writeToLogFile("Setze Socket zurück.(reconnectWithServer)"); +// SocketManager.shutDownConnectionToServer("reconnectWithServer"); + + BeWoLog.writeToLogFile("Setze LoginCallback des Sockets. (reconnectWithServer)"); + SocketManager.loginCallback = new LoginCallback() { + @Override + public void doCallback() { + Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Verschicke nicht verschickte Nachrichten..."); + BeWoLog.writeToLogFile("Verschicke nicht verschickte Nachrichten. (reconnectWithServer)"); + sendUnsentMessages(context); + + sendStatusRequest(); + + // TODO: Nachrichten herunterladen, sofern man sich in der ChatActivity befindet + + } + }; + + BeWoLog.writeToLogFile("Verbinde mit dem Socket. (reconnectWithServer)"); + SocketManager.connectToServer("BeWoApplication -> reconnectWithServer"); + + Log.i("RECONNECT_WITH_SERVER", "connectToServer aufgerufen..."); + } + catch(Exception es) { + Log.e("RECONNECT_WITH_SERVER", "Ausnahme beim Login nach Reconnect"); + BeWoLog.writeToLogFile("Ausnahme beim Login nach Reconnect. (reconnectWithServer)"); + es.printStackTrace(); + } + } + } + + public static void sendUnsentMessages(final Context context) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + BeWoLog.writeToLogFile("Lade nicht verschickte Nachrichten aus der Datenbank zum verschicken."); + DatabaseHandler databaseHandler = DatabaseHandler.getInstance(context); + + ArrayList unsentMessages = databaseHandler.getUnsentChatMessages(); + ArrayList messagesWithoutResponse = new ArrayList<>(); + + if(unsentMessages.size() > 0) { + BeWoLog.writeToLogFile("Habe " + unsentMessages.size() + " Nachrichten gefunden."); + + } else { + BeWoLog.writeToLogFile("Habe keine nicht verschickten Nachrichten gefunden."); + } + + for(ChatMessage cm : unsentMessages) { + if (cm.SendDate == null) { + 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("+unsentPacket.ChatMessage+") mit MessageId (" + unsentPacket.MessageId + ") "); + SocketManager.sendMessage(unsentPacket); + Thread.sleep(75); + } else { + messagesWithoutResponse.add(cm); + } + } + + BeWoLog.writeToLogFile("Habe " + messagesWithoutResponse.size() + " Nachrichten gefunden, deren Message-Response verloren gegangen ist."); + + String pExceptions = ""; + for(int i = 0; i < messagesWithoutResponse.size(); i++) { + pExceptions += messagesWithoutResponse.get(i).MessageId; + + if(i != (messagesWithoutResponse.size() - 1)) { + pExceptions += ";"; + } + } + + 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()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + + thread.start(); + } + + public static void sendStatusRequest() { + final Packet requestPacket = new Packet(); + + requestPacket.ChatDataIdentifier = DataIdentifier.STATUS_REQUEST; + requestPacket.ChatName = SoapConnectionManager.getUser().getFullName(); + requestPacket.SenderPersonOid = SoapConnectionManager.getUser().getPersonOid().intValue(); + requestPacket.Tenant = SoapConnectionManager.getUser().getTenant(); + + SocketManager.sendMessage(requestPacket); + } } 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 f8786db3b..4f8f9bf69 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java @@ -3,6 +3,7 @@ package beyondsoft.bewomitarbeiterapp; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -15,12 +16,12 @@ import android.graphics.RectF; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; +import android.util.Base64; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; @@ -40,12 +41,14 @@ import com.octo.android.robospice.request.listener.RequestListener; import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapPrimitive; +import java.io.ByteArrayInputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Calendar; import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.UUID; import Database.DatabaseHandler; import entities.ChatEntity; @@ -56,10 +59,13 @@ import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; +import tcpConnection.LoginCallback; import tcpConnection.SocketManager; import tcpConnection.UIHandler; +import util.BeWoLog; import util.ChatMessageDeserializer; import util.ConnectivityReceiver; +import util.SecurityUtils; import util.Util; /** @@ -81,6 +87,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei protected String teamMemberNames; protected boolean isTeam; protected boolean isEmployee; + protected byte[] image; private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); @@ -90,15 +97,20 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei private final static String LOGTAG = "CHAT_ACTIVITY"; + @Override public void onNetworkConnectionChanged(boolean isConnected) { - Util.reconnectWithServer(isConnected, ChatActivity.this); + BeWoLog.writeToLogFile("onNetworkConnectionChanged in ChatActivity aufgerufen. Bin "+ (isConnected ? "online" : "offline")); + + BeWoChatApplication.reconnectWithServer(isConnected, ChatActivity.this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + BeWoLog.writeToLogFile("Erzeuge die ChatActivity"); + setContentView(R.layout.chat); ActionBar action = getSupportActionBar(); @@ -118,39 +130,42 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei listView = (ListView)findViewById(R.id.list_msg); - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { - Log.i("ON_SCROLL_STATE_CHANGED", "Berühre das Ende"); - } - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - Log.i("ON_SCROLL", "Scrolle... firstVisibleItem: " + firstVisibleItem + "; visibleItemCount: " + visibleItemCount + "; totalItemCount" + totalItemCount); - } - }); +// listView.setOnScrollListener(new AbsListView.OnScrollListener() { +// +// @Override +// public void onScrollStateChanged(AbsListView view, int scrollState) { +// if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { +// Log.i("ON_SCROLL_STATE_CHANGED", "Berühre das Ende"); +// } +// } +// +// @Override +// public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { +// Log.i("ON_SCROLL", "Scrolle... firstVisibleItem: " + firstVisibleItem + "; visibleItemCount: " + visibleItemCount + "; totalItemCount" + totalItemCount); +// } +// }); Bundle zielkorb = getIntent().getExtras(); recipientName = zielkorb.getString("Name"); recipientPersonOid = zielkorb.getInt("RecipientOid"); - byte[] bildArray = zielkorb.getByteArray("Bild"); + image = zielkorb.getByteArray("Bild"); isTeam = zielkorb.getBoolean("IsTeam"); teamMemberOids = zielkorb.getString("TeamMemberOids"); teamMemberNames = zielkorb.getString("TeamMemberNames"); isEmployee = zielkorb.getBoolean("IsEmployee"); - ReloadChatView(recipientName, recipientPersonOid, bildArray, isTeam, teamMemberOids, teamMemberNames, isEmployee); + Log.i("EXTRAS_KONTROLLE", "Empfänger: " + recipientName + "; " + recipientPersonOid); + + ReloadChatView(recipientName, recipientPersonOid, image, isTeam, teamMemberOids, teamMemberNames, isEmployee); } - private void ReloadChatView(String contactName, int recipientOid, byte[] contactImage, boolean pIsTeam, String pTeamMemberOids, String pTeamMemberNames, boolean pIsEmployee) { + private void ReloadChatView(final String contactName, final int recipientOid, final byte[] contactImage, boolean pIsTeam, String pTeamMemberOids, String pTeamMemberNames, boolean pIsEmployee) { chatMessages = new ArrayList<>(); recipientPersonOid = recipientOid; recipientName = contactName; isTeam = pIsTeam; + Log.i("CHAT", "IsTeam: " + isTeam); teamMemberOids = pTeamMemberOids; teamMemberNames = pTeamMemberNames; isEmployee = pIsEmployee; @@ -176,19 +191,23 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei adapter = new MessageAdapter(this, R.layout.item_chat_left, chatMessages); adapter.sort(DATE_COMPARATOR); + adapter.notifyDataSetChanged(); + listView.setAdapter(adapter); chatUIHandler = new UIHandler() { @Override public void updateUserInterface(final Packet chatPacket) { try { + Log.i(LOGTAG, "Identifier: " + chatPacket.ChatDataIdentifier.name()); + 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)); + chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false, chatPacket.MessageId)); adapter.sort(DATE_COMPARATOR); adapter.notifyDataSetChanged(); } else { @@ -198,7 +217,29 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei }); break; + + case MESSAGE_RESPONSE: + 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; + } + } + + adapter.sort(DATE_COMPARATOR); + adapter.notifyDataSetChanged(); + } + }); + + break; + case STATUS_NOTIFICATION_LOGIN: + BeWoLog.writeToLogFile("Benutzer " + chatPacket.ChatName + " ist jetzt online. (ChatActivity)"); if(chatPacket.SenderPersonOid == recipientPersonOid) { runOnUiThread(new Runnable() { @Override @@ -211,6 +252,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei break; case STATUS_NOTIFICATION_LOGOUT: + BeWoLog.writeToLogFile("Benutzer " + chatPacket.ChatName + " ist jetzt offline. (ChatActivity)"); if(chatPacket.SenderPersonOid == recipientPersonOid) { runOnUiThread(new Runnable() { @Override @@ -227,7 +269,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei @Override public void run() { if(isTeam && chatPacket.RecipientPersonOid == recipientPersonOid && BeWoChatApplication.isActivityVisible()) { - chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, true)); + chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, true, chatPacket.MessageId)); adapter.sort(DATE_COMPARATOR); adapter.notifyDataSetChanged(); } else { @@ -252,9 +294,13 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei Calendar c = Calendar.getInstance(); Date now = c.getTime(); + String messageId = UUID.randomUUID().toString(); + Packet packet = new Packet(); packet.ChatMessage = text.getText().toString(); packet.ChatDataIdentifier = isTeam ? DataIdentifier.TEAM : DataIdentifier.MESSAGE; + packet.IsEmployee = SoapConnectionManager.getUser().getIsEmployee(); + packet.MessageId = messageId; if(isTeam) { packet.ChatName = recipientName; @@ -263,14 +309,17 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei packet.RecipientPersonOid = recipientPersonOid; packet.MessageTimeStamp = now; - packet.Tenant = SoapConnectionManager.User.getTenant(); + packet.Tenant = SoapConnectionManager.getUser().getTenant(); - final ChatMessage message = new ChatMessage(packet.SenderPersonOid, packet.RecipientPersonOid, packet.MessageTimeStamp, packet.ChatMessage, false, 0, isTeam); + final ChatMessage message = new ChatMessage(packet.SenderPersonOid, packet.RecipientPersonOid, packet.MessageTimeStamp, packet.ChatMessage, false, 0, isTeam, messageId); long coid = databaseHandler.addChatMessage(message); + message.Id = Long.valueOf(coid).intValue(); packet.ClientseitigeOid = Long.valueOf(coid).intValue(); + Log.i("PACKET_MESSAGE_ID", "MessageId: " + packet.MessageId); + SocketManager.sendMessage(packet); listView.post(new Runnable() { @@ -289,7 +338,7 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei } }); - ArrayList test = isTeam ? databaseHandler.getExistingTeamChatMessageIds() : databaseHandler.getExistingChatMessageIds(); + ArrayList test = isTeam ? databaseHandler.getExistingTeamChatMessageUUIDs() : databaseHandler.getExistingChatMessageUUIDs(); String pExceptions = ""; for(int i = 0; i < test.size(); i++) { @@ -301,16 +350,53 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei } ArrayList propertyInfos = new ArrayList<>(); - propertyInfos.add(SoapConnectionManager.BuildProperty("pSenderPersonOid", SoapConnectionManager.User.getPersonOid(), Long.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pSenderPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", recipientPersonOid, Long.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pExceptions", pExceptions, String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pIsForTeam", isTeam, Boolean.class)); - Log.i(LOGTAG, "IsTeam: " + isTeam); + final JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_ALL_CHAT_MESSAGES, propertyInfos); - JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_ALL_CHAT_MESSAGES, propertyInfos); - spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); + final LoginCallback corruptedSpiceCallback = new LoginCallback() { + @Override + public void doCallback() { + BeWoLog.writeToLogFile("Callback bei erneutem Login auf dem Soap-Server wird ausgeführt. (ChatActivity)"); + spiceManager.shouldStop(); + spiceManager.start(ChatActivity.this); + + SocketManager.loginCallbackAfterConnectionLost = new LoginCallback() { + @Override + public void doCallback() { + //ReloadChatView(contactName, recipientOid, contactImage, isTeam, teamMemberOids, teamMemberNames, isEmployee); + + } + }; + +// SocketManager.shutDownConnectionToServer("ChatActivity->corruptedSpiceCallback"); + SocketManager.connectToServer("ChatActivity -> corruptedSpiceCallback"); + } + }; + + if(ConnectivityReceiver.isConnected()) { + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { + 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() { + @Override + public void doCallback() { + BeWoLog.writeToLogFile("Lade alle Nachrichten für diesen Chat nach fehlgeschlagenem ersten Versuch herunter. (ChatActivity)"); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListener(corruptedSpiceCallback)); + } + }; + SocketManager.connectToServer("ChatActivity -> Letzter Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her"); + } + } else { + BeWoLog.writeToLogFile("App ist offline. (ChatActivity)"); + Toast.makeText(getApplicationContext(), "Offline. Keine Aktion möglich.", Toast.LENGTH_LONG).show(); + } NotificationManager mNotifyMgr = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); @@ -319,11 +405,15 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei if(SocketManager.notificationEntities.get(entity) != null) { mNotifyMgr.cancel(SocketManager.notificationEntities.get(entity).getNotificationId()); Util.removeMessagesCount(entity); + } else { + Log.i("CHAT_ACTIVITY", "Keine Notification für diesen Chat vorhanden."); } } @Override public void onResume() { + BeWoLog.writeToLogFile("Resümiere mit der ChatActivity"); + BeWoChatApplication.activityResumed(); SocketManager.uiHandler = chatUIHandler; @@ -335,18 +425,24 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei @Override public void onStop(){ + BeWoLog.writeToLogFile("Stoppe die ChatActivity"); + spiceManager.shouldStop(); super.onStop(); } @Override public void onPause() { + BeWoLog.writeToLogFile("Pausiere die ChatActivity"); + super.onPause(); BeWoChatApplication.activityPaused(); } @Override protected void onStart() { + BeWoLog.writeToLogFile("Starte die ChatActivity"); + super.onStart(); spiceManager.start(this); } @@ -379,6 +475,12 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei } } + @Override + public void onBackPressed() { + KontaktChatActivity.setShouldReloadLatestMessages(true); + super.onBackPressed(); + } + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -425,19 +527,70 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei private final class JsonSoapPrimitiveRequestListener implements RequestListener { + public LoginCallback corruptedRequestCallback; + + public JsonSoapPrimitiveRequestListener(LoginCallback corruptedRequestCallback) { + this.corruptedRequestCallback = corruptedRequestCallback; + } + @Override public void onRequestFailure(SpiceException spiceException) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist beim Herunterladen der Nachrichten passiert.", Toast.LENGTH_LONG).show(); + } + }); + Log.e("GET_ALL_MESSAGES", "" + spiceException.getMessage()); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { - if(soapPrimitive == null) { - Log.e(LOGTAG, "Der vom Server zurückgelieferte Wert ist NULL! (Laden sämtlicher Nachrichten)"); + BeWoLog.writeToLogFile("Laden der Nachrichten ist fehlgeschlagen. Führe erneuten Login auf dem Soap-Server durch. (ChatActivity)"); + + try { + ArrayList propertyInfos = new ArrayList<>(); + + SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0); + String savedTenant = settings.getString(Util.PREFS_TENANT_KEY, null); + String savedUsername = settings.getString(Util.PREFS_USERNAME_KEY, null); + String savedPassword = settings.getString(Util.PREFS_PASSWORD, null); + + byte[] tenantByteArray = Base64.decode(savedTenant, Base64.DEFAULT); + ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray); + + byte[] usernameByteArray = Base64.decode(savedUsername, Base64.DEFAULT); + ByteArrayInputStream usernameStream = new ByteArrayInputStream(usernameByteArray); + + byte[] passwordByteArray = Base64.decode(savedPassword, Base64.DEFAULT); + ByteArrayInputStream passwordStream = new ByteArrayInputStream(passwordByteArray); + + propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", SecurityUtils.decrypt(tenantStream).toString(), String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", SecurityUtils.decrypt(usernameStream).toString(), String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", SecurityUtils.decrypt(passwordStream).toString(), String.class)); + + JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); + spiceManager.execute(request, new JsonSoapPrimitiveReLoginRequestListener()); + } catch(Exception e) { + BeWoLog.writeToLogFile("Der erneute Login ist fehlgeschlagen. (ChatActivity)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + } + return; } + BeWoLog.writeToLogFile("Das Laden der Nachrichten war erfolgreich. (ChatActivity)"); + + BeWoChatApplication.lastOnlineTS = Calendar.getInstance().getTime(); + GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(ChatMessage.class, new ChatMessageDeserializer()); @@ -458,12 +611,74 @@ public class ChatActivity extends ActionBarActivity implements ConnectivityRecei } }); } + + private final class JsonSoapPrimitiveReLoginRequestListener implements RequestListener { + @Override + public void onRequestFailure(SpiceException spiceException) { + BeWoLog.writeToLogFile("Der erneute Login ist fehlgeschlagen. (ChatActivity->ReLoginRequestListener->onRequestFailure)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ChatActivity.this, "Ein Fehler ist beim erneuten Login auftegreten.", Toast.LENGTH_LONG).show(); + } + }); + + Log.e("GET_ALL_MESSAGES", "Erneuter Login ist gescheitert: " + spiceException.getMessage()); + } + + @Override + public void onRequestSuccess(SoapPrimitive soapPrimitive) { + if(soapPrimitive == null) { + BeWoLog.writeToLogFile("Der Versuch eines erneuten Logins ist gescheitert. Das vom Soap-Server zurückgelieferte Objekt ist null! (ChatActivity->ReLoginRequestListener->onRequestSuccess)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ChatActivity.this, "Ein fataler Fehler ist aufgetreten. Bitte loggen Sie sich erneut an.", Toast.LENGTH_LONG).show(); + } + }); + + return; + } + + String abc = soapPrimitive.toString(); + + BeWoLog.writeToLogFile("Erneuter Login war erfolgreich. (ChatActivity->ReLoginRequestListener->onRequestSuccess)"); + + Bundle zielkorb = new Bundle(); + zielkorb.putString("Name", recipientName); + zielkorb.putInt("RecipientOid", recipientPersonOid); + zielkorb.putByteArray("Bild", image); + zielkorb.putBoolean("IsTeam", isTeam); + zielkorb.putString("TeamMemberOids", teamMemberOids); + zielkorb.putString("TeamMemberNames", teamMemberNames); + zielkorb.putBoolean("IsEmployee", isEmployee); + + if(abc != null) { + if(abc.contains(";")) { + Intent chatActivity = new Intent(getApplicationContext(), ChatActivity.class); + chatActivity.putExtras(zielkorb); + startActivity(chatActivity); + } else { + BeWoLog.writeToLogFile("Der erneute Login ist fehlgeschlagen. Die Credentials waren inkorrekt. (ChatActivity->ReLoginRequestListener->onRequestSuccess)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + } + } + } + } } public static final Comparator DATE_COMPARATOR = new Comparator() { @Override public int compare(ChatMessage lhs, ChatMessage rhs) { - return lhs.InsTs.getTime() > rhs.InsTs.getTime() ? 0 : 1; + return lhs.compareTo(rhs); } }; } 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 fcc154281..354b2577e 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java @@ -75,17 +75,13 @@ public class KontaktAdapter extends ArrayAdapter { ContactListItem cli = values.get(position); int bildId = R.drawable.mitarbeiter_avatar; - String blah = "Mitarbeiter"; if(cli.isTeam) { bildId = R.drawable.mitarbeiter_team_avatar; - blah = "Team"; } else if(!cli.getIsEmployee()) { bildId = R.drawable.klient_avatar; - blah = "Klient"; } - Log.i("KONTAKT_ADAPTER", "Kontakt hat KEIN Bild. Benutze Standardbild. Kontakt ist " + blah + "; Id: " + bildId); Bitmap bitmap = decodeSampledBitmapFromResource(inflater.getContext().getResources(), bildId, 100, 100); imageView.setImageBitmap(ImageConverter.getRoundedCornerBitmap(bitmap, bitmap.getWidth() / 2)); 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 7e5f1c129..b74116868 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -1,11 +1,13 @@ package beyondsoft.bewomitarbeiterapp; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBarActivity; +import android.util.Base64; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -25,12 +27,16 @@ import com.octo.android.robospice.request.listener.RequestListener; import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapPrimitive; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; import Database.DatabaseHandler; import entities.ChatEntity; @@ -41,17 +47,21 @@ import soapConnection.OnRequestSuccessCallback; import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; +import tcpConnection.LoginCallback; import tcpConnection.SocketManager; import tcpConnection.UIHandler; +import util.BeWoLog; import util.ChatMessageDeserializer; import util.ConnectivityReceiver; +import util.SecurityUtils; import util.Util; /** * Created by bib on 02.05.2016. */ public class KontaktChatActivity extends ActionBarActivity implements ConnectivityReceiver.ConnectivityReceiverListener, SwipeRefreshLayout.OnRefreshListener { - + private static boolean isDownloadOfContacsInProgress = false; + private static boolean isDownloadOfNewestMessagesInProgress = false; private static final String LOGTAG = "KONTAKT_CHAT_ACTIVITY"; private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); @@ -59,18 +69,28 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi public ListView listView; + private static boolean shouldReloadLatestMessages = false; + public static void setShouldReloadLatestMessages(boolean pShouldReloadLatestMessages) { + shouldReloadLatestMessages = pShouldReloadLatestMessages; + } + private SwipeRefreshLayout swipeRefreshLayout; ArrayList contactList = new ArrayList<>(); @Override public void onNetworkConnectionChanged(boolean isConnected) { - Util.reconnectWithServer(isConnected, KontaktChatActivity.this); + BeWoChatApplication.reconnectWithServer(isConnected, KontaktChatActivity.this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + SocketManager.initialLoginCallback = null; + + BeWoLog.writeToLogFile("Erzeuge die KontaktChatActivity"); + setContentView(R.layout.kontakt_list_chat); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); @@ -129,30 +149,131 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi @Override public void onRefresh() { + Log.i(LOGTAG, "Führe onRefresh durch"); updateContactList(); } private void updateContactList() { + if(isDownloadOfContacsInProgress) { + BeWoLog.writeToLogFile("Download der Kontakte wird von anderer Stelle versucht. (KontaktChatActivity)"); + return; + } + + isDownloadOfContacsInProgress = true; + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + isDownloadOfContacsInProgress = false; + BeWoLog.writeToLogFile("isDownloadOfContacsInProgress wird nach 10 Sekunden zurückgesetzt."); + } + }, 10*1000); + + BeWoLog.writeToLogFile("Lade Kontakte (updateContactList)"); swipeRefreshLayout.setRefreshing(true); ArrayList propertyInfos = new ArrayList<>(); - propertyInfos.add(SoapConnectionManager.BuildProperty("pPersonOid", SoapConnectionManager.User.getPersonOid(), Long.class)); + if(SoapConnectionManager.getUser() == null) { + BeWoLog.writeToLogFile("User ist null. (updateContactList)"); + Log.i(LOGTAG, "Angemeldeter User ist null"); + } else { + Log.i(LOGTAG, "UserPersonOid: " + SoapConnectionManager.getUser().getPersonOid()); + } - JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); - spiceManager.execute(request, new JsonSoapPrimitiveRequestListener(new OnRequestSuccessCallback() { - @Override - public void doCallback() { - Util.sendStatusRequest(); + if(SoapConnectionManager.getUser().getPersonOid() == null) { + Log.i(LOGTAG, "UserPersonOid ist null"); + BeWoLog.writeToLogFile("UserPersonOid ist null (updateContactList)"); + } - swipeRefreshLayout.setRefreshing(false); + propertyInfos.add(SoapConnectionManager.BuildProperty("pPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); - ArrayList propertyInfos = new ArrayList<>(); - propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", SoapConnectionManager.User.getPersonOid(), Long.class)); + final JsonSoapPrimitiveRequest getContactsRequest = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); - JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); - spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + if(ConnectivityReceiver.isConnected()) { + BeWoLog.writeToLogFile("App ist mit dem Internet verbunden (updateContactList)"); + 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() { + @Override + public void doCallback() { + BeWoChatApplication.sendStatusRequest(); + + swipeRefreshLayout.setRefreshing(false); + + ArrayList propertyInfos = new ArrayList<>(); + propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); + + final JsonSoapPrimitiveRequest getNewestMessagesRequest = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); + + if(ConnectivityReceiver.isConnected()) { + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { + spiceManager.execute(getNewestMessagesRequest, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + } + } 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"); + } + } + })); + } else { + BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her. Starte Verbindung zum SocketServer neu. (updateContactlist)"); + +// SocketManager.shutDownConnectionToServer("KontaktChatAcitivty->Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her"); + SocketManager.loginCallback2 = new LoginCallback() { + @Override + public void doCallback() { + spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveRequestListener(new OnRequestSuccessCallback() { + @Override + public void doCallback() { + BeWoLog.writeToLogFile("LoginCallback mit Abruf der neuesten Nachrichten und den Kontakten wird aufgerufen. (updateContactlist)"); + + BeWoChatApplication.sendStatusRequest(); + + swipeRefreshLayout.setRefreshing(false); + + ArrayList propertyInfos = new ArrayList<>(); + propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); + + final JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); + + if(ConnectivityReceiver.isConnected()) { + BeWoLog.writeToLogFile("LoginCallback ist mit dem Internet verbunden. (updateContactlist)"); + if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { + BeWoLog.writeToLogFile("LoginCallback "); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + } + } else { + BeWoLog.writeToLogFile("LoginCallback ist nicht mit dem Internet verbunden. (updateContactlist)"); +// SocketManager.shutDownConnectionToServer("KontaktChatActivity->"); + SocketManager.loginCallbackAfterConnectionLost = new LoginCallback() { + @Override + public void doCallback() { + BeWoLog.writeToLogFile("loginCallbackAfterConnectionLost im normalen LoginCallback aufgerufen, weil offline. (updateContactlist)"); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); + } + }; + } + } + })); + } + }; + + SocketManager.connectToServer("KontaktChatActivity -> Intervall überschritten"); } - })); + } else { + swipeRefreshLayout.setRefreshing(false); + isDownloadOfContacsInProgress = false; + BeWoLog.writeToLogFile("Offline. (KontaktChatActivity)"); + Toast.makeText(getApplicationContext(), "Offline. Keine Aktion möglich.", Toast.LENGTH_LONG).show(); + } } public UIHandler kontaktChatActivityUIHandler = new UIHandler() { @@ -315,6 +436,10 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi @Override public void onResume() { + swipeRefreshLayout.setRefreshing(false); + + BeWoLog.writeToLogFile("Resümiere mit der KontaktChatActivity"); + BeWoChatApplication.activityResumed(); SocketManager.uiHandler = kontaktChatActivityUIHandler; @@ -331,35 +456,48 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi adapter.notifyDataSetChanged(); } + if(shouldReloadLatestMessages) { + BeWoLog.writeToLogFile("Lade die Kontaktliste neu beim Resümieren"); + updateContactList(); + shouldReloadLatestMessages = false; + } + super.onResume(); } @Override public void onStop(){ + swipeRefreshLayout.setRefreshing(false); + spiceManager.shouldStop(); + BeWoLog.writeToLogFile("Stoppe die KontaktChatActivity"); + super.onStop(); } @Override public void onPause() { + swipeRefreshLayout.setRefreshing(false); + + BeWoLog.writeToLogFile("Pausiere die KontaktChatActivity"); + super.onPause(); BeWoChatApplication.activityPaused(); } @Override protected void onStart() { + swipeRefreshLayout.setRefreshing(false); + + BeWoLog.writeToLogFile("Starte die KontaktChatActivity"); + super.onStart(); spiceManager.start(this); } @Override public void onBackPressed() { -// SocketManager.logout(); -// -// Intent intent = new Intent(KontaktChatActivity.this, LoginActivity.class); -// KontaktChatActivity.this.startActivity(intent); - Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_HOME); @@ -372,16 +510,69 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi @Override public void onRequestFailure(SpiceException spiceException) { - Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der neuesten Nachrichten aufgetreten.", Toast.LENGTH_SHORT).show(); + BeWoLog.writeToLogFile("Ein Fehler ist beim Laden der neuesten Nachrichten aufgetreten (SoapListenerForNewestMessages->onRequestFailure)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der neuesten Nachrichten aufgetreten.", Toast.LENGTH_SHORT).show(); + } + }); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + } + }); + if(soapPrimitive == null) { + BeWoLog.writeToLogFile("Antwort vom Server war null. Ein erneuter Login erfolgt. (SoapListenerForNewestMessages->onRequestSuccess)"); Log.e("KONTAKT_CHAT_ACTIVITY", "Der vom Server zurückgelieferte Wert ist NULL! (Laden der neuesten Nachrichten)"); + + try { + ArrayList propertyInfos = new ArrayList<>(); + + SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0); + String savedTenant = settings.getString(Util.PREFS_TENANT_KEY, null); + String savedUsername = settings.getString(Util.PREFS_USERNAME_KEY, null); + String savedPassword = settings.getString(Util.PREFS_PASSWORD, null); + + byte[] tenantByteArray = Base64.decode(savedTenant, Base64.DEFAULT); + ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray); + + byte[] usernameByteArray = Base64.decode(savedUsername, Base64.DEFAULT); + ByteArrayInputStream usernameStream = new ByteArrayInputStream(usernameByteArray); + + byte[] passwordByteArray = Base64.decode(savedPassword, Base64.DEFAULT); + ByteArrayInputStream passwordStream = new ByteArrayInputStream(passwordByteArray); + + propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", SecurityUtils.decrypt(tenantStream).toString(), String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", SecurityUtils.decrypt(usernameStream).toString(), String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", SecurityUtils.decrypt(passwordStream).toString(), String.class)); + + JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); + + BeWoLog.writeToLogFile("Lade neueste Nachrichten erneut herunter. (SoapListenerForNewestMessages->onRequestSuccess)"); + spiceManager.execute(request, new KontaktChatActivity.JsonSoapPrimitiveReLoginRequestListener()); + } catch(Exception e) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + } + return; } + BeWoLog.writeToLogFile("Herunterladen der neuesten Nachrichten war erfolgreich. (SoapListenerForNewestMessages->onRequestSuccess)"); + GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(ChatMessage.class, new ChatMessageDeserializer()); @@ -396,9 +587,9 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi if(adapter != null) { for(ContactListItem item : adapter.values) { - if(item.getPersonOid() == message.SenderPersonOid && !item.isTeam && !message.IsTeam || item.isTeam && message.IsTeam && item.getPersonOid() == message.RecipientPersonOid) { + if((item.getPersonOid() == message.SenderPersonOid ||item.getPersonOid() == message.RecipientPersonOid) && !item.isTeam && !message.IsTeam || item.isTeam && message.IsTeam && item.getPersonOid() == message.RecipientPersonOid) { item.setMessagePreview(message.ChatText); - item.setIsNewMessage2Preview(!databaseHandler.GetIsMessageInDatabase(message.ServerseitigeOid)); + item.setIsNewMessage2Preview(!databaseHandler.GetIsMessageInDatabase(message.MessageId)); } } @@ -418,16 +609,72 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi @Override public void onRequestFailure(SpiceException spiceException) { - Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der Kontaktliste aufgetreten.", Toast.LENGTH_SHORT).show(); + BeWoLog.writeToLogFile("Laden der Kontakte ist fehlgeschlagen. (JsonSoapPrimitiveRequestListener->onRequestFailure)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der Kontaktliste aufgetreten.", Toast.LENGTH_SHORT).show(); + } + }); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { + BeWoLog.writeToLogFile("Antwort vom Server war null. Ein erneuter Login erfolgt. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + } + }); + Log.e(LOGTAG, "Der vom Server zurückgelieferte Wert ist NULL! (Laden der Kontakte)"); + + //TODO: wie im Chat + try { + ArrayList propertyInfos = new ArrayList<>(); + + SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0); + String savedTenant = settings.getString(Util.PREFS_TENANT_KEY, null); + String savedUsername = settings.getString(Util.PREFS_USERNAME_KEY, null); + String savedPassword = settings.getString(Util.PREFS_PASSWORD, null); + + byte[] tenantByteArray = Base64.decode(savedTenant, Base64.DEFAULT); + ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray); + + byte[] usernameByteArray = Base64.decode(savedUsername, Base64.DEFAULT); + ByteArrayInputStream usernameStream = new ByteArrayInputStream(usernameByteArray); + + byte[] passwordByteArray = Base64.decode(savedPassword, Base64.DEFAULT); + ByteArrayInputStream passwordStream = new ByteArrayInputStream(passwordByteArray); + + propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", SecurityUtils.decrypt(tenantStream).toString(), String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", SecurityUtils.decrypt(usernameStream).toString(), String.class)); + propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", SecurityUtils.decrypt(passwordStream).toString(), String.class)); + + JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); + + BeWoLog.writeToLogFile("Lade Kontakte erneut herunter. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); + spiceManager.execute(request, new KontaktChatActivity.JsonSoapPrimitiveReLoginRequestListener()); + } catch(Exception e) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + } + return; } + BeWoLog.writeToLogFile("Laden der Kontakte war erfolgreich. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); + + isDownloadOfContacsInProgress = false; + Gson gson = new GsonBuilder().create(); Type listType = new TypeToken>(){}.getType(); @@ -442,19 +689,12 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi oid2VersionList.put(new ChatEntity(item.getPersonOid(), item.isTeam, item.getIsEmployee()), item.getVersion()); } - for(Map.Entry entry : oid2VersionList.entrySet()) { - ChatEntity key = entry.getKey(); - Log.i(LOGTAG, "\nOid: " + key.getOid() + "\nIsTeam: " + key.getIsTeam() + "\nIsEmployee: " + key.getIsEmployee()); - } - for(ChatPerson cp : result) { - Log.i(LOGTAG, cp.Name + " " + cp.IsEmployee); ContactListItem contact = new ContactListItem(cp.Name, cp.Oid, cp.IsTeam, cp.TeamMemberOids, cp.TeamMemberNames, cp.Version, cp.IsEmployee); ChatEntity cliEntity = new ChatEntity(cp.Oid, cp.IsTeam, cp.IsEmployee); if(!oid2VersionList.containsKey(cliEntity)) { - Log.i(LOGTAG, "Nicht in der Klientenliste enthalten"); databaseHandler.addContact(contact); } else if(oid2VersionList.get(cliEntity) < cp.Version) { @@ -495,4 +735,55 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi } } } + + private final class JsonSoapPrimitiveReLoginRequestListener implements RequestListener { + @Override + public void onRequestFailure(SpiceException spiceException) { + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Die Serveranfrage ist gescheitert (Erneuter Login). Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + + BeWoLog.writeToLogFile("Erneuter Login ist fehlgeschlagen. (JsonSoapPrimitiveReLoginRequestListener->onRequestFailure)"); + Log.e("GET_ALL_MESSAGES", "Fehler beim erneuten Login: " + spiceException.getMessage()); + } + + @Override + public void onRequestSuccess(SoapPrimitive soapPrimitive) { + if(soapPrimitive == null) { + BeWoLog.writeToLogFile("Antwort vom Server war null. (JsonSoapPrimitiveReLoginRequestListener->onRequestSuccess)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + + return; + } + + String abc = soapPrimitive.toString(); + + BeWoLog.writeToLogFile("Erneuter Login war erfolgreich. (JsonSoapPrimitiveReLoginRequestListener->onRequestSuccess)"); + Log.i("ERNEUTER_LOGIN", "Antwort vom Server erhalten in KONTAKT_CHAT_ACTIVITY"); + + if(abc != null) { + if(abc.contains(";")) { +// Intent kontaktChatActivity = new Intent(getApplicationContext(), KontaktChatActivity.class); +// startActivity(kontaktChatActivity); + } else { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); + } + }); + } + } + } + } } 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 16a99af8b..0234bf04a 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java @@ -39,6 +39,7 @@ import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; +import java.util.Calendar; import javax.crypto.NoSuchPaddingException; @@ -49,6 +50,7 @@ import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; import tcpConnection.LoginCallback; import tcpConnection.SocketManager; +import util.BeWoLog; import util.SecurityUtils; import util.Util; @@ -69,9 +71,37 @@ public class LoginActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { + BeWoLog.writeToLogFile("Erzeuge die LoginActivity"); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + SocketManager.connectionFailureCallback = new LoginCallback() { + @Override + public void doCallback() { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Offline. Aktion nicht möglich.", Toast.LENGTH_LONG).show(); + Log.i("LOGIN", "Verbindung mit dem TCP-Server nicht möglich"); + } + }); + } + }; + + SocketManager.sendFailureCallback = new LoginCallback() { + @Override + public void doCallback() { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), "Offline. Senden vorgemerkt.", Toast.LENGTH_LONG).show(); + Log.i("LOGIN", "Verbindung mit dem TCP-Server nicht vorhanden. Nachricht wird später verschickt."); + } + }); + } + }; + mChatCodeView = (EditText) findViewById(R.id.token); mTenantView = (EditText) findViewById(R.id.tenant); mUsernameView = (EditText) findViewById(R.id.username); @@ -133,27 +163,35 @@ public class LoginActivity extends ActionBarActivity { @Override protected void onStart() { + BeWoLog.writeToLogFile("Starte die LoginActivity"); + super.onStart(); spiceManager.start(this); } @Override protected void onStop() { + BeWoLog.writeToLogFile("Stoppe die LoginActivity"); + spiceManager.shouldStop(); super.onStop(); } @Override public void onPause() { + BeWoLog.writeToLogFile("Pausiere die LoginActivity"); + super.onPause(); BeWoChatApplication.activityPaused(); } @Override protected void onResume() { + BeWoLog.writeToLogFile("Resümiere mit der LoginActivity"); + BeWoChatApplication.activityResumed(); - if(SoapConnectionManager.User != null) { + if(SoapConnectionManager.getUser() != null) { Log.i("LOGIN", "Benutzer ist angemeldet"); } else { Log.i("LOGIN", "Benutzer ist NICHT angemeldet"); @@ -163,6 +201,8 @@ public class LoginActivity extends ActionBarActivity { } private void attemptLogin() { + BeWoLog.writeToLogFile("Versuche Login auf dem Soap-Server von der LoginActivity aus."); + mTenantView.setError(null); mChatCodeView.setError(null); mUsernameView.setError(null); @@ -250,47 +290,70 @@ public class LoginActivity extends ActionBarActivity { } } - private final class JsonSoapPrimitiveRequestListener implements RequestListener { + public final class JsonSoapPrimitiveRequestListener implements RequestListener { @Override public void onRequestFailure(SpiceException spiceException) { - showProgress(false); + BeWoLog.writeToLogFile("Login ist fehlgeschlagen (LoginActivity->JsonSoapPrimitiveRequestListener->onRequestFailure)"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + showProgress(false); + + Toast.makeText(getApplicationContext(), "Offline. Anmeldung nicht möglich", Toast.LENGTH_LONG).show(); + } + }); + Log.e("Error", spiceException.getMessage()); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { - showProgress(false); - showLoginUIErrors(true, true, true, true); + BeWoLog.writeToLogFile("Null vom Server erhalten (LoginActivity->JsonSoapPrimitiveRequestListener->onRequestSuccess)"); - Toast.makeText(LoginActivity.this, "Login nicht möglich", Toast.LENGTH_SHORT).show(); + runOnUiThread(new Runnable() { + @Override + public void run() { + showProgress(false); + showLoginUIErrors(true, true, true, true); + + Toast.makeText(LoginActivity.this, "Login nicht möglich", Toast.LENGTH_SHORT).show(); + } + }); return; } + BeWoChatApplication.lastOnlineTS = Calendar.getInstance().getTime(); + String abc = soapPrimitive.toString(); if(abc != null) { - + BeWoLog.writeToLogFile("Der Loginversuch war erfolgreich (LoginActivity->JsonSoapPrimitiveRequestListener->onRequestSuccess)"); Log.i("LOGIN", abc); if(abc.contains(";")) { + BeWoLog.writeToLogFile("Der User ist angemeldet (LoginActivity->JsonSoapPrimitiveRequestListener->onRequestSuccess)"); + String[] blubb = abc.split(";"); - SoapConnectionManager.User = new ApplicationUser(blubb[1], blubb[2], Long.valueOf(blubb[0]), Long.valueOf(blubb[3])); + SoapConnectionManager.setUser(new ApplicationUser(blubb[1], blubb[2], Long.valueOf(blubb[0]), Long.valueOf(blubb[3]))); + + Log.i("LOGIN", "UserPersonOid: " + SoapConnectionManager.getUser().getPersonOid()); DatabaseHandler databaseHandler = DatabaseHandler.getInstance(getApplicationContext()); int owner = databaseHandler.getOwnerOid(); if(owner == 0) { - databaseHandler.insertOwnerOid(SoapConnectionManager.User.getPersonOid().intValue()); - } else if(owner != SoapConnectionManager.User.getPersonOid().intValue()) { + databaseHandler.insertOwnerOid(SoapConnectionManager.getUser().getPersonOid().intValue()); + } else if(owner != SoapConnectionManager.getUser().getPersonOid().intValue()) { databaseHandler.clearDatabase(); - databaseHandler.insertOwnerOid(SoapConnectionManager.User.getPersonOid().intValue()); + databaseHandler.insertOwnerOid(SoapConnectionManager.getUser().getPersonOid().intValue()); } - SoapConnectionManager.User.setTenant(mTenantView.getText().toString()); + SoapConnectionManager.getUser().setTenant(mTenantView.getText().toString()); if(mRememberMeCheckBoxView.isChecked()) { ByteArrayOutputStream tokenOutputStream = new ByteArrayOutputStream(); @@ -321,11 +384,13 @@ public class LoginActivity extends ActionBarActivity { SocketManager.tenant = mTenantView.getText().toString(); - SocketManager.loginCallback = new LoginCallback() { + SocketManager.initialLoginCallback = new LoginCallback() { @Override public void doCallback() { Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Ist verbunden und ruft die ChatActivity nun auf."); + BeWoLog.writeToLogFile("Rufe die KontaktChatActivity auf (LoginActivity->JsonSoapPrimitiveRequestListener->onRequestSuccess)"); + runOnUiThread(new Runnable() { @Override public void run() { @@ -338,21 +403,25 @@ public class LoginActivity extends ActionBarActivity { } }; - SocketManager.connectToServer(); + SocketManager.connectToServer("LoginActivity"); } else { showProgress(false); switch(abc) { case "WrongTenant": + BeWoLog.writeToLogFile("Falsche Kundennummer beim Login"); showLoginUIErrors(false, true, false, false); break; case "WrongCredentials": + BeWoLog.writeToLogFile("Falsche Credentials beim Login"); showLoginUIErrors(false, false, true, true); break; case "Unauthorized": + BeWoLog.writeToLogFile("Chat-Recht fehlt beim Login"); Toast.makeText(getApplicationContext(), "Sie sind nicht zum Chatten autorisiert. Bitte wenden Sie sich an Ihren Administrator.", Toast.LENGTH_LONG).show(); break; default: + BeWoLog.writeToLogFile("Unbekannter Fehler beim Login"); Toast.makeText(getApplicationContext(), "Ein unbekannter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.", Toast.LENGTH_LONG).show(); break; } @@ -413,4 +482,8 @@ public class LoginActivity extends ActionBarActivity { mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); } } + + @Override + public void onBackPressed() { + } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java deleted file mode 100644 index e65a15512..000000000 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java +++ /dev/null @@ -1,185 +0,0 @@ -package beyondsoft.bewomitarbeiterapp; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; - -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; - -import java.util.ArrayList; - -import Database.DatabaseHandler; - -import entities.ChatMessage; - -import soapConnection.Packet; -import soapConnection.SoapConnectionManager; - -import tcpConnection.SocketManager; -import tcpConnection.UIHandler; -import util.ConnectivityReceiver; -import util.Util; - - -public class MainActivityMitarbeiter extends Activity implements ConnectivityReceiver.ConnectivityReceiverListener { - - protected Button dokubutton; - protected Button chatbutton; - protected Button logoutbutton; - - protected String loggedInUserName; - - private UIHandler mainUIHandler; - - int loggedInUserPersonOid; - - private final static String LOGTAG = "MAIN_ACTIVITY"; - - @Override - public void onNetworkConnectionChanged(boolean isConnected) { - Util.reconnectWithServer(isConnected, MainActivityMitarbeiter.this); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main_activity_mitarbeiter); - - SocketManager.connectToServer(); - - setzeButtonListener(); - - loggedInUserName = SoapConnectionManager.User.getFullName(); - - loggedInUserPersonOid = SoapConnectionManager.User.getPersonOid() <= Integer.MAX_VALUE ? SoapConnectionManager.User.getPersonOid().intValue() : 0; - - mainUIHandler = new UIHandler() { - @Override - public void updateUserInterface(Packet chatPacket) { - switch(chatPacket.ChatDataIdentifier) { - case MESSAGE: - Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, chatPacket.IsEmployee, getApplicationContext()); - - break; - - case MESSAGE_RESPONSE: - DatabaseHandler databaseHandler = DatabaseHandler.getInstance(getApplicationContext()); - - ChatMessage cm = databaseHandler.getChatMessageById(chatPacket.ClientseitigeOid); - - cm.ServerseitigeOid = chatPacket.ServerseitigeOid; - cm.IsDelivered = true; - - databaseHandler.updateChatMessage(cm); - - break; - case STATUS_NOTIFICATION_LOGIN_BROADCAST: - String[] bitch = chatPacket.ChatMessage.split(","); - - for (String aBitch : bitch) { - SocketManager.onlinePersonOids.add(Integer.parseInt(aBitch)); - } - - break; - case STATUS_NOTIFICATION_LOGIN: - if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); - } - - break; - case STATUS_NOTIFICATION_LOGOUT: - if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); - } - - break; - - case TEAM: - ContactListItem cli = DatabaseHandler.getInstance(getApplicationContext()).getContactByPersonOid(chatPacket.RecipientPersonOid, true); - - Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.RecipientPersonOid, true, cli.teamMemberOids, cli.teamMemberNames, cli.getIsEmployee(), getApplicationContext()); - break; - } - } - }; - - Util.sendUnsentMessages(MainActivityMitarbeiter.this); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main_activity_mitarbeiter, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - - if (id == R.id.action_Logout) { - System.exit(0); - } - - return super.onOptionsItemSelected(item); - } - - public void setzeButtonListener() { - - dokubutton = (Button) findViewById(R.id.Dokubutton); - dokubutton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - - startActivity(new Intent(getBaseContext(),WebdokuActivity.class)); - - } - }); - - chatbutton = (Button) findViewById(R.id.Chatbutton); - chatbutton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - Intent kontaktChatActivity = new Intent(getBaseContext(), KontaktChatActivity.class); - - startActivity(kontaktChatActivity); - } - }); - - logoutbutton = (Button) findViewById(R.id.Logoutbutton); - logoutbutton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - SocketManager.logout(); - - finish(); - System.exit(0); - } - }); - } - - @Override - public void onResume() { - SocketManager.uiHandler = mainUIHandler; - - BeWoChatApplication.getInstance().setConnectivityListener(this); - - super.onResume(); - } - - @Override - public void onBackPressed() { - Log.i(LOGTAG, "Logge aus..."); - - SocketManager.logout(); - - finish(); - System.exit(0); - } -} 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 148e87902..a68e76179 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java @@ -5,8 +5,10 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.ImageView; import android.widget.TextView; +import java.util.ArrayList; import java.util.List; import Database.DatabaseHandler; @@ -19,12 +21,13 @@ import soapConnection.SoapConnectionManager; public class MessageAdapter extends ArrayAdapter { private Activity activity; - //private List messages; + public ArrayList messages; + public MessageAdapter(Activity context, int resource, List objects) { super(context, resource, objects); this.activity = context; - //this.messages = objects; + this.messages = new ArrayList<>(objects); } @Override @@ -35,7 +38,7 @@ public class MessageAdapter extends ArrayAdapter { int layoutResource; ChatMessage chatMessage = getItem(position); - if (chatMessage.SenderPersonOid == SoapConnectionManager.User.getPersonOid()) { + if (chatMessage.SenderPersonOid == SoapConnectionManager.getUser().getPersonOid()) { layoutResource = R.layout.item_chat_right; }else { layoutResource = R.layout.item_chat_left; @@ -47,7 +50,11 @@ public class MessageAdapter extends ArrayAdapter { holder.msg.setText(chatMessage.ChatText); - if(chatMessage.IsTeam && chatMessage.SenderPersonOid != SoapConnectionManager.User.getPersonOid()) { + if(holder.pending_msg_image != null && chatMessage.ServerseitigeOid != 0) { + holder.pending_msg_image.setVisibility(View.INVISIBLE); + } + + if(chatMessage.IsTeam && chatMessage.SenderPersonOid != SoapConnectionManager.getUser().getPersonOid()) { DatabaseHandler instance = DatabaseHandler.getInstance(this.getContext()); ContactListItem sender = instance.getContactByPersonOid(chatMessage.SenderPersonOid, false); @@ -57,7 +64,7 @@ public class MessageAdapter extends ArrayAdapter { holder.teamMemberName.setVisibility(View.VISIBLE); } - if(chatMessage.SenderPersonOid == SoapConnectionManager.User.getPersonOid()){ + if(chatMessage.SenderPersonOid == SoapConnectionManager.getUser().getPersonOid()){ holder.dateIn.setText(chatMessage.getInsTsAsString()); } else { holder.dateOut.setText(chatMessage.getInsTsAsString()); @@ -84,14 +91,14 @@ public class MessageAdapter extends ArrayAdapter { private TextView dateOut; private TextView dateIn; private TextView teamMemberName; - //private TextView send_tick; + private ImageView pending_msg_image; - public ViewHolder(View v) { + ViewHolder(View v) { msg = (TextView) v.findViewById(R.id.txt_msg); dateOut = (TextView)v.findViewById(R.id.DateOUT); dateIn = (TextView)v.findViewById(R.id.DateIN); teamMemberName = (TextView) v.findViewById(R.id.teamMember); - //send_tick = (TextView)v.findViewById(R.id.txt_msg_tick); + pending_msg_image = (ImageView) v.findViewById(R.id.pending_msg_img); } } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java index eb0cf3ece..63e5958d8 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java @@ -7,7 +7,7 @@ import java.util.Locale; /** * Created by JettenM on 26.07.2016. */ -public class ChatMessage { +public class ChatMessage implements Comparable { public int Id; public int SenderPersonOid; public int RecipientPersonOid; @@ -16,26 +16,30 @@ public class ChatMessage { public boolean IsDelivered; public int ServerseitigeOid; public boolean IsTeam; + public String MessageId; + public Date SendDate; - public ChatMessage(int id, int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid, boolean isTeam) { - Id = id; - SenderPersonOid = senderPersonOid; + public ChatMessage(int id, int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid, boolean isTeam, String messageId) { + Id = id; + SenderPersonOid = senderPersonOid; RecipientPersonOid = recipientPersonOid; - InsTs = insTs; - ChatText = chatText; - IsDelivered = isDelivered; - ServerseitigeOid = serverseitigeOid; - IsTeam = isTeam; + InsTs = insTs; + ChatText = chatText; + IsDelivered = isDelivered; + ServerseitigeOid = serverseitigeOid; + IsTeam = isTeam; + MessageId = messageId; } - public ChatMessage(int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid, boolean isTeam) { - SenderPersonOid = senderPersonOid; + public ChatMessage(int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid, boolean isTeam, String messageId) { + SenderPersonOid = senderPersonOid; RecipientPersonOid = recipientPersonOid; - InsTs = insTs; - ChatText = chatText; - IsDelivered = isDelivered; - ServerseitigeOid = serverseitigeOid; - IsTeam = isTeam; + InsTs = insTs; + ChatText = chatText; + IsDelivered = isDelivered; + ServerseitigeOid = serverseitigeOid; + IsTeam = isTeam; + MessageId = messageId; } public String getInsTsAsString() { @@ -43,6 +47,15 @@ public class ChatMessage { return dateFormat.format(InsTs); } + @Override + public int compareTo(ChatMessage cm) { + if(InsTs == null || cm.InsTs == null) { + return 0; + } + + return InsTs.compareTo(cm.InsTs); + } + @Override public String toString() { String asString = "Id: " + Id; @@ -53,6 +66,7 @@ public class ChatMessage { asString += "\nIsDelivered: " + IsDelivered; asString += "\nServerseitigeOid: " + ServerseitigeOid; asString += "\nIsTeam: " + IsTeam; + asString += "\nMessageId: " + MessageId; return asString; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/ApplicationUser.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/ApplicationUser.java index afae4946a..005329a56 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/ApplicationUser.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/ApplicationUser.java @@ -52,7 +52,7 @@ public class ApplicationUser { } public boolean getIsEmployee() { - return employeeOid == 0 && customerOid > 0; + return employeeOid != null && customerOid == null; } public ApplicationUser(String fullName, String username, Long employeeOid, Long personOid) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java index 92e3393ce..ec5035eb2 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java @@ -19,7 +19,8 @@ public enum DataIdentifier { STATUS_NOTIFICATION_ONLINE(12), STATUS_NOTIFICATION_OFFLINE(13), LOGIN_SUCCESS(14), - STATUS_REQUEST(15); + STATUS_REQUEST(15), + KEEP_ALIVE(16); private final int value; DataIdentifier(int value) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java index 6c76eb267..250eda146 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java @@ -26,29 +26,31 @@ public class Packet { public int ServerseitigeOid; public int ClientseitigeOid; public boolean IsEmployee; + public String MessageId; public Packet() { ChatDataIdentifier = DataIdentifier.NULL; ChatMessage = ""; - ChatName = SoapConnectionManager.User.getFullName(); + ChatName = SoapConnectionManager.getUser().getFullName(); Tenant = ""; - SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue(); + SenderPersonOid = SoapConnectionManager.getUser().getPersonOid().intValue(); RecipientPersonOid = 0; IsDelivered = false; MessageTimeStamp = Calendar.getInstance().getTime(); - IsEmployee = SoapConnectionManager.User.getIsEmployee(); + IsEmployee = SoapConnectionManager.getUser().getIsEmployee(); + MessageId = ""; } - public String getFormattedMessageTimeStamp() { - DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + private String getFormattedMessageTimeStamp() { + DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMAN); return df.format(MessageTimeStamp); } //Aufbau Message: // die ersten fünf ";" ignorieren - // SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;ServerseitigeOid;ClientseitigeOid;Tenant;IsEmployee;[ClientName][ChatMessage][MessageTimeStamp][IsDelivered] + // SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;ServerseitigeOid;ClientseitigeOid;Tenant;IsEmployee;MessageId;[ClientName][ChatMessage][MessageTimeStamp][IsDelivered] - //23;281;20;389;1;38;932[Tenant]; 8 Semikola + //23;281;20;389;1;38;932;[Tenant];1; 10 Semikola public Packet(String message) { Log.i("PACKET_CONSTRUCTOR_MSG", message); @@ -64,6 +66,7 @@ public class Packet { String clientseitigeOidString = gesplittet[6]; Tenant = gesplittet[7]; String isEmployeeString = gesplittet[8]; + MessageId = gesplittet[9]; SenderPersonOid = Integer.parseInt(senderPersonOidString); RecipientPersonOid = Integer.parseInt(recipientPersonOidString); @@ -76,14 +79,14 @@ public class Packet { int chatNameLength = Integer.parseInt(chatNameLengthString); int chatMessageLength = Integer.parseInt(chatMessageLengthString); - int headerLength = senderPersonOidString.length() + recipientPersonOidString.length() + chatNameLengthString.length() + chatMessageLengthString.length() + chatIdentifierString.length() + Tenant.length() + serverseitigeOidString.length() + clientseitigeOidString.length() + 10; + int headerLength = senderPersonOidString.length() + recipientPersonOidString.length() + chatNameLengthString.length() + chatMessageLengthString.length() + chatIdentifierString.length() + Tenant.length() + serverseitigeOidString.length() + clientseitigeOidString.length() + MessageId.length() + 12; String actualMessage = message.substring(headerLength - 1); ChatName = actualMessage.substring(0, chatNameLength); ChatMessage = actualMessage.substring(chatNameLength, chatMessageLength + chatNameLength); - String dateString = actualMessage.substring(chatMessageLength + chatNameLength); + String dateString = actualMessage.substring(chatMessageLength + chatNameLength, actualMessage.length() - 1); DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMAN); @@ -99,7 +102,7 @@ public class Packet { } public byte[] getDataStream() { - String dataStreamAsString = "" + SenderPersonOid + ";" + RecipientPersonOid + ";" + ChatName.length() + ";" + ChatMessage.length()+ ";" + ChatDataIdentifier.getValue() + ";" + ServerseitigeOid + ";" + ClientseitigeOid + ";" + Tenant + ";" + (IsEmployee ? 1 : 0) + ";"; + String dataStreamAsString = "" + SenderPersonOid + ";" + RecipientPersonOid + ";" + ChatName.length() + ";" + ChatMessage.length()+ ";" + ChatDataIdentifier.getValue() + ";" + ServerseitigeOid + ";" + ClientseitigeOid + ";" + Tenant + ";" + (IsEmployee ? 1 : 0) + ";" + MessageId + ";"; dataStreamAsString += ChatName + ChatMessage + getFormattedMessageTimeStamp() + "" + (IsDelivered ? 1 : 0); @@ -117,6 +120,23 @@ public class Packet { } private void writeToLog(String prefix) { - 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); + 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; } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java index 8770df27f..d987f06b3 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java @@ -11,6 +11,8 @@ public class SoapCalls { public static String GET_ALL_CHAT_MESSAGES = "GetAllChatMessagesForSenderAndRecipient"; public static String KEEP_ALIVE = "KeepAlive"; + public static String CHECK_MESSAGE_IDS = "CheckChatMessagesByUUIDs"; + //TODO: "app4.bewoplaner.de";// public static String DESTINATION_ADDRESS = "app4.bewoplaner.de"; public static int DESTINATION_PORT = 5000; diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapConnectionManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapConnectionManager.java index 4bca0a562..a70f804c7 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapConnectionManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapConnectionManager.java @@ -17,7 +17,15 @@ import java.util.ArrayList; * Created by JettenM on 05.07.2016. */ public class SoapConnectionManager { - public static ApplicationUser User; + private static ApplicationUser user; + + public static ApplicationUser getUser() { + return user; + } + + public static void setUser(ApplicationUser pUser) { + user = pUser; + } private static final String LOGTAG = "SoapConnectionManager"; diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java index b82d1b854..b5f7ccdab 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java @@ -1,6 +1,7 @@ package tcpConnection; import android.util.Log; +import android.widget.Toast; import java.io.DataOutputStream; import java.io.IOException; @@ -9,6 +10,7 @@ import java.io.UnsupportedEncodingException; import java.net.NetworkInterface; import java.net.Socket; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -24,6 +26,8 @@ import entities.NotificationLog; import soapConnection.DataIdentifier; import soapConnection.Packet; import soapConnection.SoapCalls; +import util.BeWoLog; +import util.ConnectivityReceiver; import util.Util; /** @@ -41,29 +45,72 @@ public class SocketManager { 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; 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 void connectToServer(){ + 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(); } + private static boolean loginInProgress = false; private static class ConnectionOpener implements Runnable { public void run() { try { + if(loginInProgress) { + BeWoLog.writeToLogFile("Login wird von anderer Stelle versucht. (ConnectionOpener)"); + return; + } + + BeWoLog.writeToLogFile("Login mit dem TCP-Server wird ausgeführt"); + + loginInProgress = true; if(socket != null) { socket.close(); } + if (dataOutputStream != null) { + dataOutputStream.flush(); + dataOutputStream.close(); + } + + if(socketListener != null) { + socketListener.isRunning = false; + } + socket = null; - socket = new Socket(SoapCalls.DESTINATION_ADDRESS, SoapCalls.DESTINATION_PORT); + + try { + socket = new Socket(SoapCalls.DESTINATION_ADDRESS, SoapCalls.DESTINATION_PORT); + + BeWoChatApplication.lastOnlineTS = Calendar.getInstance().getTime(); + } catch(Exception e) { + BeWoChatApplication.writeExceptionToLog(e); + + if(socketConnectionFailedCallback != null) { + socketConnectionFailedCallback.doCallback(); + } + + return; + } dataOutputStream = null; onlinePersonOids.clear(); @@ -71,22 +118,38 @@ public class SocketManager { dataOutputStream = new DataOutputStream(socket.getOutputStream()); + socketListener = null; socketListener = new SocketListener(); listenerThread = new Thread(socketListener); listenerThread.start(); + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + loginInProgress = false; + BeWoLog.writeToLogFile("loginInProgress wird nach 10 Sekunden zurückgesetzt."); + } + }, 10*1000); + loginOnServer(); } catch(Exception exception) { + BeWoChatApplication.writeExceptionToLog(exception); + socket = null; try { new Timer().schedule(new TimerTask() { @Override public void run() { - connectToServer(); + connectToServer("Login-Timeout in ConnectionOpener"); } - }, 5000); + }, 11000); } catch(Exception exception2) { + BeWoChatApplication.writeExceptionToLog(exception2); exception2.printStackTrace(); + if(connectionFailureCallback != null) { + connectionFailureCallback.doCallback(); + } } exception.printStackTrace(); @@ -101,11 +164,16 @@ public class SocketManager { packet.ChatDataIdentifier = DataIdentifier.LOGOUT; - new Thread(new MessageSender(packet.getDataStream())).start(); + BeWoLog.writeToLogFile("Schicke Logout-Packet an den TCP-Server. (logout)"); + new Thread(new MessageSender(packet.getDataStream())).start(); + //TODO: komplett beenden } catch(Exception exception) { + BeWoChatApplication.writeExceptionToLog(exception); exception.printStackTrace(); } + } else { + BeWoLog.writeToLogFile("Logout-Packet konnte nicht an den TCP-Server gesendet werden. (logout)"); } } @@ -117,19 +185,28 @@ public class SocketManager { packet.ChatMessage = getMACAddress(); packet.ChatDataIdentifier = DataIdentifier.LOGIN; + BeWoLog.writeToLogFile("Schicke Login-Packet an den TCP-Server. (loginOnServer)"); + new Thread(new MessageSender(packet.getDataStream())).start(); } catch(Exception exception) { + BeWoChatApplication.writeExceptionToLog(exception); exception.printStackTrace(); } + } else { + BeWoLog.writeToLogFile("Login-Packet konnte nicht an den TCP-Server gesendet werden. (loginOnServer)"); } } 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) { @@ -137,15 +214,16 @@ public class SocketManager { } } catch (IOException se) { + BeWoChatApplication.writeExceptionToLog(se); se.printStackTrace(); } } } - public static class MessageSender implements Runnable { + private static class MessageSender implements Runnable { byte[] packetToSend; - public MessageSender(byte[] packet2Send) { + MessageSender(byte[] packet2Send) { packetToSend = packet2Send; } @@ -153,35 +231,71 @@ public class SocketManager { public void run() { if(socket == null || !socket.isConnected()) { Log.e("MESSAGE_SENDER", "Socket ist nicht verbunden"); + BeWoLog.writeToLogFile("Socket ist nicht mit dem Server verbunden. (MessageSender)"); } - if(socket != null && dataOutputStream != null) { - try { - dataOutputStream.write(packetToSend); - dataOutputStream.flush(); - } catch (IOException e) { - try { - Packet packet = new Packet(new String(packetToSend, "UTF-8")); + if(ConnectivityReceiver.isConnected()) { + 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(); - if(packet.ChatDataIdentifier == DataIdentifier.MESSAGE || packet.ChatDataIdentifier == DataIdentifier.TEAM) { DatabaseHandler db = DatabaseHandler.getInstance(BeWoChatApplication.getInstance().getApplicationContext()); - ChatMessage undeliveredMessage = db.getChatMessageById(packet.ClientseitigeOid); - if(undeliveredMessage != null) { - undeliveredMessage.IsDelivered = false; - int affectedRows = db.updateChatMessage(undeliveredMessage); - } - } - } catch (UnsupportedEncodingException e1) { - e1.printStackTrace(); - } + Packet packet = new Packet(new String(packetToSend, "UTF-8")); - e.printStackTrace(); + ChatMessage sentMessage = db.getChatMessageById(packet.ClientseitigeOid); + + if(sentMessage != null) { + sentMessage.SendDate = Calendar.getInstance().getTime(); + int affectedRows = db.updateChatMessage(sentMessage); + Log.i("MESSAGE_SENDER", "SendDate wurde erfolgreich aktualisiert: " + (affectedRows == 1)); + } + } catch (IOException e) { + BeWoChatApplication.writeExceptionToLog(e); + + try { + Packet packet = new Packet(new String(packetToSend, "UTF-8")); + + if(packet.ChatDataIdentifier == DataIdentifier.MESSAGE || packet.ChatDataIdentifier == DataIdentifier.TEAM) { + DatabaseHandler db = DatabaseHandler.getInstance(BeWoChatApplication.getInstance().getApplicationContext()); + ChatMessage undeliveredMessage = db.getChatMessageById(packet.ClientseitigeOid); + if(undeliveredMessage != null) { + undeliveredMessage.IsDelivered = false; + int affectedRows = db.updateChatMessage(undeliveredMessage); + } + } + +// SocketManager.shutDownConnectionToServer("MessageSender->Socket ist nicht erreichbar."); + SocketManager.connectToServer("MessageSender beim gescheiterten Versenden einer Nachricht."); + } catch (UnsupportedEncodingException e1) { + BeWoChatApplication.writeExceptionToLog(e1); + e1.printStackTrace(); + } + + e.printStackTrace(); + } + } else { +// SocketManager.shutDownConnectionToServer("MessageSender->Socket und/oder OutputStream sind null"); + SocketManager.connectToServer("MessageSender. Socket und/oder OutputStream sind null"); + } + } else { + BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMilliseconds() + " Minuten. (MessageSender)"); + } + } else { + BeWoLog.writeToLogFile("Ist nicht mit dem Internet verbunden. (MessageSender)"); + + if(sendFailureCallback != null) { + BeWoLog.writeToLogFile("Führe sendFailureCallback aus. (MessageSender)"); + sendFailureCallback.doCallback(); } } } } - public static class SocketListener implements Runnable { + private static class SocketListener implements Runnable { Packet chatPacket; @@ -191,6 +305,8 @@ public class SocketManager { public void run() { try { while (isRunning) { + Thread.currentThread().sleep(1000); + Log.i("SOCKET_MANAGER", "Lausche..."); if (socket != null) { if (socket.isConnected()) { @@ -202,40 +318,65 @@ public class SocketManager { continue; } + BeWoChatApplication.lastOnlineTS = Calendar.getInstance().getTime(); + byte[] message = new byte[size]; stream.read(message, 0, size); try { chatPacket = new Packet(new String(message, "UTF-8")); - Log.i("SOCKET_LISTENER", "Erstelle Packet; " + (chatPacket.ChatMessage.isEmpty() ? "<>" : chatPacket.ChatMessage) + "; Typ: " + chatPacket.ChatDataIdentifier + ": " + new String(message, "UTF-8")); } catch(Exception e) { + BeWoChatApplication.writeExceptionToLog(e); e.printStackTrace(); } - if(chatPacket.ChatDataIdentifier.equals(DataIdentifier.LOGIN_SUCCESS) && loginCallback != null) { + if(chatPacket.ChatDataIdentifier.equals(DataIdentifier.LOGIN_SUCCESS)) { + loginInProgress = false; + + BeWoLog.writeToLogFile("Der Login am TCP-Server war erfolgreich. (SocketManager)"); Log.i(LOGTAG, "Der Login war erfolgreich"); - loginCallback.doCallback(); + if(initialLoginCallback != null) { + initialLoginCallback.doCallback(); + } + + if(loginCallback != null) { + loginCallback.doCallback(); + } + + if(loginCallback2 != null) { + loginCallback2.doCallback(); + } + + if(loginCallbackAfterConnectionLost != null) { + loginCallbackAfterConnectionLost.doCallback(); + } } - try { - switch (chatPacket.ChatDataIdentifier) { - case MESSAGE: + BeWoLog.writeToLogFile("Erhalte Packet mit Identifier: " + chatPacket.ChatDataIdentifier.name()); + Log.i("SOCKET_MANAGER", "Erhalte Packet mit Identifier: " + chatPacket.ChatDataIdentifier.name()); + switch (chatPacket.ChatDataIdentifier) { + case KEEP_ALIVE: + + break; + case MESSAGE: + BeWoLog.writeToLogFile("Empfange Nacahricht. (SocketManager)"); Log.i(LOGTAG, "Empfange Nacahricht"); - databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false)); + databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false, chatPacket.MessageId)); break; case TEAM: - - databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, true)); + BeWoLog.writeToLogFile("Empfange Team-Nacahricht. (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)"); ChatMessage cm = databaseHandler.getChatMessageById(chatPacket.ClientseitigeOid); cm.ServerseitigeOid = chatPacket.ServerseitigeOid; @@ -244,7 +385,7 @@ public class SocketManager { databaseHandler.updateChatMessage(cm); break; case STATUS_NOTIFICATION_LOGIN: - + BeWoLog.writeToLogFile("Benutzer " + chatPacket.ChatName + " ist jetzt online. (SocketManager)"); if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); } @@ -264,7 +405,7 @@ public class SocketManager { break; case STATUS_NOTIFICATION_LOGOUT: - + BeWoLog.writeToLogFile("Benutzer " + chatPacket.ChatName + " ist jetzt offline. (SocketManager)"); if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); } @@ -276,7 +417,7 @@ public class SocketManager { break; case STATUS_NOTIFICATION_LOGIN_BROADCAST: - + BeWoLog.writeToLogFile("Aktualisiere Onlinestatusliste. (SocketManager)"); String[] onlinePersons = chatPacket.ChatMessage.split(","); for (String onlinePerson : onlinePersons) { @@ -291,7 +432,7 @@ public class SocketManager { break; case STATUS_REQUEST: - + BeWoLog.writeToLogFile("Empfange eingeloggte User. (SocketManager)"); String contactsCsv = chatPacket.ChatMessage; String[] stringOids = contactsCsv.split(","); @@ -305,6 +446,7 @@ public class SocketManager { break; } } catch(Exception e) { + BeWoChatApplication.writeExceptionToLog(e); e.printStackTrace(); } @@ -314,15 +456,21 @@ public class SocketManager { Log.e("ERROR_SOCKETLISTENER", "uiHandler ist null"); } } + } else { + BeWoLog.writeToLogFile("Socket ist null. (SocketListener)"); + + isRunning = false; + connectToServer("SocketListener -> Socket ist null"); } } } catch(Exception exception) { + BeWoChatApplication.writeExceptionToLog(exception); exception.printStackTrace(); } } } - public static String getMACAddress() { + private static String getMACAddress() { try { List all = Collections.list(NetworkInterface.getNetworkInterfaces()); @@ -348,6 +496,7 @@ public class SocketManager { return res1.toString(); } } catch(Exception ex) { + BeWoChatApplication.writeExceptionToLog(ex); Log.e("GET_MAC_ADDRESS", ex.getMessage()); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java new file mode 100644 index 000000000..81f392493 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/BeWoLog.java @@ -0,0 +1,51 @@ +package util; + +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; + +/** + * Created by JettenM on 14.10.2016. + */ + +public class BeWoLog { + public static void writeToLogFile(String data) { + if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + Log.e("BEWOLOG", "Kein externes Speichermedium vorhanden."); + return; + } + + Date currentDate = Calendar.getInstance().getTime(); + DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS", Locale.GERMAN); + + String dateString = dateFormat.format(currentDate); + + File root = android.os.Environment.getExternalStorageDirectory(); + + File dir = new File(root.getAbsolutePath() + "/BeWo"); + dir.mkdirs(); + + File file = new File(dir, Util.LOGFILENAME); + try { + FileOutputStream fileOutputStream = new FileOutputStream(file, true); + PrintWriter printWriter = new PrintWriter(fileOutputStream); + + printWriter.println(dateString + ": " + data + "\n"); + + printWriter.flush(); + printWriter.close(); + fileOutputStream.close(); + } catch(IOException ioException) { + ioException.printStackTrace(); + } + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java index e2f165a39..b53936a6d 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java @@ -11,6 +11,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.Locale; import entities.ChatMessage; @@ -22,7 +23,7 @@ public class ChatMessageDeserializer implements JsonDeserializer { @Override public ChatMessage deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.GERMAN); JsonObject json = (JsonObject) jsonElement; @@ -30,6 +31,12 @@ public class ChatMessageDeserializer implements JsonDeserializer { int recipientPersonOid = Long.valueOf(json.get("EmpfängerPersonOid").getAsLong()).intValue(); int serverseitigeOid = Long.valueOf(json.get("Oid").getAsLong()).intValue(); String chatText = json.get("ChatText").getAsString(); + String messageId = null; + + boolean isMessageIdNull = json.get("MessageId").isJsonNull(); + if(!isMessageIdNull) { + messageId = json.get("MessageId").getAsString(); + } boolean isDelivered = json.get("IsDelivered").getAsBoolean(); @@ -47,7 +54,7 @@ public class ChatMessageDeserializer implements JsonDeserializer { e.printStackTrace(); } - ChatMessage result = new ChatMessage(senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam); + ChatMessage result = new ChatMessage(senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam, messageId); return result; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java index 449304e26..e75977def 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java @@ -28,10 +28,14 @@ public class ConnectivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + BeWoLog.writeToLogFile("ConnectivityReceiver hat Netzwerkstatusänderung bekommen"); + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + BeWoLog.writeToLogFile("Bin " + (networkInfo != null && networkInfo.isConnected() ? "online" : "offline")); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); if(networkInfo != null && networkInfo.isConnected()) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java index c34f58e96..de177ec29 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java @@ -12,6 +12,9 @@ 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; @@ -54,7 +57,6 @@ public class Util { //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; - //TODO: unterscheiden, ob es sich um eine einzelne Benachrichtigung handelt if(SocketManager.notificationEntities.keySet().size() >= 1) { conversationsCount = SocketManager.notificationEntities.keySet().size(); @@ -161,82 +163,6 @@ public class Util { alert.create().show(); } - public static void reconnectWithServer(boolean isConnected, final Context context) { - Log.e("UTIL", isConnected ? "Ist mit dem Internet/WLAN verbunden" : "Ist mit keinem Netzwerk verbunden"); - - if(isConnected) { - try { - SocketManager.loginCallback = new LoginCallback() { - @Override - public void doCallback() { - Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Verschicke nicht verschickte Nachrichten..."); - - sendUnsentMessages(context); - - sendStatusRequest(); - - // TODO: Nachrichten herunterladen, sofern man sich in der ChatActivity befindet - - } - }; - - SocketManager.connectToServer(); - - Log.i("RECONNECT_WITH_SERVER", "connectToServer aufgerufen..."); - } - catch(Exception es) { - Log.e("RECONNECT_WITH_SERVER", "Ausnahme beim Login nach Reconnect"); - es.printStackTrace(); - } - } - } - - public static void sendUnsentMessages(final Context context) { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try { - DatabaseHandler databaseHandler = DatabaseHandler.getInstance(context); - - ArrayList unsentMessages = databaseHandler.getUnsentChatMessages(); - - for(ChatMessage cm : unsentMessages) { - final Packet unsentPacket = new Packet(); - - unsentPacket.ChatDataIdentifier = cm.IsTeam ? DataIdentifier.TEAM : DataIdentifier.MESSAGE; - unsentPacket.ChatMessage = cm.ChatText; - unsentPacket.ChatName = SoapConnectionManager.User.getFullName(); - unsentPacket.RecipientPersonOid = cm.RecipientPersonOid; - unsentPacket.ClientseitigeOid = cm.Id; - unsentPacket.MessageTimeStamp = cm.InsTs; - unsentPacket.SenderPersonOid = cm.SenderPersonOid; - unsentPacket.Tenant = SoapConnectionManager.User.getTenant(); - unsentPacket.IsDelivered = cm.IsDelivered; - - SocketManager.sendMessage(unsentPacket); - - Thread.sleep(50); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); - - thread.start(); - } - - public static void sendStatusRequest() { - final Packet requestPacket = new Packet(); - - requestPacket.ChatDataIdentifier = DataIdentifier.STATUS_REQUEST; - requestPacket.ChatName = SoapConnectionManager.User.getFullName(); - requestPacket.SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue(); - requestPacket.Tenant = SoapConnectionManager.User.getTenant(); - - SocketManager.sendMessage(requestPacket); - } - public static ChatEntity getChatEntityFromOnlineEntitiesByOid(int personOid, boolean isTeam) { for(ChatEntity item : SocketManager.onlineEntities) { if(item.getOid() == personOid && item.getIsTeam() == isTeam) { @@ -283,4 +209,6 @@ 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/katze-web.png b/Android/BewoMitarbeiterApp/app/src/main/katze-web.png deleted file mode 100644 index 08ca5fb42..000000000 Binary files a/Android/BewoMitarbeiterApp/app/src/main/katze-web.png and /dev/null differ diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/noch_nicht_an_server_uebertragen.png b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/noch_nicht_an_server_uebertragen.png new file mode 100644 index 000000000..755ca4d59 Binary files /dev/null and b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/noch_nicht_an_server_uebertragen.png differ diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_main_activity_mitarbeiter.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_main_activity_mitarbeiter.xml deleted file mode 100644 index 133f0fec4..000000000 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_main_activity_mitarbeiter.xml +++ /dev/null @@ -1,41 +0,0 @@ - - -