2016-07-18 06:14:17 +02:00
package util ;
2016-09-13 11:32:25 +02:00
import android.app.AlertDialog ;
2016-08-24 11:31:13 +02:00
import android.app.Notification ;
import android.app.NotificationManager ;
import android.app.PendingIntent ;
import android.content.Context ;
2016-09-13 11:32:25 +02:00
import android.content.DialogInterface ;
2016-08-24 11:31:13 +02:00
import android.content.Intent ;
import android.graphics.Color ;
import android.os.Bundle ;
import android.support.v4.app.NotificationCompat ;
import android.util.Log ;
2016-09-13 11:32:25 +02:00
import java.util.ArrayList ;
2016-09-21 12:42:32 +02:00
import java.util.Arrays ;
2016-09-13 11:32:25 +02:00
import java.util.Calendar ;
2016-09-16 14:44:58 +02:00
import java.util.HashMap ;
2016-09-13 11:32:25 +02:00
import java.util.Map ;
2016-08-24 11:31:13 +02:00
import java.util.Random ;
2016-09-13 11:32:25 +02:00
import Database.DatabaseHandler ;
2016-08-24 11:31:13 +02:00
import beyondsoft.bewomitarbeiterapp.ChatActivity ;
2016-09-13 11:32:25 +02:00
import beyondsoft.bewomitarbeiterapp.KontaktChatActivity ;
2016-08-24 11:31:13 +02:00
import beyondsoft.bewomitarbeiterapp.R ;
2016-09-13 11:32:25 +02:00
import entities.ChatEntity ;
import entities.ChatMessage ;
import entities.NotificationLog ;
import soapConnection.DataIdentifier ;
import soapConnection.Packet ;
import soapConnection.SoapConnectionManager ;
import tcpConnection.LoginCallback ;
import tcpConnection.SocketManager ;
2016-08-24 11:31:13 +02:00
2016-07-18 06:14:17 +02:00
/ * *
* Created by JettenM on 05 . 07 . 2016 .
* /
public class Util {
public static final String PREFS_NAME = " BeWoMitarbeiterPrefsFile " ;
public static final String PREFS_SERVERADDRESS_KEY = " serverAddress " ;
2016-08-03 11:50:16 +02:00
public static final String PREFS_TOKEN_KEY = " serverAddress " ;
public static final String PREFS_TENANT_KEY = " tenant " ;
2016-07-18 06:14:17 +02:00
public static final String PREFS_USERNAME_KEY = " username " ;
2016-08-03 11:50:16 +02:00
public static final String PREFS_PASSWORD = " password " ;
2016-09-13 11:32:25 +02:00
public static final String NOTIFICATION_CANCELLED = " notification_cancelled " ;
public static int conversationsCount = 0 ;
2016-09-16 14:44:58 +02:00
public static HashMap < ChatEntity , Integer > entity2MessagesCountRel = new HashMap < > ( ) ;
2016-09-13 11:32:25 +02:00
//TODO: Notifications zählen. Bei Nachrichten verschiedener Unterhaltungen nur noch eine kleine Notification anzeigen mit "Sie haben x Nachrichten in y Unterhaltungen
2016-10-07 12:40:16 +02:00
public static void SetNotify ( String username , String message , int recipientOid , boolean isTeam , String teamMemberOids , String teamMemberNames , boolean isEmployee , Context packageContext ) {
2016-09-16 14:44:58 +02:00
int unreadMessagesCount = entity2MessagesCountRel . size ( ) + 1 ;
2016-09-13 11:32:25 +02:00
//TODO: unterscheiden, ob es sich um eine einzelne Benachrichtigung handelt
2016-09-16 14:44:58 +02:00
if ( SocketManager . notificationEntities . keySet ( ) . size ( ) > = 1 ) {
conversationsCount = SocketManager . notificationEntities . keySet ( ) . size ( ) ;
}
2016-09-13 11:32:25 +02:00
String mUsername = conversationsCount > 1 ? String . valueOf ( conversationsCount ) + " Konversationen " : username ;
String mMessage = unreadMessagesCount > 1 ? String . valueOf ( unreadMessagesCount ) + " Nachrichten " : message ;
2016-08-24 11:31:13 +02:00
NotificationCompat . Builder mBuilder =
new NotificationCompat . Builder ( packageContext )
. setSmallIcon ( R . drawable . ic_stat_name )
2016-09-13 11:32:25 +02:00
. setContentTitle ( mUsername )
. setContentText ( mMessage )
2016-08-24 11:31:13 +02:00
. setAutoCancel ( true )
. setDefaults ( Notification . DEFAULT_SOUND )
. setVibrate ( new long [ ] { 1000 , 1000 , 1000 , 1000 , 1000 } ) //Notification.Default_Vibrate
2016-09-13 11:32:25 +02:00
. setLights ( Color . YELLOW , 3000 , 3000 ) ; //Notification.Default_Lights
2016-08-24 11:31:13 +02:00
2016-09-13 11:32:25 +02:00
Intent resultIntent = new Intent ( packageContext , ( conversationsCount > 1 ? KontaktChatActivity . class : ChatActivity . class ) ) ;
2016-08-24 11:31:13 +02:00
2016-09-13 11:32:25 +02:00
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 ) ;
2016-10-07 12:40:16 +02:00
bundle . putBoolean ( " IsEmployee " , isEmployee ) ;
2016-09-13 11:32:25 +02:00
resultIntent . putExtras ( bundle ) ;
}
2016-08-24 11:31:13 +02:00
2016-09-13 11:32:25 +02:00
resultIntent . setFlags ( Intent . FLAG_ACTIVITY_CLEAR_TOP | Intent . FLAG_ACTIVITY_SINGLE_TOP ) ;
2016-08-25 13:13:30 +02:00
2016-09-13 11:32:25 +02:00
PendingIntent resultPendingIntent = PendingIntent . getActivity ( packageContext . getApplicationContext ( ) , ( int ) ( Math . random ( ) * 100 ) , resultIntent , PendingIntent . FLAG_UPDATE_CURRENT ) ;
2016-08-25 13:13:30 +02:00
2016-09-13 11:32:25 +02:00
NotificationManager mNotifyMgr = ( NotificationManager ) packageContext . getSystemService ( Context . NOTIFICATION_SERVICE ) ;
2016-08-25 13:13:30 +02:00
2016-09-16 14:44:58 +02:00
mBuilder . setDeleteIntent ( getDeletedIntent ( packageContext , recipientOid , isTeam ) ) ;
2016-08-24 11:31:13 +02:00
2016-09-13 11:32:25 +02:00
mBuilder . setContentIntent ( resultPendingIntent ) ;
2016-08-24 11:31:13 +02:00
2016-09-13 11:32:25 +02:00
Random random = new Random ( ) ;
int notificationId = 1 ;
2016-10-07 12:40:16 +02:00
ChatEntity chatEntity = new ChatEntity ( recipientOid , isTeam , isEmployee ) ;
2016-09-16 14:44:58 +02:00
// TODO: in entity2MessagesCountRels einfügen und Anzahl der Nachrichten aktualisieren
updateMessagesCount ( chatEntity , 1 ) ;
2016-09-13 11:32:25 +02:00
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 ) ;
ArrayList < ChatEntity > entities2remove = new ArrayList < > ( ) ;
if ( conversationsCount > 1 | | unreadMessagesCount > 1 ) {
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 ( ) ) ;
}
}
}
2016-09-16 14:44:58 +02:00
for ( ChatEntity entry : entities2remove ) {
SocketManager . notificationEntities . remove ( entry ) ;
}
2016-09-13 11:32:25 +02:00
mNotifyMgr . notify ( notificationId , mBuilder . build ( ) ) ;
}
2016-08-24 11:31:13 +02:00
2016-09-16 14:44:58 +02:00
protected static PendingIntent getDeletedIntent ( Context context , int recipientOid , boolean isTeam ) {
2016-09-13 11:32:25 +02:00
Intent intent = new Intent ( context , NotificationBroadcastReceiver . class ) ;
intent . setAction ( Util . NOTIFICATION_CANCELLED ) ;
2016-08-24 11:31:13 +02:00
2016-09-16 14:44:58 +02:00
Bundle extras = new Bundle ( ) ;
extras . putInt ( " RecipientOid " , recipientOid ) ;
extras . putBoolean ( " IsTeam " , isTeam ) ;
intent . putExtras ( extras ) ;
2016-09-13 11:32:25 +02:00
return PendingIntent . getBroadcast ( context , 0 , intent , PendingIntent . FLAG_CANCEL_CURRENT ) ;
}
2016-08-25 13:13:30 +02:00
2016-09-13 11:32:25 +02:00
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 ) ;
2016-08-25 13:13:30 +02:00
2016-09-13 11:32:25 +02:00
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 ) ;
2016-09-19 17:13:10 +02:00
sendStatusRequest ( ) ;
// TODO: Nachrichten herunterladen, sofern man sich in der ChatActivity befindet
2016-09-13 11:32:25 +02:00
}
} ;
SocketManager . connectToServer ( ) ;
Log . i ( " RECONNECT_WITH_SERVER " , " connectToServer aufgerufen... " ) ;
}
catch ( Exception es ) {
Log . e ( " RECONNECT_WITH_SERVER " , " Ausnahme beim Login nach Reconnect " ) ;
es . printStackTrace ( ) ;
}
}
}
2016-08-24 11:31:13 +02:00
2016-09-13 11:32:25 +02:00
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 ( ) ;
2016-08-24 11:31:13 +02:00
}
2016-09-16 14:44:58 +02:00
2016-09-19 17:13:10 +02:00
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 ) ;
}
2016-09-16 14:44:58 +02:00
public static ChatEntity getChatEntityFromOnlineEntitiesByOid ( int personOid , boolean isTeam ) {
for ( ChatEntity item : SocketManager . onlineEntities ) {
2016-10-07 12:40:16 +02:00
if ( item . getOid ( ) = = personOid & & item . getIsTeam ( ) = = isTeam ) {
2016-09-16 14:44:58 +02:00
return item ;
}
}
return null ;
}
private static void updateMessagesCount ( ChatEntity entity , int value2add ) {
int newValue = value2add ;
if ( entity2MessagesCountRel . containsKey ( entity ) ) {
newValue = entity2MessagesCountRel . get ( entity ) + value2add ;
}
entity2MessagesCountRel . put ( entity , newValue ) ;
}
public static void removeMessagesCount ( ChatEntity entity ) {
if ( entity2MessagesCountRel . containsKey ( entity ) ) {
entity2MessagesCountRel . remove ( entity ) ;
}
}
2016-09-21 12:42:32 +02:00
public static Integer [ ] convertStringArrayToIntegerArray ( String [ ] arrayToConvert ) {
Integer [ ] result = new Integer [ arrayToConvert . length ] ;
try {
for ( int i = 0 ; i < arrayToConvert . length ; i + + ) {
result [ i ] = Integer . parseInt ( arrayToConvert [ i ] ) ;
}
} catch ( NumberFormatException nfe ) {
Log . e ( " UTIL " , nfe . getMessage ( ) ) ;
nfe . printStackTrace ( ) ;
return null ;
}
return result ;
}
public static boolean contains ( final Integer [ ] array , final int key ) {
return Arrays . asList ( array ) . contains ( key ) ;
}
2016-07-18 06:14:17 +02:00
}