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