blob: d258974821590fe6a4f0bc70b23e676097ee9894 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* 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
*
* http://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.
*/
import androidx.build.LibraryType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.security.MessageDigest
import java.util.stream.Collectors
plugins {
id("AndroidXPlugin")
id("AndroidXComposePlugin")
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
dependencies {
api(libs.kotlinStdlib)
def composeVersion = '1.3.0-rc01'
implementation(libs.kotlinStdlibCommon)
implementation("androidx.profileinstaller:profileinstaller:1.2.0")
api(project(":compose:ui:ui"))
api("androidx.annotation:annotation:1.5.0")
api("androidx.compose.animation:animation:$composeVersion")
api("androidx.compose.runtime:runtime:$composeVersion")
api("androidx.compose.foundation:foundation:$composeVersion")
api("androidx.compose.foundation:foundation-layout:$composeVersion")
api("androidx.compose.ui:ui-graphics:$composeVersion")
api("androidx.compose.ui:ui-text:$composeVersion")
api("androidx.compose.ui:ui-util:$composeVersion")
androidTestImplementation(libs.truth)
androidTestImplementation(project(":compose:ui:ui-test"))
androidTestImplementation(project(":compose:ui:ui-test-junit4"))
androidTestImplementation(project(":compose:test-utils"))
androidTestImplementation(libs.testRunner)
}
android {
namespace "androidx.tv.foundation"
defaultConfig {
minSdkVersion 21
}
lintOptions {
disable 'IllegalExperimentalApiUsage' // TODO (b/233188423): Address before moving to beta
}
}
androidx {
name = "androidx.tv:tv-foundation"
type = LibraryType.PUBLISHED_LIBRARY
inceptionYear = "2022"
description = "This library makes it easier for developers" +
"to write Jetpack Compose applications for TV devices by providing " +
"functionality to support TV specific devices sizes, shapes and d-pad navigation " +
"supported components. It builds upon the Jetpack Compose libraries."
targetsJavaConsumers = false
}
// Functions and tasks to monitor changes in copied files.
task generateMd5 {
ext.genMd5 = { fileNameToHash ->
MessageDigest digest = MessageDigest.getInstance("MD5")
file(fileNameToHash).withInputStream(){is->
byte[] buffer = new byte[8192]
int read = 0
while( (read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
}
byte[] md5sum = digest.digest()
BigInteger bigInt = new BigInteger(1, md5sum)
bigInt.toString(16).padLeft(32, '0')
}
doLast {
String hashValue = genMd5(file)
print "value="
println hashValue
}
}
List<CopiedClass> copiedClasses = new ArrayList<>();
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt",
"src/main/java/androidx/tv/foundation/ScrollableWithPivot.kt",
"86acc593cd77d52784532163b5ab8156"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/DataIndex.kt",
"src/main/java/androidx/tv/foundation/lazy/list/DataIndex.kt",
"2aa3c6d2dd05057478e723b2247517e1"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScopeImpl.kt",
"src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl.kt",
"37cb0caf8a170a4161da346806c7a236"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListHeaders.kt",
"4d71c69f9cb38f741da9cfc4109567dd"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemPlacementAnimator.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator.kt",
"a74bfa05e68e2b6c2e108f022dfbfa26"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListItemProvider.kt",
"4c69e8a60a068e1e8191ed3840868881"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyList.kt",
"22078ee2f09dce3f39cdc23dc1188a82"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListMeasure.kt",
"c58eaf4619972afbee7da7714dc072fc"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListMeasureResult.kt",
"d4407572c6550d184133f8b3fd37869f"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScopeImpl.kt",
"src/main/java/androidx/tv/foundation/lazy/list/TvLazyListScopeImpl.kt",
"fab951ddba90c5c5426e4d0104bc9929"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollPosition.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListScrollPosition.kt",
"08d08515f25eb3032f6efbf9f86be102"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt",
"1d16fbb5025b282ffeb8fe3a63a9de3d"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItem.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyMeasuredItem.kt",
"c1b403d4fcd43c423b3f1b0433e8bb43"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItemProvider.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyMeasuredItemProvider.kt",
"0dcde73635efe26203f70351437cb6fa"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazySemantics.kt",
"3a1e86a55ea2282c12745717b5a60cfd"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/ItemIndex.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/ItemIndex.kt",
"1031b8b91a81c684b3c4584bc93d3fb0"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridDsl.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridDsl.kt",
"6a0b2db56ef38fb1ac004e4fc9847db8"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemInfo.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridItemInfo.kt",
"1f3b13ee45de79bc67ace4133e634600"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemPlacementAnimator.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridItemPlacementAnimator.kt",
"6f93637153ebd05d9cba7ebaf12311c9"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScopeImpl.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridItemScopeImpl.kt",
"b3ff4600791c73028b8661c0e2b49110"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScope.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridItemScope.kt",
"1a40313cc5e67b5808586c012bbfb058"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridItemProvider.kt",
"ba8ee64efc5bcd18f28fe9bb9d987166"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGrid.kt",
"3f91a6975c10c6a49ddc21f7828d7298"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridLayoutInfo.kt",
"b421c5e74856a78982efe0d8a79d10cb"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridMeasure.kt",
"c600148ddfab1dde9f3ebe8349e77001"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult.kt",
"1277598d36d8507d7bf0305cc629a11c"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScopeImpl.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridScopeImpl.kt",
"e92ebc01a8b205d304e0b0d3c40636f8"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScopeMarker.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridScopeMarker.kt",
"0b7ff258a80e2413f89d56ab0ef41b46"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollPosition.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridScrollPosition.kt",
"70bac76aeb2617b8f5c706f1867800fd"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpan.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridSpan.kt",
"cc63cb4f05cc556e8fcf7504ac0ea57c"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider.kt",
"062f95aa00d36fb1e048aa1ddb8154bc"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridState.kt",
"c6b402b685824ff216650da77063a131"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyMeasuredItem.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyMeasuredItem.kt",
"b9e6230825d8688bf1164abef07b4e14"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyMeasuredItemProvider.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyMeasuredItemProvider.kt",
"ab9a58f65e85b4fe4d621e9ed5b2db68"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyMeasuredLine.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyMeasuredLine.kt",
"3b99751e25cebc9945df800ce1aa04f8"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyMeasuredLineProvider.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyMeasuredLineProvider.kt",
"e2bdba6cdbc870ea9607658ec60eb1eb"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazySemantics.kt",
"bb397307f2cc3fd87bcc7585bf403039"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyDsl.kt",
"9d86fad30c0f3de2231fbef3f63db53e"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPinningModifier.kt",
"src/main/java/androidx/tv/foundation/lazy/LazyListPinningModifier.kt",
"e37450505d13ab0fd1833f136ec8aa3c"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyScopeMarker.kt",
"src/main/java/androidx/tv/foundation/lazy/list/TvLazyListScopeMarker.kt",
"f7b72b3c6bad88868153300b9fbdd922"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt",
"src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemScope.kt",
"6254294540cfadf2d6da1bbbce1611e8"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemInfo.kt",
"src/main/java/androidx/tv/foundation/lazy/list/TvLazyListItemInfo.kt",
"7571daa18ca079fd6de31d37c3022574"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt",
"src/main/java/androidx/tv/foundation/lazy/list/TvLazyListLayoutInfo.kt",
"fa1dffc993bdc486e0819c5d8018cda3"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt",
"src/main/java/androidx/tv/foundation/lazy/layout/LazyLayoutSemantics.kt",
"8b9e4a03c5097b4ef7377f98da95bbcd"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyAnimateScroll.kt",
"src/main/java/androidx/tv/foundation/lazy/layout/LazyAnimateScroll.kt",
"72859815545394de5b9f7269f1366d21"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridAnimateScrollScope.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyGridAnimateScrollScope.kt",
"315f220a2674a50f82633a725dc39c1b"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListAnimateScrollScope.kt",
"src/main/java/androidx/tv/foundation/lazy/list/LazyListAnimateScrollScope.kt",
"d0d48557af324db3af7f4c46a6810026"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewModifier.kt",
"src/main/java/androidx/tv/foundation/ContentInViewModifier.kt",
"c08e23de9ddfed42c9dbb7569eef6198"
)
)
String generateMd5(String fileNameToHash) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5")
file(fileNameToHash).withInputStream() { is ->
byte[] buffer = new byte[8192]
int read
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
}
byte[] md5sum = digest.digest()
BigInteger bigInt = new BigInteger(1, md5sum)
bigInt.toString(16).padLeft(32, '0')
} catch (Exception e) {
throw new GradleException("Failed for file=$fileNameToHash", e)
}
}
task doCopiesNeedUpdate {
doLast {
List<String> failureFiles = new ArrayList<>()
boolean failures = false
copiedClasses.forEach(copiedClass -> {
assert file(copiedClass.originalFilePath).exists()
assert file(copiedClass.copyFilePath).exists()
try {
String actualMd5 = generateMd5(copiedClass.originalFilePath)
if (copiedClass.lastKnownGoodHash != actualMd5) {
failureFiles.add(copiedClass.toString()+ "\nactual= " + actualMd5 + "\n")
}
} catch (Exception e) {
logger.error("Failed for file=${copiedClass.originalFilePath}", e)
failures = true
}
})
if (!failureFiles.isEmpty()) {
throw new GradleException(
"Files that were copied have been updated at the source. " +
"Please update the copy and then" +
" update the hash in the compose-foundation build.gradle file." +
failureFiles.stream().collect(Collectors.joining("\n", "\n", "")) + "\ncount=${failureFiles.size()}")
}
if (failures) {
throw new GradleException("There were errors. Check the logs.")
}
}
}
class CopiedClass {
String originalFilePath
String copyFilePath
String lastKnownGoodHash
CopiedClass(String originalFilePath, String copyFilePath, String lastKnownGoodHash) {
this.originalFilePath = originalFilePath
this.copyFilePath = copyFilePath
this.lastKnownGoodHash = lastKnownGoodHash
}
@Override
String toString() {
return "originalFilePath='" + originalFilePath + '\'\n' +
"copyFilePath='" + copyFilePath + '\'\n' +
"lastKnownGoodHash='" + lastKnownGoodHash + '\'\n' +
"diffCmd='" + "kdiff3 " + originalFilePath + " " + copyFilePath + "\'"
}
}