diff --git a/app/src/androidTest/java/dev/msfjarvis/lobsters/MainActivityTest.kt b/app/src/androidTest/java/dev/msfjarvis/lobsters/MainActivityTest.kt deleted file mode 100644 index 33ff077f..00000000 --- a/app/src/androidTest/java/dev/msfjarvis/lobsters/MainActivityTest.kt +++ /dev/null @@ -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() - 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()) - 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()) - LobstersTheme { - TodoApp( - items, - items::add, - items::remove, - ) - } - } - onNodeWithText("Item 1").assertDoesNotExist() - onNodeWithTag("fab").performClick() - onNodeWithTag("add_button").performClick() - onNodeWithText("Item 1").assertDoesNotExist() - } - } -} diff --git a/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt index 2629db86..ab159edf 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt @@ -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 { 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, - 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, - 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, - ) - } -} -*/ diff --git a/app/src/main/java/dev/msfjarvis/lobsters/di/PersistenceModule.kt b/app/src/main/java/dev/msfjarvis/lobsters/di/PersistenceModule.kt deleted file mode 100644 index 9358ff9f..00000000 --- a/app/src/main/java/dev/msfjarvis/lobsters/di/PersistenceModule.kt +++ /dev/null @@ -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() - } -} diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/AnimatedSwipeDismiss.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/AnimatedSwipeDismiss.kt deleted file mode 100644 index d9298948..00000000 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/AnimatedSwipeDismiss.kt +++ /dev/null @@ -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 AnimatedSwipeDismiss( - modifier: Modifier = Modifier, - item: T, - background: @Composable (isDismissed: Boolean) -> Unit, - content: @Composable (isDismissed: Boolean) -> Unit, - directions: Set = 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) } - ) - } -} diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/ListContent.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/ListContent.kt deleted file mode 100644 index b214cbce..00000000 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/ListContent.kt +++ /dev/null @@ -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, - 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), - ) - } -} diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/TodoRow.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/TodoRow.kt deleted file mode 100644 index 4901ab85..00000000 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/TodoRow.kt +++ /dev/null @@ -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), - ) - }, - ) - } -} diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/model/TodoItem.kt b/data/src/main/java/dev/msfjarvis/lobsters/data/model/TodoItem.kt deleted file mode 100644 index be98f082..00000000 --- a/data/src/main/java/dev/msfjarvis/lobsters/data/model/TodoItem.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.msfjarvis.lobsters.data.model - -import androidx.room.Entity -import androidx.room.PrimaryKey -import java.time.LocalDateTime -import java.time.ZoneId - -@Entity( - tableName = "todo_items", -) -data class TodoItem( - @PrimaryKey val title: String, - val time: LocalDateTime = LocalDateTime.now(ZoneId.of("GMT")), -) diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/TodoDatabase.kt b/data/src/main/java/dev/msfjarvis/lobsters/data/source/TodoDatabase.kt deleted file mode 100644 index c9c8c9e9..00000000 --- a/data/src/main/java/dev/msfjarvis/lobsters/data/source/TodoDatabase.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.msfjarvis.lobsters.data.source - -import androidx.room.Database -import androidx.room.RoomDatabase -import androidx.room.TypeConverters -import dev.msfjarvis.lobsters.data.model.TodoItem - -@Database( - entities = [ - TodoItem::class, - ], - version = 1, - exportSchema = false, -) -@TypeConverters(DateTimeTypeConverters::class) -abstract class TodoDatabase : RoomDatabase() { - abstract fun todoItemsDao(): TodoItemDao -} diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/TodoItemDao.kt b/data/src/main/java/dev/msfjarvis/lobsters/data/source/TodoItemDao.kt deleted file mode 100644 index b831cf85..00000000 --- a/data/src/main/java/dev/msfjarvis/lobsters/data/source/TodoItemDao.kt +++ /dev/null @@ -1,35 +0,0 @@ -package dev.msfjarvis.lobsters.data.source - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Update -import dev.msfjarvis.lobsters.data.model.TodoItem -import kotlinx.coroutines.flow.Flow - -/** - * Room [Dao] for [TodoItem] - */ -@Dao -abstract class TodoItemDao { - - @Query("SELECT * FROM todo_items") - abstract fun getAllItems(): Flow> - - @Insert(onConflict = OnConflictStrategy.REPLACE) - abstract suspend fun insert(entity: TodoItem): Long - - @Insert(onConflict = OnConflictStrategy.REPLACE) - abstract suspend fun insertAll(vararg entity: TodoItem) - - @Insert(onConflict = OnConflictStrategy.REPLACE) - abstract suspend fun insertAll(entities: Collection) - - @Update(onConflict = OnConflictStrategy.REPLACE) - abstract suspend fun update(entity: TodoItem) - - @Delete - abstract suspend fun delete(entity: TodoItem): Int -}