feat: add calculator to app

This commit is contained in:
rebelonion 2024-05-22 05:08:43 -05:00
parent 0008da200a
commit 143eed8cb2
14 changed files with 776 additions and 5 deletions

View file

@ -129,6 +129,8 @@
<data android:scheme="file" />
</intent-filter>
</activity>
<activity android:name=".others.calc.CalcActivity"
android:parentActivityName=".MainActivity" />
<activity android:name=".settings.FAQActivity" />
<activity android:name=".settings.ReaderSettingsActivity" />
<activity android:name=".settings.UserInterfaceSettingsActivity" />

View file

@ -48,6 +48,7 @@ import ani.dantotsu.home.NoInternet
import ani.dantotsu.media.MediaDetailsActivity
import ani.dantotsu.notifications.TaskScheduler
import ani.dantotsu.others.CustomBottomDialog
import ani.dantotsu.others.calc.CalcActivity
import ani.dantotsu.profile.ProfileActivity
import ani.dantotsu.profile.activity.FeedActivity
import ani.dantotsu.profile.activity.NotificationActivity
@ -100,6 +101,20 @@ class MainActivity : AppCompatActivity() {
setContentView(binding.root)
TaskScheduler.scheduleSingleWork(this)
if (!CalcActivity.hasPermission) {
val pin: String = PrefManager.getVal(PrefName.AppPassword)
if (pin.isNotEmpty()) {
ContextCompat.startActivity(
this@MainActivity,
Intent(this@MainActivity, CalcActivity::class.java)
.putExtra("code", pin)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK),
null
)
finish()
return
}
}
val action = intent.action
val type = intent.type

View file

@ -148,7 +148,11 @@ class SubscriptionHelper {
val name: String,
val image: String?,
val banner: String? = null
) : java.io.Serializable
) : java.io.Serializable {
companion object {
private const val serialVersionUID = 1L
}
}
private const val SUBSCRIPTIONS = "subscriptions"

View file

@ -0,0 +1,120 @@
package ani.dantotsu.others.calc
import android.content.Intent
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams
import ani.dantotsu.MainActivity
import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityCalcBinding
import ani.dantotsu.getThemeColor
import ani.dantotsu.initActivity
import ani.dantotsu.navBarHeight
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager
import ani.dantotsu.util.NumberConverter.Companion.toBinary
import ani.dantotsu.util.NumberConverter.Companion.toHex
class CalcActivity : AppCompatActivity() {
private lateinit var binding: ActivityCalcBinding
private lateinit var code: String
private val stack = CalcStack()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ThemeManager(this).applyTheme()
initActivity(this)
binding = ActivityCalcBinding.inflate(layoutInflater)
binding.mainContainer.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin += statusBarHeight
bottomMargin = navBarHeight
}
setContentView(binding.root)
code = intent.getStringExtra("code") ?: "0"
binding.apply {
button0.setOnClickListener { stack.add('0'); updateDisplay() }
button1.setOnClickListener { stack.add('1'); updateDisplay() }
button2.setOnClickListener { stack.add('2'); updateDisplay() }
button3.setOnClickListener { stack.add('3'); updateDisplay() }
button4.setOnClickListener { stack.add('4'); updateDisplay() }
button5.setOnClickListener { stack.add('5'); updateDisplay() }
button6.setOnClickListener { stack.add('6'); updateDisplay() }
button7.setOnClickListener { stack.add('7'); updateDisplay() }
button8.setOnClickListener { stack.add('8'); updateDisplay() }
button9.setOnClickListener { stack.add('9'); updateDisplay() }
buttonDot.setOnClickListener { stack.add('.'); updateDisplay() }
buttonAdd.setOnClickListener { stack.add('+'); updateDisplay() }
buttonSubtract.setOnClickListener { stack.add('-'); updateDisplay() }
buttonMultiply.setOnClickListener { stack.add('*'); updateDisplay() }
buttonDivide.setOnClickListener { stack.add('/'); updateDisplay() }
buttonEquals.setOnClickListener {
try {
val ans = stack.evaluate()
updateDisplay()
binding.displayBinary.text = ans.toBinary()
binding.displayHex.text = ans.toHex()
} catch (e: Exception) {
display.text = getString(R.string.error)
}
}
buttonClear.setOnClickListener {
stack.clear()
binding.displayBinary.text = ""
binding.displayHex.text = ""
binding.display.text = "0"
}
buttonBackspace.setOnClickListener {
stack.remove()
updateDisplay()
}
display.text = "0"
}
}
private fun success() {
hasPermission = true
ContextCompat.startActivity(
this,
Intent(this, MainActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK),
null
)
}
private fun updateDisplay() {
if (stack.getExpression().isEmpty()) {
binding.display.text = "0"
return
}
val expression = stack.getExpression().replace("*", "×").replace("/", "÷")
val spannable = SpannableString(expression)
val operators = arrayOf('+', '-', '×', '÷')
expression.forEachIndexed { index, char ->
if (char in operators) {
val color = getThemeColor(com.google.android.material.R.attr.colorSecondary)
spannable.setSpan(
ForegroundColorSpan(color),
index,
index + 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
}
binding.display.text = spannable
val text = binding.display.text.toString()
if (text == code) {
success()
}
}
companion object {
var hasPermission = false
}
}

View file

@ -0,0 +1,103 @@
package ani.dantotsu.others.calc
import java.util.Stack
class CalcStack {
private var expression: String = ""
private val maxExpressionLength = 256
fun evaluate(): Double {
val ops = Stack<Char>()
val values = Stack<Double>()
var i = 0
while (i < expression.length) {
when {
expression[i] == ' ' -> i++
expression[i].isDigit() || expression[i] == '.' -> {
var value = 0.0
var isDecimal = false
var decimalFactor = 0.1
while (i < expression.length && (expression[i].isDigit() || expression[i] == '.' && !isDecimal)) {
if (expression[i] == '.') {
isDecimal = true
} else if (!isDecimal) {
value = value * 10 + (expression[i] - '0')
} else {
value += (expression[i] - '0') * decimalFactor
decimalFactor *= 0.1
}
i++
}
values.push(value)
i-- // to compensate the additional i++ in the loop
}
else -> {
while (!ops.isEmpty() && precedence(ops.peek()) >= precedence(expression[i])) {
val val2 = values.pop()
val val1 = values.pop()
val op = ops.pop()
values.push(applyOp(val1, val2, op))
}
ops.push(expression[i])
}
}
i++
}
while (!ops.isEmpty()) {
val val2 = values.pop()
val val1 = values.pop()
val op = ops.pop()
values.push(applyOp(val1, val2, op))
}
val ans = values.pop()
expression = ans.toString()
return ans
}
fun add(c: Char) {
if (expression.length >= maxExpressionLength) return
expression += c
}
fun clear() {
expression = ""
}
fun remove() {
if (expression.isNotEmpty()) {
expression = expression.substring(0, expression.length - 1)
}
}
fun getExpression(): String {
return expression
}
private fun precedence(op: Char): Int {
return when (op) {
'+', '-' -> 1
'*', '/' -> 2
else -> -1
}
}
private fun applyOp(a: Double, b: Double, op: Char): Double {
return when (op) {
'+' -> a + b
'-' -> a - b
'*' -> a * b
'/' -> {
if (b == 0.0) throw UnsupportedOperationException("Cannot divide by zero.")
a / b
}
else -> 0.0
}
}
}

View file

@ -4,12 +4,11 @@ import android.app.AlertDialog
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.widget.ArrayAdapter
import android.widget.TextView
import android.widget.EditText
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updateLayoutParams
@ -41,6 +40,7 @@ import kotlinx.coroutines.launch
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class SettingsCommonActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingsCommonBinding
private lateinit var launcher: LauncherWrapper
@ -169,6 +169,51 @@ class SettingsCommonActivity : AppCompatActivity() {
dialog.window?.setDimAmount(0.8f)
}
),
Settings(
type = 1,
name = getString(R.string.app_lock),
desc = getString(R.string.app_lock_desc),
icon = R.drawable.ic_round_lock_open_24,
onClick = {
val passwordDialog = AlertDialog.Builder(context, R.style.MyPopup)
.setTitle(R.string.download_manager)
.setView(R.layout.dialog_set_password)
.setPositiveButton(R.string.ok) { dialog, _ ->
val passwordInput =
(dialog as AlertDialog).findViewById<EditText>(R.id.passwordInput)
val confirmPasswordInput =
dialog.findViewById<EditText>(R.id.confirmPasswordInput)
val password = passwordInput?.text.toString()
val confirmPassword = confirmPasswordInput?.text.toString()
if (password == confirmPassword && password.isNotEmpty()) {
PrefManager.setVal(PrefName.AppPassword, password)
toast(R.string.success)
dialog.dismiss()
} else {
toast(R.string.password_mismatch)
}
}
.setNegativeButton(R.string.cancel) { dialog, _ ->
dialog.dismiss()
}
.setNeutralButton(R.string.remove) { dialog, _ ->
PrefManager.setVal(PrefName.AppPassword, "")
toast(R.string.success)
dialog.dismiss()
}
.create()
passwordDialog.window?.setDimAmount(0.8f)
passwordDialog.setOnShowListener {
passwordDialog.findViewById<EditText>(R.id.passwordInput)
?.requestFocus()
}
passwordDialog.show()
}
),
Settings(
type = 1,
name = getString(R.string.backup_restore),

View file

@ -201,4 +201,5 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files
AnilistUserId(Pref(Location.Protected, String::class, "")),
MALCodeChallenge(Pref(Location.Protected, String::class, "")),
MALToken(Pref(Location.Protected, MAL.ResponseToken::class, "")),
AppPassword(Pref(Location.Protected, String::class, "")),
}

View file

@ -0,0 +1,51 @@
package ani.dantotsu.util
import java.util.Locale
class NumberConverter {
companion object {
fun Number.toBinary(): String {
return when (this) {
is Int -> Integer.toBinaryString(this)
is Long -> java.lang.Long.toBinaryString(this)
is Short -> Integer.toBinaryString(this.toInt())
is Byte -> Integer.toBinaryString(this.toInt())
is Double -> doubleToBinary(this)
is Float -> floatToBinary(this)
else -> throw IllegalArgumentException("Unsupported number type")
}
}
fun Number.toHex(): String {
return when (this) {
is Int -> Integer.toHexString(this)
is Long -> java.lang.Long.toHexString(this)
is Short -> Integer.toHexString(this.toInt())
is Byte -> Integer.toHexString(this.toInt())
is Double -> doubleToHex(this)
is Float -> floatToHex(this)
else -> throw IllegalArgumentException("Unsupported number type")
}
}
private fun doubleToHex(number: Double): String {
val longBits = java.lang.Double.doubleToLongBits(number)
return "0x" + java.lang.Long.toHexString(longBits).uppercase(Locale.ROOT)
}
private fun floatToHex(number: Float): String {
val intBits = java.lang.Float.floatToIntBits(number)
return "0x" + Integer.toHexString(intBits).uppercase(Locale.ROOT)
}
private fun doubleToBinary(number: Double): String {
val longBits = java.lang.Double.doubleToLongBits(number)
return java.lang.Long.toBinaryString(longBits)
}
private fun floatToBinary(number: Float): String {
val intBits = java.lang.Float.floatToIntBits(number)
return Integer.toBinaryString(intBits)
}
}
}

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?attr/colorSurfaceVariant" />
<corners
android:topLeftRadius="0dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="16dp"
android:bottomRightRadius="16dp" />
</shape>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?attr/colorSurfaceVariant" />
<corners
android:topLeftRadius="16dp"
android:topRightRadius="16dp"
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp" />
</shape>

View file

@ -0,0 +1,383 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg">
<LinearLayout
android:id="@+id/mainContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="32dp"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/bg"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginBottom="32dp"
android:orientation="vertical">
<TextView
android:id="@+id/display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"
android:background="@drawable/rounded_top_corners"
android:gravity="end"
android:maxLines="1"
android:textColor="?attr/colorOnSurfaceVariant"
android:textSize="48sp"
tools:ignore="ButtonStyle,HardcodedText" />
<TextView
android:id="@+id/displayBinary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="2dp"
android:layout_marginEnd="32dp"
android:background="?attr/colorSurfaceVariant"
android:gravity="end"
android:maxLines="1"
android:textColor="?attr/colorOnSurfaceVariant"
android:textSize="28sp"
tools:ignore="ButtonStyle,HardcodedText" />
<TextView
android:id="@+id/displayHex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="2dp"
android:layout_marginEnd="32dp"
android:background="@drawable/rounded_bottom_corners"
android:gravity="end"
android:maxLines="1"
android:textColor="?attr/colorOnSurfaceVariant"
android:textSize="28sp"
tools:ignore="ButtonStyle,HardcodedText" />
</LinearLayout>
<FrameLayout
android:id="@+id/fillerLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<Button
android:id="@+id/button7"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="7"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/button8"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="8"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/button9"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="9"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonDivide"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:backgroundTint="?attr/colorPrimary"
android:elegantTextHeight="true"
android:text="÷"
android:textColor="?attr/colorOnPrimary"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<Button
android:id="@+id/button4"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="4"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/button5"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="5"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/button6"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="6"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonMultiply"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:backgroundTint="?attr/colorPrimary"
android:elegantTextHeight="true"
android:text="×"
android:textColor="?attr/colorOnPrimary"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<Button
android:id="@+id/button1"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="1"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/button2"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="2"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/button3"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="3"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonSubtract"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:backgroundTint="?attr/colorPrimary"
android:elegantTextHeight="true"
android:text=""
android:textColor="?attr/colorOnPrimary"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<Button
android:id="@+id/button0"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="0"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonDot"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="."
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonBackspace"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:backgroundTint="?attr/colorSurfaceVariant"
android:elegantTextHeight="true"
android:text="⌫"
android:textColor="?attr/colorOnSurfaceVariant"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonAdd"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="16dp"
android:backgroundTint="?attr/colorPrimary"
android:elegantTextHeight="true"
android:text="+"
android:textColor="?attr/colorOnPrimary"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<Button
android:id="@+id/buttonClear"
android:layout_width="70dp"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="?attr/colorPrimary"
android:elegantTextHeight="true"
android:text="C"
android:textColor="?attr/colorOnPrimary"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
<Button
android:id="@+id/buttonEquals"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_gravity="bottom|end"
android:layout_marginTop="16dp"
android:backgroundTint="?attr/colorPrimary"
android:elegantTextHeight="true"
android:text="="
android:textColor="?attr/colorOnPrimary"
app:cornerRadius="16dp"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="ButtonStyle,HardcodedText" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</FrameLayout>

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/passwordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/enter_password"
android:maxLength="32"
android:inputType="numberPassword" />
<EditText
android:id="@+id/confirmPasswordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/confirm_password"
android:inputType="numberPassword"
android:maxLength="32"
android:layout_marginTop="16dp" />
</LinearLayout>

View file

@ -557,7 +557,7 @@
<!-- theme 9 -->
<color name="seed_9">#c9000b</color>
<color name="md_theme_light_9_primary">#FF9800</color>
<color name="md_theme_light_9_onPrimary">#FFFFFF</color>
<color name="md_theme_light_9_onPrimary">#201A19</color>
<color name="md_theme_light_9_primaryContainer">#FFCF87</color>
<color name="md_theme_light_9_onPrimaryContainer">#410001</color>
<color name="md_theme_light_9_secondary">#FF5722</color>
@ -587,7 +587,7 @@
<color name="md_theme_light_9_outlineVariant">#D8C2BE</color>
<color name="md_theme_light_9_scrim">#000000</color>
<color name="md_theme_dark_9_primary">#FFB343</color>
<color name="md_theme_dark_9_onPrimary">#FAE965</color>
<color name="md_theme_dark_9_onPrimary">#322E0A</color>
<color name="md_theme_dark_9_primaryContainer">#FF6600</color>
<color name="md_theme_dark_9_onPrimaryContainer">#FFDAD5</color>
<color name="md_theme_dark_9_secondary">#FF7700</color>

View file

@ -1020,4 +1020,8 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc
<string name="failed_to_fix">Failed to fix</string>
<string name="running_fixes">Running Fixes…</string>
<string name="test_search">Test Search</string>
<string name="app_lock">App Lock</string>
<string name="app_lock_desc">Lock the app with a password\n( ͡° ͜ʖ ͡°)</string>
<string name="confirm_password">Confirm Password</string>
<string name="password_mismatch">Passwords do not match or are empty!</string>
</resources>