From 97a527ab52f58af3f4b788ba856737837df58548 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 28 Feb 2023 10:33:56 +0100 Subject: [PATCH] Allow to warn instead of blocking when there are no media description --- .../mastodon/activities/ComposeActivity.java | 181 ++++++++++-------- app/src/main/res/values/strings.xml | 7 + app/src/main/res/xml/pref_compose.xml | 18 +- .../metadata/android/en/changelogs/482.txt | 9 + 4 files changed, 136 insertions(+), 79 deletions(-) create mode 100644 src/fdroid/fastlane/metadata/android/en/changelogs/482.txt diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java index 4cd5d8649..5a01eabb8 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/ComposeActivity.java @@ -398,6 +398,20 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana MediaHelper.scheduleMessage(ComposeActivity.this, date -> storeDraft(true, date)); } else if (canBeSent(statusDraft) == -1) { Toasty.warning(ComposeActivity.this, getString(R.string.toot_error_no_media_description), Toasty.LENGTH_SHORT).show(); + } else if (canBeSent(statusDraft) == -2) { + Toasty.warning(ComposeActivity.this, getString(R.string.toot_error_no_media_description), Toasty.LENGTH_SHORT).show(); + MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(this); + materialAlertDialogBuilder.setMessage(R.string.toot_error_no_media_description); + materialAlertDialogBuilder.setPositiveButton(R.string.send_anyway, (dialog, id) -> { + MediaHelper.scheduleMessage(ComposeActivity.this, date -> storeDraft(true, date)); + dialog.dismiss(); + + }); + materialAlertDialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> { + dialog.cancel(); + }); + AlertDialog alert = materialAlertDialogBuilder.create(); + alert.show(); } else { Toasty.info(ComposeActivity.this, getString(R.string.toot_error_no_content), Toasty.LENGTH_SHORT).show(); } @@ -831,11 +845,24 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana statusDraft.user_id = account.user_id; } - if (canBeSent(statusDraft) != 1) { + if (canBeSent(statusDraft) != 1 && sendMessage) { Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> { if (canBeSent(statusDraft) == -1) { Toasty.warning(ComposeActivity.this, getString(R.string.toot_error_no_media_description), Toasty.LENGTH_SHORT).show(); + } else if (canBeSent(statusDraft) == -2) { + MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(this); + materialAlertDialogBuilder.setMessage(R.string.toot_error_no_media_description); + materialAlertDialogBuilder.setPositiveButton(R.string.send_anyway, (dialog, id) -> { + sendMessage(true, scheduledDate); + dialog.dismiss(); + + }); + materialAlertDialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> { + dialog.cancel(); + }); + AlertDialog alert = materialAlertDialogBuilder.create(); + alert.show(); } else { Toasty.info(ComposeActivity.this, getString(R.string.toot_error_no_content), Toasty.LENGTH_SHORT).show(); } @@ -845,86 +872,89 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana mainHandler.post(myRunnable); return; } - if (statusDraft.id > 0) { + sendMessage(sendMessage, scheduledDate); + }).start(); + } + + private void sendMessage(boolean sendMessage, String scheduledDate) { + if (statusDraft.id > 0) { + try { + new StatusDraft(ComposeActivity.this).updateStatusDraft(statusDraft); + } catch (DBException e) { + e.printStackTrace(); + } + } else { + try { + statusDraft.id = new StatusDraft(ComposeActivity.this).insertStatusDraft(statusDraft); + } catch (DBException e) { + e.printStackTrace(); + } + } + //Only one single message scheduled + if (sendMessage && scheduledDate != null && statusDraft.statusDraftList.size() > 1) { + //Schedule a thread + SimpleDateFormat sdf = new SimpleDateFormat(Helper.SCHEDULE_DATE_FORMAT, Locale.getDefault()); + Date date; + try { + date = sdf.parse(scheduledDate); + long delayToPass = 0; + if (date != null) { + delayToPass = (date.getTime() - new Date().getTime()); + } + Data inputData = new Data.Builder() + .putString(Helper.ARG_INSTANCE, currentInstance) + .putString(Helper.ARG_TOKEN, BaseMainActivity.currentToken) + .putString(Helper.ARG_USER_ID, BaseMainActivity.currentUserID) + .putLong(Helper.ARG_STATUS_DRAFT_ID, statusDraft.id) + .build(); + + OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(ScheduleThreadWorker.class) + .setInputData(inputData) + .addTag(Helper.WORKER_SCHEDULED_STATUSES) + .setInitialDelay(delayToPass, TimeUnit.MILLISECONDS) + .build(); + WorkManager.getInstance(ComposeActivity.this).enqueue(oneTimeWorkRequest); + statusDraft.workerUuid = oneTimeWorkRequest.getId(); + statusDraft.scheduled_at = date; try { new StatusDraft(ComposeActivity.this).updateStatusDraft(statusDraft); } catch (DBException e) { e.printStackTrace(); } + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> { + Toasty.info(ComposeActivity.this, getString(R.string.toot_scheduled), Toasty.LENGTH_LONG).show(); + finish(); + }; + mainHandler.post(myRunnable); + } catch (ParseException e) { + e.printStackTrace(); + } + + } else if (sendMessage) { + int mediaCount = 0; + for (Status status : statusDraft.statusDraftList) { + mediaCount += status.media_attachments != null ? status.media_attachments.size() : 0; + } + if (mediaCount > 0) { + Data inputData = new Data.Builder() + .putString(Helper.ARG_STATUS_DRAFT_ID, String.valueOf(statusDraft.id)) + .putString(Helper.ARG_INSTANCE, instance) + .putString(Helper.ARG_TOKEN, token) + .putString(Helper.ARG_EDIT_STATUS_ID, editMessageId) + .putString(Helper.ARG_USER_ID, account.user_id) + .putString(Helper.ARG_SCHEDULED_DATE, scheduledDate).build(); + OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(ComposeWorker.class) + .setInputData(inputData) + .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) + .build(); + WorkManager.getInstance(ComposeActivity.this).enqueue(request); + } else { - try { - statusDraft.id = new StatusDraft(ComposeActivity.this).insertStatusDraft(statusDraft); - } catch (DBException e) { - e.printStackTrace(); - } + new ThreadMessageService(ComposeActivity.this, instance, account.user_id, token, statusDraft, scheduledDate, editMessageId); } - //Only one single message scheduled - if (sendMessage && scheduledDate != null && statusDraft.statusDraftList.size() > 1) { - //Schedule a thread - SimpleDateFormat sdf = new SimpleDateFormat(Helper.SCHEDULE_DATE_FORMAT, Locale.getDefault()); - Date date; - try { - date = sdf.parse(scheduledDate); - long delayToPass = 0; - if (date != null) { - delayToPass = (date.getTime() - new Date().getTime()); - } - Data inputData = new Data.Builder() - .putString(Helper.ARG_INSTANCE, currentInstance) - .putString(Helper.ARG_TOKEN, BaseMainActivity.currentToken) - .putString(Helper.ARG_USER_ID, BaseMainActivity.currentUserID) - .putLong(Helper.ARG_STATUS_DRAFT_ID, statusDraft.id) - .build(); - - OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(ScheduleThreadWorker.class) - .setInputData(inputData) - .addTag(Helper.WORKER_SCHEDULED_STATUSES) - .setInitialDelay(delayToPass, TimeUnit.MILLISECONDS) - .build(); - WorkManager.getInstance(ComposeActivity.this).enqueue(oneTimeWorkRequest); - statusDraft.workerUuid = oneTimeWorkRequest.getId(); - statusDraft.scheduled_at = date; - try { - new StatusDraft(ComposeActivity.this).updateStatusDraft(statusDraft); - } catch (DBException e) { - e.printStackTrace(); - } - Handler mainHandler = new Handler(Looper.getMainLooper()); - Runnable myRunnable = () -> { - Toasty.info(ComposeActivity.this, getString(R.string.toot_scheduled), Toasty.LENGTH_LONG).show(); - finish(); - }; - mainHandler.post(myRunnable); - } catch (ParseException e) { - e.printStackTrace(); - } - - } else if (sendMessage) { - int mediaCount = 0; - for (Status status : statusDraft.statusDraftList) { - mediaCount += status.media_attachments != null ? status.media_attachments.size() : 0; - } - if (mediaCount > 0) { - Data inputData = new Data.Builder() - .putString(Helper.ARG_STATUS_DRAFT_ID, String.valueOf(statusDraft.id)) - .putString(Helper.ARG_INSTANCE, instance) - .putString(Helper.ARG_TOKEN, token) - .putString(Helper.ARG_EDIT_STATUS_ID, editMessageId) - .putString(Helper.ARG_USER_ID, account.user_id) - .putString(Helper.ARG_SCHEDULED_DATE, scheduledDate).build(); - OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(ComposeWorker.class) - .setInputData(inputData) - .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) - .build(); - WorkManager.getInstance(ComposeActivity.this).enqueue(request); - - } else { - new ThreadMessageService(ComposeActivity.this, instance, account.user_id, token, statusDraft, scheduledDate, editMessageId); - } - finish(); - } - - }).start(); + finish(); + } } @@ -934,12 +964,13 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana } SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(this); boolean checkAlt = sharedpreferences.getBoolean(getString(R.string.SET_MANDATORY_ALT_TEXT), false); + boolean warnOnly = sharedpreferences.getBoolean(getString(R.string.SET_MANDATORY_ALT_TEXT_WARN), false); if (checkAlt) { for (Status status : statusDraft.statusDraftList) { if (status.media_attachments != null && status.media_attachments.size() > 0) { for (Attachment attachment : status.media_attachments) { if (attachment.description == null || attachment.description.trim().isEmpty()) { - return -1; + return warnOnly ? -2 : -1; } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3bc0e5cea..33c2dfcea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -876,6 +876,8 @@ SET_FEATURED_TAGS SET_FEATURED_TAG_ACTION SET_MANDATORY_ALT_TEXT + SET_MANDATORY_ALT_TEXT_WARN + SET_RETRIEVE_METADATA_IF_URL_FROM_EXTERAL SET_TRANSLATE_VALUES_RESET @@ -1916,4 +1918,9 @@ Truncate links Max chars in links + + + Warn only + If there are missing media a dialog will be displayed with the ability to send the message without media description + Send anyway \ No newline at end of file diff --git a/app/src/main/res/xml/pref_compose.xml b/app/src/main/res/xml/pref_compose.xml index be1c04f54..6cb07491e 100644 --- a/app/src/main/res/xml/pref_compose.xml +++ b/app/src/main/res/xml/pref_compose.xml @@ -61,6 +61,11 @@ app:summary="@string/set_watermark_indication" app:title="@string/set_watermark" /> + + - + +