all: remove now unused to-do app code

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-09-23 03:32:32 +05:30
parent 63f5bea155
commit 06549bad2c
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
9 changed files with 0 additions and 451 deletions

View file

@ -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()
}
}
}

View file

@ -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,
)
}
}
*/

View file

@ -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()
}
}

View file

@ -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) }
)
}
}

View file

@ -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),
)
}
}

View file

@ -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),
)
},
)
}
}