add support for multiple choice polls (#1212)
This commit is contained in:
parent
a471e358c3
commit
8d01e54caf
5 changed files with 239 additions and 52 deletions
|
|
@ -8,6 +8,7 @@ import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
|
|
@ -36,6 +37,7 @@ import com.mikepenz.iconics.utils.Utils;
|
||||||
|
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -80,6 +82,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
private TextView pollDescription;
|
private TextView pollDescription;
|
||||||
private RadioGroup pollRadioGroup;
|
private RadioGroup pollRadioGroup;
|
||||||
private RadioButton[] pollRadioOptions;
|
private RadioButton[] pollRadioOptions;
|
||||||
|
private CheckBox[] pollCheckboxOptions;
|
||||||
private Button pollButton;
|
private Button pollButton;
|
||||||
|
|
||||||
private boolean useAbsoluteTime;
|
private boolean useAbsoluteTime;
|
||||||
|
|
@ -137,6 +140,12 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
pollRadioGroup.findViewById(R.id.status_poll_radio_button_2),
|
pollRadioGroup.findViewById(R.id.status_poll_radio_button_2),
|
||||||
pollRadioGroup.findViewById(R.id.status_poll_radio_button_3)
|
pollRadioGroup.findViewById(R.id.status_poll_radio_button_3)
|
||||||
};
|
};
|
||||||
|
pollCheckboxOptions = new CheckBox[] {
|
||||||
|
itemView.findViewById(R.id.status_poll_checkbox_0),
|
||||||
|
itemView.findViewById(R.id.status_poll_checkbox_1),
|
||||||
|
itemView.findViewById(R.id.status_poll_checkbox_2),
|
||||||
|
itemView.findViewById(R.id.status_poll_checkbox_3)
|
||||||
|
};
|
||||||
|
|
||||||
pollButton = itemView.findViewById(R.id.status_poll_button);
|
pollButton = itemView.findViewById(R.id.status_poll_button);
|
||||||
|
|
||||||
|
|
@ -760,62 +769,20 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
pollDescription.setVisibility(View.GONE);
|
pollDescription.setVisibility(View.GONE);
|
||||||
pollRadioGroup.setVisibility(View.GONE);
|
pollRadioGroup.setVisibility(View.GONE);
|
||||||
|
|
||||||
for(RadioButton radioButton: pollRadioOptions) {
|
for(CheckBox checkBox: pollCheckboxOptions) {
|
||||||
radioButton.setVisibility(View.GONE);
|
checkBox.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
pollButton.setVisibility(View.GONE);
|
pollButton.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
Context context = pollDescription.getContext();
|
Context context = pollDescription.getContext();
|
||||||
List<PollOption> options = poll.getOptions();
|
|
||||||
|
|
||||||
if(poll.getExpired() || poll.getVoted()) {
|
if(poll.getExpired() || poll.getVoted()) {
|
||||||
// no voting possible
|
// no voting possible
|
||||||
for(int i = 0; i < Status.MAX_POLL_OPTIONS; i++) {
|
setupPollResult(poll, emojis);
|
||||||
if(i < options.size()) {
|
|
||||||
long percent = calculatePollPercent(options.get(i).getVotesCount(), poll.getVotesCount());
|
|
||||||
|
|
||||||
String pollOptionText = context.getString(R.string.poll_option_format, percent, options.get(i).getTitle());
|
|
||||||
pollResults[i].setText(CustomEmojiHelper.emojifyText(HtmlUtils.fromHtml(pollOptionText), emojis, pollResults[i]));
|
|
||||||
pollResults[i].setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
int level = (int) percent * 100;
|
|
||||||
|
|
||||||
pollResults[i].getBackground().setLevel(level);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pollResults[i].setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pollRadioGroup.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
for(RadioButton radioButton: pollRadioOptions) {
|
|
||||||
radioButton.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
pollButton.setVisibility(View.GONE);
|
|
||||||
} else {
|
} else {
|
||||||
// voting possible
|
// voting possible
|
||||||
|
setupPollVoting(poll, emojis, listener);
|
||||||
for(TextView pollResult: pollResults) {
|
|
||||||
pollResult.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
pollRadioGroup.setVisibility(View.VISIBLE);
|
|
||||||
pollRadioGroup.clearCheck();
|
|
||||||
pollButton.setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
for(int i = 0; i < Status.MAX_POLL_OPTIONS; i++) {
|
|
||||||
if(i < options.size()) {
|
|
||||||
pollRadioOptions[i].setText(CustomEmojiHelper.emojifyString(options.get(i).getTitle(), emojis, pollRadioOptions[i]));
|
|
||||||
pollRadioOptions[i].setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pollRadioOptions[i].setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pollDescription.setVisibility(View.VISIBLE);
|
pollDescription.setVisibility(View.VISIBLE);
|
||||||
|
|
@ -839,6 +806,94 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
pollDescription.setText(pollInfo);
|
pollDescription.setText(pollInfo);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPollResult(Poll poll, List<Emoji> emojis) {
|
||||||
|
List<PollOption> options = poll.getOptions();
|
||||||
|
|
||||||
|
for(int i = 0; i < Status.MAX_POLL_OPTIONS; i++) {
|
||||||
|
if(i < options.size()) {
|
||||||
|
long percent = calculatePollPercent(options.get(i).getVotesCount(), poll.getVotesCount());
|
||||||
|
|
||||||
|
String pollOptionText = pollResults[i].getContext().getString(R.string.poll_option_format, percent, options.get(i).getTitle());
|
||||||
|
pollResults[i].setText(CustomEmojiHelper.emojifyText(HtmlUtils.fromHtml(pollOptionText), emojis, pollResults[i]));
|
||||||
|
pollResults[i].setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
int level = (int) percent * 100;
|
||||||
|
|
||||||
|
pollResults[i].getBackground().setLevel(level);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
pollResults[i].setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pollRadioGroup.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
for(CheckBox checkBox: pollCheckboxOptions) {
|
||||||
|
checkBox.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
pollButton.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPollVoting(Poll poll, List<Emoji> emojis, StatusActionListener listener) {
|
||||||
|
List<PollOption> options = poll.getOptions();
|
||||||
|
|
||||||
|
pollButton.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
for(TextView pollResult: pollResults) {
|
||||||
|
pollResult.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(poll.getMultiple()) {
|
||||||
|
|
||||||
|
pollRadioGroup.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
for(int i = 0; i < Status.MAX_POLL_OPTIONS; i++) {
|
||||||
|
if(i < options.size()) {
|
||||||
|
pollCheckboxOptions[i].setText(CustomEmojiHelper.emojifyString(options.get(i).getTitle(), emojis, pollCheckboxOptions[i]));
|
||||||
|
pollCheckboxOptions[i].setVisibility(View.VISIBLE);
|
||||||
|
pollCheckboxOptions[i].setChecked(false);
|
||||||
|
} else {
|
||||||
|
pollCheckboxOptions[i].setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pollButton.setOnClickListener(v -> {
|
||||||
|
|
||||||
|
List<Integer> pollResult = new ArrayList<>(options.size());
|
||||||
|
for(int i = 0; i < options.size(); i++) {
|
||||||
|
if(pollCheckboxOptions[i].isChecked()) {
|
||||||
|
pollResult.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(pollResult.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
listener.onVoteInPoll(getAdapterPosition(), pollResult);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
|
||||||
|
for(CheckBox pollCheckbox: pollCheckboxOptions) {
|
||||||
|
pollCheckbox.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
pollRadioGroup.setVisibility(View.VISIBLE);
|
||||||
|
pollRadioGroup.clearCheck();
|
||||||
|
|
||||||
|
for(int i = 0; i < Status.MAX_POLL_OPTIONS; i++) {
|
||||||
|
if(i < options.size()) {
|
||||||
|
pollRadioOptions[i].setText(CustomEmojiHelper.emojifyString(options.get(i).getTitle(), emojis, pollRadioOptions[i]));
|
||||||
|
pollRadioOptions[i].setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
pollRadioOptions[i].setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pollButton.setOnClickListener(v -> {
|
pollButton.setOnClickListener(v -> {
|
||||||
|
|
||||||
int selectedRadioButtonIndex;
|
int selectedRadioButtonIndex;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ data class Poll(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return copy(options = newOptions, votesCount = votesCount + 1, voted = true)
|
return copy(options = newOptions, votesCount = votesCount + choices.size, voted = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -455,11 +455,56 @@
|
||||||
tools:text="Option 4" />
|
tools:text="Option 4" />
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_0"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_radio_group"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_1"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_0"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_2"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_1"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_3"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_2"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
|
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
|
||||||
<androidx.appcompat.widget.AppCompatButton
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
android:id="@+id/status_poll_button"
|
android:id="@+id/status_poll_button"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
android:background="?attr/content_warning_button"
|
android:background="?attr/content_warning_button"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:minWidth="150dp"
|
android:minWidth="150dp"
|
||||||
|
|
@ -468,11 +513,10 @@
|
||||||
android:paddingTop="4dp"
|
android:paddingTop="4dp"
|
||||||
android:paddingRight="16dp"
|
android:paddingRight="16dp"
|
||||||
android:paddingBottom="4dp"
|
android:paddingBottom="4dp"
|
||||||
android:layout_marginTop="4dp"
|
|
||||||
android:text="@string/poll_vote"
|
android:text="@string/poll_vote"
|
||||||
android:textSize="?attr/status_text_medium"
|
android:textSize="?attr/status_text_medium"
|
||||||
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
app:layout_constraintTop_toBottomOf="@id/status_poll_radio_group" />
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_3" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/status_poll_description"
|
android:id="@+id/status_poll_description"
|
||||||
|
|
|
||||||
|
|
@ -441,11 +441,56 @@
|
||||||
tools:text="Option 4" />
|
tools:text="Option 4" />
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_0"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_radio_group"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_1"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_0"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_2"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_1"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_3"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_2"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
|
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
|
||||||
<androidx.appcompat.widget.AppCompatButton
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
android:id="@+id/status_poll_button"
|
android:id="@+id/status_poll_button"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
android:background="?attr/content_warning_button"
|
android:background="?attr/content_warning_button"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:minWidth="150dp"
|
android:minWidth="150dp"
|
||||||
|
|
@ -454,11 +499,10 @@
|
||||||
android:paddingTop="4dp"
|
android:paddingTop="4dp"
|
||||||
android:paddingRight="16dp"
|
android:paddingRight="16dp"
|
||||||
android:paddingBottom="4dp"
|
android:paddingBottom="4dp"
|
||||||
android:layout_marginTop="4dp"
|
|
||||||
android:text="@string/poll_vote"
|
android:text="@string/poll_vote"
|
||||||
android:textSize="?attr/status_text_medium"
|
android:textSize="?attr/status_text_medium"
|
||||||
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
app:layout_constraintStart_toStartOf="@id/status_display_name"
|
||||||
app:layout_constraintTop_toBottomOf="@id/status_poll_radio_group" />
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_3" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/status_poll_description"
|
android:id="@+id/status_poll_description"
|
||||||
|
|
|
||||||
|
|
@ -450,6 +450,50 @@
|
||||||
tools:text="Option 4" />
|
tools:text="Option 4" />
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_0"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_radio_group"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_1"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_0"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_2"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_1"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/status_poll_checkbox_3"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_2"
|
||||||
|
tools:text="Option 1" />
|
||||||
|
|
||||||
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
|
<!-- using AppCompatButton because we don't want the inflater to turn it into a MaterialButton -->
|
||||||
<androidx.appcompat.widget.AppCompatButton
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
android:id="@+id/status_poll_button"
|
android:id="@+id/status_poll_button"
|
||||||
|
|
@ -467,7 +511,7 @@
|
||||||
android:text="@string/poll_vote"
|
android:text="@string/poll_vote"
|
||||||
android:textSize="?attr/status_text_medium"
|
android:textSize="?attr/status_text_medium"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/status_poll_radio_group" />
|
app:layout_constraintTop_toBottomOf="@id/status_poll_checkbox_3" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/status_poll_description"
|
android:id="@+id/status_poll_description"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue