wait with presence selection until attachment commit

This commit is contained in:
Daniel Gultsch 2019-04-27 14:41:43 +02:00
parent b2ea91909b
commit bcab77a044
2 changed files with 63 additions and 58 deletions

View File

@ -877,7 +877,10 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
mediaPreviewAdapter.notifyDataSetChanged(); mediaPreviewAdapter.notifyDataSetChanged();
toggleInputMethod(); toggleInputMethod();
}; };
if (conversation == null || conversation.getMode() == Conversation.MODE_MULTI || FileBackend.allFilesUnderSize(getActivity(), attachments, getMaxHttpUploadSize(conversation))) { if (conversation == null
|| conversation.getMode() == Conversation.MODE_MULTI
|| Attachment.canBeSendInband(attachments)
|| (conversation.getAccount().httpUploadAvailable() && FileBackend.allFilesUnderSize(getActivity(), attachments, getMaxHttpUploadSize(conversation)))) {
callback.onPresenceSelected(); callback.onPresenceSelected();
} else { } else {
activity.selectPresence(conversation, callback); activity.selectPresence(conversation, callback);
@ -1329,7 +1332,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
@Override @Override
public void success(Contact contact) { public void success(Contact contact) {
selectPresenceToAttachFile(attachmentChoice); invokeAttachFileIntent(attachmentChoice);
} }
@Override @Override
@ -1343,19 +1346,19 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0); warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
warning.show(); warning.show();
} }
selectPresenceToAttachFile(attachmentChoice); invokeAttachFileIntent(attachmentChoice);
} else { } else {
showNoPGPKeyDialog(false, (dialog, which) -> { showNoPGPKeyDialog(false, (dialog, which) -> {
conversation.setNextEncryption(Message.ENCRYPTION_NONE); conversation.setNextEncryption(Message.ENCRYPTION_NONE);
activity.xmppConnectionService.updateConversation(conversation); activity.xmppConnectionService.updateConversation(conversation);
selectPresenceToAttachFile(attachmentChoice); invokeAttachFileIntent(attachmentChoice);
}); });
} }
} else { } else {
activity.showInstallPgpDialog(); activity.showInstallPgpDialog();
} }
} else { } else {
selectPresenceToAttachFile(attachmentChoice); invokeAttachFileIntent(attachmentChoice);
} }
} }
@ -1509,61 +1512,54 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
getActivity().invalidateOptionsMenu(); getActivity().invalidateOptionsMenu();
} }
protected void selectPresenceToAttachFile(final int attachmentChoice) {
final Account account = conversation.getAccount(); protected void invokeAttachFileIntent(final int attachmentChoice) {
final PresenceSelector.OnPresenceSelected callback = () -> { Intent intent = new Intent();
Intent intent = new Intent(); boolean chooser = false;
boolean chooser = false; switch (attachmentChoice) {
switch (attachmentChoice) { case ATTACHMENT_CHOICE_CHOOSE_IMAGE:
case ATTACHMENT_CHOICE_CHOOSE_IMAGE: intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setAction(Intent.ACTION_GET_CONTENT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.setType("image/*");
chooser = true;
break;
case ATTACHMENT_CHOICE_RECORD_VIDEO:
intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
break;
case ATTACHMENT_CHOICE_TAKE_PHOTO:
final Uri uri = activity.xmppConnectionService.getFileBackend().getTakePhotoUri();
pendingTakePhotoUri.push(uri);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
break;
case ATTACHMENT_CHOICE_CHOOSE_FILE:
chooser = true;
intent.setType("*/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setAction(Intent.ACTION_GET_CONTENT);
break;
case ATTACHMENT_CHOICE_RECORD_VOICE:
intent = new Intent(getActivity(), RecordingActivity.class);
break;
case ATTACHMENT_CHOICE_LOCATION:
intent = GeoHelper.getFetchIntent(activity);
break;
}
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
if (chooser) {
startActivityForResult(
Intent.createChooser(intent, getString(R.string.perform_action_with)),
attachmentChoice);
} else {
startActivityForResult(intent, attachmentChoice);
} }
intent.setType("image/*");
chooser = true;
break;
case ATTACHMENT_CHOICE_RECORD_VIDEO:
intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
break;
case ATTACHMENT_CHOICE_TAKE_PHOTO:
final Uri uri = activity.xmppConnectionService.getFileBackend().getTakePhotoUri();
pendingTakePhotoUri.push(uri);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
break;
case ATTACHMENT_CHOICE_CHOOSE_FILE:
chooser = true;
intent.setType("*/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setAction(Intent.ACTION_GET_CONTENT);
break;
case ATTACHMENT_CHOICE_RECORD_VOICE:
intent = new Intent(getActivity(), RecordingActivity.class);
break;
case ATTACHMENT_CHOICE_LOCATION:
intent = GeoHelper.getFetchIntent(activity);
break;
}
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
if (chooser) {
startActivityForResult(
Intent.createChooser(intent, getString(R.string.perform_action_with)),
attachmentChoice);
} else {
startActivityForResult(intent, attachmentChoice);
} }
};
if (account.httpUploadAvailable() || attachmentChoice == ATTACHMENT_CHOICE_LOCATION) {
callback.onPresenceSelected();
} else {
activity.selectPresence(conversation, callback);
} }
} }

View File

@ -111,6 +111,15 @@ public class Attachment implements Parcelable {
this.uuid = UUID.randomUUID(); this.uuid = UUID.randomUUID();
} }
public static boolean canBeSendInband(final List<Attachment> attachments) {
for(Attachment attachment : attachments) {
if (attachment.type != Type.LOCATION) {
return false;
}
}
return true;
}
public static List<Attachment> of(final Context context, Uri uri, Type type) { public static List<Attachment> of(final Context context, Uri uri, Type type) {
final String mime = type == Type.LOCATION ?null :MimeUtils.guessMimeTypeFromUri(context, uri); final String mime = type == Type.LOCATION ?null :MimeUtils.guessMimeTypeFromUri(context, uri);
return Collections.singletonList(new Attachment(uri, type, mime)); return Collections.singletonList(new Attachment(uri, type, mime));