diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 0474454b2..3c0313b4f 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -41,6 +41,7 @@ import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.telephony.TelephonyManager; +import android.text.Spanned; import android.text.TextUtils; import android.util.TypedValue; import android.view.KeyEvent; @@ -52,6 +53,7 @@ import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; +import org.linphone.compatibility.Compatibility; import org.linphone.contacts.ContactsManager; import org.linphone.core.DialPlan; import org.linphone.core.AccountCreator; @@ -87,6 +89,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -938,5 +941,33 @@ public final class LinphoneUtils { return null; } + public static Spanned getTextWithHttpLinks(String text) { + if (text.contains("<")) { + text = text.replace("<", "<"); + } + if (text.contains(">")) { + text = text.replace(">", ">"); + } + if (text.contains("\n")) { + text = text.replace("\n", "
"); + } + if (text.contains("http://")) { + int indexHttp = text.indexOf("http://"); + int indexFinHttp = text.indexOf(" ", indexHttp) == -1 ? text.length() : text.indexOf(" ", indexHttp); + String link = text.substring(indexHttp, indexFinHttp); + String linkWithoutScheme = link.replace("http://", ""); + text = text.replaceFirst(Pattern.quote(link), "" + linkWithoutScheme + ""); + } + if (text.contains("https://")) { + int indexHttp = text.indexOf("https://"); + int indexFinHttp = text.indexOf(" ", indexHttp) == -1 ? text.length() : text.indexOf(" ", indexHttp); + String link = text.substring(indexHttp, indexFinHttp); + String linkWithoutScheme = link.replace("https://", ""); + text = text.replaceFirst(Pattern.quote(link), "" + linkWithoutScheme + ""); + } + + return Compatibility.fromHtml(text); + } + } diff --git a/src/android/org/linphone/chat/ChatEventsAdapter.java b/src/android/org/linphone/chat/ChatEventsAdapter.java index 867260093..e3cdaed70 100644 --- a/src/android/org/linphone/chat/ChatEventsAdapter.java +++ b/src/android/org/linphone/chat/ChatEventsAdapter.java @@ -66,7 +66,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.ref.WeakReference; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -290,17 +289,16 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene } } else { holder.fileTransferLayout.setVisibility(View.VISIBLE); - } - } else if (msg != null) { - text = getTextWithHttpLinks(msg); + } else if (msg != null) { // Text message + text = LinphoneUtils.getTextWithHttpLinks(msg); holder.messageText.setText(text); holder.messageText.setMovementMethod(LinkMovementMethod.getInstance()); holder.messageText.setVisibility(View.VISIBLE); } holder.bubbleLayout.setLayoutParams(layoutParams); - } else { + } else { // Event is not chat message holder.eventLayout.setVisibility(View.VISIBLE); Log.e("Conference event type is " + event.getType().toString()); @@ -338,49 +336,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene return view; } - private boolean isToday(Calendar cal) { - return isSameDay(cal, Calendar.getInstance()); - } - - private boolean isSameDay(Calendar cal1, Calendar cal2) { - if (cal1 == null || cal2 == null) { - return false; - } - - return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && - cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && - cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)); - } - - private Spanned getTextWithHttpLinks(String text) { - if (text.contains("<")) { - text = text.replace("<", "<"); - } - if (text.contains(">")) { - text = text.replace(">", ">"); - } - if (text.contains("\n")) { - text = text.replace("\n", "
"); - } - if (text.contains("http://")) { - int indexHttp = text.indexOf("http://"); - int indexFinHttp = text.indexOf(" ", indexHttp) == -1 ? text.length() : text.indexOf(" ", indexHttp); - String link = text.substring(indexHttp, indexFinHttp); - String linkWithoutScheme = link.replace("http://", ""); - text = text.replaceFirst(Pattern.quote(link), "" + linkWithoutScheme + ""); - } - if (text.contains("https://")) { - int indexHttp = text.indexOf("https://"); - int indexFinHttp = text.indexOf(" ", indexHttp) == -1 ? text.length() : text.indexOf(" ", indexHttp); - String link = text.substring(indexHttp, indexFinHttp); - String linkWithoutScheme = link.replace("https://", ""); - text = text.replaceFirst(Pattern.quote(link), "" + linkWithoutScheme + ""); - } - - return Compatibility.fromHtml(text); - } - - public void loadBitmap(String path, ImageView imageView) { + private void loadBitmap(String path, ImageView imageView) { if (cancelPotentialWork(path, imageView)) { if (LinphoneUtils.isExtensionImage(path)) { mDefaultBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.chat_attachment_over); @@ -395,6 +351,90 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene } } + private void openFile(String path) { + Intent intent = new Intent(Intent.ACTION_VIEW); + File file = null; + Uri contentUri = null; + if (path.startsWith("file://")) { + path = path.substring("file://".length()); + file = new File(path); + contentUri = FileProvider.getUriForFile(mContext, "org.linphone.provider", file); + } else if (path.startsWith("content://")) { + contentUri = Uri.parse(path); + } else { + file = new File(path); + contentUri = FileProvider.getUriForFile(mContext, "org.linphone.provider", file); + } + String type = null; + String extension = MimeTypeMap.getFileExtensionFromUrl(contentUri.toString()); + if (extension != null) { + type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + if (type != null) { + intent.setDataAndType(contentUri, type); + } else { + intent.setDataAndType(contentUri, "*/*"); + } + intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); + mContext.startActivity(intent); + } + + private void displayDownloadedFile(ChatMessage message, ChatBubbleViewHolder holder) { + String appData = message.getAppdata(); + if (LinphoneUtils.isExtensionImage(appData)) { + holder.messageImage.setVisibility(View.VISIBLE); + loadBitmap(appData, holder.messageImage); + holder.messageImage.setTag(appData); + } else { + holder.openFileButton.setVisibility(View.VISIBLE); + holder.openFileButton.setTag(appData); + holder.openFileButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openFile((String)v.getTag()); + } + }); + } + } + + /* + * Chat message callbacks + */ + + @Override + public void onFileTransferRecv(ChatMessage message, Content content, Buffer buffer) { + + } + + @Override + public Buffer onFileTransferSend(ChatMessage message, Content content, int offset, int size) { + return null; + } + + @Override + public void onFileTransferProgressIndication(ChatMessage message, Content content, int offset, int total) { + ChatBubbleViewHolder holder = (ChatBubbleViewHolder)message.getUserData(); + if (holder == null) return; + + if (offset == total) { + holder.fileTransferProgressBar.setVisibility(View.GONE); + holder.fileTransferLayout.setVisibility(View.GONE); + displayDownloadedFile(message, holder); + } else { + holder.fileTransferProgressBar.setVisibility(View.VISIBLE); + holder.fileTransferProgressBar.setProgress(offset * 100 / total); + } + } + + @Override + public void onMsgStateChanged(ChatMessage msg, ChatMessage.State state) { + + } + + /* + * Bitmap related classes and methods + */ + private class BitmapWorkerTask extends AsyncTask { private static final int SIZE_SMALL = 500; private final WeakReference imageViewReference; @@ -527,80 +567,4 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene } return null; } - - private void openFile(String path) { - Intent intent = new Intent(Intent.ACTION_VIEW); - File file = null; - Uri contentUri = null; - if (path.startsWith("file://")) { - path = path.substring("file://".length()); - file = new File(path); - contentUri = FileProvider.getUriForFile(mContext, "org.linphone.provider", file); - } else if (path.startsWith("content://")) { - contentUri = Uri.parse(path); - } else { - file = new File(path); - contentUri = FileProvider.getUriForFile(mContext, "org.linphone.provider", file); - } - String type = null; - String extension = MimeTypeMap.getFileExtensionFromUrl(contentUri.toString()); - if (extension != null) { - type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - } - if (type != null) { - intent.setDataAndType(contentUri, type); - } else { - intent.setDataAndType(contentUri, "*/*"); - } - intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); - mContext.startActivity(intent); - } - - private void displayDownloadedFile(ChatMessage message, ChatBubbleViewHolder holder) { - String appData = message.getAppdata(); - if (LinphoneUtils.isExtensionImage(appData)) { - holder.messageImage.setVisibility(View.VISIBLE); - loadBitmap(appData, holder.messageImage); - holder.messageImage.setTag(appData); - } else { - holder.openFileButton.setVisibility(View.VISIBLE); - holder.openFileButton.setTag(appData); - holder.openFileButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openFile((String)v.getTag()); - } - }); - } - } - - @Override - public void onFileTransferRecv(ChatMessage message, Content content, Buffer buffer) { - - } - - @Override - public Buffer onFileTransferSend(ChatMessage message, Content content, int offset, int size) { - return null; - } - - @Override - public void onFileTransferProgressIndication(ChatMessage message, Content content, int offset, int total) { - ChatBubbleViewHolder holder = (ChatBubbleViewHolder)message.getUserData(); - if (holder == null) return; - - if (offset == total) { - holder.fileTransferProgressBar.setVisibility(View.GONE); - holder.fileTransferLayout.setVisibility(View.GONE); - displayDownloadedFile(message, holder); - } else { - holder.fileTransferProgressBar.setVisibility(View.VISIBLE); - holder.fileTransferProgressBar.setProgress(offset * 100 / total); - } - } - - @Override - public void onMsgStateChanged(ChatMessage msg, ChatMessage.State state) { - - } } diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java index 86abc6799..165562bc4 100644 --- a/src/android/org/linphone/chat/GroupChatFragment.java +++ b/src/android/org/linphone/chat/GroupChatFragment.java @@ -60,6 +60,7 @@ import org.linphone.core.Address; import org.linphone.core.Buffer; import org.linphone.core.ChatMessage; import org.linphone.core.ChatMessageListener; +import org.linphone.core.ChatMessageListenerStub; import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoomListener; import org.linphone.core.Content; @@ -464,7 +465,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } private void pickImage() { - List cameraIntents = new ArrayList(); + List cameraIntents = new ArrayList<>(); Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis())+".jpeg")); mImageToUploadUri = Uri.fromFile(file); @@ -530,25 +531,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con private void sendMessage() { String text = mMessageTextToSend.getText().toString(); ChatMessage msg = mChatRoom.createMessage(text); - msg.setListener(new ChatMessageListener() { - @Override - public void onFileTransferRecv(ChatMessage message, Content content, Buffer buffer) { - - } - - @Override - public Buffer onFileTransferSend(ChatMessage message, Content content, int offset, int size) { - return null; - } - - @Override - public void onFileTransferProgressIndication(ChatMessage message, Content content, int offset, int total) { - ChatBubbleViewHolder holder = (ChatBubbleViewHolder) message.getUserData(); - if (holder != null && message.getMessageId().equals(holder.messageId)) { - holder.fileTransferProgressBar.setProgress(offset * 100 / total); - } - } - + msg.setListener(new ChatMessageListenerStub() { @Override public void onMsgStateChanged(ChatMessage message, ChatMessage.State state) { ChatBubbleViewHolder holder = (ChatBubbleViewHolder) message.getUserData(); @@ -584,6 +567,10 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } } + /* + * Chat room callbacks + */ + @Override public void onChatMessageSent(ChatRoom cr, EventLog event) { mMessagesAdapter.addToHistory(event);