Diverse Änderungen am ChatServer
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user