From 733491ceda8d52295229ea845a19884d987b0cdf Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sun, 12 Dec 2021 21:10:08 +0100 Subject: [PATCH] Use Compose calculator UI --- .../ui/legacy/component/CalculatorView.kt | 59 +++++------- .../launcher2/ui/search/CalculatorItem.kt | 92 ++++++++----------- .../launcher2/ui/search/CalculatorResults.kt | 40 ++++++++ ui/src/main/res/layout/view_calculator.xml | 56 +---------- 4 files changed, 104 insertions(+), 143 deletions(-) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorResults.kt diff --git a/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/CalculatorView.kt b/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/CalculatorView.kt index 8b21b015..f49b3ebd 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/CalculatorView.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/CalculatorView.kt @@ -6,12 +6,21 @@ import android.view.LayoutInflater import android.view.View import android.widget.FrameLayout import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import de.mm20.launcher2.ui.R import de.mm20.launcher2.calculator.CalculatorViewModel import de.mm20.launcher2.search.data.Calculator +import de.mm20.launcher2.ui.LegacyLauncherTheme import de.mm20.launcher2.ui.databinding.ViewCalculatorBinding +import de.mm20.launcher2.ui.search.CalculatorItem +import de.mm20.launcher2.ui.search.UnitConverterItem import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.math.round @@ -32,45 +41,23 @@ class CalculatorView : FrameLayout { if (it == null) visibility = View.GONE else { visibility = View.VISIBLE - bind(it) } }) - } - - private fun bind(calc: Calculator) { - - binding.calculatorTerm.text = beautifyTerm(calc.term) - binding.calculatorSolution.text = context.getString(R.string.calculator_solution, calc.formattedString) - if (calc.solution == round(calc.solution) && calc.term.matches(Regex("[0-9]+"))) { - val binHexOct = StringBuilder() - binHexOct.append(calc.formattedBinaryString).append("\n") - .append(calc.formattedOctString).append("\n") - .append(calc.formattedHexString) - binding.calculatorSolutionHexBinOct.text = binHexOct.toString() - binding.calculatorSolutionHexBinOct.visibility = View.VISIBLE - binding.calculatorLabelHexBinOct.visibility = View.VISIBLE - } else { - binding.calculatorSolutionHexBinOct.visibility = GONE - binding.calculatorLabelHexBinOct.visibility = GONE + binding.composeView.setContent { + val converter by calculator.observeAsState() + LegacyLauncherTheme { + // TODO: Temporary solution until parent widget card is rewritten in Compose + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurface) { + Column { + converter?.let { + CalculatorItem( + calculator = it, + ) + } + } + } + } } } - - private fun beautifyTerm(term: String): String { - return term.replace(Regex("\\s+"), "") - .replace("pi", " \u03C0 ", ignoreCase = true) - .replace("*", " \u00D7 ") - .replace("-", " \u2212 ") - .replace("/", " \u2215 ") - .replace("+", " + ") - .replace(Regex("&{1,2}"), " \u2227 ") - .replace(Regex("\\|{1,2}"), " \u2228 ") - .replace("!=", " \u2260 ") - .replace("<>", " \u2260 ") - .replace(">=", " \u2265 ") - .replace("<=", " \u2264 ") - .replace("=", " = ") - .replace("<", " < ") - .replace(">", " > ") - } } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorItem.kt index 50e39763..6e906c5b 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorItem.kt @@ -3,71 +3,57 @@ package de.mm20.launcher2.ui.search import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyListScope -import androidx.compose.material.Card import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import de.mm20.launcher2.calculator.CalculatorViewModel -import de.mm20.launcher2.ui.component.SectionDivider -import org.koin.androidx.compose.getViewModel +import de.mm20.launcher2.search.data.Calculator @Composable -fun calculatorItem(): LazyListScope.() -> Unit { - val viewModel: CalculatorViewModel = getViewModel() - val calculator by viewModel.calculator.observeAsState() - return { - calculator?.let { - item { - Card( - elevation = 0.dp - ) { - Column( - modifier = Modifier - .padding(16.dp) - .fillMaxWidth() - ) { +fun CalculatorItem( + calculator: Calculator +) { + Column( + modifier = Modifier + .padding(16.dp) + .fillMaxWidth() + ) { - CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { - Text(it.getBeatifiedTerm()) - } - Text( - text = "= ${it.formattedString}", - style = MaterialTheme.typography.titleLarge, - modifier = Modifier.align(Alignment.End), - ) - if (it.term.matches(Regex("(0x|0b)?[0-9]+"))) { - Text( - it.formattedBinaryString, - fontFamily = FontFamily.Monospace, - modifier = Modifier - .align(Alignment.End) - .padding(top = 8.dp), - ) - Text( - it.formattedHexString, - fontFamily = FontFamily.Monospace, - modifier = Modifier.align(Alignment.End), - ) - Text( - it.formattedOctString, - fontFamily = FontFamily.Monospace, - modifier = Modifier.align(Alignment.End), - ) - } - } - } - } - SectionDivider() + CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { + Text( + text = calculator.getBeatifiedTerm(), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) + } + Text( + text = "= ${calculator.formattedString}", + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.align(Alignment.End), + ) + if (calculator.term.matches(Regex("(0x|0b)?[0-9]+"))) { + Text( + calculator.formattedBinaryString, + style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace), + modifier = Modifier + .align(Alignment.End) + .padding(top = 8.dp), + ) + Text( + calculator.formattedHexString, + style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace), + modifier = Modifier.align(Alignment.End), + ) + Text( + calculator.formattedOctString, + style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace), + modifier = Modifier.align(Alignment.End), + ) } } } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorResults.kt b/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorResults.kt new file mode 100644 index 00000000..564c412b --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/search/CalculatorResults.kt @@ -0,0 +1,40 @@ +package de.mm20.launcher2.ui.search + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material.Card +import androidx.compose.material.ContentAlpha +import androidx.compose.material.LocalContentAlpha +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.unit.dp +import de.mm20.launcher2.calculator.CalculatorViewModel +import de.mm20.launcher2.ui.component.SectionDivider +import org.koin.androidx.compose.getViewModel + +@Composable +fun calculatorItem(): LazyListScope.() -> Unit { + val viewModel: CalculatorViewModel = getViewModel() + val calculator by viewModel.calculator.observeAsState() + return { + calculator?.let { + item { + Card( + elevation = 0.dp + ) { + CalculatorItem(it) + } + } + SectionDivider() + } + } +} \ No newline at end of file diff --git a/ui/src/main/res/layout/view_calculator.xml b/ui/src/main/res/layout/view_calculator.xml index f4ae3b37..10b09407 100644 --- a/ui/src/main/res/layout/view_calculator.xml +++ b/ui/src/main/res/layout/view_calculator.xml @@ -10,60 +10,8 @@ android:clipToPadding="false" android:elevation="@dimen/card_elevation"> - - - - - - - - - - + android:id="@+id/composeView"/> \ No newline at end of file