From ff5088eaa61766338f902098fe66956a8c46e05c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 1 Nov 2017 16:50:36 +0100 Subject: [PATCH] Improved incoming file transfer layout when file isn't an image --- res/layout/chat_bubble.xml | 17 +--- res/values/strings.xml | 1 + .../linphone/chat/ChatBubbleViewHolder.java | 6 +- .../org/linphone/chat/ChatEventsAdapter.java | 97 ++++++++++++------- .../org/linphone/chat/ChatFragment.java | 22 ++--- 5 files changed, 76 insertions(+), 67 deletions(-) diff --git a/res/layout/chat_bubble.xml b/res/layout/chat_bubble.xml index 7f523dc9f..efada4367 100644 --- a/res/layout/chat_bubble.xml +++ b/res/layout/chat_bubble.xml @@ -141,30 +141,21 @@ android:layout_marginBottom="12dp"/> + android:text="@string/open"/> - - Retry Cancel Accept + Open Continue About Deny diff --git a/src/android/org/linphone/chat/ChatBubbleViewHolder.java b/src/android/org/linphone/chat/ChatBubbleViewHolder.java index 77b56c37a..bc8aecdd8 100644 --- a/src/android/org/linphone/chat/ChatBubbleViewHolder.java +++ b/src/android/org/linphone/chat/ChatBubbleViewHolder.java @@ -55,8 +55,7 @@ public class ChatBubbleViewHolder { public RelativeLayout fileTransferLayout; public ProgressBar fileTransferProgressBar; public Button fileTransferAction; - public TextView fileExtensionLabel; - public TextView fileNameLabel; + public TextView openFileButton; public CheckBox delete; @@ -83,8 +82,7 @@ public class ChatBubbleViewHolder { fileTransferLayout = view.findViewById(R.id.file_transfer_layout); fileTransferProgressBar = view.findViewById(R.id.progress_bar); fileTransferAction = view.findViewById(R.id.file_transfer_action); - fileExtensionLabel = view.findViewById(R.id.file_extension); - fileNameLabel = view.findViewById(R.id.file_name); + openFileButton = view.findViewById(R.id.open_file); delete = view.findViewById(R.id.delete_message); } diff --git a/src/android/org/linphone/chat/ChatEventsAdapter.java b/src/android/org/linphone/chat/ChatEventsAdapter.java index 0540de03e..867260093 100644 --- a/src/android/org/linphone/chat/ChatEventsAdapter.java +++ b/src/android/org/linphone/chat/ChatEventsAdapter.java @@ -136,11 +136,10 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene holder.delete.setVisibility(View.GONE); holder.messageText.setVisibility(View.GONE); holder.messageImage.setVisibility(View.GONE); - holder.fileExtensionLabel.setVisibility(View.GONE); - holder.fileNameLabel.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferProgressBar.setProgress(0); holder.fileTransferAction.setEnabled(true); + holder.openFileButton.setVisibility(View.GONE); holder.messageStatus.setVisibility(View.INVISIBLE); holder.messageSendingInProgress.setVisibility(View.GONE); holder.imdmLayout.setVisibility(View.INVISIBLE); @@ -252,11 +251,16 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene String appData = message.getAppdata(); if (externalBodyUrl != null) { // Incoming file transfer if (appData != null) { // Download already done, just display the result - holder.messageImage.setVisibility(View.VISIBLE); - loadBitmap(appData, holder.messageImage); - holder.messageImage.setTag(appData); + holder.messageText.setVisibility(View.VISIBLE); + holder.messageText.setText(fileTransferContent.getName()); + + displayDownloadedFile(message, holder); } else { // Attachment not yet downloaded + holder.messageText.setVisibility(View.VISIBLE); + holder.messageText.setText(fileTransferContent.getName()); + holder.fileTransferLayout.setVisibility(View.VISIBLE); + holder.fileTransferProgressBar.setVisibility(View.GONE); holder.fileTransferAction.setText(mContext.getString(R.string.accept)); holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { @Override @@ -278,9 +282,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene } } else if (fileTransferContent != null) { // Outgoing file transfer if (appData != null) { - holder.messageImage.setVisibility(View.VISIBLE); - loadBitmap(appData, holder.messageImage); - holder.messageImage.setTag(appData); + displayDownloadedFile(message, holder); if (message.getState() == ChatMessage.State.InProgress) { holder.messageSendingInProgress.setVisibility(View.GONE); @@ -476,32 +478,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(Intent.ACTION_VIEW); - File file = null; - Uri contentUri = null; - String imageUri = (String)v.getTag(); - if (imageUri.startsWith("file://")) { - imageUri = imageUri.substring("file://".length()); - file = new File(imageUri); - contentUri = FileProvider.getUriForFile(mContext, "org.linphone.provider", file); - } else if (imageUri.startsWith("content://")) { - contentUri = Uri.parse(imageUri); - } else { - file = new File(imageUri); - 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); + openFile((String)v.getTag()); } }); } @@ -551,6 +528,52 @@ 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) { @@ -567,11 +590,11 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene if (holder == null) return; if (offset == total) { + holder.fileTransferProgressBar.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE); - holder.messageImage.setVisibility(View.VISIBLE); - loadBitmap(message.getAppdata(), holder.messageImage); - holder.messageImage.setTag(message.getAppdata()); + displayDownloadedFile(message, holder); } else { + holder.fileTransferProgressBar.setVisibility(View.VISIBLE); holder.fileTransferProgressBar.setProgress(offset * 100 / total); } } diff --git a/src/android/org/linphone/chat/ChatFragment.java b/src/android/org/linphone/chat/ChatFragment.java index 21d7ad0a6..15e31bd70 100644 --- a/src/android/org/linphone/chat/ChatFragment.java +++ b/src/android/org/linphone/chat/ChatFragment.java @@ -52,7 +52,6 @@ import android.support.v4.content.FileProvider; import android.text.Editable; import android.text.Spanned; import android.text.TextWatcher; -import android.text.method.LinkMovementMethod; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; @@ -104,13 +103,10 @@ import java.io.FileInputStream; 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; import java.util.List; import java.util.Locale; -import java.util.regex.Pattern; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static org.linphone.fragments.FragmentsAvailable.CHAT; @@ -1365,8 +1361,8 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa holder.delete.setVisibility(View.GONE); holder.messageText.setVisibility(View.GONE); holder.messageImage.setVisibility(View.GONE); - holder.fileExtensionLabel.setVisibility(View.GONE); - holder.fileNameLabel.setVisibility(View.GONE); + //holder.fileExtensionLabel.setVisibility(View.GONE); + holder.openFileButton.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferProgressBar.setProgress(0); holder.fileTransferAction.setEnabled(true); @@ -1553,8 +1549,8 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa if(message.getAppdata() != null && holder.fileTransferLayout.getVisibility() != View.VISIBLE){ if(LinphoneUtils.isExtensionImage(message.getAppdata())){ - holder.fileExtensionLabel.setVisibility(View.GONE); - holder.fileNameLabel.setVisibility(View.GONE); + //holder.fileExtensionLabel.setVisibility(View.GONE); + holder.openFileButton.setVisibility(View.GONE); }else { String extension = (LinphoneUtils.getExtensionFromFileName(message.getAppdata())); if(extension != null) @@ -1565,10 +1561,10 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa if (extension.length() > 4) extension = extension.substring(0, 3); - holder.fileExtensionLabel.setText(extension); + /*holder.fileExtensionLabel.setText(extension); holder.fileExtensionLabel.setVisibility(View.VISIBLE); - holder.fileNameLabel.setText(LinphoneUtils.getNameFromFilePath(message.getAppdata())); - holder.fileNameLabel.setVisibility(View.VISIBLE); + holder.openFileButton.setText(LinphoneUtils.getNameFromFilePath(message.getAppdata())); + holder.openFileButton.setVisibility(View.VISIBLE); holder.fileExtensionLabel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -1600,7 +1596,7 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa if (type != null) { intent.setDataAndType(contentUri, type); } else { - intent.setDataAndType(contentUri, "*/*"); + intent.setDataAndType(contentUri, ""); } intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(intent); @@ -1608,7 +1604,7 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa LinphoneActivity.instance().displayCustomToast(getString(R.string.error_opening_file), Toast.LENGTH_LONG); } } - }); + });*/ } }