From 965e445d04f783073108d33f9d3ba8978a3ed755 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 2 Sep 2024 20:02:06 +0200 Subject: [PATCH] Replace OSS licenses plugin with Licensee and some manually done UI. This should fix both configuration cache and reproducible F-droid builds. Cleanup and remove gplay/fdroid diff on open source licenses. Co-authored by @jmartinesp --- app/build.gradle.kts | 67 ++++++++-- app/src/gplay/AndroidManifest.xml | 12 -- .../OssOpenSourcesLicensesProvider.kt | 37 ------ app/src/gplay/res/values-night/colors.xml | 32 ----- app/src/gplay/res/values-v27/themes.xml | 25 ---- app/src/gplay/res/values/colors.xml | 32 ----- app/src/gplay/res/values/styles.xml | 23 ---- app/src/gplay/res/values/themes.xml | 41 ------ build.gradle.kts | 22 ---- features/licenses/api/build.gradle.kts | 28 +++++ .../api/OpenSourceLicensesEntryPoint.kt} | 10 +- features/licenses/impl/build.gradle.kts | 49 ++++++++ .../DefaultOpenSourcesLicensesEntryPoint.kt | 16 +-- .../licenses/impl/DependenciesFlowNode.kt | 79 ++++++++++++ .../licenses/impl/LicensesProvider.kt | 53 ++++++++ .../impl/details/DependenciesDetailsNode.kt | 54 ++++++++ .../impl/details/DependenciesDetailsView.kt | 90 +++++++++++++ .../impl/list/DependencyLicensesListNode.kt | 58 +++++++++ .../list/DependencyLicensesListPresenter.kt | 50 ++++++++ .../impl/list/DependencyLicensesListState.kt} | 15 ++- .../DependencyLicensesListStateProvider.kt | 61 +++++++++ .../impl/list/DependencyLicensesListView.kt | 118 ++++++++++++++++++ .../impl/model/DependencyLicenseItem.kt | 53 ++++++++ .../DependencyLicensesListPresenterTest.kt | 71 +++++++++++ .../impl/list/FakeLicensesProvider.kt | 29 +++++ features/preferences/impl/build.gradle.kts | 1 + .../preferences/impl/PreferencesFlowNode.kt | 15 ++- .../preferences/impl/about/AboutNode.kt | 8 +- .../preferences/impl/about/AboutPresenter.kt | 6 +- .../preferences/impl/about/AboutState.kt | 1 - .../impl/about/AboutStateProvider.kt | 6 +- .../preferences/impl/about/AboutView.kt | 10 +- .../impl/about/AboutPresenterTest.kt | 15 +-- .../preferences/impl/about/AboutViewTest.kt | 16 +-- gradle/libs.versions.toml | 3 +- .../main/kotlin/extension/AssetCopyTask.kt | 55 ++++++++ plugins/src/main/kotlin/extension/Utils.kt | 30 ++++- .../tests/konsist/KonsistClassNameTest.kt | 1 + 38 files changed, 983 insertions(+), 309 deletions(-) delete mode 100644 app/src/gplay/AndroidManifest.xml delete mode 100644 app/src/gplay/kotlin/io/element/android/x/licenses/OssOpenSourcesLicensesProvider.kt delete mode 100644 app/src/gplay/res/values-night/colors.xml delete mode 100644 app/src/gplay/res/values-v27/themes.xml delete mode 100644 app/src/gplay/res/values/colors.xml delete mode 100644 app/src/gplay/res/values/styles.xml delete mode 100644 app/src/gplay/res/values/themes.xml create mode 100644 features/licenses/api/build.gradle.kts rename features/{preferences/api/src/main/kotlin/io/element/android/features/preferences/api/OpenSourceLicensesProvider.kt => licenses/api/src/main/kotlin/io/element/android/features/licenses/api/OpenSourceLicensesEntryPoint.kt} (71%) create mode 100644 features/licenses/impl/build.gradle.kts rename app/src/fdroid/kotlin/io/element/android/x/licenses/FdroidOpenSourceLicensesProvider.kt => features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt (60%) create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DependenciesFlowNode.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/LicensesProvider.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsNode.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsView.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListPresenter.kt rename features/{preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/about/FakeOpenSourceLicensesProvider.kt => licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListState.kt} (62%) create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListStateProvider.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListView.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/model/DependencyLicenseItem.kt create mode 100644 features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListPresenterTest.kt create mode 100644 features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/list/FakeLicensesProvider.kt create mode 100644 plugins/src/main/kotlin/extension/AssetCopyTask.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7778a3246e..49641a16cd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,15 +17,19 @@ @file:Suppress("UnstableApiUsage") import com.android.build.api.variant.FilterConfiguration.FilterType.ABI +import com.android.build.gradle.internal.tasks.factory.dependsOn +import com.android.build.gradle.tasks.GenerateBuildConfig +import extension.AssetCopyTask +import extension.GitBranchNameValueSource +import extension.GitRevisionValueSource import extension.allEnterpriseImpl import extension.allFeaturesImpl import extension.allLibrariesImpl import extension.allServicesImpl -import extension.gitBranchName -import extension.gitRevision import extension.koverDependencies import extension.locales import extension.setupKover +import java.util.Locale plugins { id("io.element.android-compose-application") @@ -36,7 +40,8 @@ plugins { id(libs.plugins.firebaseAppDistribution.get().pluginId) alias(libs.plugins.knit) id("kotlin-parcelize") - id("com.google.android.gms.oss-licenses-plugin") + alias(libs.plugins.licensee) + alias(libs.plugins.kotlin.serialization) // To be able to update the firebase.xml files, uncomment and build the project // id("com.google.gms.google-services") } @@ -61,9 +66,6 @@ android { abiFilters += listOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64") } - buildConfigField("String", "GIT_REVISION", "\"${gitRevision()}\"") - buildConfigField("String", "GIT_BRANCH_NAME", "\"${gitBranchName()}\"") - // Ref: https://developer.android.com/studio/build/configure-apk-splits.html#configure-abi-split splits { // Configures multiple APKs based on ABI. @@ -215,6 +217,9 @@ androidComponents { output.versionCode.set((output.versionCode.orNull ?: 0) * 10 + abiCode) } } + + val reportingExtension: ReportingExtension = project.extensions.getByType(ReportingExtension::class.java) + configureLicensesTasks(reportingExtension) } // Knit @@ -259,8 +264,6 @@ dependencies { // Comment to not include unified push in the project implementation(projects.libraries.pushproviders.unifiedpush) - "gplayImplementation"(libs.play.services.oss.licenses) - implementation(libs.appyx.core) implementation(libs.androidx.splash) implementation(libs.androidx.core) @@ -291,3 +294,51 @@ dependencies { koverDependencies() } + +tasks.withType().configureEach { + outputs.upToDateWhen { false } + val gitRevision = providers.of(GitRevisionValueSource::class.java) {}.get() + val gitBranchName = providers.of(GitBranchNameValueSource::class.java) {}.get() + android.defaultConfig.buildConfigField("String", "GIT_REVISION", "\"$gitRevision\"") + android.defaultConfig.buildConfigField("String", "GIT_BRANCH_NAME", "\"$gitBranchName\"") +} + +licensee { + allow("Apache-2.0") + allow("MIT") + allow("GPL-2.0-with-classpath-exception") + allow("BSD-2-Clause") + allowUrl("https://opensource.org/licenses/MIT") + allowUrl("https://developer.android.com/studio/terms.html") + allowUrl("http://openjdk.java.net/legal/gplv2+ce.html") + allowUrl("https://www.zetetic.net/sqlcipher/license/") + allowUrl("https://jsoup.org/license") + allowUrl("https://asm.ow2.io/license.html") + ignoreDependencies("com.github.matrix-org", "matrix-analytics-events") +} + +fun Project.configureLicensesTasks(reportingExtension: ReportingExtension) { + androidComponents { + onVariants { variant -> + val capitalizedVariantName = variant.name.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.getDefault()) + } else { + it.toString() + } + } + val artifactsFile = reportingExtension.file("licensee/android$capitalizedVariantName/artifacts.json") + + val copyArtifactsTask = + project.tasks.register("copy${capitalizedVariantName}LicenseeReportToAssets") { + inputFile.set(artifactsFile) + targetFileName.set("licensee-artifacts.json") + } + variant.sources.assets?.addGeneratedSourceDirectory( + copyArtifactsTask, + AssetCopyTask::outputDirectory, + ) + copyArtifactsTask.dependsOn("licenseeAndroid$capitalizedVariantName") + } + } +} diff --git a/app/src/gplay/AndroidManifest.xml b/app/src/gplay/AndroidManifest.xml deleted file mode 100644 index 234003d953..0000000000 --- a/app/src/gplay/AndroidManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/app/src/gplay/kotlin/io/element/android/x/licenses/OssOpenSourcesLicensesProvider.kt b/app/src/gplay/kotlin/io/element/android/x/licenses/OssOpenSourcesLicensesProvider.kt deleted file mode 100644 index 93848c438d..0000000000 --- a/app/src/gplay/kotlin/io/element/android/x/licenses/OssOpenSourcesLicensesProvider.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2024 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.element.android.x.licenses - -import android.app.Activity -import android.content.Intent -import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.preferences.api.OpenSourceLicensesProvider -import io.element.android.libraries.di.AppScope -import io.element.android.libraries.ui.strings.CommonStrings -import javax.inject.Inject - -@ContributesBinding(AppScope::class) -class OssOpenSourcesLicensesProvider @Inject constructor() : OpenSourceLicensesProvider { - override val hasOpenSourceLicenses: Boolean = true - - override fun navigateToOpenSourceLicenses(activity: Activity) { - val title = activity.getString(CommonStrings.common_open_source_licenses) - OssLicensesMenuActivity.setActivityTitle(title) - activity.startActivity(Intent(activity, OssLicensesMenuActivity::class.java)) - } -} diff --git a/app/src/gplay/res/values-night/colors.xml b/app/src/gplay/res/values-night/colors.xml deleted file mode 100644 index e830bc1cb1..0000000000 --- a/app/src/gplay/res/values-night/colors.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - #FF101317 - - #FFEBEEF2 - - #ff808994 - - #FF4187EB - - false - false - - diff --git a/app/src/gplay/res/values-v27/themes.xml b/app/src/gplay/res/values-v27/themes.xml deleted file mode 100644 index 99fe605d0a..0000000000 --- a/app/src/gplay/res/values-v27/themes.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - diff --git a/app/src/gplay/res/values/themes.xml b/app/src/gplay/res/values/themes.xml deleted file mode 100644 index 95f0429e0d..0000000000 --- a/app/src/gplay/res/values/themes.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -