1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2026-05-16 18:32:11 +00:00

Initial support for compose multiplatform

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2026-01-07 12:45:46 +08:00
parent a26512db6c
commit f5fef15b72
28 changed files with 1000 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
/*
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.jetbrains.kotlin.multiplatform)
alias(libs.plugins.jetbrains.kotlin.compose)
alias(libs.plugins.jetbrains.compose.multiplatform)
alias(libs.plugins.koin)
}
kotlin {
jvmToolchain(21)
compilerOptions {
optIn.addAll(
"androidx.compose.material3.ExperimentalMaterial3Api",
"androidx.compose.material3.ExperimentalMaterial3ExpressiveApi",
"androidx.compose.foundation.layout.ExperimentalLayoutApi"
)
}
android {
namespace = "net.newpipe.app"
compileSdk {
version = release(36) {
minorApiLevel = 1
}
}
minSdk = 23
androidResources {
enable = true
}
}
listOf(
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
}
}
jvm()
sourceSets {
commonMain.dependencies {
implementation(libs.jetbrains.compose.runtime)
implementation(libs.jetbrains.compose.foundation)
implementation(libs.jetbrains.compose.material3)
implementation(libs.jetbrains.compose.ui)
implementation(libs.jetbrains.compose.resources)
implementation(libs.jetbrains.compose.preview)
implementation(libs.jetbrains.lifecycle.viewmodel)
implementation(libs.jetbrains.navigation3.ui)
implementation(libs.jetbrains.lifecycle.navigation3)
implementation(libs.koin.compose.viewmodel)
implementation(libs.koin.annotations)
}
commonTest.dependencies {
implementation(libs.kotlin.test)
}
androidMain.dependencies {
implementation(libs.jetbrains.compose.preview)
implementation(libs.androidx.activity)
}
jvmMain.dependencies {
implementation(compose.desktop.currentOs)
implementation(libs.jetbrains.coroutines.swing)
}
}
}
dependencies {
androidRuntimeClasspath(libs.jetbrains.compose.tooling)
}
compose.desktop {
application {
mainClass = "net.newpipe.app.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "net.newpipe.app"
packageVersion = "1.0.0"
}
}
}
koinCompiler {
userLogs = true // See what the compiler plugin detects
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
~ SPDX-License-Identifier: GPL-3.0-or-later
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name="net.newpipe.app.ComposeActivity"
android:exported="false" />
</application>
</manifest>
@@ -0,0 +1,25 @@
/*
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
/**
* Entry point for compose-related UI components on Android
*/
class ComposeActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
setContent {
App()
}
}
}
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
~ SPDX-License-Identifier: GPL-3.0-or-later
-->
<resources>
<string name="app_name">NewPipe</string>
</resources>
@@ -0,0 +1,23 @@
/*
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import net.newpipe.app.di.KoinApp
import net.newpipe.app.theme.AppTheme
import org.koin.compose.KoinApplication
import org.koin.plugin.module.dsl.koinConfiguration
@Composable
@Preview
fun App() {
KoinApplication(configuration = koinConfiguration<KoinApp>()) {
AppTheme {
}
}
}
@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app.di
import org.koin.core.annotation.KoinApplication
/**
* Entry point for Koin-related configuration
*/
@KoinApplication
object KoinApp
@@ -0,0 +1,81 @@
/*
* SPDX-FileCopyrightText: 2024 NewPipe contributors <https://newpipe.net>
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app.theme
import androidx.compose.ui.graphics.Color
val primaryLight = Color(0xFF904A45)
val onPrimaryLight = Color(0xFFFFFFFF)
val primaryContainerLight = Color(0xFFFFDAD6)
val onPrimaryContainerLight = Color(0xFF3B0908)
val secondaryLight = Color(0xFF775653)
val onSecondaryLight = Color(0xFFFFFFFF)
val secondaryContainerLight = Color(0xFFFFDAD6)
val onSecondaryContainerLight = Color(0xFF2C1513)
val tertiaryLight = Color(0xFF725B2E)
val onTertiaryLight = Color(0xFFFFFFFF)
val tertiaryContainerLight = Color(0xFFFEDEA6)
val onTertiaryContainerLight = Color(0xFF261900)
val errorLight = Color(0xFFBA1A1A)
val onErrorLight = Color(0xFFFFFFFF)
val errorContainerLight = Color(0xFFFFDAD6)
val onErrorContainerLight = Color(0xFF410002)
val backgroundLight = Color(0xFFFFF8F7)
val onBackgroundLight = Color(0xFF231918)
val surfaceLight = Color(0xFFFFF8F7)
val onSurfaceLight = Color(0xFF231918)
val surfaceVariantLight = Color(0xFFF5DDDB)
val onSurfaceVariantLight = Color(0xFF534342)
val outlineLight = Color(0xFF857371)
val outlineVariantLight = Color(0xFFD8C2BF)
val scrimLight = Color(0xFF000000)
val inverseSurfaceLight = Color(0xFF392E2D)
val inverseOnSurfaceLight = Color(0xFFFFEDEB)
val inversePrimaryLight = Color(0xFFFFB3AC)
val surfaceDimLight = Color(0xFFE8D6D4)
val surfaceBrightLight = Color(0xFFFFF8F7)
val surfaceContainerLowestLight = Color(0xFFFFFFFF)
val surfaceContainerLowLight = Color(0xFFFFF0EF)
val surfaceContainerLight = Color(0xFFFCEAE8)
val surfaceContainerHighLight = Color(0xFFF6E4E2)
val surfaceContainerHighestLight = Color(0xFFF1DEDC)
val primaryDark = Color(0xFFFFB3AC)
val onPrimaryDark = Color(0xFF571E1B)
val primaryContainerDark = Color(0xFF73332F)
val onPrimaryContainerDark = Color(0xFFFFDAD6)
val secondaryDark = Color(0xFFE7BDB8)
val onSecondaryDark = Color(0xFF442927)
val secondaryContainerDark = Color(0xFF5D3F3C)
val onSecondaryContainerDark = Color(0xFFFFDAD6)
val tertiaryDark = Color(0xFFE1C38C)
val onTertiaryDark = Color(0xFF402D04)
val tertiaryContainerDark = Color(0xFF584419)
val onTertiaryContainerDark = Color(0xFFFEDEA6)
val errorDark = Color(0xFFFFB4AB)
val onErrorDark = Color(0xFF690005)
val errorContainerDark = Color(0xFF93000A)
val onErrorContainerDark = Color(0xFFFFDAD6)
val backgroundDark = Color(0xFF1A1110)
val onBackgroundDark = Color(0xFFF1DEDC)
val surfaceDark = Color(0xFF1A1110)
val onSurfaceDark = Color(0xFFF1DEDC)
val surfaceVariantDark = Color(0xFF534342)
val onSurfaceVariantDark = Color(0xFFD8C2BF)
val outlineDark = Color(0xFFA08C8A)
val outlineVariantDark = Color(0xFF534342)
val scrimDark = Color(0xFF000000)
val inverseSurfaceDark = Color(0xFFF1DEDC)
val inverseOnSurfaceDark = Color(0xFF392E2D)
val inversePrimaryDark = Color(0xFF904A45)
val surfaceDimDark = Color(0xFF1A1110)
val surfaceBrightDark = Color(0xFF423735)
val surfaceContainerLowestDark = Color(0xFF140C0B)
val surfaceContainerLowDark = Color(0xFF231918)
val surfaceContainerDark = Color(0xFF271D1C)
val surfaceContainerHighDark = Color(0xFF322827)
val surfaceContainerHighestDark = Color(0xFF3D3231)
@@ -0,0 +1,101 @@
/*
* SPDX-FileCopyrightText: 2024 NewPipe contributors <https://newpipe.net>
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialExpressiveTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
private val lightScheme = lightColorScheme(
primary = primaryLight,
onPrimary = onPrimaryLight,
primaryContainer = primaryContainerLight,
onPrimaryContainer = onPrimaryContainerLight,
secondary = secondaryLight,
onSecondary = onSecondaryLight,
secondaryContainer = secondaryContainerLight,
onSecondaryContainer = onSecondaryContainerLight,
tertiary = tertiaryLight,
onTertiary = onTertiaryLight,
tertiaryContainer = tertiaryContainerLight,
onTertiaryContainer = onTertiaryContainerLight,
error = errorLight,
onError = onErrorLight,
errorContainer = errorContainerLight,
onErrorContainer = onErrorContainerLight,
background = backgroundLight,
onBackground = onBackgroundLight,
surface = surfaceLight,
onSurface = onSurfaceLight,
surfaceVariant = surfaceVariantLight,
onSurfaceVariant = onSurfaceVariantLight,
outline = outlineLight,
outlineVariant = outlineVariantLight,
scrim = scrimLight,
inverseSurface = inverseSurfaceLight,
inverseOnSurface = inverseOnSurfaceLight,
inversePrimary = inversePrimaryLight,
surfaceDim = surfaceDimLight,
surfaceBright = surfaceBrightLight,
surfaceContainerLowest = surfaceContainerLowestLight,
surfaceContainerLow = surfaceContainerLowLight,
surfaceContainer = surfaceContainerLight,
surfaceContainerHigh = surfaceContainerHighLight,
surfaceContainerHighest = surfaceContainerHighestLight,
)
private val darkScheme = darkColorScheme(
primary = primaryDark,
onPrimary = onPrimaryDark,
primaryContainer = primaryContainerDark,
onPrimaryContainer = onPrimaryContainerDark,
secondary = secondaryDark,
onSecondary = onSecondaryDark,
secondaryContainer = secondaryContainerDark,
onSecondaryContainer = onSecondaryContainerDark,
tertiary = tertiaryDark,
onTertiary = onTertiaryDark,
tertiaryContainer = tertiaryContainerDark,
onTertiaryContainer = onTertiaryContainerDark,
error = errorDark,
onError = onErrorDark,
errorContainer = errorContainerDark,
onErrorContainer = onErrorContainerDark,
background = backgroundDark,
onBackground = onBackgroundDark,
surface = surfaceDark,
onSurface = onSurfaceDark,
surfaceVariant = surfaceVariantDark,
onSurfaceVariant = onSurfaceVariantDark,
outline = outlineDark,
outlineVariant = outlineVariantDark,
scrim = scrimDark,
inverseSurface = inverseSurfaceDark,
inverseOnSurface = inverseOnSurfaceDark,
inversePrimary = inversePrimaryDark,
surfaceDim = surfaceDimDark,
surfaceBright = surfaceBrightDark,
surfaceContainerLowest = surfaceContainerLowestDark,
surfaceContainerLow = surfaceContainerLowDark,
surfaceContainer = surfaceContainerDark,
surfaceContainerHigh = surfaceContainerHighDark,
surfaceContainerHighest = surfaceContainerHighestDark,
)
@Composable
fun AppTheme(useDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
MaterialExpressiveTheme(
colorScheme = when {
!useDarkTheme -> lightScheme
else -> darkScheme
},
content = content
)
}
@@ -0,0 +1,10 @@
/*
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app
import androidx.compose.ui.window.ComposeUIViewController
fun MainViewController() = ComposeUIViewController { App() }
@@ -0,0 +1,21 @@
/*
* SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package net.newpipe.app
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import newpipe.composeapp.generated.resources.Res
import newpipe.composeapp.generated.resources.app_name
import org.jetbrains.compose.resources.stringResource
/**
* Entry point for compose-related UI components on Desktop
*/
fun main() = application {
Window(onCloseRequest = ::exitApplication, title = stringResource(Res.string.app_name)) {
App()
}
}