mirror of https://github.com/iSoron/uhabits.git
commit
b82181bb2f
@ -1,119 +0,0 @@
|
|||||||
package org.isoron.uhabits.activities.common.dialogs
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Typeface
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
|
|
||||||
import android.widget.Button
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import org.isoron.platform.gui.toInt
|
|
||||||
import org.isoron.platform.time.JavaLocalDateFormatter
|
|
||||||
import org.isoron.platform.time.LocalDate
|
|
||||||
import org.isoron.uhabits.R
|
|
||||||
import org.isoron.uhabits.core.models.Entry.Companion.NO
|
|
||||||
import org.isoron.uhabits.core.models.Entry.Companion.SKIP
|
|
||||||
import org.isoron.uhabits.core.models.Entry.Companion.UNKNOWN
|
|
||||||
import org.isoron.uhabits.core.models.Entry.Companion.YES_AUTO
|
|
||||||
import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL
|
|
||||||
import org.isoron.uhabits.core.models.PaletteColor
|
|
||||||
import org.isoron.uhabits.core.preferences.Preferences
|
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior
|
|
||||||
import org.isoron.uhabits.core.ui.views.Theme
|
|
||||||
import org.isoron.uhabits.databinding.CheckmarkDialogBinding
|
|
||||||
import org.isoron.uhabits.inject.ActivityContext
|
|
||||||
import org.isoron.uhabits.utils.InterfaceUtils
|
|
||||||
import org.isoron.uhabits.utils.StyledResources
|
|
||||||
import java.util.Locale
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
class CheckmarkDialog
|
|
||||||
@Inject constructor(
|
|
||||||
@ActivityContext private val context: Context,
|
|
||||||
private val preferences: Preferences,
|
|
||||||
) : View.OnClickListener {
|
|
||||||
|
|
||||||
private lateinit var binding: CheckmarkDialogBinding
|
|
||||||
private lateinit var fontAwesome: Typeface
|
|
||||||
private val allButtons = mutableListOf<Button>()
|
|
||||||
private var selectedButton: Button? = null
|
|
||||||
|
|
||||||
fun create(
|
|
||||||
selectedValue: Int,
|
|
||||||
notes: String,
|
|
||||||
date: LocalDate,
|
|
||||||
paletteColor: PaletteColor,
|
|
||||||
callback: ListHabitsBehavior.CheckMarkDialogCallback,
|
|
||||||
theme: Theme,
|
|
||||||
): AlertDialog {
|
|
||||||
binding = CheckmarkDialogBinding.inflate(LayoutInflater.from(context))
|
|
||||||
fontAwesome = InterfaceUtils.getFontAwesome(context)!!
|
|
||||||
binding.etNotes.append(notes)
|
|
||||||
setUpButtons(selectedValue, theme.color(paletteColor).toInt())
|
|
||||||
|
|
||||||
val dialog = AlertDialog.Builder(context)
|
|
||||||
.setView(binding.root)
|
|
||||||
.setTitle(JavaLocalDateFormatter(Locale.getDefault()).longFormat(date))
|
|
||||||
.setPositiveButton(R.string.save) { _, _ ->
|
|
||||||
val newValue = when (selectedButton?.id) {
|
|
||||||
R.id.yesBtn -> YES_MANUAL
|
|
||||||
R.id.noBtn -> NO
|
|
||||||
R.id.skippedBtn -> SKIP
|
|
||||||
else -> UNKNOWN
|
|
||||||
}
|
|
||||||
callback.onNotesSaved(newValue, binding.etNotes.text.toString())
|
|
||||||
}
|
|
||||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
|
||||||
callback.onNotesDismissed()
|
|
||||||
}
|
|
||||||
.setOnDismissListener {
|
|
||||||
callback.onNotesDismissed()
|
|
||||||
}
|
|
||||||
.create()
|
|
||||||
|
|
||||||
dialog.setOnShowListener {
|
|
||||||
binding.etNotes.requestFocus()
|
|
||||||
dialog.window?.setSoftInputMode(SOFT_INPUT_STATE_ALWAYS_VISIBLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
return dialog
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setUpButtons(value: Int, color: Int) {
|
|
||||||
val sres = StyledResources(context)
|
|
||||||
val mediumContrastColor = sres.getColor(R.attr.contrast60)
|
|
||||||
setButtonAttrs(binding.yesBtn, color)
|
|
||||||
setButtonAttrs(binding.noBtn, mediumContrastColor)
|
|
||||||
setButtonAttrs(binding.skippedBtn, color, visible = preferences.isSkipEnabled)
|
|
||||||
setButtonAttrs(binding.questionBtn, mediumContrastColor, visible = preferences.areQuestionMarksEnabled)
|
|
||||||
when (value) {
|
|
||||||
UNKNOWN -> if (preferences.areQuestionMarksEnabled) {
|
|
||||||
binding.questionBtn.performClick()
|
|
||||||
} else {
|
|
||||||
binding.noBtn.performClick()
|
|
||||||
}
|
|
||||||
SKIP -> binding.skippedBtn.performClick()
|
|
||||||
YES_MANUAL -> binding.yesBtn.performClick()
|
|
||||||
YES_AUTO, NO -> binding.noBtn.performClick()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setButtonAttrs(button: Button, color: Int, visible: Boolean = true) {
|
|
||||||
button.apply {
|
|
||||||
visibility = if (visible) View.VISIBLE else View.GONE
|
|
||||||
typeface = fontAwesome
|
|
||||||
setTextColor(color)
|
|
||||||
setOnClickListener(this@CheckmarkDialog)
|
|
||||||
}
|
|
||||||
allButtons.add(button)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onClick(v: View?) {
|
|
||||||
allButtons.forEach {
|
|
||||||
if (v?.id == it.id) {
|
|
||||||
it.isSelected = true
|
|
||||||
selectedButton = it
|
|
||||||
} else it.isSelected = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
|
*
|
||||||
|
* This file is part of Loop Habit Tracker.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.uhabits.activities.common.dialogs
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.drawable.ColorDrawable
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.View.GONE
|
||||||
|
import android.widget.PopupWindow
|
||||||
|
import org.isoron.platform.gui.ScreenLocation
|
||||||
|
import org.isoron.uhabits.R
|
||||||
|
import org.isoron.uhabits.core.models.Entry.Companion.NO
|
||||||
|
import org.isoron.uhabits.core.models.Entry.Companion.SKIP
|
||||||
|
import org.isoron.uhabits.core.models.Entry.Companion.UNKNOWN
|
||||||
|
import org.isoron.uhabits.core.models.Entry.Companion.YES_AUTO
|
||||||
|
import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL
|
||||||
|
import org.isoron.uhabits.core.preferences.Preferences
|
||||||
|
import org.isoron.uhabits.databinding.CheckmarkPopupBinding
|
||||||
|
import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome
|
||||||
|
import org.isoron.uhabits.utils.dimBehind
|
||||||
|
import org.isoron.uhabits.utils.dp
|
||||||
|
import org.isoron.uhabits.utils.sres
|
||||||
|
|
||||||
|
const val POPUP_WIDTH = 4 * 48f + 16f
|
||||||
|
const val POPUP_HEIGHT = 48f * 2.5f + 8f
|
||||||
|
|
||||||
|
class CheckmarkPopup(
|
||||||
|
private val context: Context,
|
||||||
|
private val color: Int,
|
||||||
|
private var notes: String,
|
||||||
|
private var value: Int,
|
||||||
|
private val prefs: Preferences,
|
||||||
|
private val anchor: View,
|
||||||
|
) {
|
||||||
|
var onToggle: (Int, String) -> Unit = { _, _ -> }
|
||||||
|
|
||||||
|
private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply {
|
||||||
|
// Required for round corners
|
||||||
|
container.clipToOutline = true
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
initColors()
|
||||||
|
initTypefaces()
|
||||||
|
hideDisabledButtons()
|
||||||
|
populate()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initColors() {
|
||||||
|
arrayOf(view.yesBtn, view.skipBtn).forEach {
|
||||||
|
it.setTextColor(color)
|
||||||
|
}
|
||||||
|
arrayOf(view.noBtn, view.unknownBtn).forEach {
|
||||||
|
it.setTextColor(view.root.sres.getColor(R.attr.contrast60))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initTypefaces() {
|
||||||
|
arrayOf(view.yesBtn, view.noBtn, view.skipBtn, view.unknownBtn).forEach {
|
||||||
|
it.typeface = getFontAwesome(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hideDisabledButtons() {
|
||||||
|
if (!prefs.isSkipEnabled) view.skipBtn.visibility = GONE
|
||||||
|
if (!prefs.areQuestionMarksEnabled) view.unknownBtn.visibility = GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun populate() {
|
||||||
|
val selectedBtn = when (value) {
|
||||||
|
YES_MANUAL -> view.yesBtn
|
||||||
|
YES_AUTO -> view.noBtn
|
||||||
|
NO -> view.noBtn
|
||||||
|
UNKNOWN -> if (prefs.areQuestionMarksEnabled) view.unknownBtn else view.noBtn
|
||||||
|
SKIP -> if (prefs.isSkipEnabled) view.skipBtn else view.noBtn
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
selectedBtn?.background = ColorDrawable(view.root.sres.getColor(R.attr.contrast40))
|
||||||
|
view.notes.setText(notes)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun show(location: ScreenLocation) {
|
||||||
|
val popup = PopupWindow()
|
||||||
|
popup.contentView = view.root
|
||||||
|
popup.width = view.root.dp(POPUP_WIDTH).toInt()
|
||||||
|
popup.height = view.root.dp(POPUP_HEIGHT).toInt()
|
||||||
|
popup.isFocusable = true
|
||||||
|
popup.elevation = view.root.dp(24f)
|
||||||
|
fun onClick(v: Int) {
|
||||||
|
this.value = v
|
||||||
|
popup.dismiss()
|
||||||
|
}
|
||||||
|
view.yesBtn.setOnClickListener { onClick(YES_MANUAL) }
|
||||||
|
view.noBtn.setOnClickListener { onClick(NO) }
|
||||||
|
view.skipBtn.setOnClickListener { onClick(SKIP) }
|
||||||
|
view.unknownBtn.setOnClickListener { onClick(UNKNOWN) }
|
||||||
|
popup.setOnDismissListener {
|
||||||
|
onToggle(value, view.notes.text.toString())
|
||||||
|
}
|
||||||
|
popup.showAtLocation(
|
||||||
|
anchor,
|
||||||
|
Gravity.NO_GRAVITY,
|
||||||
|
view.root.dp(location.x.toFloat()).toInt(),
|
||||||
|
view.root.dp(location.y.toFloat()).toInt(),
|
||||||
|
)
|
||||||
|
popup.dimBehind()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
|
~
|
||||||
|
~ This file is part of Loop Habit Tracker.
|
||||||
|
~
|
||||||
|
~ Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU General Public License as published by the
|
||||||
|
~ Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
~ option) any later version.
|
||||||
|
~
|
||||||
|
~ Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||||
|
~ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
~ more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU General Public License along
|
||||||
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<solid android:color="?attr/contrast0" />
|
||||||
|
<stroke
|
||||||
|
android:width="2dp"
|
||||||
|
android:color="?contrast40" />
|
||||||
|
<corners android:radius="5dp" />
|
||||||
|
</shape>
|
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
|
~
|
||||||
|
~ This file is part of Loop Habit Tracker.
|
||||||
|
~
|
||||||
|
~ Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU General Public License as published by the
|
||||||
|
~ Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
~ option) any later version.
|
||||||
|
~
|
||||||
|
~ Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||||
|
~ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
~ more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU General Public License along
|
||||||
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<size android:width="1dip"/>
|
||||||
|
<size android:height="1dip"/>
|
||||||
|
<solid android:color="?contrast40"/>
|
||||||
|
</shape>
|
@ -1,95 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:gravity="center"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingTop="12dp"
|
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingEnd="10dp">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:padding="8dp"
|
|
||||||
android:baselineAligned="false">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
style="@style/FormOuterBox"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="1">
|
|
||||||
<LinearLayout style="@style/DialogFormInnerBox">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/DialogFormLabel"
|
|
||||||
android:text="@string/value" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginBottom="8dp">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/yesBtn"
|
|
||||||
android:text="@string/fa_check"
|
|
||||||
style="@style/CheckmarkDialogBtn"/>
|
|
||||||
<Button
|
|
||||||
android:id="@+id/skippedBtn"
|
|
||||||
android:text="@string/fa_skipped"
|
|
||||||
android:visibility="gone"
|
|
||||||
style="@style/CheckmarkDialogBtn"/>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/noBtn"
|
|
||||||
android:text="@string/fa_times"
|
|
||||||
style="@style/CheckmarkDialogBtn"/>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/questionBtn"
|
|
||||||
android:text="@string/fa_question"
|
|
||||||
android:visibility="gone"
|
|
||||||
style="@style/CheckmarkDialogBtn"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:padding="5dp"
|
|
||||||
android:baselineAligned="false">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
style="@style/FormOuterBox"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="1">
|
|
||||||
|
|
||||||
<LinearLayout style="@style/DialogFormInnerBox">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/DialogFormLabel"
|
|
||||||
android:text="@string/notes" />
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/etNotes"
|
|
||||||
android:inputType="textCapSentences|textMultiLine"
|
|
||||||
style="@style/FormInput"
|
|
||||||
android:scrollbars="vertical"
|
|
||||||
android:hint="@string/example_notes"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
~ Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||||
|
~
|
||||||
|
~ This file is part of Loop Habit Tracker.
|
||||||
|
~
|
||||||
|
~ Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU General Public License as published by the
|
||||||
|
~ Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
~ option) any later version.
|
||||||
|
~
|
||||||
|
~ Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||||
|
~ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
~ more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU General Public License along
|
||||||
|
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:divider="@drawable/checkmark_dialog_divider"
|
||||||
|
app:showDividers="middle"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:background="@drawable/checkmark_dialog_bg">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:id="@+id/notes"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center"
|
||||||
|
android:inputType="textCapSentences|textMultiLine"
|
||||||
|
android:textSize="@dimen/smallTextSize"
|
||||||
|
android:padding="4dp"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:hint="@string/notes"
|
||||||
|
android:text="" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:divider="@drawable/checkmark_dialog_divider"
|
||||||
|
app:showDividers="middle">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/yesBtn"
|
||||||
|
style="@style/CheckmarkPopupBtn"
|
||||||
|
android:text="@string/fa_check" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/skipBtn"
|
||||||
|
style="@style/CheckmarkPopupBtn"
|
||||||
|
android:text="@string/fa_skipped" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/noBtn"
|
||||||
|
style="@style/CheckmarkPopupBtn"
|
||||||
|
android:text="@string/fa_times" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/unknownBtn"
|
||||||
|
style="@style/CheckmarkPopupBtn"
|
||||||
|
android:text="@string/fa_question" />
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
Loading…
Reference in new issue