From fc39430815970919e80e8f334ab16f8aea11185f Mon Sep 17 00:00:00 2001 From: staccatomamba Date: Mon, 19 Sep 2016 17:13:10 +0200 Subject: [PATCH 1/4] Diverse Verbesserungen im AndroidChat --- Android/BewoMitarbeiterApp/app/app.iml | 1 + .../BeWoChatApplication.java | 62 +++++++++++++++++ .../KontaktChatActivity.java | 66 +++++++------------ .../java/soapConnection/DataIdentifier.java | 3 +- .../main/java/soapConnection/SoapCalls.java | 1 + .../java/tcpConnection/SocketManager.java | 16 ++++- .../java/util/ChatMessageDeserializer.java | 1 - .../app/src/main/java/util/Util.java | 17 ++++- BeWoChatServer/Server.cs | 34 +++++----- BeWoPlanerAndroid/AndroidSoapService.asmx.cs | 27 +++----- Shared/BeWoEntityEnums.cs | 2 +- 11 files changed, 149 insertions(+), 81 deletions(-) diff --git a/Android/BewoMitarbeiterApp/app/app.iml b/Android/BewoMitarbeiterApp/app/app.iml index fb99e4f6e..dadeec421 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/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java index 571394f97..835c2da31 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/BeWoChatApplication.java @@ -5,6 +5,22 @@ import android.app.NotificationManager; import android.content.Context; import android.util.Log; +import com.octo.android.robospice.SpiceManager; +import com.octo.android.robospice.UncachedSpiceService; +import com.octo.android.robospice.persistence.exception.SpiceException; +import com.octo.android.robospice.request.listener.RequestListener; + +import org.ksoap2.serialization.PropertyInfo; +import org.ksoap2.serialization.SoapPrimitive; + +import java.util.ArrayList; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import soapConnection.JsonSoapPrimitiveRequest; +import soapConnection.SoapCalls; import util.ConnectivityReceiver; /** @@ -13,13 +29,42 @@ import util.ConnectivityReceiver; public class BeWoChatApplication extends Application { private Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; + private static final SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); + private static BeWoChatApplication mInstance; + private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + @Override public void onCreate() { super.onCreate(); mInstance = this; + + spiceManager.start(this); + + keepAlive(); + } + + public void keepAlive() { + final Runnable blubb = new Runnable() { + @Override + public void run() { + JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.KEEP_ALIVE, new ArrayList()); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); + + Log.i("LOOPER", "Halte Verbindung zum Soap-Server am leben..."); + } + }; + + final ScheduledFuture blubbHandle = scheduler.scheduleAtFixedRate(blubb, 10, 10, TimeUnit.MINUTES); + + scheduler.schedule(new Runnable() { + @Override + public void run() { + blubbHandle.cancel(true); + } + }, 10, TimeUnit.DAYS); } public static synchronized BeWoChatApplication getInstance() { @@ -49,4 +94,21 @@ public class BeWoChatApplication extends Application { Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler); } + + private class JsonSoapPrimitiveRequestListener implements RequestListener { + + @Override + public void onRequestFailure(SpiceException spiceException) { + + } + + @Override + public void onRequestSuccess(SoapPrimitive soapPrimitive) { + if(soapPrimitive == null) { + Log.e("BEWOAPP", "Antwort ist null!"); + } else { + Log.i("BEWOAPP", "Die Antwort hat einen Wert"); + } + } + } } 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 be53bbd38..ee7bc3bd9 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -28,6 +28,10 @@ import java.io.ByteArrayOutputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; import Database.DatabaseHandler; import entities.ChatPerson; @@ -108,32 +112,6 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); - - - - - -// 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); -// -// if(i < test.size() - 1) { -// pExceptions += ";"; -// } -// } -// -// ArrayList propertyInfos2 = new ArrayList<>(); -// propertyInfos.add(SoapConnectionManager.BuildProperty("pSenderPersonOid", SoapConnectionManager.User.getPersonOid(), Long.class)); -// propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", recipientPersonOid, Long.class)); -// propertyInfos.add(SoapConnectionManager.BuildProperty("pExceptions", pExceptions, String.class)); -// propertyInfos.add(SoapConnectionManager.BuildProperty("pIsForTeam", isTeam, Boolean.class)); -// -// JsonSoapPrimitiveRequest request2 = new JsonSoapPrimitiveRequest(SoapCalls.GET_ALL_CHAT_MESSAGES, propertyInfos); -// spiceManager.execute(request2, new JsonSoapPrimitiveRequestListenerForUnreadMessages()); } public UIHandler kontaktChatActivityUIHandler = new UIHandler() { @@ -203,6 +181,25 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi } }); + break; + + case STATUS_REQUEST: + + Log.i(LOGTAG, "Aktualisiere die Kontaktliste"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); + + for(ContactListItem item : ka.values) { + item.isOnline = SocketManager.onlinePersonOids.contains(item.getPersonOid()); + } + + ka.notifyDataSetChanged(); + } + }); + break; } } catch(Exception pe) { @@ -347,21 +344,4 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi ((KontaktAdapter) listView.getAdapter()).notifyDataSetChanged(); } } - - private final class JsonSoapPrimitiveRequestListenerForUnreadMessages implements RequestListener { - @Override - public void onRequestFailure(SpiceException spiceException) { - Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der ungelesenen Nachrichten aufgetreten.", Toast.LENGTH_SHORT).show(); - } - - @Override - public void onRequestSuccess(SoapPrimitive soapPrimitive) { - //TODO: Nachrichten, die empfangen wurden als man offline war, laden und jeweils die neueste anzeigen. - if(soapPrimitive == null) { - Log.i("KONTAKT_CHAT_ACTIVITY", "soapPrimitive ist NULL!"); - } - - Gson gson = new GsonBuilder().create(); - } - } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java index d5231c693..92e3393ce 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java @@ -18,7 +18,8 @@ public enum DataIdentifier { STATUS_NOTIFICATION_BESCHAEFTIGT(11), STATUS_NOTIFICATION_ONLINE(12), STATUS_NOTIFICATION_OFFLINE(13), - LOGIN_SUCCESS(14); + LOGIN_SUCCESS(14), + STATUS_REQUEST(15); private final int value; DataIdentifier(int value) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java index 5cab44727..ef83a1448 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java @@ -9,6 +9,7 @@ public class SoapCalls { public static String GET_CONTACTS_FOR_PERSON = "GetContactsForPerson"; public static String GET_ALL_CHAT_MESSAGES = "GetAllChatMessagesForSenderAndRecipient"; + public static String KEEP_ALIVE = "KeepAlive"; //TODO: "app4.bewoplaner.de";// // public static String DESTINATION_ADDRESS = "app4.bewoplaner.de"; diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java index 88c0397b0..382bc778e 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java @@ -86,7 +86,7 @@ public class SocketManager { public void run() { connectToServer(); } - }, 30000); + }, 5000); } catch(Exception exception2) { exception2.printStackTrace(); } @@ -299,6 +299,20 @@ public class SocketManager { } } + break; + + case STATUS_REQUEST: + + String contactsCsv = chatPacket.ChatMessage; + + String[] stringOids = contactsCsv.split(","); + + SocketManager.onlinePersonOids.clear(); + + for(String item : stringOids) { + SocketManager.onlinePersonOids.add(Integer.valueOf(item)); + } + break; } } catch(Exception e) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java index 869de1d4d..e2f165a39 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java @@ -18,7 +18,6 @@ import entities.ChatMessage; * Created by JettenM on 09.08.2016. */ public class ChatMessageDeserializer implements JsonDeserializer { - private static final String LOGTAG = "MESSAGE_DESERIALIZER"; @Override public ChatMessage deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java index f3ae7d4c9..dc43bdc6f 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java @@ -46,7 +46,6 @@ public class Util { public static final String NOTIFICATION_CANCELLED = "notification_cancelled"; - //public static int unreadMessagesCount = 0; public static int conversationsCount = 0; public static HashMap entity2MessagesCountRel = new HashMap<>(); @@ -171,6 +170,11 @@ public class Util { Log.e("LOGIN_CALLBACK", "LoginCallback aufgerufen. Verschicke nicht verschickte Nachrichten..."); sendUnsentMessages(context); + + sendStatusRequest(); + + // TODO: Nachrichten herunterladen, sofern man sich in der ChatActivity befindet + } }; @@ -220,6 +224,17 @@ public class Util { thread.start(); } + public static void sendStatusRequest() { + final Packet requestPacket = new Packet(); + + requestPacket.ChatDataIdentifier = DataIdentifier.STATUS_REQUEST; + requestPacket.ChatName = SoapConnectionManager.User.getFullName(); + requestPacket.SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue(); + requestPacket.Tenant = SoapConnectionManager.User.getTenant(); + + SocketManager.sendMessage(requestPacket); + } + public static ChatEntity getChatEntityFromOnlineEntitiesByOid(int personOid, boolean isTeam) { for(ChatEntity item : SocketManager.onlineEntities) { if(item.getOid() == personOid && item.isTeam() == isTeam) { diff --git a/BeWoChatServer/Server.cs b/BeWoChatServer/Server.cs index bc7459271..a2083802b 100644 --- a/BeWoChatServer/Server.cs +++ b/BeWoChatServer/Server.cs @@ -315,7 +315,7 @@ namespace BeWoChatServer var notificationPacketLogout = new Packet(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, 0) {DataIdentifier = DataIdentifier.StatusNotificationLogout}; - Console.WriteLine(DateTime.Now + ": Sende Logout an alle anderen Clients"); + Console.WriteLine(DateTime.Now + ": Sende Logout von " + dataPacket.ClientName + " an alle anderen Clients"); foreach (var client in clientList.Where(w => !w.Value.PersonOid.Equals(dataPacket.SenderPersonOid))) { client.Key.Send(notificationPacketLogout.GetDataStream()); @@ -404,23 +404,27 @@ namespace BeWoChatServer break; - case DataIdentifier.MessageResponseToServer: + case DataIdentifier.StatusRequest: + + var onlinePersons = clientList.Where(w => w.Value.PersonOid != dataPacket.SenderPersonOid && w.Value.PersonOid > 0).Select(s => s.Value.PersonOid).Distinct().ToList(); + var oidCSV = ""; - try - { - Monitor.Enter(_Lock); + foreach (var oid in onlinePersons) + { + oidCSV += oid; - DefaultHibernateSessionManager.CurrentTenant = dataPacket.Tenant; + if (onlinePersons.IndexOf(oid) != onlinePersons.Count - 1) + { + oidCSV += ","; + } + } - var message = DAOFactory.GenericDAO.LoadByID(dataPacket.ServerseitigeOid); - message.IsDelivered = true; + if (oidCSV.Length > 0) + { + var packet = new Packet { ChatMessage = oidCSV, ClientName = dataPacket.ClientName, DataIdentifier = DataIdentifier.StatusRequest, MessageTimeStamp = DateTime.Now, Tenant = dataPacket.Tenant, SenderPersonOid = dataPacket.SenderPersonOid }; - DAOFactory.GenericDAO.Update(message); - } - finally - { - Monitor.Exit(_Lock); - } + dataPacket.Socket.Send(packet.GetDataStream()); + } break; } @@ -429,7 +433,7 @@ namespace BeWoChatServer } catch (Exception e) { - Console.WriteLine(DateTime.Now + ": Ein Fehler ist aufgetreten oder die App ist abgestürzt. Der Client wird ausgeloggt"); + Console.WriteLine(DateTime.Now + ": Ein Fehler ist aufgetreten oder die App ist abgestürzt. Der Client wird ausgeloggt (" + dataPacket.ClientName + ")"); var sender = dataPacket.Socket; diff --git a/BeWoPlanerAndroid/AndroidSoapService.asmx.cs b/BeWoPlanerAndroid/AndroidSoapService.asmx.cs index 1035d0e38..080025ce3 100644 --- a/BeWoPlanerAndroid/AndroidSoapService.asmx.cs +++ b/BeWoPlanerAndroid/AndroidSoapService.asmx.cs @@ -41,6 +41,9 @@ namespace BeWoPlanerAndroid SoapHibernateSessionManager.ConfigureHibernateSession(); + var derTimeout = Session.Timeout; + Debug.WriteLine("Timeout der Session: " + derTimeout); + var s = new UserServiceImp(); if(s.IsUserValid(pUsername, pPassword, null, "SOAPClient", false) == UserValidationResult.UserValid) @@ -100,24 +103,6 @@ namespace BeWoPlanerAndroid var messages = DAOFactory.SearchDAO.FindAllChatMessagesForAndroid(pSenderPersonOid, pRecipientPersonOid, exceptions, pIsForTeam).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfängerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs))); - //messages.DoForEach(d => Debug.WriteLine("ChatText: " + Encoding.UTF8.GetString(d.ChatText) + "; ByteArray: " + d.ChatText.ToString())); - - foreach(var item in messages) - { - var str = ""; - item.ChatText.DoForEach(d => str += d.ToString() + ","); - - var abc = MapperFactory.ChatMessagesDC_ChatMessages.MapToNewDC(item); - - Debug.WriteLine("UTF-8: " + Encoding.UTF8.GetString(item.ChatText) - + "\nASCII: " + Encoding.ASCII.GetString(item.ChatText) - + "\nUTF-7: " + Encoding.UTF7.GetString(item.ChatText) - + "\nBigEndianUnicode: " + Encoding.BigEndianUnicode.GetString(item.ChatText) - + "\nUTF-32: " + Encoding.UTF32.GetString(item.ChatText)); - } - - //jsonMessages.DoForEach(m => Debug.WriteLine("Team: " + (m.TeamOid == null ? "Nein" : m.TeamOid.Value.ToString()) + "; Text: " + m.ChatText)); - return JsonConvert.SerializeObject(jsonMessages); } @@ -188,6 +173,12 @@ namespace BeWoPlanerAndroid return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); } + [WebMethod(EnableSession = true)] + public string KeepAlive() + { + return "lebt"; + } + public class ChatPerson { public long Oid { get; set; } diff --git a/Shared/BeWoEntityEnums.cs b/Shared/BeWoEntityEnums.cs index 48033354a..a2d814044 100644 --- a/Shared/BeWoEntityEnums.cs +++ b/Shared/BeWoEntityEnums.cs @@ -839,7 +839,7 @@ namespace BS.Shared StatusNotificationOnline, StatusNotificationOffline, LoginSuccess, - MessageResponseToServer + StatusRequest } public enum ChatType From b8494e3b6f526915cf0d23400470ce99bc9d3bf5 Mon Sep 17 00:00:00 2001 From: staccatomamba Date: Wed, 21 Sep 2016 12:42:32 +0200 Subject: [PATCH 2/4] Nur Mitarbeiter mit aktivem Chatcode werden auf die App geladen. Beim Herunterziehen der Kontaktliste in der App werden die Kontakte aktualisiert. Teams sind noch davon ausgenommen. --- Android/BewoMitarbeiterApp/.idea/gradle.xml | 8 +- Android/BewoMitarbeiterApp/app/app.iml | 44 ++++++-- .../main/java/Database/DatabaseHandler.java | 19 +++- .../bewomitarbeiterapp/ContactListItem.java | 39 ++++++- .../KontaktChatActivity.java | 104 +++++++++++++++--- .../bewomitarbeiterapp/LoginActivity.java | 1 - .../OnRequestSuccessCallback.java | 9 ++ .../main/java/soapConnection/SoapCalls.java | 1 - .../java/tcpConnection/SocketManager.java | 8 +- .../app/src/main/java/util/Util.java | 22 ++++ .../src/main/res/layout/kontakt_list_chat.xml | 5 +- Android/BewoMitarbeiterApp/build.gradle | 2 +- BeWoPlanerAndroid/AndroidSoapService.asmx.cs | 13 +-- Data/Access/SearchDAO.cs | 31 +++++- 14 files changed, 245 insertions(+), 61 deletions(-) create mode 100644 Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/OnRequestSuccessCallback.java diff --git a/Android/BewoMitarbeiterApp/.idea/gradle.xml b/Android/BewoMitarbeiterApp/.idea/gradle.xml index bb1e6cef5..e5e9072bd 100644 --- a/Android/BewoMitarbeiterApp/.idea/gradle.xml +++ b/Android/BewoMitarbeiterApp/.idea/gradle.xml @@ -13,13 +13,7 @@ - + diff --git a/Android/BewoMitarbeiterApp/app/app.iml b/Android/BewoMitarbeiterApp/app/app.iml index dadeec421..2b71d64e0 100644 --- a/Android/BewoMitarbeiterApp/app/app.iml +++ b/Android/BewoMitarbeiterApp/app/app.iml @@ -32,12 +32,14 @@ + + @@ -64,14 +66,6 @@ - - - - - - - - @@ -80,10 +74,17 @@ + + + + + + + + - @@ -93,6 +94,7 @@ + @@ -115,10 +117,32 @@ - + + + + + + + + + + + + + + + + + + + + + + + \ 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 4791fa116..628a5144b 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java @@ -50,6 +50,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { private static final String KEY_IS_TEAM = "isteam"; private static final String KEY_TEAM_MEMBER_OIDS = "teammemberoids"; private static final String KEY_TEAM_MEMBER_NAMES = "teammembernames"; + private static final String KEY_VERSION = "version"; // ChatMessage-Tabelle @@ -98,7 +99,8 @@ public class DatabaseHandler extends SQLiteOpenHelper { KEY_PICTURE_BLOB + " BLOB, " + KEY_IS_TEAM + " INTEGER, " + KEY_TEAM_MEMBER_NAMES + " TEXT, " + - KEY_TEAM_MEMBER_OIDS + " TEXT)"; + KEY_TEAM_MEMBER_OIDS + " TEXT, " + + KEY_VERSION + " INTEGER)"; db.execSQL(CREATE_CONTACTS_TABLE); @@ -291,6 +293,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_IS_TEAM, contact.isTeam); values.put(KEY_TEAM_MEMBER_NAMES, contact.teamMemberNames); values.put(KEY_TEAM_MEMBER_OIDS, contact.teamMemberOids); + values.put(KEY_VERSION, contact.getVersion()); writableDatabase.insertOrThrow(TABLE_CONTACTS, null, values); } @@ -403,7 +406,8 @@ public class DatabaseHandler extends SQLiteOpenHelper { KEY_PICTURE_BLOB, KEY_IS_TEAM, KEY_TEAM_MEMBER_NAMES, - KEY_TEAM_MEMBER_OIDS}, + KEY_TEAM_MEMBER_OIDS, + KEY_VERSION}, KEY_ID + "=?", new String[]{String.valueOf(id)}, null,null,null,null); @@ -418,8 +422,9 @@ public class DatabaseHandler extends SQLiteOpenHelper { boolean contactIsTeam = cursor.getInt(4) == 1; String teamMemberOids = cursor.getString(5); String teamMemberNames = cursor.getString(6); + int contactVersion = cursor.getInt(7); - ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames); + ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames, contactVersion); cursor.close(); @@ -447,6 +452,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { contact.isTeam = cursor.getInt(4) == 1; contact.teamMemberNames = cursor.getString(5); contact.teamMemberOids = cursor.getString(6); + contact.setVersion(cursor.getInt(7)); contactList.add(contact); } while (cursor.moveToNext()); @@ -499,6 +505,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_IS_TEAM, (contact.isTeam ? 1 : 0)); values.put(KEY_TEAM_MEMBER_NAMES, contact.teamMemberNames); values.put(KEY_TEAM_MEMBER_OIDS, contact.teamMemberOids); + values.put(KEY_VERSION, contact.getVersion()); return writableDatabase.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); } @@ -551,7 +558,8 @@ public class DatabaseHandler extends SQLiteOpenHelper { KEY_PICTURE_BLOB, KEY_IS_TEAM, KEY_TEAM_MEMBER_NAMES, - KEY_TEAM_MEMBER_OIDS}, + KEY_TEAM_MEMBER_OIDS, + KEY_VERSION}, KEY_PERSONOID + "=? AND " + KEY_IS_TEAM + "=?", new String[]{String.valueOf(personOid), String.valueOf((isTeam ? 1 : 0))}, null,null,null,null); @@ -565,8 +573,9 @@ public class DatabaseHandler extends SQLiteOpenHelper { boolean contactIsTeam = cursor.getInt(4) == 1; String teamMemberOids = cursor.getString(5); String teamMemberNames = cursor.getString(6); + int contactVersion = cursor.getInt(7); - ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames); + ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames, contactVersion); cursor.close(); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ContactListItem.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ContactListItem.java index 4c07d07c2..b1986e9e7 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ContactListItem.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ContactListItem.java @@ -1,5 +1,7 @@ package beyondsoft.bewomitarbeiterapp; +import entities.ChatPerson; + /** * Created by JettenM on 24.08.2016. */ @@ -8,6 +10,7 @@ public class ContactListItem { private String mChatName; private byte[] mPicture; private int mPersonOid; + private int mVersion; public boolean isTeam; public boolean isOnline; @@ -16,7 +19,7 @@ public class ContactListItem { public ContactListItem(){} - public ContactListItem(int id, String kontaktname, int personOid, byte[] picture, boolean isTeam, String teamMemberOids, String teamMemberNames){ + public ContactListItem(int id, String kontaktname, int personOid, byte[] picture, boolean isTeam, String teamMemberOids, String teamMemberNames, int version){ this.mId = id; this.mChatName = kontaktname; this.mPersonOid = personOid; @@ -24,15 +27,17 @@ public class ContactListItem { this.isTeam = isTeam; this.teamMemberNames = teamMemberNames; this.teamMemberOids = teamMemberOids; + this.mVersion = version; } - public ContactListItem(String kontaktname, int personOid, boolean isTeam, String teamMemberOids, String teamMemberNames){ + public ContactListItem(String kontaktname, int personOid, boolean isTeam, String teamMemberOids, String teamMemberNames, int version){ this.mChatName = kontaktname; this.mPersonOid = personOid; this.mPicture = null; this.isTeam = isTeam; this.teamMemberNames = teamMemberNames; this.teamMemberOids = teamMemberOids; + this.mVersion = version; } public int getId(){ @@ -73,4 +78,34 @@ public class ContactListItem { this.mPersonOid = mPersonOid; } + + public int getVersion() { + return mVersion; + } + + public void setVersion(int mVersion) { + this.mVersion = mVersion; + } + + @Override + public String toString() { + String result = ""; + + result += "Id: " + mId; + result += "\nChatName: " + mChatName; + result += "\nPersonOid: " + mPersonOid; + result += "\nIsTeam: " + isTeam; + if(isTeam) { + result += "\nTeam members: " + teamMemberNames; + result += "\nMember Oids: " + teamMemberOids; + } + + result += "\nVersion: " + mVersion; + + return result; + } + + public Boolean compareToChatPerson(ChatPerson chatPerson) { + return mPersonOid == chatPerson.Oid && isTeam == chatPerson.IsTeam; + } } 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 ee7bc3bd9..bf83b3ffd 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; @@ -27,15 +28,15 @@ import org.ksoap2.serialization.SoapPrimitive; import java.io.ByteArrayOutputStream; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; +import java.util.Map; import Database.DatabaseHandler; +import entities.ChatEntity; import entities.ChatPerson; import soapConnection.JsonSoapPrimitiveRequest; +import soapConnection.OnRequestSuccessCallback; import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; @@ -47,14 +48,16 @@ import util.Util; /** * Created by bib on 02.05.2016. */ -public class KontaktChatActivity extends ActionBarActivity implements ConnectivityReceiver.ConnectivityReceiverListener { +public class KontaktChatActivity extends ActionBarActivity implements ConnectivityReceiver.ConnectivityReceiverListener, SwipeRefreshLayout.OnRefreshListener { - private static final String LOGTAG = ""; + private static final String LOGTAG = "KONTAKT_CHAT_ACTIVITY"; private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); private DatabaseHandler databaseHandler; - public static ListView listView; + public ListView listView; + + private SwipeRefreshLayout swipeRefreshLayout; ArrayList contactList = new ArrayList<>(); @@ -68,6 +71,8 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi super.onCreate(savedInstanceState); setContentView(R.layout.kontakt_list_chat); + swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); + databaseHandler = DatabaseHandler.getInstance(this); listView = (ListView) findViewById(R.id.contact_listview); @@ -88,7 +93,6 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi 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); @@ -103,15 +107,49 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi } }); + swipeRefreshLayout.setOnRefreshListener(this); + + swipeRefreshLayout.post(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(true); + + updateContactList(); + } + } + ); + 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()); + } + + @Override + public void onRefresh() { + updateContactList(); + } + + private void updateContactList() { + swipeRefreshLayout.setRefreshing(true); + 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()); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListener(new OnRequestSuccessCallback() { + @Override + public void doCallback() { + Util.sendStatusRequest(); + + swipeRefreshLayout.setRefreshing(false); + } + })); } public UIHandler kontaktChatActivityUIHandler = new UIHandler() { @@ -163,6 +201,7 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi ka.notifyDataSetChanged(); } }); + break; case STATUS_NOTIFICATION_LOGIN_BROADCAST: runOnUiThread(new Runnable() { @@ -287,6 +326,13 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi private final class JsonSoapPrimitiveRequestListener implements RequestListener { + //TODO: zusätzliches onRequestSuccess-Callback einbauen + OnRequestSuccessCallback callback; + + JsonSoapPrimitiveRequestListener(OnRequestSuccessCallback callback) { + this.callback = callback; + } + @Override public void onRequestFailure(SpiceException spiceException) { Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der Kontaktliste aufgetreten.", Toast.LENGTH_SHORT).show(); @@ -295,9 +341,11 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { - Log.i("KONTAKT_CHAT_ACTIVITY", "soapPrimitive ist NULL!"); + Log.e("KONTAKT_CHAT_ACTIVITY", "soapPrimitive ist NULL!"); } + Log.i(LOGTAG, "Lade Kontakte vom Server herunter"); + Gson gson = new GsonBuilder().create(); Type listType = new TypeToken>(){}.getType(); @@ -306,20 +354,42 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi List lc = databaseHandler.getAllContacts(); - List oidList = new ArrayList<>(); + Map oid2VersionList = new HashMap<>(); for(ContactListItem item : lc) { - oidList.add(item.getPersonOid()); + Log.i(LOGTAG, "Aus DB: Oid: " + item.getPersonOid() + "; Version: " + item.getVersion() + "; " + item.getChatName()); + oid2VersionList.put(new ChatEntity(item.getPersonOid(), item.isTeam), item.getVersion()); } for(ChatPerson cp : result) { - Log.i("KONTAKTLISTE", "Version: " + cp.Version); + ContactListItem contact = new ContactListItem(cp.Name, cp.Oid, cp.IsTeam, cp.TeamMemberOids, cp.TeamMemberNames, cp.Version); - if(!oidList.contains(cp.Oid)) { - databaseHandler.addContact(new ContactListItem(cp.Name, cp.Oid, cp.IsTeam, cp.TeamMemberOids, cp.TeamMemberNames)); + ChatEntity cliEntity = new ChatEntity(cp.Oid, cp.IsTeam); + + if(!oid2VersionList.containsKey(cliEntity)) { + databaseHandler.addContact(contact); + } else if(oid2VersionList.get(cliEntity) < cp.Version) { + + contact.setId(databaseHandler.getContactByPersonOid(cp.Oid, cp.IsTeam).getId()); + databaseHandler.updateContact(contact); + + //TODO: Team updaten, wenn Person Mitglied ist +// if(Util.contains(Util.convertStringArrayToIntegerArray(cp.TeamMemberOids.split(",")), cp.Oid)) { +// +// } + + for(ContactListItem item : lc) { + if(!item.isTeam) { + continue; + } + + + } } } + oid2VersionList.clear(); + lc = databaseHandler.getAllContacts(); for(ContactListItem item : lc) { @@ -342,6 +412,10 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi listView.setAdapter(adapter); ((KontaktAdapter) listView.getAdapter()).notifyDataSetChanged(); + + if(callback != null) { + callback.doCallback(); + } } } } 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 f6773a3e3..4bc8b12f8 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java @@ -300,7 +300,6 @@ public class LoginActivity extends ActionBarActivity { SocketManager.tenant = mTenantView.getText().toString(); - //TODO: stattdessen ConnectToServer und im Callback die ChatActivity aufrufen SocketManager.loginCallback = new LoginCallback() { @Override public void doCallback() { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/OnRequestSuccessCallback.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/OnRequestSuccessCallback.java new file mode 100644 index 000000000..fbd2fe1d6 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/OnRequestSuccessCallback.java @@ -0,0 +1,9 @@ +package soapConnection; + +/** + * Created by JettenM on 20.09.2016. + */ + +public interface OnRequestSuccessCallback { + void doCallback(); +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java index ef83a1448..2bc5ed252 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/SoapCalls.java @@ -23,7 +23,6 @@ public class SoapCalls { // 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; diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java index 382bc778e..e0c76f7d0 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java @@ -38,12 +38,12 @@ public class SocketManager { private static DatabaseHandler databaseHandler = DatabaseHandler.getInstance(BeWoChatApplication.getInstance()); public static String tenant; - public static Socket socket; - public static Thread listenerThread; - public static SocketListener socketListener; + private static Socket socket; + private static Thread listenerThread; + private static SocketListener socketListener; public static UIHandler uiHandler; public static LoginCallback loginCallback; - public static DataOutputStream dataOutputStream; + private static DataOutputStream dataOutputStream; public static ArrayList onlinePersonOids = new ArrayList<>(); public static ArrayList onlineEntities = new ArrayList<>(); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java index dc43bdc6f..12c12e28a 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/Util.java @@ -13,6 +13,7 @@ import android.support.v4.app.NotificationCompat; import android.util.Log; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import java.util.Map; @@ -260,4 +261,25 @@ public class Util { entity2MessagesCountRel.remove(entity); } } + + 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); + } } 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 26b6e515a..8b3f80769 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,7 +1,8 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/Android/BewoMitarbeiterApp/build.gradle b/Android/BewoMitarbeiterApp/build.gradle index b896e3769..74d945e88 100644 --- a/Android/BewoMitarbeiterApp/build.gradle +++ b/Android/BewoMitarbeiterApp/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/BeWoPlanerAndroid/AndroidSoapService.asmx.cs b/BeWoPlanerAndroid/AndroidSoapService.asmx.cs index 080025ce3..6fb54da66 100644 --- a/BeWoPlanerAndroid/AndroidSoapService.asmx.cs +++ b/BeWoPlanerAndroid/AndroidSoapService.asmx.cs @@ -6,6 +6,7 @@ using System.Text; using System.Web.Services; using BeWo.Data.Access; +using BeWo.Data.Entities; using BeWo.Service.DCEntityMapper; using BeWo.Service.ServiceContracts; using BeWo.Service.ServiceImplementations; @@ -133,13 +134,7 @@ namespace BeWoPlanerAndroid var isEmployee = customer == null; // mit den eigenen Klienten und allen anderen Mitarbeitern - var customerOids = employee.Employee2CustomerList.Select(s => s.CustomerOid.Value); - var customers = CustomerService.GetCompactCustomersById(customerOids); - - var employees = EmployeeService.GetAllActiveEmployeesCompact().Where(w => !Equals(w.EmployeeOid, employee.Oid.Value)); - - var result = employees.Select(emp => new ChatPerson(emp.PersonOid, emp.FirstName + " " + emp.LastName, false, null, null, emp.Version)).ToList(); - result.AddRange(customers.Select(cus => new ChatPerson(cus.PersonOid, cus.FullName, false, null, null, cus.Version))); + var allPersons = DAOFactory.SearchDAO.FindAllChatAuthorizedPersonsForEmployee(employee.Oid.Value).Where(w => w.Oid.Value != employee.Person.Oid.Value).Select(s => new ChatPerson(s.Oid.Value, s.FirstNameLastName, false, null, null, s.Version.Value)).ToList(); var teams = DAOFactory.SearchDAO.FindTeamsOfEmployee(employee.Oid.Value).Where(w => w.MemberList.Count > 1); @@ -162,10 +157,10 @@ namespace BeWoPlanerAndroid } } - result.Add(new ChatPerson(team.Oid.Value, team.Name, true, memberString, memberNames, team.Version.Value)); + allPersons.Add(new ChatPerson(team.Oid.Value, team.Name, true, memberString, memberNames, team.Version.Value)); } - return SerializeObject(result); + return SerializeObject(allPersons); } private static string SerializeObject(object obj) diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs index b912374cf..80b2792a0 100644 --- a/Data/Access/SearchDAO.cs +++ b/Data/Access/SearchDAO.cs @@ -437,8 +437,7 @@ namespace BeWo.Data.Access return test; } - public IEnumerable FindAccoutingTransactions(DateTimeSpan pSpan, - long? pSupportConceptOid, long? pSupportConceptCostBearerRelOid) + public IEnumerable FindAccoutingTransactions(DateTimeSpan pSpan, long? pSupportConceptOid, long? pSupportConceptCostBearerRelOid) { var lCriteria = CreateCriteriaIsActive() .CreateAlias(AccountingTransaction.PropertyName_CostBearer2SupportConcept, "cb2sc", JoinType.LeftOuterJoin); @@ -561,7 +560,6 @@ namespace BeWo.Data.Access .List(); } - public IEnumerable GetAllCustomersWithRelatedEmployee() { return CreateCriteria() @@ -1224,7 +1222,7 @@ namespace BeWo.Data.Access return criteria.List(); } - static string GetSpecificValueFromRecurrenceInfo(string str, int startIndex) + private static string GetSpecificValueFromRecurrenceInfo(string str, int startIndex) { var valueBuilder = new StringBuilder(); @@ -1630,5 +1628,30 @@ namespace BeWo.Data.Access return c.List(); } + + public IEnumerable FindAllChatAuthorizedPersonsForEmployee(long pEmployeeOid) + { + var employee = CreateCriteriaIsActive().Add(Restrictions.Eq(BeWoEntityBase.PropertyName_Oid, pEmployeeOid)).UniqueResult(); + + var relatedCustomerOids = employee.Employee2CustomerList.Select(s => s.CustomerOid.Value); + + var c1 = CreateCriteriaIsActive() + .Add(Restrictions.Eq(CustomerAPPCode.PropertyName_IsChatAktiv, 1)); + var codes = c1.List().Select(s => s.CustomerOid.Value).ToArray(); + var c2 = CreateCriteriaIsActive() + .Add(Restrictions.In(BeWoEntityBase.PropertyName_Oid, codes)) + .Add(Restrictions.In(BeWoEntityBase.PropertyName_Oid, relatedCustomerOids.ToList())); + + var customers = c2.List(); + var employees = FindAllChatActiveEmployees(); + + var oids = customers.Select(s => s.Person.Oid.Value).ToList(); + oids.AddRange(employees.Select(s => s.Person.Oid.Value)); + + var c = CreateCriteriaIsActive() + .Add(Restrictions.In(BeWoEntityBase.PropertyName_Oid, oids.Distinct().ToList())); + + return c.List(); + } } } From be1fc46397c65a3db19b46b43a70e473e6e4ee5d Mon Sep 17 00:00:00 2001 From: staccatomamba Date: Thu, 22 Sep 2016 14:00:46 +0200 Subject: [PATCH 3/4] Styling der App --- Android/BewoMitarbeiterApp/app/app.iml | 16 +++---- .../KontaktChatActivity.java | 11 ----- .../bewomitarbeiterapp/LoginActivity.java | 1 + .../app/src/main/res/drawable/bewo_btn.xml | 45 ++++++++++++++++++ .../src/main/res/drawable/orange_button.xml | 42 ++++++++++++++++ .../src/main/res/drawable/roundedbutton.xml | 8 ---- .../res/drawable/serverconnectionoffline.png | Bin 1493 -> 0 bytes .../res/drawable/serverconnectiononline.png | Bin 1407 -> 0 bytes .../app/src/main/res/drawable/textlines.xml | 20 ++++++++ .../src/main/res/layout/activity_login.xml | 30 +++++++++--- .../app/src/main/res/values/colors.xml | 1 + .../app/src/main/res/values/styles.xml | 18 +++++++ BeWo/View/HomeDragPanelView.xaml.cs | 6 +-- 13 files changed, 162 insertions(+), 36 deletions(-) create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/bewo_btn.xml create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/orange_button.xml delete mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/roundedbutton.xml delete mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectionoffline.png delete mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectiononline.png create mode 100644 Android/BewoMitarbeiterApp/app/src/main/res/drawable/textlines.xml diff --git a/Android/BewoMitarbeiterApp/app/app.iml b/Android/BewoMitarbeiterApp/app/app.iml index 2b71d64e0..3d5797514 100644 --- a/Android/BewoMitarbeiterApp/app/app.iml +++ b/Android/BewoMitarbeiterApp/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + 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 bf83b3ffd..236e5291d 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -374,17 +374,6 @@ public class KontaktChatActivity extends ActionBarActivity implements Connectivi databaseHandler.updateContact(contact); //TODO: Team updaten, wenn Person Mitglied ist -// if(Util.contains(Util.convertStringArrayToIntegerArray(cp.TeamMemberOids.split(",")), cp.Oid)) { -// -// } - - for(ContactListItem item : lc) { - if(!item.isTeam) { - continue; - } - - - } } } 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 4bc8b12f8..bf30b91dc 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java @@ -9,6 +9,7 @@ import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; + import android.text.TextUtils; import android.util.Base64; import android.util.Log; diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/bewo_btn.xml b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/bewo_btn.xml new file mode 100644 index 000000000..c607d28e2 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/bewo_btn.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/orange_button.xml b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/orange_button.xml new file mode 100644 index 000000000..b2530ba38 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/orange_button.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/roundedbutton.xml b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/roundedbutton.xml deleted file mode 100644 index 1a5836519..000000000 --- a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/roundedbutton.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectionoffline.png b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectionoffline.png deleted file mode 100644 index a5c8b98037c3c6834f921d718c32ef34c04f061b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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}! diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectiononline.png b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/serverconnectiononline.png deleted file mode 100644 index 0ed3222b86272eddcb9f031d2429a53fb7bdf435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/drawable/textlines.xml b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/textlines.xml new file mode 100644 index 000000000..c9d711afe --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/res/drawable/textlines.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file 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 963e453ec..81e389ad2 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_login.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/activity_login.xml @@ -8,6 +8,7 @@ android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" + android:background="@color/white" tools:context="beyondsoft.bewomitarbeiterapp.LoginActivity"> @@ -37,7 +38,10 @@ android:hint="@string/prompt_token" android:inputType="text" android:maxLines="1" - android:singleLine="true"/> + android:paddingTop="10dp" + android:paddingBottom="2dp" + android:background="@drawable/textlines" + /> + android:paddingTop="10dp" + android:paddingBottom="2dp" + android:background="@drawable/textlines" + /> + android:paddingTop="10dp" + android:paddingBottom="2dp" + android:background="@drawable/textlines" + /> + android:paddingTop="10dp" + android:paddingBottom="3dp" + android:background="@drawable/textlines" + />