Diverse Änderungen am ChatServer

This commit is contained in:
staccatomamba
2016-09-13 11:32:25 +02:00
parent e3dd894a21
commit 988ac1ff4c
52 changed files with 1977 additions and 1402 deletions

View File

@@ -1,19 +1,35 @@
package util;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Map;
import java.util.Random;
import Database.DatabaseHandler;
import beyondsoft.bewomitarbeiterapp.ChatActivity;
import beyondsoft.bewomitarbeiterapp.KontaktChatActivity;
import beyondsoft.bewomitarbeiterapp.R;
import entities.ChatEntity;
import entities.ChatMessage;
import entities.NotificationLog;
import soapConnection.DataIdentifier;
import soapConnection.Packet;
import soapConnection.SoapConnectionManager;
import tcpConnection.LoginCallback;
import tcpConnection.SocketManager;
/**
* Created by JettenM on 05.07.2016.
@@ -28,34 +44,40 @@ public class Util {
public static final String PREFS_USERNAME_KEY = "username";
public static final String PREFS_PASSWORD = "password";
public static final String NOTIFICATION_CANCELLED = "notification_cancelled";
public static int unreadMessagesCount = 0;
public static int conversationsCount = 0;
//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, Context packageContext) {
unreadMessagesCount++;
//TODO: unterscheiden, ob es sich um eine einzelne Benachrichtigung handelt
String mUsername = conversationsCount > 1 ? String.valueOf(conversationsCount) + " Konversationen" : username;
String mMessage = unreadMessagesCount > 1 ? String.valueOf(unreadMessagesCount) + " Nachrichten" : message;
public static void SetNotify(String username, String message, int recipientOid, boolean isTeam, String teamMemberOids, String teamMemberNames, Context packageContext){
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(packageContext)
.setSmallIcon(R.drawable.ic_stat_name)
.setContentTitle(username)
.setContentText(message)
.setContentTitle(mUsername)
.setContentText(mMessage)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }) //Notification.Default_Vibrate
.setLights(Color.YELLOW, 3000, 3000) //Notification.Default_Lights
.setOngoing(true);
.setLights(Color.YELLOW, 3000, 3000); //Notification.Default_Lights
Log.i("CHAT_SET_NOTIFY", username + "; " + recipientOid + "; " + isTeam + "; " + teamMemberOids + "; " + teamMemberNames);
Intent resultIntent = new Intent(packageContext, (conversationsCount > 1 ? KontaktChatActivity.class : ChatActivity.class));
Bundle bundle = new Bundle();
bundle.putString("Name", username);
bundle.putInt("RecipientOid", recipientOid);
bundle.putBoolean("IsTeam", isTeam);
bundle.putString("TeamMemberOids", teamMemberOids);
bundle.putString("TeamMemberNames", teamMemberNames);
//TODO: mehrere Notifications von mehrern Kontakten -> KontaktChatActivity öffnen, sonst ChatActivity
Intent resultIntent = new Intent(packageContext, ChatActivity.class);
resultIntent.putExtras(bundle);
if (conversationsCount <= 1) {
Bundle bundle = new Bundle();
bundle.putString("Name", username);
bundle.putInt("RecipientOid", recipientOid);
bundle.putBoolean("IsTeam", isTeam);
bundle.putString("TeamMemberOids", teamMemberOids);
bundle.putString("TeamMemberNames", teamMemberNames);
resultIntent.putExtras(bundle);
}
resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
@@ -63,11 +85,119 @@ public class Util {
NotificationManager mNotifyMgr = (NotificationManager) packageContext.getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder.setDeleteIntent(getDeletedIntent(packageContext));
mBuilder.setContentIntent(resultPendingIntent);
mNotifyMgr.notify((new Random()).nextInt(9999 - 1000) + 1000, mBuilder.build());
Random random = new Random();
int notificationId = 1;
ChatEntity chatEntity = new ChatEntity(SoapConnectionManager.User.getPersonOid(), isTeam);
NotificationLog notificationLog = new NotificationLog(notificationId, Calendar.getInstance().getTime());
while(SocketManager.notificationEntities.containsValue(notificationLog)) {
notificationId = random.nextInt(10000);
notificationLog = new NotificationLog(notificationId, Calendar.getInstance().getTime());
}
SocketManager.notificationEntities.put(chatEntity, notificationLog);
//TODO: alte Notifications löschen ---------------------------------
ArrayList<ChatEntity> entities2remove = new ArrayList<>();
if(conversationsCount > 1 || unreadMessagesCount > 1) {
//TODO: differenzieren, welche Notifications gelöscht werden müssen. Alle bis auf die aktuelle Benachrichtigungen löschen.
for(Map.Entry<ChatEntity, NotificationLog> entry : SocketManager.notificationEntities.entrySet()) {
if(!(entry.getKey().equals(chatEntity) && entry.getValue().equals(notificationLog))) {
mNotifyMgr.cancel(entry.getValue().getNotificationId());
entities2remove.add(entry.getKey());
}
}
}
//TODO: ------------------------------------------------------------
mNotifyMgr.notify(notificationId, mBuilder.build());
}
protected static PendingIntent getDeletedIntent(Context context) {
Intent intent = new Intent(context, NotificationBroadcastReceiver.class);
intent.setAction(Util.NOTIFICATION_CANCELLED);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
}
public static void buildAlert(Context context, String message) {
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert.setMessage(message);
alert.setTitle("Debug-Info");
alert.setCancelable(true);
alert.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
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);
}
};
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();
}
}