Improved incoming file transfer layout when file isn't an image

This commit is contained in:
Sylvain Berfini 2017-11-01 16:50:36 +01:00
parent aa0b9bd186
commit ff5088eaa6
5 changed files with 76 additions and 67 deletions

View file

@ -141,30 +141,21 @@
android:layout_marginBottom="12dp"/> android:layout_marginBottom="12dp"/>
<TextView <TextView
android:id="@+id/file_extension" android:id="@+id/open_file"
android:gravity="center" android:gravity="center"
android:textAlignment="center" android:textAlignment="center"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:background="@color/colorA"
android:padding="5dp"
android:maxLines="1" android:maxLines="1"
style="@style/font25" style="@style/font25"
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="FILE"/> android:text="@string/open"/>
</RelativeLayout> </RelativeLayout>
<TextView
android:id="@+id/file_name"
android:layout_below="@+id/relativeLayoutCentered"
android:gravity="center_horizontal"
android:textAlignment="center"
android:maxLines="1"
style="@style/font24"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text=""/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout

View file

@ -31,6 +31,7 @@
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
<string name="accept">Accept</string> <string name="accept">Accept</string>
<string name="open">Open</string>
<string name="continue_text">Continue</string> <string name="continue_text">Continue</string>
<string name="about">About</string> <string name="about">About</string>
<string name="deny">Deny</string> <string name="deny">Deny</string>

View file

@ -55,8 +55,7 @@ public class ChatBubbleViewHolder {
public RelativeLayout fileTransferLayout; public RelativeLayout fileTransferLayout;
public ProgressBar fileTransferProgressBar; public ProgressBar fileTransferProgressBar;
public Button fileTransferAction; public Button fileTransferAction;
public TextView fileExtensionLabel; public TextView openFileButton;
public TextView fileNameLabel;
public CheckBox delete; public CheckBox delete;
@ -83,8 +82,7 @@ public class ChatBubbleViewHolder {
fileTransferLayout = view.findViewById(R.id.file_transfer_layout); fileTransferLayout = view.findViewById(R.id.file_transfer_layout);
fileTransferProgressBar = view.findViewById(R.id.progress_bar); fileTransferProgressBar = view.findViewById(R.id.progress_bar);
fileTransferAction = view.findViewById(R.id.file_transfer_action); fileTransferAction = view.findViewById(R.id.file_transfer_action);
fileExtensionLabel = view.findViewById(R.id.file_extension); openFileButton = view.findViewById(R.id.open_file);
fileNameLabel = view.findViewById(R.id.file_name);
delete = view.findViewById(R.id.delete_message); delete = view.findViewById(R.id.delete_message);
} }

View file

@ -136,11 +136,10 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
holder.delete.setVisibility(View.GONE); holder.delete.setVisibility(View.GONE);
holder.messageText.setVisibility(View.GONE); holder.messageText.setVisibility(View.GONE);
holder.messageImage.setVisibility(View.GONE); holder.messageImage.setVisibility(View.GONE);
holder.fileExtensionLabel.setVisibility(View.GONE);
holder.fileNameLabel.setVisibility(View.GONE);
holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE);
holder.fileTransferProgressBar.setProgress(0); holder.fileTransferProgressBar.setProgress(0);
holder.fileTransferAction.setEnabled(true); holder.fileTransferAction.setEnabled(true);
holder.openFileButton.setVisibility(View.GONE);
holder.messageStatus.setVisibility(View.INVISIBLE); holder.messageStatus.setVisibility(View.INVISIBLE);
holder.messageSendingInProgress.setVisibility(View.GONE); holder.messageSendingInProgress.setVisibility(View.GONE);
holder.imdmLayout.setVisibility(View.INVISIBLE); holder.imdmLayout.setVisibility(View.INVISIBLE);
@ -252,11 +251,16 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
String appData = message.getAppdata(); String appData = message.getAppdata();
if (externalBodyUrl != null) { // Incoming file transfer if (externalBodyUrl != null) { // Incoming file transfer
if (appData != null) { // Download already done, just display the result if (appData != null) { // Download already done, just display the result
holder.messageImage.setVisibility(View.VISIBLE); holder.messageText.setVisibility(View.VISIBLE);
loadBitmap(appData, holder.messageImage); holder.messageText.setText(fileTransferContent.getName());
holder.messageImage.setTag(appData);
displayDownloadedFile(message, holder);
} else { // Attachment not yet downloaded } else { // Attachment not yet downloaded
holder.messageText.setVisibility(View.VISIBLE);
holder.messageText.setText(fileTransferContent.getName());
holder.fileTransferLayout.setVisibility(View.VISIBLE); holder.fileTransferLayout.setVisibility(View.VISIBLE);
holder.fileTransferProgressBar.setVisibility(View.GONE);
holder.fileTransferAction.setText(mContext.getString(R.string.accept)); holder.fileTransferAction.setText(mContext.getString(R.string.accept));
holder.fileTransferAction.setOnClickListener(new View.OnClickListener() { holder.fileTransferAction.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -278,9 +282,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
} }
} else if (fileTransferContent != null) { // Outgoing file transfer } else if (fileTransferContent != null) { // Outgoing file transfer
if (appData != null) { if (appData != null) {
holder.messageImage.setVisibility(View.VISIBLE); displayDownloadedFile(message, holder);
loadBitmap(appData, holder.messageImage);
holder.messageImage.setTag(appData);
if (message.getState() == ChatMessage.State.InProgress) { if (message.getState() == ChatMessage.State.InProgress) {
holder.messageSendingInProgress.setVisibility(View.GONE); holder.messageSendingInProgress.setVisibility(View.GONE);
@ -476,32 +478,7 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
imageView.setOnClickListener(new View.OnClickListener() { imageView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW); openFile((String)v.getTag());
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);
} }
}); });
} }
@ -551,6 +528,52 @@ public class ChatEventsAdapter extends BaseAdapter implements ChatMessageListene
return null; 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 @Override
public void onFileTransferRecv(ChatMessage message, Content content, Buffer buffer) { 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 (holder == null) return;
if (offset == total) { if (offset == total) {
holder.fileTransferProgressBar.setVisibility(View.GONE);
holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE);
holder.messageImage.setVisibility(View.VISIBLE); displayDownloadedFile(message, holder);
loadBitmap(message.getAppdata(), holder.messageImage);
holder.messageImage.setTag(message.getAppdata());
} else { } else {
holder.fileTransferProgressBar.setVisibility(View.VISIBLE);
holder.fileTransferProgressBar.setProgress(offset * 100 / total); holder.fileTransferProgressBar.setProgress(offset * 100 / total);
} }
} }

View file

@ -52,7 +52,6 @@ import android.support.v4.content.FileProvider;
import android.text.Editable; import android.text.Editable;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -104,13 +103,10 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Pattern;
import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
import static org.linphone.fragments.FragmentsAvailable.CHAT; 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.delete.setVisibility(View.GONE);
holder.messageText.setVisibility(View.GONE); holder.messageText.setVisibility(View.GONE);
holder.messageImage.setVisibility(View.GONE); holder.messageImage.setVisibility(View.GONE);
holder.fileExtensionLabel.setVisibility(View.GONE); //holder.fileExtensionLabel.setVisibility(View.GONE);
holder.fileNameLabel.setVisibility(View.GONE); holder.openFileButton.setVisibility(View.GONE);
holder.fileTransferLayout.setVisibility(View.GONE); holder.fileTransferLayout.setVisibility(View.GONE);
holder.fileTransferProgressBar.setProgress(0); holder.fileTransferProgressBar.setProgress(0);
holder.fileTransferAction.setEnabled(true); 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(message.getAppdata() != null && holder.fileTransferLayout.getVisibility() != View.VISIBLE){
if(LinphoneUtils.isExtensionImage(message.getAppdata())){ if(LinphoneUtils.isExtensionImage(message.getAppdata())){
holder.fileExtensionLabel.setVisibility(View.GONE); //holder.fileExtensionLabel.setVisibility(View.GONE);
holder.fileNameLabel.setVisibility(View.GONE); holder.openFileButton.setVisibility(View.GONE);
}else { }else {
String extension = (LinphoneUtils.getExtensionFromFileName(message.getAppdata())); String extension = (LinphoneUtils.getExtensionFromFileName(message.getAppdata()));
if(extension != null) if(extension != null)
@ -1565,10 +1561,10 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa
if (extension.length() > 4) if (extension.length() > 4)
extension = extension.substring(0, 3); extension = extension.substring(0, 3);
holder.fileExtensionLabel.setText(extension); /*holder.fileExtensionLabel.setText(extension);
holder.fileExtensionLabel.setVisibility(View.VISIBLE); holder.fileExtensionLabel.setVisibility(View.VISIBLE);
holder.fileNameLabel.setText(LinphoneUtils.getNameFromFilePath(message.getAppdata())); holder.openFileButton.setText(LinphoneUtils.getNameFromFilePath(message.getAppdata()));
holder.fileNameLabel.setVisibility(View.VISIBLE); holder.openFileButton.setVisibility(View.VISIBLE);
holder.fileExtensionLabel.setOnClickListener(new OnClickListener() { holder.fileExtensionLabel.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -1600,7 +1596,7 @@ public class ChatFragment extends Fragment implements OnClickListener, ChatMessa
if (type != null) { if (type != null) {
intent.setDataAndType(contentUri, type); intent.setDataAndType(contentUri, type);
} else { } else {
intent.setDataAndType(contentUri, "*/*"); intent.setDataAndType(contentUri, "");
} }
intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent); 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); LinphoneActivity.instance().displayCustomToast(getString(R.string.error_opening_file), Toast.LENGTH_LONG);
} }
} }
}); });*/
} }
} }