diff --git a/app/build.gradle b/app/build.gradle index 9fd3fbf..af3ca8b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,7 @@ android { minSdk 27 targetSdk 33 versionCode 1 - versionName "e1.0.0.b6" + versionName "e1.0.0.b7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -56,8 +56,10 @@ dependencies { def nav_version = "2.7.4" //Fragment def fragment_version = "1.6.1" + + implementation 'androidx.appcompat:appcompat:1.6.1' implementation "androidx.activity:activity-ktx:$activity_version" - implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2' implementation 'androidx.activity:activity-compose:1.8.0' implementation platform('androidx.compose:compose-bom:2023.03.00') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a65e438..dc4d621 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,10 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/MainActivity.kt b/app/src/main/java/com/menagerie/ophelia/MainActivity.kt index 0eb5196..3549945 100644 --- a/app/src/main/java/com/menagerie/ophelia/MainActivity.kt +++ b/app/src/main/java/com/menagerie/ophelia/MainActivity.kt @@ -1,8 +1,10 @@ package com.menagerie.ophelia import android.os.Bundle +import android.view.Window import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.material3.Surface import com.menagerie.ophelia.database.polycule.PolyculeApplication import com.menagerie.ophelia.database.polycule.PolyculeDatabaseManager import com.menagerie.ophelia.ui.theme.OpheliaTheme @@ -11,11 +13,14 @@ import com.menagerie.ophelia.view.PolyculeApp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContent { OpheliaTheme { val repository = (application as PolyculeApplication).repository PolyculeDatabaseManager.polyculeRepository = repository - PolyculeApp() + Surface { + PolyculeApp() + } } } } diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabase.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabase.kt index 1b99dd1..12ef002 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabase.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabase.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.launch @Database( - version = 2, + version = 3, exportSchema = false, entities = [ Bio::class @@ -50,49 +50,28 @@ abstract class PolyculeDatabase : RoomDatabase() { private class PolyculeDatabaseCallback( private val scope: CoroutineScope ) : Callback() { - override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) INSTANCE?.let { database -> scope.launch { - populateDatabase(database.bioDao()) + //populateDatabase(database.bioDao()) } } } suspend fun populateDatabase(bioDao: BioDao) { - var desc = LoremIpsum(15).values.toList() - var init = "" - repeat(desc.size) { - init += ("${desc[it]} ") - } - var bio = Bio( name = "Azea", - description = init, ) bioDao.insert(bio) - desc = LoremIpsum(17).values.toList() - init = "" - repeat(desc.size) { - init += ("${desc[it]} ") - } - bio = Bio( name = "Darkwood Mill", - description = init, ) bioDao.insert(bio) - desc = LoremIpsum(42).values.toList() - init = "" - repeat(desc.size) { - init += ("${desc[it]} ") - } bio = Bio( name = "Blizzard", - description = init, ) bioDao.insert(bio) } diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabaseManager.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabaseManager.kt index a119475..e89bc9d 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabaseManager.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeDatabaseManager.kt @@ -1,11 +1,5 @@ package com.menagerie.ophelia.database.polycule -import com.menagerie.ophelia.database.polycule.entity.Bio object PolyculeDatabaseManager { - lateinit var polyculeRepository: PolyculeRepository - - suspend fun post(bio: Bio) { - polyculeRepository.upsertBio(bio) - } } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeRepository.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeRepository.kt index bee114f..011ecc6 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeRepository.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/PolyculeRepository.kt @@ -1,5 +1,8 @@ package com.menagerie.ophelia.database.polycule +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.asLiveData import com.menagerie.ophelia.database.polycule.entity.Bio import com.menagerie.ophelia.database.polycule.entity.BioDao import kotlinx.coroutines.flow.Flow @@ -8,14 +11,14 @@ class PolyculeRepository( private val bioDao: BioDao ) { suspend fun upsertBio(bio: Bio) { - return bioDao.upsert(bio) + bioDao.upsert(bio) } fun getAlphabetisedBios(): Flow> { return bioDao.getAllAlphabetisedBios() } - fun getBio(bioId: Int): Flow { + fun getBio(bioId: Long): Flow { return bioDao.getBio(bioId) } @@ -31,4 +34,5 @@ class PolyculeRepository( bioDao.delete(bio) } + fun hasPolycule() = false } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Bio.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Bio.kt index 8c8e0ee..23063c9 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Bio.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Bio.kt @@ -9,8 +9,12 @@ import com.menagerie.ophelia.R tableName = "bio_table", ) data class Bio( - @PrimaryKey(autoGenerate = true) val id: Int = 0, - @ColumnInfo(name = "name") val name: String = "", - @ColumnInfo(name = "description") val description: String = "", + @PrimaryKey(autoGenerate = true) val id: Long = 0, + @ColumnInfo(name = "name") var name: String = "", + @ColumnInfo(name = "subject_pronoun") val subjective: String = "", + @ColumnInfo(name = "object_pronoun") val objective: String = "", + @ColumnInfo(name = "possess_pronoun") val possessive: String = "", + @ColumnInfo(name = "reflex_pronoun") val reflexive: String = "", + @ColumnInfo(name="tags") var tags: Int = 0, @ColumnInfo(name = "pfpRes") val pfpRes: Int = R.drawable.ic_app_logo, ) \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/BioDao.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/BioDao.kt index febd7ea..efc1099 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/BioDao.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/BioDao.kt @@ -12,13 +12,13 @@ import kotlinx.coroutines.flow.Flow abstract class BioDao { @Insert - abstract suspend fun insert(newBio: Bio) + abstract suspend fun insert(newBio: Bio): Long @Delete abstract suspend fun delete(bio: Bio) @Update - abstract suspend fun update(existingBio: Bio): Int + abstract suspend fun update(existingBio: Bio) @Query("SELECT * FROM bio_table ORDER BY name ASC") abstract fun getAllAlphabetisedBios(): Flow> @@ -27,8 +27,8 @@ abstract class BioDao { abstract fun getAllBios(): Flow> @Query("SELECT * FROM bio_table WHERE id = :bioId") - abstract fun getBio(bioId: Int): Flow + abstract fun getBio(bioId: Long): Flow @Upsert - abstract suspend fun upsert(bio: Bio) + abstract suspend fun upsert(bio: Bio): Long } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Identity.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Identity.kt deleted file mode 100644 index c2ed523..0000000 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/Identity.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.menagerie.ophelia.database.polycule.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity( - foreignKeys = [ - - ], - indices = [ - - ] -) -class Identity ( - @PrimaryKey(autoGenerate = true) val id: Long = 0, - val name: String = "", - ) \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/IdentityDao.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/IdentityDao.kt deleted file mode 100644 index 3b524aa..0000000 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/IdentityDao.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.menagerie.ophelia.database.polycule.entity - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.Query -import androidx.room.Update - -@Dao -abstract class IdentityDao { - @Insert - abstract suspend fun insert(identity: Identity): Long - - @Update - abstract suspend fun update(idenity: Identity) - - @Query("SELECT * FROM Identity WHERE id = :uniqueId") - abstract suspend fun findByIdentity(uniqueId: Int): Identity? - - -} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioDetailViewModel.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioDetailViewModel.kt index 6f17c45..b89ac55 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioDetailViewModel.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioDetailViewModel.kt @@ -5,24 +5,8 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.asLiveData import com.menagerie.ophelia.database.polycule.PolyculeDatabaseManager -class BioDetailViewModel() : ViewModel() { - - private var bioId: Int = 0 - var bio = PolyculeDatabaseManager.polyculeRepository.getBio(bioId).asLiveData() - - fun setBio(bioId: Int) { - this.bioId = bioId - bio = PolyculeDatabaseManager.polyculeRepository.getBio(bioId).asLiveData() - } - - class BioDetailViewModelFactory() : - ViewModelProvider.Factory { - override fun create(modelClass: Class, ): T { - if (modelClass.isAssignableFrom(BioDetailViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return BioDetailViewModel() as T - } - throw IllegalArgumentException("Unknown ViewModel Class") - } - } +class BioDetailViewModel( + id: Long +) : ViewModel() { + var bio = PolyculeDatabaseManager.polyculeRepository.getBio(id).asLiveData() } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioListViewModel.kt b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioListViewModel.kt index 83e4ebc..48cc364 100644 --- a/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioListViewModel.kt +++ b/app/src/main/java/com/menagerie/ophelia/database/polycule/entity/viewmodel/BioListViewModel.kt @@ -1,6 +1,8 @@ package com.menagerie.ophelia.database.polycule.entity.viewmodel +import android.util.Log import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.asLiveData @@ -33,4 +35,15 @@ class BioListViewModel() : ViewModel() { throw IllegalArgumentException("Unknown ViewModel Class") } } -} \ No newline at end of file + class InputBioViewModel : ViewModel() { + private val _bio: MutableLiveData = MutableLiveData(Bio()) + val bio: LiveData = _bio + fun onNameChange(name: String) { + val newBio = Bio( + name = name, + ) + _bio.value = newBio + } + } +} + diff --git a/app/src/main/java/com/menagerie/ophelia/ui/theme/Color.kt b/app/src/main/java/com/menagerie/ophelia/ui/theme/Color.kt index ee64671..e388112 100644 --- a/app/src/main/java/com/menagerie/ophelia/ui/theme/Color.kt +++ b/app/src/main/java/com/menagerie/ophelia/ui/theme/Color.kt @@ -1,11 +1,65 @@ package com.menagerie.ophelia.ui.theme - import androidx.compose.ui.graphics.Color -val Purple80 = Color(0xFFFF00FF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) +val md_theme_light_primary = Color(0xFF366A21) +val md_theme_light_onPrimary = Color(0xFFFFFFFF) +val md_theme_light_primaryContainer = Color(0xFFB6F398) +val md_theme_light_onPrimaryContainer = Color(0xFF052100) +val md_theme_light_secondary = Color(0xFF55624C) +val md_theme_light_onSecondary = Color(0xFFFFFFFF) +val md_theme_light_secondaryContainer = Color(0xFFD8E7CB) +val md_theme_light_onSecondaryContainer = Color(0xFF131F0D) +val md_theme_light_tertiary = Color(0xFF386667) +val md_theme_light_onTertiary = Color(0xFFFFFFFF) +val md_theme_light_tertiaryContainer = Color(0xFFBBEBEC) +val md_theme_light_onTertiaryContainer = Color(0xFF002021) +val md_theme_light_error = Color(0xFFBA1A1A) +val md_theme_light_errorContainer = Color(0xFFFFDAD6) +val md_theme_light_onError = Color(0xFFFFFFFF) +val md_theme_light_onErrorContainer = Color(0xFF410002) +val md_theme_light_background = Color(0xFFFDFDF6) +val md_theme_light_onBackground = Color(0xFF1A1C18) +val md_theme_light_outline = Color(0xFF73796E) +val md_theme_light_inverseOnSurface = Color(0xFFF1F1EA) +val md_theme_light_inverseSurface = Color(0xFF2F312D) +val md_theme_light_inversePrimary = Color(0xFF9BD67F) +val md_theme_light_surfaceTint = Color(0xFF366A21) +val md_theme_light_outlineVariant = Color(0xFFC3C8BB) +val md_theme_light_scrim = Color(0xFF000000) +val md_theme_light_surface = Color(0xFFD8D8C4) +val md_theme_light_onSurface = Color(0xFF1A1C18) +val md_theme_light_surfaceVariant = Color(0xFFDFE4D7) +val md_theme_light_onSurfaceVariant = Color(0xFF43483F) -val Purple40 = Color(0x0000FF22) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val md_theme_dark_primary = Color(0xFF9BD67F) +val md_theme_dark_onPrimary = Color(0xFF0E3900) +val md_theme_dark_primaryContainer = Color(0xFF1E5108) +val md_theme_dark_onPrimaryContainer = Color(0xFFB6F398) +val md_theme_dark_secondary = Color(0xFFBCCBB0) +val md_theme_dark_onSecondary = Color(0xFF273421) +val md_theme_dark_secondaryContainer = Color(0xFF3D4B36) +val md_theme_dark_onSecondaryContainer = Color(0xFFD8E7CB) +val md_theme_dark_tertiary = Color(0xFFA0CFD0) +val md_theme_dark_onTertiary = Color(0xFF003738) +val md_theme_dark_tertiaryContainer = Color(0xFF1E4E4F) +val md_theme_dark_onTertiaryContainer = Color(0xFFBBEBEC) +val md_theme_dark_error = Color(0xFFFFB4AB) +val md_theme_dark_errorContainer = Color(0xFF93000A) +val md_theme_dark_onError = Color(0xFF690005) +val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6) +val md_theme_dark_background = Color(0xFF1C1C18) +val md_theme_dark_onBackground = Color(0xFFE3E3DC) +val md_theme_dark_outline = Color(0xFF8D9287) +val md_theme_dark_inverseOnSurface = Color(0xFF1A1C18) +val md_theme_dark_inverseSurface = Color(0xFFE3E3DC) +val md_theme_dark_inversePrimary = Color(0xFF366A21) +val md_theme_dark_surfaceTint = Color(0xFF9BD67F) +val md_theme_dark_outlineVariant = Color(0xFF43483F) +val md_theme_dark_scrim = Color(0xFF000000) +val md_theme_dark_surface = Color(0xFF2B2822) +val md_theme_dark_onSurface = Color(0xFFC6C7C0) +val md_theme_dark_surfaceVariant = Color(0xFF43483F) +val md_theme_dark_onSurfaceVariant = Color(0xFFC3C8BB) + + +val seed = Color(0xFF5E9546) \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/ui/theme/Theme.kt b/app/src/main/java/com/menagerie/ophelia/ui/theme/Theme.kt index c1fa312..a27b901 100644 --- a/app/src/main/java/com/menagerie/ophelia/ui/theme/Theme.kt +++ b/app/src/main/java/com/menagerie/ophelia/ui/theme/Theme.kt @@ -1,44 +1,93 @@ package com.menagerie.ophelia.ui.theme import android.app.Activity -import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.core.view.WindowCompat -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 -) private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 + primary = md_theme_light_primary, + onPrimary = md_theme_light_onPrimary, + primaryContainer = md_theme_light_primaryContainer, + onPrimaryContainer = md_theme_light_onPrimaryContainer, + secondary = md_theme_light_secondary, + onSecondary = md_theme_light_onSecondary, + secondaryContainer = md_theme_light_secondaryContainer, + onSecondaryContainer = md_theme_light_onSecondaryContainer, + tertiary = md_theme_light_tertiary, + onTertiary = md_theme_light_onTertiary, + tertiaryContainer = md_theme_light_tertiaryContainer, + onTertiaryContainer = md_theme_light_onTertiaryContainer, + error = md_theme_light_error, + errorContainer = md_theme_light_errorContainer, + onError = md_theme_light_onError, + onErrorContainer = md_theme_light_onErrorContainer, + background = md_theme_light_background, + onBackground = md_theme_light_onBackground, + outline = md_theme_light_outline, + inverseOnSurface = md_theme_light_inverseOnSurface, + inverseSurface = md_theme_light_inverseSurface, + inversePrimary = md_theme_light_inversePrimary, + surfaceTint = md_theme_light_surfaceTint, + outlineVariant = md_theme_light_outlineVariant, + scrim = md_theme_light_scrim, + surface = md_theme_light_surface, + onSurface = md_theme_light_onSurface, + surfaceVariant = md_theme_light_surfaceVariant, + onSurfaceVariant = md_theme_light_onSurfaceVariant, +) + + +private val DarkColorScheme = darkColorScheme( + primary = md_theme_dark_primary, + onPrimary = md_theme_dark_onPrimary, + primaryContainer = md_theme_dark_primaryContainer, + onPrimaryContainer = md_theme_dark_onPrimaryContainer, + secondary = md_theme_dark_secondary, + onSecondary = md_theme_dark_onSecondary, + secondaryContainer = md_theme_dark_secondaryContainer, + onSecondaryContainer = md_theme_dark_onSecondaryContainer, + tertiary = md_theme_dark_tertiary, + onTertiary = md_theme_dark_onTertiary, + tertiaryContainer = md_theme_dark_tertiaryContainer, + onTertiaryContainer = md_theme_dark_onTertiaryContainer, + error = md_theme_dark_error, + errorContainer = md_theme_dark_errorContainer, + onError = md_theme_dark_onError, + onErrorContainer = md_theme_dark_onErrorContainer, + background = md_theme_dark_background, + onBackground = md_theme_dark_onBackground, + outline = md_theme_dark_outline, + inverseOnSurface = md_theme_dark_inverseOnSurface, + inverseSurface = md_theme_dark_inverseSurface, + inversePrimary = md_theme_dark_inversePrimary, + surfaceTint = md_theme_dark_surfaceTint, + outlineVariant = md_theme_dark_outlineVariant, + scrim = md_theme_dark_scrim, + surface = md_theme_dark_surface, + onSurface = md_theme_dark_onSurface, + surfaceVariant = md_theme_dark_surfaceVariant, + onSurfaceVariant = md_theme_dark_onSurfaceVariant, ) @Composable fun OpheliaTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, - content: @Composable () -> Unit + content: @Composable() () -> Unit ) { val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } +// dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { +// val context = LocalContext.current +// if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) +// } darkTheme -> DarkColorScheme else -> LightColorScheme @@ -47,6 +96,7 @@ fun OpheliaTheme( if (!view.isInEditMode) { SideEffect { val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme } } diff --git a/app/src/main/java/com/menagerie/ophelia/ui/theme/Type.kt b/app/src/main/java/com/menagerie/ophelia/ui/theme/Type.kt index 4be722c..fe80251 100644 --- a/app/src/main/java/com/menagerie/ophelia/ui/theme/Type.kt +++ b/app/src/main/java/com/menagerie/ophelia/ui/theme/Type.kt @@ -4,6 +4,7 @@ import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.sp // Set of Material typography styles to start with @@ -14,7 +15,15 @@ val Typography = Typography( fontSize = 16.sp, lineHeight = 24.sp, letterSpacing = 0.5.sp - ) + ), + displayLarge = TextStyle( + fontFamily = FontFamily.Cursive, + fontWeight = FontWeight.Bold, + fontSize = 64.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + textDecoration = TextDecoration.Underline + ), /* Other default text styles to override titleLarge = TextStyle( fontFamily = FontFamily.Default, diff --git a/app/src/main/java/com/menagerie/ophelia/view/HomeScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/HomeScreen.kt index 3d73f8b..590b4db 100644 --- a/app/src/main/java/com/menagerie/ophelia/view/HomeScreen.kt +++ b/app/src/main/java/com/menagerie/ophelia/view/HomeScreen.kt @@ -1,97 +1,67 @@ package com.menagerie.ophelia.view +import android.content.res.Configuration import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.FloatingActionButton -import androidx.compose.material3.Icon +import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable -import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import com.menagerie.ophelia.R -import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel -import com.menagerie.ophelia.database.polycule.entity.Bio -import com.menagerie.ophelia.view.biographies.BioCardList +import com.menagerie.ophelia.ui.theme.OpheliaTheme -@OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( - modifier: Modifier = Modifier, - onBioClick: (Bio) -> Unit = {}, - onAddClick: () -> Unit, + onClick: () -> Unit, + ) { - val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() - Scaffold( - modifier = modifier, - bottomBar = { - HomeTopAppBar( - onFilterClick = { }, - scrollBehavior = scrollBehavior - ) - } - ) { - HomeBioScreen( - onBioClick = onBioClick, - onAddClick = onAddClick, - modifier = modifier.padding(it) - ) - } + val text = if(true) R.string.welcome else R.string.welcome_back + HeaderText(text, onClick) } @Composable -fun HomeBioScreen( - onBioClick: (Bio) -> Unit, - onAddClick: () -> Unit = {}, - modifier: Modifier, +fun HeaderText( + text: Int, + onClick: () -> Unit ) { - val mBioListViewModel: BioListViewModel = viewModel( - factory = BioListViewModel.BioListViewModelFactory() - ) - val items = mBioListViewModel.allBios.observeAsState(listOf()).value - - Column( - modifier = modifier + Box( + modifier = Modifier + .fillMaxSize() ) { - BioCardList(bioList = items, onBioClick = onBioClick) - FloatingActionButton( - onClick = onAddClick + Column( + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp) + .align(Alignment.Center), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, ) { - Icon(Icons.Filled.Add, "Add Bio") + Spacer(modifier = Modifier.weight(1f)) + Text( + text = stringResource(id = R.string.app_name), + style = MaterialTheme.typography.displayLarge + ) + Text( + text = stringResource(id = R.string.app_tag) + ) + Spacer(modifier = Modifier.weight(1f)) + Button( + modifier = Modifier.padding(12.dp), + onClick = onClick + ) { + Text(text = stringResource(id = text)) + } } } -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun HomeTopAppBar( - onFilterClick: () -> Unit, - modifier: Modifier = Modifier, - scrollBehavior: TopAppBarScrollBehavior, -) { - TopAppBar( - title = { - Row( - Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center, - ) { - } - }, - modifier = modifier.statusBarsPadding(), - actions = {}, - scrollBehavior = scrollBehavior - ) } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/NewUserStartScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/NewUserStartScreen.kt new file mode 100644 index 0000000..05e40ef --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/NewUserStartScreen.kt @@ -0,0 +1,45 @@ +package com.menagerie.ophelia.view + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun NewUserStartScreen( + onGo: () -> Unit = {}, +) { + + Scaffold { + Column { + OpheliaFace( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 12.dp) + ) + OpheliaWelcome(modifier = Modifier.weight(1f)) + Button( + onClick = onGo, + modifier = Modifier + .padding(12.dp) + .align(Alignment.End) + ) { + Text(text = "Go") + } + } + } +} + +@Preview +@Composable +fun NewUserPreview(){ + NewUserStartScreen() +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/Ophelia.kt b/app/src/main/java/com/menagerie/ophelia/view/Ophelia.kt new file mode 100644 index 0000000..d1efe41 --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/Ophelia.kt @@ -0,0 +1,168 @@ +package com.menagerie.ophelia.view + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.modifier.modifierLocalConsumer +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringArrayResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.unit.dp +import com.menagerie.ophelia.R + +@Composable +fun OpheliaSpanStyle(): SpanStyle { + val fontFamily = FontFamily( + Font(R.font.calligraffitti) + ) + + return SpanStyle( + letterSpacing = MaterialTheme.typography.bodyLarge.letterSpacing, + fontFamily = fontFamily, + fontSize = MaterialTheme.typography.bodyLarge.fontSize) +} + +@Composable +fun OpheliaFace( + modifier: Modifier +) { + Image( + modifier = modifier, + painter = painterResource(id = R.drawable.ophelia_foreground), + contentDescription = OpheliaSays() + ) +} + +@Composable +fun OpheliaSaysArray( + id: Int, + separator: String = "\n\n" +): AnnotatedString { + return buildAnnotatedString { + pushStyle(OpheliaSpanStyle()) + append(stringArrayResource(id = id).joinToString(separator = separator)) + toAnnotatedString() + } +} + +@Composable +fun OpheliaSays( + say: String +): AnnotatedString { + return buildAnnotatedString { + pushStyle(OpheliaSpanStyle()) + append(say) + toAnnotatedString() + } +} + +@Composable +fun OpheliaSays(): String { + return stringResource(id = R.string.ophelia_says) +} + + +@Composable +fun OpheliaWelcome( + modifier: Modifier +) { + Box( + modifier = modifier + .fillMaxSize() + .padding(24.dp) + ) { + Text( + text = OpheliaSaysArray(id = R.array.welcome_blurb) + ) + } +} + +@Composable +fun OpheliaWhatsYourName( + modifier: Modifier +) { + Box( + modifier = modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Text(text = OpheliaSaysArray(id = R.array.whats_your_name)) + } +} + +@Composable +fun OpheliaPronounsIntroduction( + modifier: Modifier, + name: String +) { + Box( + modifier = modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Column { + val context = LocalContext.current + Text(text = OpheliaSays(context.resources.getString(R.string.introduction_with_name, name))) + Text(text = OpheliaSaysArray(id = R.array.introduction_to_pronouns)) + } + } +} + +@Composable +fun OpheliaTagsIntroduction( + modifier: Modifier, +) { + Box( + modifier = modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Column { + Text(text = OpheliaSaysArray(R.array.introduction_to_tags)) + } + } +} + +@Composable +fun OpheliaNewUserFinalCheck( + modifier: Modifier, +){ + Box( + modifier = modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Column { + Text(text = OpheliaSays(stringResource(id = R.string.final_check_in))) + } + } +} + +@Composable +fun OpheliaNewUserPolycule( + modifier: Modifier, +) { + Box( + modifier = modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Column { + Text(text = OpheliaSaysArray(id = R.array.introduction_to_polycules)) + } + } +} diff --git a/app/src/main/java/com/menagerie/ophelia/view/PolyculeApp.kt b/app/src/main/java/com/menagerie/ophelia/view/PolyculeApp.kt index d2331f5..9590961 100644 --- a/app/src/main/java/com/menagerie/ophelia/view/PolyculeApp.kt +++ b/app/src/main/java/com/menagerie/ophelia/view/PolyculeApp.kt @@ -1,14 +1,25 @@ package com.menagerie.ophelia.view import androidx.compose.runtime.Composable +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument +import com.menagerie.ophelia.database.polycule.PolyculeDatabaseManager import com.menagerie.ophelia.view.biographies.AddBiography +import com.menagerie.ophelia.view.biographies.AddEditBio import com.menagerie.ophelia.view.biographies.BioDetailsScreen +import com.menagerie.ophelia.view.biographies.EditBiography +import com.menagerie.ophelia.view.newUser.AddNameScreen +import com.menagerie.ophelia.view.newUser.AddPronounsScreen +import com.menagerie.ophelia.view.newUser.AddTagsScreen +import com.menagerie.ophelia.view.newUser.ConfirmBio +import com.menagerie.ophelia.view.polycule.AddPolyculeScreen +import com.menagerie.ophelia.view.polycule.PolyculeHomeView @Composable fun PolyculeApp() { @@ -24,31 +35,74 @@ fun PolyculeNavHost( ) { NavHost( navController = navController, - startDestination = "home" + startDestination = "confirmBio" ) { + polyculeGraph(navController) + welcomeGraph(navController) composable("home") { - HomeScreen( - onBioClick = { - navController.navigate("bioDetail/${it.id}") - }, - onAddClick = { - navController.navigate("addBio") - } - ) - } - composable( - "bioDetail/{bioId}", - arguments = listOf(navArgument("bioId") { - type = NavType.IntType - }) - ) { - BioDetailsScreen( - id = it.arguments?.getInt("bioId") ?: 0, - onBackClick = { navController.navigateUp() }, - ) - } - composable("addBio") { - AddBiography() + HomeScreen() { + navController.navigate("newUserStart") + } } } +} + +fun NavGraphBuilder.welcomeGraph(navController: NavHostController) { + composable("newUserStart") { + NewUserStartScreen { navController.navigate("newUserName") } + } + composable("newUserName") { + AddNameScreen { navController.navigate("newUserPronouns") } + } + composable("newUserPronouns") { + AddPronounsScreen { navController.navigate("newUserTags") } + } + composable("newUserTags") { + AddTagsScreen { navController.navigate("confirmBio") } + } + composable("confirmBio") { + ConfirmBio { + navController.popBackStack() + navController.navigate("polyculeHome") + } + } + composable("makePolycule") { + AddPolyculeScreen() + } +} + +fun NavGraphBuilder.polyculeGraph(navController: NavController) { + composable("polyculeHome") { + PolyculeHomeView( + onBioClick = { + navController.navigate("bioDetail/${it.id}") + }, + onAddClick = { + navController.navigate("addBio") {} + } + ) + } + composable( + "bioDetail/{bioId}", + arguments = listOf(navArgument("bioId") { + type = NavType.LongType + }) + ) { + BioDetailsScreen( + id = it.arguments?.getLong("bioId") ?: 0, + onBackClick = { navController.navigateUp() }, + onEditClick = { id -> navController.navigate("editBio/${id}")} + ) + } + composable("addBio") { + AddBiography() + } + composable( + "editBio/{bioId}", + arguments = listOf(navArgument("bioId") { + type = NavType.LongType + }) + ){ + EditBiography(bioId = it.arguments?.getLong("bioId") ?: 0) { navController.navigateUp() } + } } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/biographies/AddEditBio.kt b/app/src/main/java/com/menagerie/ophelia/view/biographies/AddEditBio.kt new file mode 100644 index 0000000..0d1e45e --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/biographies/AddEditBio.kt @@ -0,0 +1,341 @@ +package com.menagerie.ophelia.view.biographies + +import android.annotation.SuppressLint +import android.widget.Toast +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.menagerie.ophelia.R +import com.menagerie.ophelia.database.polycule.entity.Bio +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioDetailViewModel +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel +import com.menagerie.ophelia.view.components.InputFieldState +import com.menagerie.ophelia.view.components.fab.FABComponent +import com.menagerie.ophelia.view.newUser.Tags + +fun insertBioInDB(bio: Bio?, mBioListViewModel: BioListViewModel) { + bio?.let { + mBioListViewModel.upsert(it) + } +} + +@Composable +fun FinishBiography( + bioId: Long, + onGo: () -> Unit +) { + val mBioDetailViewModel = BioDetailViewModel(bioId) + val bio = mBioDetailViewModel.bio.observeAsState().value + + if (bio != null) { + val inputViewModel = InputEditViewModel(bio) + val ioBio: Bio by inputViewModel.bio.observeAsState(bio) + AddEditBio( + ioBio = ioBio, + btnLabel = stringResource(id = R.string.finish), + toast = stringResource(id = R.string.bio_finish_toast), + onGo, + ) + } +} + +@Composable +fun EditBiography( + bioId: Long, + onGo: () -> Unit +) { + val mBioDetailViewModel = BioDetailViewModel(bioId) + val bio = mBioDetailViewModel.bio.observeAsState().value + + if (bio != null) { + val inputViewModel = InputEditViewModel(bio) + val ioBio: Bio by inputViewModel.bio.observeAsState(bio) + AddEditBio( + ioBio = ioBio, + btnLabel = stringResource(id = R.string.edit_bio), + toast = stringResource(id = R.string.bio_edit_toast), + onGo, + ) + } +} + +@Composable +fun AddBiography() { + + val inputViewModel = InputAddViewModel() + val ioBio: Bio by inputViewModel.bio.observeAsState(Bio()) + AddEditBio( + ioBio = ioBio, + btnLabel = stringResource(id = R.string.edit_bio), + toast = stringResource(id = R.string.bio_edit_toast), + ) { + + } +} + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun AddEditBio( + ioBio: Bio, + btnLabel: String, + toast: String, + onGo: () -> Unit +) { + + val mBioListViewModel: BioListViewModel = viewModel( + factory = BioListViewModel.BioListViewModelFactory() + ) + val context = LocalContext.current + + var name by remember { mutableStateOf(ioBio.name) } + var sp by remember { mutableStateOf(ioBio.subjective) } + var op by remember { mutableStateOf(ioBio.objective) } + var pp by remember { mutableStateOf(ioBio.possessive) } + var rp by remember { mutableStateOf(ioBio.reflexive) } + var tags by remember { mutableIntStateOf(ioBio.tags) } + + Scaffold( + floatingActionButton = { + FABComponent(text = btnLabel, onClick = { + insertBioInDB( + Bio( + id = ioBio.id, + name = name, + subjective = sp, + objective = op, + possessive = pp, + reflexive = rp, + tags = tags, + ), + mBioListViewModel + ) + onGo() + Toast.makeText(context, toast, Toast.LENGTH_SHORT).show() + }) + } + ) + { + Column( + modifier = Modifier.padding(12.dp) + ) { + val modifier = Modifier + .width(164.dp) + .height(64.dp) + val focusManager = LocalFocusManager.current + InputFieldState( + value = name, + label = "name", + modifier = modifier, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ) + ) { name = it } + Box { + Column { + Row { + InputFieldState( + value = sp, + label = "objective", + modifier = modifier, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ) + ) { sp = it } + Text( + text = " / ", + style = MaterialTheme.typography.displayMedium + ) + InputFieldState( + value = op, + label = "subjective", + modifier = modifier, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ) + ) { op = it } + } + Row { + InputFieldState( + value = pp, + label = "possessive", + modifier = modifier, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ) + ) { pp = it } + Text( + text = " / ", + style = MaterialTheme.typography.displayMedium + ) + InputFieldState( + value = rp, + label = "reflexive", + modifier = modifier, + keyboardActions = KeyboardActions( + onDone = { focusManager.clearFocus() } + ) + ) { rp = it } + } + tagsBox( + tags = tags, + modifier = Modifier + .padding(12.dp) + .size(64.dp) + ) { + tags = it + } + } + } + } + } +} + +@Composable +fun tagsBox( + tags: Int, + modifier: Modifier, + onValChange: (Int) -> Unit +) { + + Row { + RememberableButton( + tagList = tags, + tag = Tags.TRANS, + painter = painterResource(id = R.drawable.trans_tag), + modifier = modifier, + onValChange = onValChange) + + RememberableButton( + tagList = tags, + tag = Tags.FURRY, + painter = painterResource(id = R.drawable.furry_tag), + modifier = modifier, + onValChange = onValChange) + + RememberableButton( + tagList = tags, + tag = Tags.ASEXUAL, + painter = painterResource(id = R.drawable.asexual_tag), + modifier = modifier, + onValChange = onValChange) + } + + + Row { + RememberableButton( + tagList = tags, + tag = Tags.BDSM, + painter = painterResource(id = R.drawable.bdsm_tag), + modifier = modifier, + onValChange = onValChange) + + RememberableButton( + tagList = tags, + tag = Tags.MONO, + painter = painterResource(id = R.drawable.mono_tag), + modifier = modifier, + onValChange = onValChange) + + RememberableButton( + tagList = tags, + tag = Tags.ALCOHOL, + painter = painterResource(id = R.drawable.liqour_tag), + modifier = modifier, + onValChange = onValChange) + } + + Row { + RememberableButton( + tagList = tags, + tag = Tags.WEED, + painter = painterResource(id = R.drawable.weed_tag), + modifier = modifier, + onValChange = onValChange) + + RememberableButton( + tagList = tags, + tag = Tags.THERIAN, + painter = painterResource(id = R.drawable.therian_tag), + modifier = modifier, + onValChange = onValChange) + + RememberableButton( + tagList = tags, + tag = Tags.PLURAL, + painter = painterResource(id = R.drawable.plural_tag), + modifier = modifier, + onValChange = onValChange) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RememberableButton( + tagList: Int, + tag: Tags, + modifier: Modifier, + painter: Painter, + onValChange: (Int) -> Unit, +) { + var selected = tagList and tag.value == tag.value + + Box { + FilterChip( + selected = selected, + onClick = { onValChange(tagList xor tag.value) }, + modifier = modifier, + shape = CircleShape, + label = { + Icon( + modifier = Modifier.padding(horizontal = 4.dp), + painter = painter, + contentDescription = "" + ) + }, + ) + } +} + +class InputEditViewModel( + bio: Bio +) : ViewModel() { + private val _bio: MutableLiveData = MutableLiveData(bio) + val bio: LiveData = _bio +} + +class InputAddViewModel() : ViewModel() { + private val _bio: MutableLiveData = MutableLiveData(Bio()) + val bio: LiveData = _bio +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/biographies/AddEditBiography.kt b/app/src/main/java/com/menagerie/ophelia/view/biographies/AddEditBiography.kt deleted file mode 100644 index 02c7551..0000000 --- a/app/src/main/java/com/menagerie/ophelia/view/biographies/AddEditBiography.kt +++ /dev/null @@ -1,109 +0,0 @@ -package com.menagerie.ophelia.view.biographies - -import android.annotation.SuppressLint -import android.widget.Toast -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Scaffold -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.datasource.LoremIpsum -import androidx.compose.ui.unit.dp -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewmodel.compose.viewModel -import com.menagerie.ophelia.R -import com.menagerie.ophelia.database.polycule.entity.Bio -import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel -import com.menagerie.ophelia.view.components.InputFieldComponent -import com.menagerie.ophelia.view.components.fab.FABComponent -import kotlin.random.Random - -fun insertBioInDB(bio: Bio?, mBioListViewModel: BioListViewModel) { - bio?.let { - mBioListViewModel.upsert(it) - } -} - -@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") -@Composable -fun AddBiography() { - val inputViewModel = InputViewModel() - val context = LocalContext.current - val mBioListViewModel: BioListViewModel = viewModel( - factory = BioListViewModel.BioListViewModelFactory() - ) - - Scaffold( - floatingActionButton = { - FABComponent(text = "${stringResource(id = R.string.add_bio)}", onClick = { - insertBioInDB(inputViewModel.bio.value, mBioListViewModel) - - Toast.makeText(context, "Added Bio", Toast.LENGTH_SHORT).show() - }) - } - ) - { - InputFieldState(inputViewModel) - } -} - -@Composable -fun InputFieldState( - inputViewModel: InputViewModel, -) { - val bio: Bio by inputViewModel.bio.observeAsState(Bio()) - Column( - modifier = Modifier.padding(16.dp) - ) { - InputField(bio.name) { inputViewModel.onInputChange(it) } - Spacer(modifier = Modifier.padding(10.dp)) - } -} - -@Composable -fun InputField( - name: String, - onValChange: ((String) -> Unit)? -) { - val focusManager = LocalFocusManager.current - - if (onValChange != null) { - InputFieldComponent( - text = name, - onChange = onValChange, - label = "Enter Bio", - modifier = Modifier - .padding(all = 16.dp) - .fillMaxWidth(), - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }) - ) - } -} - -class InputViewModel : ViewModel() { - private val _bio: MutableLiveData = MutableLiveData(Bio()) - val bio: LiveData = _bio - fun onInputChange(name: String) { - var desc = LoremIpsum(Random.nextInt(5,100)).values.toList() - var init = "" - repeat(desc.size) { - init += ("${desc[it]} ") - } - val newBio = Bio( - name = name, - description = init, - ) - _bio.value = newBio - } -} diff --git a/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCard.kt b/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCard.kt index f5eef54..ce1f33d 100644 --- a/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCard.kt +++ b/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCard.kt @@ -1,7 +1,6 @@ package com.menagerie.ophelia.view.biographies import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -35,12 +34,12 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp +import com.menagerie.ophelia.R @OptIn(ExperimentalMaterial3Api::class) @Composable fun BioCard( name: String, - description: String, image: Int, onBioClick: () -> Unit, onDeleteClick: () -> Unit @@ -66,7 +65,7 @@ fun BioCard( verticalAlignment = Alignment.CenterVertically, ) { Image( - painter = painterResource(id = image), + painter = painterResource(id = R.drawable.ic_app_logo), contentDescription = null, modifier = Modifier .size(130.dp) @@ -80,7 +79,9 @@ fun BioCard( color = MaterialTheme.colorScheme.onSurface, ) } - Spacer(modifier = Modifier.weight(1f).fillMaxSize()) + Spacer(modifier = Modifier + .weight(1f) + .fillMaxSize()) Box( modifier = Modifier .wrapContentSize(Alignment.TopStart) diff --git a/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCardList.kt b/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCardList.kt index 6642c44..0f7eb27 100644 --- a/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCardList.kt +++ b/app/src/main/java/com/menagerie/ophelia/view/biographies/BioCardList.kt @@ -35,25 +35,9 @@ fun BioCardList( modifier = Modifier.fillMaxWidth(), contentPadding = PaddingValues(8.dp) ) { - item { - Row( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .padding(vertical = 24.dp), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - "The Menagerie", - style = MaterialTheme.typography.headlineLarge - ) - } - } items(bioList) { bio -> BioCard( name = bio.name, - description = bio.description, image = bio.pfpRes, onBioClick = { onBioClick(bio) }, onDeleteClick = { mBioListViewModel.delete(bio) }) diff --git a/app/src/main/java/com/menagerie/ophelia/view/biographies/BioDetailsScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/biographies/BioDetailsScreen.kt index b0acad9..6cb50fe 100644 --- a/app/src/main/java/com/menagerie/ophelia/view/biographies/BioDetailsScreen.kt +++ b/app/src/main/java/com/menagerie/ophelia/view/biographies/BioDetailsScreen.kt @@ -1,42 +1,37 @@ package com.menagerie.ophelia.view.biographies -import androidx.compose.foundation.Image +import android.annotation.SuppressLint import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import androidx.constraintlayout.compose.ConstraintLayout -import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.compose.ui.res.stringResource +import com.menagerie.ophelia.R import com.menagerie.ophelia.database.polycule.entity.Bio import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioDetailViewModel +import com.menagerie.ophelia.view.components.fab.FABComponent import com.menagerie.ophelia.view.components.utils.Dimens data class BioDetailCallbacks( - val onBackClick: () -> Unit + val onBackClick: () -> Unit, + val onEditClick: (Long) -> Unit ) @Composable fun BioDetailsScreen( - id: Int, + id: Long, onBackClick: () -> Unit, + onEditClick: (Long) -> Unit, ) { - val mBioDetailViewModel: BioDetailViewModel = viewModel( - ) - - mBioDetailViewModel.setBio(bioId = id) + val mBioDetailViewModel = BioDetailViewModel(id) val bio = mBioDetailViewModel.bio.observeAsState().value @@ -45,7 +40,8 @@ fun BioDetailsScreen( BioDetails( bio, BioDetailCallbacks( - onBackClick = onBackClick + onBackClick = onBackClick, + onEditClick = onEditClick, ) ) } @@ -64,9 +60,7 @@ fun BioDetails( ) { BioDetailContents( bio = bio, - imageHeight = with(LocalDensity.current) { - 1.dp - }, + onEdit = callbacks.onEditClick ) } } @@ -74,58 +68,55 @@ fun BioDetails( @Composable fun BioDetailContents( bio: Bio, - imageHeight: Dp, + onEdit: (Long) -> Unit, ) { Column { - ConstraintLayout { - val (image, info) = createRefs() - Image( - painter = painterResource(id = bio.pfpRes), - contentDescription = null, - modifier = Modifier - .size(130.dp) - .padding(8.dp), - contentScale = ContentScale.Fit, - ) - InfoDetails( - name = bio.name, - description = bio.description, - modifier = Modifier.constrainAs(info) { - top.linkTo(image.bottom) - } - ) - } + InfoDetails( + bio = bio, + onEdit = onEdit, + modifier = Modifier + ) } } +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun InfoDetails( - name: String, - description: String, + bio: Bio, + onEdit: (Long) -> Unit, modifier: Modifier = Modifier ) { - Column(modifier = modifier.padding(Dimens.PaddingLarge)) { - Text( - text = name, - style = MaterialTheme.typography.displaySmall, - modifier = Modifier - .padding( - start = Dimens.PaddingSmall, - end = Dimens.PaddingSmall, - bottom = Dimens.PaddingNormal - ) - .align(Alignment.CenterHorizontally) - ) - Box( - Modifier - .align(Alignment.CenterHorizontally) - .padding( - start = Dimens.PaddingSmall, - end = Dimens.PaddingSmall, - bottom = Dimens.PaddingNormal - ) - ) { - Text(text = description) + Scaffold( + floatingActionButton = { + FABComponent( + text = "${stringResource(id = R.string.edit_bio)}", + onClick = { onEdit(bio.id) } + ) + } + ) { + Column(modifier = modifier.padding(Dimens.PaddingLarge)) { + Text( + text = bio.name, + style = MaterialTheme.typography.displaySmall, + modifier = Modifier + .padding( + start = Dimens.PaddingSmall, + end = Dimens.PaddingSmall, + bottom = Dimens.PaddingNormal + ) + .align(Alignment.CenterHorizontally) + ) + Box( + Modifier + .align(Alignment.CenterHorizontally) + .padding( + start = Dimens.PaddingSmall, + end = Dimens.PaddingSmall, + bottom = Dimens.PaddingNormal + ) + ) { + Text(text = "${bio.subjective} / ${bio.objective} / ${bio.possessive} / ${bio.reflexive}") + } } } } diff --git a/app/src/main/java/com/menagerie/ophelia/view/biographies/TagCard.kt b/app/src/main/java/com/menagerie/ophelia/view/biographies/TagCard.kt new file mode 100644 index 0000000..92a4079 --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/biographies/TagCard.kt @@ -0,0 +1,86 @@ +package com.menagerie.ophelia.view.biographies + +import android.util.Log +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TagCard( + name: String, + painter: Painter, + details: String, + check: Boolean, + onClick: () -> Unit +) { + var checked by remember { mutableStateOf(check) } + + Card( + modifier = Modifier + .padding(8.dp) + .fillMaxWidth() + .wrapContentHeight(), + shape = MaterialTheme.shapes.medium, + elevation = CardDefaults.cardElevation( + defaultElevation = 6.dp + ), + colors = CardDefaults.cardColors( + containerColor = + if (checked) MaterialTheme.colorScheme.primaryContainer + else MaterialTheme.colorScheme.surface + ), + border = BorderStroke(1.dp, Color.Black), + onClick = { + checked = !checked + onClick() + }, + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painter, + contentDescription = null, + modifier = Modifier + .size(80.dp) + .padding(8.dp), + contentScale = ContentScale.Fit, + ) + Column(modifier = Modifier.padding(8.dp)) { + Text( + text = name, + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurface, + ) + //TODO: details blurbs +// Text( +// text = details, +// style = MaterialTheme.typography.headlineSmall, +// color = MaterialTheme.colorScheme.onSurface, +// ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/components/InputFieldComponent.kt b/app/src/main/java/com/menagerie/ophelia/view/components/InputFieldComponent.kt index 688299d..4ff51b6 100644 --- a/app/src/main/java/com/menagerie/ophelia/view/components/InputFieldComponent.kt +++ b/app/src/main/java/com/menagerie/ophelia/view/components/InputFieldComponent.kt @@ -1,10 +1,16 @@ package com.menagerie.ophelia.view.components +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.unit.dp @Composable fun InputFieldComponent( @@ -16,10 +22,48 @@ fun InputFieldComponent( keyboardActions: KeyboardActions = KeyboardActions.Default, ) { OutlinedTextField( - text, - onChange, + value = text, + onValueChange = onChange, label = { Text(text = label)}, modifier = modifier, singleLine = singleLine, + keyboardActions = keyboardActions, ) +} + + +@Composable +fun InputFieldState( + value: String, + label: String, + modifier: Modifier, + keyboardActions: KeyboardActions = KeyboardActions.Default, + onVal: (String) -> Unit, +) { + + Column( + modifier = Modifier + ) { + InputField(value, label, modifier, onVal, keyboardActions) + Spacer(modifier = Modifier.padding(10.dp)) + } +} + +@Composable +fun InputField( + text: String, + label: String, + modifier: Modifier, + onValChange: ((String) -> Unit)?, + keyboardActions: KeyboardActions, +) { + if (onValChange != null) { + InputFieldComponent( + text = text, + onChange = onValChange, + label = label, + modifier = modifier, + keyboardActions = keyboardActions, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/newUser/AddNameScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/newUser/AddNameScreen.kt new file mode 100644 index 0000000..3d923f2 --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/newUser/AddNameScreen.kt @@ -0,0 +1,81 @@ +package com.menagerie.ophelia.view.newUser + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.menagerie.ophelia.database.polycule.entity.Bio +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel +import com.menagerie.ophelia.view.OpheliaFace +import com.menagerie.ophelia.view.OpheliaWhatsYourName +import com.menagerie.ophelia.view.biographies.insertBioInDB +import com.menagerie.ophelia.view.components.InputFieldState + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun AddNameScreen( + onGo: () -> Unit, +) { + val inputViewModel = BioListViewModel.InputBioViewModel() + val mBioListViewModel: BioListViewModel = viewModel( + factory = BioListViewModel.BioListViewModelFactory() + ) + Scaffold { + Column( + modifier = Modifier.fillMaxSize() + ) { + val bio: Bio by inputViewModel.bio.observeAsState(Bio()) + + OpheliaFace( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 12.dp) + ) + LinearProgressIndicator( + progress = 0f, + modifier = Modifier.fillMaxWidth() + ) + OpheliaWhatsYourName(modifier = Modifier) + InputFieldState( + value = bio.name, + label = "name", + modifier = Modifier + .width(120.dp) + ) { inputViewModel.onNameChange(it) } + Spacer( + modifier = Modifier + .fillMaxSize() + .weight(1f) + + ) + Button( + modifier = Modifier + .align(Alignment.End), + onClick = { + insertBioInDB(inputViewModel.bio.value, mBioListViewModel) + onGo() + } + ) { + Text(text = "Continue") + } + } + } +} + diff --git a/app/src/main/java/com/menagerie/ophelia/view/newUser/AddPronounsScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/newUser/AddPronounsScreen.kt new file mode 100644 index 0000000..baf47fa --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/newUser/AddPronounsScreen.kt @@ -0,0 +1,158 @@ +package com.menagerie.ophelia.view.newUser + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.material3.Button +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.menagerie.ophelia.database.polycule.entity.Bio +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioDetailViewModel +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel +import com.menagerie.ophelia.view.OpheliaFace +import com.menagerie.ophelia.view.OpheliaPronounsIntroduction +import com.menagerie.ophelia.view.components.InputField + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun AddPronounsScreen( + onGo : () -> Unit +) { + val mBioDetailViewModel = BioDetailViewModel(1) + val mBioListViewModel: BioListViewModel = viewModel( + factory = BioListViewModel.BioListViewModelFactory() + ) + + val bio = mBioDetailViewModel.bio.observeAsState().value + + Scaffold { + if (bio != null) { + Column { + OpheliaFace( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 12.dp) + ) + LinearProgressIndicator( + progress = .33f, + modifier = Modifier.fillMaxWidth() + ) + OpheliaPronounsIntroduction(modifier = Modifier.weight(1f), name = bio.name) + PronounBox(Modifier.weight(1f)) { + val updateBio = Bio( + id = bio.id, + name = bio.name, + subjective = it[0], + objective = it[1], + possessive = it[2], + reflexive = it[3], + ) + mBioListViewModel.upsert(updateBio) + onGo() + } + } + } + } +} + +@Composable +fun PronounBox( + modifier: Modifier, + onClick: (List) -> Unit, +) { + var subject by remember { mutableStateOf("") } + var objec by remember { mutableStateOf("") } + var possess by remember { mutableStateOf("") } + var reflex by remember { mutableStateOf("") } + + + Box(modifier = Modifier.fillMaxWidth()) + { + Column { + val focusManager = LocalFocusManager.current + Row { + InputField( + text = subject, + label = "subjective", + modifier = modifier, + onValChange = { subject = it }, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ), + ) + Text( + text = " / ", + style = MaterialTheme.typography.displayMedium + ) + InputField( + text = objec, + label = "objective", + modifier = modifier, + onValChange = { objec = it }, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ), + ) + } + Row { + InputField( + text = possess, + label = "possessive", + modifier = modifier, + onValChange = { possess = it }, + keyboardActions = KeyboardActions( + onDone = { focusManager.moveFocus(FocusDirection.Next) } + ), + ) + Text( + text = " / ", + style = MaterialTheme.typography.displayMedium + ) + InputField( + text = reflex, + label = "reflexive", + modifier = modifier, + onValChange = { reflex = it }, + keyboardActions = KeyboardActions( + onDone = { focusManager.clearFocus() } + ), + ) + } + Spacer( + modifier = Modifier.size(60.dp) + ) + Button( + onClick = { + onClick(listOf(subject, objec, possess, reflex)) + }, + modifier = Modifier + .align( + alignment = Alignment.End + ) + .padding(8.dp) + ) { + Text(text = "Continue") + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/newUser/AddTagsScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/newUser/AddTagsScreen.kt new file mode 100644 index 0000000..882ed58 --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/newUser/AddTagsScreen.kt @@ -0,0 +1,195 @@ +package com.menagerie.ophelia.view.newUser + +import android.annotation.SuppressLint +import android.util.Log +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Button +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.menagerie.ophelia.R +import com.menagerie.ophelia.database.polycule.entity.Bio +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioDetailViewModel +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel +import com.menagerie.ophelia.view.OpheliaFace +import com.menagerie.ophelia.view.OpheliaTagsIntroduction +import com.menagerie.ophelia.view.biographies.TagCard + +enum class Tags(val value: Int) +{ + TRANS(1), + FURRY(2), + ASEXUAL(4), + BDSM(8), + MONO(16), + ALCOHOL(32), + WEED(64), + THERIAN(128), + PLURAL(256), +} + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun AddTagsScreen( + onGo : () -> Unit +) { + Scaffold { + Column { + OpheliaFace( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 12.dp) + ) + LinearProgressIndicator( + progress = .66f, + modifier = Modifier.fillMaxWidth() + ) + OpheliaTagsIntroduction(modifier = Modifier.weight(1f)) + MakeDefaultTagCards(modifier = Modifier.weight(2f)) + Button( + onClick = onGo, + modifier = Modifier + .weight(.25f) + .align(Alignment.End)) { + Text(text = "Continue") + } + } + } +} + +@Composable +fun MakeDefaultTagCards( + modifier: Modifier, +) { + var flags by remember { mutableIntStateOf(0) } + + val mBioDetailViewModel = BioDetailViewModel(1) + val mBioListViewModel: BioListViewModel = viewModel( + factory = BioListViewModel.BioListViewModelFactory() + ) + + val bio = mBioDetailViewModel.bio.observeAsState().value + + if (bio != null) { + val updateBio = Bio( + id = bio.id, + name = bio.name, + subjective = bio.subjective, + objective = bio.objective, + possessive = bio.possessive, + reflexive = bio.reflexive, + tags = flags + ) + mBioListViewModel.upsert(updateBio) + + Box(modifier = modifier) { + LazyColumn { + item { + TagCard( + name = "Transgender", + painter = painterResource(id = R.drawable.trans_tag), + details = "", + check = flags and Tags.TRANS.value == Tags.TRANS.value + ) { + flags = flags xor Tags.TRANS.value + } + } + item { + TagCard( + name = "Furry", + painter = painterResource(id = R.drawable.furry_tag), + details = "", + check = flags and Tags.FURRY.value == Tags.FURRY.value + ) { + flags = flags xor Tags.FURRY.value + } + } + item { + TagCard( + name = "Therian", + painter = painterResource(id = R.drawable.therian_tag), + details = "", + check = flags and Tags.THERIAN.value == Tags.THERIAN.value + ) { + flags = flags xor Tags.THERIAN.value + } + } + item { + TagCard( + name = "Monogamous", + painter = painterResource(id = R.drawable.mono_tag), + details = "", + check = flags and Tags.MONO.value == Tags.MONO.value + ) { + flags = flags xor Tags.MONO.value + } + } + item { + TagCard( + name = "BDSM", + painter = painterResource(id = R.drawable.bdsm_tag), + details = "", + check = flags and Tags.BDSM.value == Tags.BDSM.value + ) { + flags = flags xor Tags.BDSM.value + } + } + item { + TagCard( + name = "Plural", + painter = painterResource(id = R.drawable.plural_tag), + details = "", + check = flags and Tags.PLURAL.value == Tags.PLURAL.value + ) { + flags = flags xor Tags.PLURAL.value + } + } + item { + TagCard( + name = "Asexual", + painter = painterResource(id = R.drawable.asexual_tag), + details = "", + check = flags and Tags.ASEXUAL.value == Tags.ASEXUAL.value + ) { + flags = flags xor Tags.ASEXUAL.value + } + } + item { + TagCard( + name = "Alcohol", + painter = painterResource(id = R.drawable.liqour_tag), + details = "", + check = flags and Tags.ALCOHOL.value == Tags.ALCOHOL.value + ) { + flags = flags xor Tags.ALCOHOL.value + } + } + item { + TagCard( + name = "Weed", + painter = painterResource(id = R.drawable.weed_tag), + details = "", + check = flags and Tags.WEED.value == Tags.WEED.value + ) { + flags = flags xor Tags.WEED.value + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/newUser/ConfirmBio.kt b/app/src/main/java/com/menagerie/ophelia/view/newUser/ConfirmBio.kt new file mode 100644 index 0000000..ada8fae --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/newUser/ConfirmBio.kt @@ -0,0 +1,40 @@ +package com.menagerie.ophelia.view.newUser + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.menagerie.ophelia.view.OpheliaFace +import com.menagerie.ophelia.view.OpheliaNewUserFinalCheck +import com.menagerie.ophelia.view.biographies.FinishBiography + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun ConfirmBio( + onGo: () -> Unit +) { + Scaffold { + Column { + OpheliaFace( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 12.dp) + ) + LinearProgressIndicator( + progress = 1f, + modifier = Modifier.fillMaxWidth() + ) + OpheliaNewUserFinalCheck(modifier = Modifier) + FinishBiography( + bioId = 1, + onGo = onGo, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/polycule/AddPolyculeScreen.kt b/app/src/main/java/com/menagerie/ophelia/view/polycule/AddPolyculeScreen.kt new file mode 100644 index 0000000..45ce9dd --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/polycule/AddPolyculeScreen.kt @@ -0,0 +1,29 @@ +package com.menagerie.ophelia.view.polycule + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.menagerie.ophelia.view.OpheliaFace +import com.menagerie.ophelia.view.OpheliaNewUserPolycule + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun AddPolyculeScreen( +) { + Scaffold { + Column { + OpheliaFace( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 12.dp) + ) + OpheliaNewUserPolycule(modifier = Modifier) + //TODO : Polycules + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/menagerie/ophelia/view/polycule/PolyculeHomeView.kt b/app/src/main/java/com/menagerie/ophelia/view/polycule/PolyculeHomeView.kt new file mode 100644 index 0000000..732baf7 --- /dev/null +++ b/app/src/main/java/com/menagerie/ophelia/view/polycule/PolyculeHomeView.kt @@ -0,0 +1,93 @@ +package com.menagerie.ophelia.view.polycule + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.runtime.Composable +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import com.menagerie.ophelia.database.polycule.entity.Bio +import com.menagerie.ophelia.database.polycule.entity.viewmodel.BioListViewModel +import com.menagerie.ophelia.view.biographies.BioCardList + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PolyculeHomeView( + modifier: Modifier = Modifier, + onBioClick: (Bio) -> Unit = {}, + onAddClick: () -> Unit, +) { + val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() + Scaffold( + modifier = modifier, + topBar = { + PolyculeTopAppBar( + onFilterClick = { }, + scrollBehavior = scrollBehavior + ) + } + ) { + PolyculeHomeScreen( + onBioClick = onBioClick, + onAddClick = onAddClick, + modifier = modifier.padding(it) + ) + } +} + +@Composable +fun PolyculeHomeScreen( + onBioClick: (Bio) -> Unit, + onAddClick: () -> Unit = {}, + modifier: Modifier, +) { + val mBioListViewModel: BioListViewModel = viewModel( + factory = BioListViewModel.BioListViewModelFactory() + ) + val items = mBioListViewModel.allBios.observeAsState(listOf()).value + + Column( + modifier = modifier + ) { + BioCardList(bioList = items, onBioClick = onBioClick) + FloatingActionButton( + onClick = onAddClick + ) { + Icon(Icons.Filled.Add, "Add Bio") + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PolyculeTopAppBar( + onFilterClick: () -> Unit, + modifier: Modifier = Modifier, + scrollBehavior: TopAppBarScrollBehavior, +) { + TopAppBar( + title = { + Row( + Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + ) { + } + }, + modifier = modifier.statusBarsPadding(), + actions = {}, + scrollBehavior = scrollBehavior + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/asexual_tag.xml b/app/src/main/res/drawable/asexual_tag.xml new file mode 100644 index 0000000..ef6bfa4 --- /dev/null +++ b/app/src/main/res/drawable/asexual_tag.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/bdsm_tag.xml b/app/src/main/res/drawable/bdsm_tag.xml new file mode 100644 index 0000000..f059ad3 --- /dev/null +++ b/app/src/main/res/drawable/bdsm_tag.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/drawable/furry_tag.xml b/app/src/main/res/drawable/furry_tag.xml new file mode 100644 index 0000000..df83859 --- /dev/null +++ b/app/src/main/res/drawable/furry_tag.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/liqour_tag.xml b/app/src/main/res/drawable/liqour_tag.xml new file mode 100644 index 0000000..086654f --- /dev/null +++ b/app/src/main/res/drawable/liqour_tag.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/mono_tag.xml b/app/src/main/res/drawable/mono_tag.xml new file mode 100644 index 0000000..0a14708 --- /dev/null +++ b/app/src/main/res/drawable/mono_tag.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/plural_tag.xml b/app/src/main/res/drawable/plural_tag.xml new file mode 100644 index 0000000..8038fe7 --- /dev/null +++ b/app/src/main/res/drawable/plural_tag.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/drawable/therian_tag.xml b/app/src/main/res/drawable/therian_tag.xml new file mode 100644 index 0000000..d96049f --- /dev/null +++ b/app/src/main/res/drawable/therian_tag.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/trans_tag.xml b/app/src/main/res/drawable/trans_tag.xml new file mode 100644 index 0000000..7e45dca --- /dev/null +++ b/app/src/main/res/drawable/trans_tag.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/weed_tag.xml b/app/src/main/res/drawable/weed_tag.xml new file mode 100644 index 0000000..23ead7b --- /dev/null +++ b/app/src/main/res/drawable/weed_tag.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/font/alex_brush.xml b/app/src/main/res/font/alex_brush.xml new file mode 100644 index 0000000..f047b6c --- /dev/null +++ b/app/src/main/res/font/alex_brush.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/font/allura.ttf b/app/src/main/res/font/allura.ttf new file mode 100644 index 0000000..6a426b5 Binary files /dev/null and b/app/src/main/res/font/allura.ttf differ diff --git a/app/src/main/res/font/calligraffitti.xml b/app/src/main/res/font/calligraffitti.xml new file mode 100644 index 0000000..e3d4fee --- /dev/null +++ b/app/src/main/res/font/calligraffitti.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/font/mentho.xml b/app/src/main/res/font/mentho.xml new file mode 100644 index 0000000..69a1839 --- /dev/null +++ b/app/src/main/res/font/mentho.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/font_certs.xml b/app/src/main/res/values/font_certs.xml new file mode 100644 index 0000000..d2226ac --- /dev/null +++ b/app/src/main/res/values/font_certs.xml @@ -0,0 +1,17 @@ + + + + @array/com_google_android_gms_fonts_certs_dev + @array/com_google_android_gms_fonts_certs_prod + + + + MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs= + + + + + MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK + + + diff --git a/app/src/main/res/values/preloaded_fonts.xml b/app/src/main/res/values/preloaded_fonts.xml new file mode 100644 index 0000000..92ab30c --- /dev/null +++ b/app/src/main/res/values/preloaded_fonts.xml @@ -0,0 +1,7 @@ + + + + @font/alex_brush + @font/calligraffitti + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 16f9e48..fe8f586 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,68 @@ + ##App Main Ophelia + A Polycule Pocket-dex + Get Started + Welcome Back + + ##Routes + polyculeHome + home + + ##Bio Add Bio Edit Bio + Finish Bio Loaded Open context menu + Name + New Bio Added! + Bio Edited! + Welcome Aboard! + + + ##Tags + Monogamous + Plural + Furry + Therian + BDSM + Alcohol + Weed + Asexual + Transgender + + ##Ophelia + Ophelia Says + What do you think; looks like you? + + Hi! + I\'m Ophelia, a Polycule companion system designed to help you keep track of your metas, reference a charter, and find things in common with your polycule. + I\'m meant to work dynamically with how polyamory works for you, so what all those words mean will be something we work out together later. + First, I need to get to know "you". + Click Go to get started. + + + I\'m Ophelia, what\'s your name\? + Your Name is how you\'ll be addressed in the app, and is the primary way you\'ll be referred to in polycules. + But don\'t worry; your name, like everything about you, can be changed at any time! + + "Nice to meet you,%1$s! + + Personal Pronouns are words used to refer to a person without always using their name. + Since Pronouns are a personal choice, I want to leave them as open as possible for you! + We\'re dealing with four Personal Pronouns, and using mine as an example: She (subjective) / Her (objective) / Hers (possessive) / Herself (reflexive) + Your Pronouns will be used when referring to you in specific contexts, and are displayed alongside your name in most contexts. + + + Tags are a way to highlight important things about yourself. + They also lead to more detailed parts of you bio, where you can flesh out specific parts of your bio. + + + + Great! + Now, there\'s just one more thing! We need to create a polycule for you. A "polycule" for our purposes is defined as a group of people with a shared relationship process. + A person may be in a polycule with any number of people, including just themselves, and in any number of polycules. + All we need to get started is a name: + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 39f3210..cc86467 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.1.2' apply false + id 'com.android.application' version '8.1.3' apply false id 'org.jetbrains.kotlin.android' version '1.8.10' apply false id 'com.google.devtools.ksp' version '1.8.10-1.0.9' apply false } \ No newline at end of file