2020-04-29 18:59:00 +00:00
import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.ApkVariantOutput
import com.android.build.gradle.api.ApplicationVariant
2021-01-12 04:04:28 +00:00
import com.github.jk1.license.render.TextReportRenderer
2018-12-27 15:40:57 +01:00
2018-01-23 00:18:43 +01:00
buildscript {
2023-05-20 14:00:41 +02:00
ext . kotlin_version = '1.8.21'
2013-10-14 16:10:58 +02:00
dependencies {
2023-05-28 11:45:29 +02:00
classpath 'com.android.tools.build:gradle:8.0.2'
2020-07-07 19:03:02 +05:30
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
2013-10-14 16:10:58 +02:00
}
}
2013-07-24 18:42:33 +02:00
2021-01-12 04:04:28 +00:00
plugins {
id 'com.github.jk1.dependency-license-report' version '1.16'
}
def licenseResDir = new File ( "$projectDir/build/dependency-license-res" )
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
2013-10-14 16:10:58 +02:00
android {
2023-04-25 23:37:31 +02:00
namespace 'org.kde.kdeconnect_tp'
2022-12-27 23:53:13 +01:00
compileSdkVersion 33
2016-05-19 09:38:24 -07:00
defaultConfig {
2023-01-23 22:02:01 +00:00
minSdkVersion 21
2023-03-04 16:20:26 +01:00
targetSdkVersion 32
2020-02-09 21:49:41 +01:00
proguardFiles getDefaultProguardFile ( 'proguard-android.txt' ) , 'proguard-rules.pro'
2016-03-03 11:16:26 -08:00
}
2020-07-08 05:01:35 +05:30
buildFeatures {
viewBinding true
2023-04-26 20:16:08 +00:00
compose true
2020-07-08 05:01:35 +05:30
}
2023-04-26 20:16:08 +00:00
composeOptions {
2023-05-20 14:00:41 +02:00
kotlinCompilerExtensionVersion = "1.4.7"
2023-04-26 20:16:08 +00:00
}
2016-05-19 09:38:24 -07:00
compileOptions {
2018-05-09 14:02:56 +02:00
sourceCompatibility JavaVersion . VERSION_1_8
targetCompatibility JavaVersion . VERSION_1_8
2020-07-01 07:25:02 +05:30
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
2014-11-22 17:04:37 -08:00
}
2020-07-07 19:03:02 +05:30
kotlinOptions {
jvmTarget = '1.8'
}
2018-10-16 14:39:00 +02:00
sourceSets {
2014-11-22 17:04:37 -08:00
main {
manifest . srcFile 'AndroidManifest.xml'
java . srcDirs = [ 'src' ]
resources . srcDirs = [ 'resources' ]
2021-01-23 03:23:16 -05:00
res . srcDirs = [ licenseResDir , 'res' ]
2014-11-22 17:04:37 -08:00
assets . srcDirs = [ 'assets' ]
}
2019-02-11 21:44:30 +01:00
test {
2015-06-10 12:29:53 +05:30
java . srcDirs = [ 'tests' ]
}
2013-10-14 16:10:58 +02:00
}
2014-01-10 23:26:32 +01:00
packagingOptions {
2022-03-03 23:58:23 +01:00
resources {
merges + = [ 'META-INF/DEPENDENCIES' , 'META-INF/LICENSE' , 'META-INF/NOTICE' ]
}
2014-03-29 01:47:15 +01:00
}
2019-09-07 14:31:55 +02:00
signingConfigs {
debug {
storeFile file ( "debug.keystore" )
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
2014-07-04 21:14:14 +02:00
buildTypes {
2016-06-16 23:47:11 +02:00
debug {
2020-02-09 21:49:41 +01:00
minifyEnabled true
2020-08-02 06:31:33 +00:00
shrinkResources true
2019-09-07 14:31:55 +02:00
signingConfig signingConfigs . debug
2016-06-16 23:47:11 +02:00
}
2020-03-11 01:00:53 -04:00
// keep minifyEnabled false above for faster builds; set to 'true'
// when testing to make sure ProGuard/R8 is not deleting important stuff
release {
2015-06-13 20:58:59 -07:00
minifyEnabled true
2020-08-02 06:31:33 +00:00
shrinkResources true
2015-06-13 20:58:59 -07:00
}
2014-07-04 21:14:14 +02:00
}
2022-03-03 23:58:23 +01:00
lint {
abortOnError false
checkReleaseBuilds false
}
2023-05-21 21:46:01 +02:00
testOptions {
unitTests . all {
jvmArgs + = [
"--add-opens" , "java.base/java.lang=ALL-UNNAMED" ,
"--add-opens" , "java.base/java.security=ALL-UNNAMED" ,
"--add-opens" , "java.base/sun.security.rsa=ALL-UNNAMED" ,
"--add-opens" , "java.base/sun.security.x509=ALL-UNNAMED" ,
"--add-opens" , "java.base/java.util=ALL-UNNAMED" ,
"--add-opens" , "java.base/java.lang.reflect=ALL-UNNAMED"
]
}
}
2013-10-14 16:10:58 +02:00
}
2013-10-29 16:17:18 +01:00
2020-04-29 18:59:00 +00:00
/ * *
* This is a special on - demand Gradle object .
*
* Its value will not be determined until someone calls one of the gitHashProvider . getXXX ( ) methods .
*
* If it does not encounter an explicit 'return' statement , getHashProvider . isPresent ( ) will return false .
* /
Provider < String > gitHashProvider = project . provider {
Process gitCommand = null
try {
// This invokes 'git' immediately, but does not wait for it to finish
gitCommand = 'git rev-parse --short HEAD' . execute ( [ ] , project . rootDir )
} catch ( IOException ignored ) {
}
if ( gitCommand = = null ) {
logger . log ( LogLevel . WARN , "Could not make use of the 'git' command-line tool. Output filenames will not be customized." )
} else if ( gitCommand . waitFor ( ) = = 0 ) {
// This call to '::getText' (using the 'text' Groovy accessor syntax) collects the
// output stream
return '-' + gitCommand . text . trim ( )
} else {
logger . log (
LogLevel . WARN ,
"Could not determine which commit is currently checked out -" +
" did you download this code without the .git directory?"
)
}
}
// We know we can safely cast the 'android' type to the 'AppExtension' class because
// we used the 'com.android.application' plugin at the top of the file.
//
// Note the use of the '::all' extension method; unlike '::each', it can detect every
// object added to the collection, no matter in which build phase that happens.
( android as AppExtension ) . applicationVariants . all { ApplicationVariant v - >
logger . log ( LogLevel . INFO , "Found a variant called '${v.name}'." )
if ( v . buildType . debuggable ) {
// We're looking at variants made from android.buildTypes.debug! This one
// might have multiple outputs, but only one output will be an APK file.
v . outputs . matching { it instanceof ApkVariantOutput } . all {
// Default output filename is "${project.name}-${v.name}.apk". We want
// the Git commit short-hash to be added onto that default filename.
( it as ApkVariantOutput ) . outputFileName = "${project.name}-${v.name}${gitHashProvider.getOrElse(" ")}.apk"
}
}
}
2020-07-07 19:03:02 +05:30
ext {
2023-03-17 18:34:53 +01:00
coroutines_version = '1.6.4'
2020-07-07 19:03:02 +05:30
}
2013-10-29 16:17:18 +01:00
dependencies {
2023-04-13 18:37:27 +02:00
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
2020-07-01 07:25:02 +05:30
2023-05-20 14:00:41 +02:00
implementation 'androidx.compose.material3:material3:1.1.0'
implementation 'androidx.compose.ui:ui-tooling-preview:1.4.3'
2023-05-31 13:40:29 +02:00
implementation 'androidx.activity:activity-compose:1.7.2'
2023-04-26 20:16:08 +00:00
implementation 'com.google.accompanist:accompanist-themeadapter-material3:0.31.0-alpha'
implementation 'androidx.constraintlayout:constraintlayout-compose:1.0.1'
2023-05-31 13:40:29 +02:00
implementation 'androidx.compose.ui:ui-tooling-preview:1.4.3'
debugImplementation 'androidx.compose.ui:ui-tooling:1.4.3'
2022-12-27 23:53:13 +01:00
implementation 'androidx.media:media:1.6.0'
2023-03-04 16:04:22 +01:00
implementation 'androidx.appcompat:appcompat:1.6.1'
2023-05-20 14:00:41 +02:00
implementation 'androidx.core:core-ktx:1.10.1'
2022-12-27 23:53:13 +01:00
implementation 'androidx.preference:preference-ktx:1.2.0'
2023-03-17 18:34:53 +01:00
implementation 'androidx.recyclerview:recyclerview:1.3.0'
2020-09-09 17:34:41 +05:30
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
2020-02-09 21:49:41 +01:00
implementation 'androidx.documentfile:documentfile:1.0.1'
2023-04-13 18:37:27 +02:00
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
2020-02-09 21:49:41 +01:00
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
2023-04-13 18:37:27 +02:00
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.1'
2020-03-27 20:23:02 +01:00
implementation 'androidx.gridlayout:gridlayout:1.0.0'
2023-05-20 14:00:41 +02:00
implementation 'com.google.android.material:material:1.9.0'
Add album cover art support.
Summary:
Fetches http(s) album art urls, as supplied by MPRIS, to display as album art. Fetched urls and failed fetches are cached to prevent unneccessary network activity.
The bulk of the code is in the fetching+caching class `AlbumArtCache`.
Takes the comments from d52be10 into account:
- The images (HTTP(S) only for now) are cached. This is limited to 5 MB on disk or 10 entries in memory.
- The image gets viewing space depending on the remaining screen space. Thus, controls should never be pushed off-screen.
- "Edge cases" like going from cover art to no cover art is handled correctly (actually a result of earlier mpris code changes).
Additionally, it adds a landscape mode to the MPRIS activity, which shows the cover art and controls side by side.
Desktop part is in D9563.
FEATURE: 345015
Test Plan: Works both with/without album art. Switching players and tracks correctly changes the album art.
Reviewers: #kde_connect, #vdg, albertvaka
Reviewed By: #kde_connect, albertvaka
Subscribers: albertvaka, ngraham, nicolasfella, apol
Differential Revision: https://phabricator.kde.org/D9564
2017-12-11 15:36:57 +01:00
implementation 'com.jakewharton:disklrucache:2.0.2' //For caching album art bitmaps
2015-08-10 00:26:58 -07:00
2018-11-02 13:02:49 +01:00
implementation 'org.apache.sshd:sshd-core:0.14.0'
2023-04-05 18:28:42 +02:00
implementation 'org.apache.mina:mina-core:2.0.19' //For some reason, makes sshd-core:0.14.0 work without NIO, which isn't available until Android 8 (api 26)
2016-01-10 08:22:56 -08:00
2019-03-08 13:44:54 +01:00
//implementation('com.github.bright:slf4android:0.1.6') { transitive = true } // For org.apache.sshd debugging
2023-03-18 21:33:39 +01:00
implementation 'org.bouncycastle:bcpkix-jdk15on:1.70' //For SSL certificate generation
2016-06-12 21:07:01 +02:00
2023-03-17 18:34:53 +01:00
implementation 'org.atteo.classindex:classindex:3.13'
annotationProcessor 'org.atteo.classindex:classindex:3.13'
2019-02-11 20:04:40 +01:00
2023-01-23 22:02:01 +00:00
// The android-smsmms library is the only way I know to handle MMS in Android
// (Shouldn't a phone OS make phone things easy?)
// This library was originally authored as com.klinkerapps at https://github.com/klinker41/android-smsmms.
// However, that version is under-loved. I have therefore made "some fixes" and published it.
// Please see https://invent.kde.org/sredman/android-smsmms/-/tree/master
2023-01-30 23:07:27 +00:00
implementation 'org.kde.invent.sredman:android-smsmms:kdeconnect-1-21-0'
2023-01-23 22:02:01 +00:00
implementation 'com.klinkerapps:logger:1.0.3'
2020-07-05 13:32:44 +05:30
2023-03-20 00:06:16 +01:00
implementation 'commons-io:commons-io:2.11.0'
2020-07-10 04:41:44 +05:30
implementation 'org.apache.commons:commons-collections4:4.4'
2023-01-02 21:58:18 +01:00
implementation 'org.apache.commons:commons-lang3:3.12.0'
2020-07-10 04:41:44 +05:30
2023-05-27 00:49:38 +02:00
implementation 'com.univocity:univocity-parsers:2.9.1'
2020-07-07 19:03:02 +05:30
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
2016-06-12 21:07:01 +02:00
// Testing
2022-12-30 23:56:21 +01:00
testImplementation 'junit:junit:4.13.2'
2019-02-11 21:44:30 +01:00
testImplementation 'org.powermock:powermock-core:2.0.0'
testImplementation 'org.powermock:powermock-module-junit4:2.0.0'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.0'
2023-01-02 21:58:18 +01:00
testImplementation 'org.mockito:mockito-core:3.12.4' // powermock isn't compatible with mockito 4
testImplementation 'org.skyscreamer:jsonassert:1.5.1'
2021-06-24 23:53:00 +03:00
// For device controls
2022-12-27 23:53:13 +01:00
implementation 'org.reactivestreams:reactive-streams:1.0.4'
implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
2013-10-29 16:17:18 +01:00
}
2020-03-27 20:23:02 +01:00
2021-01-12 04:04:28 +00:00
licenseReport {
configurations = ALL
renderers = [ new TextReportRenderer ( ) ]
}
generateLicenseReport . doLast {
def target = new File ( licenseResDir , "raw/license" )
target . parentFile . mkdirs ( )
target . text =
files ( "COPYING" , "$projectDir/build/reports/dependency-license/THIRD-PARTY-NOTICES.txt" )
. collect { it . getText ( ) } . join ( '\n' )
}
preBuild . dependsOn ( generateLicenseReport )