|
|
|
|
@@ -1,5 +1,7 @@
|
|
|
|
|
package org.joinmastodon.android.fragments;
|
|
|
|
|
|
|
|
|
|
import static android.os.ext.SdkExtensions.getExtensionVersion;
|
|
|
|
|
|
|
|
|
|
import android.animation.ObjectAnimator;
|
|
|
|
|
import android.annotation.SuppressLint;
|
|
|
|
|
import android.app.Activity;
|
|
|
|
|
@@ -20,6 +22,7 @@ import android.net.Uri;
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.os.Parcelable;
|
|
|
|
|
import android.provider.MediaStore;
|
|
|
|
|
import android.provider.OpenableColumns;
|
|
|
|
|
import android.text.Editable;
|
|
|
|
|
import android.text.InputFilter;
|
|
|
|
|
@@ -410,6 +413,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|
|
|
|
|
|
|
|
|
mainEditText.setSelectionListener(this);
|
|
|
|
|
mainEditText.addTextChangedListener(new TextWatcher(){
|
|
|
|
|
private int lastChangeStart, lastChangeCount;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void beforeTextChanged(CharSequence s, int start, int count, int after){
|
|
|
|
|
|
|
|
|
|
@@ -419,6 +424,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|
|
|
|
public void onTextChanged(CharSequence s, int start, int before, int count){
|
|
|
|
|
if(s.length()==0)
|
|
|
|
|
return;
|
|
|
|
|
lastChangeStart=start;
|
|
|
|
|
lastChangeCount=count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void afterTextChanged(Editable s){
|
|
|
|
|
if(s.length()==0)
|
|
|
|
|
return;
|
|
|
|
|
int start=lastChangeStart;
|
|
|
|
|
int count=lastChangeCount;
|
|
|
|
|
// offset one char back to catch an already typed '@' or '#' or ':'
|
|
|
|
|
int realStart=start;
|
|
|
|
|
start=Math.max(0, start-1);
|
|
|
|
|
@@ -464,10 +479,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|
|
|
|
editable.removeSpan(span);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void afterTextChanged(Editable s){
|
|
|
|
|
updateCharCounter();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
@@ -514,7 +526,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|
|
|
|
DraftMediaAttachment da=new DraftMediaAttachment();
|
|
|
|
|
da.serverAttachment=att;
|
|
|
|
|
da.description=att.description;
|
|
|
|
|
da.uri=Uri.parse(att.previewUrl);
|
|
|
|
|
da.uri=att.previewUrl!=null ? Uri.parse(att.previewUrl) : null;
|
|
|
|
|
da.state=AttachmentUploadState.DONE;
|
|
|
|
|
attachmentsView.addView(createMediaAttachmentView(da));
|
|
|
|
|
attachments.add(da);
|
|
|
|
|
@@ -782,14 +794,50 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|
|
|
|
.show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check to see if Android platform photopicker is available on the device\
|
|
|
|
|
* @return whether the device supports photopicker intents.
|
|
|
|
|
*/
|
|
|
|
|
private boolean isPhotoPickerAvailable() {
|
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
|
|
|
return true;
|
|
|
|
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
|
|
|
return getExtensionVersion(Build.VERSION_CODES.R) >= 2;
|
|
|
|
|
} else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Builds the correct intent for the device version to select media.
|
|
|
|
|
*
|
|
|
|
|
* <p>For Device version > T or R_SDK_v2, use the android platform photopicker via
|
|
|
|
|
* {@link MediaStore#ACTION_PICK_IMAGES}
|
|
|
|
|
*
|
|
|
|
|
* <p>For earlier versions use the built in docs ui via {@link Intent#ACTION_GET_CONTENT}
|
|
|
|
|
*/
|
|
|
|
|
private void openFilePicker(){
|
|
|
|
|
Intent intent=new Intent(Intent.ACTION_GET_CONTENT);
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
|
|
|
|
intent.setType("*/*");
|
|
|
|
|
if(instance.configuration!=null && instance.configuration.mediaAttachments!=null && instance.configuration.mediaAttachments.supportedMimeTypes!=null && !instance.configuration.mediaAttachments.supportedMimeTypes.isEmpty()){
|
|
|
|
|
intent.putExtra(Intent.EXTRA_MIME_TYPES, instance.configuration.mediaAttachments.supportedMimeTypes.toArray(new String[0]));
|
|
|
|
|
}else{
|
|
|
|
|
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
|
|
|
|
|
Intent intent;
|
|
|
|
|
boolean usePhotoPicker = isPhotoPickerAvailable();
|
|
|
|
|
if (usePhotoPicker) {
|
|
|
|
|
intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
|
|
|
|
|
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, MediaStore.getPickImagesMaxLimit());
|
|
|
|
|
} else {
|
|
|
|
|
intent = new Intent(Intent.ACTION_GET_CONTENT);
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
|
|
|
|
intent.setType("*/*");
|
|
|
|
|
}
|
|
|
|
|
if (!usePhotoPicker && instance.configuration != null &&
|
|
|
|
|
instance.configuration.mediaAttachments != null &&
|
|
|
|
|
instance.configuration.mediaAttachments.supportedMimeTypes != null &&
|
|
|
|
|
!instance.configuration.mediaAttachments.supportedMimeTypes.isEmpty()) {
|
|
|
|
|
intent.putExtra(Intent.EXTRA_MIME_TYPES,
|
|
|
|
|
instance.configuration.mediaAttachments.supportedMimeTypes.toArray(
|
|
|
|
|
new String[0]));
|
|
|
|
|
} else {
|
|
|
|
|
if (!usePhotoPicker) {
|
|
|
|
|
// If photo picker is being used these are the default mimetypes.
|
|
|
|
|
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
|
|
|
|
|
startActivityForResult(intent, MEDIA_RESULT);
|
|
|
|
|
@@ -871,7 +919,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|
|
|
|
View thumb=getActivity().getLayoutInflater().inflate(R.layout.compose_media_thumb, attachmentsView, false);
|
|
|
|
|
ImageView img=thumb.findViewById(R.id.thumb);
|
|
|
|
|
if(draft.serverAttachment!=null){
|
|
|
|
|
ViewImageLoader.load(img, draft.serverAttachment.blurhashPlaceholder, new UrlImageLoaderRequest(draft.serverAttachment.previewUrl, V.dp(250), V.dp(250)));
|
|
|
|
|
if(draft.serverAttachment.previewUrl!=null)
|
|
|
|
|
ViewImageLoader.load(img, draft.serverAttachment.blurhashPlaceholder, new UrlImageLoaderRequest(draft.serverAttachment.previewUrl, V.dp(250), V.dp(250)));
|
|
|
|
|
}else{
|
|
|
|
|
if(draft.mimeType.startsWith("image/")){
|
|
|
|
|
ViewImageLoader.load(img, null, new UrlImageLoaderRequest(draft.uri, V.dp(250), V.dp(250)));
|
|
|
|
|
|