package beyondsoft.bewomitarbeiterapp; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBarActivity; import android.util.Base64; 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; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; 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.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import Database.DatabaseHandler; import entities.ChatEntity; import entities.ChatMessage; import entities.ChatPerson; import entities.ImageEntity; import soapConnection.ApplicationUser; import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.OnRequestSuccessCallback; import soapConnection.Packet; import soapConnection.SoapCalls; import soapConnection.SoapConnectionManager; import tcpConnection.Callback; import tcpConnection.SocketManager; import tcpConnection.UIHandler; import util.BeWoLog; import util.ChatMessageDeserializer; import util.ChatPersonDeserializer; import util.ConnectivityReceiver; import util.ImageEntityDeserializer; import util.SecurityUtils; import util.Util; /** * Created by bib on 02.05.2016. */ public class KontaktChatActivity extends ActionBarActivity implements ConnectivityReceiver.ConnectivityReceiverListener, SwipeRefreshLayout.OnRefreshListener { private static boolean isDownloadOfContacsInProgress = false; private static final String LOGTAG = "KONTAKT_CHAT_ACTIVITY"; private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); private DatabaseHandler databaseHandler; public ListView listView; private static boolean shouldReloadLatestMessages = false; public static void setShouldReloadLatestMessages(boolean pShouldReloadLatestMessages) { shouldReloadLatestMessages = pShouldReloadLatestMessages; } private SwipeRefreshLayout swipeRefreshLayout; ArrayList contactList = new ArrayList<>(); @Override public void onNetworkConnectionChanged(boolean isConnected) { BeWoChatApplication.reconnectWithServer(isConnected, KontaktChatActivity.this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SocketManager.initialLoginCallback = null; BeWoLog.writeToLogFile("Erzeuge die KontaktChatActivity"); 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); 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); bundle.putBoolean("IsEmployee", selectedValue.getIsEmployee()); Intent in = new Intent(getBaseContext(), ChatActivity.class); in.putExtras(bundle); startActivity(in); } }); 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; } } @Override public void onRefresh() { Log.i(LOGTAG, "Föhre onRefresh durch"); updateContactList(); } private void updateContactList() { if(isDownloadOfContacsInProgress) { BeWoLog.writeToLogFile("Download der Kontakte wird von anderer Stelle versucht. (KontaktChatActivity)"); return; } isDownloadOfContacsInProgress = true; Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { isDownloadOfContacsInProgress = false; runOnUiThread(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }); BeWoLog.writeToLogFile("isDownloadOfContacsInProgress wird nach 10 Sekunden zurückgesetzt."); } }, 10 * 1000); BeWoLog.writeToLogFile("Lade Kontakte (updateContactList)"); swipeRefreshLayout.setRefreshing(true); ArrayList propertyInfos = new ArrayList<>(); if(SoapConnectionManager.getUser() == null) { BeWoLog.writeToLogFile("User ist null. (updateContactList)"); Log.i(LOGTAG, "Angemeldeter User ist null"); } else { Log.i(LOGTAG, "UserPersonOid: " + SoapConnectionManager.getUser().getPersonOid()); } if(SoapConnectionManager.getUser().getPersonOid() == null) { Log.i(LOGTAG, "UserPersonOid ist null"); BeWoLog.writeToLogFile("UserPersonOid ist null (updateContactList)"); } propertyInfos.add(SoapConnectionManager.BuildProperty("pPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); final JsonSoapPrimitiveRequest getContactsRequest = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); if(ConnectivityReceiver.isConnected()) { BeWoLog.writeToLogFile("App ist mit dem Internet verbunden (updateContactList -> isConnected(✓))"); if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { BeWoLog.writeToLogFile("Jetzt - letzter Serverkontakt ist kleiner als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten. (updateContactList -> isConnected(✓) -> IntervallCheck(✓))"); spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveContactsRequestListener(new OnRequestSuccessCallback() { @Override public void doCallback() { BeWoLog.writeToLogFile("Führe Callback des Kontakteladens durch. (updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓)"); BeWoChatApplication.sendStatusRequest(); swipeRefreshLayout.setRefreshing(false); ArrayList propertyInfos = new ArrayList<>(); propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); final JsonSoapPrimitiveRequest getNewestMessagesRequest = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); if(ConnectivityReceiver.isConnected()) { BeWoLog.writeToLogFile("(updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> isConnected(✓)"); if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { BeWoLog.writeToLogFile("(updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> isConnected(✓) -> IntervallCheck(✓)"); spiceManager.execute(getNewestMessagesRequest, new JsonSoapPrimitiveRequestListenerForNewestMessages()); } else { BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her. Starte Verbindung zum SocketServer neu. (updateContactlist)"); SocketManager.loginCallbackAfterConnectionLost = new Callback() { @Override public void doCallback() { BeWoLog.writeToLogFile("(updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> IntervallCheck(x)"); spiceManager.execute(getNewestMessagesRequest, new JsonSoapPrimitiveRequestListenerForNewestMessages()); } }; SocketManager.connectToServer("KontaktChatActivity -> zweiten Intervall-Check nicht bestanden"); } } else { BeWoLog.writeToLogFile("updateContactList -> isConnected(✓) -> IntervallCheck(✓) -> Kontakte wurden geladen(✓) -> isConnected(x)"); } } })); } else { BeWoLog.writeToLogFile("Letzer Serverkontakt ist länger als " + BeWoChatApplication.getRefreshIntervalInMinutes() + " Minuten her. Starte Verbindung zum SocketServer neu. (updateContactlist -> isConnected(✓) -> IntervallCheck(x))"); SocketManager.loginCallback2 = new Callback() { @Override public void doCallback() { spiceManager.execute(getContactsRequest, new JsonSoapPrimitiveContactsRequestListener(new OnRequestSuccessCallback() { @Override public void doCallback() { BeWoLog.writeToLogFile("LoginCallback mit Abruf der neuesten Nachrichten und den Kontakten wird aufgerufen. (updateContactlist)"); BeWoChatApplication.sendStatusRequest(); swipeRefreshLayout.setRefreshing(false); ArrayList propertyInfos = new ArrayList<>(); propertyInfos.add(SoapConnectionManager.BuildProperty("pRecipientPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); final JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest("GetNewestMessages", propertyInfos); if(ConnectivityReceiver.isConnected()) { BeWoLog.writeToLogFile("LoginCallback ist mit dem Internet verbunden. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(✓))"); if((Calendar.getInstance().getTime().getTime() - BeWoChatApplication.lastOnlineTS.getTime()) < BeWoChatApplication.getRefreshIntervalInMilliseconds()) { BeWoLog.writeToLogFile("LoginCallback "); spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); } else { BeWoLog.writeToLogFile("LoginCallback ist mit dem Internet verbunden. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(✓) -> IntervallCheck(x)"); } } else { //TODO: Das ist irgendwie sinnlos, wenn keine Verbindung zum Internet besteht... BeWoLog.writeToLogFile("LoginCallback ist nicht mit dem Internet verbunden. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(x))"); SocketManager.loginCallbackAfterConnectionLost = new Callback() { @Override public void doCallback() { BeWoLog.writeToLogFile("loginCallbackAfterConnectionLost im normalen LoginCallback aufgerufen, weil offline. (updateContactlist -> isConnected(✓) -> IntervallCheck(x) -> isConnected(x))"); spiceManager.execute(request, new JsonSoapPrimitiveRequestListenerForNewestMessages()); } }; } } })); } }; SocketManager.connectToServer("KontaktChatActivity -> Intervall überschritten"); } } else { swipeRefreshLayout.setRefreshing(false); isDownloadOfContacsInProgress = false; BeWoLog.writeToLogFile("Offline. (KontaktChatActivity)"); Toast.makeText(getApplicationContext(), "Offline. Keine Aktion möglich.", Toast.LENGTH_LONG).show(); } } 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, chatPacket.IsEmployee, getApplicationContext()); runOnUiThread(new Runnable() { @Override public void run() { KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); for(ContactListItem item : ka.values) { if(item.getPersonOid() == chatPacket.SenderPersonOid && !item.isTeam) { item.setMessagePreview(chatPacket.ChatMessage); item.setIsNewMessage2Preview(true); break; } } ka.notifyDataSetChanged(); } }); 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, cli.getIsEmployee(), getApplicationContext()); runOnUiThread(new Runnable() { @Override public void run() { KontaktAdapter ka =((KontaktAdapter) listView.getAdapter()); for(ContactListItem item : ka.values) { if(item.getPersonOid() == chatPacket.RecipientPersonOid && !item.isTeam) { item.setMessagePreview(chatPacket.ChatMessage); item.setIsNewMessage2Preview(true); break; } } ka.notifyDataSetChanged(); } }); 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; case STATUS_REQUEST: runOnUiThread(new Runnable() { @Override public void run() { KontaktAdapter ka = ((KontaktAdapter) listView.getAdapter()); int onlineEntitiesCount = SocketManager.onlineEntities.size(); int onlinePersonOidsCount = SocketManager.onlinePersonOids.size(); Log.i(LOGTAG, "onlineEntities: " + onlineEntitiesCount + "; onlinePersonOids: " + onlinePersonOidsCount); for(ContactListItem item : ka.values) { if(!item.isTeam) { item.isOnline = SocketManager.onlinePersonOids.contains(item.getPersonOid()); } } 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_kontaktchat_activity, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_kontaktlist_doku: Intent brauser = new Intent(Intent.ACTION_VIEW, Uri.parse(SoapCalls.WEB_DOKU_URL + SoapConnectionManager.getUser().getTenant())); startActivity(brauser); 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); } } @Override public void onResume() { swipeRefreshLayout.setRefreshing(false); BeWoLog.writeToLogFile("Resümiere mit der KontaktChatActivity"); BeWoChatApplication.activityResumed(); SocketManager.uiHandler = kontaktChatActivityUIHandler; BeWoChatApplication.getInstance().setConnectivityListener(this); KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); if(adapter != null) { for(ContactListItem item : adapter.values) { item.isOnline = SocketManager.onlinePersonOids.contains(item.getPersonOid()); } adapter.notifyDataSetChanged(); } if(shouldReloadLatestMessages) { BeWoLog.writeToLogFile("Lade die Kontaktliste neu beim Resümieren"); updateContactList(); shouldReloadLatestMessages = false; } super.onResume(); } @Override public void onStop(){ swipeRefreshLayout.setRefreshing(false); spiceManager.shouldStop(); BeWoLog.writeToLogFile("Stoppe die KontaktChatActivity"); super.onStop(); } @Override public void onPause() { swipeRefreshLayout.setRefreshing(false); BeWoLog.writeToLogFile("Pausiere die KontaktChatActivity"); super.onPause(); BeWoChatApplication.activityPaused(); } @Override protected void onStart() { swipeRefreshLayout.setRefreshing(false); BeWoLog.writeToLogFile("Starte die KontaktChatActivity"); super.onStart(); spiceManager.start(this); } @Override public void onBackPressed() { Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_HOME); this.startActivity(i); super.onBackPressed(); } private final class JsonSoapPrimitiveRequestListenerForNewestMessages implements RequestListener { @Override public void onRequestFailure(SpiceException spiceException) { BeWoLog.writeToLogFile("Ein Fehler ist beim Laden der neuesten Nachrichten aufgetreten (SoapListenerForNewestMessages->onRequestFailure)"); runOnUiThread(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der neuesten Nachrichten aufgetreten.", Toast.LENGTH_SHORT).show(); } }); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { runOnUiThread(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }); if(soapPrimitive == null) { BeWoLog.writeToLogFile("Antwort vom Server war null. Ein erneuter Login erfolgt. (SoapListenerForNewestMessages->onRequestSuccess)"); Log.e("KONTAKT_CHAT_ACTIVITY", "Der vom Server zurückgelieferte Wert ist NULL! (Laden der neuesten Nachrichten)"); try { ArrayList propertyInfos = new ArrayList<>(); SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0); String savedTenant = settings.getString(Util.PREFS_TENANT_KEY, null); String savedUsername = settings.getString(Util.PREFS_USERNAME_KEY, null); String savedPassword = settings.getString(Util.PREFS_PASSWORD, null); byte[] tenantByteArray = Base64.decode(savedTenant, Base64.DEFAULT); ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray); byte[] usernameByteArray = Base64.decode(savedUsername, Base64.DEFAULT); ByteArrayInputStream usernameStream = new ByteArrayInputStream(usernameByteArray); byte[] passwordByteArray = Base64.decode(savedPassword, Base64.DEFAULT); ByteArrayInputStream passwordStream = new ByteArrayInputStream(passwordByteArray); propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", SecurityUtils.decrypt(tenantStream).toString(), String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", SecurityUtils.decrypt(usernameStream).toString(), String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", SecurityUtils.decrypt(passwordStream).toString(), String.class)); JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); BeWoLog.writeToLogFile("Lade neueste Nachrichten erneut herunter. (SoapListenerForNewestMessages->onRequestSuccess)"); spiceManager.execute(request, new KontaktChatActivity.JsonSoapPrimitiveReLoginRequestListener()); } catch(Exception e) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); } }); } return; } BeWoLog.writeToLogFile("Herunterladen der neuesten Nachrichten war erfolgreich. (SoapListenerForNewestMessages->onRequestSuccess)"); GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(ChatMessage.class, new ChatMessageDeserializer()); Gson gson = builder.create(); Type listType = new TypeToken>(){}.getType(); ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); for(ChatMessage message : result) { if(adapter != null) { for(ContactListItem item : adapter.values) { if((item.getPersonOid() == message.SenderPersonOid ||item.getPersonOid() == message.RecipientPersonOid) && !item.isTeam && !message.IsTeam || item.isTeam && message.IsTeam && item.getPersonOid() == message.RecipientPersonOid) { item.setMessagePreview(message.ChatText); item.setIsNewMessage2Preview(!databaseHandler.GetIsMessageInDatabase(message.MessageId)); } } adapter.notifyDataSetChanged(); } } } } private final class JsonSoapPrimitiveContactsRequestListener implements RequestListener { OnRequestSuccessCallback callback; JsonSoapPrimitiveContactsRequestListener(OnRequestSuccessCallback callback) { this.callback = callback; } @Override public void onRequestFailure(SpiceException spiceException) { BeWoLog.writeToLogFile("Laden der Kontakte ist fehlgeschlagen. (JsonSoapPrimitiveRequestListener->onRequestFailure)"); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der Kontaktliste aufgetreten.", Toast.LENGTH_SHORT).show(); } }); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { BeWoLog.writeToLogFile("Antwort vom Server war null. Ein erneuter Login erfolgt. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); runOnUiThread(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }); Log.e(LOGTAG, "Der vom Server zurückgelieferte Wert ist NULL! (Laden der Kontakte)"); try { ArrayList propertyInfos = new ArrayList<>(); SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0); String savedTenant = settings.getString(Util.PREFS_TENANT_KEY, null); String savedUsername = settings.getString(Util.PREFS_USERNAME_KEY, null); String savedPassword = settings.getString(Util.PREFS_PASSWORD, null); byte[] tenantByteArray = Base64.decode(savedTenant, Base64.DEFAULT); ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray); byte[] usernameByteArray = Base64.decode(savedUsername, Base64.DEFAULT); ByteArrayInputStream usernameStream = new ByteArrayInputStream(usernameByteArray); byte[] passwordByteArray = Base64.decode(savedPassword, Base64.DEFAULT); ByteArrayInputStream passwordStream = new ByteArrayInputStream(passwordByteArray); propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", SecurityUtils.decrypt(tenantStream).toString(), String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", SecurityUtils.decrypt(usernameStream).toString(), String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", SecurityUtils.decrypt(passwordStream).toString(), String.class)); JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); BeWoLog.writeToLogFile("Lade Kontakte erneut herunter. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); spiceManager.execute(request, new KontaktChatActivity.JsonSoapPrimitiveReLoginRequestListener()); } catch(Exception e) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); } }); } return; } BeWoLog.writeToLogFile("Laden der Kontakte war erfolgreich. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); isDownloadOfContacsInProgress = false; GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(ChatPerson.class, new ChatPersonDeserializer()); Gson gson = builder.create(); Type listType = new TypeToken>(){}.getType(); ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); List lc = databaseHandler.getAllContacts(); Map oid2VersionList = new HashMap<>(); for(ContactListItem item : lc) { oid2VersionList.put(new ChatEntity(item.getPersonOid(), item.isTeam, item.getIsEmployee()), item.getVersion()); } for(ChatPerson cp : result) { ContactListItem contact = new ContactListItem(cp.Name, cp.Oid, cp.IsTeam, cp.TeamMemberOids, cp.TeamMemberNames, cp.Version, cp.IsEmployee, cp.PhoneNumber); ChatEntity cliEntity = new ChatEntity(cp.Oid, cp.IsTeam, cp.IsEmployee); 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 } } oid2VersionList.clear(); lc = databaseHandler.getAllContacts(); for(ContactListItem item : lc) { if(SocketManager.onlinePersonOids.contains(item.getPersonOid())){ item.isOnline = true; } } contactList = new ArrayList<>(lc); KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); if(adapter == null) { adapter = new KontaktAdapter(KontaktChatActivity.this, contactList); } else { adapter.values.clear(); adapter.values.addAll(contactList); } listView.setAdapter(adapter); ((KontaktAdapter) listView.getAdapter()).notifyDataSetChanged(); if(callback != null) { callback.doCallback(); } // JsonSoapPrimitiveImageRequestListener ArrayList propertyInfos = new ArrayList<>(); propertyInfos.add(SoapConnectionManager.BuildProperty("pPersonOid", SoapConnectionManager.getUser().getPersonOid(), Long.class)); JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOAD_USER_IMAGES, propertyInfos); BeWoLog.writeToLogFile("Lade die Avatare der Mitarbeiter herunter. (JsonSoapPrimitiveImageRequestListener->onRequestSuccess)"); spiceManager.execute(request, new KontaktChatActivity.JsonSoapPrimitiveImageRequestListener()); } } private final class JsonSoapPrimitiveReLoginRequestListener implements RequestListener { @Override public void onRequestFailure(SpiceException spiceException) { runOnUiThread(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Die Serveranfrage ist gescheitert (Erneuter Login). Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); } }); BeWoLog.writeToLogFile("Erneuter Login ist fehlgeschlagen. (JsonSoapPrimitiveReLoginRequestListener->onRequestFailure)"); Log.e("GET_ALL_MESSAGES", "Fehler beim erneuten Login: " + spiceException.getMessage()); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { BeWoLog.writeToLogFile("Antwort vom Server war null. (JsonSoapPrimitiveReLoginRequestListener->onRequestSuccess)"); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); } }); return; } String abc = soapPrimitive.toString(); BeWoLog.writeToLogFile("Erneuter Login war erfolgreich. (JsonSoapPrimitiveReLoginRequestListener->onRequestSuccess)"); Log.i("ERNEUTER_LOGIN", "Antwort vom Server erhalten in KONTAKT_CHAT_ACTIVITY"); if(abc != null) { if(abc.contains(";")) { // Intent kontaktChatActivity = new Intent(getApplicationContext(), KontaktChatActivity.class); // startActivity(kontaktChatActivity); } else { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); } }); } } } } private final class JsonSoapPrimitiveImageRequestListener implements RequestListener { @Override public void onRequestFailure(SpiceException spiceException) { BeWoLog.writeToLogFile("Ein Fehler ist beim Laden der Avatare aufgetreten (JsonSoapPrimitiveImageRequestListener->onRequestFailure)"); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(KontaktChatActivity.this, "Ein Fehler ist beim laden der Avatare aufgetreten.", Toast.LENGTH_SHORT).show(); } }); } @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { if(soapPrimitive == null) { BeWoLog.writeToLogFile("Antwort vom Server war null. Ein erneuter Login erfolgt. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); runOnUiThread(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }); Log.e(LOGTAG, "Der vom Server zurückgelieferte Wert ist NULL! (Laden der Bilder)"); try { ArrayList propertyInfos = new ArrayList<>(); SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0); String savedTenant = settings.getString(Util.PREFS_TENANT_KEY, null); String savedUsername = settings.getString(Util.PREFS_USERNAME_KEY, null); String savedPassword = settings.getString(Util.PREFS_PASSWORD, null); byte[] tenantByteArray = Base64.decode(savedTenant, Base64.DEFAULT); ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray); byte[] usernameByteArray = Base64.decode(savedUsername, Base64.DEFAULT); ByteArrayInputStream usernameStream = new ByteArrayInputStream(usernameByteArray); byte[] passwordByteArray = Base64.decode(savedPassword, Base64.DEFAULT); ByteArrayInputStream passwordStream = new ByteArrayInputStream(passwordByteArray); propertyInfos.add(SoapConnectionManager.BuildProperty("pTenant", SecurityUtils.decrypt(tenantStream).toString(), String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pUsername", SecurityUtils.decrypt(usernameStream).toString(), String.class)); propertyInfos.add(SoapConnectionManager.BuildProperty("pPassword", SecurityUtils.decrypt(passwordStream).toString(), String.class)); JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.LOGIN_CALL, propertyInfos); BeWoLog.writeToLogFile("Lade Bilder erneut herunter. (JsonSoapPrimitiveRequestListener->onRequestSuccess)"); spiceManager.execute(request, new KontaktChatActivity.JsonSoapPrimitiveReLoginRequestListener()); } catch(Exception e) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Ein fataler Fehler ist aufgetreten. Bitte Loggen Sie sich erneut ein.", Toast.LENGTH_LONG).show(); } }); } return; } GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(ImageEntity.class, new ImageEntityDeserializer()); Gson gson = builder.create(); Type listType = new TypeToken>(){}.getType(); ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); if(result != null && !result.isEmpty()) { BeWoLog.writeToLogFile("Es wurden " + result.size() + " Avatare heruntergeladen."); for(ImageEntity imageEntity : result) { Log.i("IMAGE_DOWNLOAD", "Bild für Person mit Oid " + imageEntity.PersonOid); databaseHandler.insertUserImage(imageEntity.PersonOid, imageEntity.Image); } } else { Log.i("IMAGES", "Es wurden keine Avatare geladen."); BeWoLog.writeToLogFile("Es wurden keine Avatare heruntergeladen!"); } runOnUiThread(new Runnable() { @Override public void run() { KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); adapter.notifyDataSetChanged(); } }); } } }