mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 00:57:02 +05:30
all: remove now unused to-do app code
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
63f5bea155
commit
06549bad2c
9 changed files with 0 additions and 451 deletions
|
@ -1,81 +0,0 @@
|
|||
package dev.msfjarvis.lobsters
|
||||
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.ui.test.assertIsDisplayed
|
||||
import androidx.ui.test.createComposeRule
|
||||
import androidx.ui.test.onNodeWithTag
|
||||
import androidx.ui.test.onNodeWithText
|
||||
import androidx.ui.test.performClick
|
||||
import androidx.ui.test.performTextInput
|
||||
import dev.msfjarvis.lobsters.data.model.TodoItem
|
||||
import dev.msfjarvis.lobsters.ui.LobstersTheme
|
||||
import org.junit.Ignore
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
|
||||
@Ignore("This shit is absolutely fucked")
|
||||
class MainActivityTest {
|
||||
|
||||
@get:Rule
|
||||
val composeTestRule = createComposeRule()
|
||||
|
||||
@Test
|
||||
fun item_add_dialog_shows_on_fab_click() {
|
||||
composeTestRule.apply {
|
||||
setContent {
|
||||
LobstersTheme {
|
||||
val items = arrayListOf<TodoItem>()
|
||||
TodoApp(
|
||||
items,
|
||||
items::add,
|
||||
items::remove,
|
||||
)
|
||||
}
|
||||
}
|
||||
onNodeWithTag("fab").performClick()
|
||||
onNodeWithTag("item_dialog").assertIsDisplayed()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun item_addition_adds_new_entry() {
|
||||
composeTestRule.apply {
|
||||
setContent {
|
||||
val items by mutableStateOf(arrayListOf<TodoItem>())
|
||||
LobstersTheme {
|
||||
TodoApp(
|
||||
items,
|
||||
items::add,
|
||||
items::remove,
|
||||
)
|
||||
}
|
||||
}
|
||||
onNodeWithText("Item 1").assertDoesNotExist()
|
||||
onNodeWithTag("fab").performClick()
|
||||
onNodeWithTag("item_name").performTextInput("Item 1")
|
||||
onNodeWithTag("add_button").performClick()
|
||||
onNodeWithText("Item 1").assertIsDisplayed()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun item_addition_with_empty_name_does_not_add_new_entry() {
|
||||
composeTestRule.apply {
|
||||
setContent {
|
||||
val items by mutableStateOf(arrayListOf<TodoItem>())
|
||||
LobstersTheme {
|
||||
TodoApp(
|
||||
items,
|
||||
items::add,
|
||||
items::remove,
|
||||
)
|
||||
}
|
||||
}
|
||||
onNodeWithText("Item 1").assertDoesNotExist()
|
||||
onNodeWithTag("fab").performClick()
|
||||
onNodeWithTag("add_button").performClick()
|
||||
onNodeWithText("Item 1").assertDoesNotExist()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,39 +3,19 @@ package dev.msfjarvis.lobsters
|
|||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.foundation.Text
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumnFor
|
||||
import androidx.compose.material.AlertDialog
|
||||
import androidx.compose.material.Button
|
||||
import androidx.compose.material.FloatingActionButton
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.material.OutlinedTextField
|
||||
import androidx.compose.material.Scaffold
|
||||
import androidx.compose.material.TopAppBar
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.MutableState
|
||||
import androidx.compose.runtime.Providers
|
||||
import androidx.compose.runtime.ambientOf
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.setContent
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.input.TextFieldValue
|
||||
import androidx.compose.ui.unit.dp
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import dev.msfjarvis.lobsters.api.LobstersApi
|
||||
import dev.msfjarvis.lobsters.compose.utils.IconResource
|
||||
import dev.msfjarvis.lobsters.data.model.TodoItem
|
||||
import dev.msfjarvis.lobsters.data.source.TodoDatabase
|
||||
import dev.msfjarvis.lobsters.model.LobstersPost
|
||||
import dev.msfjarvis.lobsters.ui.ListContent
|
||||
import dev.msfjarvis.lobsters.ui.LobstersItem
|
||||
import dev.msfjarvis.lobsters.ui.LobstersTheme
|
||||
import dev.msfjarvis.lobsters.urllauncher.UrlLauncher
|
||||
|
@ -49,7 +29,6 @@ val UrlLauncherAmbient = ambientOf<UrlLauncher> { error("Needs to be provided")
|
|||
|
||||
@AndroidEntryPoint
|
||||
class MainActivity : AppCompatActivity() {
|
||||
@Inject lateinit var database: TodoDatabase
|
||||
@Inject lateinit var urlLauncher: UrlLauncher
|
||||
@Inject lateinit var apiClient: LobstersApi
|
||||
|
||||
|
@ -77,15 +56,6 @@ class MainActivity : AppCompatActivity() {
|
|||
})
|
||||
}
|
||||
LobstersApp(posts)
|
||||
/*
|
||||
val itemsDao = database.todoItemsDao()
|
||||
val items by itemsDao.getAllItems().collectAsState(initial = emptyList())
|
||||
TodoApp(
|
||||
items,
|
||||
{ item -> coroutineScope.launch { itemsDao.insert(item) } },
|
||||
{ item -> coroutineScope.launch { itemsDao.delete(item) } },
|
||||
)
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,98 +79,3 @@ fun LobstersApp(
|
|||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun TodoApp(
|
||||
items: List<TodoItem>,
|
||||
onAdd: (item: TodoItem) -> Unit,
|
||||
onDelete: (item: TodoItem) -> Unit,
|
||||
) {
|
||||
val showingDialog = remember { mutableStateOf(false) }
|
||||
val urlLauncher = UrlLauncherAmbient.current
|
||||
|
||||
if (showingDialog.value) {
|
||||
ItemAddDialog(
|
||||
showingDialog = showingDialog,
|
||||
onAdd = onAdd,
|
||||
modifier = Modifier.testTag("item_dialog")
|
||||
)
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = { TopAppBar({ Text(text = stringResource(R.string.app_name)) }) },
|
||||
floatingActionButton = {
|
||||
FloatingActionButton(
|
||||
onClick = { showingDialog.value = true },
|
||||
elevation = 8.dp,
|
||||
modifier = Modifier.testTag("fab")
|
||||
) {
|
||||
IconResource(
|
||||
resourceId = R.drawable.ic_exposure_plus_1_24dp,
|
||||
tint = MaterialTheme.colors.onSecondary,
|
||||
)
|
||||
}
|
||||
},
|
||||
bodyContent = {
|
||||
ListContent(
|
||||
innerPadding = PaddingValues(start = 8.dp, end = 8.dp),
|
||||
items = items,
|
||||
onSwipe = onDelete::invoke,
|
||||
onClick = { urlLauncher.launch(it.title) },
|
||||
modifier = Modifier.padding(top = 16.dp),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ItemAddDialog(
|
||||
showingDialog: MutableState<Boolean>,
|
||||
onAdd: (item: TodoItem) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
var newItemName by mutableStateOf(TextFieldValue(""))
|
||||
val hideDialog = { showingDialog.value = false }
|
||||
AlertDialog(
|
||||
onDismissRequest = hideDialog,
|
||||
text = {
|
||||
OutlinedTextField(
|
||||
activeColor = MaterialTheme.colors.secondary,
|
||||
value = newItemName,
|
||||
onValueChange = { newItemName = it },
|
||||
label = { Text(text = "Name") },
|
||||
modifier = Modifier.testTag("item_name")
|
||||
)
|
||||
},
|
||||
confirmButton = {
|
||||
Button(
|
||||
onClick = {
|
||||
if (newItemName.text.isNotEmpty()) {
|
||||
onAdd.invoke(TodoItem(newItemName.text))
|
||||
newItemName = TextFieldValue("")
|
||||
hideDialog.invoke()
|
||||
}
|
||||
},
|
||||
modifier = Modifier.testTag("add_button")
|
||||
) {
|
||||
Text(text = "Add")
|
||||
}
|
||||
},
|
||||
modifier = Modifier then modifier,
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
@Preview
|
||||
@Composable
|
||||
fun PreviewApp() {
|
||||
LobstersTheme {
|
||||
val items = arrayListOf(TodoItem("Item 1"))
|
||||
TodoApp(
|
||||
items,
|
||||
items::add,
|
||||
items::remove,
|
||||
)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
package dev.msfjarvis.lobsters.di
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Room
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import dev.msfjarvis.lobsters.data.source.TodoDatabase
|
||||
|
||||
@InstallIn(SingletonComponent::class)
|
||||
@Module
|
||||
object PersistenceModule {
|
||||
@Provides
|
||||
fun provideItemsDatabase(@ApplicationContext context: Context): TodoDatabase {
|
||||
return Room.databaseBuilder(context, TodoDatabase::class.java, "data.db")
|
||||
.fallbackToDestructiveMigration().build()
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
package dev.msfjarvis.lobsters.ui
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.EnterTransition
|
||||
import androidx.compose.animation.ExitTransition
|
||||
import androidx.compose.animation.ExperimentalAnimationApi
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.animation.expandVertically
|
||||
import androidx.compose.animation.shrinkVertically
|
||||
import androidx.compose.material.DismissDirection
|
||||
import androidx.compose.material.DismissValue
|
||||
import androidx.compose.material.ExperimentalMaterialApi
|
||||
import androidx.compose.material.SwipeToDismiss
|
||||
import androidx.compose.material.rememberDismissState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.onCommit
|
||||
import androidx.compose.ui.Modifier
|
||||
|
||||
@OptIn(ExperimentalAnimationApi::class, ExperimentalMaterialApi::class)
|
||||
@Composable
|
||||
fun <T> AnimatedSwipeDismiss(
|
||||
modifier: Modifier = Modifier,
|
||||
item: T,
|
||||
background: @Composable (isDismissed: Boolean) -> Unit,
|
||||
content: @Composable (isDismissed: Boolean) -> Unit,
|
||||
directions: Set<DismissDirection> = setOf(DismissDirection.EndToStart),
|
||||
enter: EnterTransition = expandVertically(),
|
||||
exit: ExitTransition = shrinkVertically(
|
||||
animSpec = tween(
|
||||
durationMillis = 500,
|
||||
)
|
||||
),
|
||||
onDismiss: (T) -> Unit
|
||||
) {
|
||||
val dismissState = rememberDismissState()
|
||||
val isDismissed = dismissState.isDismissed(DismissDirection.EndToStart)
|
||||
|
||||
onCommit(dismissState.value) {
|
||||
if (dismissState.value == DismissValue.DismissedToStart) {
|
||||
onDismiss(item)
|
||||
}
|
||||
}
|
||||
|
||||
AnimatedVisibility(
|
||||
modifier = modifier,
|
||||
visible = !isDismissed,
|
||||
enter = enter,
|
||||
exit = exit
|
||||
) {
|
||||
SwipeToDismiss(
|
||||
modifier = modifier,
|
||||
state = dismissState,
|
||||
directions = directions,
|
||||
background = { background(isDismissed) },
|
||||
dismissContent = { content(isDismissed) }
|
||||
)
|
||||
}
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
package dev.msfjarvis.lobsters.ui
|
||||
|
||||
import androidx.compose.animation.animate
|
||||
import androidx.compose.foundation.Box
|
||||
import androidx.compose.foundation.ContentGravity
|
||||
import androidx.compose.foundation.Icon
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumnFor
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.DismissDirection
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Delete
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import dev.msfjarvis.lobsters.data.model.TodoItem
|
||||
|
||||
@Composable
|
||||
fun ListContent(
|
||||
innerPadding: PaddingValues,
|
||||
items: List<TodoItem>,
|
||||
onSwipe: (TodoItem) -> Unit,
|
||||
onClick: (TodoItem) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
LazyColumnFor(
|
||||
modifier = modifier.padding(innerPadding),
|
||||
items = items,
|
||||
) { item ->
|
||||
AnimatedSwipeDismiss(
|
||||
item = item,
|
||||
background = { isDismissed ->
|
||||
Box(
|
||||
modifier = Modifier.background(shape = RoundedCornerShape(8.dp), color = Color.Red)
|
||||
.fillMaxSize(),
|
||||
paddingStart = 20.dp,
|
||||
paddingEnd = 20.dp,
|
||||
gravity = ContentGravity.CenterEnd
|
||||
) {
|
||||
val alpha = animate(if (isDismissed) 0f else 1f)
|
||||
Icon(Icons.Filled.Delete, tint = Color.White.copy(alpha = alpha))
|
||||
}
|
||||
},
|
||||
content = { TodoRowItem(item, onClick) },
|
||||
onDismiss = { onSwipe(it) },
|
||||
directions = setOf(DismissDirection.EndToStart, DismissDirection.StartToEnd),
|
||||
)
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
package dev.msfjarvis.lobsters.ui
|
||||
|
||||
import androidx.compose.foundation.Text
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyItemScope
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.Card
|
||||
import androidx.compose.material.ListItem
|
||||
import androidx.compose.material.ripple.RippleIndication
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import dev.msfjarvis.lobsters.data.model.TodoItem
|
||||
|
||||
@Composable
|
||||
fun LazyItemScope.TodoRowItem(
|
||||
item: TodoItem,
|
||||
onClick: (TodoItem) -> Unit,
|
||||
) {
|
||||
Card(
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
modifier = Modifier.fillParentMaxWidth()
|
||||
.clickable(
|
||||
onClick = { onClick.invoke(item) },
|
||||
indication = RippleIndication()
|
||||
),
|
||||
) {
|
||||
ListItem(
|
||||
modifier = Modifier.padding(vertical = 8.dp)
|
||||
.fillParentMaxWidth(),
|
||||
text = {
|
||||
Text(
|
||||
text = item.title,
|
||||
style = TextStyle(
|
||||
fontSize = 20.sp,
|
||||
textAlign = TextAlign.Center
|
||||
),
|
||||
modifier = Modifier.padding(16.dp),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue