925 lines
42 KiB
Java
925 lines
42 KiB
Java
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<ContactListItem> 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<ContactListItem>()));
|
|
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<PropertyInfo> 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<PropertyInfo> 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<PropertyInfo> 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<SoapPrimitive> {
|
|
|
|
@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<PropertyInfo> 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<ArrayList<ChatMessage>>(){}.getType();
|
|
ArrayList<ChatMessage> 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<SoapPrimitive> {
|
|
|
|
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<PropertyInfo> 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<ArrayList<ChatPerson>>(){}.getType();
|
|
|
|
ArrayList<ChatPerson> result = gson.fromJson(soapPrimitive.toString(), listType);
|
|
|
|
List<ContactListItem> lc = databaseHandler.getAllContacts();
|
|
|
|
Map<ChatEntity, Integer> 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<PropertyInfo> 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<SoapPrimitive> {
|
|
@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<SoapPrimitive> {
|
|
|
|
@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<PropertyInfo> 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<ArrayList<ImageEntity>>(){}.getType();
|
|
|
|
ArrayList<ImageEntity> 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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|