Skip to content
Draft
Show file tree
Hide file tree
Changes from 4 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