blob: b37b380e88254b1759a271d6f91334a5ba0eba39 [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.4.0-alpha04'
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(project(":compose:foundation:foundation"))
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")
implementation('androidx.media3:media3-exoplayer:1.0.0-beta03')
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",
"01908be77830b70de53736dfab57d9db"
)
)
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",
"b27d616f6e4758d9e5cfd721cd74f696"
)
)
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",
"79d9698efce71af7507adb1f1f13d587"
)
)
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",
"9ad614f60b201360f2c276678674a09d"
)
)
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",
"a209b6cf2bcd8a0aff71488ab28c215f"
)
)
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",
"5cc9c72197679de004d98b73ffacf038"
)
)
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",
"15ed411b8761387c1c0602b68185e312"
)
)
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",
"a42bc6b7859e14871492ff27ca9bd9a2"
)
)
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/LazyListSemantics.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",
"bf426a9ae63c2195a88cb382e9e8033e"
)
)
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",
"838dc7602c43c0210a650340110f5f94"
)
)
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",
"c63daa5bd3a004f08fc14a510765b681"
)
)
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",
"20f7055a2556d1c8ccd12873b1d8af2a"
)
)
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",
"65b541f64ffc6267ebe7852497a4f37f"
)
)
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",
"1a9f3308a5865beb6b53f547493f8d20"
)
)
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",
"2a794820a36acc55a13d95fd65d03f45"
)
)
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",
"0e55034861317320888b77f5183b326f"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredItem.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyMeasuredItem.kt",
"8bbfd4cdd2d1f090f51ffb0f2d625309"
)
)
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",
"e36c6adfcd6cef885600d62775de0917"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasuredLine.kt",
"src/main/java/androidx/tv/foundation/lazy/grid/LazyMeasuredLine.kt",
"dedf02d724fb6d470f9566dbf6a260f9"
)
)
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",
"04949bb943c61f7a18358c3e5543318e"
)
)
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/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",
"1e2ff3f4fcaa528d1011f32c8a87e100"
)
)
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",
"f9d4a924665f65ac319b6071358431b9"
)
)
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",
"d07400716d6139405135ffbfe042b762"
)
)
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",
"c769969ce9a74ee6006d1c0b76b47095"
)
)
copiedClasses.add(
new CopiedClass(
"../../compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/ContentInViewModifier.kt",
"src/main/java/androidx/tv/foundation/ContentInViewModifier.kt",
"6dec263110d0fe60021cf6fb9c93bd90"
)
)
copiedClasses.add(
new CopiedClass(
"compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemanticState.kt",
"src/main/java/androidx/tv/foundation/lazy/layout/LazyLayoutSemanticState.kt",
"ad"
)
)
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 printCopiedClasses {
doLast {
copiedClasses.forEach(copiedClass -> {
String actualMd5 = generateMd5(copiedClass.originalFilePath)
System.out.println(copiedClass.toString(actualMd5))
})
}
}
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 + "\'"
}
String toString(String actualHash) {
return "copiedClasses.add(\n" +
" new CopiedClass(\n" +
" \"$originalFilePath\",\n" +
" \"$copyFilePath\",\n" +
" \"$actualHash\"\n" +
" )\n" +
")\n"
}
}