Packet geändert.

This commit is contained in:
staccatomamba
2016-10-21 09:41:14 +02:00
parent 317ca51f35
commit 5c497a9cc1
49 changed files with 1630 additions and 686 deletions

View File

@@ -1 +0,0 @@
BewoKlientenApp

View File

@@ -3,20 +3,16 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="distributionType" value="LOCAL" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="C:\Program Files\Android\Android Studio\gradle\gradle-2.14.1" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="myModules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>

View File

@@ -10,7 +10,7 @@
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@@ -32,12 +32,14 @@
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
@@ -64,14 +66,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
@@ -80,6 +74,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
@@ -92,6 +94,7 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />

View File

@@ -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
}

View File

@@ -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

View File

@@ -66,14 +66,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
@@ -82,11 +74,21 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/21.0.3/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/multidex-instrumentation/1.0.1/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/multidex/1.0.1/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/21.0.3/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
@@ -97,6 +99,8 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/multi-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
@@ -109,8 +113,10 @@
</content>
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" scope="TEST" name="multidex-instrumentation-1.0.1" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />
<orderEntry type="library" exported="" name="ksoap2-android-assembly-3.6.0-jar-with-dependencies" level="project" />
<orderEntry type="library" exported="" name="multidex-1.0.1" level="project" />
<orderEntry type="library" exported="" name="gson-2.6.2" level="project" />
<orderEntry type="library" exported="" name="volley" level="project" />
<orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />

View File

@@ -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

View File

@@ -4,6 +4,8 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
@@ -17,7 +19,7 @@
android:theme="@android:style/Theme.NoTitleBar"
android:configChanges="orientation"
android:screenOrientation="portrait"
android:launchMode="singleTop">
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

View File

@@ -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<ChatMessage> 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<Integer> getExistingChatMessageIds() {
ArrayList<Integer> result = new ArrayList<Integer>();
public ArrayList<String> getExistingChatMessageUUIDs() {
ArrayList<String> 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<Integer> getExistingTeamChatMessageIds() {
ArrayList<Integer> result = new ArrayList<Integer>();
public ArrayList<String> getExistingTeamChatMessageUUIDs() {
ArrayList<String> result = new ArrayList<String>();
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<ChatMessage> getUnsentChatMessages() {
BeWoLog.writeToLogFile("Lade unverschickte Nachrichten aus der Datenbank. (getUnsentMessages)");
ArrayList<ChatMessage> 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<ChatMessage> getChatMessagesByMessageIds(ArrayList<String> messageIds) {
String abc = "";
for(String mid : messageIds) {
abc += messageIds;
if(messageIds.indexOf(mid) != (messageIds.size() - 1)) {
abc += "\n";
}
}
BeWoLog.writeToLogFile(abc);
ArrayList<ChatMessage> 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;
}
}

View File

@@ -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<PropertyInfo>());
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<SoapPrimitive> {
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<ArrayList<String>>(){}.getType();
final ArrayList<String> 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<ChatMessage> 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<ChatMessage> unsentMessages = databaseHandler.getUnsentChatMessages();
ArrayList<ChatMessage> 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<PropertyInfo> 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);
}
}

View File

@@ -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<Integer> test = isTeam ? databaseHandler.getExistingTeamChatMessageIds() : databaseHandler.getExistingChatMessageIds();
ArrayList<String> 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<PropertyInfo> 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<SoapPrimitive> {
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<PropertyInfo> 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<SoapPrimitive> {
@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<ChatMessage> DATE_COMPARATOR = new Comparator<ChatMessage>() {
@Override
public int compare(ChatMessage lhs, ChatMessage rhs) {
return lhs.InsTs.getTime() > rhs.InsTs.getTime() ? 0 : 1;
return lhs.compareTo(rhs);
}
};
}

View File

@@ -75,17 +75,13 @@ public class KontaktAdapter extends ArrayAdapter<ContactListItem> {
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));

View File

@@ -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<ContactListItem> 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<PropertyInfo> 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<PropertyInfo> 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<PropertyInfo> 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<PropertyInfo> 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<PropertyInfo> 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<PropertyInfo> 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<ArrayList<ChatPerson>>(){}.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<ChatEntity, Integer> 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<SoapPrimitive> {
@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();
}
});
}
}
}
}
}

View File

@@ -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<SoapPrimitive> {
public final class JsonSoapPrimitiveRequestListener implements RequestListener<SoapPrimitive> {
@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() {
}
}

View File

@@ -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);
}
}

View File

@@ -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<ChatMessage> {
private Activity activity;
//private List<ChatMessage> messages;
public ArrayList<ChatMessage> messages;
public MessageAdapter(Activity context, int resource, List<ChatMessage> 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<ChatMessage> {
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<ChatMessage> {
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<ChatMessage> {
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<ChatMessage> {
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);
}
}
}

View File

@@ -7,7 +7,7 @@ import java.util.Locale;
/**
* Created by JettenM on 26.07.2016.
*/
public class ChatMessage {
public class ChatMessage implements Comparable<ChatMessage> {
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;
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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";

View File

@@ -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<Integer> onlinePersonOids = new ArrayList<>();
public static ArrayList<ChatEntity> onlineEntities = new ArrayList<>();
public static HashMap<ChatEntity, NotificationLog> 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() ? "<<LEER>>" : 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<NetworkInterface> 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());
}

View File

@@ -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();
}
}
}

View File

@@ -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<ChatMessage> {
@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<ChatMessage> {
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<ChatMessage> {
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;
}

View File

@@ -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()) {

View File

@@ -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<ChatMessage> 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";
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -1,41 +0,0 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivityMitarbeiter"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Chat"
android:id="@+id/Chatbutton"
android:layout_marginTop="54dp"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Doku"
android:id="@+id/Dokubutton"
android:layout_below="@+id/Chatbutton"
android:layout_alignParentStart="true"
android:layout_marginTop="120dp"
android:layout_alignEnd="@+id/Chatbutton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Logout"
android:id="@+id/Logoutbutton"
android:layout_below="@+id/Dokubutton"
android:layout_alignParentStart="true"
android:layout_marginTop="120dp"
android:layout_alignParentEnd="true" />
</RelativeLayout>

View File

@@ -3,38 +3,32 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="0dp"
android:orientation="vertical"
android:background="@color/white"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".ChatActivity">
<LinearLayout
<ListView
android:id="@+id/list_msg"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.9"
android:background="@color/white">
<ListView
android:id="@+id/list_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
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"
/>
</LinearLayout>
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"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="22dp"
android:layout_weight="0.1"
android:layout_height="60dp"
android:minHeight="50dp"
android:padding="0dp"
android:background="@android:color/white">
android:background="@color/white">
<EditText
android:layout_width="0dp"

View File

@@ -34,14 +34,15 @@
android:paddingBottom="5dp"
android:textColor="@android:color/black"/>
<!-- 5 dp-->
<!--<TextView-->
<!--android:id="@+id/txt_msg_tick"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="match_parent"-->
<!--android:gravity="end"-->
<!--android:padding="5dp"-->
<!--android:textColor="@android:color/holo_blue_light"/>-->
<ImageView
android:id="@+id/pending_msg_img"
android:src="@drawable/noch_nicht_an_server_uebertragen"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="end"
android:padding="5dp"
android:visibility="visible"
/>
</LinearLayout>

View File

@@ -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"/>
</RelativeLayout>

View File

@@ -6,5 +6,7 @@
<item name="colorPrimary">@color/beyondsoft_orange</item>
<item name="colorAccent">@color/beyondsoft_orange</item>
<item name="android:statusBarColor">?android:attr/colorPrimary</item>
<item name="android:navigationBarColor">@color/beyondsoft_orange</item>
<item name="android:colorForeground">@color/beyondsoft_orange</item>
</style>
</resources>

View File

@@ -5,6 +5,7 @@
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/beyondsoft_orange</item>
<item name="colorAccent">@color/beyondsoft_orange</item>
<item name="android:colorForeground">@color/beyondsoft_orange</item>
</style>
<!--<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">-->

View File

@@ -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
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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<Team>(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");

View File

@@ -96,17 +96,19 @@ namespace BeWoPlanerAndroid
[WebMethod(EnableSession = true)]
public string GetAllChatMessagesForSenderAndRecipient(long pSenderPersonOid, long pRecipientPersonOid, string pExceptions, bool pIsForTeam)
{
var exceptions = new List<long>();
Debug.WriteLine("Lade alle Nachrichten für einen Chat herunter.");
var exceptions = new List<string>();
if (pExceptions.Length > 0)
{
var splittedString = pExceptions.Split(';');
exceptions = splittedString.Select(item => Convert.ToInt64(item)).ToList();
exceptions = splittedString.ToList();
}
var jsonMessages = new List<ChatMessageForJson>();
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<ChatMessageForJson>();
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<string>()).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;
}
}
}

View File

@@ -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<CustomerAPPCode>();
}
public IEnumerable<ChatMessage> FindAllChatMessagesForAndroid(long pSenderOid, long pRecipientOid, List<long> pExceptions, bool pForTeam)
public IEnumerable<ChatMessage> FindAllChatMessagesForAndroid(long pSenderOid, long pRecipientOid, List<string> pExceptions, bool pForTeam)
{
var c = CreateCriteriaIsActive<ChatMessage>()
.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<ChatMessage>()
.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<ChatMessage>();
}
public IEnumerable<ChatMessage> FindAllUnreadChatMessages(List<long> pExceptions)
{
var c = CreateCriteriaIsActive<ChatMessage>()
.Add(Restrictions.Not(Restrictions.In(BeWoEntityBase.PropertyName_Oid, pExceptions)));
//public IEnumerable<ChatMessage> FindAllUnreadChatMessages(List<long> pExceptions)
//{
// var c = CreateCriteriaIsActive<ChatMessage>()
// .Add(Restrictions.Not(Restrictions.In(ChatMessage.PropertyName_MessageId, pExceptions)));
return c.List<ChatMessage>();
}
// return c.List<ChatMessage>();
//}
public Dictionary<Person, bool> FindAllChatAuthorizedPersonsForEmployee(long pEmployeeOid)
{
@@ -1674,10 +1675,22 @@ namespace BeWo.Data.Access
public IEnumerable<ChatMessage> 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<long>();
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<long>();
return result.Count > 0 ? DAOFactory.GenericDAO.LoadByIDs<ChatMessage>(result) : new List<ChatMessage>();
}
public IEnumerable<string> FindChatMessageIds(List<string> messageIds)
{
var c = CreateCriteria<ChatMessage>()
.Add(Restrictions.In(ChatMessage.PropertyName_MessageId, messageIds));
var liste = c.List<ChatMessage>();
return liste.Select(s => s.MessageId);
}
}
}

View File

@@ -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; }

View File

@@ -1,25 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="BeWo.Data.Entities.ChatMessage,BeWo.Data" table="chatmessages">
<class name="BeWo.Data.Entities.ChatMessage, BeWo.Data" table="chatmessages">
<id name="Oid" column ="Oid" unsaved-value="null">
<generator class="identity" />
</id>
<version type="Int64" column="Version" name="Version" />
<property name="SenderPersonOid" column="SenderPersonOid" />
<property name="EmpfaengerPersonOid" column="EmpfaengerPersonOid" />
<property name="InsTs" />
<property name="InsUser" />
<property name="SenderPersonOid" column="SenderPersonOid" />
<property name="EmpfaengerPersonOid" column="EmpfaengerPersonOid" />
<property name="InsTs" />
<property name="InsUser" />
<property column="Tid" type="BS.Shared.TableID, BS.Shared" name="_Tid" access="field" />
<property name="UdpUser" />
<property name="IsActive" type="BS.Shared.ActivationTypeId, BS.Shared" />
<property name="SystemEntryID" type="BS.Shared.SystemEntryID, BS.Shared" />
<property name="Notice" />
<property name="Uhrzeit" column="Uhrzeit" />
<property name="ChatText" column="ChatText" />
<property name="IsDelivered" column="istZugestellt" />
<property name="IstGelesen" column="IstGelesen" />
<property name="TeamOid" column="TeamOid" />
<property name="UdpUser" />
<property name="IsActive" type="BS.Shared.ActivationTypeId, BS.Shared" />
<property name="SystemEntryID" type="BS.Shared.SystemEntryID, BS.Shared" />
<property name="Notice" />
<property name="Uhrzeit" column="Uhrzeit" />
<property name="ChatText" column="ChatText" />
<property name="IsDelivered" column="istZugestellt" />
<property name="IstGelesen" column="IstGelesen" />
<property name="TeamOid" column="TeamOid" />
<property name="MessageId" column="MessageId" />
</class>
</hibernate-mapping>

View File

@@ -0,0 +1 @@
ALTER TABLE chatmessages ADD COLUMN `MessageId` VARCHAR(1024) DEFAULT NULL;

View File

@@ -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;
}

View File

@@ -839,7 +839,8 @@ namespace BS.Shared
StatusNotificationOnline,
StatusNotificationOffline,
LoginSuccess,
StatusRequest
StatusRequest,
KeepAlive
}
public enum ChatType

View File

@@ -29,5 +29,8 @@ namespace BS.Shared.DataContracts
[DataMember]
public long? TeamOid { get; set; }
[DataMember]
public string MessageId { get; set; }
}
}

View File

@@ -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);