diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java new file mode 100644 index 000000000..859f90ebd --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/Database/DatabaseHandler.java @@ -0,0 +1,583 @@ +package Database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import beyondsoft.bewomitarbeiterapp.ContactListItem; +import entities.ChatMessage; +import soapConnection.SoapConnectionManager; + +/** + * Created by bib on 07.06.2016. + */ +public class DatabaseHandler extends SQLiteOpenHelper { + + //DataBase version + private static final int DATABASE_VERSION = 1; + + //Database name + private static final String DATABASE_NAME = "Contacts_Manager"; + + //Table Name + private static final String TABLE_CONTACTS = "Contactlist"; + private static final String TABLE_CHATMESSAGE = "ChatMessage"; + private static final String TABLE_DATABASEOWNER = "DatabaseOwner"; + + //Table Columns name + private static final String KEY_ID_OWNER = "id"; + private static final String KEY_OWNER_PERSON_OID = "ownerpersonoid"; + + + // Contacts-Tabelle + private static final String KEY_ID ="id"; + private static final String KEY_KONTAKT_NAME = "kontaktname"; + private static final String KEY_PERSONOID = "personoid"; + private static final String KEY_PICTURE_BLOB = "bild"; + 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"; + + + // ChatMessage-Tabelle + private static final String KEY_ID_CHATMESSAGE = "id"; + private static final String KEY_SENDER_PERSON_OID_CHATMESSAGE = "senderpersonoid"; + private static final String KEY_RECIPIENT_PERSON_OID_CHATMESSAGE = "recipientpersonoid"; + private static final String KEY_INSTS_CHATMESSAGE = "insts"; + private static final String KEY_CHAT_TEXT_CHATMESSAGE = "chattext"; + private static final String KEY_IS_DELIVERED_CHATMESSAGE = "isdelivered"; + private static final String KEY_SERVERSEITIGE_OID_CHATMESSAGE = "serverseitigeoid"; + private static final String KEY_IS_TEAM_CHATMESSAGE = "isteam"; + + private static DatabaseHandler mInstance = null; + + private Context mContext; + + public static DatabaseHandler getInstance(Context context) { + if(mInstance == null) { + mInstance = new DatabaseHandler(context.getApplicationContext()); + } + + return mInstance; + } + + private DatabaseHandler(Context context){ + super(context,DATABASE_NAME, null, DATABASE_VERSION); + this.mContext = context; + } + + public void clearDatabase() { + SQLiteDatabase db = this.getWritableDatabase(); + + String deleteQuery = "DELETE FROM " + TABLE_DATABASEOWNER; + db.execSQL(deleteQuery); + + deleteQuery = "DELETE FROM " + TABLE_CHATMESSAGE; + db.execSQL(deleteQuery); + + deleteQuery = "DELETE FROM " + TABLE_CONTACTS; + db.execSQL(deleteQuery); + + db.close(); + } + + public void onCreate(SQLiteDatabase db) { + String CREATE_CONTACTS_TABLE = + "CREATE TABLE " + TABLE_CONTACTS + "(" + + KEY_ID + " INTEGER PRIMARY KEY," + + KEY_KONTAKT_NAME + " TEXT,"+ + KEY_PERSONOID + " INTEGER," + + KEY_PICTURE_BLOB + " BLOB, " + + KEY_IS_TEAM + " INTEGER, " + + KEY_TEAM_MEMBER_NAMES + " TEXT, " + + KEY_TEAM_MEMBER_OIDS + " TEXT)"; + + db.execSQL(CREATE_CONTACTS_TABLE); + + String createChatMessageTable = + "CREATE TABLE " + TABLE_CHATMESSAGE + "(" + + KEY_ID_CHATMESSAGE + " INTEGER PRIMARY KEY," + + KEY_SENDER_PERSON_OID_CHATMESSAGE + " INTEGER," + + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + " INTEGER," + + KEY_INSTS_CHATMESSAGE + " DATETIME DEFAULT CURRENT_TIMESTAMP," + + KEY_CHAT_TEXT_CHATMESSAGE + " TEXT," + + KEY_IS_DELIVERED_CHATMESSAGE + " INTEGER," + + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " INTEGER DEFAULT NULL," + + KEY_IS_TEAM_CHATMESSAGE + " INTEGER DEFAULT 0)"; + + db.execSQL(createChatMessageTable); + + String createOwnerTable = "CREATE TABLE " + TABLE_DATABASEOWNER + " (" + + KEY_ID_OWNER + " INTEGER PRIMARY KEY," + + KEY_OWNER_PERSON_OID + " INTEGER" + + ")"; + + db.execSQL(createOwnerTable); + } + + public void insertOwnerOid(int ownerOid) { + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(KEY_ID_OWNER, ownerOid); + + db.insert(TABLE_DATABASEOWNER, null, values); + db.close(); + } + + public int getOwnerOid() { + SQLiteDatabase db = this.getReadableDatabase(); + + String selectQuery = "SELECT * FROM " + TABLE_DATABASEOWNER; + + Cursor cursor = db.rawQuery(selectQuery, null); + + int ownerOid = 0; + + if(cursor.moveToFirst()) { + ownerOid = cursor.getInt(0); + } + + cursor.close(); + db.close(); + + return ownerOid; + } + + public void addChatMessages(ArrayList messages) { + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + + try { + db.beginTransaction(); + + for(ChatMessage message : messages) { + values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); + values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); + values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); + values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); + values.put(KEY_IS_DELIVERED_CHATMESSAGE, (message.IsDelivered ? 1 : 0)); + values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); + values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam); + + db.insertOrThrow(TABLE_CHATMESSAGE, null, values); + + values.clear(); + } + + db.setTransactionSuccessful(); + } finally { + if(db.inTransaction()) { + db.endTransaction(); + } + + db.close(); + } + } + + public long addChatMessage(ChatMessage message) { + SQLiteDatabase db = this.getWritableDatabase(); + + long rowId = db.insert(TABLE_CHATMESSAGE, null, fillValuesForChatMessage(message)); + db.close(); + + return rowId; + } + + private ContentValues fillValuesForChatMessage(ChatMessage message) { + ContentValues values = new ContentValues(); + + values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); + values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); + values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); + values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); + values.put(KEY_IS_DELIVERED_CHATMESSAGE, (message.IsDelivered ? 1 : 0)); + values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); + values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam); + + return values; + } + + public int updateChatMessage(ChatMessage message) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues values = new ContentValues(); + + values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); + values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); + values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); + values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); + values.put(KEY_IS_DELIVERED_CHATMESSAGE, (message.IsDelivered ? 1 : 0)); + values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); + values.put(KEY_IS_TEAM_CHATMESSAGE, message.IsTeam); + + int result = db.update(TABLE_CHATMESSAGE, values, KEY_ID_CHATMESSAGE + " = ?", new String[] { String.valueOf(message.Id)}); + db.close(); + + return result; + } + + public ArrayList getExistingChatMessageIds() { + ArrayList result = new ArrayList(); + + SQLiteDatabase db = this.getReadableDatabase(); + + String selectQuery = "SELECT "+ KEY_SERVERSEITIGE_OID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " <> 0"; + + Cursor cursor = db.rawQuery(selectQuery, null); + + if(cursor.moveToFirst()) { + do { + result.add(cursor.getInt(0)); + } while(cursor.moveToNext()); + } + + cursor.close(); + db.close(); + + return result; + } + + public ArrayList getExistingTeamChatMessageIds() { + ArrayList result = new ArrayList(); + + SQLiteDatabase db = this.getReadableDatabase(); + + String selectQuery = "SELECT " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " <> 0 AND " + KEY_IS_TEAM_CHATMESSAGE + " = 1"; + + Cursor cursor = db.rawQuery(selectQuery, null); + + if(cursor.moveToFirst()) { + do { + result.add(cursor.getInt(0)); + } while(cursor.moveToNext()); + } + + cursor.close(); + db.close(); + + return result; + } + + private String getDateTimeString(Date date) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.GERMAN); + return dateFormat.format(date); + } + + private Date getDateFromString(String dateString) { + Date result = new Date(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.GERMAN); + + try { + result = df.parse(dateString); + } catch (ParseException e) { + e.printStackTrace(); + } + + return result; + } + + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ + + db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHATMESSAGE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_DATABASEOWNER); + + onCreate(db); + } + + public void addContact(ContactListItem contact) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues values = new ContentValues(); + + values.put(KEY_KONTAKT_NAME, contact.getChatName()); + values.put(KEY_PERSONOID, contact.getPersonOid()); + values.put(KEY_PICTURE_BLOB, contact.getPicture()); + values.put(KEY_IS_TEAM, contact.isTeam); + values.put(KEY_TEAM_MEMBER_NAMES, contact.teamMemberNames); + values.put(KEY_TEAM_MEMBER_OIDS, contact.teamMemberOids); + + db.insert(TABLE_CONTACTS, null, values); + db.close(); + } + + public ChatMessage getChatMessageById(int id) { + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.query( + TABLE_CHATMESSAGE, + new String[] {KEY_ID_CHATMESSAGE, KEY_SENDER_PERSON_OID_CHATMESSAGE, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, KEY_INSTS_CHATMESSAGE, KEY_CHAT_TEXT_CHATMESSAGE, KEY_IS_DELIVERED_CHATMESSAGE, KEY_SERVERSEITIGE_OID_CHATMESSAGE, KEY_IS_TEAM_CHATMESSAGE}, + KEY_ID_CHATMESSAGE + "=?", + new String[]{String.valueOf(id)}, + null, null, null, null); + + if(cursor != null) { + cursor.moveToFirst(); + + int messageId = cursor.getInt(0); + int senderPersonOid = cursor.getInt(1); + int recipientPersonOid = cursor.getInt(2); + Date insTs = getDateFromString(cursor.getString(3)); + String chatText = cursor.getString(4); + boolean isDelivered = cursor.getInt(5) != 0; + int serverseitigeOid = cursor.getInt(6); + boolean isTeam = cursor.getInt(7) != 0; + + cursor.close(); + db.close(); + + return new ChatMessage(messageId, senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam); + } + + db.close(); + + return null; + } + + public ArrayList getMessagesForRecipient(int recipientOid) { + ArrayList messages = new ArrayList<>(); + + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.query( + TABLE_CHATMESSAGE, + new String[] {KEY_ID_CHATMESSAGE, KEY_SENDER_PERSON_OID_CHATMESSAGE, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, KEY_INSTS_CHATMESSAGE, KEY_CHAT_TEXT_CHATMESSAGE, KEY_IS_DELIVERED_CHATMESSAGE, KEY_SERVERSEITIGE_OID_CHATMESSAGE, KEY_IS_TEAM_CHATMESSAGE}, + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? OR " + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?", + new String[] {String.valueOf(SoapConnectionManager.User.getPersonOid()), String.valueOf(recipientOid), String.valueOf(SoapConnectionManager.User.getPersonOid()), String.valueOf(recipientOid)}, + null, null, null, null); + + if(cursor.moveToFirst()) { + do{ + ChatMessage message = new ChatMessage( + cursor.getInt(0), + cursor.getInt(1), + cursor.getInt(2), + getDateFromString(cursor.getString(3)), + cursor.getString(4), + cursor.getInt(5) != 0, + cursor.getInt(6), + cursor.getInt(7) != 0 + ); + + messages.add(message); + } while(cursor.moveToNext()); + } + + cursor.close(); + db.close(); + + return messages; + } + + public ArrayList getMessagesForTeam(int teamOid) { + ArrayList messages = new ArrayList<>(); + + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.query( + TABLE_CHATMESSAGE, + new String[] {KEY_ID_CHATMESSAGE, KEY_SENDER_PERSON_OID_CHATMESSAGE, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, KEY_INSTS_CHATMESSAGE, KEY_CHAT_TEXT_CHATMESSAGE, KEY_IS_DELIVERED_CHATMESSAGE, KEY_SERVERSEITIGE_OID_CHATMESSAGE, KEY_IS_TEAM_CHATMESSAGE}, + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_IS_TEAM_CHATMESSAGE + "= 1", + new String[] {String.valueOf(teamOid)}, + null, null, null, null); + + if(cursor.moveToFirst()) { + do{ + ChatMessage message = new ChatMessage( + cursor.getInt(0), + cursor.getInt(1), + cursor.getInt(2), + getDateFromString(cursor.getString(3)), + cursor.getString(4), + cursor.getInt(5) != 0, + cursor.getInt(6), + cursor.getInt(7) != 0 + ); + + messages.add(message); + } while(cursor.moveToNext()); + } + + cursor.close(); + + db.close(); + + return messages; + } + + public ContactListItem getContact(int id) { + + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.query(TABLE_CONTACTS, + new String[]{ + KEY_ID, + KEY_KONTAKT_NAME, + KEY_PERSONOID, + KEY_PICTURE_BLOB, + KEY_IS_TEAM, + KEY_TEAM_MEMBER_NAMES, + KEY_TEAM_MEMBER_OIDS}, + KEY_ID + "=?", + new String[]{String.valueOf(id)}, + null,null,null,null); + + if(cursor != null) { + cursor.moveToFirst(); + + int contactId = cursor.getInt(0); + String contactName = cursor.getString(1); + int contactPersonOid = cursor.getInt(2); + byte[] contactPicture = cursor.getBlob(3); + boolean contactIsTeam = cursor.getInt(4) == 1; + String teamMemberOids = cursor.getString(5); + String teamMemberNames = cursor.getString(6); + + ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames); + + cursor.close(); + db.close(); + + return contact; + } + + db.close(); + + return null; + } + + public List getAllContacts(){ + List contactList = new ArrayList(); + + String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; + + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + if (cursor.moveToFirst()) { + do { + ContactListItem contact = new ContactListItem(); + contact.setId(cursor.getInt(0)); + contact.setChatName(cursor.getString(1)); + contact.setPersonOid(cursor.getInt(2)); + contact.setPicture(cursor.getBlob(3)); + contact.isTeam = cursor.getInt(4) == 1; + contact.teamMemberNames = cursor.getString(5); + contact.teamMemberOids = cursor.getString(6); + + contactList.add(contact); + } while (cursor.moveToNext()); + } + + cursor.close(); + db.close(); + + return contactList; + } + + public int updateContact(ContactListItem contact) { + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(KEY_KONTAKT_NAME, contact.getChatName()); + values.put(KEY_PERSONOID, contact.getPersonOid()); + values.put(KEY_PICTURE_BLOB, contact.getPicture()); + 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); + + int result = db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); + + db.close(); + + return result; + } + + public void deleteContacts(ContactListItem contact){ + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); + db.close(); + } + + public int getContactsCount(){ + String countQuery = "SELECT COUNT(*) FROM " + TABLE_CONTACTS; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + + int result = 0; + + if(cursor.moveToFirst()) { + result = cursor.getInt(0); + } + + cursor.close(); + db.close(); + + return result; + } + + public byte[] getUserImage(Integer personOid) { + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.query(TABLE_CONTACTS, new String[] {KEY_PERSONOID}, KEY_PERSONOID + " = " + personOid, null, null, null, null); + + byte[] picture = cursor.getBlob(0); + + cursor.close(); + db.close(); + + return picture; + } + + public ContactListItem getContactByPersonOid(int personOid) { + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.query(TABLE_CONTACTS, + new String[]{ + KEY_ID, + KEY_KONTAKT_NAME, + KEY_PERSONOID, + KEY_PICTURE_BLOB, + KEY_IS_TEAM, + KEY_TEAM_MEMBER_NAMES, + KEY_TEAM_MEMBER_OIDS}, + KEY_PERSONOID + "=?", + new String[]{String.valueOf(personOid)}, + null,null,null,null); + + if(cursor != null && cursor.moveToFirst()) { + + int contactId = cursor.getInt(0); + String contactName = cursor.getString(1); + int contactPersonOid = cursor.getInt(2); + byte[] contactPicture = cursor.getBlob(3); + boolean contactIsTeam = cursor.getInt(4) == 1; + String teamMemberOids = cursor.getString(5); + String teamMemberNames = cursor.getString(6); + + ContactListItem contact = new ContactListItem(contactId, contactName, contactPersonOid, contactPicture, contactIsTeam, teamMemberOids, teamMemberNames); + + cursor.close(); + db.close(); + + return contact; + } else { + Log.i("DATABASE_HANDLER", "Keinen Kontakt mit PersonOid " + personOid + " gefunden."); + } + + db.close(); + + return null; + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java index 98611c8c5..51aadf746 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ChatActivity.java @@ -40,10 +40,10 @@ 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.File; import java.io.IOException; import java.lang.reflect.Type; import java.security.InvalidAlgorithmParameterException; @@ -53,15 +53,21 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.Random; import javax.crypto.NoSuchPaddingException; +import Database.DatabaseHandler; import entities.ChatMessage; import soapConnection.DataIdentifier; +import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.Packet; +import soapConnection.SoapCalls; +import soapConnection.SoapConnectionManager; import tcpConnection.SocketManager; import tcpConnection.UIHandler; +import util.ChatMessageDeserializer; import util.SecurityUtils; import util.Util; @@ -69,11 +75,8 @@ import util.Util; * Created by bib on 03.05.2016. */ public class ChatActivity extends ActionBarActivity { - private static final String LOG_TAG = "CHAT"; - private DatabaseHandler databaseHandler; - protected TextView chat; protected EditText text; protected Button senden; @@ -81,15 +84,18 @@ public class ChatActivity extends ActionBarActivity { public static List chatMessages; public static ArrayAdapter adapter; - File file; - protected String recipientName; protected int recipientPersonOid; + protected String teamMemberOids; + protected String teamMemberNames; + protected boolean isTeam; private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); private UIHandler chatUIHandler; + private View mCustomView; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -102,37 +108,53 @@ public class ChatActivity extends ActionBarActivity { action.setDisplayShowTitleEnabled(false); LayoutInflater inflate = LayoutInflater.from(this); - View mCustomView = inflate.inflate(R.layout.custom_menuebar, null); + mCustomView = inflate.inflate(R.layout.custom_menuebar, null); - TextView titlename = (TextView)mCustomView.findViewById(R.id.PersonalName); - ImageView titlepic = (ImageView)mCustomView.findViewById(R.id.PersonalPic); + action.setCustomView(mCustomView); + action.setDisplayShowCustomEnabled(true); - Bundle zielkorb = getIntent().getExtras(); + databaseHandler = DatabaseHandler.getInstance(this); + + senden = (Button)findViewById(R.id.Sendebutton); + + listView = (ListView)findViewById(R.id.list_msg); + + Bundle zielkorb = getIntent().getExtras(); recipientName = zielkorb.getString("Name"); recipientPersonOid = zielkorb.getInt("RecipientOid"); + byte[] bildArray = zielkorb.getByteArray("Bild"); + isTeam = zielkorb.getBoolean("IsTeam"); + teamMemberOids = zielkorb.getString("TeamMemberOids"); + teamMemberNames = zielkorb.getString("TeamMemberNames"); + + ReloadChatView(recipientName, recipientPersonOid, bildArray, isTeam, teamMemberOids, teamMemberNames); + } + + private void ReloadChatView(String contactName, int recipientOid, byte[] contactImage, boolean pIsTeam, String pTeamMemberOids, String pTeamMemberNames) { + chatMessages = new ArrayList<>(); + + recipientPersonOid = recipientOid; + recipientName = contactName; + isTeam = pIsTeam; + teamMemberOids = pTeamMemberOids; + teamMemberNames = pTeamMemberNames; + + ImageView status = (ImageView) mCustomView.findViewById(R.id.status); + TextView titlename = (TextView) mCustomView.findViewById(R.id.PersonalName); + ImageView titlepic = (ImageView) mCustomView.findViewById(R.id.PersonalPic); + + status.setImageResource((SocketManager.onlinePersonOids.contains(recipientPersonOid) ? R.drawable.online : R.drawable.offline)); - byte[] bildArray = zielkorb.getByteArray("Bild"); Bitmap customerImage; - if(bildArray != null) { - customerImage = BitmapFactory.decodeByteArray(bildArray, 0, bildArray.length); + if(contactImage != null) { + customerImage = BitmapFactory.decodeByteArray(contactImage, 0, contactImage.length); titlepic.setImageBitmap(GetCircleBitmap(customerImage)); } titlename.setText(recipientName); - action.setCustomView(mCustomView); - action.setDisplayShowCustomEnabled(true); - - databaseHandler = new DatabaseHandler(this); - - senden = (Button)findViewById(R.id.Sendebutton); - - chatMessages = new ArrayList<>(); - - listView = (ListView)findViewById(R.id.list_msg); - - chatMessages = databaseHandler.getMessagesForRecipient(recipientPersonOid); + chatMessages = isTeam ? databaseHandler.getMessagesForTeam(recipientPersonOid) : databaseHandler.getMessagesForRecipient(recipientPersonOid); adapter = new MessageAdapter(this, R.layout.item_chat_left, chatMessages); listView.setAdapter(adapter); @@ -146,24 +168,57 @@ public class ChatActivity extends ActionBarActivity { listView.post(new Runnable() { @Override public void run() { - chatPacket.writeToLog(); - - ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid); + ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, false); databaseHandler.addChatMessage(message); - chatMessages.add(message); - adapter.notifyDataSetChanged(); + if(chatPacket.SenderPersonOid == recipientPersonOid) { + chatMessages.add(message); + adapter.notifyDataSetChanged(); + } else { + SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, false, null, null); + } } }); + break; case MESSAGE_RESPONSE: ChatMessage cm = databaseHandler.getChatMessageById(chatPacket.ClientseitigeOid); cm.ServerseitigeOid = chatPacket.ServerseitigeOid; + Log.i("CHAT_SOCKET_LISTENER", "" + cm.IsTeam + "; Clientseitige Id: " + cm.Id + "; Serverseitige Oid: " + cm.ServerseitigeOid); databaseHandler.updateChatMessage(cm); + break; + case STATUS_NOTIFICATION_LOGIN: + if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { + SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); + } + + break; + case STATUS_NOTIFICATION_LOGOUT: + if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { + SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); + } + + break; + case TEAM: + listView.post(new Runnable() { + @Override + public void run() { + ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, false); + + databaseHandler.addChatMessage(message); + + if(chatPacket.SenderPersonOid == recipientPersonOid) { + chatMessages.add(message); + adapter.notifyDataSetChanged(); + } else { + SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid, isTeam, teamMemberOids, teamMemberNames); + } + } + }); break; } } catch(Exception pe) { @@ -184,7 +239,7 @@ public class ChatActivity extends ActionBarActivity { Packet packet = new Packet(); packet.ChatMessage = text.getText().toString(); - packet.ChatDataIdentifier = DataIdentifier.MESSAGE; + packet.ChatDataIdentifier = isTeam ? DataIdentifier.TEAM : DataIdentifier.MESSAGE; packet.RecipientPersonOid = recipientPersonOid; packet.MessageTimeStamp = now; @@ -199,9 +254,7 @@ public class ChatActivity extends ActionBarActivity { e.printStackTrace(); } - - - final ChatMessage message = new ChatMessage(packet.SenderPersonOid, packet.RecipientPersonOid, packet.MessageTimeStamp, packet.ChatMessage, false, 0); + final ChatMessage message = new ChatMessage(packet.SenderPersonOid, packet.RecipientPersonOid, packet.MessageTimeStamp, packet.ChatMessage, false, 0, isTeam); long coid = databaseHandler.addChatMessage(message); @@ -221,16 +274,30 @@ public class ChatActivity extends ActionBarActivity { } }); } else { - Toast.makeText(ChatActivity.this, "Sie müssen schon Text eingeben ", Toast.LENGTH_SHORT).show(); + Toast.makeText(ChatActivity.this, "Dieses Feld darf nicht leer sein", Toast.LENGTH_SHORT).show(); } } }); - ArrayList test = databaseHandler.getExistingChatMessageIds(); + ArrayList test = isTeam ? databaseHandler.getExistingTeamChatMessageIds() : databaseHandler.getExistingChatMessageIds(); - for(int id : test) { - Log.i("CHATMESSAGE-ID", "" + id); + String pExceptions = ""; + for(int i = 0; i < test.size(); i++) { + pExceptions += test.get(i); + + if(i < test.size() - 1) { + pExceptions += ";"; + } } + + ArrayList propertyInfos = 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 request = new JsonSoapPrimitiveRequest(SoapCalls.GET_ALL_CHAT_MESSAGES, propertyInfos); + spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); } @Override @@ -240,10 +307,23 @@ public class ChatActivity extends ActionBarActivity { super.onResume(); } - public void onDestroy(){ - Log.i("CHAT_ON_DESTROY", "Zerstöre..."); + @Override + public void onStop(){ + spiceManager.shouldStop(); + databaseHandler.close(); + super.onStop(); + } - super.onDestroy(); + @Override + public void onPause() { + databaseHandler.close(); + super.onPause(); + } + + @Override + protected void onStart() { + super.onStart(); + spiceManager.start(this); } public boolean onCreateOptionsMenu(Menu menu) { @@ -256,7 +336,6 @@ public class ChatActivity extends ActionBarActivity { // Handle item selection switch (item.getItemId()) { case R.id.action_delet_Storage: - file.delete(); //Delet aktuell gespeicherte message recreate(); // ---> gegebenenfals umändern, aber fürs erste reichts return true; default: @@ -264,12 +343,31 @@ public class ChatActivity extends ActionBarActivity { } } - public void SetNotify(String Username, String message){ + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + Bundle zielkorb = intent.getExtras(); + String rn = zielkorb.getString("Name"); + int rpoid = zielkorb.getInt("RecipientOid"); + boolean blahIsTeam = zielkorb.getBoolean("IsTeam"); + String tMemberOids = zielkorb.getString("TeamMemberOids"); + String tMemberNames = zielkorb.getString("TeamMemberNames"); + + + byte[] imageAsByteArray = databaseHandler.getUserImage(rpoid); + + Log.i("CHAT_ON_NEW_INTENT", "Bild ist null: " + (imageAsByteArray == null)); + + ReloadChatView(rn, rpoid, null, blahIsTeam, tMemberOids, tMemberNames); + } + + public void SetNotify(String username, String message, int recipientOid, boolean isTeam, String teamMemberOids, String teamMemberNames){ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) - .setSmallIcon(R.drawable.bslogo) - .setContentTitle(Username) + .setSmallIcon(R.drawable.ic_stat_name) + .setContentTitle(username) .setContentText(message) .setAutoCancel(true) .setDefaults(Notification.DEFAULT_SOUND) @@ -277,17 +375,27 @@ public class ChatActivity extends ActionBarActivity { .setLights(Color.YELLOW, 3000, 3000) //Notification.Default_Lights .setOngoing(true); + Bundle bundle = new Bundle(); + bundle.putString("Name", username); + bundle.putInt("RecipientOid", recipientOid); + bundle.putBoolean("IsTeam", isTeam); + bundle.putString("TeamMemberOids", teamMemberOids); + bundle.putString("TeamMemberNames", teamMemberNames); + //TODO: Bild laden + Intent resultIntent = new Intent(this, ChatActivity.class); + resultIntent.putExtras(bundle); + resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent resultPendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent resultPendingIntent = PendingIntent.getActivity(this.getApplicationContext(), (int) (Math.random() * 100), resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mBuilder.setContentIntent(resultPendingIntent); - mNotifyMgr.notify(1, mBuilder.build()); + mNotifyMgr.notify((new Random()).nextInt(9999 - 1000) + 1000, mBuilder.build()); } private Bitmap GetCircleBitmap(Bitmap bitmap) { @@ -315,8 +423,6 @@ public class ChatActivity extends ActionBarActivity { return output; } - - // TODO: die alten Nachrichten vom Server holen private final class JsonSoapPrimitiveRequestListener implements RequestListener { @Override @@ -326,13 +432,24 @@ public class ChatActivity extends ActionBarActivity { @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { - Gson gson = new GsonBuilder().create(); + 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); + final ArrayList result = gson.fromJson(soapPrimitive.toString(), listType); - // Duplikate vermeiden + databaseHandler.addChatMessages(result); + + listView.post(new Runnable() { + @Override + public void run() { + chatMessages.addAll(result); + adapter.notifyDataSetChanged(); + } + }); } } } 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 96fdb0b03..8f111dc9e 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ContactListItem.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/ContactListItem.java @@ -9,34 +9,30 @@ public class ContactListItem { private byte[] mPicture; private int mPersonOid; + public boolean isTeam; public boolean isOnline; + public String teamMemberOids; + public String teamMemberNames; public ContactListItem(){} - public ContactListItem(int id, String kontaktname, int personOid, byte[] picture){ + public ContactListItem(int id, String kontaktname, int personOid, byte[] picture, boolean isTeam, String teamMemberOids, String teamMemberNames){ this.mId = id; this.mChatName = kontaktname; this.mPersonOid = personOid; this.mPicture = picture; + this.isTeam = isTeam; + this.teamMemberNames = teamMemberNames; + this.teamMemberOids = teamMemberOids; } - public ContactListItem(String kontaktname, int personOid, byte[] picture){ - this.mChatName = kontaktname; - this.mPersonOid = personOid; - this.mPicture = picture; - } - - public ContactListItem(String kontaktname, int personOid){ - this.mChatName = kontaktname; - this.mPersonOid = personOid; - this.mPicture = null; - } - - public ContactListItem(int id, String kontaktname, int personOid){ - this.mId = id; + public ContactListItem(String kontaktname, int personOid, boolean isTeam, String teamMemberOids, String teamMemberNames){ this.mChatName = kontaktname; this.mPersonOid = personOid; this.mPicture = null; + this.isTeam = isTeam; + this.teamMemberNames = teamMemberNames; + this.teamMemberOids = teamMemberOids; } public int getId(){ diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/DatabaseHandler.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/DatabaseHandler.java deleted file mode 100644 index b511a95b0..000000000 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/DatabaseHandler.java +++ /dev/null @@ -1,300 +0,0 @@ -package beyondsoft.bewomitarbeiterapp; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Locale; - -import entities.ChatMessage; -import soapConnection.SoapConnectionManager; - -/** - * Created by bib on 07.06.2016. - */ -public class DatabaseHandler extends SQLiteOpenHelper { - - //DataBase version - private static final int DATABASE_VERSION = 1; - //Database name - private static final String DATABASE_NAME = "Contacts_Manager"; - //Table Name - private static final String TABLE_CONTACTS = "Contactlist"; - private static final String TABLE_CHATMESSAGE = "ChatMessage"; - - - //Table Columns name - - // Contacts-Tabelle - private static final String KEY_ID ="id"; - private static final String KEY_KontaktName = "kontaktname"; - private static final String KEY_PERSONOID = "personoid"; - private static final String KEY_Picture_BLOB = "bild"; - - - // ChatMessage-Tabelle - private static final String KEY_ID_CHATMESSAGE = "id"; - private static final String KEY_SENDER_PERSON_OID_CHATMESSAGE = "senderpersonoid"; - private static final String KEY_RECIPIENT_PERSON_OID_CHATMESSAGE = "recipientpersonoid"; - private static final String KEY_INSTS_CHATMESSAGE = "insts"; - private static final String KEY_CHAT_TEXT_CHATMESSAGE = "chattext"; - private static final String KEY_IS_DELIVERED_CHATMESSAGE = "isdelivered"; - private static final String KEY_SERVERSEITIGE_OID_CHATMESSAGE = "serverseitigeoid"; - - public DatabaseHandler(Context context){ - super(context,DATABASE_NAME, null, DATABASE_VERSION); - } - - // Erstelle Tabelle | Tabellen construct - public void onCreate(SQLiteDatabase db){ - String CREATE_CONTACTS_TABLE ="CREATE TABLE "+TABLE_CONTACTS +"("+ - KEY_ID +" INTEGER PRIMARY KEY,"+KEY_KontaktName+ " TEXT,"+ - KEY_PERSONOID +" INTEGER," + KEY_Picture_BLOB+ " BLOB)"; - - db.execSQL(CREATE_CONTACTS_TABLE); - - String createChatMessageTable = - "CREATE TABLE " + TABLE_CHATMESSAGE + "(" + - KEY_ID_CHATMESSAGE + " INTEGER PRIMARY KEY," + - KEY_SENDER_PERSON_OID_CHATMESSAGE + " INTEGER," + - KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + " INTEGER," + - KEY_INSTS_CHATMESSAGE + " DATETIME DEFAULT CURRENT_TIMESTAMP," + - KEY_CHAT_TEXT_CHATMESSAGE + " TEXT," + - KEY_IS_DELIVERED_CHATMESSAGE + " INTEGER," + - KEY_SERVERSEITIGE_OID_CHATMESSAGE + " INTEGER DEFAULT NULL)"; - - db.execSQL(createChatMessageTable); - } - - long addChatMessage(ChatMessage message) { - SQLiteDatabase db = this.getWritableDatabase(); - ContentValues values = new ContentValues(); - - values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); - values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); - values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); - values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); - values.put(KEY_IS_DELIVERED_CHATMESSAGE, (message.IsDelivered ? 1 : 0)); - values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); - - long rowId = db.insert(TABLE_CHATMESSAGE, null, values); - db.close(); - - return rowId; - } - - void updateChatMessage(ChatMessage message) { - SQLiteDatabase db = this.getWritableDatabase(); - ContentValues values = new ContentValues(); - - values.put(KEY_SENDER_PERSON_OID_CHATMESSAGE, message.SenderPersonOid); - values.put(KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, message.RecipientPersonOid); - values.put(KEY_INSTS_CHATMESSAGE, getDateTimeString(message.InsTs)); - values.put(KEY_CHAT_TEXT_CHATMESSAGE, message.ChatText); - values.put(KEY_IS_DELIVERED_CHATMESSAGE, (message.IsDelivered ? 1 : 0)); - values.put(KEY_SERVERSEITIGE_OID_CHATMESSAGE, message.ServerseitigeOid); - - db.update(TABLE_CHATMESSAGE, values, KEY_ID_CHATMESSAGE + " = ?", new String[] { String.valueOf(message.Id)}); - } - - ArrayList getExistingChatMessageIds() { - ArrayList result = new ArrayList(); - - SQLiteDatabase db = this.getWritableDatabase(); - - String selectQuery = "SELECT "+ KEY_SERVERSEITIGE_OID_CHATMESSAGE + " FROM " + TABLE_CHATMESSAGE + " WHERE " + KEY_SERVERSEITIGE_OID_CHATMESSAGE + " <> 0"; - - Cursor cursor = db.rawQuery(selectQuery, null); - - if(cursor.moveToFirst()) { - do { - result.add(cursor.getInt(0)); - } while(cursor.moveToNext()); - } - - return result; - } - - private String getDateTimeString(Date date) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.GERMAN); - return dateFormat.format(date); - } - - private Date getDateFromString(String dateString) { - Date result = new Date(); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.GERMAN); - - try { - result = df.parse(dateString); - } catch (ParseException e) { - e.printStackTrace(); - } - - return result; - } - - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ - - //drop older Table if existed - db.execSQL("DROP TABLE IF EXISTS "+ TABLE_CONTACTS); - db.execSQL("DROP TABLE IF EXISTS "+ TABLE_CHATMESSAGE); - - onCreate(db); - } - - //Add Neuen Contact - void addContact(ContactListItem contact) { - SQLiteDatabase db = this.getWritableDatabase(); - ContentValues values = new ContentValues(); - - //Values übergabe - values.put(KEY_KontaktName,contact.getChatName()); - values.put(KEY_PERSONOID,contact.getPersonOid()); - values.put(KEY_Picture_BLOB,contact.getPicture()); - - db.insert(TABLE_CONTACTS,null,values); - db.close(); - } - - public ChatMessage getChatMessageById(int id) { - SQLiteDatabase db = this.getReadableDatabase(); - - Cursor cursor = db.query( - TABLE_CHATMESSAGE, - new String[] {KEY_ID_CHATMESSAGE, KEY_SENDER_PERSON_OID_CHATMESSAGE, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, KEY_INSTS_CHATMESSAGE, KEY_CHAT_TEXT_CHATMESSAGE, KEY_IS_DELIVERED_CHATMESSAGE, KEY_SERVERSEITIGE_OID_CHATMESSAGE}, - KEY_ID_CHATMESSAGE + "=?", - new String[]{String.valueOf(id)}, - null, null, null, null); - - if(cursor != null) { - cursor.moveToFirst(); - } - - ChatMessage message = new ChatMessage(cursor.getInt(0), cursor.getInt(1), cursor.getInt(2), getDateFromString(cursor.getString(3)), cursor.getString(4), cursor.getInt(5) != 0, cursor.getInt(6)); - - return message; - } - - public ArrayList getMessagesForRecipient(int recipientOid) { - ArrayList messages = new ArrayList<>(); - - SQLiteDatabase database = this.getWritableDatabase(); - - Cursor cursor = database.query( - TABLE_CHATMESSAGE, - new String[] {KEY_ID_CHATMESSAGE, KEY_SENDER_PERSON_OID_CHATMESSAGE, KEY_RECIPIENT_PERSON_OID_CHATMESSAGE, KEY_INSTS_CHATMESSAGE, KEY_CHAT_TEXT_CHATMESSAGE, KEY_IS_DELIVERED_CHATMESSAGE, KEY_SERVERSEITIGE_OID_CHATMESSAGE}, - KEY_SENDER_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? OR " + KEY_RECIPIENT_PERSON_OID_CHATMESSAGE + "=? AND " + KEY_SENDER_PERSON_OID_CHATMESSAGE + "=?", - new String[] {String.valueOf(SoapConnectionManager.User.getPersonOid()), String.valueOf(recipientOid), String.valueOf(SoapConnectionManager.User.getPersonOid()), String.valueOf(recipientOid)}, - null, null, null, null); - - if(cursor.moveToFirst()) { - do{ - ChatMessage message = new ChatMessage( - cursor.getInt(0), - cursor.getInt(1), - cursor.getInt(2), - getDateFromString(cursor.getString(3)), - cursor.getString(4), - cursor.getInt(5) != 0, - cursor.getInt(6) - ); - - messages.add(message); - } while(cursor.moveToNext()); - } - - return messages; - } - - // Lade einen bestimmten Kontakt - ContactListItem getContact(int id) { - - SQLiteDatabase db = this.getReadableDatabase(); - - Cursor cursor = db.query(TABLE_CONTACTS, new String[]{KEY_ID,KEY_KontaktName, - KEY_PERSONOID,KEY_Picture_BLOB},KEY_ID +"=?",new String[]{String.valueOf(id)} - ,null,null,null,null); - - if(cursor !=null) { - cursor.moveToFirst(); - } - - ContactListItem clist = new ContactListItem(Integer.parseInt(cursor.getString(0)),cursor.getString(1), Integer.parseInt(cursor.getString(2)),cursor.getBlob(3)); - return clist; - } - - //Holle alle Contacts - public List getAllContacts(){ - List contactList = new ArrayList(); - - String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; - - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - if (cursor.moveToFirst()) { - do { - ContactListItem contact = new ContactListItem(); - contact.setId(cursor.getInt(0)); - contact.setChatName(cursor.getString(1)); - contact.setPersonOid(cursor.getInt(2)); - contact.setPicture(cursor.getBlob(3)); - - // Adding contact to list - contactList.add(contact); - } while (cursor.moveToNext()); - } - - return contactList; - } - - //updating single Contact - public int updateContact(ContactListItem contact) { - SQLiteDatabase db = this.getWritableDatabase(); - - ContentValues values = new ContentValues(); - values.put(KEY_KontaktName, contact.getChatName()); - values.put(KEY_PERSONOID, contact.getPersonOid()); - values.put(KEY_Picture_BLOB, contact.getPicture()); - - // updating row - return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", - new String[] { String.valueOf(contact.getId()) }); - } - - //Delet single Contact - public void deleteContacts(ContactListItem contact){ - SQLiteDatabase db = this.getWritableDatabase(); - db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); - db.close(); - } - - public int getContactsCount(){ - String countQuery = "SELECT * FROM " + TABLE_CONTACTS; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - cursor.close(); - - // return count - return cursor.getCount(); - } - - public byte[] getUserImage(Integer personOid) { - - SQLiteDatabase database = this.getReadableDatabase(); - - Cursor cursor = database.query(TABLE_CONTACTS, new String[] {KEY_PERSONOID}, " = " + personOid, null, null, null, null); - cursor.close(); - - return cursor.getBlob(0); - } -} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java index 54e2aa27a..365345e94 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktAdapter.java @@ -11,7 +11,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,10 +18,6 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; import java.util.ArrayList; /** @@ -63,53 +58,24 @@ public class KontaktAdapter extends ArrayAdapter { textView.setText(values.get(position).getChatName()); + if(values.get(position).isTeam) { + minitext.setText(values.get(position).teamMemberNames); + } -// if(values[position].getChatName().equals("Demo")) { -// getM = new Thread(new ReadLastMessage(values[position].getChatName(), inflater)); -// getM.start(); -// } else { -// minitext.setText("Hier könnte auch ihre Nachricht stehen"); -// } - - //ab hier fehlerhaft if(values.get(position).getPicture() != null) { + byte[] imageAsByteArray = values.get(position).getPicture(); - //Konvert byte[] to Image - Bitmap i = BitmapFactory.decodeByteArray(values.get(position).getPicture(),0,values.get(position).getPicture().length); - - + Bitmap i = BitmapFactory.decodeByteArray(imageAsByteArray, 0, imageAsByteArray.length); getPic = new Thread(new CircleBitmapCreator(i)); getPic.start(); - - // t.interrupt(); - - // imageView.setImageBitmap(CircleBitmapCreator(i)); } else { - //wenn der kontakt kein bild besitzt dann nimm Default bild - //Bitmap customerImage =((BitmapDrawable).getDrawable(R.drawable.katze3)).getBitmap(); Bitmap bitmap = decodeSampledBitmapFromResource(inflater.getContext().getResources(), R.drawable.katze3, 100, 100);//BitmapFactory.decodeResource(inflater.getContext().getResources(), R.drawable.katze3); - - - // imageView.setImageResource(CircleBitmapCreator(bitmap)); - getPic = new Thread(new CircleBitmapCreator(bitmap)); getPic.start(); - - - - // imageView.setImageBitmap(CircleBitmapCreator(bitmap)); } - //if statement ob kontakt online oder net -// if(values[position].getArt().equals("1")) -// onlinestats.setImageResource(R.drawable.online); -// else if(values[position].getArt().equals("2")) -// onlinestats.setImageResource(R.drawable.beschaftigt); -// else if(values[position].getArt().equals("3")) -// onlinestats.setImageResource(R.drawable.offline); - onlinestats.setImageResource((values.get(position).isOnline ? R.drawable.online : R.drawable.offline)); return rowView; @@ -180,144 +146,4 @@ public class KontaktAdapter extends ArrayAdapter { return inSampleSize; } - - /* private Bitmap CircleBitmapCreator(Bitmap bitmap ) { - final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(output); - - final int color = Color.RED; - final Paint paint = new Paint(); - final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); - final RectF rectF = new RectF(rect); - - paint.setAntiAlias(true); - canvas.drawARGB(0, 0, 0, 0); - paint.setColor(color); - canvas.drawOval(rectF, paint); - - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - canvas.drawBitmap(bitmap, rect, rect, paint); - - bitmap.recycle(); - - return output; - }*/ - - public class ReadLastMessage implements Runnable{ - - LayoutInflater inflater; - String filename; - - ReadLastMessage(String _filename,LayoutInflater _inflater){ - this.inflater = _inflater; - this.filename = _filename; - } - - public void run(){ - - try{ - File filesDir = inflater.getContext().getFilesDir(); - - File file = new File(filesDir, "demo" +".txt"); //---->filename - - FileInputStream stream = new FileInputStream(file); - - InputStreamReader in = new InputStreamReader(stream); - - BufferedReader readLn = new BufferedReader(in); - - String line = readLn.readLine(); - String allLines=""; - - String [] ret= new String[2]; - - while (line != null) { - allLines += line; - - String[] splitt = line.split("/"); - - if(splitt.length >1 ) { - String[] ArtDate = splitt[1].split("%"); - - final String message = splitt[0]; - - final boolean art = Boolean.valueOf(ArtDate[0]); - - final String datetime = ArtDate[1]; - - if(!art) { - ret[0] = message; - ret[1] = datetime; - } - } - line = readLn.readLine(); - } - - stream.close(); - in.close(); - - // filedaten =ret; - - if(minitext != null) { - minitext.setText(ret[0]); - } - - }catch(Exception e){ - Log.v("Fehler 2 ",e.getMessage()); - e.printStackTrace(); - // return null; - } - } - } - - public String[] ReadLastMessage(String filename, LayoutInflater inflater){ - try{ - File filesDir = inflater.getContext().getFilesDir(); - - File file = new File(filesDir, "demo" +".txt"); //---->filename - - FileInputStream stream = new FileInputStream(file); - - InputStreamReader in = new InputStreamReader(stream); - - BufferedReader readLn = new BufferedReader(in); - - String line = readLn.readLine(); - String allLines=""; - - String [] ret= new String[2]; - - while (line != null) { - allLines += line; - - String[] splitt = line.split("/"); - - if(splitt.length >1 ) { - String[] ArtDate = splitt[1].split("%"); - - final String message = splitt[0]; - - final boolean art = Boolean.valueOf(ArtDate[0]); - - final String datetime = ArtDate[1]; - - if(!art) { - ret[0] = message; - ret[1] = datetime; - } - } - line = readLn.readLine(); - } - - stream.close(); - in.close(); - - return ret; - - }catch(Exception e){ - Log.v("Fehler 2 ",e.getMessage()); - e.printStackTrace(); - return null; - } - } } 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 c2f73569c..01b3ffb62 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/KontaktChatActivity.java @@ -34,9 +34,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import Database.DatabaseHandler; import entities.ChatMessage; import entities.ChatPerson; -import soapConnection.DataIdentifier; import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.Packet; import soapConnection.SoapCalls; @@ -52,8 +52,6 @@ public class KontaktChatActivity extends ListActivity { private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); private DatabaseHandler databaseHandler; - private static ArrayList onlinePersonOids = new ArrayList<>(); - private UIHandler kontaktChatUIHandler; public static ListView listView; @@ -64,13 +62,9 @@ public class KontaktChatActivity extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - databaseHandler = new DatabaseHandler(this); + databaseHandler = DatabaseHandler.getInstance(this); - //TODO: nicht löschen, sondern updaten... - //databaseHandler.onUpgrade(databaseHandler.getReadableDatabase(), 1, 2); - - Bundle bundle = getIntent().getExtras(); - onlinePersonOids = bundle.getIntegerArrayList("OnlineContacts"); + listView = getListView(); ArrayList propertyInfos = new ArrayList<>(); propertyInfos.add(SoapConnectionManager.BuildProperty("pPersonOid", SoapConnectionManager.User.getPersonOid(), Long.class)); @@ -78,23 +72,30 @@ public class KontaktChatActivity extends ListActivity { JsonSoapPrimitiveRequest request = new JsonSoapPrimitiveRequest(SoapCalls.GET_CONTACTS_FOR_PERSON, propertyInfos); spiceManager.execute(request, new JsonSoapPrimitiveRequestListener()); - listView = getListView(); - kontaktChatUIHandler = new UIHandler() { @Override public void updateUserInterface(final Packet chatPacket) { try { switch(chatPacket.ChatDataIdentifier) { case MESSAGE: - ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid); + ChatMessage message = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, false); databaseHandler.addChatMessage(message); + SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid); + break; + case TEAM: + ChatMessage teamMessage = new ChatMessage(chatPacket.SenderPersonOid, chatPacket.RecipientPersonOid, chatPacket.MessageTimeStamp, chatPacket.ChatMessage, false, chatPacket.ServerseitigeOid, true); + + databaseHandler.addChatMessage(teamMessage); + SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid); break; case STATUS_NOTIFICATION_LOGIN: - if(!onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - onlinePersonOids.add(chatPacket.SenderPersonOid); + Log.i("KONTAKTLISTE", "Login registriert: (" + chatPacket.SenderPersonOid + ") " + chatPacket.ChatName); + + if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { + SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); runOnUiThread(new Runnable() { @Override @@ -114,8 +115,8 @@ public class KontaktChatActivity extends ListActivity { } break; case STATUS_NOTIFICATION_LOGOUT: - if(onlinePersonOids.contains(chatPacket.SenderPersonOid)) { - onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); + if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { + SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); runOnUiThread(new Runnable() { @Override @@ -174,6 +175,9 @@ public class KontaktChatActivity extends ListActivity { bundle.putString("Name", selectedValue.getChatName()); bundle.putInt("RecipientOid", selectedValue.getPersonOid()); + bundle.putBoolean("IsTeam", selectedValue.isTeam); + bundle.putString("TeamMemberOids", selectedValue.teamMemberOids); + bundle.putString("TeamMemberNames", selectedValue.teamMemberNames); Intent in = new Intent(getBaseContext(), ChatActivity.class); in.putExtras(bundle); @@ -196,8 +200,15 @@ public class KontaktChatActivity extends ListActivity { public void onResume() { SocketManager.uiHandler = kontaktChatUIHandler; - // Update der Kontaktliste + KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); + if(adapter != null) { + for(ContactListItem item : adapter.values) { + item.isOnline = SocketManager.onlinePersonOids.contains(item.getPersonOid()); + } + + adapter.notifyDataSetChanged(); + } super.onResume(); } @@ -205,9 +216,16 @@ public class KontaktChatActivity extends ListActivity { @Override public void onStop(){ spiceManager.shouldStop(); + databaseHandler.close(); + super.onStop(); } + @Override + public void onPause() { + super.onPause(); + } + @Override protected void onStart() { super.onStart(); @@ -223,7 +241,6 @@ public class KontaktChatActivity extends ListActivity { @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { - if(soapPrimitive == null) { Log.i("KONTAKT_CHAT_ACTIVITY", "soapPrimitive ist NULL!"); } @@ -244,20 +261,29 @@ public class KontaktChatActivity extends ListActivity { for(ChatPerson cp : result) { if(!oidList.contains(cp.Oid)) { - databaseHandler.addContact(new ContactListItem(cp.Name, cp.Oid)); + databaseHandler.addContact(new ContactListItem(cp.Name, cp.Oid, cp.IsTeam, cp.TeamMemberOids, cp.TeamMemberNames)); } } + lc = databaseHandler.getAllContacts(); + for(ContactListItem item : lc) { - if(onlinePersonOids.contains(item.getPersonOid())){ + if(SocketManager.onlinePersonOids.contains(item.getPersonOid())){ item.isOnline = true; } } contactList = new ArrayList<>(lc); - setListAdapter(new KontaktAdapter(KontaktChatActivity.this, contactList)); - databaseHandler.close(); + KontaktAdapter adapter = (KontaktAdapter) listView.getAdapter(); + + if(adapter == null) { + adapter = new KontaktAdapter(KontaktChatActivity.this, contactList); + } + + setListAdapter(adapter); + + ((KontaktAdapter) listView.getAdapter()).notifyDataSetChanged(); } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java index 4d67c628c..9e583e79e 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/LoginActivity.java @@ -3,9 +3,10 @@ package beyondsoft.bewomitarbeiterapp; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; @@ -37,8 +38,6 @@ import org.ksoap2.serialization.SoapPrimitive; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -47,6 +46,7 @@ import java.util.ArrayList; import javax.crypto.NoSuchPaddingException; +import Database.DatabaseHandler; import soapConnection.ApplicationUser; import soapConnection.JsonSoapPrimitiveRequest; import soapConnection.SoapCalls; @@ -75,23 +75,6 @@ public class LoginActivity extends ActionBarActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); - try { - FileOutputStream fos = openFileOutput(Util.DEVICE_ID_FILE_NAME, Context.MODE_PRIVATE); - - FileInputStream fis = openFileInput(Util.DEVICE_ID_FILE_NAME); - - byte[] blah = new byte[fis.available()]; - - int bytesRead = fis.read(blah, 0, fis.available()); - - String test = new String(blah, "UTF-8"); - - Log.i("TEST", test); - - } catch (IOException e) { - e.printStackTrace(); - } - mChatCodeView = (EditText) findViewById(R.id.token); mTenantView = (EditText) findViewById(R.id.tenant); mUsernameView = (EditText) findViewById(R.id.username); @@ -265,13 +248,11 @@ public class LoginActivity extends ActionBarActivity { @Override public void onRequestSuccess(SoapPrimitive soapPrimitive) { - //TODO: UserDC statt bool zurückgeben. Null bei fehlgeschlagenem Login - if(soapPrimitive == null) { showProgress(false); showLoginUIErrors(true, true, true, true); - Toast.makeText(LoginActivity.this, "Login returned null", Toast.LENGTH_SHORT).show(); + Toast.makeText(LoginActivity.this, "Login nicht möglich", Toast.LENGTH_SHORT).show(); return; } @@ -282,6 +263,16 @@ public class LoginActivity extends ActionBarActivity { String[] blubb = abc.split(";"); SoapConnectionManager.User = new ApplicationUser(blubb[1], blubb[2], Long.valueOf(blubb[0]), Long.valueOf(blubb[3])); + DatabaseHandler databaseHandler = DatabaseHandler.getInstance(getApplicationContext()); + + int owner = databaseHandler.getOwnerOid(); + if(owner == 0) { + databaseHandler.insertOwnerOid(SoapConnectionManager.User.getPersonOid().intValue()); + } else if(owner != SoapConnectionManager.User.getPersonOid().intValue()) { + databaseHandler.clearDatabase(); + databaseHandler.insertOwnerOid(SoapConnectionManager.User.getPersonOid().intValue()); + } + if(mRememberMeCheckBoxView.isChecked()) { ByteArrayOutputStream tokenOutputStream = new ByteArrayOutputStream(); ByteArrayOutputStream tenantOutputStream = new ByteArrayOutputStream(); @@ -311,9 +302,6 @@ public class LoginActivity extends ActionBarActivity { SocketManager.tenant = mTenantView.getText().toString(); - SocketManager.connectToServer(); - SocketManager.LoginOnServer(); - Intent mainActivityMitarbeiter = new Intent(LoginActivity.this, MainActivityMitarbeiter.class); LoginActivity.this.startActivity(mainActivityMitarbeiter); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java index b7780ee61..7323d46f5 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MainActivityMitarbeiter.java @@ -8,16 +8,14 @@ import android.content.Intent; import android.graphics.Color; import android.support.v4.app.NotificationCompat; import android.os.Bundle; -import android.util.Log; + import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; -import java.util.ArrayList; import java.util.Random; -import soapConnection.DataIdentifier; import soapConnection.Packet; import soapConnection.SoapConnectionManager; @@ -37,37 +35,48 @@ public class MainActivityMitarbeiter extends Activity { int loggedInUserPersonOid; - private ArrayList onlinePersonOids; - - - @Override + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_activity_mitarbeiter); + SocketManager.connectToServer(); + SocketManager.loginOnServer(); + setzeButtonListener(); loggedInUserName = SoapConnectionManager.User.getFullName(); loggedInUserPersonOid = SoapConnectionManager.User.getPersonOid() <= Integer.MAX_VALUE ? SoapConnectionManager.User.getPersonOid().intValue() : 0; - onlinePersonOids = new ArrayList<>(); - mainUIHandler = new UIHandler() { @Override public void updateUserInterface(Packet chatPacket) { - if(chatPacket.ChatDataIdentifier.equals(DataIdentifier.MESSAGE)) { - Log.i("MAIN_ACTIVIY_LISTENER", "Empfange Nachricht... <<" + chatPacket.ChatMessage + ">>"); - chatPacket.writeToLog(); - SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid); - } else if(chatPacket.ChatDataIdentifier.equals(DataIdentifier.STATUS_NOTIFICATION_LOGIN_BROADCAST)) { + switch(chatPacket.ChatDataIdentifier) { + case MESSAGE: + SetNotify(chatPacket.ChatName, chatPacket.ChatMessage, chatPacket.SenderPersonOid); - String[] bitch = chatPacket.ChatMessage.split(","); - onlinePersonOids = new ArrayList<>(); + break; + case STATUS_NOTIFICATION_LOGIN_BROADCAST: + String[] bitch = chatPacket.ChatMessage.split(","); - for (String aBitch : bitch) { - onlinePersonOids.add(Integer.parseInt(aBitch)); - } + for (String aBitch : bitch) { + SocketManager.onlinePersonOids.add(Integer.parseInt(aBitch)); + } + + break; + case STATUS_NOTIFICATION_LOGIN: + if(!SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { + SocketManager.onlinePersonOids.add(chatPacket.SenderPersonOid); + } + + break; + case STATUS_NOTIFICATION_LOGOUT: + if(SocketManager.onlinePersonOids.contains(chatPacket.SenderPersonOid)) { + SocketManager.onlinePersonOids.remove(Integer.valueOf(chatPacket.SenderPersonOid)); + } + + break; } } }; @@ -110,20 +119,7 @@ public class MainActivityMitarbeiter extends Activity { chatbutton = (Button) findViewById(R.id.Chatbutton); chatbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - -// if(socket == null || !socket.isConnected()) { -// Toast.makeText(getApplicationContext(), "Der Chatserver ist zurzeit nicht erreichbar. \nBitte versuchen Sie es später erneut.", Toast.LENGTH_LONG).show(); -// -// return; -// } - - Bundle bundle = new Bundle(); - - bundle.putIntegerArrayList("OnlineContacts", onlinePersonOids); - - Intent kontaktChatActivity = new Intent(getBaseContext(),KontaktChatActivity.class); - - kontaktChatActivity.putExtras(bundle); + Intent kontaktChatActivity = new Intent(getBaseContext(), KontaktChatActivity.class); startActivity(kontaktChatActivity); } @@ -132,20 +128,7 @@ public class MainActivityMitarbeiter extends Activity { logoutbutton = (Button) findViewById(R.id.Logoutbutton); logoutbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - -// if(socket != null && socket.isConnected()) { -// try { -// Packet p = new Packet(); -// -// p.ChatDataIdentifier = DataIdentifier.LOGOUT; -// -// new Thread(new MessageSender(p.getDataStream())).start(); -// } catch(Exception e) { -// Log.e("SendAfterGetConnection", "Fehler beim Logout: " + e.getMessage()); -// } -// } - - SocketManager.Logout(); + SocketManager.logout(); finish(); System.exit(0); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java index 2fe690faa..cf6c6a6d2 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/beyondsoft/bewomitarbeiterapp/MessageAdapter.java @@ -1,6 +1,7 @@ package beyondsoft.bewomitarbeiterapp; import android.app.Activity; +import android.provider.ContactsContract; import android.text.Html; import android.util.Log; import android.view.LayoutInflater; @@ -11,6 +12,7 @@ import android.widget.TextView; import java.util.List; +import Database.DatabaseHandler; import entities.ChatMessage; import soapConnection.SoapConnectionManager; @@ -37,20 +39,30 @@ public class MessageAdapter extends ArrayAdapter { int layoutResource; ChatMessage chatMessage = getItem(position); - - if (chatMessage.SenderPersonOid == SoapConnectionManager.User.getPersonOid()) { layoutResource = R.layout.item_chat_right; }else { layoutResource = R.layout.item_chat_left; } + + convertView = inflater.inflate(layoutResource, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); holder.msg.setText(chatMessage.ChatText); + if(chatMessage.IsTeam && chatMessage.SenderPersonOid != SoapConnectionManager.User.getPersonOid()) { + DatabaseHandler instance = DatabaseHandler.getInstance(this.getContext()); + ContactListItem sender = instance.getContactByPersonOid(chatMessage.SenderPersonOid); + + String name = sender != null ? sender.getChatName() : ""; + + holder.teamMemberName.setText(name); + holder.teamMemberName.setVisibility(View.VISIBLE); + } + if(chatMessage.SenderPersonOid == SoapConnectionManager.User.getPersonOid()){ holder.dateIn.setText(chatMessage.getInsTsAsString()); } else { @@ -77,15 +89,15 @@ public class MessageAdapter extends ArrayAdapter { private TextView msg; private TextView dateOut; private TextView dateIn; - - private TextView send_tick; - + private TextView teamMemberName; + //private TextView send_tick; public ViewHolder(View v) { - msg = (TextView) v.findViewById(R.id.txt_msg); - dateOut = (TextView)v.findViewById(R.id.DateOUT); - dateIn = (TextView)v.findViewById(R.id.DateIN); - send_tick = (TextView)v.findViewById(R.id.txt_msg_tick); + msg = (TextView) v.findViewById(R.id.txt_msg); + dateOut = (TextView)v.findViewById(R.id.DateOUT); + dateIn = (TextView)v.findViewById(R.id.DateIN); + teamMemberName = (TextView) v.findViewById(R.id.teamMember); + //send_tick = (TextView)v.findViewById(R.id.txt_msg_tick); } } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java index d5d479349..130ba942a 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatMessage.java @@ -15,8 +15,9 @@ public class ChatMessage { public String ChatText; public boolean IsDelivered; public int ServerseitigeOid; + public boolean IsTeam; - public ChatMessage(int id, int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid) { + public ChatMessage(int id, int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid, boolean isTeam) { Id = id; SenderPersonOid = senderPersonOid; RecipientPersonOid = recipientPersonOid; @@ -24,19 +25,37 @@ public class ChatMessage { ChatText = chatText; IsDelivered = isDelivered; ServerseitigeOid = serverseitigeOid; + IsTeam = isTeam; } - public ChatMessage(int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid) { + public ChatMessage(int senderPersonOid, int recipientPersonOid, Date insTs, String chatText, boolean isDelivered, int serverseitigeOid, boolean isTeam) { SenderPersonOid = senderPersonOid; RecipientPersonOid = recipientPersonOid; InsTs = insTs; ChatText = chatText; IsDelivered = isDelivered; ServerseitigeOid = serverseitigeOid; + IsTeam = isTeam; } public String getInsTsAsString() { SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMAN); return dateFormat.format(InsTs); } + + @Override + public String toString() { + String asString = ""; + + asString += "Id: " + Id; + asString += "\nSenderPersonOid: " + SenderPersonOid; + asString += "\nRecipientPersonOid: " + RecipientPersonOid; + asString += "\nInsTs: " + getInsTsAsString(); + asString += "\nChatText: " + ChatText; + asString += "\nIsDelivered: " + IsDelivered; + asString += "\nServerseitigeOid: " + ServerseitigeOid; + asString += "\nIsTeam: " + IsTeam; + + return asString; + } } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java index 24a9427d1..93bf4f6fa 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/entities/ChatPerson.java @@ -6,4 +6,7 @@ package entities; public class ChatPerson { public int Oid; public String Name; + public boolean IsTeam; + public String TeamMemberNames; + public String TeamMemberOids; } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java index 0911ddad3..31ec3007e 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/DataIdentifier.java @@ -14,7 +14,10 @@ public enum DataIdentifier { DELIVERING_STATUS_CHANGE(7), STATUS_NOTIFICATION_LOGIN_BROADCAST(8), TEAM(9), - MESSAGE_RESPONSE(10); + MESSAGE_RESPONSE(10), + STATUS_NOTIFICATION_BESCHAEFTIGT(11), + STATUS_NOTIFICATION_ONLINE(12), + STATUS_NOTIFICATION_OFFLINE(13); private final int value; DataIdentifier(int value) { diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java index 5cb1c4615..aab897218 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/soapConnection/Packet.java @@ -25,6 +25,7 @@ public class Packet { public boolean IsDelivered; public int ServerseitigeOid; public int ClientseitigeOid; + public boolean IsTeam; public Packet() { ChatDataIdentifier = DataIdentifier.NULL; @@ -34,7 +35,6 @@ public class Packet { SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue(); RecipientPersonOid = 0; IsDelivered = false; - MessageTimeStamp = Calendar.getInstance().getTime(); } diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java index bf35d4939..a24d269ce 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java +++ b/Android/BewoMitarbeiterApp/app/src/main/java/tcpConnection/SocketManager.java @@ -6,6 +6,7 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; +import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; @@ -27,6 +28,8 @@ public class SocketManager { public static UIHandler uiHandler; public static DataOutputStream dataOutputStream; + public static ArrayList onlinePersonOids = new ArrayList<>(); + public static void connectToServer(){ new Thread(new OpenConnection()).start(); } @@ -40,7 +43,7 @@ public class SocketManager { try { socket = new Socket(SoapCalls.DESTINATION_ADDRESS, SoapCalls.DESTINATION_PORT); - LoginOnServer(); + loginOnServer(); dataOutputStream = new DataOutputStream(socket.getOutputStream()); @@ -76,7 +79,7 @@ public class SocketManager { } } - public static void Logout() { + public static void logout() { if(socket != null && socket.isConnected()) { try { Packet packet = new Packet(); @@ -91,7 +94,7 @@ public class SocketManager { } } - public static void LoginOnServer() { + public static void loginOnServer() { if(socket != null && socket.isConnected()) { try { Packet packet = new Packet(); @@ -100,7 +103,6 @@ public class SocketManager { packet.ChatDataIdentifier = DataIdentifier.LOGIN; new Thread(new MessageSender(packet.getDataStream())).start(); - } catch(Exception exception) { exception.printStackTrace(); } @@ -174,25 +176,11 @@ public class SocketManager { continue; } - StringBuilder total = new StringBuilder(stream.available()); - - int counter = 0; - byte[] message = new byte[size]; stream.read(message, 0, size); -// while(counter < size) { -// -// char c = (char) stream.read(); -// -// total.append(c); -// -// counter++; -// } - try { - //chatPacket = new Packet(total.toString()); chatPacket = new Packet(new String(message, "UTF-8")); Log.i(TAG, "Empfange Nachricht... " + chatPacket.ChatMessage); diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java new file mode 100644 index 000000000..8daa89406 --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/ChatMessageDeserializer.java @@ -0,0 +1,57 @@ +package util; + +import android.util.Log; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import entities.ChatMessage; + +/** + * Created by JettenM on 09.08.2016. + */ +public class ChatMessageDeserializer implements JsonDeserializer { + @Override + public ChatMessage deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + + JsonObject json = (JsonObject) jsonElement; + + int senderPersonOid = Long.valueOf(json.get("SenderPersonOid").getAsLong()).intValue(); + int recipientPersonOid = Long.valueOf(json.get("EmpfängerPersonOid").getAsLong()).intValue(); + int serverseitigeOid = Long.valueOf(json.get("Oid").getAsLong()).intValue(); + String chatText = json.get("ChatText").getAsString(); + boolean isDelivered = json.get("istZugestellt").getAsBoolean(); + + boolean isTeam = json.get("TeamOid") == null; + + if(isTeam) + { + Log.i("MESSAGE_DESERIALIZATION", "" + Long.valueOf(json.get("TeamOid").getAsString())); + } + + if(isTeam) { + recipientPersonOid = json.get("TeamOid").getAsInt(); + } + + Date insTs = Calendar.getInstance().getTime(); + + try { + insTs = simpleDateFormat.parse(json.get("InsTs").getAsString()); + } catch (ParseException e) { + e.printStackTrace(); + } + + return new ChatMessage(senderPersonOid, recipientPersonOid, insTs, chatText, isDelivered, serverseitigeOid, isTeam); + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/java/util/DateDeserializer.java b/Android/BewoMitarbeiterApp/app/src/main/java/util/DateDeserializer.java new file mode 100644 index 000000000..e40721e8d --- /dev/null +++ b/Android/BewoMitarbeiterApp/app/src/main/java/util/DateDeserializer.java @@ -0,0 +1,32 @@ +package util; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by JettenM on 08.08.2016. + */ +public class DateDeserializer implements JsonDeserializer { + @Override + public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + + SimpleDateFormat sdf = new SimpleDateFormat("\"yyyy-MM-dd'T'HH:mm:ss\""); + Date date = null; + + try { + date = sdf.parse(jsonElement.getAsJsonPrimitive().toString()); + return date; + } catch(ParseException e) { + e.printStackTrace(); + } + + return date; + } +} diff --git a/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml b/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml index a00303dab..a9c0b37d7 100644 --- a/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml +++ b/Android/BewoMitarbeiterApp/app/src/main/res/layout/chat.xml @@ -32,10 +32,6 @@ android:orientation="horizontal" > - - - - -