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 @@
-
-
-
-
-
-
-
-
diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml
index 79022d76f..b7759bfa8 100644
--- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml
+++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml
@@ -3,38 +3,32 @@
-
-
-
-
-
+ android:layout_weight="1"
+ android:divider="@null"
+ android:listSelector="@android:color/transparent"
+ android:stackFromBottom="true"
+ android:background="@color/white"
+ android:transcriptMode="alwaysScroll"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ />
+ android:background="@color/white">
-
-
-
-
-
-
-
-
+
diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/splashscreen.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/splashscreen.xml
index 74292189b..c23737d3b 100644
--- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/splashscreen.xml
+++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/splashscreen.xml
@@ -9,11 +9,10 @@
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
android:src="@drawable/bslogo"
- android:scaleType="fitCenter" />
-
+ android:scaleType="fitCenter"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentStart="true"/>
\ No newline at end of file
diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/values-v21/styles.xml b/Android/BewoMitarbeiterApp/app/src/main/res/values-v21/styles.xml
index 0572f20bb..302247270 100644
--- a/Android/BewoMitarbeiterApp/app/src/main/res/values-v21/styles.xml
+++ b/Android/BewoMitarbeiterApp/app/src/main/res/values-v21/styles.xml
@@ -6,5 +6,7 @@
- @color/beyondsoft_orange
- @color/beyondsoft_orange
- ?android:attr/colorPrimary
+ - @color/beyondsoft_orange
+ - @color/beyondsoft_orange
\ No newline at end of file
diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/values/styles.xml b/Android/BewoMitarbeiterApp/app/src/main/res/values/styles.xml
index 040b9dd18..c05f40184 100644
--- a/Android/BewoMitarbeiterApp/app/src/main/res/values/styles.xml
+++ b/Android/BewoMitarbeiterApp/app/src/main/res/values/styles.xml
@@ -5,6 +5,7 @@
- @color/beyondsoft_orange
- @color/beyondsoft_orange
+ - @color/beyondsoft_orange
diff --git a/Android/BewoMitarbeiterApp/build.gradle b/Android/BewoMitarbeiterApp/build.gradle
index 74d945e88..eb6bdaa34 100644
--- a/Android/BewoMitarbeiterApp/build.gradle
+++ b/Android/BewoMitarbeiterApp/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.2.0'
+ classpath 'com.android.tools.build:gradle:2.2.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
diff --git a/Android/BewoMitarbeiterApp/gradle.properties b/Android/BewoMitarbeiterApp/gradle.properties
index 9b6ae2a0f..7b4fa68fe 100644
--- a/Android/BewoMitarbeiterApp/gradle.properties
+++ b/Android/BewoMitarbeiterApp/gradle.properties
@@ -11,7 +11,7 @@
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
-
+org.gradle.jvmargs=-Xmx2048m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
diff --git a/BeWo/ViewModel/ChatMessageVM.cs b/BeWo/ViewModel/ChatMessageVM.cs
index 6dd3a57c6..97472d9fc 100644
--- a/BeWo/ViewModel/ChatMessageVM.cs
+++ b/BeWo/ViewModel/ChatMessageVM.cs
@@ -13,6 +13,8 @@ namespace BeWo.ViewModel
public static string PropertyName_IstGelesen = "IstGelesen";
+ public static string PropertyName_MessageId = "MessageId";
+
private string _ChatText;
private DateTime _Uhrzeit;
@@ -27,12 +29,24 @@ namespace BeWo.ViewModel
private long? _TeamOid;
+ private string _MessageId;
public ChatMessageVM(ChatMessageDC pDC)
: base(pDC, true)
{
}
+ public virtual string MessageId
+ {
+ get { return _MessageId; }
+ set
+ {
+ if(AreDifferent(_MessageId, value))
+ {
+ _MessageId = value;
+ }
+ }
+ }
public virtual string ChatText
{
@@ -144,24 +158,26 @@ namespace BeWo.ViewModel
protected override void InitByDataContract(ChatMessageDC pDataContract)
{
- _SenderPersonOid = pDataContract.SenderPersonOid;
+ _SenderPersonOid = pDataContract.SenderPersonOid;
_EmpfängerPersonOid = pDataContract.EmpfängerPersonOid;
- _Uhrzeit = pDataContract.Uhrzeit;
- _ChatText = pDataContract.ChatText;
- _IsDelivered = pDataContract.IsDelivered;
- _IstGelesen = pDataContract.IstGelesen;
- _TeamOid = pDataContract.TeamOid;
+ _Uhrzeit = pDataContract.Uhrzeit;
+ _ChatText = pDataContract.ChatText;
+ _IsDelivered = pDataContract.IsDelivered;
+ _IstGelesen = pDataContract.IstGelesen;
+ _TeamOid = pDataContract.TeamOid;
+ _MessageId = pDataContract.MessageId;
}
protected override ChatMessageDC MapToDataContract(ChatMessageDC pDataContract, bool doCommit)
{
- pDataContract.SenderPersonOid = _SenderPersonOid;
+ pDataContract.SenderPersonOid = _SenderPersonOid;
pDataContract.EmpfängerPersonOid = _EmpfängerPersonOid;
- pDataContract.Uhrzeit = _Uhrzeit;
- pDataContract.ChatText = _ChatText;
- pDataContract.IsDelivered = _IsDelivered;
- pDataContract.IstGelesen = _IstGelesen;
- pDataContract.TeamOid = _TeamOid;
+ pDataContract.Uhrzeit = _Uhrzeit;
+ pDataContract.ChatText = _ChatText;
+ pDataContract.IsDelivered = _IsDelivered;
+ pDataContract.IstGelesen = _IstGelesen;
+ pDataContract.TeamOid = _TeamOid;
+ pDataContract.MessageId = _MessageId;
return pDataContract;
}
diff --git a/BeWoChatServer/Server.cs b/BeWoChatServer/Server.cs
index 733a4c2dc..98d16cbc4 100644
--- a/BeWoChatServer/Server.cs
+++ b/BeWoChatServer/Server.cs
@@ -139,8 +139,16 @@ namespace BeWoChatServer
dataPacket.GetData(message);
}
+ else
+ {
+ Console.WriteLine("dataPacket ist korrupt: " + dataPacket);
+ }
+
+ switch(dataPacket.DataIdentifier) {
+ case DataIdentifier.KeepAlive:
+
+ break;
- switch(dataPacket.DataIdentifier) {
case DataIdentifier.Login:
try
{
@@ -167,11 +175,21 @@ namespace BeWoChatServer
clientList[dataPacket.Socket].MacAddress = dataPacket.ChatMessage;
}
- var notificationPacket = new Packet(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, 0, dataPacket.IsEmployee) { DataIdentifier = DataIdentifier.StatusNotificationLogin, Tenant = dataPacket.Tenant };
+ var notificationPacket = new Packet(
+ dataPacket.Socket,
+ dataPacket.ClientName,
+ dataPacket.SenderPersonOid,
+ 0,
+ dataPacket.IsEmployee)
+ {
+ DataIdentifier = DataIdentifier.StatusNotificationLogin,
+ Tenant = dataPacket.Tenant
+ };
Console.WriteLine(DateTime.Now + ": Benachrichtige die anderen angemeldeten Clients. Alte Logins enthalten: " + alteLogins);
foreach (var client in clientList.Where(w => !w.Value.PersonOid.Equals(dataPacket.SenderPersonOid)))
{
+ Console.WriteLine("Sende Login-Benachrichtigung an " + client.Value.MacAddress + " mit PersonOid " + client.Value.PersonOid);
client.Key.Send(notificationPacket.GetDataStream());
}
@@ -246,7 +264,7 @@ namespace BeWoChatServer
{
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.DarkYellow;
- Console.WriteLine(DateTime.Now + ": Chat-Nachricht erhalten: " + dataPacket.ChatMessage);
+ Console.WriteLine(DateTime.Now + ": Chat-Nachricht erhalten: " + dataPacket.MessageTimeStamp.ToString("dd.MM.yyyy HH:mm:ss"));
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.Gray;
@@ -256,15 +274,16 @@ namespace BeWoChatServer
var chatMessage = new ChatMessage
{
- SenderPersonOid = dataPacket.SenderPersonOid,
- ChatText = Encoding.UTF8.GetBytes(dataPacket.ChatMessage),
+ SenderPersonOid = dataPacket.SenderPersonOid,
+ ChatText = Encoding.UTF8.GetBytes(dataPacket.ChatMessage),
EmpfaengerPersonOid = dataPacket.RecipientPersonOid,
- Uhrzeit = DateTime.Now,
- InsUser = dataPacket.ClientName,
- IsDelivered = true
+ Uhrzeit = DateTime.Now,
+ InsUser = dataPacket.ClientName,
+ IsDelivered = true,
+ MessageId = dataPacket.MessageId
};
- Console.WriteLine(DateTime.Now + ": Speichere die Chat-Nachricht in die Datenbank");
+ Console.WriteLine(DateTime.Now + ": Speichere die Chat-Nachricht in der Datenbank");
DAOFactory.GenericDAO.Insert(chatMessage);
if(chatMessage.Oid != null)
@@ -290,7 +309,9 @@ namespace BeWoChatServer
{
ClientseitigeOid = dataPacket.ClientseitigeOid,
ServerseitigeOid = dataPacket.ServerseitigeOid,
- DataIdentifier = DataIdentifier.MessageResponse
+ DataIdentifier = DataIdentifier.MessageResponse,
+ MessageTimeStamp = chatMessage.Uhrzeit,
+ MessageId = dataPacket.MessageId
};
Console.WriteLine(DateTime.Now + ": Sende Datenbank-Insert-Bestätigung an den Absender, damit die Nachricht später nicht doppelt auf den Client heruntergeladen wird");
@@ -339,7 +360,9 @@ namespace BeWoChatServer
EmpfaengerPersonOid = dataPacket.RecipientPersonOid,
Uhrzeit = dataPacket.MessageTimeStamp,
InsUser = dataPacket.ClientName,
- TeamOid = dataPacket.RecipientPersonOid
+ TeamOid = dataPacket.RecipientPersonOid,
+ IsDelivered = true,
+ MessageId = dataPacket.MessageId
};
var team = DAOFactory.GenericDAO.LoadByID(dataPacket.RecipientPersonOid);
@@ -365,7 +388,8 @@ namespace BeWoChatServer
{
ClientseitigeOid = dataPacket.ClientseitigeOid,
ServerseitigeOid = dataPacket.ServerseitigeOid,
- DataIdentifier = DataIdentifier.MessageResponse
+ DataIdentifier = DataIdentifier.MessageResponse,
+ MessageId = dataPacket.MessageId
};
Console.WriteLine(DateTime.Now + ": Sende Datenbank-Insert-Bestätigung an den Absender, damit die Nachricht später nicht doppelt auf den Client heruntergeladen wird");
diff --git a/BeWoPlanerAndroid/AndroidSoapService.asmx.cs b/BeWoPlanerAndroid/AndroidSoapService.asmx.cs
index 582de0a61..839b0e5fb 100644
--- a/BeWoPlanerAndroid/AndroidSoapService.asmx.cs
+++ b/BeWoPlanerAndroid/AndroidSoapService.asmx.cs
@@ -96,17 +96,19 @@ namespace BeWoPlanerAndroid
[WebMethod(EnableSession = true)]
public string GetAllChatMessagesForSenderAndRecipient(long pSenderPersonOid, long pRecipientPersonOid, string pExceptions, bool pIsForTeam)
{
- var exceptions = new List();
+ Debug.WriteLine("Lade alle Nachrichten für einen Chat herunter.");
+
+ var exceptions = new List();
if (pExceptions.Length > 0)
{
var splittedString = pExceptions.Split(';');
- exceptions = splittedString.Select(item => Convert.ToInt64(item)).ToList();
+ exceptions = splittedString.ToList();
}
var jsonMessages = new List();
- var messages = DAOFactory.SearchDAO.FindAllChatMessagesForAndroid(pSenderPersonOid, pRecipientPersonOid, exceptions, pIsForTeam).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs)));
+ var messages = DAOFactory.SearchDAO.FindAllChatMessagesForAndroid(pSenderPersonOid, pRecipientPersonOid, exceptions, pIsForTeam).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs, dfe.MessageId)));
return JsonConvert.SerializeObject(jsonMessages);
}
@@ -115,7 +117,7 @@ namespace BeWoPlanerAndroid
public string GetNewestMessages(long pRecipientPersonOid)
{
var jsonMessages = new List();
- var liste = DAOFactory.SearchDAO.FindNewestChatMessages(pRecipientPersonOid).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs)));
+ var liste = DAOFactory.SearchDAO.FindNewestChatMessages(pRecipientPersonOid).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs, dfe.MessageId)));
return JsonConvert.SerializeObject(jsonMessages);
}
@@ -181,6 +183,16 @@ namespace BeWoPlanerAndroid
return "lebt";
}
+ [WebMethod(EnableSession = true)]
+ public string CheckChatMessagesByUUIDs(string messageIds)
+ {
+ var splittet = messageIds.Split(";").ToList();
+
+ var existingMessageIds = (DAOFactory.SearchDAO.FindChatMessageIds(splittet) ?? new List()).ToList();
+
+ return JsonConvert.SerializeObject(existingMessageIds);
+ }
+
public class ChatPerson
{
public long Oid { get; set; }
@@ -220,8 +232,9 @@ namespace BeWoPlanerAndroid
public long? TeamOid { get; set; }
public long? Oid { get; set; }
public DateTime? InsTs { get; set; }
+ public string MessageId { get; set; }
- public ChatMessageForJson(long? pRecipientOid, long? pSenderOid, bool pIsDelivered, int pIstGelesen, long? pTeamOid, byte[] pChatTextAsBytes, DateTime pUhrzeit, long? pOid, DateTime? pInsTs)
+ public ChatMessageForJson(long? pRecipientOid, long? pSenderOid, bool pIsDelivered, int pIstGelesen, long? pTeamOid, byte[] pChatTextAsBytes, DateTime pUhrzeit, long? pOid, DateTime? pInsTs, string pMessageId)
{
EmpfängerPersonOid = pRecipientOid;
SenderPersonOid = pSenderOid;
@@ -232,6 +245,7 @@ namespace BeWoPlanerAndroid
ChatText = Encoding.UTF8.GetString(pChatTextAsBytes);
Oid = pOid;
InsTs = pInsTs;
+ MessageId = pMessageId;
}
}
}
diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs
index 59ff192ae..4c603b1de 100644
--- a/Data/Access/SearchDAO.cs
+++ b/Data/Access/SearchDAO.cs
@@ -11,6 +11,7 @@ using NHibernate.SqlCommand;
using BS.Shared.Core;
using BS.Shared;
using BS.Shared.DataContracts.Compact;
+using NHibernate.Linq.Functions;
using NHibernate.Transform;
using Login = BeWo.Data.Entities.Login;
@@ -1607,7 +1608,7 @@ namespace BeWo.Data.Access
return c.List();
}
- public IEnumerable FindAllChatMessagesForAndroid(long pSenderOid, long pRecipientOid, List pExceptions, bool pForTeam)
+ public IEnumerable FindAllChatMessagesForAndroid(long pSenderOid, long pRecipientOid, List pExceptions, bool pForTeam)
{
var c = CreateCriteriaIsActive()
.Add(
@@ -1618,26 +1619,26 @@ namespace BeWo.Data.Access
Restrictions.And(
Restrictions.Eq(ChatMessage.PropertyName_SenderPersonOid, pRecipientOid),
Restrictions.Eq(ChatMessage.PropertyName_EmpfaengerPersonOid, pSenderOid))))
- .Add(Restrictions.Not(Restrictions.In(BeWoEntityBase.PropertyName_Oid, pExceptions)))
+ .Add(Restrictions.Not(Restrictions.In(ChatMessage.PropertyName_MessageId, pExceptions)))
.Add(Restrictions.IsNull(ChatMessage.PropertyName_TeamOid));
if(pForTeam)
{
c = CreateCriteriaIsActive()
.Add(Restrictions.Eq(ChatMessage.PropertyName_TeamOid, pRecipientOid))
- .Add(Restrictions.Not(Restrictions.In(BeWoEntityBase.PropertyName_Oid, pExceptions)));
+ .Add(Restrictions.Not(Restrictions.In(ChatMessage.PropertyName_MessageId, pExceptions)));
}
return c.List();
}
- public IEnumerable FindAllUnreadChatMessages(List pExceptions)
- {
- var c = CreateCriteriaIsActive()
- .Add(Restrictions.Not(Restrictions.In(BeWoEntityBase.PropertyName_Oid, pExceptions)));
+ //public IEnumerable FindAllUnreadChatMessages(List pExceptions)
+ //{
+ // var c = CreateCriteriaIsActive()
+ // .Add(Restrictions.Not(Restrictions.In(ChatMessage.PropertyName_MessageId, pExceptions)));
- return c.List();
- }
+ // return c.List();
+ //}
public Dictionary FindAllChatAuthorizedPersonsForEmployee(long pEmployeeOid)
{
@@ -1674,10 +1675,22 @@ namespace BeWo.Data.Access
public IEnumerable FindNewestChatMessages(long pRecipientPersonOid)
{
- var query = Session.CreateSQLQuery(string.Format("SELECT MAX({0}) FROM chatmessages WHERE {1} = {2} AND {3} IS NULL OR {3} IS NOT NULL AND {1} IN (SELECT t.{0} FROM Team t JOIN employee2team e ON e.{3} WHERE e.{4} = {2}) GROUP BY {1}, {5}", BeWoEntityBase.PropertyName_Oid, ChatMessage.PropertyName_EmpfaengerPersonOid, pRecipientPersonOid, "TeamOid", "EmployeeOid", ChatMessage.PropertyName_SenderPersonOid));
- var result = query.List();
+ var query2 = Session.CreateSQLQuery(string.Format("SELECT MAX({0}) FROM chatmessages WHERE ({1} = {2} OR {3} = {2}) AND {4} IS NULL OR {4} IS NOT NULL AND {1} IN (SELECT t.{0} FROM Team t JOIN employee2team e ON e.{4} = t.{0}) GROUP BY {1}, {3}",
+ BeWoEntityBase.PropertyName_Oid, ChatMessage.PropertyName_EmpfaengerPersonOid, pRecipientPersonOid, ChatMessage.PropertyName_SenderPersonOid, "TeamOid"));
+
+ var result = query2.List();
return result.Count > 0 ? DAOFactory.GenericDAO.LoadByIDs(result) : new List();
}
+
+ public IEnumerable FindChatMessageIds(List messageIds)
+ {
+ var c = CreateCriteria()
+ .Add(Restrictions.In(ChatMessage.PropertyName_MessageId, messageIds));
+
+ var liste = c.List();
+
+ return liste.Select(s => s.MessageId);
+ }
}
}
diff --git a/Data/Entities/ChatMessage.cs b/Data/Entities/ChatMessage.cs
index f0e45bd9f..1d15874f5 100644
--- a/Data/Entities/ChatMessage.cs
+++ b/Data/Entities/ChatMessage.cs
@@ -19,6 +19,8 @@ namespace BeWo.Data.Entities
public static string PropertyName_IstGelesen = "IstGelesen";
+ public static string PropertyName_MessageId = "MessageId";
+
private byte[] _ChatText;
private long? _EmpfaengerPersonOid;
@@ -31,6 +33,8 @@ namespace BeWo.Data.Entities
private long? _TeamOid;
+ private string _MessageId;
+
private DateTime _Uhrzeit;
public ChatMessage()
@@ -38,6 +42,18 @@ namespace BeWo.Data.Entities
_Tid = TableID.ChatMessage;
}
+ public virtual string MessageId
+ {
+ get { return _MessageId; }
+ set
+ {
+ if(AreDifferent(_MessageId, value))
+ {
+ _MessageId = value;
+ }
+ }
+ }
+
public virtual byte[] ChatText
{
get { return _ChatText; }
diff --git a/Data/Mappings/ChatMessage.hbm.xml b/Data/Mappings/ChatMessage.hbm.xml
index d022408f4..08914cc67 100644
--- a/Data/Mappings/ChatMessage.hbm.xml
+++ b/Data/Mappings/ChatMessage.hbm.xml
@@ -1,25 +1,26 @@

-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Model/changes 16-10-17.sql b/Model/changes 16-10-17.sql
new file mode 100644
index 000000000..d3185cb11
--- /dev/null
+++ b/Model/changes 16-10-17.sql
@@ -0,0 +1 @@
+ALTER TABLE chatmessages ADD COLUMN `MessageId` VARCHAR(1024) DEFAULT NULL;
\ No newline at end of file
diff --git a/Service/DCEntityMapper/ChatMessageDC_ChatMessage.cs b/Service/DCEntityMapper/ChatMessageDC_ChatMessage.cs
index 8310d91fd..a0b8f80d7 100644
--- a/Service/DCEntityMapper/ChatMessageDC_ChatMessage.cs
+++ b/Service/DCEntityMapper/ChatMessageDC_ChatMessage.cs
@@ -15,19 +15,21 @@ namespace BeWo.Service.DCEntityMapper
pDataContract.IsDelivered = pEntity.IsDelivered;
pDataContract.IstGelesen = pEntity.IstGelesen;
pDataContract.TeamOid = pEntity.TeamOid;
+ pDataContract.MessageId = pEntity.MessageId;
return pDataContract;
}
public override ChatMessage MergeWithEntity(ChatMessageDC pDataContract, ChatMessage pEntity)
{
- pEntity.SenderPersonOid = pDataContract.SenderPersonOid;
+ pEntity.SenderPersonOid = pDataContract.SenderPersonOid;
pEntity.EmpfaengerPersonOid = pDataContract.EmpfängerPersonOid;
- pEntity.Uhrzeit = pDataContract.Uhrzeit;
- pEntity.IsDelivered = pDataContract.IsDelivered;
- pEntity.ChatText = System.Text.Encoding.Default.GetBytes(pDataContract.ChatText);
- pEntity.IstGelesen = pDataContract.IstGelesen;
- pEntity.TeamOid = pDataContract.TeamOid;
+ pEntity.Uhrzeit = pDataContract.Uhrzeit;
+ pEntity.IsDelivered = pDataContract.IsDelivered;
+ pEntity.ChatText = System.Text.Encoding.Default.GetBytes(pDataContract.ChatText);
+ pEntity.IstGelesen = pDataContract.IstGelesen;
+ pEntity.TeamOid = pDataContract.TeamOid;
+ pEntity.MessageId = pDataContract.MessageId;
return pEntity;
}
diff --git a/Shared/BeWoEntityEnums.cs b/Shared/BeWoEntityEnums.cs
index 3e19dbb97..0fe0d36d6 100644
--- a/Shared/BeWoEntityEnums.cs
+++ b/Shared/BeWoEntityEnums.cs
@@ -839,7 +839,8 @@ namespace BS.Shared
StatusNotificationOnline,
StatusNotificationOffline,
LoginSuccess,
- StatusRequest
+ StatusRequest,
+ KeepAlive
}
public enum ChatType
diff --git a/Shared/DataContracts/ChatMessageDC.cs b/Shared/DataContracts/ChatMessageDC.cs
index b039d01df..6bf715c22 100644
--- a/Shared/DataContracts/ChatMessageDC.cs
+++ b/Shared/DataContracts/ChatMessageDC.cs
@@ -29,5 +29,8 @@ namespace BS.Shared.DataContracts
[DataMember]
public long? TeamOid { get; set; }
+
+ [DataMember]
+ public string MessageId { get; set; }
}
}
\ No newline at end of file
diff --git a/Shared/Packet.cs b/Shared/Packet.cs
index b4b294b34..3384f9b70 100644
--- a/Shared/Packet.cs
+++ b/Shared/Packet.cs
@@ -8,23 +8,27 @@ namespace BS.Shared
{
public class Packet
{
- // Fehlercodes zwischen 1500 und 1999
+ // Fehlercodes zwischen 1500 und 1999
public Socket Socket { get; set; }
public string ClientName { get; set; }
public long SenderPersonOid { get; set; }
public long RecipientPersonOid { get; set; }
public DataIdentifier DataIdentifier { get; set; }
public string ChatMessage { get; set; }
+ public byte[] SoundDatei { get; set; }
+ public byte[] DokumentenDatei { get; set; }
+ public byte[] BildDatei { get; set; }
public DateTime MessageTimeStamp { get; set; }
public string Tenant { get; set; }
public bool IsDelivered { get; set; }
public long ServerseitigeOid { get; set; }
public long ClientseitigeOid { get; set; }
public bool IsEmployee { get; set; }
+ public string MessageId { get; set; }
public byte[] DataBuffer = new byte[1024];
- //Aufbau Message:
+ // Aufbau Message:
// die ersten fünf ";" ignorieren
// SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;Tenant;[ClientName][ChatMessage][MessageTimeStamp]
@@ -40,6 +44,7 @@ namespace BS.Shared
ChatMessage = "";
Tenant = "";
IsEmployee = pIsEmployee;
+ MessageId = "";
}
public Packet()
@@ -67,6 +72,10 @@ namespace BS.Shared
var clientseitigeOidString = gesplittet[6];
Tenant = gesplittet[7];
var isEmployeeString = gesplittet[8];
+ MessageId = gesplittet[9];
+ //var SoundDateiAsString = gesplittet[10];
+ //var DokumentenDateiAsString = gesplittet[11];
+ //var BildDateiAsString = gesplittet[12];
DataIdentifier = (DataIdentifier) Convert.ToInt32(chatIdentifierString);
@@ -74,12 +83,12 @@ namespace BS.Shared
RecipientPersonOid = Convert.ToInt64(recipientPersonOidString);
ServerseitigeOid = Convert.ToInt64(serverseitigeOidString);
ClientseitigeOid = Convert.ToInt64(clientseitigeOidString);
- IsEmployee = Convert.ToBoolean(isEmployeeString);
+ IsEmployee = Convert.ToInt32(isEmployeeString) == 1;
var chatNameLength = Convert.ToInt32(chatNameLengthString);
var chatMessageLength = Convert.ToInt32(chatMessageLengthString);
- var headerLength = senderPersonOidString.Length + recipientPersonOidString.Length + chatNameLengthString.Length + chatMessageLengthString.Length + chatIdentifierString.Length + Tenant.Length + serverseitigeOidString.Length + clientseitigeOidString.Length + 10;
+ var headerLength = senderPersonOidString.Length + recipientPersonOidString.Length + chatNameLengthString.Length + chatMessageLengthString.Length + chatIdentifierString.Length + Tenant.Length + serverseitigeOidString.Length + clientseitigeOidString.Length + MessageId.Length + 12;
var actualMessage = message.Substring(headerLength - 1);
ClientName = actualMessage.Substring(0, chatNameLength);
@@ -103,7 +112,7 @@ namespace BS.Shared
{
var result = "";
- result += SenderPersonOid + ";" + RecipientPersonOid + ";" + ClientName.Length + ";" + ChatMessage.Length + ";" + (int) DataIdentifier + ";" + ServerseitigeOid + ";" + ClientseitigeOid + ";" + Tenant + ";" + (IsEmployee ? 1 : 0) + ";" + ClientName + ChatMessage + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + "" + (IsDelivered ? 1 : 0);
+ result += SenderPersonOid + ";" + RecipientPersonOid + ";" + ClientName.Length + ";" + ChatMessage.Length + ";" + (int)DataIdentifier + ";" + ServerseitigeOid + ";" + ClientseitigeOid + ";" + Tenant + ";" + (IsEmployee ? 1 : 0) + ";" + MessageId + ";" + ClientName + ChatMessage + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + "" + (IsDelivered ? 1 : 0);
Debug.WriteLine("Verschicke Paket: " + result);