Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
.gradle
/local.properties
/.idea
/build
build/
.DS_Store
/.kotlin
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,3 +180,28 @@ https://github.com/pedroSG94/RootEncoder/tree/master/app/src/main/java/com/pedro

Code example for low API devices (Android API 16+):
https://github.com/pedroSG94/RootEncoder/tree/master/app/src/main/java/com/pedro/streamer/oldapi

## DK Release and Deploy

We use the [axion-release-plugin](https://axion-release-plugin.readthedocs.io/en/latest/) to help with versioning and releases.

Basic workflow with axion-release:
```
$ ./gradlew currentVersion
0.1.0

$ git commit -m "Some commit."

$ ./gradlew currentVersion
0.1.1-SNAPSHOT

// Create a new tag and push it to remote
$ ./gradlew release

$ git tag
project-0.1.0
project-0.1.1

// Upload release to dk-maven
$ ./gradlew publish
```
2 changes: 0 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ android {
applicationId = "com.pedro.streamer"
minSdk = 16
targetSdk = 36
versionCode = project.version.toString().replace(".", "").toInt()
versionName = project.version.toString()
multiDexEnabled = true
}
buildTypes {
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/java/com/pedro/streamer/file/FromFileActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.pedro.common.ConnectChecker
import com.pedro.common.Throughput
import com.pedro.encoder.input.decoder.AudioDecoderInterface
import com.pedro.encoder.input.decoder.VideoDecoderInterface
import com.pedro.library.base.recording.RecordController
Expand Down Expand Up @@ -194,6 +195,13 @@ class FromFileActivity : AppCompatActivity(), ConnectChecker,

override fun onNewBitrate(bitrate: Long) {}

override fun onStreamingStats(
bitrate: Long,
bytesSent: Long,
bytesQueued: Long,
throughput: Throughput
) {
}
override fun onDisconnect() {
toast("Disconnected")
}
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/java/com/pedro/streamer/oldapi/OldApiActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.pedro.common.ConnectChecker
import com.pedro.common.Throughput
import com.pedro.encoder.input.video.CameraHelper
import com.pedro.encoder.input.video.CameraOpenException
import com.pedro.library.base.recording.RecordController
Expand Down Expand Up @@ -151,6 +152,13 @@ class OldApiActivity : AppCompatActivity(), ConnectChecker, TextureView.SurfaceT

override fun onNewBitrate(bitrate: Long) {}

override fun onStreamingStats(
bitrate: Long,
bytesSent: Long,
bytesQueued: Long,
throughput: Throughput
) {
}
override fun onDisconnect() {
toast("Disconnected")
}
Expand Down
28 changes: 28 additions & 0 deletions build-logic/convention/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
plugins {
`kotlin-dsl`
}

repositories {
google()
mavenCentral()
gradlePluginPortal()
}

dependencies {
compileOnly("com.android.tools.build:gradle:8.2.2")
implementation("software.amazon.awssdk:codeartifact:2.20.68")
implementation("pl.allegro.tech.build:axion-release-plugin:1.15.4")
}

gradlePlugin {
plugins {
register("projectVersioning") {
id = "convention.project.versioning"
implementationClass = "plugins.VersioningConventionPlugin"
}
register("projectPublishing") {
id = "convention.publishing"
implementationClass = "plugins.PublishingConventionPlugin"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package extensions

open class PublishingConfigExtension(
var groupId: String = "",
var artifactId: String = "",
// CodeArtifact specific
var domain: String = "",
var domainOwner: String = "",
var repository: String = "",
var region: String = "us-east-1",
) {
fun groupId(value: String) {
groupId = value
}
fun artifactId(value: String) {
artifactId = value
}
fun domain(value: String) {
domain = value
}
fun domainOwner(value: String) {
domainOwner = value
}
fun repository(value: String) {
repository = value
}
fun region(value: String) {
region = value
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package extensions

open class VersioningExtension(
var tagPrefix: String = "",
var useHighestVersion: Boolean = true,
var initialVersion: String = "0.1.0",
) {

fun tagPrefix(value: String) {
tagPrefix = value
}

fun useHighestVersion(value: Boolean) {
useHighestVersion = value
}

fun initialVersion(value: String) {
initialVersion = value
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package plugins

import extensions.PublishingConfigExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.get
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.codeartifact.CodeartifactClient
import software.amazon.awssdk.services.codeartifact.model.GetAuthorizationTokenRequest

@Suppress("unused")
class PublishingConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("maven-publish")
}

val extension = extensions.create("publishingConfig", PublishingConfigExtension::class.java)

afterEvaluate {
configurePublishing(extension)
}
}
}

private fun Project.configurePublishing(extension: PublishingConfigExtension) {
extensions.configure<PublishingExtension> {
publications {
// Creates a Maven publication called "release".
create<MavenPublication>("release") {
// Applies the component for the release build variant.
from(components["release"])

// You can then customize attributes of the publication as shown below.
groupId = extension.groupId
artifactId = extension.artifactId
}
}
repositories {
// CodeArtifact repository
maven {
name = "CodeArtifact"
url = project.uri(getCodeArtifactRepoUrl(extension))
credentials {
username = "aws"
password = getCodeArtifactAuthToken(extension)
}
}
}
}
}

@Suppress("ktlint:standard:max-line-length")
private fun getCodeArtifactRepoUrl(extension: PublishingConfigExtension): String {
return "https://${extension.domain}-${extension.domainOwner}.d.codeartifact.${extension.region}.amazonaws.com/maven/${extension.repository}/"
}

private fun getCodeArtifactAuthToken(extension: PublishingConfigExtension): String {
val client = CodeartifactClient.builder()
.region(Region.of(extension.region))
.build()

val request = GetAuthorizationTokenRequest.builder()
.domain(extension.domain)
.domainOwner(extension.domainOwner)
.build()

return client.getAuthorizationToken(request).authorizationToken()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package plugins

import com.android.build.gradle.AppExtension
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.LibraryExtension
import extensions.VersioningExtension
import org.gradle.api.GradleException
import org.gradle.api.Plugin
import org.gradle.api.Project
import pl.allegro.tech.build.axion.release.ReleasePlugin
import pl.allegro.tech.build.axion.release.domain.VersionConfig

@Suppress("unused")
class VersioningConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
if (this != rootProject) {
throw GradleException(
"Versioning plugin can be applied to the root project only",
)
}

with(pluginManager) {
apply(ReleasePlugin::class.java)
}

val extension = extensions.create("versioning", VersioningExtension::class.java)

afterEvaluate {
configureVersioning(extension)
}
}
}

private fun Project.configureVersioning(extension: VersioningExtension) {
val scmConfig = extensions.getByType(VersionConfig::class.java).apply {
useHighestVersion.set(extension.useHighestVersion)
versionCreator("versionWithBranch")
tag {
prefix.set(extension.tagPrefix)
versionSeparator.set("")
initialVersion.set({ _, _ -> extension.initialVersion })
}
}
allprojects {
version = scmConfig.version
setupAndroidVersioning(scmConfig)
}
}

private fun Project.setupAndroidVersioning(scmConfig: VersionConfig) {
val configureVersion: BaseExtension.(String) -> Unit = { version ->
val minor = version.split(".")[0].toInt()
val major = version.split(".")[1].toInt()
val patch = version.split(".")[2].toInt()
defaultConfig.versionCode = minor * MINOR_MULTIPLIER + major * MAJOR_MULTIPLIER + patch
defaultConfig.versionName = "$minor.$major.$patch"
}
pluginManager.withPlugin("com.android.library") {
extensions.getByType(LibraryExtension::class.java).apply {
configureVersion(scmConfig.undecoratedVersion)
}
}
pluginManager.withPlugin("com.android.application") {
extensions.getByType(AppExtension::class.java).apply {
configureVersion(scmConfig.undecoratedVersion)
}
}
}

companion object {
private const val MINOR_MULTIPLIER = 1_000_000
private const val MAJOR_MULTIPLIER = 1_000
}
}
4 changes: 4 additions & 0 deletions build-logic/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Gradle properties are not passed to included builds https://github.com/gradle/gradle/issues/2534
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true
19 changes: 19 additions & 0 deletions build-logic/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}

dependencyResolutionManagement {
@Suppress("UnstableApiUsage")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}

rootProject.name = "build-logic"
include(":convention")
5 changes: 4 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
allprojects {
group = "com.github.pedroSG94"
group = "com.github.pedroSG94.RootEncoder"
version = "2.6.4"
}

Expand All @@ -8,6 +9,8 @@ plugins {
alias(libs.plugins.android.library) apply false
alias(libs.plugins.jetbrains.kotlin) apply false
alias(libs.plugins.jetbrains.dokka) apply true

id("convention.project.versioning")
}

tasks.register("clean") {
Expand Down
Loading