From 988ac1ff4cdb6c9e500e2ff23a82b6fc6113c4e1 Mon Sep 17 00:00:00 2001 From: staccatomamba Date: Tue, 13 Sep 2016 11:32:25 +0200 Subject: [PATCH] =?UTF-8?q?Diverse=20=C3=84nderungen=20am=20ChatServer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android/BewoMitarbeiterApp/app/app.iml | 1 + .../app/src/main/AndroidManifest.xml | 47 +- .../main/java/Database/DatabaseHandler.java | 186 +- .../BeWoChatApplication.java | 21 +- .../bewomitarbeiterapp/ChatActivity.java | 124 +- .../bewomitarbeiterapp/KontaktAdapter.java | 2 +- .../KontaktChatActivity.java | 269 +-- .../bewomitarbeiterapp/LoginActivity.java | 36 +- .../MainActivityMitarbeiter.java | 43 +- .../bewomitarbeiterapp/WebdokuActivity.java | 27 + .../src/main/java/entities/ChatEntity.java | 22 + .../src/main/java/entities/ChatPerson.java | 10 +- .../main/java/entities/NotificationLog.java | 24 + .../java/soapConnection/DataIdentifier.java | 3 +- .../src/main/java/soapConnection/Packet.java | 2 + .../main/java/soapConnection/SoapCalls.java | 22 +- .../java/tcpConnection/LoginCallback.java | 9 + .../java/tcpConnection/SocketManager.java | 159 +- .../java/util/ChatMessageDeserializer.java | 2 +- .../main/java/util/ConnectivityReceiver.java | 67 + .../util/NotificationBroadcastReceiver.java | 26 + .../app/src/main/java/util/Util.java | 174 +- .../res/drawable/serverconnectionoffline.png | Bin 0 -> 1493 bytes .../res/drawable/serverconnectiononline.png | Bin 0 -> 1407 bytes .../src/main/res/layout/activity_login.xml | 2 +- .../app/src/main/res/layout/chat.xml | 14 +- .../main/res/layout/contact_listview_item.xml | 56 + .../src/main/res/layout/custom_menuebar.xml | 19 +- .../src/main/res/layout/kontakt_list_chat.xml | 70 +- .../app/src/main/res/layout/login.xml | 70 - .../app/src/main/res/layout/webdoku.xml | 6 +- .../res/menu/menu_kontaktchat_activity.xml | 23 +- .../app/src/main/res/menu/menu_webdoku.xml | 14 + .../app/src/main/res/menu/menue_chat.xml | 12 +- .../app/src/main/res/values/colors.xml | 5 + .../app/src/main/res/values/strings.xml | 5 + BeWo/ServiceProxy/Generated.cs | 1562 ++++++++--------- BeWo/View/ChatView.xaml.cs | 10 +- BeWo/ViewModel/ChatMessageVM.cs | 57 +- BeWoChatServer/BeWoChatServer.csproj | 2 + BeWoChatServer/Server.cs | 132 +- BeWoOhneReports.v12.suo | Bin 713728 -> 1040896 bytes BeWoPlanerAndroid/AndroidSoapService.asmx.cs | 6 +- BeWoPlanerMobil/logs/Traces.svclog | 2 +- Data/DefaultHibernateSessionManager.cs | 2 + Data/Entities/ChatMessage.cs | 12 +- Data/Mappings/ChatMessage.hbm.xml | 2 +- .../ChatMessageDC_ChatMessage.cs | 8 +- .../ServiceContracts/IOperationsService.cs | 2 +- .../OperationsServiceImp.cs | 4 +- Shared/BeWoEntityEnums.cs | 3 +- Shared/DataContracts/ChatMessageDC.cs | 3 +- 52 files changed, 1977 insertions(+), 1402 deletions(-) create mode 100644 Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatEntity.java create mode 100644 Android/BewoMitarbeiterApp/app/src/main/java/entities/NotificationLog.java create mode 100644 Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java create mode 100644 Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java create mode 100644 Android/BewoMitarbeiterApp/app/src/main/java/util/NotificationBroadcastReceiver.java create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectionoffline.png create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectiononline.png create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/layout/contact_listview_item.xml delete mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/layout/login.xml create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/menu/menu_webdoku.xml create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/values/colors.xml diff --git a/Android/BewoMitarbeiterApp/app/app.iml b/Android/BewoMitarbeiterApp/app/app.iml index bf9062721..08afa4ee3 100644 --- a/Android/BewoMitarbeiterApp/app/app.iml +++ b/Android/BewoMitarbeiterApp/app/app.iml @@ -96,6 +96,7 @@ + diff --git a/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml b/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml index 657b82893..50eb6ffc4 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ - - + + + android:theme="@android:style/Theme.NoTitleBar" + android:configChanges="orientation" + android:screenOrientation="portrait"> - - - - - - - + android:configChanges="orientation" + android:screenOrientation="portrait" + android:label="@string/contact_list_activity_name"> @@ -41,7 +36,9 @@ + android:configChanges="orientation" + android:screenOrientation="portrait" + android:label="@string/Doku"> @@ -50,6 +47,8 @@ @@ -58,18 +57,30 @@ - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java index 19aa907a1..4791fa116 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java @@ -24,6 +24,8 @@ import soapConnection.SoapConnectionManager; */ public class DatabaseHandler extends SQLiteOpenHelper { + private static final String LOGTAG = "DATABASE_HANDLER"; + //DataBase version private static final int DATABASE_VERSION = 1; @@ -62,8 +64,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { private static DatabaseHandler mInstance = null; - private Context mContext; - public static DatabaseHandler getInstance(Context context) { if(mInstance == null) { mInstance = new DatabaseHandler(context.getApplicationContext()); @@ -74,7 +74,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { private DatabaseHandler(Context context){ super(context,DATABASE_NAME, null, DATABASE_VERSION); - this.mContext = context; } public void clearDatabase() { @@ -88,8 +87,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { deleteQuery = "DELETE FROM " + TABLE_CONTACTS; db.execSQL(deleteQuery); - - db.close(); } public void onCreate(SQLiteDatabase db) { @@ -127,21 +124,20 @@ public class DatabaseHandler extends SQLiteOpenHelper { } public void insertOwnerOid(int ownerOid) { - SQLiteDatabase db = this.getWritableDatabase(); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_ID_OWNER, ownerOid); - db.insert(TABLE_DATABASEOWNER, null, values); - db.close(); + writableDatabase.insertOrThrow(TABLE_DATABASEOWNER, null, values); } public int getOwnerOid() { - SQLiteDatabase db = this.getReadableDatabase(); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); String selectQuery = "SELECT * FROM " + TABLE_DATABASEOWNER; - Cursor cursor = db.rawQuery(selectQuery, null); + Cursor cursor = readableDatabase.rawQuery(selectQuery, null); int ownerOid = 0; @@ -150,7 +146,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } cursor.close(); - db.close(); return ownerOid; } @@ -182,18 +177,13 @@ public class DatabaseHandler extends SQLiteOpenHelper { if(db.inTransaction()) { db.endTransaction(); } - - db.close(); } } public long addChatMessage(ChatMessage message) { - SQLiteDatabase db = this.getWritableDatabase(); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); - long rowId = db.insert(TABLE_CHATMESSAGE, null, fillValuesForChatMessage(message)); - db.close(); - - return rowId; + return writableDatabase.insertOrThrow(TABLE_CHATMESSAGE, null, fillValuesForChatMessage(message)); } private ContentValues fillValuesForChatMessage(ChatMessage message) { @@ -211,7 +201,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { } public int updateChatMessage(ChatMessage message) { - SQLiteDatabase db = this.getWritableDatabase(); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); @@ -222,10 +212,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam ? 1 : 0); - int result = db.update(TABLE_CHATMESSAGE, values, KEY_ID_CHATMESSAGE + " = ?", new String[] { String.valueOf(message.Id)}); - db.close(); - - return result; + return writableDatabase.update(TABLE_CHATMESSAGE, values, KEY_ID_CHATMESSAGE + " = ?", new String[] { String.valueOf(message.Id)}); } public ArrayList getExistingChatMessageIds() { @@ -244,7 +231,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } cursor.close(); - db.close(); return result; } @@ -265,7 +251,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } cursor.close(); - db.close(); return result; } @@ -289,7 +274,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ - db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHATMESSAGE); db.execSQL("DROP TABLE IF EXISTS " + TABLE_DATABASEOWNER); @@ -298,7 +282,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { } public void addContact(ContactListItem contact) { - SQLiteDatabase db = this.getWritableDatabase(); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_KONTAKT_NAME, contact.getChatName()); @@ -308,22 +292,20 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_TEAM_MEMBER_NAMES, contact.teamMemberNames); values.put(KEY_TEAM_MEMBER_OIDS, contact.teamMemberOids); - db.insert(TABLE_CONTACTS, null, values); - db.close(); + writableDatabase.insertOrThrow(TABLE_CONTACTS, null, values); } public ChatMessage getChatMessageById(int id) { - SQLiteDatabase db = this.getReadableDatabase(); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); - Cursor cursor = db.query( + 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 + "=?", new String[]{String.valueOf(id)}, null, null, null, null); - if(cursor != null) { - cursor.moveToFirst(); + if(cursor != null && cursor.moveToFirst()){ int messageId = cursor.getInt(0); int senderPersonOid = cursor.getInt(1); @@ -335,22 +317,19 @@ public class DatabaseHandler extends SQLiteOpenHelper { boolean isTeam = cursor.getInt(7) == 1; cursor.close(); - db.close(); return new ChatMessage(messageId, senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam); } - db.close(); - return null; } public ArrayList getMessagesForRecipient(int recipientOid) { ArrayList messages = new ArrayList<>(); - SQLiteDatabase db = this.getReadableDatabase(); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); - Cursor cursor = db.query( + 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_SENDER_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? OR " + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?", @@ -375,7 +354,6 @@ public class DatabaseHandler extends SQLiteOpenHelper { } cursor.close(); - db.close(); return messages; } @@ -383,9 +361,9 @@ public class DatabaseHandler extends SQLiteOpenHelper { public ArrayList getMessagesForTeam(int teamOid) { ArrayList messages = new ArrayList<>(); - SQLiteDatabase db = this.getReadableDatabase(); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); - Cursor cursor = db.query( + 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_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_IS_TEAM_CHATMESSAGE + "= 1", @@ -411,16 +389,13 @@ public class DatabaseHandler extends SQLiteOpenHelper { cursor.close(); - db.close(); - return messages; } public ContactListItem getContact(int id) { + SQLiteDatabase readableDatabase = this.getReadableDatabase(); - SQLiteDatabase db = this.getReadableDatabase(); - - Cursor cursor = db.query(TABLE_CONTACTS, + Cursor cursor = readableDatabase.query(TABLE_CONTACTS, new String[]{ KEY_ID, KEY_KONTAKT_NAME, @@ -447,13 +422,10 @@ public class DatabaseHandler extends SQLiteOpenHelper { ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames); cursor.close(); - db.close(); return contact; } - db.close(); - return null; } @@ -462,8 +434,8 @@ public class DatabaseHandler extends SQLiteOpenHelper { String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); + Cursor cursor = writableDatabase.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { @@ -481,13 +453,44 @@ public class DatabaseHandler extends SQLiteOpenHelper { } cursor.close(); - db.close(); return contactList; } + public ArrayList getAllChatMessages() { + ArrayList result = new ArrayList<>(); + + String selectQuery = "SELECT * FROM " + TABLE_CHATMESSAGE; + + SQLiteDatabase readableDatabase = this.getReadableDatabase(); + + Cursor cursor = readableDatabase.rawQuery(selectQuery, 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 + ); + + result.add(message); + + } while(cursor.moveToNext()); + + cursor.close(); + } + + return result; + } + public int updateContact(ContactListItem contact) { - SQLiteDatabase db = this.getWritableDatabase(); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_KONTAKT_NAME, contact.getChatName()); @@ -497,23 +500,18 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_TEAM_MEMBER_NAMES, contact.teamMemberNames); values.put(KEY_TEAM_MEMBER_OIDS, contact.teamMemberOids); - int result = db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); - - db.close(); - - return result; + return writableDatabase.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); } public void deleteContacts(ContactListItem contact){ - SQLiteDatabase db = this.getWritableDatabase(); - db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); - db.close(); + SQLiteDatabase writableDatabase = this.getWritableDatabase(); + writableDatabase.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); } public int getContactsCount(){ String countQuery = "SELECT COUNT(*) FROM " + TABLE_CONTACTS; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery(countQuery, null); int result = 0; @@ -522,32 +520,30 @@ public class DatabaseHandler extends SQLiteOpenHelper { } cursor.close(); - db.close(); return result; } public byte[] getUserImage(Integer personOid) { - SQLiteDatabase db = this.getReadableDatabase(); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); - Cursor cursor = db.query(TABLE_CONTACTS, new String[] {KEY_PICTURE_BLOB}, KEY_PERSONOID + " = " + personOid, null, null, null, null); + Cursor cursor = readableDatabase.query(TABLE_CONTACTS, new String[] {KEY_PICTURE_BLOB}, KEY_PERSONOID + " = " + personOid, null, null, null, null); byte[] picture = null; if(cursor != null && cursor.moveToFirst()) { - cursor.getBlob(0); - } + picture = cursor.getBlob(0); - cursor.close(); - db.close(); + cursor.close(); + } return picture; } public ContactListItem getContactByPersonOid(int personOid, boolean isTeam) { - SQLiteDatabase db = this.getReadableDatabase(); + SQLiteDatabase readableDatabase = this.getReadableDatabase(); - Cursor cursor = db.query(TABLE_CONTACTS, + Cursor cursor = readableDatabase.query(TABLE_CONTACTS, new String[]{ KEY_ID, KEY_KONTAKT_NAME, @@ -573,15 +569,53 @@ public class DatabaseHandler extends SQLiteOpenHelper { ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames); cursor.close(); - db.close(); return contact; } else { - Log.i("DATABASE_HANDLER", "Keinen Kontakt mit PersonOid " + personOid + " gefunden."); + Log.i(LOGTAG, "Keinen Kontakt mit PersonOid " + personOid + " gefunden."); } - db.close(); - return null; } + + public ArrayList getUnsentChatMessages() { + ArrayList messages = new ArrayList<>(); + + SQLiteDatabase readableDatabase = this.getReadableDatabase(); + + Cursor cursor = readableDatabase.query(TABLE_CHATMESSAGE, + new String[] { + KEY_ID_CHATMESSAGE, + KEY_SENDER_PERSON_OID_CHATMESSAGE, + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, + KEY_INSTS_CHATMESSAGE, + KEY_CHAT_TEXT_CHATMESSAGE, + KEY_IS_DELIVERED_CHATMESSAGE, + KEY_SERVERSEITIGE_OID_CHATMESSAGE, + KEY_IS_TEAM_CHATMESSAGE + }, + KEY_IS_DELIVERED_CHATMESSAGE + " =? AND " + KEY_SENDER_PERSON_OID_CHATMESSAGE + " =?", + new String[] {String.valueOf(0), String.valueOf(SoapConnectionManager.User.getPersonOid())}, null, null, null, null); + + 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 + ); + + messages.add(message); + } while(cursor.moveToNext()); + } + + cursor.close(); + + return messages; + } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java index cad7f339e..571394f97 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java @@ -5,19 +5,38 @@ import android.app.NotificationManager; import android.content.Context; import android.util.Log; +import util.ConnectivityReceiver; + /** * Created by JettenM on 24.08.2016. */ public class BeWoChatApplication extends Application { private Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; + private static BeWoChatApplication mInstance; + + @Override + public void onCreate() { + super.onCreate(); + + mInstance = this; + } + + public static synchronized BeWoChatApplication getInstance() { + return mInstance; + } + + public void setConnectivityListener(ConnectivityReceiver.ConnectivityReceiverListener listener) { + ConnectivityReceiver.connectivityReceiverListener = listener; + } + public BeWoChatApplication() { defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.UncaughtExceptionHandler uncaughtExceptionHandler = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { - Log.e("UNCAUGHT_EXCEPTION", "Eine unbehandelte Ausnahme ist aufgetreten!"); + Log.e("UNCAUGHT_EXCEPTION", "Eine unbehandelte Ausnahme ist aufgetreten!\n" + ex.getMessage()); ex.printStackTrace(); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java index 660a4f427..45f26ba89 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java @@ -1,10 +1,6 @@ package beyondsoft.bewomitarbeiterapp; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -15,10 +11,8 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.os.Bundle; -import android.support.v4.app.NotificationCompat; 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; @@ -43,21 +37,13 @@ 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.IOException; import java.lang.reflect.Type; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; -import java.util.Random; - -import javax.crypto.NoSuchPaddingException; import Database.DatabaseHandler; import entities.ChatMessage; @@ -70,13 +56,13 @@ import soapConnection.SoapConnectionManager; import tcpConnection.SocketManager; import tcpConnection.UIHandler; import util.ChatMessageDeserializer; -import util.SecurityUtils; +import util.ConnectivityReceiver; import util.Util; /** * Created by bib on 03.05.2016. */ -public class ChatActivity extends ActionBarActivity { +public class ChatActivity extends ActionBarActivity implements ConnectivityReceiver.ConnectivityReceiverListener { private DatabaseHandler databaseHandler; protected EditText text; @@ -98,6 +84,16 @@ public class ChatActivity extends ActionBarActivity { private View mCustomView; + private final static String LOGTAG = "CHAT_ACTIVITY"; + + @Override + public void onNetworkConnectionChanged(boolean isConnected) { + //TODO: Socket neustarten + // Broken Pipe, weil die Internetverbindung abgerissen ist + + Util.reconnectWithServer(isConnected, ChatActivity.this); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -129,6 +125,8 @@ public class ChatActivity extends ActionBarActivity { teamMemberOids = zielkorb.getString("TeamMemberOids"); teamMemberNames = zielkorb.getString("TeamMemberNames"); + Log.i(LOGTAG, "onCreate aufgerufen"); + ReloadChatView(recipientName, recipientPersonOid, bildArray, isTeam, teamMemberOids, teamMemberNames); } @@ -145,7 +143,9 @@ public class ChatActivity extends ActionBarActivity { TextView titlename = (TextView) mCustomView.findViewById(R.id.PersonalName); ImageView titlepic = (ImageView) mCustomView.findViewById(R.id.PersonalPic); - status.setImageResource((SocketManager.onlinePersonOids.contains(recipientPersonOid) ? R.drawable.statusonline : R.drawable.statusoffline)); + if(!isTeam) { + status.setImageResource((SocketManager.onlinePersonOids.contains(recipientPersonOid) ? R.drawable.statusonline : R.drawable.statusoffline)); + } Bitmap customerImage; @@ -167,47 +167,22 @@ public class ChatActivity extends ActionBarActivity { @Override public void updateUserInterface(final Packet chatPacket) { try { - Log.i("CHAT_SOCKET_LISTENER", "Nachricht vom Typ " + chatPacket.ChatDataIdentifier.name() + " empfangen"); - switch(chatPacket.ChatDataIdentifier) { case MESSAGE: listView.post(new Runnable() { @Override public void run() { - ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, false); - - databaseHandler.addChatMessage(message); - if(chatPacket.SenderPersonOid == recipientPersonOid) { - chatMessages.add(message); + chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false)); adapter.notifyDataSetChanged(); } else { - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(getApplicationContext(), "ChatName: " + chatPacket.ChatName, Toast.LENGTH_LONG).show(); - } - }); - Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, getApplicationContext()); } } }); - break; - case MESSAGE_RESPONSE: - ChatMessage cm = databaseHandler.getChatMessageById(chatPacket.ClientseitigeOid); - - cm.ServerseitigeOid = chatPacket.ServerseitigeOid; - - databaseHandler.updateChatMessage(cm); - break; case STATUS_NOTIFICATION_LOGIN: - if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); - } - if(chatPacket.SenderPersonOid == recipientPersonOid) { runOnUiThread(new Runnable() { @Override @@ -220,29 +195,23 @@ public class ChatActivity extends ActionBarActivity { break; case STATUS_NOTIFICATION_LOGOUT: - if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); + if(chatPacket.SenderPersonOid == recipientPersonOid) { + runOnUiThread(new Runnable() { + @Override + public void run() { + ImageView status = (ImageView) mCustomView.findViewById(R.id.status); + status.setImageResource(R.drawable.statusoffline); + } + }); } - runOnUiThread(new Runnable() { - @Override - public void run() { - ImageView status = (ImageView) mCustomView.findViewById(R.id.status); - status.setImageResource(R.drawable.statusoffline); - } - }); - break; case TEAM: listView.post(new Runnable() { @Override public void run() { - ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, true); - - databaseHandler.addChatMessage(message); - if(isTeam && chatPacket.RecipientPersonOid == recipientPersonOid) { - chatMessages.add(message); + chatMessages.add(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, true)); adapter.notifyDataSetChanged(); } else { Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.RecipientPersonOid, true, teamMemberOids, teamMemberNames, getApplicationContext()); @@ -281,6 +250,7 @@ public class ChatActivity extends ActionBarActivity { final ChatMessage message = new ChatMessage(packet.SenderPersonOid, packet.RecipientPersonOid, packet.MessageTimeStamp, packet.ChatMessage, false, 0, isTeam); + Log.i("MESSAGE_TRACER", "ChatActivity: Speichere Nachricht in der Datenbank " + message.ChatText); long coid = databaseHandler.addChatMessage(message); packet.ClientseitigeOid = Long.valueOf(coid).intValue(); @@ -305,6 +275,8 @@ public class ChatActivity extends ActionBarActivity { ArrayList test = isTeam ? databaseHandler.getExistingTeamChatMessageIds() : databaseHandler.getExistingChatMessageIds(); + Log.i(LOGTAG, "Chat-Messages in der Datenbank: " + test.size()); + String pExceptions = ""; for(int i = 0; i < test.size(); i++) { pExceptions += test.get(i); @@ -328,19 +300,19 @@ public class ChatActivity extends ActionBarActivity { public void onResume() { SocketManager.uiHandler = chatUIHandler; + BeWoChatApplication.getInstance().setConnectivityListener(this); + super.onResume(); } @Override public void onStop(){ spiceManager.shouldStop(); - databaseHandler.close(); super.onStop(); } @Override public void onPause() { - databaseHandler.close(); super.onPause(); } @@ -350,6 +322,7 @@ public class ChatActivity extends ActionBarActivity { spiceManager.start(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.menue_chat, menu); @@ -359,8 +332,18 @@ public class ChatActivity extends ActionBarActivity { public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { - case R.id.action_delet_Storage: - recreate(); // ---> gegebenenfals umändern, aber fürs erste reichts + case R.id.action_logout: + SocketManager.logout(); + + Intent intent = new Intent(ChatActivity.this, LoginActivity.class); + ChatActivity.this.startActivity(intent); + + return true; + case R.id.action_doku: + + Intent dokuActivity = new Intent(ChatActivity.this, WebdokuActivity.class); + ChatActivity.this.startActivity(dokuActivity); + return true; default: return super.onOptionsItemSelected(item); @@ -378,10 +361,10 @@ public class ChatActivity extends ActionBarActivity { String tMemberOids = zielkorb.getString("TeamMemberOids"); String tMemberNames = zielkorb.getString("TeamMemberNames"); - Toast.makeText(getApplicationContext(), "" + blahIsTeam, Toast.LENGTH_LONG).show(); - byte[] imageAsByteArray = databaseHandler.getUserImage(rpoid); + Log.i("ON_NEW_INTENT", "Erzeuge neuen Intent"); + ReloadChatView(rn, rpoid, imageAsByteArray, blahIsTeam, tMemberOids, tMemberNames); } @@ -428,6 +411,19 @@ public class ChatActivity extends ActionBarActivity { final ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); + Log.i(LOGTAG, "Chat-Messages aus der Serveranfrage: " + result.size()); + String abc = ""; + for(ChatMessage m : result) { + + abc += "\t" + m.ChatText; + + if(result.indexOf(m) < result.size() - 1) { + abc += "\n"; + } + } + + Log.i(LOGTAG, "Heruntergeladene Nachrichten:\n" + abc); + databaseHandler.addChatMessages(result); listView.post(new Runnable() { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java index a51cfa89e..e0dc7f8ad 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java @@ -49,7 +49,7 @@ public class KontaktAdapter extends ArrayAdapter { public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View rowView = inflater.inflate(R.layout.kontakt_list_chat, parent, false); + View rowView = inflater.inflate(R.layout.contact_listview_item, parent, false); TextView textView = (TextView) rowView.findViewById(R.id.label); minitext = (TextView) rowView.findViewById(R.id.subtitle); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java index 13535d870..cd618317c 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -1,19 +1,16 @@ package beyondsoft.bewomitarbeiterapp; import android.app.ListActivity; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Color; import android.os.Bundle; -import android.support.v4.app.NotificationCompat; +import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; @@ -32,7 +29,6 @@ import java.io.ByteArrayOutputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -import java.util.Random; import Database.DatabaseHandler; import entities.ChatMessage; @@ -43,164 +39,189 @@ import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; import tcpConnection.SocketManager; import tcpConnection.UIHandler; +import util.ConnectivityReceiver; import util.Util; /** * Created by bib on 02.05.2016. */ -public class KontaktChatActivity extends ListActivity { +public class KontaktChatActivity extends ActionBarActivity implements ConnectivityReceiver.ConnectivityReceiverListener { private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); private DatabaseHandler databaseHandler; - private UIHandler kontaktChatUIHandler; +// private UIHandler kontaktChatUIHandler; public static ListView listView; ArrayList contactList = new ArrayList<>(); + @Override + public void onNetworkConnectionChanged(boolean isConnected) { + Util.reconnectWithServer(isConnected, KontaktChatActivity.this); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.kontakt_list_chat); databaseHandler = DatabaseHandler.getInstance(this); - listView = getListView(); + listView = (ListView) findViewById(R.id.contact_listview); + listView.setAdapter(new KontaktAdapter(this, new ArrayList())); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + ContactListItem selectedValue = (ContactListItem) listView.getAdapter().getItem(position); + + Bundle bundle = new Bundle(); + + bundle.putString("Name", selectedValue.getChatName()); + bundle.putInt("RecipientOid", selectedValue.getPersonOid()); + bundle.putBoolean("IsTeam", selectedValue.isTeam); + bundle.putString("TeamMemberOids", selectedValue.teamMemberOids); + bundle.putString("TeamMemberNames", selectedValue.teamMemberNames); + + Intent in = new Intent(getBaseContext(), ChatActivity.class); + in.putExtras(bundle); + + //Gib Bild für den Chat mit + if(selectedValue.getPicture() == null) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + Bitmap a = BitmapFactory.decodeResource(getResources(), R.drawable.katze3); + a.compress(Bitmap.CompressFormat.JPEG,0,stream); + byte[] x = stream.toByteArray(); + in.putExtra("Bild", x); + } else { + in.putExtra("Bild", selectedValue.getPicture()); + } + + startActivity(in); + } + }); + + if(SocketManager.uiHandler == null ||! SocketManager.uiHandler.equals(kontaktChatActivityUIHandler)) { + SocketManager.uiHandler = kontaktChatActivityUIHandler; + } ArrayList propertyInfos = new ArrayList<>(); propertyInfos.add(SoapConnectionManager.BuildProperty("pPersonOid", SoapConnectionManager.User.getPersonOid(), Long.class)); JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); - - kontaktChatUIHandler = new UIHandler() { - @Override - public void updateUserInterface(final Packet chatPacket) { - try { - switch(chatPacket.ChatDataIdentifier) { - case MESSAGE: - ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, false); - - databaseHandler.addChatMessage(message); - - Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, getApplicationContext()); - break; - case TEAM: - ChatMessage teamMessage = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, true); - - databaseHandler.addChatMessage(teamMessage); - - ContactListItem cli = DatabaseHandler.getInstance(getApplicationContext()).getContactByPersonOid(chatPacket.RecipientPersonOid, true); - - Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.RecipientPersonOid, true, cli.teamMemberOids, cli.teamMemberNames, getApplicationContext()); - break; - case STATUS_NOTIFICATION_LOGIN: - Log.i("KONTAKTLISTE", "Login registriert: (" + chatPacket.SenderPersonOid + ") " + chatPacket.ChatName); - - if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); - - runOnUiThread(new Runnable() { - @Override - public void run() { - KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); - - for(ContactListItem item : ka.values) { - if(item.getPersonOid() == chatPacket.SenderPersonOid) { - item.isOnline = true; - break; - } - } - - ka.notifyDataSetChanged(); - } - }); - } - break; - case STATUS_NOTIFICATION_LOGOUT: - if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); - - runOnUiThread(new Runnable() { - @Override - public void run() { - KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); - - for(ContactListItem item : ka.values) { - if(item.getPersonOid() == chatPacket.SenderPersonOid) { - item.isOnline = false; - break; - } - } - - ka.notifyDataSetChanged(); - } - }); - } - break; - } - } catch(Exception pe) { - pe.printStackTrace(); - } - } - }; } + public UIHandler kontaktChatActivityUIHandler = new UIHandler() { + @Override + public void updateUserInterface(final Packet chatPacket) { + try { + switch(chatPacket.ChatDataIdentifier) { + case MESSAGE: + + Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, getApplicationContext()); + + 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, getApplicationContext()); + break; + case STATUS_NOTIFICATION_LOGIN: + runOnUiThread(new Runnable() { + @Override + public void run() { + KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); + + for(ContactListItem item : ka.values) { + if(item.getPersonOid() == chatPacket.SenderPersonOid) { + item.isOnline = true; + break; + } + } + + ka.notifyDataSetChanged(); + } + }); + break; + case STATUS_NOTIFICATION_LOGOUT: + runOnUiThread(new Runnable() { + @Override + public void run() { + KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); + + for(ContactListItem item : ka.values) { + if(item.getPersonOid() == chatPacket.SenderPersonOid) { + item.isOnline = false; + break; + } + } + + ka.notifyDataSetChanged(); + } + }); + break; + case STATUS_NOTIFICATION_LOGIN_BROADCAST: + + runOnUiThread(new Runnable() { + @Override + public void run() { + KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); + + for(ContactListItem item : ka.values) { + if(item.getPersonOid() == chatPacket.SenderPersonOid) { + item.isOnline = true; + break; + } + } + + ka.notifyDataSetChanged(); + } + }); + + break; + } + } catch(Exception pe) { + pe.printStackTrace(); + } + } + }; + @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); + getMenuInflater().inflate(R.menu.menu_kontaktchat_activity, 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(); + switch (item.getItemId()) { + case R.id.action_kontaktlist_doku: - //noinspection SimplifiableIfStatement + Intent dokuActivity = new Intent(KontaktChatActivity.this, WebdokuActivity.class); + KontaktChatActivity.this.startActivity(dokuActivity); - if (id == R.id.action_Logout) { - System.exit(0); + return true; + case R.id.action_kontaktlist_logout: + + SocketManager.logout(); + + Intent intent = new Intent(KontaktChatActivity.this, LoginActivity.class); + KontaktChatActivity.this.startActivity(intent); + + return true; + default: + return super.onOptionsItemSelected(item); } - - return super.onOptionsItemSelected(item); - } - - @Override - protected void onListItemClick(ListView l, View v, int position, long id) { - ContactListItem selectedValue = (ContactListItem) getListAdapter().getItem(position); - - Bundle bundle = new Bundle(); - - bundle.putString("Name", selectedValue.getChatName()); - bundle.putInt("RecipientOid", selectedValue.getPersonOid()); - bundle.putBoolean("IsTeam", selectedValue.isTeam); - bundle.putString("TeamMemberOids", selectedValue.teamMemberOids); - bundle.putString("TeamMemberNames", selectedValue.teamMemberNames); - - Intent in = new Intent(getBaseContext(), ChatActivity.class); - in.putExtras(bundle); - - //Gib Bild für den Chat mit - if(selectedValue.getPicture() == null) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - Bitmap a = BitmapFactory.decodeResource(getResources(), R.drawable.katze3); - a.compress(Bitmap.CompressFormat.JPEG,0,stream); - byte[] x = stream.toByteArray(); - in.putExtra("Bild", x); - } else { - in.putExtra("Bild", selectedValue.getPicture()); - } - - startActivity(in); } @Override public void onResume() { - SocketManager.uiHandler = kontaktChatUIHandler; + SocketManager.uiHandler = kontaktChatActivityUIHandler; + + BeWoChatApplication.getInstance().setConnectivityListener(this); KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); @@ -218,7 +239,6 @@ public class KontaktChatActivity extends ListActivity { @Override public void onStop(){ spiceManager.shouldStop(); - databaseHandler.close(); super.onStop(); } @@ -283,9 +303,12 @@ public class KontaktChatActivity extends ListActivity { if(adapter == null) { adapter = new KontaktAdapter(KontaktChatActivity.this, contactList); + } else { + adapter.values.clear(); + adapter.values.addAll(contactList); } - setListAdapter(adapter); + listView.setAdapter(adapter); ((KontaktAdapter) listView.getAdapter()).notifyDataSetChanged(); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java index 8497bba1b..f6773a3e3 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java @@ -5,10 +5,7 @@ import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; + import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; @@ -24,11 +21,7 @@ import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; -import com.android.volley.Request; import com.android.volley.RequestQueue; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.octo.android.robospice.SpiceManager; import com.octo.android.robospice.UncachedSpiceService; @@ -53,6 +46,7 @@ import soapConnection.ApplicationUser; import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; +import tcpConnection.LoginCallback; import tcpConnection.SocketManager; import util.SecurityUtils; import util.Util; @@ -275,18 +269,6 @@ public class LoginActivity extends ActionBarActivity { databaseHandler.insertOwnerOid(SoapConnectionManager.User.getPersonOid().intValue()); } - ContactListItem cli = databaseHandler.getContactByPersonOid(4, false); - if (getResources().getDrawable(R.drawable.katyperry) != null && cli != null) { - Bitmap bitch = ((BitmapDrawable) getResources().getDrawable(R.drawable.katyperry)).getBitmap(); - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - bitch.compress(Bitmap.CompressFormat.JPEG, 100, stream); - byte[] byteArray = stream.toByteArray(); - - cli.setPicture(byteArray); - - databaseHandler.getInstance(getApplicationContext()).updateContact(cli); - } - SoapConnectionManager.User.setTenant(mTenantView.getText().toString()); if(mRememberMeCheckBoxView.isChecked()) { @@ -318,8 +300,18 @@ public class LoginActivity extends ActionBarActivity { SocketManager.tenant = mTenantView.getText().toString(); - Intent mainActivityMitarbeiter = new Intent(LoginActivity.this, MainActivityMitarbeiter.class); - LoginActivity.this.startActivity(mainActivityMitarbeiter); + //TODO: stattdessen ConnectToServer und im Callback die ChatActivity aufrufen + SocketManager.loginCallback = new LoginCallback() { + @Override + public void doCallback() { + Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Ist verbunden und ruft die ChatActivity nun auf."); + + Intent kontaktChatActivity = new Intent(LoginActivity.this, KontaktChatActivity.class); + LoginActivity.this.startActivity(kontaktChatActivity); + } + }; + + SocketManager.connectToServer(); } else { showProgress(false); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java index de1064b65..27253332b 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java @@ -1,13 +1,7 @@ package beyondsoft.bewomitarbeiterapp; import android.app.Activity; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; import android.content.Intent; -import android.graphics.Color; -import android.os.Looper; -import android.support.v4.app.NotificationCompat; import android.os.Bundle; import android.util.Log; @@ -15,20 +9,23 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; -import android.widget.Toast; -import java.util.Random; +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 { +public class MainActivityMitarbeiter extends Activity implements ConnectivityReceiver.ConnectivityReceiverListener { protected Button dokubutton; protected Button chatbutton; @@ -40,13 +37,19 @@ public class MainActivityMitarbeiter extends Activity { int loggedInUserPersonOid; - @Override + 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(); - SocketManager.loginOnServer(); setzeButtonListener(); @@ -61,6 +64,18 @@ public class MainActivityMitarbeiter extends Activity { case MESSAGE: Util.SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null, 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(","); @@ -91,6 +106,8 @@ public class MainActivityMitarbeiter extends Activity { } } }; + + Util.sendUnsentMessages(MainActivityMitarbeiter.this); } @Override @@ -151,11 +168,15 @@ public class MainActivityMitarbeiter extends Activity { public void onResume() { SocketManager.uiHandler = mainUIHandler; + BeWoChatApplication.getInstance().setConnectivityListener(this); + super.onResume(); } @Override public void onBackPressed() { + Log.i(LOGTAG, "Logge aus..."); + SocketManager.logout(); finish(); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java index ae728a727..216e20371 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/WebdokuActivity.java @@ -1,6 +1,7 @@ package beyondsoft.bewomitarbeiterapp; import android.app.Activity; +import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; @@ -9,6 +10,7 @@ import android.webkit.WebView; import android.webkit.WebViewClient; import soapConnection.SoapCalls; +import tcpConnection.SocketManager; /** * Created by bib on 02.05.2016. @@ -29,4 +31,29 @@ public class WebdokuActivity extends ActionBarActivity { view.loadUrl(SoapCalls.WEB_DOKU_URL); view.setWebViewClient(new WebViewClient()); } + + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_webdoku, menu); + return true; + } + + public boolean onOptionsItemSelected(MenuItem item) { + // Handle item selection + switch (item.getItemId()) { + case R.id.action_chat: + Intent kontaktChatActivity = new Intent(getBaseContext(), KontaktChatActivity.class); + + startActivity(kontaktChatActivity); + return true; + case R.id.action_Logout: + SocketManager.logout(); + + finish(); + System.exit(0); + return true; + default: + return super.onOptionsItemSelected(item); + } + } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatEntity.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatEntity.java new file mode 100644 index 000000000..5a8a8d0a2 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatEntity.java @@ -0,0 +1,22 @@ +package entities; + +/** + * Created by JettenM on 08.09.2016. + */ +public class ChatEntity { + private long oid; + private boolean isTeam; + + public ChatEntity(long pOid, boolean pIsTeam) { + oid = pOid; + isTeam = pIsTeam; + } + + public long getOid() { + return oid; + } + + public boolean isTeam() { + return isTeam; + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java index 08bb3e165..c4b450d03 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java @@ -4,10 +4,10 @@ package entities; * Created by JettenM on 05.07.2016. */ public class ChatPerson { - public int Oid; - public String Name; + public int Oid; + public String Name; public boolean IsTeam; - public String TeamMemberNames; - public String TeamMemberOids; - public int Version; + public String TeamMemberNames; + public String TeamMemberOids; + public int Version; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/NotificationLog.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/NotificationLog.java new file mode 100644 index 000000000..90c396aee --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/NotificationLog.java @@ -0,0 +1,24 @@ +package entities; + +import java.util.Date; + +/** + * Created by JettenM on 09.09.2016. + */ +public class NotificationLog { + private int notificationId; + private Date notificationDate; + + public NotificationLog(int notificationId, Date notificationDate) { + this.notificationId = notificationId; + this.notificationDate = notificationDate; + } + + public int getNotificationId() { + return notificationId; + } + + public Date getNotificationDate() { + return notificationDate; + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java index 31ec3007e..d5231c693 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java @@ -17,7 +17,8 @@ public enum DataIdentifier { MESSAGE_RESPONSE(10), STATUS_NOTIFICATION_BESCHAEFTIGT(11), STATUS_NOTIFICATION_ONLINE(12), - STATUS_NOTIFICATION_OFFLINE(13); + STATUS_NOTIFICATION_OFFLINE(13), + LOGIN_SUCCESS(14); private final int value; DataIdentifier(int value) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java index 7a1552b3a..afb72f363 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java @@ -49,6 +49,8 @@ public class Packet { //23;281;20;389;1;38;932[Tenant]; 8 Semikola public Packet(String message) { + Log.i("PACKET_CONSTRUCTOR_MSG", message); + String[] gesplittet = message.split(";"); String senderPersonOidString = gesplittet[0]; diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java index 0709df599..5cab44727 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java @@ -10,14 +10,26 @@ public class SoapCalls { public static String GET_ALL_CHAT_MESSAGES = "GetAllChatMessagesForSenderAndRecipient"; - //"app4.bewoplaner.de";// - public static String DESTINATION_ADDRESS = "app4.bewoplaner.de";//"192.168.1.103"; + //TODO: "app4.bewoplaner.de";// +// public static String DESTINATION_ADDRESS = "app4.bewoplaner.de"; +// public static int DESTINATION_PORT = 5000; +// +// public static String TOKEN_CHECK_URL = "https://" + DESTINATION_ADDRESS + "/mobil/main/checktoken?token="; +// +// public static String WEB_DOKU_URL = "https://" + DESTINATION_ADDRESS + "/mobil/login/demo"; +// +// public static String WSDL_TARGET_NAME = "bliblablubb.org/"; +// public static String SOAP_ADDRESS = "https://" + DESTINATION_ADDRESS + "/BeWoPlanerAndroid/AndroidSoapService.asmx"; + + + + public static String DESTINATION_ADDRESS = "192.168.1.103"; public static int DESTINATION_PORT = 5000; - public static String TOKEN_CHECK_URL = "https://" + DESTINATION_ADDRESS + "/mobil/main/checktoken?token="; + public static String TOKEN_CHECK_URL = "http://" + DESTINATION_ADDRESS + "/bewoplanermobil/main/checktoken?token="; - public static String WEB_DOKU_URL = "https://" + DESTINATION_ADDRESS + "/mobil/login/demo"; + public static String WEB_DOKU_URL = "http://" + DESTINATION_ADDRESS + "/bewoplanermobil/login/demo"; public static String WSDL_TARGET_NAME = "bliblablubb.org/"; - public static String SOAP_ADDRESS = "https://" + DESTINATION_ADDRESS + "/BeWoPlanerAndroid/AndroidSoapService.asmx"; + public static String SOAP_ADDRESS = "http://" + DESTINATION_ADDRESS + "/BeWoPlanerAndroid/AndroidSoapService.asmx"; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java new file mode 100644 index 000000000..00a0c00c8 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/LoginCallback.java @@ -0,0 +1,9 @@ +package tcpConnection; + + +/** + * Created by JettenM on 08.09.2016. + */ +public interface LoginCallback { + void doCallback(); +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java index a24d269ce..a04fef882 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java @@ -1,15 +1,28 @@ package tcpConnection; import android.util.Log; +import android.widget.ImageView; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.NetworkInterface; import java.net.Socket; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Timer; import java.util.TimerTask; +import Database.DatabaseHandler; +import beyondsoft.bewomitarbeiterapp.BeWoChatApplication; +import beyondsoft.bewomitarbeiterapp.R; +import entities.ChatEntity; +import entities.ChatMessage; +import entities.NotificationLog; + import soapConnection.DataIdentifier; import soapConnection.Packet; import soapConnection.SoapCalls; @@ -21,35 +34,49 @@ public class SocketManager { private static final String TAG = "SOCKET_MANAGER"; + private static DatabaseHandler databaseHandler = DatabaseHandler.getInstance(BeWoChatApplication.getInstance()); + public static String tenant; public static Socket socket; public static Thread listenerThread; public static SocketListener socketListener; public static UIHandler uiHandler; + public static LoginCallback loginCallback; public static DataOutputStream dataOutputStream; public static ArrayList onlinePersonOids = new ArrayList<>(); + public static ArrayList onlineEntities = new ArrayList<>(); + public static HashMap notificationEntities = new HashMap<>(); public static void connectToServer(){ - new Thread(new OpenConnection()).start(); + new Thread(new ConnectionOpener()).start(); } public static void sendMessage(Packet packet) { new Thread(new MessageSender(packet.getDataStream())).start(); } - public static class OpenConnection implements Runnable { + private static class ConnectionOpener implements Runnable { public void run() { try { + if(socket != null) { + socket.close(); + } + + socket = null; socket = new Socket(SoapCalls.DESTINATION_ADDRESS, SoapCalls.DESTINATION_PORT); - loginOnServer(); + dataOutputStream = null; + onlinePersonOids.clear(); + onlineEntities.clear(); dataOutputStream = new DataOutputStream(socket.getOutputStream()); socketListener = new SocketListener(); listenerThread = new Thread(socketListener); listenerThread.start(); + + loginOnServer(); } catch(Exception exception) { socket = null; try { @@ -68,17 +95,6 @@ public class SocketManager { } } - public static void closeSocketListener() { - if(listenerThread != null && listenerThread.isAlive()) { - try { - socketListener.terminate(); - listenerThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - public static void logout() { if(socket != null && socket.isConnected()) { try { @@ -97,9 +113,9 @@ public class SocketManager { public static void loginOnServer() { if(socket != null && socket.isConnected()) { try { - Packet packet = new Packet(); - packet.Tenant = tenant; - + Packet packet = new Packet(); + packet.Tenant = tenant; + packet.ChatMessage = getMACAddress(); packet.ChatDataIdentifier = DataIdentifier.LOGIN; new Thread(new MessageSender(packet.getDataStream())).start(); @@ -109,7 +125,7 @@ public class SocketManager { } } - public static class ConnectionClose implements Runnable{ + public static class ConnectionCloser implements Runnable{ public void run(){ try { if (dataOutputStream != null) { @@ -121,7 +137,7 @@ public class SocketManager { socket.close(); } - }catch(IOException se){ + } catch (IOException se) { se.printStackTrace(); } } @@ -136,7 +152,7 @@ public class SocketManager { @Override public void run() { - if(!socket.isConnected()) { + if(socket == null || !socket.isConnected()) { Log.e("MESSAGE_SENDER", "Socket ist nicht verbunden"); } @@ -145,6 +161,21 @@ public class SocketManager { dataOutputStream.write(packetToSend); dataOutputStream.flush(); } catch (IOException 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); + } + } + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); } } @@ -182,9 +213,63 @@ public class SocketManager { try { chatPacket = new Packet(new String(message, "UTF-8")); + } catch(Exception e) { + e.printStackTrace(); + } - Log.i(TAG, "Empfange Nachricht... " + chatPacket.ChatMessage); + if(chatPacket.ChatDataIdentifier.equals(DataIdentifier.LOGIN_SUCCESS) && loginCallback != null) { + Log.i(TAG, "Der Login war erfolgreich"); + loginCallback.doCallback(); + } + + try { + switch (chatPacket.ChatDataIdentifier) { + case MESSAGE: + + databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, false)); + + break; + + case TEAM: + + databaseHandler.addChatMessage(new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, true, chatPacket.ServerseitigeOid, true)); + + break; + + case MESSAGE_RESPONSE: + ChatMessage cm = databaseHandler.getChatMessageById(chatPacket.ClientseitigeOid); + + cm.ServerseitigeOid = chatPacket.ServerseitigeOid; + cm.IsDelivered = true; + + databaseHandler.updateChatMessage(cm); + 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 STATUS_NOTIFICATION_LOGIN_BROADCAST: + + String[] onlinePersons = chatPacket.ChatMessage.split(","); + + for (String onlinePerson : onlinePersons) { + SocketManager.onlinePersonOids.add(Integer.parseInt(onlinePerson)); + } + + break; + } } catch(Exception e) { e.printStackTrace(); } @@ -202,4 +287,36 @@ public class SocketManager { } } } + + public static String getMACAddress() { + try { + List all = Collections.list(NetworkInterface.getNetworkInterfaces()); + + for(NetworkInterface nif : all) { + if(!nif.getName().equalsIgnoreCase("wlan0")) { + continue; + } + + byte[] macBytes = nif.getHardwareAddress(); + if(macBytes == null) { + return "MAC-ADRESSE NICHT ERMITTELBAR"; + } + + StringBuilder res1 = new StringBuilder(); + for(byte b : macBytes) { + res1.append(Integer.toHexString(b & 0xFF) + ":"); + } + + if(res1.length() > 0) { + res1.deleteCharAt(res1.length() - 1); + } + + return res1.toString(); + } + } catch(Exception ex) { + Log.e("GET_MAC_ADDRESS", ex.getMessage()); + } + + return "02:00:00:00:00:00"; + } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java index 937e9fdd6..5949fe0cf 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java @@ -31,7 +31,7 @@ public class ChatMessageDeserializer implements JsonDeserializer { int recipientPersonOid = Long.valueOf(json.get("EmpfängerPersonOid").getAsLong()).intValue(); int serverseitigeOid = Long.valueOf(json.get("Oid").getAsLong()).intValue(); String chatText = json.get("ChatText").getAsString(); - boolean isDelivered = json.get("istZugestellt").getAsBoolean(); + boolean isDelivered = json.get("IsDelivered").getAsBoolean(); boolean isTeam = !json.get("TeamOid").isJsonNull(); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java new file mode 100644 index 000000000..449304e26 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/ConnectivityReceiver.java @@ -0,0 +1,67 @@ +package util; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.preference.PreferenceManager; + +import beyondsoft.bewomitarbeiterapp.BeWoChatApplication; + +/** + * Created by JettenM on 26.08.2016. + */ +public class ConnectivityReceiver extends BroadcastReceiver { + public static ConnectivityReceiverListener connectivityReceiverListener; + + private static final String LOGTAG = "CONNECTIVITY"; + + private static final Long SYNCTIME = 800L; + private static final String LASTTIMESYNC = "DATE"; + SharedPreferences sharedPreferences; + + public ConnectivityReceiver() { + super(); + } + + @Override + public void onReceive(Context context, Intent intent) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + + if(networkInfo != null && networkInfo.isConnected()) { + if(System.currentTimeMillis() - sharedPreferences.getLong(LASTTIMESYNC, 0) >= SYNCTIME) { + sharedPreferences.edit().putLong(LASTTIMESYNC, System.currentTimeMillis()).commit(); + + boolean isConnected = networkInfo.isConnected(); + + if(connectivityReceiverListener != null) { + connectivityReceiverListener.onNetworkConnectionChanged(isConnected); + } + } + } else { + boolean isConnected = networkInfo != null && networkInfo.isConnected(); + + if(connectivityReceiverListener != null) { + connectivityReceiverListener.onNetworkConnectionChanged(isConnected); + } + } + } + + public static boolean isConnected() { + ConnectivityManager cm = (ConnectivityManager) BeWoChatApplication.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + + return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); + } + + public interface ConnectivityReceiverListener { + void onNetworkConnectionChanged(boolean isConnected); + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/NotificationBroadcastReceiver.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/NotificationBroadcastReceiver.java new file mode 100644 index 000000000..0909af00f --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/NotificationBroadcastReceiver.java @@ -0,0 +1,26 @@ +package util; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +/** + * Created by JettenM on 09.09.2016. + */ +public class NotificationBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) + { + String action = intent.getAction(); + if(action.equals(Util.NOTIFICATION_CANCELLED)) + { + Log.i("NOTIFICATION_CANCELLED", "Benachrichtigung gelöscht"); + + // nicht? + //Util.unreadMessagesCount--; + + //TODO: auf die Konversationen achten + } + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java index 300bc8d71..db23b1cb1 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java @@ -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 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 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 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(); } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectionoffline.png b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectionoffline.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c8b98037c3c6834f921d718c32ef34c04f061b GIT binary patch literal 1493 zcmah}c{JMx98ZMAk)Y~|ID(ZLb449-G(;*fLW!0rbHtH4=NM9b&2O`YC5}>UsVJ>7 zM_pA)qoP%3%WBfPrlF2C6w{&gW)^#UdvAa3ec$)`yzlqD@A1Ch9B;B4LRLc-1Og#Q zL{}fNrX8|0R4fx0iYa0R4g1o~6?AY&72P#OVnim97?2DC$sIjpFsQUlT@1ofNS*|k zP+CLU-u}$G22TuW(JB5Z_=LE)i1-w-3j*PjB0^IlXy`P0N;KMy~%KOh#R$?z(HRhE~gyN{41aOjxVXAsT;+T$m zMO`JYNrzCX3uBf*7ouFWtno^v$D#l(g3^K!M=MQ8o402_Y*CD1GoIXE)Cmdn_lgY9 zdVaZe#wAvlGWdp-egy@r00=(Tw0oZ`L53ItHf5q+0xHm`MrH%l1>8NcXRFrury#U{ z7FD4blBuP-iQx;5gqKN??F7kCTBv#;vjaf+#EW3UfEsK(?sjMc#K1ECn{HpnI5s1$ zdrmJ-6*{=1O8@Y~B&#h8o(;A@Dni06(a=5`4xT;4R97te4@7LAexnyx>QPOor7VtK zxKhlo_hXG=1!`<;^)acQifdr6vsyPLW##(HTmQ{R8$iNv9_J#%jl6U*bOrc5s{p2%nZs($_`t1~cEV>d6Wc*F$1sTe>X4CPaW z&1&?C4x1u}KJYkY?3`JvtgYnQk6(9jTaCT%IxQ9=5h~vODBi`0Le{v%P;^~X{KE}x z&}X*?k2gQ99i{Z0gK0M2&@J9OI=MjcnwZLezNHv-+3FeQHG3AK*$wB|0B**iAX@=R z=p?Msu!v#egBO=g`kQZHlRmY-X8+Er&-BavS&eDP6`9sBTF&r%_mPtxQzz@G^*|GE zu-YNdQNG~0LvlB9h|PoZP_J0$J;4gLf?c(`k=j3%BHh1uR6`cZnI#2|hex;NwM#*Z zOT^6v$Yx6Lluy$n9?sNi=gdSi$59r(Sir(8DTc$a9Kn|%3;&*p!5T_C@AwuX@w%_0 zU&34PaAd_RSXTo)zb|c3SD}Sj^1sF9>y$~`tqWJ| zZWqfz7W1m4bhzR ze?XrRQF`J|Y3l)2PsI~9QRry2t1w&BAD>%okZGb>L)CZB21~x!k~j5BZKaoY&LiHZ zT+@+6R&XR98AqMMeDJRO)pg{;^0KZ%F`My^fuqi0Y!ot@Pab}! literal 0 HcmV?d00001 diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectiononline.png b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectiononline.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed3222b86272eddcb9f031d2429a53fb7bdf435 GIT binary patch literal 1407 zcmZuxX;2af6z1?i1)cRDLoeGi_3I@A#*)8 zN!3%;Km3pjY(A~e27>uw+gG@q_Sx-z4xBrVP*C*6k*$!j9U_#W?S<2DfuoAW&T-9o z345dE9i2wtj9Ze?E&@8opmG^=8OH+pvt++K_Q@H=V8^yFy~87Dd#X4vU}^3KUJZw< z_9(!U&zk}VS3(teNoZ?}hKLN!cf)Ai+&B|Z1v`Pp+b4O|+ZiZ9v{qc=4_*za3CBk= zh}6E$>QKub?T0&fs#&VQ zsKq|TGF*_T2l)B@KssVoh$!$!y``snNw>u=PpB5ov1Bn2Os-KKEk<+k%p<$}gV^r& ziET_zYw*k!;HTw_Tx|qI;{pu>GB>NBK`vOBfz1Dan@;O1P%!Y2!?9%)vG8M+<$sQJ?w=1L@z$5zYKkK&TJR%xJqr`ZoiyCR zL64?<*XB^O%!+JrFvzC2K=EyPw#XA&`-1&;5)e37dkURVqo|9or}X{Bq}<^3vL~LJ zb+pM7bItu^8vGZo*(wC|^Ov7){nljCUoQTG+LC^|$yDHM8oPUk~YAEHPCN^9`JU(b4DQea5wJr9%-6E>0A2DYpz#}*1D?u zOxca(gDGCpoV@I<+#y7P`MKxl#dORgpTJ3_uQtO~=Vt(}<|>~)(-9F1NK$#yAKR$6 zwZtB^CfW4e4imDuNQcW*=i{jZdxts_6Lv~@u+oJWrmp0M4u4zamPw`jglNLi&w!@R zlCjwgRR$=2Z$GvDtUjW|-kM`m&vUe>D@;9HD8oWi61zT@QTb;?qmI^%?-%YdovY;J zR+x~*r}AGVU+mIyUo2BJjMTaK2#=9zdYcyHMp8>_HR7vINRadNitDuEcr(lNrqbe? zai!IO-6)-tfR>+h$2O-PBxq#u5sLh=;BXYS`s1ZC^fmp8-$^Ynp@VE=s@YM!+)uQR zwEjBSEe70gl(uI!aJRsXTOa4c%MtfgzHyhnv3i*oW#e=vGAYI{TfGS<;bn=(nD@a9 z;L79Oa-9d=UoA##cIkJn1Q@H9hDmOT{D_a{sOv!?f06$m{{5?{avH z1FS8zo+slt9O4j970VIQU+wZ+py{_ApmAm%lw=IuczfxJ8@wEQR!O7syk3tw+k+5U yLmv(Zyn6zV9{3US|I0pf>y~V>6}$qU@f~b72}!;Qw7RtU2eE#^zAZknMgIUk-E+49 literal 0 HcmV?d00001 diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_login.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_login.xml index 390b5148c..963e453ec 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_login.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_login.xml @@ -22,7 +22,7 @@ + android:layout_height="wrap_content"> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="@dimen/activity_horizontal_margin" + xmlns:tools="http://schemas.android.com/tools" + tools:context=".ChatActivity"> diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/contact_listview_item.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/contact_listview_item.xml new file mode 100644 index 000000000..f128db92d --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/contact_listview_item.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/custom_menuebar.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/custom_menuebar.xml index e3a89695e..ecee6abd0 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/custom_menuebar.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/custom_menuebar.xml @@ -9,9 +9,9 @@ android:layout_width="30dp" android:layout_height="30dp" android:id="@+id/PersonalPic" - android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" android:layout_centerVertical="true" - android:layout_marginLeft="2dp" + android:layout_marginStart="2dp" android:scaleType="fitXY" /> @@ -19,7 +19,6 @@ - /> diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/kontakt_list_chat.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/kontakt_list_chat.xml index 87d3136b5..26b6e515a 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/kontakt_list_chat.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/kontakt_list_chat.xml @@ -1,74 +1,18 @@ + + - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/login.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/login.xml deleted file mode 100644 index 77b9862a9..000000000 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/login.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - -