diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java index d4d2b755..196e7578 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java @@ -586,7 +586,7 @@ public class Mastodon implements Connection { PollUpdate poll = update.getPoll(); for (String option : poll.getOptions()) params.add("poll[options][]=" + StringTools.encode(option)); - params.add("poll[expires_in]=" + poll.getValidity()); + params.add("poll[expires_in]=" + poll.getDuration()); params.add("poll[multiple]=" + poll.multipleChoiceEnabled()); params.add("poll[hide_totals]=" + poll.hideTotalVotes()); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java index addd9f86..14de5346 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java @@ -145,9 +145,9 @@ public class MastodonPoll implements Poll { /** * @param json mastodon poll json format */ - private MastodonOption(JSONObject json) throws JSONException { - voteCount = json.getInt("votes_count"); - title = json.getString("title"); + private MastodonOption(JSONObject json) { + voteCount = json.optInt("votes_count", 0); + title = json.optString("title", "-"); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/helper/PollUpdate.java b/app/src/main/java/org/nuclearfog/twidda/backend/helper/PollUpdate.java index d39fa0f8..1764d32c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/helper/PollUpdate.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/helper/PollUpdate.java @@ -13,7 +13,7 @@ import java.util.List; */ public class PollUpdate { - private int validity; + private int duration; private boolean multipleChoice; private boolean hideTotals; private List options; @@ -28,8 +28,8 @@ public class PollUpdate { * * @return time until the poll is finnished */ - public int getValidity() { - return validity; + public int getDuration() { + return duration; } /** @@ -49,14 +49,37 @@ public class PollUpdate { /** * @return an array of vote options */ - public String[] getOptions() { - return options.toArray(new String[0]); + public List getOptions() { + return options; + } + + /** + * @param duration duration in seconds + */ + public void setDuration(int duration) { + this.duration = duration; + } + + + public void hideVotes(boolean hideTotals) { + this.hideTotals = hideTotals; + } + + + public void setMultipleChoice(boolean multipleChoice) { + this.multipleChoice = multipleChoice; + } + + + public void setOptions(List options) { + this.options.clear(); + this.options.addAll(options); } @NonNull @Override public String toString() { - return "valid=" + validity + " multiple=" + multipleChoice + "options=" + options.size(); + return "valid=" + duration + " multiple=" + multipleChoice + "options=" + options.size(); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/helper/StatusUpdate.java b/app/src/main/java/org/nuclearfog/twidda/backend/helper/StatusUpdate.java index 4ac5435e..431c6219 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/helper/StatusUpdate.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/helper/StatusUpdate.java @@ -162,8 +162,11 @@ public class StatusUpdate { * * @param poll poll information */ - public void addPoll(@NonNull PollUpdate poll) { - if (attachment == EMPTY) { + public void addPoll(@Nullable PollUpdate poll) { + if (poll == null) { + this.poll = null; + attachment = EMPTY; + } else if (attachment == EMPTY) { this.poll = poll; attachment = POLL; attachmentLimitReached = true; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java index f9200d41..b532c53d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusEditor.java @@ -25,6 +25,7 @@ import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.async.AsyncExecutor.AsyncCallback; import org.nuclearfog.twidda.backend.async.StatusUpdater; import org.nuclearfog.twidda.backend.async.StatusUpdater.StatusUpdateResult; +import org.nuclearfog.twidda.backend.helper.PollUpdate; import org.nuclearfog.twidda.backend.helper.StatusUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.backend.utils.ErrorHandler; @@ -33,6 +34,8 @@ import org.nuclearfog.twidda.ui.adapter.IconAdapter; import org.nuclearfog.twidda.ui.adapter.IconAdapter.OnMediaClickListener; import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog; import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog.OnConfirmListener; +import org.nuclearfog.twidda.ui.dialogs.PollDialog; +import org.nuclearfog.twidda.ui.dialogs.PollDialog.PollUpdateCallback; import org.nuclearfog.twidda.ui.dialogs.ProgressDialog; import org.nuclearfog.twidda.ui.dialogs.ProgressDialog.OnProgressStopListener; @@ -42,7 +45,7 @@ import org.nuclearfog.twidda.ui.dialogs.ProgressDialog.OnProgressStopListener; * @author nuclearfog */ public class StatusEditor extends MediaActivity implements OnClickListener, OnProgressStopListener, OnConfirmListener, - OnMediaClickListener, AsyncCallback, TextWatcher { + OnMediaClickListener, AsyncCallback, TextWatcher, PollUpdateCallback { /** * key to add a statusd ID to reply @@ -64,7 +67,9 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr private ConfirmDialog confirmDialog; private ProgressDialog loadingCircle; + private PollDialog pollDialog; private IconAdapter adapter; + private StatusUpdate statusUpdate = new StatusUpdate(); @@ -82,6 +87,7 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr ImageView background = findViewById(R.id.popup_status_background); ImageButton statusButton = findViewById(R.id.popup_status_send); ImageButton closeButton = findViewById(R.id.popup_status_close); + ImageButton addPoll = findViewById(R.id.popup_status_add_poll); RecyclerView iconList = findViewById(R.id.popup_status_media_icons); EditText statusText = findViewById(R.id.popup_status_input); locationBtn = findViewById(R.id.popup_status_add_location); @@ -92,6 +98,7 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr settings = GlobalSettings.getInstance(this); loadingCircle = new ProgressDialog(this); confirmDialog = new ConfirmDialog(this); + pollDialog = new PollDialog(this, this); AppStyles.setEditorTheme(root, background); if (!settings.getLogin().getConfiguration().locationSupported()) { @@ -109,6 +116,7 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr iconList.setAdapter(adapter); closeButton.setOnClickListener(this); + addPoll.setOnClickListener(this); statusButton.setOnClickListener(this); mediaBtn.setOnClickListener(this); locationBtn.setOnClickListener(this); @@ -169,6 +177,10 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr else if (v.getId() == R.id.popup_status_close) { showClosingMsg(); } + // show poll dialog + else if (v.getId() == R.id.popup_status_add_poll) { + pollDialog.show(statusUpdate.getPoll()); + } // Add media to the status else if (v.getId() == R.id.popup_status_add_media) { if (statusUpdate.getAttachmentType() == StatusUpdate.EMPTY) { @@ -295,6 +307,12 @@ public class StatusEditor extends MediaActivity implements OnClickListener, OnPr } } + + @Override + public void onPollUpdate(@Nullable PollUpdate update) { + statusUpdate.addPoll(update); + } + /** * show confirmation dialog when closing edited status */ diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/EditOptionsAdapter.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/EditOptionsAdapter.java index f575c727..92a0d764 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/EditOptionsAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/EditOptionsAdapter.java @@ -1,42 +1,139 @@ package org.nuclearfog.twidda.ui.adapter; -import android.content.Context; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.Adapter; +import org.nuclearfog.twidda.ui.adapter.holder.EditOptionsHolder; +import org.nuclearfog.twidda.ui.adapter.holder.EditOptionsHolder.OnOptionChangedListener; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + /** + * RecyclerView adapter used to show option items * + * @author nuclearfog */ -public class EditOptionsAdapter extends Adapter { +public class EditOptionsAdapter extends Adapter implements OnOptionChangedListener { + /** + * minimum option count + */ + private static final int MIN_OPTIONS = 2; - public EditOptionsAdapter(Context context) {} + /** + * maximum option count + */ + private static final int MAX_OPTIONS = 4; + + private LinkedList options; + + /** + * + */ + public EditOptionsAdapter() { + options = new LinkedList<>(); + for (int i = 0 ; i < MIN_OPTIONS ; i++) + options.add(""); + options.add(null); + } @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return null; + public EditOptionsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new EditOptionsHolder(parent, this); } @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - + public void onBindViewHolder(@NonNull EditOptionsHolder holder, int position) { + if (position < MIN_OPTIONS) { + holder.setState(position, EditOptionsHolder.STATE_LOCKED); + } else if (options.get(position) != null) { + holder.setState(position, EditOptionsHolder.STATE_ACTIVE); + } else { + holder.setState(position, EditOptionsHolder.STATE_DISABLED); + } } @Override public int getItemCount() { - return 0; + return options.size(); } - public interface OnOptionChangedListener { + @Override + public void onOptionAdd(int position) { + if (options.size() < MAX_OPTIONS) { + // add empty item + options.add(position, ""); + notifyItemInserted(position); + // update upper items + notifyItemRangeChanged(position + 1, MAX_OPTIONS - position - 1); + } else { + options.set(position, ""); + notifyItemChanged(position); + } + } + @Override + public void onOptionRemove(int position) { + if (position < MAX_OPTIONS - 1) { + // remove item + options.remove(position); + notifyItemRemoved(position); + // update upper items + notifyItemRangeChanged(position, MAX_OPTIONS - position); + // add placeholder item + if (options.peekLast() != null) { + options.add(null); + notifyItemInserted(options.size()); + } + } else { + options.set(position, null); + notifyItemChanged(position); + } + } + + + @Override + public void OnOptionChange(int position, String name) { + options.set(position, name); + } + + /** + * set option names + * + * @param newOptions list of option name strings + */ + public void setOptions(List newOptions) { + options.clear(); + options.addAll(newOptions); + for (int i = options.size() ; i < MIN_OPTIONS; i++) { + options.add(""); + } + options.add(null); + notifyDataSetChanged(); + } + + /** + * get option names + * + * @return list of option name strings + */ + public List getOptions() { + List result = new ArrayList<>(); + for (String option : options) { + if (option != null && !option.trim().isEmpty()) { + result.add(option); + } + } + return result; } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/IconAdapter.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/IconAdapter.java index 1dc44209..71bf4691 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/IconAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/IconAdapter.java @@ -114,40 +114,40 @@ public class IconAdapter extends Adapter implements OnHolderClickLis } /** - * add a single image icon + * append image icon at the end */ public void addImageItem() { - if (invert) { - items.add(0, IconHolder.TYPE_IMAGE); - notifyItemInserted(0); - } else { - items.add(IconHolder.TYPE_IMAGE); - notifyItemInserted(items.size() - 1); - } + appendItem(IconHolder.TYPE_IMAGE); } /** - * add a single gif item - */ - public void addGifItem() { - if (invert) { - items.add(0, IconHolder.TYPE_GIF); - notifyItemInserted(0); - } else { - items.add(IconHolder.TYPE_GIF); - notifyItemInserted(items.size() - 1); - } - } - - /** - * add a single video item + * append video icon at the end */ public void addVideoItem() { + appendItem(IconHolder.TYPE_VIDEO); + } + + /** + * append GIF icon at the end + */ + public void addGifItem() { + appendItem(IconHolder.TYPE_GIF); + } + + /** + * append location icon at the end + */ + public void addLocation() { + appendItem(IconHolder.TYPE_LOCATION); + } + + + public void appendItem(int itemType) { if (invert) { - items.add(0, IconHolder.TYPE_VIDEO); + items.add(0, itemType); notifyItemInserted(0); } else { - items.add(IconHolder.TYPE_VIDEO); + items.add(itemType); notifyItemInserted(items.size() - 1); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/EditOptionsHolder.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/EditOptionsHolder.java new file mode 100644 index 00000000..beb0e46f --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/EditOptionsHolder.java @@ -0,0 +1,166 @@ +package org.nuclearfog.twidda.ui.adapter.holder; + +import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; + +import android.text.Editable; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.EditText; +import android.text.TextWatcher; +import android.widget.ImageButton; + +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + +import org.nuclearfog.twidda.R; +import org.nuclearfog.twidda.backend.utils.AppStyles; +import org.nuclearfog.twidda.config.GlobalSettings; + +/** + * ViewHolder implementation for {@link org.nuclearfog.twidda.ui.adapter.EditOptionsAdapter} + * + * @author nuclearfog + */ +public class EditOptionsHolder extends ViewHolder implements OnClickListener, TextWatcher { + + /** + * indicates that the item is locked and can't be removed + */ + public static final int STATE_LOCKED = 1; + + /** + * indicates that the item is activated & removable + */ + public static final int STATE_ACTIVE = 2; + + /** + * indicates that the item is disabled (placeholder) + */ + public static final int STATE_DISABLED = 3; + + + private EditText option_name; + private ImageButton option_button; + + private OnOptionChangedListener listener; + private GlobalSettings settings; + + private int state = STATE_LOCKED; + + /** + * + */ + public EditOptionsHolder(ViewGroup parent, OnOptionChangedListener listener) { + super(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_option_edit, parent, false)); + settings = GlobalSettings.getInstance(parent.getContext()); + this.listener = listener; + + option_name = itemView.findViewById(R.id.item_option_edit_name); + option_button = itemView.findViewById(R.id.item_option_edit_action); + AppStyles.setTheme((ViewGroup) itemView); + + option_button.setOnClickListener(this); + option_name.addTextChangedListener(this); + } + + + @Override + public void onClick(View v) { + int position = getLayoutPosition(); + if (position != NO_POSITION) { + if (v.getId() == R.id.item_option_edit_action) { + switch (state) { + case STATE_ACTIVE: + listener.onOptionRemove(position); + option_button.setImageResource(R.drawable.add); + AppStyles.setButtonColor(option_button, settings.getIconColor()); + option_name.setEnabled(true); + break; + + case STATE_DISABLED: + listener.onOptionAdd(position); + AppStyles.setButtonColor(option_button, settings.getIconColor()); + option_name.setEnabled(false); + break; + } + } + } + } + + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + + @Override + public void afterTextChanged(Editable s) { + int position = getLayoutPosition(); + if (position != NO_POSITION) { + listener.OnOptionChange(position, s.toString()); + } + } + + /** + * set option state and option hint + * + * @param position position of the item + * @param state state to set {@link #STATE_LOCKED,#STATE_ACTIVE,#STATE_DISABLED} + */ + public void setState(int position, int state) { + this.state = state; + switch (state) { + case STATE_LOCKED: + option_name.setEnabled(true); + option_button.setImageResource(R.drawable.circle); + break; + + case STATE_ACTIVE: + option_name.setEnabled(true); + option_button.setImageResource(R.drawable.cross); + break; + + case STATE_DISABLED: + option_name.setEnabled(false); + option_button.setImageResource(R.drawable.add); + break; + } + AppStyles.setButtonColor(option_button, settings.getIconColor()); + String hint = option_name.getContext().getString(R.string.dialog_poll_option_edit_hint, position + 1); + option_name.setHint(hint); + } + + /** + * listener for option changes + */ + public interface OnOptionChangedListener { + + /** + * called when an option is added + * + * @param position position where to insert the new item + */ + void onOptionAdd(int position); + + /** + * called when an option is removed + * + * @param position position of the old item + */ + void onOptionRemove(int position); + + /** + * called when the option name changes + * + * @param position position of the item + * @param name new option name + */ + void OnOptionChange(int position, String name); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java index 2888b8af..8ffa4f2f 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java @@ -2,28 +2,118 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Dialog; import android.content.Context; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Spinner; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.kyleduo.switchbutton.SwitchButton; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.helper.PollUpdate; +import org.nuclearfog.twidda.backend.utils.AppStyles; +import org.nuclearfog.twidda.ui.adapter.EditOptionsAdapter; /** * Dialog class used to show poll editor * * @author nuclearfog */ -public class PollDialog extends Dialog { +public class PollDialog extends Dialog implements OnClickListener { + + private EditOptionsAdapter optionAdapter; + private SwitchButton multiple_choice, hide_votes; + private Spinner timeUnitSelector; + private EditText durationInput; + + private PollUpdateCallback callback; + private PollUpdate poll; - public PollDialog(@NonNull Context context) { + public PollDialog(@NonNull Context context, PollUpdateCallback callback) { super(context, R.style.PollDialog); + this.callback = callback; setContentView(R.layout.dialog_poll); + ViewGroup root = findViewById(R.id.dialog_poll_root); + RecyclerView optionsList = findViewById(R.id.dialog_poll_option_list); + Button confirm = findViewById(R.id.dialog_poll_create); + durationInput = findViewById(R.id.dialog_poll_duration_input); + timeUnitSelector = findViewById(R.id.dialog_poll_duration_timeunit); + multiple_choice = findViewById(R.id.dialog_poll_mul_choice); + hide_votes = findViewById(R.id.dialog_poll_hide_total); + + ArrayAdapter timeUnitAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_dropdown_item); + timeUnitAdapter.addAll(context.getResources().getStringArray(R.array.timeunits)); + timeUnitSelector.setAdapter(timeUnitAdapter); + timeUnitSelector.setSelected(true); + + optionAdapter = new EditOptionsAdapter(); + optionsList.setAdapter(optionAdapter); + AppStyles.setTheme(root); + + confirm.setOnClickListener(this); } + @Override + public void onClick(View v) { + if (v.getId() == R.id.dialog_poll_create) { + String durationStr = durationInput.getText().toString(); + if (durationStr.matches("\\d{1,3}")) { + int duration = Integer.parseInt(durationStr); + switch (timeUnitSelector.getSelectedItemPosition()) { + // minutes + case 0: + poll.setDuration(duration * 60); + break; - public void show(@NonNull PollUpdate poll) { + // hours + case 1: + poll.setDuration(duration * 3600); + break; + // days + case 2: + poll.setDuration(duration * 86400); + break; + } + } else { + // default 24h + poll.setDuration(86400); + } + poll.setMultipleChoice(multiple_choice.isChecked()); + poll.hideVotes(hide_votes.isChecked()); + poll.setOptions(optionAdapter.getOptions()); + callback.onPollUpdate(poll); + dismiss(); + } + } + + + public void show(@Nullable PollUpdate poll) { + if (!isShowing()) { + if (poll != null) { + optionAdapter.setOptions(poll.getOptions()); + multiple_choice.setCheckedImmediately(poll.multipleChoiceEnabled()); + hide_votes.setCheckedImmediately(poll.hideTotalVotes()); + this.poll = poll; + } else { + this.poll = new PollUpdate(); + } + super.show(); + } + } + + + public interface PollUpdateCallback { + + void onPollUpdate(@Nullable PollUpdate update); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java index 6bd9a103..cf22e535 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/fragments/NotificationFragment.java @@ -77,7 +77,6 @@ public class NotificationFragment extends ListFragment implements OnNotification if (!adapter.isEmpty()) sinceId = adapter.getItemId(0); load(sinceId, 0L, 0); - setRefresh(true); } @@ -86,6 +85,7 @@ public class NotificationFragment extends ListFragment implements OnNotification adapter = new NotificationAdapter(requireContext(), this); setAdapter(adapter); load(0L, 0L, 0); + setRefresh(true); } diff --git a/app/src/main/res/layout/dialog_poll.xml b/app/src/main/res/layout/dialog_poll.xml index 1c48f119..ce965828 100644 --- a/app/src/main/res/layout/dialog_poll.xml +++ b/app/src/main/res/layout/dialog_poll.xml @@ -1,8 +1,10 @@ + android:layout_height="wrap_content" + android:padding="@dimen/dialog_poll_root_layout_padding"> + + + + + + + + + + + + - - + app:constraint_referenced_ids="dialog_poll_duration_input,dialog_poll_duration_timeunit,dialog_poll_create"/> @@ -63,9 +123,23 @@ android:id="@+id/dialog_poll_duration_timeunit" android:layout_width="0dp" android:layout_height="wrap_content" + app:layout_constraintHorizontal_weight="3" app:layout_constraintStart_toEndOf="@id/dialog_poll_duration_input" - app:layout_constraintTop_toBottomOf="@id/dialog_poll_option_list" + app:layout_constraintTop_toBottomOf="@id/dialog_poll_list_barrier" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintEnd_toStartOf="@id/dialog_poll_create" /> + +