Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean up welcome and notification details compose views #1902

Merged
merged 2 commits into from Nov 11, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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