diff --git a/app/ui/build.gradle.kts b/app/ui/build.gradle.kts index 8dba97e5e..2eecdca73 100644 --- a/app/ui/build.gradle.kts +++ b/app/ui/build.gradle.kts @@ -82,7 +82,6 @@ dependencies { implementation(libs.androidx.compose.material3) implementation(libs.androidx.compose.animation) implementation(libs.androidx.compose.animationgraphics) - implementation(libs.androidx.constraintlayout.compose) implementation(libs.androidx.navigation3.runtime) implementation(libs.androidx.navigation3.ui) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/AndroidView.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/AndroidView.kt deleted file mode 100644 index 474900098..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/AndroidView.kt +++ /dev/null @@ -1,222 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import android.view.View -import android.view.ViewGroup -import android.widget.FrameLayout -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.ListView -import android.widget.RelativeLayout -import android.widget.TextView -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.heightIn -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.widthIn -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.composed -import androidx.compose.ui.draw.drawBehind -import androidx.compose.ui.draw.drawWithContent -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.graphics.nativeCanvas -import androidx.compose.ui.platform.LocalDensity -import androidx.core.view.children -import androidx.lifecycle.compose.LocalLifecycleOwner -import kotlin.math.roundToInt - -/** - * A reimplementation of View using composables. - * Only views that are supported by RemoteViews are supported here. - */ -@Composable -fun ComposeAndroidView( - view: () -> View, - modifier: Modifier = Modifier -) { - var view_ by remember { mutableStateOf(null) } - - val lifecycleOwner = LocalLifecycleOwner.current - DisposableEffect(Unit) { - view_ = view() - onDispose { - view_ = null - } - } - if (view_ != null) { - ComposeAndroidView(view_!!, modifier) - } -} - -@Composable -fun ComposeAndroidView( - view: View, - modifier: Modifier = Modifier -) { - if (view.visibility == View.GONE) { - return - } - - if (view.visibility == View.INVISIBLE) { - Spacer(modifier = modifier) - } - - val mod = modifier.view(view) - - when (view) { - is FrameLayout -> ComposeFrameLayout(view, mod) - is LinearLayout -> ComposeLinearLayout(view, mod) - is RelativeLayout -> ComposeRelativeLayout(view, mod) - is ImageButton -> ComposeImageButton(view, mod) - is ListView -> ComposeListView(view, mod) - is TextView -> ComposeTextView(view, mod) - is ImageView -> ComposeImageView(view, mod) - is ViewGroup -> { - Column(modifier = mod) { - for (child in view.children) { - ComposeAndroidView( - child, - modifier = Modifier.layoutParams(child.layoutParams) - ) - } - Text(view.javaClass.toString(), modifier = mod) - } - } - - else -> Text(view.javaClass.toString(), modifier = mod) - } -} - -internal fun Modifier.view(view: View): Modifier = this then Modifier.composed { - val density = LocalDensity.current - val backgroundDrawable = view.background - val background = when (backgroundDrawable) { - is ColorDrawable -> Modifier.background(Color(backgroundDrawable.color)) - is Drawable -> Modifier.drawBehind { - backgroundDrawable.setBounds( - 0, 0, size.width.roundToInt(), size.height.roundToInt() - ) - backgroundDrawable.draw(this.drawContext.canvas.nativeCanvas) - } - - else -> Modifier - } - - val foregroundDrawable = view.foreground - val foreground = if (foregroundDrawable != null) { - Modifier.drawWithContent { - drawContent() - foregroundDrawable.setBounds( - 0, 0, size.width.roundToInt(), size.height.roundToInt() - ) - foregroundDrawable.draw(this.drawContext.canvas.nativeCanvas) - } - } else Modifier - - val padding = with(density) { - Modifier.padding( - start = view.paddingStart.toDp(), - top = view.paddingTop.toDp(), - end = view.paddingEnd.toDp(), - bottom = view.paddingBottom.toDp() - ) - } - - val clickable = when { - view.isClickable || view.isLongClickable -> Modifier.combinedClickable( - enabled = view.isEnabled, - onClick = { - if (view.isClickable) view.performClick() - }, - onLongClick = { view.performLongClick() } - ) - - view.isClickable -> Modifier.clickable( - enabled = view.isEnabled, - onClick = { view.performClick() } - ) - - else -> Modifier - } - - val graphicsLayer = Modifier.graphicsLayer { - translationX = view.translationX - translationY = view.translationY - rotationX = view.rotationX - rotationY = view.rotationY - rotationZ = view.rotation - scaleX = view.scaleX - scaleY = view.scaleY - shadowElevation = view.elevation - cameraDistance = view.cameraDistance - } - - val minWidth = if (view.minimumWidth > 0) - Modifier.widthIn( - min = with(density) { view.minimumWidth.toDp() } - ) - else Modifier - - val minHeight = if (view.minimumHeight > 0) - Modifier.heightIn( - min = with(density) { view.minimumHeight.toDp() } - ) - else Modifier - - - minWidth then minHeight then - background then foreground then - clickable then padding then graphicsLayer -} - - -internal fun Modifier.layoutParams(params: ViewGroup.LayoutParams?) = this then Modifier.composed { - params ?: return@composed Modifier - val density = LocalDensity.current - - val margins = if (params is ViewGroup.MarginLayoutParams) { - with(density) { - Modifier.padding( - start = params.marginStart.coerceAtLeast(0).toDp(), - top = params.topMargin.coerceAtLeast(0).toDp(), - end = params.marginEnd.coerceAtLeast(0).toDp(), - bottom = params.bottomMargin.coerceAtLeast(0).toDp() - ) - } - } else { - Modifier - } - - val width = when (params.width) { - ViewGroup.LayoutParams.MATCH_PARENT -> Modifier.fillMaxWidth() - ViewGroup.LayoutParams.WRAP_CONTENT -> Modifier.wrapContentWidth() - else -> Modifier.width(with(density) { params.width.toDp() }) - } - - val height = when (params.height) { - ViewGroup.LayoutParams.MATCH_PARENT -> Modifier.fillMaxHeight() - ViewGroup.LayoutParams.WRAP_CONTENT -> Modifier.wrapContentHeight() - else -> Modifier.height(with(density) { params.height.toDp() }) - } - - margins then width then height -} \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/FrameLayout.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/FrameLayout.kt deleted file mode 100644 index 14e556a46..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/FrameLayout.kt +++ /dev/null @@ -1,52 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.view.Gravity -import android.view.ViewGroup -import android.widget.FrameLayout -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.core.view.children - - -@Composable -internal fun ComposeFrameLayout( - view: FrameLayout, - modifier: Modifier, -) { - Box( - modifier = modifier, - contentAlignment = Alignment.TopStart, - ) { - for (child in view.children) { - ComposeAndroidView( - child, - modifier = Modifier.frameLayoutChild( - this@Box, - child.layoutParams - ) - ) - } - } -} - -private fun Modifier.frameLayoutChild(scope: BoxScope, params: ViewGroup.LayoutParams) = this then - Modifier.layoutParams(params) then - with(scope) { - if (params !is FrameLayout.LayoutParams) return@with Modifier - val alignment = when (params.gravity and (Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK or Gravity.VERTICAL_GRAVITY_MASK)) { - Gravity.START or Gravity.TOP -> Alignment.TopStart - Gravity.START or Gravity.BOTTOM -> Alignment.BottomStart - Gravity.END or Gravity.TOP -> Alignment.TopEnd - Gravity.END or Gravity.BOTTOM -> Alignment.BottomEnd - Gravity.START or Gravity.CENTER_VERTICAL -> Alignment.CenterStart - Gravity.END or Gravity.CENTER_VERTICAL -> Alignment.CenterEnd - Gravity.CENTER_HORIZONTAL or Gravity.TOP -> Alignment.TopCenter - Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM -> Alignment.BottomCenter - Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL -> Alignment.Center - else -> Alignment.TopStart - } - Modifier.align(alignment) - } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ImageButton.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ImageButton.kt deleted file mode 100644 index ec1dd2c16..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ImageButton.kt +++ /dev/null @@ -1,50 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.graphics.BlendModeColorFilter -import android.graphics.ColorMatrixColorFilter -import android.widget.ImageButton -import android.widget.ImageView -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.ColorMatrix -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.layout.ContentScale -import coil.compose.AsyncImage - -@Composable -internal fun ComposeImageButton( - view: ImageButton, - modifier: Modifier, -) { - AsyncImage( - modifier = modifier.alpha(view.imageAlpha / 255f), - model = view.drawable, - contentDescription = view.contentDescription?.toString(), - contentScale = when (view.scaleType) { - ImageView.ScaleType.CENTER -> ContentScale.None - ImageView.ScaleType.FIT_XY -> ContentScale.FillBounds - ImageView.ScaleType.FIT_START, - ImageView.ScaleType.FIT_CENTER, - ImageView.ScaleType.FIT_END -> ContentScale.Fit - - ImageView.ScaleType.CENTER_CROP -> ContentScale.Crop - ImageView.ScaleType.CENTER_INSIDE -> ContentScale.Inside - else -> ContentScale.None - }, - alignment = when (view.scaleType) { - ImageView.ScaleType.FIT_XY, - ImageView.ScaleType.CENTER, - ImageView.ScaleType.FIT_CENTER, - ImageView.ScaleType.CENTER_CROP, - ImageView.ScaleType.CENTER_INSIDE -> Alignment.Center - - ImageView.ScaleType.FIT_START -> Alignment.TopStart - ImageView.ScaleType.FIT_END -> Alignment.BottomEnd - else -> Alignment.Center - }, - ) -} diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ImageView.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ImageView.kt deleted file mode 100644 index 76d560a82..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ImageView.kt +++ /dev/null @@ -1,43 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.widget.ImageView -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.layout.ContentScale -import coil.compose.AsyncImage - -@Composable -internal fun ComposeImageView( - view: ImageView, - modifier: Modifier, -) { - AsyncImage( - modifier = modifier.alpha(view.imageAlpha / 255f), - model = view.drawable, - contentDescription = view.contentDescription?.toString(), - contentScale = when (view.scaleType) { - ImageView.ScaleType.CENTER -> ContentScale.None - ImageView.ScaleType.FIT_XY -> ContentScale.FillBounds - ImageView.ScaleType.FIT_START, - ImageView.ScaleType.FIT_CENTER, - ImageView.ScaleType.FIT_END -> ContentScale.Fit - - ImageView.ScaleType.CENTER_CROP -> ContentScale.Crop - ImageView.ScaleType.CENTER_INSIDE -> ContentScale.Inside - else -> ContentScale.None - }, - alignment = when (view.scaleType) { - ImageView.ScaleType.FIT_XY, - ImageView.ScaleType.CENTER, - ImageView.ScaleType.FIT_CENTER, - ImageView.ScaleType.CENTER_CROP, - ImageView.ScaleType.CENTER_INSIDE -> Alignment.Center - - ImageView.ScaleType.FIT_START -> Alignment.TopStart - ImageView.ScaleType.FIT_END -> Alignment.BottomEnd - else -> Alignment.Center - }, - ) -} diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/LinearLayout.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/LinearLayout.kt deleted file mode 100644 index 55fc11620..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/LinearLayout.kt +++ /dev/null @@ -1,121 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.view.Gravity -import android.view.ViewGroup -import android.widget.LinearLayout -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.RowScope -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.core.view.children - -@Composable -internal fun ComposeLinearLayout( - view: LinearLayout, - modifier: Modifier, -) { - - if (view.orientation == LinearLayout.VERTICAL) { - val horizontalAlignment = when (view.gravity and Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) { - Gravity.START -> Alignment.Start - Gravity.CENTER_HORIZONTAL -> Alignment.CenterHorizontally - Gravity.END -> Alignment.End - else -> Alignment.CenterHorizontally - } - val verticalArrangement = when (view.gravity and Gravity.VERTICAL_GRAVITY_MASK) { - Gravity.TOP -> Arrangement.Top - Gravity.CENTER_VERTICAL -> Arrangement.Center - Gravity.BOTTOM -> Arrangement.Bottom - else -> Arrangement.Top - } - Column( - modifier = modifier, - horizontalAlignment = horizontalAlignment, - verticalArrangement = verticalArrangement, - ) { - for (child in view.children) { - ComposeAndroidView( - child, - modifier = Modifier.linearLayoutChild( - this@Column, - child.layoutParams - ) - ) - } - } - } else { - val horizontalArrangement = - when (view.gravity and Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) { - Gravity.START -> Arrangement.Start - Gravity.CENTER_HORIZONTAL -> Arrangement.Center - Gravity.END -> Arrangement.End - else -> Arrangement.Start - } - val verticalAlignment = when (view.gravity and Gravity.VERTICAL_GRAVITY_MASK) { - Gravity.TOP -> Alignment.Top - Gravity.CENTER_VERTICAL -> Alignment.CenterVertically - Gravity.BOTTOM -> Alignment.Bottom - else -> Alignment.CenterVertically - } - Row( - modifier = modifier, - verticalAlignment = verticalAlignment, - horizontalArrangement = horizontalArrangement, - ) { - for (child in view.children) { - ComposeAndroidView( - child, - modifier = Modifier.linearLayoutChild( - this@Row, - child.layoutParams, - ) - ) - } - } - } -} - -private fun Modifier.linearLayoutChild(scope: RowScope, params: ViewGroup.LayoutParams) = this then - Modifier.layoutParams(params) then - with(scope) { - if (params !is LinearLayout.LayoutParams) return@with Modifier - val alignment = when (params.gravity and Gravity.VERTICAL_GRAVITY_MASK) { - Gravity.TOP -> Modifier.align(Alignment.Top) - Gravity.CENTER_VERTICAL -> Modifier.align(Alignment.CenterVertically) - Gravity.BOTTOM -> Modifier.align(Alignment.Bottom) - else -> Modifier - } - - val weight = if ((params.weight) > 0f) { - Modifier.weight(params.weight) - } else { - Modifier - } - - alignment then weight - } - -private fun Modifier.linearLayoutChild(scope: ColumnScope, params: ViewGroup.LayoutParams) = - this then - Modifier.layoutParams(params) then - with(scope) { - if (params !is LinearLayout.LayoutParams) return@with Modifier - val alignment = when (params.gravity and Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) { - Gravity.START -> Modifier.align(Alignment.Start) - Gravity.CENTER_HORIZONTAL -> Modifier.align(Alignment.CenterHorizontally) - Gravity.END -> Modifier.align(Alignment.End) - else -> Modifier - } - - val weight = if ((params.weight) > 0f) { - Modifier.weight(params.weight) - } else { - Modifier - } - - alignment then weight - } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ListView.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ListView.kt deleted file mode 100644 index 852f0853a..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ListView.kt +++ /dev/null @@ -1,33 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.widget.ListView -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import de.mm20.launcher2.ui.ktx.toDp - -@Composable -fun ComposeListView( - view: ListView, - modifier: Modifier, -) { - val adapter = view.adapter ?: return - LazyColumn( - modifier = modifier, - ) { - items( - adapter.count, - contentType = { adapter.getItemViewType(it) }, - ) { index -> - val itemView = adapter.getView(index, null, view) - ComposeAndroidView( - itemView, - modifier = Modifier - .padding(top = if (index != 0) view.dividerHeight.toDp() else 0.dp) - .layoutParams(itemView.layoutParams) - ) - } - } -} \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ProgressBar.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ProgressBar.kt deleted file mode 100644 index ed52c8636..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/ProgressBar.kt +++ /dev/null @@ -1,19 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.widget.ProgressBar -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color - -@Composable -internal fun ComposeProgressBar( - view: ProgressBar, - modifier: Modifier, -) { - CircularProgressIndicator( - color = view.progressTintList?.defaultColor?.let { Color(it) } ?: MaterialTheme.colorScheme.primary, - modifier = modifier, - ) -} \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/RelativeLayout.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/RelativeLayout.kt deleted file mode 100644 index 269766f95..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/RelativeLayout.kt +++ /dev/null @@ -1,158 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.RelativeLayout -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.constraintlayout.compose.ConstrainedLayoutReference -import androidx.constraintlayout.compose.ConstraintLayout -import androidx.constraintlayout.compose.ConstraintLayoutScope -import androidx.core.view.children - -@Composable -internal fun ComposeRelativeLayout( - view: RelativeLayout, - modifier: Modifier, -) { - ConstraintLayout( - modifier = modifier, - ) { - val refs = view.children.filterNot { it.id == View.NO_ID }.associate { it.id to createRef() } - for (child in view.children) { - ComposeAndroidView( - child, - modifier = Modifier.relativeLayoutChild( - this@ConstraintLayout, - child.layoutParams, - child.id, - refs, - ) - ) - } - } -} - -private fun Modifier.relativeLayoutChild( - scope: ConstraintLayoutScope, - params: ViewGroup.LayoutParams, - id: Int, - refs: Map -) = this then - Modifier.layoutParams(params) then - with(scope) { - if (params !is RelativeLayout.LayoutParams) return@with Modifier - val ref = refs[id] ?: return@with Modifier - Modifier.constrainAs(ref) { - val above = refs[params.getRule(RelativeLayout.ABOVE)] - if (above != null) { - bottom.linkTo(above.top) - } - - val alignBaseline = refs[params.getRule(RelativeLayout.ALIGN_BASELINE)] - if (alignBaseline != null) { - baseline.linkTo(alignBaseline.baseline) - } - - val alignBottom = refs[params.getRule(RelativeLayout.ALIGN_BOTTOM)] - if (alignBottom != null) { - bottom.linkTo(alignBottom.bottom) - } - - val alignEnd = refs[params.getRule(RelativeLayout.ALIGN_END)] - if (alignEnd != null) { - end.linkTo(alignEnd.end) - } - - val alignLeft = refs[params.getRule(RelativeLayout.ALIGN_LEFT)] - if (alignLeft != null) { - absoluteLeft.linkTo(alignLeft.absoluteLeft) - } - - val alignParentBottom = params.getRule(RelativeLayout.ALIGN_PARENT_BOTTOM) - if (alignParentBottom == RelativeLayout.TRUE) { - bottom.linkTo(parent.bottom) - } - - val alignParentEnd = params.getRule(RelativeLayout.ALIGN_PARENT_END) - if (alignParentEnd == RelativeLayout.TRUE) { - end.linkTo(parent.end) - } - - val alignParentLeft = params.getRule(RelativeLayout.ALIGN_PARENT_LEFT) - if (alignParentLeft == RelativeLayout.TRUE) { - absoluteLeft.linkTo(parent.absoluteLeft) - } - - val alignParentRight = params.getRule(RelativeLayout.ALIGN_PARENT_RIGHT) - if (alignParentRight == RelativeLayout.TRUE) { - absoluteRight.linkTo(parent.absoluteRight) - } - - val alignParentStart = params.getRule(RelativeLayout.ALIGN_PARENT_START) - if (alignParentStart == RelativeLayout.TRUE) { - start.linkTo(parent.start) - } - - val alignParentTop = params.getRule(RelativeLayout.ALIGN_PARENT_TOP) - if (alignParentTop == RelativeLayout.TRUE) { - top.linkTo(parent.top) - } - - val alignRight = refs[params.getRule(RelativeLayout.ALIGN_RIGHT)] - if (alignRight != null) { - absoluteRight.linkTo(alignRight.absoluteRight) - } - - val alignStart = refs[params.getRule(RelativeLayout.ALIGN_START)] - if (alignStart != null) { - start.linkTo(alignStart.start) - } - - val alignTop = refs[params.getRule(RelativeLayout.ALIGN_TOP)] - if (alignTop != null) { - top.linkTo(alignTop.top) - } - - val below = refs[params.getRule(RelativeLayout.BELOW)] - if (below != null) { - top.linkTo(below.bottom) - } - - val centerHorizontal = params.getRule(RelativeLayout.CENTER_HORIZONTAL) - if (centerHorizontal == RelativeLayout.TRUE) { - centerHorizontallyTo(parent) - } - - val centerInParent = params.getRule(RelativeLayout.CENTER_IN_PARENT) - if (centerInParent == RelativeLayout.TRUE) { - centerTo(parent) - } - - val centerVertical = params.getRule(RelativeLayout.CENTER_VERTICAL) - if (centerVertical == RelativeLayout.TRUE) { - centerVerticallyTo(parent) - } - - val toEndOf = refs[params.getRule(RelativeLayout.END_OF)] - if (toEndOf != null) { - start.linkTo(toEndOf.end) - } - - val toLeftOf = refs[params.getRule(RelativeLayout.LEFT_OF)] - if (toLeftOf != null) { - absoluteRight.linkTo(toLeftOf.absoluteLeft) - } - - val toRightOf = refs[params.getRule(RelativeLayout.RIGHT_OF)] - if (toRightOf != null) { - absoluteLeft.linkTo(toRightOf.absoluteRight) - } - - val toStartOf = refs[params.getRule(RelativeLayout.START_OF)] - if (toStartOf != null) { - end.linkTo(toStartOf.start) - } - } - } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/TextView.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/TextView.kt deleted file mode 100644 index 155962069..000000000 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/view/TextView.kt +++ /dev/null @@ -1,69 +0,0 @@ -package de.mm20.launcher2.ui.component.view - -import android.widget.TextView -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.text.font.DeviceFontFamilyName -import androidx.compose.ui.text.font.Font -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import de.mm20.launcher2.ktx.isAtLeastApiLevel - -@Composable -internal fun ComposeTextView( - view: TextView, - modifier: Modifier, -) { - val density = LocalDensity.current - Text( - text = view.text.toString(), - color = Color(view.textColors.defaultColor), - style = MaterialTheme.typography.bodyMedium, - lineHeight = with(density) { - view.lineHeight.toSp() - }, - maxLines = view.maxLines.coerceAtLeast(1), - modifier = modifier, - textAlign = when (view.textAlignment) { - TextView.TEXT_ALIGNMENT_CENTER -> TextAlign.Center - TextView.TEXT_ALIGNMENT_TEXT_START -> TextAlign.Start - TextView.TEXT_ALIGNMENT_TEXT_END -> TextAlign.End - else -> TextAlign.Start - }, - letterSpacing = with(density) { - view.letterSpacing.toSp() - }, - fontStyle = if (view.typeface.isItalic) { - FontStyle.Italic - } else { - FontStyle.Normal - }, - fontSize = with(density) { - view.textSize.toSp() - }, - fontWeight = if (isAtLeastApiLevel(28)) { - FontWeight(view.typeface.weight) - } else if (view.typeface.isBold) { - FontWeight.Bold - } else { - FontWeight.Normal - }, - minLines = view.minLines.coerceAtLeast(1), - fontFamily = if (isAtLeastApiLevel(34)) { - view.typeface?.systemFontFamilyName?.let { - try { - FontFamily(Font(DeviceFontFamilyName(it))) - } catch (e: IllegalArgumentException) { - null - } - } - } else null - - ) -} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8d35a7412..4b5ebe009 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,7 +31,6 @@ androidx-work = "2.11.2" androidx-browser = "1.10.0" androidx-palette = "1.0.0" androidx-room = "2.8.4" -androidx-constraint-layout = "1.1.2" androidx-emojipicker = "1.6.0" accompanist = "0.36.0" @@ -91,7 +90,6 @@ androidx-palette = { group = "androidx.palette", name = "palette", version.ref = haze = {group = "dev.chrisbanes.haze", name = "haze", version.ref = "haze" } -androidx-constraintlayout-compose = { group = "androidx.constraintlayout", name = "constraintlayout-compose", version.ref = "androidx-constraint-layout" } androidx-exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version = "1.4.2" } androidx-securitycrypto = { group = "androidx.security", name = "security-crypto", version = "1.1.0" } androidx-datastore = { group = "androidx.datastore", name = "datastore", version = "1.2.1" }