Skip to content

Commit

Permalink
Clean up welcome and notification details compose views (#1902)
Browse files Browse the repository at this point in the history
* Clean up welcome and notification details compose views

* Remove parcel data as its not necessary
  • Loading branch information
dshokouhi committed Nov 11, 2021
1 parent 27627fa commit 55a9c51
Show file tree
Hide file tree
Showing 5 changed files with 218 additions and 191 deletions.
Expand Up @@ -5,36 +5,13 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.fragment.app.Fragment
import com.google.android.material.composethemeadapter.MdcTheme
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.onboarding.discovery.DiscoveryFragment
import io.homeassistant.companion.android.onboarding.manual.ManualSetupFragment
import io.homeassistant.companion.android.onboarding.views.WelcomeView

class WelcomeFragment : Fragment() {

Expand All @@ -52,97 +29,31 @@ class WelcomeFragment : Fragment() {
return ComposeView(requireContext()).apply {
setContent {
MdcTheme {
WelcomeSection()
}
}
}
}

@Composable
private fun WelcomeSection() {
Column(
verticalArrangement = Arrangement.Center
) {
Image(
painter = painterResource(id = R.drawable.app_icon),
contentDescription = stringResource(
id = R.string.app_name
),
modifier = Modifier
.size(width = 274.dp, height = 202.dp)
.align(Alignment.CenterHorizontally)
.padding(bottom = 15.dp)
)
Text(
fontSize = 19.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
text = stringResource(R.string.welcome_hass),
modifier = Modifier
.align(Alignment.CenterHorizontally)
)
Text(
fontSize = 17.sp,
text = stringResource(R.string.welcome_hass_desc),
modifier = Modifier
.padding(bottom = 15.dp, start = 30.dp, end = 20.dp, top = 10.dp)
)
val annotatedString = buildAnnotatedString {
pushStringAnnotation("learn", "https://www.home-assistant.io")
withStyle(
style = SpanStyle(
color = MaterialTheme.colors.primary,
textDecoration = TextDecoration.Underline
WelcomeView(
onContinue = { welcomeNavigation() }
)
) {
append(stringResource(id = R.string.learn_more))
}
pop()
}
val uriHandler = LocalUriHandler.current
ClickableText(
text = annotatedString,
onClick = {
annotatedString.getStringAnnotations("learn", it, it).firstOrNull()?.let { link ->
uriHandler.openUri(link.item)
}
},
modifier = Modifier
.padding(bottom = 15.dp)
.align(Alignment.CenterHorizontally)
)

Button(
onClick = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val discoveryFragment = DiscoveryFragment.newInstance()
discoveryFragment.retainInstance = true
parentFragmentManager
.beginTransaction()
.replace(R.id.content, discoveryFragment)
.addToBackStack("Welcome")
.commit()
} else {
val manualFragment = ManualSetupFragment.newInstance()
manualFragment.retainInstance = true
parentFragmentManager
.beginTransaction()
.replace(R.id.content, manualFragment)
.addToBackStack("Welcome")
.commit()
}
},
modifier = Modifier
.align(Alignment.CenterHorizontally)
) {
Text(text = stringResource(id = R.string.continue_connect))
}
}
}

@Composable
@Preview
private fun PreviewWelcome() {
WelcomeSection()
private fun welcomeNavigation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val discoveryFragment = DiscoveryFragment.newInstance()
discoveryFragment.retainInstance = true
parentFragmentManager
.beginTransaction()
.replace(R.id.content, discoveryFragment)
.addToBackStack("Welcome")
.commit()
} else {
val manualFragment = ManualSetupFragment.newInstance()
manualFragment.retainInstance = true
parentFragmentManager
.beginTransaction()
.replace(R.id.content, manualFragment)
.addToBackStack("Welcome")
.commit()
}
}
}
@@ -0,0 +1,103 @@
package io.homeassistant.companion.android.onboarding.views

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.ClickableText
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.homeassistant.companion.android.R

@Composable
fun WelcomeView(
onContinue: () -> Unit
) {
val scrollState = rememberScrollState()
Column(
verticalArrangement = Arrangement.Center,
modifier = Modifier.verticalScroll(scrollState)
) {
Image(
painter = painterResource(id = R.drawable.app_icon),
contentDescription = stringResource(
id = R.string.app_name
),
modifier = Modifier
.size(width = 274.dp, height = 202.dp)
.align(Alignment.CenterHorizontally)
.padding(bottom = 15.dp)
)
Text(
fontSize = 19.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
text = stringResource(R.string.welcome_hass),
modifier = Modifier
.align(Alignment.CenterHorizontally)
)
Text(
fontSize = 17.sp,
text = stringResource(R.string.welcome_hass_desc),
modifier = Modifier
.padding(bottom = 15.dp, start = 30.dp, end = 20.dp, top = 10.dp)
)
val annotatedString = buildAnnotatedString {
pushStringAnnotation("learn", "https://www.home-assistant.io")
withStyle(
style = SpanStyle(
color = MaterialTheme.colors.primary,
textDecoration = TextDecoration.Underline
)
) {
append(stringResource(id = R.string.learn_more))
}
pop()
}
val uriHandler = LocalUriHandler.current
ClickableText(
text = annotatedString,
onClick = {
annotatedString.getStringAnnotations("learn", it, it).firstOrNull()?.let { link ->
uriHandler.openUri(link.item)
}
},
modifier = Modifier
.padding(bottom = 15.dp)
.align(Alignment.CenterHorizontally)
)

Button(
onClick = onContinue,
modifier = Modifier
.align(Alignment.CenterHorizontally)
) {
Text(text = stringResource(id = R.string.continue_connect))
}
}
}

@Composable
@Preview
private fun PreviewWelcome() {
WelcomeView(onContinue = {})
}
Expand Up @@ -3,35 +3,18 @@ package io.homeassistant.companion.android.settings.notification
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.text.Html.fromHtml
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.fragment.app.Fragment
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.ObjectMapper
import com.google.android.material.composethemeadapter.MdcTheme
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.database.notification.NotificationItem
import kotlinx.android.parcel.Parcelize
import java.util.Calendar
import java.util.GregorianCalendar
import io.homeassistant.companion.android.settings.notification.views.LoadNotification

class NotificationDetailFragment(
private val notification: NotificationItem
Expand Down Expand Up @@ -83,69 +66,6 @@ class NotificationDetailFragment(
}
}

@Parcelize
data class NotificationData(val received: Long, val message: String, val data: String) : Parcelable

@Composable
private fun LoadNotification(notification: NotificationItem) {
val notificationItem = rememberSaveable {
NotificationData(notification.received, notification.message, notification.data)
}

Column {
Text(
text = getString(R.string.notification_received_at),
fontWeight = FontWeight.ExtraBold,
fontSize = 20.sp,
modifier = Modifier
.padding(top = 30.dp, bottom = 20.dp, start = 10.dp)
)
val cal: Calendar = GregorianCalendar()
cal.timeInMillis = notificationItem.received
Text(
text = cal.time.toString(),
modifier = Modifier
.padding(start = 20.dp)
)
Text(
text = getString(R.string.notification_message),
fontWeight = FontWeight.ExtraBold,
fontSize = 20.sp,
modifier = Modifier
.padding(top = 20.dp, bottom = 20.dp, start = 10.dp)
)
AndroidView(factory = { context ->
TextView(context).apply {
text = fromHtml(notificationItem.message)
setPadding(80, 0, 0, 0)
textSize = 16f
}
})
Text(
text = getString(R.string.notification_data),
fontWeight = FontWeight.ExtraBold,
fontSize = 20.sp,
modifier = Modifier
.padding(top = 20.dp, bottom = 20.dp, start = 10.dp)
)
val notifData =
try {
val mapper = ObjectMapper()
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
val jsonObject = mapper.readValue(notificationItem.data, Object::class.java)
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject)
} catch (e: Exception) {
notificationItem.data
}

Text(
text = notifData,
modifier = Modifier
.padding(start = 20.dp)
)
}
}

private fun deleteConfirmation() {
val notificationDao = AppDatabase.getInstance(requireContext()).notificationDao()

Expand Down

0 comments on commit 55a9c51

Please sign in to comment.