From c6035e841f0546e42b1f5eb283be5278a645296a Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Fri, 18 Sep 2015 18:57:49 +0200 Subject: [PATCH] Add chat view and otger stuff --- res/layout/chat.xml | 87 ++-------- res/layout/chat_bubble_incoming.xml | 41 +++-- res/layout/chat_bubble_outgoing.xml | 15 +- res/layout/chatlist_cell.xml | 33 +++- res/layout/conference_header.xml | 67 ++++---- res/layout/history_detail.xml | 63 +++---- src/org/linphone/ChatFragment.java | 219 ++++++++++++++++--------- src/org/linphone/ChatListFragment.java | 55 ++++--- src/org/linphone/ui/BubbleChat.java | 34 +++- 9 files changed, 346 insertions(+), 268 deletions(-) diff --git a/res/layout/chat.xml b/res/layout/chat.xml index f288b0b35..8a181154e 100644 --- a/res/layout/chat.xml +++ b/res/layout/chat.xml @@ -13,61 +13,23 @@ - - - - - - + android:padding="20dp"/> + android:padding="15dp"/> + android:layout_width="70dp" + android:layout_height="match_parent" + android:padding="15dp"/> - + + - - - - - - - - + diff --git a/res/layout/chat_bubble_incoming.xml b/res/layout/chat_bubble_incoming.xml index 7a93998d4..f6e185a48 100644 --- a/res/layout/chat_bubble_incoming.xml +++ b/res/layout/chat_bubble_incoming.xml @@ -7,13 +7,34 @@ android:gravity="left" android:orientation="horizontal" > - + + + + + + + + diff --git a/res/layout/chat_bubble_outgoing.xml b/res/layout/chat_bubble_outgoing.xml index 916ebe446..cc6951d8b 100644 --- a/res/layout/chat_bubble_outgoing.xml +++ b/res/layout/chat_bubble_outgoing.xml @@ -38,12 +38,21 @@ + + - + + + + + + + @@ -83,7 +100,7 @@ android:layout_width="25dp" android:layout_height="25dp" android:background="@drawable/chat_list_indicator" - style="@style/font17" + style="@style/font18" android:gravity="center" android:layout_above="@+id/lastMessage" android:layout_alignParentRight="true" diff --git a/res/layout/conference_header.xml b/res/layout/conference_header.xml index d3ad9c084..9379fc2fd 100644 --- a/res/layout/conference_header.xml +++ b/res/layout/conference_header.xml @@ -1,41 +1,48 @@ - - - + android:background="@color/colorH"> + + + + + + + + + - - + android:layout_centerInParent="true" + android:padding="10dp" + android:src="@drawable/pause_big_default"/> - \ No newline at end of file + + + \ No newline at end of file diff --git a/res/layout/history_detail.xml b/res/layout/history_detail.xml index 825b5ae75..ee8a3699b 100644 --- a/res/layout/history_detail.xml +++ b/res/layout/history_detail.xml @@ -20,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentLeft="true" - android:padding="10dp" + android:padding="20dp" android:adjustViewBounds="true"/> @@ -30,7 +30,7 @@ android:background="@drawable/toolbar_button" android:contentDescription="@string/content_description_add_contact" android:layout_alignParentRight="true" - android:padding="10dp" + android:padding="15dp" android:layout_width="wrap_content" android:layout_height="match_parent" android:adjustViewBounds="true"/> @@ -57,8 +57,8 @@ android:id="@+id/contact_picture" android:src="@drawable/avatar" android:contentDescription="@string/content_description_contact_picture" - android:layout_width="120dp" - android:layout_height="120dp" + android:layout_width="100dp" + android:layout_height="100dp" android:adjustViewBounds="true" android:layout_alignParentLeft="true" android:layout_marginLeft="5dp"/> @@ -67,8 +67,8 @@ android:id="@+id/mask" android:src="@drawable/avatar_mask" android:contentDescription="@string/content_description_contact_picture" - android:layout_width="120dp" - android:layout_height="120dp" + android:layout_width="100dp" + android:layout_height="100dp" android:adjustViewBounds="true" android:layout_alignParentLeft="true" android:layout_marginLeft="5dp"/> @@ -78,6 +78,7 @@ @@ -95,41 +96,27 @@ android:paddingTop="20dp" android:gravity="center" android:orientation="horizontal"> - - - - - - - + - + - 0 && isNetworkReachable) { LinphoneChatMessage message = chatRoom.createLinphoneChatMessage(messageToSend); chatRoom.sendChatMessage(message); - LinphoneActivity.instance().displayChat(lAddress.toString()); + message.setListener(LinphoneManager.getInstance()); + Contact lContact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), lAddress); + if(lContact != null) + exitNewConversationMode(lContact,lAddress.asStringUriOnly(),null); + else + exitNewConversationMode(null,lAddress.asStringUriOnly(),lAddress.getUserName()); } } } else { @@ -692,6 +749,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC private void sendImageMessage(String path, int imageSize) { LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); boolean isNetworkReachable = lc == null ? false : lc.isNetworkReachable(); + invalidate(); if (chatRoom != null && path != null && path.length() > 0 && isNetworkReachable) { try { @@ -718,8 +776,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC public FileUploadPrepareTask(Context context, String fileToUploadPath, int size) { path = fileToUploadPath; imageSize = size; - uploadLayout.setVisibility(View.VISIBLE); - textLayout.setVisibility(View.GONE); + //uploadLayout.setVisibility(View.VISIBLE); + //textLayout.setVisibility(View.GONE); progressDialog = new ProgressDialog(context); progressDialog.setIndeterminate(true); @@ -860,6 +918,24 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC return null; } + private void exitNewConversationMode(Contact c, String address, String username){ + searchContactField.setVisibility(View.GONE); + sipUri = address; + messagesList.setVisibility(View.VISIBLE); + contactName.setVisibility(View.VISIBLE); + edit.setVisibility(View.VISIBLE); + back.setVisibility(View.VISIBLE); + startCall.setVisibility(View.VISIBLE); + newChatConversation = false; + chatRoom = LinphoneManager.getLc().getOrCreateChatRoom(address); + + if(c != null) + changeDisplayedChat(address,c.getName(),null); + else + changeDisplayedChat(address,username,null); + dispayMessageList(); + } + private void showPopupMenuAskingImageSize(final String filePath) { filePathToUpload = filePath; try { @@ -891,12 +967,12 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC @Override public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, State state) { - if (state == State.FileTransferDone || state == State.FileTransferError) { - uploadLayout.setVisibility(View.GONE); - textLayout.setVisibility(View.VISIBLE); - progressBar.setProgress(0); - currentMessageInFileTransferUploadState = null; - } + //if (state == State.FileTransferDone || state == State.FileTransferError) { + // uploadLayout.setVisibility(View.GONE); + // textLayout.setVisibility(View.VISIBLE); + // progressBar.setProgress(0); + // currentMessageInFileTransferUploadState = null; + //} invalidate(); } @@ -937,7 +1013,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC FilterResults results) { if (results.count > 0) { - Log.w(results.count); contacts.clear(); contacts = (List) results.values; notifyDataSetChanged(); @@ -953,9 +1028,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC List result = new ArrayList(); if(constraint != null) { for (ContactAddress c : contacts) { - Log.w(constraint.toString()); - Log.w(c.mContact.getName()); - Log.w(c.mAddress); if (c.mContact.getName().toLowerCase().startsWith(constraint.toString()) || c.mAddress.startsWith(constraint.toString())) { result.add(c); } @@ -1025,15 +1097,14 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC final TextView address = (TextView) view.findViewById(R.id.contact_address); address.setText(contact.mAddress); + final String a = contact.mAddress; + final Contact c = contact.mContact; + view.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - searchContactField.setVisibility(View.GONE); - sipUri = address.getText().toString(); - messagesList.setVisibility(View.VISIBLE); - newChatConversation = false; - chatRoom = LinphoneManager.getLc().getOrCreateChatRoom(address.getText().toString()); - dispayMessageList(); + exitNewConversationMode(c, a,null); + } }); diff --git a/src/org/linphone/ChatListFragment.java b/src/org/linphone/ChatListFragment.java index 541b1960d..934981150 100644 --- a/src/org/linphone/ChatListFragment.java +++ b/src/org/linphone/ChatListFragment.java @@ -59,6 +59,7 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ListView; +import android.widget.RelativeLayout; import android.widget.TextView; /** @@ -69,7 +70,8 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte private List mConversations, mDrafts; private ListView chatList; private TextView noChatHistory; - private ImageView edit, selectAll, deselectAll, delete, newDiscussion, contactPicture; + private ImageView edit, selectAll, deselectAll, delete, newDiscussion, contactPicture, cancel; + private RelativeLayout editList, topbar; private boolean isEditMode = false; private boolean useLinphoneStorage; @@ -85,6 +87,12 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte noChatHistory = (TextView) view.findViewById(R.id.noChatHistory); + editList = (RelativeLayout) view.findViewById(R.id.edit_list); + topbar = (RelativeLayout) view.findViewById(R.id.top_bar); + + cancel = (ImageView) view.findViewById(R.id.cancel); + cancel.setOnClickListener(this); + edit = (ImageView) view.findViewById(R.id.edit); edit.setOnClickListener(this); @@ -99,7 +107,6 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte delete = (ImageView) view.findViewById(R.id.delete); delete.setOnClickListener(this); - delete.setVisibility(View.INVISIBLE); return view; } @@ -127,10 +134,8 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte public void quitEditMode(){ isEditMode = false; - selectAll.setVisibility(View.GONE); - deselectAll.setVisibility(View.GONE); - delete.setVisibility(View.GONE); - edit.setVisibility(View.VISIBLE); + editList.setVisibility(View.GONE); + topbar.setVisibility(View.VISIBLE); refresh(); } @@ -257,6 +262,11 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte return; } + if (id == R.id.cancel) { + quitEditMode(); + return; + } + if (id == R.id.delete) { final Dialog dialog = LinphoneActivity.instance().displayDialog(getString(R.string.delete_text)); Button delete = (Button) dialog.findViewById(R.id.delete); @@ -282,9 +292,8 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte return; } else if (id == R.id.edit) { - edit.setVisibility(View.GONE); - selectAll.setVisibility(View.VISIBLE); - delete.setVisibility(View.VISIBLE); + topbar.setVisibility(View.GONE); + editList.setVisibility(View.VISIBLE); isEditMode = true; hideAndDisplayMessageIfNoChat(); } @@ -461,27 +470,23 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte Contact lContact = ContactsManager.getInstance().findContactWithAddress(getActivity().getContentResolver(), address); String message = ""; - Long time = null; + Long time; TextView lastMessageView = (TextView) view.findViewById(R.id.lastMessage); LinphoneChatRoom chatRoom = LinphoneManager.getLc().getOrCreateChatRoom(contact); LinphoneChatMessage[] history = chatRoom.getHistory(1); LinphoneChatMessage msg = history[0]; - if (msg.getText() != null && msg.getText().length() > 0) { + TextView date = (TextView) view.findViewById(R.id.date); + if(msg.getFileTransferInformation() != null || msg.getExternalBodyUrl() != null || msg.getAppData() != null ){ + lastMessageView.setBackgroundResource(R.drawable.chat_file_message); + time = msg.getTime(); + date.setText(timestampToHumanDate(time)); + } else if (msg.getText() != null && msg.getText().length() > 0 ){ message = msg.getText(); time = msg.getTime(); + date.setText(timestampToHumanDate(time)); lastMessageView.setText(message); - } else { - if(msg.getFileTransferInformation() != null || msg.getExternalBodyUrl() != null){ - lastMessageView.setBackgroundResource(R.drawable.chat_file_message); - time = msg.getTime(); - - } } - TextView date = (TextView) view.findViewById(R.id.date); - if(time != null) - date.setText(timestampToHumanDate(time)); - TextView sipUri = (TextView) view.findViewById(R.id.sipUri); sipUri.setSelected(true); // For animation @@ -495,8 +500,11 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte view.findViewById(R.id.draft).setVisibility(View.VISIBLE); } + TextView unreadMessages = (TextView) view.findViewById(R.id.unreadMessages); + CheckBox select = (CheckBox) view.findViewById(R.id.delete); if (isEditMode) { + unreadMessages.setVisibility(View.GONE); select.setVisibility(View.VISIBLE); select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -510,10 +518,9 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte select.setChecked(false); } } else { - delete.setVisibility(View.GONE); + unreadMessages.setVisibility(View.GONE); + //delete.setVisibility(View.GONE); } - - TextView unreadMessages = (TextView) view.findViewById(R.id.unreadMessages); if (unreadMessagesCount > 0) { unreadMessages.setVisibility(View.VISIBLE); diff --git a/src/org/linphone/ui/BubbleChat.java b/src/org/linphone/ui/BubbleChat.java index ebc7e26cd..7ec8b9e11 100644 --- a/src/org/linphone/ui/BubbleChat.java +++ b/src/org/linphone/ui/BubbleChat.java @@ -26,6 +26,8 @@ import java.util.Calendar; import java.util.HashMap; import java.util.Map.Entry; +import org.linphone.Contact; +import org.linphone.ContactsManager; import org.linphone.LinphoneManager; import org.linphone.LinphoneUtils; import org.linphone.R; @@ -73,7 +75,7 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen private static final HashMap emoticons = new HashMap(); private LinearLayout view; - private ImageView statusView; + private ImageView statusView, contactPicture; private LinphoneChatMessage nativeMessage; private Context mContext; private static final int SIZE_MAX = 512; @@ -81,7 +83,7 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen private Bitmap defaultBitmap; @SuppressLint("InflateParams") - public BubbleChat(final Context context, LinphoneChatMessage message) { + public BubbleChat(final Context context, LinphoneChatMessage message, Contact c) { if (message == null) { return; } @@ -94,7 +96,7 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.chat_bubble_incoming, null); } - defaultBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.chat_photo_default); + defaultBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.chat_picture_over); view.setId(message.getStorageId()); @@ -102,6 +104,12 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen String externalBodyUrl = message.getExternalBodyUrl(); LinphoneContent fileTransferContent = message.getFileTransferInformation(); + + if(LinphoneManager.getInstance().getMessageUploadPending() != null){ + spinner.setVisibility(View.VISIBLE); + nativeMessage.setListener(LinphoneManager.getInstance()); + } + if (externalBodyUrl != null || fileTransferContent != null) { Button download = (Button) view.findViewById(R.id.download); ImageView imageView = (ImageView) view.findViewById(R.id.image); @@ -158,8 +166,24 @@ public class BubbleChat implements LinphoneChatMessage.LinphoneChatMessageListen } TextView contact = (TextView) view.findViewById(R.id.contact_header); - contact.setText(timestampToHumanDate(context, message.getTime()) + " - " + LinphoneUtils.getUsernameFromAddress(message.getFrom().asStringUriOnly())); - + + + + contactPicture = (ImageView) view.findViewById(R.id.contact_picture); + + String displayName = nativeMessage.getFrom().getUserName(); + final String sipUri = nativeMessage.getFrom().asStringUriOnly(); + if(!nativeMessage.isOutgoing()) { + if (c != null) { + displayName = c.getName(); + LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture, c.getPhotoUri(), c.getThumbnailUri()); + } else { + contactPicture.setImageResource(R.drawable.avatar); + } + } + + contact.setText(timestampToHumanDate(context, message.getTime()) + " - " + displayName); + LinphoneChatMessage.State status = message.getStatus(); statusView = (ImageView) view.findViewById(R.id.status); inprogress = (ProgressBar) view.findViewById(R.id.inprogress);