commit f35f4f7983efdc2aca3301115805b145e477cab4 Author: Alan Brault Date: Sat Jan 17 08:34:40 2026 -0500 chore: initial commit Signed-off-by: Alan Brault diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..83f65e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Gradle +.gradle/ +build/ +!gradle/wrapper/gradle-wrapper.jar + +# IDE - Android Studio / IntelliJ +*.iml +.idea/ + +# Android +local.properties +*.apk +*.aab +*.ap_ +*.dex +captures/ +.externalNativeBuild/ +.cxx/ +output.json + +# Kotlin +.kotlin/ +*.kotlin_module + +# Signing +*.jks +*.keystore +signing.properties + +# Logs +*.log + +# OS +.DS_Store +Thumbs.db + +# Test outputs +*.exec +*.ec diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..bc759fa --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,74 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.compose) +} + +android { + namespace = "io.visus.orbis" + compileSdk { + version = release(36) + } + + defaultConfig { + applicationId = "io.visus.orbis" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + buildFeatures { + compose = true + } +} + +dependencies { + // Project modules + implementation(project(":core:ui")) + implementation(project(":core:domain")) + implementation(project(":core:data")) + implementation(project(":feature:orb")) + + // AndroidX + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + + // Compose + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.material3) + + // Koin + implementation(platform(libs.koin.bom)) + implementation(libs.koin.core) + implementation(libs.koin.android) + implementation(libs.koin.androidx.compose) + implementation(libs.koin.androidx.compose.navigation) + + // Testing + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.compose.ui.test.junit4) + debugImplementation(libs.androidx.compose.ui.tooling) + debugImplementation(libs.androidx.compose.ui.test.manifest) +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/io/visus/orbis/ExampleInstrumentedTest.kt b/app/src/androidTest/java/io/visus/orbis/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..e0ba1c2 --- /dev/null +++ b/app/src/androidTest/java/io/visus/orbis/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package io.visus.orbis + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("io.visus.orbis", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..299aaa3 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/io/visus/orbis/MainActivity.kt b/app/src/main/java/io/visus/orbis/MainActivity.kt new file mode 100644 index 0000000..2a4fe0c --- /dev/null +++ b/app/src/main/java/io/visus/orbis/MainActivity.kt @@ -0,0 +1,25 @@ +package io.visus.orbis + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import io.visus.orbis.core.ui.OrbisTheme +import io.visus.orbis.ui.main.MainScreen +import io.visus.orbis.ui.main.MainViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel + +class MainActivity : ComponentActivity() { + private val viewModel: MainViewModel by viewModel() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enableEdgeToEdge() + setContent { + OrbisTheme { + MainScreen(viewModel = viewModel) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/io/visus/orbis/OrbisApplication.kt b/app/src/main/java/io/visus/orbis/OrbisApplication.kt new file mode 100644 index 0000000..c745a4c --- /dev/null +++ b/app/src/main/java/io/visus/orbis/OrbisApplication.kt @@ -0,0 +1,20 @@ +package io.visus.orbis + +import android.app.Application +import io.visus.orbis.di.appModule +import io.visus.orbis.feature.orb.di.orbModule +import org.koin.android.ext.koin.androidContext +import org.koin.android.ext.koin.androidLogger +import org.koin.core.context.startKoin + +class OrbisApplication : Application() { + override fun onCreate() { + super.onCreate() + + startKoin { + androidLogger() + androidContext(this@OrbisApplication) + modules(appModule, orbModule) + } + } +} diff --git a/app/src/main/java/io/visus/orbis/di/AppModule.kt b/app/src/main/java/io/visus/orbis/di/AppModule.kt new file mode 100644 index 0000000..576707b --- /dev/null +++ b/app/src/main/java/io/visus/orbis/di/AppModule.kt @@ -0,0 +1,9 @@ +package io.visus.orbis.di + +import io.visus.orbis.ui.main.MainViewModel +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.module + +val appModule = module { + viewModelOf(::MainViewModel) +} diff --git a/app/src/main/java/io/visus/orbis/ui/main/MainScreen.kt b/app/src/main/java/io/visus/orbis/ui/main/MainScreen.kt new file mode 100644 index 0000000..c3a412c --- /dev/null +++ b/app/src/main/java/io/visus/orbis/ui/main/MainScreen.kt @@ -0,0 +1,42 @@ +package io.visus.orbis.ui.main + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.visus.orbis.core.ui.OrbisTheme + +@Composable +fun MainScreen( + viewModel: MainViewModel +) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + MainScreenContent(uiState = uiState) +} + +@Composable +private fun MainScreenContent( + uiState: MainUiState, + modifier: Modifier = Modifier +) { + Scaffold(modifier = modifier.fillMaxSize()) { innerPadding -> + Text( + text = "Hello ${uiState.greeting}!", + modifier = Modifier.padding(innerPadding) + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun MainScreenPreview() { + OrbisTheme { + MainScreenContent(uiState = MainUiState()) + } +} diff --git a/app/src/main/java/io/visus/orbis/ui/main/MainViewModel.kt b/app/src/main/java/io/visus/orbis/ui/main/MainViewModel.kt new file mode 100644 index 0000000..2f2d734 --- /dev/null +++ b/app/src/main/java/io/visus/orbis/ui/main/MainViewModel.kt @@ -0,0 +1,21 @@ +package io.visus.orbis.ui.main + +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +data class MainUiState( + val greeting: String = "Android" +) + +class MainViewModel : ViewModel() { + private val _uiState = MutableStateFlow(MainUiState()) + + val uiState: StateFlow = _uiState.asStateFlow() + + fun updateGreeting(name: String) { + _uiState.update { it.copy(greeting = name) } + } +} diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..5ffd36a --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Orbis + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..bdf2f0b --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +