diff --git a/coil/build.gradle b/coil/build.gradle new file mode 100644 index 0000000..a8ef176 --- /dev/null +++ b/coil/build.gradle @@ -0,0 +1,59 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'maven-publish' + +group = 'com.github.Omega-R' + +android { + compileSdkVersion project.compile_sdk_version.toInteger() + buildToolsVersion project.build_tools_version + + + defaultConfig { + minSdkVersion project.min_sdk_version.toInteger() + targetSdkVersion project.target_sdk_version.toInteger() + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + kotlinOptions { + jvmTarget = "1.8" + } + +} + +gradle.projectsEvaluated { + publishPrebuiltPublicationToMavenLocal.dependsOn(tasks.getByName("assemble")) +} + +publishing { + publications { + prebuilt(MavenPublication) { + artifact file("$buildDir/outputs/aar/coil-release.aar") + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + api project(":core") + api("io.coil-kt:coil:0.9.5") + implementation "io.ktor:ktor-client-core:$ktor_version" + implementation "io.ktor:ktor-client-android:$ktor_version" +} +repositories { + mavenLocal() + mavenCentral() + jcenter() + google() +} \ No newline at end of file diff --git a/coil/proguard-rules.pro b/coil/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/coil/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/coil/src/main/AndroidManifest.xml b/coil/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8b1ff09 --- /dev/null +++ b/coil/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/coil/src/main/java/com/omega_r/entities/image/coil/OmegaCoilProcessorsHolder.kt b/coil/src/main/java/com/omega_r/entities/image/coil/OmegaCoilProcessorsHolder.kt new file mode 100644 index 0000000..0a469c7 --- /dev/null +++ b/coil/src/main/java/com/omega_r/entities/image/coil/OmegaCoilProcessorsHolder.kt @@ -0,0 +1,192 @@ +package com.omega_r.entities.image.coil + +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import coil.Coil +import coil.api.newGetBuilder +import coil.api.newLoadBuilder +import coil.request.GetRequestBuilder +import coil.request.LoadRequestBuilder +import coil.target.Target +import com.omega_r.libs.entities.extensions.NO_PLACEHOLDER_RES +import com.omega_r.libs.entities.extensions.toBitmapAndRecycle +import com.omega_r.libs.entities.extensions.toInputStream +import com.omega_r.libs.entities.images.* +import com.omega_r.libs.entities.resources.OmegaResourceExtractor +import io.ktor.utils.io.core.Input +import io.ktor.utils.io.streams.asInput +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import okhttp3.HttpUrl +import kotlin.coroutines.CoroutineContext +import kotlin.reflect.KClass + +class OmegaCoilProcessorsHolder( + private val defaultHolder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.Default, + private vararg val excludeImageClasses: KClass +) : OmegaImageProcessorsHolder { + + companion object { + + fun setAsCurrentImagesProcessor( + defaultHolder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, + vararg excludeImageClasses: KClass + ) { + OmegaImageProcessorsHolder.current = OmegaCoilProcessorsHolder(defaultHolder, *excludeImageClasses) + } + + } + + private val processor = Processor() + + override fun getProcessor(entity: OmegaImage): OmegaImageProcessor { + return if (excludeImageClasses.contains(entity::class)) defaultHolder.getProcessor(entity) else processor + } + + private fun createLoadRequestBuilder(context: Context, image: OmegaImage): LoadRequestBuilder? { + if (excludeImageClasses.contains(image::class)) return null + + val requestBuilder = Coil.loader().newLoadBuilder(context) + return when (image) { + is OmegaUrlImage -> requestBuilder.data(HttpUrl.get(image.url)) + is OmegaUriImage -> requestBuilder.data(image.uri) + is OmegaJavaFileImage -> requestBuilder.data(image.file) + is OmegaResourceImage -> requestBuilder.data(image.resource.id) + is OmegaDrawableImage -> requestBuilder.data(image.drawable) + is OmegaBitmapImage -> requestBuilder.data(image.bitmap) + is OmegaPlaceholderImage -> { + val finalImageRequestBuilder = createLoadRequestBuilder(context, image.finalImage) + when (val placeholderImage = image.placeholderImage) { + is OmegaResourceImage -> { + if (placeholderImage.resource.id != OmegaImage.NO_PLACEHOLDER_RES) { + finalImageRequestBuilder?.placeholder(placeholderImage.resource.id) + } + } + is OmegaDrawableImage -> finalImageRequestBuilder?.placeholder(placeholderImage.drawable) + } + finalImageRequestBuilder + } + else -> null + } + } + + private fun createGetRequestBuilder(image: OmegaImage): GetRequestBuilder? { + if (excludeImageClasses.contains(image::class)) return null + + val requestBuilder = Coil.loader().newGetBuilder() + return when (image) { + is OmegaUrlImage -> requestBuilder.data(HttpUrl.get(image.url)) + is OmegaUriImage -> requestBuilder.data(image.uri) + is OmegaJavaFileImage -> requestBuilder.data(image.file) + is OmegaResourceImage -> requestBuilder.data(image.resource.id) + is OmegaDrawableImage -> requestBuilder.data(image.drawable) + is OmegaBitmapImage -> requestBuilder.data(image.bitmap) + is OmegaPlaceholderImage -> createGetRequestBuilder(image.finalImage) + else -> null + } + } + + private inner class Processor : OmegaImageProcessor, CoroutineScope { + + override val coroutineContext: CoroutineContext = Dispatchers.Default + + override fun applyBackground( + image: OmegaImage, + view: View, + holder: OmegaImageProcessorsHolder, + extractor: OmegaResourceExtractor + ) { + createLoadRequestBuilder(view.context, image) + ?.target(object : Target { + override fun onError(error: Drawable?) { + error?.let { OmegaImageProcessor.applyBackground(view, it) } + } + + override fun onStart(placeholder: Drawable?) { + placeholder?.let { OmegaImageProcessor.applyBackground(view, it) } + } + + override fun onSuccess(result: Drawable) { + OmegaImageProcessor.applyBackground(view, result) + } + }) + ?.build() + ?.let { + Coil.loader().load(it) + } ?: defaultHolder.getProcessor(image).applyBackground(image, view, holder, extractor) + } + + override fun applyCompoundImage( + image: OmegaImage, + index: Int, + textView: TextView, + holder: OmegaImageProcessorsHolder, + extractor: OmegaResourceExtractor + ) { + createLoadRequestBuilder(textView.context, image) + ?.target(object : Target { + override fun onError(error: Drawable?) { + OmegaImageProcessor.applyCompoundDrawable(textView, error, index) + } + + override fun onStart(placeholder: Drawable?) { + OmegaImageProcessor.applyCompoundDrawable(textView, placeholder, index) + } + + override fun onSuccess(result: Drawable) { + OmegaImageProcessor.applyCompoundDrawable(textView, result, index) + } + }) + ?.build() + ?.let { + Coil.loader().load(it) + } ?: defaultHolder.getProcessor(image).applyCompoundImage(image, index, textView, holder, extractor) + } + + override fun applyImage( + image: OmegaImage, + imageView: ImageView, + holder: OmegaImageProcessorsHolder, + extractor: OmegaResourceExtractor + ) { + createLoadRequestBuilder(imageView.context, image) + ?.target(imageView) + ?.build() + ?.let { + Coil.loader().load(it) + } ?: defaultHolder.getProcessor(image).applyImage(image, imageView, holder, extractor) + } + + override suspend fun getInput( + image: OmegaImage, + extractor: OmegaResourceExtractor, + format: OmegaImage.Format, + quality: Int + ): Input? { + return extractor.context?.let { context -> + createGetRequestBuilder(image)?.let { + Coil.loader() + .get(it.build()) + .toBitmapAndRecycle { + toInputStream(format = OmegaImage.Format.JPEG).asInput() + } + } ?: defaultHolder.getProcessor(image).getInput(image, extractor, format, quality) + } ?: defaultHolder.getProcessor(image).getInput(image, extractor, format, quality) + } + + override fun preload(image: OmegaImage, extractor: OmegaResourceExtractor) { + extractor.context?.let { context -> + createLoadRequestBuilder(context, image) + ?.build() + ?.let { + Coil.loader().load(it) + } ?: defaultHolder.getProcessor(image).preload(image, extractor) + } ?: defaultHolder.getProcessor(image).preload(image, extractor) + } + + } + +} \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 680f7b0..8b33485 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -21,13 +21,11 @@ buildscript { dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") classpath("com.android.tools.build:gradle:$android_tools_version") - classpath("com.github.dcendents:android-maven-gradle-plugin:2.1") } } plugins { id("org.jetbrains.kotlin.multiplatform") - id("com.github.dcendents.android-maven") id("maven-publish") } @@ -95,7 +93,7 @@ kotlin { dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib") implementation("io.ktor:ktor-client-android:$ktor_version") - compileOnly("org.robolectric:android-all:9-robolectric-4913185-2") + compileOnly("org.robolectric:android-all:10-robolectric-5803371") } } @@ -103,7 +101,6 @@ kotlin { dependencies { implementation(kotlin("test")) implementation(kotlin("test-junit")) - implementation("com.android.support.test:runner:1.0.2") } } diff --git a/core/gradle/wrapper/gradle-wrapper.properties b/core/gradle/wrapper/gradle-wrapper.properties index 0e11084..5776319 100644 --- a/core/gradle/wrapper/gradle-wrapper.properties +++ b/core/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/DrawableExtensions.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/DrawableExtensions.kt deleted file mode 100644 index c2f5ee1..0000000 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/DrawableExtensions.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.omega_r.libs.entities.extensions - -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable - -inline fun Drawable.toBitmap(converter: Bitmap.() -> R): R = with(this) { - if (this is BitmapDrawable) { - return converter(bitmap) - } - - val newBitmap = if (intrinsicWidth <= 0 || intrinsicHeight <= 0) { - Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888)!! - } else { - Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888)!! - } - - try { - val oldBounds = copyBounds() - setBounds(0, 0, newBitmap.width, newBitmap.height) - - draw(Canvas(newBitmap)) - - bounds = oldBounds - return converter(newBitmap) - } finally { - newBitmap.recycle() - } -} \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaColorExtentions.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaColorExtentions.kt new file mode 100644 index 0000000..e2e1a56 --- /dev/null +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaColorExtentions.kt @@ -0,0 +1,9 @@ +package com.omega_r.libs.entities.extensions + +import android.annotation.ColorInt +import com.omega_r.libs.entities.colors.OmegaColor +import com.omega_r.libs.entities.resources.OmegaResource + +fun OmegaColor.Companion.fromResource(@ColorInt id: Int) = fromResource(OmegaResource.Color(id)) + +fun Int.toOmegaColor(): OmegaColor = OmegaColor.fromResource(this) \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaFileExtensions.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaFileExtensions.kt new file mode 100644 index 0000000..734dd06 --- /dev/null +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaFileExtensions.kt @@ -0,0 +1,16 @@ +package com.omega_r.libs.entities.extensions + +import android.net.Uri +import com.omega_r.libs.entities.files.OmegaFile +import com.omega_r.libs.entities.files.java_file.from +import com.omega_r.libs.entities.files.uri.from +import com.omega_r.libs.entities.files.url.from +import java.io.File + +val Uri.file + get() = OmegaFile.from(this) + +fun File.toOmegaFile() = OmegaFile.from(this) + +val String.file + get() = OmegaFile.from(this) \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaImegaExtensions.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaImageExtensions.kt similarity index 65% rename from core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaImegaExtensions.kt rename to core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaImageExtensions.kt index ce4b3ad..51788f2 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaImegaExtensions.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaImageExtensions.kt @@ -2,6 +2,8 @@ package com.omega_r.libs.entities.extensions import android.annotation.SuppressLint import android.graphics.Bitmap +import android.graphics.drawable.Drawable +import android.net.Uri import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 import android.view.View @@ -13,7 +15,7 @@ import com.omega_r.libs.entities.images.OmegaImageProcessor import com.omega_r.libs.entities.images.OmegaImageProcessorsHolder import com.omega_r.libs.entities.images.from import com.omega_r.libs.entities.resources.OmegaResourceExtractor -import com.omega_r.libs.entities.text.extractor +import java.io.File val OmegaImage.Companion.NO_PLACEHOLDER_RES: Int get() = 0 @@ -27,54 +29,58 @@ fun OmegaImage.Format.toCompressFormat(): Bitmap.CompressFormat { } fun ImageView.setImage( - image: OmegaImage?, - placeholderResId: Int = OmegaImage.NO_PLACEHOLDER_RES, - holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, - extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default + image: OmegaImage?, + placeholderResId: Int = OmegaImage.NO_PLACEHOLDER_RES, + holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, + extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default ) { val finalImage = image.formatImage(placeholderResId) if (finalImage == null) { setImageDrawable(null) } else { holder.getProcessor(finalImage) - .applyImage(finalImage, this, holder, extractor) + .applyImage(finalImage, this, holder, extractor) } } @JvmOverloads fun OmegaImage.preload( - holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, - extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default + holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, + extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default ) { holder.getProcessor(this).preload(this, extractor) } @JvmOverloads fun View.setBackground( - image: OmegaImage?, - placeholderResId: Int = OmegaImage.NO_PLACEHOLDER_RES, - holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, - extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default + image: OmegaImage?, + placeholderResId: Int = OmegaImage.NO_PLACEHOLDER_RES, + holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.current, + extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default ) { val finalImage = image.formatImage(placeholderResId) if (finalImage == null) { background = null } else { holder.getProcessor(finalImage) - .applyBackground(finalImage, this, holder, extractor) + .applyBackground(finalImage, this, holder, extractor) } } private fun OmegaImage?.formatImage(placeholderResId: Int): OmegaImage? { val image = this return if (image == null) { - if (placeholderResId == OmegaImage.NO_PLACEHOLDER_RES) null else OmegaImage.from(placeholderResId) + if (placeholderResId == OmegaImage.NO_PLACEHOLDER_RES) null else OmegaImage.from( + placeholderResId + ) } else { - if (placeholderResId == OmegaImage.NO_PLACEHOLDER_RES) image else OmegaImage.from(placeholderResId, image) + if (placeholderResId == OmegaImage.NO_PLACEHOLDER_RES) image else OmegaImage.from( + placeholderResId, + image + ) } } - var TextView.imageStart: OmegaImage? get() = getImage(0) set(value) = setImage(0, value) @@ -100,11 +106,33 @@ private fun TextView.getImage(index: Int): OmegaImage? { @SuppressLint("ObsoleteSdkInt") private fun TextView.setImage(index: Int, image: OmegaImage?) { if (image == null) { - val drawables = if (SDK_INT >= JELLY_BEAN_MR1) compoundDrawablesRelative else compoundDrawables + val drawables = + if (SDK_INT >= JELLY_BEAN_MR1) compoundDrawablesRelative else compoundDrawables drawables[index] = null OmegaImageProcessor.applyCompoundDrawables(this, drawables) } else { val holder = OmegaImageProcessorsHolder.current holder.getProcessor(image).applyCompoundImage(image, index, this, holder, this.extractor) } -} \ No newline at end of file +} + +val Int.image + get() = OmegaImage.from(this) + +val Drawable.image + get() = OmegaImage.from(this) + +val Bitmap.image + get() = OmegaImage.from(this) + +val String.image + get() = OmegaImage.from(this) + +val Uri.image + get() = OmegaImage.from(this) + +val File.image + get() = OmegaImage.from(this) + +val ByteArray.image + get() = OmegaImage.from(this) \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/Extensions.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaTextExtentions.kt similarity index 73% rename from core/src/androidMain/kotlin/com/omega_r/libs/entities/text/Extensions.kt rename to core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaTextExtentions.kt index eacb19f..67ceb55 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/Extensions.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaTextExtentions.kt @@ -1,4 +1,4 @@ -package com.omega_r.libs.entities.text +package com.omega_r.libs.entities.extensions import android.annotation.StringRes import android.content.Context @@ -9,6 +9,15 @@ import android.view.View import android.widget.TextView import com.omega_r.libs.entities.resources.OmegaResource import com.omega_r.libs.entities.resources.OmegaResourceExtractor +import com.omega_r.libs.entities.text.OmegaText + +fun OmegaText.Companion.from(@StringRes id: Int): OmegaText = from(OmegaResource.Text(id)) + +fun OmegaText.Companion.from(@StringRes id: Int, vararg formatArgs: Any): OmegaText = + from(OmegaResource.Text(id), *formatArgs) + +fun OmegaText.Companion.from(@StringRes id: Int, quantity: Int, vararg formatArgs: Any): OmegaText = + from(OmegaResource.Plurals(id), quantity, *formatArgs) fun TextView.setText(text: OmegaText) { this@setText.text = text.getCharSequence(extractor) @@ -20,8 +29,6 @@ val Context.extractor: OmegaResourceExtractor val View.extractor: OmegaResourceExtractor get() = context.extractor -fun OmegaText.Companion.from(@StringRes id: Int): OmegaText = from(OmegaResource.Text(id)) - fun Spanned.toHtmlString(): String { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Html.toHtml(this, Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE) @@ -43,5 +50,8 @@ fun CharSequence.toHtmlString(): String { is Spanned -> toHtmlString() else -> Html.escapeHtml(this) } - } + +val Int.text: OmegaText + get() = OmegaText.from(this) + diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaTextStyleExtenstions.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaTextStyleExtenstions.kt new file mode 100644 index 0000000..5d7ed3b --- /dev/null +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/extensions/OmegaTextStyleExtenstions.kt @@ -0,0 +1,8 @@ +package com.omega_r.libs.entities.extensions + +import android.annotation.ColorInt +import com.omega_r.libs.entities.colors.OmegaColor +import com.omega_r.libs.entities.text.styled.styles.OmegaTextStyle + +fun OmegaTextStyle.Companion.from(@ColorInt id: Int): OmegaTextStyle = + from(OmegaColor.fromResource(id)) \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/BaseBitmapImage.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/BaseBitmapImage.kt index de0b4b3..bda4a78 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/BaseBitmapImage.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/BaseBitmapImage.kt @@ -33,7 +33,7 @@ abstract class BaseBitmapImage : OmegaImage { ): Bitmap? override fun applyImage( - entity: B, + image: B, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor @@ -43,12 +43,12 @@ abstract class BaseBitmapImage : OmegaImage { if (width <= 0 || height <= 0) { ImageSizeExtractor(imageView) { target -> - applyImage(entity, target, holder, extractor) + applyImage(image, target, holder, extractor) } } else { val imageScaleType = imageView.scaleType executeImageAsync(imageView, { - getBitmap(entity, extractor, width, height)?.run { + getBitmap(image, extractor, width, height)?.run { getScaledBitmap(width, height, imageScaleType, autoRecycle, this) } }, ImageView::setImageBitmap) @@ -56,15 +56,15 @@ abstract class BaseBitmapImage : OmegaImage { } override fun applyBackground( - entity: B, + image: B, view: View, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { val viewWeak = WeakReference(view) - val processor = OmegaImageProcessorsHolder.current.getProcessor(entity) + val processor = OmegaImageProcessorsHolder.current.getProcessor(image) processor.launch { - val bitmap = getBitmap(entity, extractor) + val bitmap = getBitmap(image, extractor) withContext(Dispatchers.Main) { viewWeak.get()?.let { view -> applyBackground(view, bitmap?.let { BitmapDrawable(view.resources, it) }) @@ -74,14 +74,14 @@ abstract class BaseBitmapImage : OmegaImage { } override fun applyCompoundImage( - entity: B, + image: B, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { runBlocking { - val drawable = getBitmap(entity, extractor)?.let { bitmap -> + val drawable = getBitmap(image, extractor)?.let { bitmap -> extractor.context?.let { BitmapDrawable(it.resources, bitmap) } ?: BitmapDrawable(bitmap) } OmegaImageProcessor.applyCompoundDrawable(textView, drawable, index) diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaBaseImageProcessor.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaBaseImageProcessor.kt index f930560..8e4b480 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaBaseImageProcessor.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaBaseImageProcessor.kt @@ -1,7 +1,5 @@ package com.omega_r.libs.entities.images -import android.graphics.drawable.Drawable -import android.widget.TextView import com.omega_r.libs.entities.images.OmegaImage.Format import com.omega_r.libs.entities.resources.OmegaResourceExtractor import io.ktor.utils.io.core.Input @@ -14,8 +12,8 @@ abstract class OmegaBaseImageProcessor : OmegaImageProcessor override val coroutineContext: CoroutineContext = Dispatchers.Default - override suspend fun getInput(entity: I, extractor: OmegaResourceExtractor, format: Format, quality: Int): Input? = - getInputStream(entity, extractor, format, quality)?.asInput() + override suspend fun getInput(image: I, extractor: OmegaResourceExtractor, format: Format, quality: Int): Input? = + getInputStream(image, extractor, format, quality)?.asInput() protected abstract suspend fun getInputStream( entity: I, @@ -24,7 +22,7 @@ abstract class OmegaBaseImageProcessor : OmegaImageProcessor quality: Int ): InputStream? - override fun preload(entity: I, extractor: OmegaResourceExtractor) { + override fun preload(image: I, extractor: OmegaResourceExtractor) { // nothing } diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaByteArrayImage.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaByteArrayImage.kt index 5faba78..b0df0df 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaByteArrayImage.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaByteArrayImage.kt @@ -34,11 +34,11 @@ data class OmegaByteArrayImage(val byteArray: ByteArray) : BaseBitmapImage(), Om class Processor : BaseBitmapImage.Processor(true) { override suspend fun getInput( - entity: OmegaByteArrayImage, + image: OmegaByteArrayImage, extractor: OmegaResourceExtractor, format: OmegaImage.Format, quality: Int - ): Input? = entity.byteArray.asInput() + ): Input? = image.byteArray.asInput() override suspend fun getInputStream( entity: OmegaByteArrayImage, diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaDrawableImage.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaDrawableImage.kt index b7e81b6..99e8790 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaDrawableImage.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaDrawableImage.kt @@ -7,8 +7,6 @@ import android.widget.TextView import com.omega_r.libs.entities.extensions.toBitmapAndRecycle import com.omega_r.libs.entities.extensions.toInputStream import com.omega_r.libs.entities.resources.OmegaResourceExtractor -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext import java.io.InputStream data class OmegaDrawableImage(val drawable: Drawable) : BaseBitmapImage(), OmegaImage { @@ -22,21 +20,21 @@ data class OmegaDrawableImage(val drawable: Drawable) : BaseBitmapImage(), Omega class Processor : OmegaBaseImageProcessor() { override fun applyImage( - entity: OmegaDrawableImage, + image: OmegaDrawableImage, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - imageView.setImageDrawable(entity.drawable) + imageView.setImageDrawable(image.drawable) } override fun applyBackground( - entity: OmegaDrawableImage, + image: OmegaDrawableImage, view: View, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - OmegaImageProcessor.applyBackground(view, entity.drawable) + OmegaImageProcessor.applyBackground(view, image.drawable) } override suspend fun getInputStream( @@ -47,13 +45,13 @@ data class OmegaDrawableImage(val drawable: Drawable) : BaseBitmapImage(), Omega ): InputStream? = entity.drawable.toBitmapAndRecycle { toInputStream(format, quality) } override fun applyCompoundImage( - entity: OmegaDrawableImage, + image: OmegaDrawableImage, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - OmegaImageProcessor.applyCompoundDrawable(textView, entity.drawable, index) + OmegaImageProcessor.applyCompoundDrawable(textView, image.drawable, index) } } diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt index 8f7b625..de4a3f4 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt @@ -48,34 +48,34 @@ actual interface OmegaImageProcessor : OmegaProcessor, Corout } actual suspend fun getInput( - entity: T, + image: T, extractor: OmegaResourceExtractor, format: OmegaImage.Format, quality: Int ): Input? fun applyImage( - entity: T, + image: T, imageView: ImageView, holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.Default, extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default ) fun applyBackground( - entity: T, + image: T, view: View, holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.Default, extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default ) fun applyCompoundImage( - entity: T, + image: T, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder = OmegaImageProcessorsHolder.Default, extractor: OmegaResourceExtractor = OmegaResourceExtractor.Default ) - fun preload(entity: T, extractor: OmegaResourceExtractor) + fun preload(image: T, extractor: OmegaResourceExtractor) } \ No newline at end of file diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaPlaceholderImage.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaPlaceholderImage.kt index 1383101..93c6758 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaPlaceholderImage.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaPlaceholderImage.kt @@ -23,29 +23,29 @@ open class OmegaPlaceholderImage( class Processor : OmegaBaseImageProcessor() { override fun applyImage( - entity: OmegaPlaceholderImage, + image: OmegaPlaceholderImage, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { apply({ image -> holder.getProcessor(image).applyImage(image, imageView, holder, extractor) - }, entity.placeholderImage, entity.finalImage) + }, image.placeholderImage, image.finalImage) } override fun applyBackground( - entity: OmegaPlaceholderImage, + image: OmegaPlaceholderImage, view: View, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { apply({ image -> holder.getProcessor(image).applyBackground(image, view, holder, extractor) - }, entity.placeholderImage, entity.finalImage) + }, image.placeholderImage, image.finalImage) } override fun applyCompoundImage( - entity: OmegaPlaceholderImage, + image: OmegaPlaceholderImage, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder, @@ -53,7 +53,7 @@ open class OmegaPlaceholderImage( ) { apply({ image -> holder.getProcessor(image).applyCompoundImage(image, index, textView, holder, extractor) - }, entity.placeholderImage, entity.finalImage) + }, image.placeholderImage, image.finalImage) } override suspend fun getInputStream( diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaResourceImage.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaResourceImage.kt index 53038a2..e1b2be4 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaResourceImage.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaResourceImage.kt @@ -24,12 +24,12 @@ actual data class OmegaResourceImage(actual val resource: OmegaResource.Image) : class Processor : OmegaBaseImageProcessor() { override fun applyImage( - entity: OmegaResourceImage, + image: OmegaResourceImage, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - val id = entity.resource.id + val id = image.resource.id if (id == OmegaImage.NO_PLACEHOLDER_RES) { imageView.setImageDrawable(null) } else { @@ -38,12 +38,12 @@ actual data class OmegaResourceImage(actual val resource: OmegaResource.Image) : } override fun applyBackground( - entity: OmegaResourceImage, + image: OmegaResourceImage, view: View, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - val id = entity.resource.id + val id = image.resource.id if (id == OmegaImage.NO_PLACEHOLDER_RES) { view.background = null } else { @@ -52,14 +52,14 @@ actual data class OmegaResourceImage(actual val resource: OmegaResource.Image) : } override fun applyCompoundImage( - entity: OmegaResourceImage, + image: OmegaResourceImage, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - val id = entity.resource.id - val drawable = if (id == OmegaImage.NO_PLACEHOLDER_RES) null else extractor.getDrawable(entity.resource) + val id = image.resource.id + val drawable = if (id == OmegaImage.NO_PLACEHOLDER_RES) null else extractor.getDrawable(image.resource) OmegaImageProcessor.applyCompoundDrawable(textView, drawable, index) } diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaUriImage.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaUriImage.kt index 44a20c3..1770755 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaUriImage.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/images/OmegaUriImage.kt @@ -19,12 +19,12 @@ data class OmegaUriImage(val uri: Uri) : BaseBitmapImage(), OmegaImage { class Processor : BaseBitmapImage.Processor(true) { override fun applyImage( - entity: OmegaUriImage, + image: OmegaUriImage, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - imageView.setImageURI(entity.uri) + imageView.setImageURI(image.uri) } override suspend fun getBitmap( diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/resources/OmegaResource.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/resources/OmegaResource.kt index fe0d767..b48f44b 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/resources/OmegaResource.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/resources/OmegaResource.kt @@ -10,7 +10,7 @@ actual sealed class OmegaResource { actual data class TextArray(@ArrayRes val id: Int) : OmegaResource() - actual data class Color(@ColorRes val id: Int, val string: String) : OmegaResource() + actual data class Color(@ColorRes val id: Int) : OmegaResource() actual data class Image(@DrawableRes val id: Int) : OmegaResource() diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt index b14f07f..3f4a0b5 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt @@ -1,8 +1,8 @@ package com.omega_r.libs.entities.text.resource.plurals +import com.omega_r.libs.entities.extensions.fromHtmlString +import com.omega_r.libs.entities.extensions.toHtmlString import com.omega_r.libs.entities.resources.OmegaResourceExtractor -import com.omega_r.libs.entities.text.fromHtmlString -import com.omega_r.libs.entities.text.toHtmlString actual object OmegaPluralsResourceTextProcessor : OmegaBaseTextResourceTextProcessor() { diff --git a/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt b/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt index 82bbe18..a2bd676 100644 --- a/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt +++ b/core/src/androidMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt @@ -1,8 +1,8 @@ package com.omega_r.libs.entities.text.resource.text +import com.omega_r.libs.entities.extensions.fromHtmlString +import com.omega_r.libs.entities.extensions.toHtmlString import com.omega_r.libs.entities.resources.OmegaResourceExtractor -import com.omega_r.libs.entities.text.fromHtmlString -import com.omega_r.libs.entities.text.toHtmlString actual object OmegaTextResourceTextProcessor : OmegaBaseTextResourceTextProcessor() { diff --git a/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaColorTests.kt b/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaColorTests.kt new file mode 100644 index 0000000..ae29684 --- /dev/null +++ b/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaColorTests.kt @@ -0,0 +1,54 @@ +package com.omega_r.libs.entities + +import com.omega_r.libs.entities.colors.OmegaColor +import com.omega_r.libs.entities.colors.argb.OmegaArgbColor +import com.omega_r.libs.entities.colors.hex.OmegaHexColor +import com.omega_r.libs.entities.colors.integer.OmegaIntColor +import com.omega_r.libs.entities.colors.name.OmegaNameColor +import org.junit.Test + +private const val DEFAULT_COLOR_INT = 16764133 +private const val HEX_COLOR = "00FFCCE5" + +class OmegaColorTests { + + @Test + fun argbColorTest() { + val color = OmegaColor.fromArgb(0, 255, 204, 229) + assert(color is OmegaArgbColor) + + val colorInt = color.getColorInt() + assert(colorInt == DEFAULT_COLOR_INT) + } + + @Test + fun hexColorTest() { + val color = OmegaColor.fromHex(HEX_COLOR) + assert(color is OmegaHexColor) + + val colorInt = color.getColorInt() + assert(colorInt == DEFAULT_COLOR_INT) + } + + @Test + fun intColorTest() { + val color = OmegaColor.fromInt(DEFAULT_COLOR_INT) + assert(color is OmegaIntColor) + assert(color.getColorInt() == DEFAULT_COLOR_INT) + } + + @Test + fun nameColorTest() { + val color = OmegaColor.fromName("fuchsia") + assert(color is OmegaNameColor) + assert(color.getColorInt() == OmegaColor.FUCHSIA.colorInt) + } + + @Test + fun unknownNameColorTest() { + val color = OmegaColor.fromName("fuchsiaaa") + assert(color is OmegaNameColor) + assert(color.getColorInt() == OmegaColor.BLACK.colorInt) + } + +} \ No newline at end of file diff --git a/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaFileTests.kt b/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaFileTests.kt new file mode 100644 index 0000000..2ac15af --- /dev/null +++ b/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaFileTests.kt @@ -0,0 +1,29 @@ +package com.omega_r.libs.entities + +import com.omega_r.libs.entities.files.OmegaFile +import com.omega_r.libs.entities.files.Type +import com.omega_r.libs.entities.files.url.OmegaUrlFile +import com.omega_r.libs.entities.files.url.from +import kotlinx.coroutines.runBlocking +import org.junit.Test + +private const val MIME_TYPE = "png" +private const val FILE_NAME = "1280px-Image_created_with_a_mobile_phone.$MIME_TYPE" +private const val FILE_URL = + "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/$FILE_NAME" + +class OmegaFileTests { + + @Test + fun urlFileTest() { + val file = OmegaFile.from(FILE_URL, MIME_TYPE, FILE_NAME) + assert(file is OmegaUrlFile) + assert(file.type == Type.FILE) + runBlocking { + assert(file.isExist() ?: false) + assert(file.getOutput() == null) + assert(file.getInput() != null) + } + } + +} \ No newline at end of file diff --git a/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaTextTests.kt b/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaTextTests.kt new file mode 100644 index 0000000..120647f --- /dev/null +++ b/core/src/androidTest/kotlin/com/omega_r/libs/entities/OmegaTextTests.kt @@ -0,0 +1,47 @@ +package com.omega_r.libs.entities + +import com.omega_r.libs.entities.resources.OmegaResourceExtractor +import com.omega_r.libs.entities.text.OmegaStringHolder +import com.omega_r.libs.entities.text.OmegaText +import com.omega_r.libs.entities.text.OmegaTextBuilder +import com.omega_r.libs.entities.text.array.OmegaArrayText +import com.omega_r.libs.entities.text.string.OmegaStringText +import org.junit.Test + +private const val SIMPLE_TEXT = "HelloWorld" + +class OmegaTextTests { + + private val stringHolder: OmegaStringHolder = object : OmegaStringHolder { + + override val string: String? = SIMPLE_TEXT + + } + + @Test + fun stringTextTest() { + val text = OmegaText.from(SIMPLE_TEXT) + assert(text is OmegaStringText) + + val stringValue = text.getString(extractor = OmegaResourceExtractor.Default) + assert(SIMPLE_TEXT == stringValue) + + assert(text == OmegaText.from(SIMPLE_TEXT as CharSequence)) + assert(text == OmegaText.from(stringHolder)) + } + + @Test + fun arrayTextTest() { + val text = OmegaText.from(OmegaText.from(SIMPLE_TEXT), OmegaText.from(SIMPLE_TEXT)) + assert(text is OmegaArrayText) + } + + @Test + fun builderTest() { + val text = OmegaTextBuilder() + .append(SIMPLE_TEXT) + .toText() + assert(text is OmegaArrayText) + } + +} \ No newline at end of file diff --git a/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/OmegaColor.kt b/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/OmegaColor.kt index cecb91f..193b88f 100644 --- a/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/OmegaColor.kt +++ b/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/OmegaColor.kt @@ -35,15 +35,16 @@ interface OmegaColor : OmegaEntity { val TEAL = OmegaIntColor(-0xff7f80) val TRANSPARENT = OmegaIntColor(0) - fun fromInt(colorInt: Int) = OmegaIntColor(colorInt) + fun fromInt(colorInt: Int): OmegaColor = OmegaIntColor(colorInt) - fun fromResource(resource: OmegaResource.Color) = OmegaResourceColor(resource) + fun fromResource(resource: OmegaResource.Color): OmegaColor = OmegaResourceColor(resource) - fun fromHex(hex: String) = OmegaHexColor(hex) + fun fromHex(hex: String): OmegaColor = OmegaHexColor(hex) - fun fromName(name: String) = OmegaNameColor(name) + fun fromName(name: String): OmegaColor = OmegaNameColor(name) - fun fromArgb(alpha: Int, red: Int, green: Int, blue: Int) = OmegaArgbColor(alpha, red, green, blue) + fun fromArgb(alpha: Int, red: Int, green: Int, blue: Int): OmegaColor = + OmegaArgbColor(alpha, red, green, blue) } diff --git a/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/resource/OmegaAttrResourceColor.kt b/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/resource/OmegaAttrResourceColor.kt deleted file mode 100644 index 698eb40..0000000 --- a/core/src/commonMain/kotlin/com/omega_r/libs/entities/colors/resource/OmegaAttrResourceColor.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.omega_r.libs.entities.colors.resource - -import com.omega_r.libs.entities.colors.OmegaColor -import com.omega_r.libs.entities.resources.OmegaResource - -data class OmegaAttrResourceColor(val resource: OmegaResource.Color) : OmegaColor \ No newline at end of file diff --git a/core/src/commonMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt b/core/src/commonMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt index fe88d4c..c86dedb 100644 --- a/core/src/commonMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt +++ b/core/src/commonMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt @@ -8,6 +8,6 @@ import io.ktor.utils.io.core.Input expect interface OmegaImageProcessor : OmegaProcessor { - suspend fun getInput(entity: T, extractor: OmegaResourceExtractor, format: Format = JPEG, quality: Int = 100): Input? + suspend fun getInput(image: T, extractor: OmegaResourceExtractor, format: Format = JPEG, quality: Int = 100): Input? } \ No newline at end of file diff --git a/core/src/iosMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt b/core/src/iosMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt index 00dcf69..bec3159 100644 --- a/core/src/iosMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt +++ b/core/src/iosMain/kotlin/com/omega_r/libs/entities/images/OmegaImageProcessor.kt @@ -1,10 +1,11 @@ package com.omega_r.libs.entities.images import com.omega_r.libs.entities.processors.OmegaProcessor +import com.omega_r.libs.entities.resources.OmegaResourceExtractor import io.ktor.utils.io.core.Input -actual interface OmegaImageProcessor : OmegaProcessor { +actual interface OmegaImageProcessor : OmegaProcessor { - actual suspend fun T.getInput(): Input? + actual suspend fun getInput(image: T, extractor: OmegaResourceExtractor, format: OmegaImage.Format, quality: Int): Input? } \ No newline at end of file diff --git a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/array/OmegaArrayTextProcessor.kt b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/array/OmegaArrayTextProcessor.kt index 3533804..076b94b 100644 --- a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/array/OmegaArrayTextProcessor.kt +++ b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/array/OmegaArrayTextProcessor.kt @@ -1,10 +1,11 @@ package com.omega_r.libs.entities.text.array +import com.omega_r.libs.entities.resources.OmegaResourceExtractor import com.omega_r.libs.entities.text.OmegaTextProcessor actual object OmegaArrayTextProcessor : OmegaTextProcessor { - override fun OmegaArrayText.extract(): CharSequence? { + override fun extract(entity: OmegaArrayText, extractor: OmegaResourceExtractor): CharSequence? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/processor/OmegaArrayTextProcessor.kt b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/processor/OmegaArrayTextProcessor.kt deleted file mode 100644 index 29aa121..0000000 --- a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/processor/OmegaArrayTextProcessor.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.omega_r.libs.entities.text.processor - -import com.omega_r.libs.entities.text.OmegaTextProcessor -import com.omega_r.libs.entities.text.array.OmegaArrayText - -actual abstract class OmegaArrayTextProcessor : OmegaTextProcessor \ No newline at end of file diff --git a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt index 6a05368..b4585ac 100644 --- a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt +++ b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/plurals/OmegaPluralsResourceTextProcessor.kt @@ -1,20 +1,10 @@ package com.omega_r.libs.entities.text.resource.plurals -import com.omega_r.libs.entities.resources.OmegaResource import com.omega_r.libs.entities.resources.OmegaResourceExtractor -import com.omega_r.libs.entities.text.resource.OmegaResourceTextProcessor -actual object OmegaPluralsResourceTextProcessor : OmegaResourceTextProcessor() { +actual object OmegaPluralsResourceTextProcessor : OmegaBaseTextResourceTextProcessor() { - override fun extract(entity: OmegaPluralsResourceText, resourceExtractor: OmegaResourceExtractor): CharSequence? { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun extractWithArgs( - entity: OmegaPluralsResourceText, - formatArgs: Array, - resourceExtractor: OmegaResourceExtractor - ): CharSequence? { + override fun extractWithArgs(entity: OmegaPluralsResourceText, formatArgs: Array, resourceExtractor: OmegaResourceExtractor): CharSequence? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt index 1424e15..4528512 100644 --- a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt +++ b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/resource/text/OmegaTextResourceTextProcessor.kt @@ -1,20 +1,11 @@ package com.omega_r.libs.entities.text.resource.text -import com.omega_r.libs.entities.resources.OmegaResource import com.omega_r.libs.entities.resources.OmegaResourceExtractor -import com.omega_r.libs.entities.text.resource.OmegaResourceTextProcessor -actual object OmegaTextResourceTextProcessor : - OmegaResourceTextProcessor() { - override fun extract(entity: OmegaTextResourceText, resourceExtractor: OmegaResourceExtractor): CharSequence? { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } +actual object OmegaTextResourceTextProcessor : OmegaBaseTextResourceTextProcessor() { - override fun extractWithArgs( - entity: OmegaTextResourceText, - formatArgs: Array, - resourceExtractor: OmegaResourceExtractor - ): CharSequence? { + override fun extractWithArgs(entity: OmegaTextResourceText, formatArgs: Array, resourceExtractor: OmegaResourceExtractor): CharSequence? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } + } \ No newline at end of file diff --git a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/styled/OmegaDefaultStyledTextProcessor.kt b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/styled/OmegaDefaultStyledTextProcessor.kt index 5648b45..7b05d94 100644 --- a/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/styled/OmegaDefaultStyledTextProcessor.kt +++ b/core/src/iosMain/kotlin/com/omega_r/libs/entities/text/styled/OmegaDefaultStyledTextProcessor.kt @@ -1,8 +1,12 @@ package com.omega_r.libs.entities.text.styled +import com.omega_r.libs.entities.resources.OmegaResourceExtractor + actual object OmegaDefaultStyledTextProcessor : OmegaStyledTextProcessor { - actual override fun OmegaStyledText.extract(): CharSequence? { + + actual override fun extract(entity: OmegaStyledText, resourceExtractor: OmegaResourceExtractor): CharSequence? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } + } \ No newline at end of file diff --git a/examples/android/gradle/wrapper/gradle-wrapper.properties b/examples/android/gradle/wrapper/gradle-wrapper.properties index 4e4acdf..efd1ceb 100644 --- a/examples/android/gradle/wrapper/gradle-wrapper.properties +++ b/examples/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Aug 16 18:00:14 BST 2019 +#Fri Feb 28 16:09:11 MSK 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/examples/android/gradlew b/examples/android/gradlew old mode 100644 new mode 100755 diff --git a/examples/android/src/main/java/com/omega_r/libs/entities/examples/TextExamplesActivity.kt b/examples/android/src/main/java/com/omega_r/libs/entities/examples/TextExamplesActivity.kt index fd3b949..79079e1 100644 --- a/examples/android/src/main/java/com/omega_r/libs/entities/examples/TextExamplesActivity.kt +++ b/examples/android/src/main/java/com/omega_r/libs/entities/examples/TextExamplesActivity.kt @@ -8,9 +8,9 @@ import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.omega_r.libs.entities.extensions.from +import com.omega_r.libs.entities.extensions.setText import com.omega_r.libs.entities.text.OmegaText -import com.omega_r.libs.entities.text.from -import com.omega_r.libs.entities.text.setText import com.omega_r.libs.entities.text.styled.styles.OmegaFontStyleTextStyle import com.omega_r.libs.entities.text.styled.styles.OmegaTextStyle import kotlinx.android.synthetic.main.activity_text_examples.* @@ -26,11 +26,11 @@ class TextExamplesActivity : AppCompatActivity() { recyclerview.layoutManager = LinearLayoutManager(this) adapter.setItems( - listOf( - OmegaText.from("Text from String") to OmegaText.from("String Example") - .plus(OmegaTextStyle.from(OmegaFontStyleTextStyle.Style.BOLD)), - OmegaText.from("Text from Resource") to OmegaText.from(R.string.app_name) - ) + listOf( + OmegaText.from("Text from String") to OmegaText.from("String Example") + .plus(OmegaTextStyle.from(OmegaFontStyleTextStyle.Style.BOLD)), + OmegaText.from("Text from Resource") to OmegaText.from(R.string.app_name) + ) ) } } @@ -41,11 +41,11 @@ private class Adapter : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { return VH( - LayoutInflater.from(parent.context).inflate( - R.layout.item_text_example, - parent, - false - ) + LayoutInflater.from(parent.context).inflate( + R.layout.item_text_example, + parent, + false + ) ) } diff --git a/examples/gradle/wrapper/gradle-wrapper.properties b/examples/gradle/wrapper/gradle-wrapper.properties index e60c023..4dff3b1 100644 --- a/examples/gradle/wrapper/gradle-wrapper.properties +++ b/examples/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/glide/build.gradle b/glide/build.gradle index 59504d0..c3c8589 100644 --- a/glide/build.gradle +++ b/glide/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' -apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'maven-publish' group = 'com.github.Omega-R' @@ -13,8 +13,6 @@ android { defaultConfig { minSdkVersion project.min_sdk_version.toInteger() targetSdkVersion project.target_sdk_version.toInteger() - versionCode 1 - versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -29,6 +27,18 @@ android { } +gradle.projectsEvaluated { + publishPrebuiltPublicationToMavenLocal.dependsOn(tasks.getByName("assemble")) +} + +publishing { + publications { + prebuilt(MavenPublication) { + artifact file("$buildDir/outputs/aar/glide-release.aar") + } + } +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" @@ -40,5 +50,8 @@ dependencies { implementation "io.ktor:ktor-client-android:$ktor_version" } repositories { + mavenLocal() mavenCentral() + jcenter() + google() } diff --git a/glide/src/androidTest/java/com/omega_r/entities/image/glide/ExampleInstrumentedTest.java b/glide/src/androidTest/java/com/omega_r/entities/image/glide/ExampleInstrumentedTest.java deleted file mode 100644 index 612d569..0000000 --- a/glide/src/androidTest/java/com/omega_r/entities/image/glide/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.omega_r.entities.image.glide; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.omega_r.entities.image.glide.test", appContext.getPackageName()); - } -} diff --git a/glide/src/main/java/com/omega_r/entities/image/glide/OmegaGlideImageProcessorsHolder.kt b/glide/src/main/java/com/omega_r/entities/image/glide/OmegaGlideImageProcessorsHolder.kt index 93d6685..d52363a 100644 --- a/glide/src/main/java/com/omega_r/entities/image/glide/OmegaGlideImageProcessorsHolder.kt +++ b/glide/src/main/java/com/omega_r/entities/image/glide/OmegaGlideImageProcessorsHolder.kt @@ -92,27 +92,27 @@ class OmegaGlideImageProcessorsHolder( } override fun applyImage( - entity: OmegaImage, + image: OmegaImage, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { Glide.with(imageView) .asDrawable() - .createRequestBuilder(entity, extractor) + .createRequestBuilder(image, extractor) ?.into(imageView) - ?: defaultHolder.getProcessor(entity).applyImage(entity, imageView, holder, extractor) + ?: defaultHolder.getProcessor(image).applyImage(image, imageView, holder, extractor) } override fun applyBackground( - entity: OmegaImage, + image: OmegaImage, view: View, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { Glide.with(view) .asDrawable() - .createRequestBuilder(entity, extractor) + .createRequestBuilder(image, extractor) ?.into(object : CustomViewTarget(view) { override fun onLoadFailed(errorDrawable: Drawable?) { @@ -127,11 +127,11 @@ class OmegaGlideImageProcessorsHolder( OmegaImageProcessor.applyBackground(view, resource) } - }) ?: defaultHolder.getProcessor(entity).applyBackground(entity, view, holder, extractor) + }) ?: defaultHolder.getProcessor(image).applyBackground(image, view, holder, extractor) } override fun applyCompoundImage( - entity: OmegaImage, + image: OmegaImage, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder, @@ -140,7 +140,7 @@ class OmegaGlideImageProcessorsHolder( extractor.context?.let { context -> Glide.with(context) .asDrawable() - .createRequestBuilder(entity, extractor) + .createRequestBuilder(image, extractor) ?.run { val futureTarget = submit() try { @@ -150,12 +150,12 @@ class OmegaGlideImageProcessorsHolder( Glide.with(context) .clear(futureTarget) } - } ?: defaultHolder.getProcessor(entity).applyCompoundImage(entity, index, textView, holder, extractor) - } ?: defaultHolder.getProcessor(entity).applyCompoundImage(entity, index, textView, holder, extractor) + } ?: defaultHolder.getProcessor(image).applyCompoundImage(image, index, textView, holder, extractor) + } ?: defaultHolder.getProcessor(image).applyCompoundImage(image, index, textView, holder, extractor) } override suspend fun getInput( - entity: OmegaImage, + image: OmegaImage, extractor: OmegaResourceExtractor, format: OmegaImage.Format, quality: Int @@ -163,7 +163,7 @@ class OmegaGlideImageProcessorsHolder( return extractor.context?.let { context -> Glide.with(context) .asBitmap() - .createRequestBuilder(entity, extractor) + .createRequestBuilder(image, extractor) ?.run { val futureTarget = submit() try { @@ -174,20 +174,20 @@ class OmegaGlideImageProcessorsHolder( .clear(futureTarget) } } - } ?: defaultHolder.getProcessor(entity).getInput(entity, extractor, format, quality) + } ?: defaultHolder.getProcessor(image).getInput(image, extractor, format, quality) } override fun preload( - entity: OmegaImage, + image: OmegaImage, extractor: OmegaResourceExtractor ) { extractor.context?.let { Glide.with(it) .asDrawable() - .createRequestBuilder(entity, extractor) + .createRequestBuilder(image, extractor) ?.preload() - ?: defaultHolder.getProcessor(entity).preload(entity, extractor) - } ?: defaultHolder.getProcessor(entity).preload(entity, extractor) + ?: defaultHolder.getProcessor(image).preload(image, extractor) + } ?: defaultHolder.getProcessor(image).preload(image, extractor) } } diff --git a/glide/src/test/java/com/omega_r/entities/image/glide/ExampleUnitTest.java b/glide/src/test/java/com/omega_r/entities/image/glide/ExampleUnitTest.java deleted file mode 100644 index 3fad4ef..0000000 --- a/glide/src/test/java/com/omega_r/entities/image/glide/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.omega_r.entities.image.glide; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index daed1a1..0ab3d22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,8 +11,8 @@ INCLUDE_ANDROID=true kotlin.code.style=official # versions -kotlin_version = 1.3.61 -android_tools_version = 3.4.1 +kotlin_version = 1.3.70 +android_tools_version = 3.6.1 ktor_version = 1.3.1 @@ -28,4 +28,4 @@ android.useAndroidX=true android.enableJetifier=true version=0.0.1 -group=com.github.Omega-R \ No newline at end of file +group=com.omega_r.libs.entities \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 39e0ec3..69e2828 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ #Fri Aug 16 17:40:37 BST 2019 -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists diff --git a/picasso/build.gradle b/picasso/build.gradle index 44accae..006c0cb 100644 --- a/picasso/build.gradle +++ b/picasso/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' -apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'maven-publish' group = 'com.github.Omega-R' @@ -13,8 +13,6 @@ android { defaultConfig { minSdkVersion project.min_sdk_version.toInteger() targetSdkVersion project.target_sdk_version.toInteger() - versionCode 1 - versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -29,11 +27,23 @@ android { } +gradle.projectsEvaluated { + publishPrebuiltPublicationToMavenLocal.dependsOn(tasks.getByName("assemble")) +} + +publishing { + publications { + prebuilt(MavenPublication) { + artifact file("$buildDir/outputs/aar/picasso-release.aar") + } + } +} + dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" api project(":core") - api ('com.squareup.picasso:picasso:2.71828') { + api('com.squareup.picasso:picasso:2.71828') { exclude group: 'com.android.support', module: 'support-annotations' } implementation "io.ktor:ktor-client-core:$ktor_version" diff --git a/picasso/src/main/java/com/omega_r/libs/entities/image/picasso/OmegaPicassoProcessorsHolder.kt b/picasso/src/main/java/com/omega_r/libs/entities/image/picasso/OmegaPicassoProcessorsHolder.kt index ea7e2ec..d79b871 100644 --- a/picasso/src/main/java/com/omega_r/libs/entities/image/picasso/OmegaPicassoProcessorsHolder.kt +++ b/picasso/src/main/java/com/omega_r/libs/entities/image/picasso/OmegaPicassoProcessorsHolder.kt @@ -1,5 +1,6 @@ package com.omega_r.libs.entities.image.picasso +import android.content.res.Resources import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable @@ -9,6 +10,7 @@ import android.widget.TextView import com.omega_r.libs.entities.extensions.NO_PLACEHOLDER_RES import com.omega_r.libs.entities.extensions.toInputStream import com.omega_r.libs.entities.images.* +import com.omega_r.libs.entities.images.OmegaImage.Format import com.omega_r.libs.entities.resources.OmegaResourceExtractor import com.omega_r.libs.entities.tools.ImageSizeExtractor import com.squareup.picasso.Picasso @@ -49,6 +51,9 @@ class OmegaPicassoProcessorsHolder( private inner class Processor : OmegaImageProcessor, CoroutineScope { + private val targetMap = mutableMapOf() + private val targetList = mutableListOf() // for Input + override val coroutineContext: CoroutineContext = Dispatchers.Default private fun createRequestCreator(image: OmegaImage): RequestCreator? { @@ -62,7 +67,11 @@ class OmegaPicassoProcessorsHolder( is OmegaPlaceholderImage -> { val request = createRequestCreator(image.finalImage) when (val placeholderImage = image.placeholderImage) { - is OmegaResourceImage -> if(placeholderImage.resource.id == OmegaImage.NO_PLACEHOLDER_RES) request else request?.placeholder(placeholderImage.resource.id) + is OmegaResourceImage -> if (placeholderImage.resource.id == OmegaImage.NO_PLACEHOLDER_RES) { + request + } else { + request?.placeholder(placeholderImage.resource.id) + } is OmegaDrawableImage -> request?.placeholder(placeholderImage.drawable) else -> null } @@ -72,8 +81,13 @@ class OmegaPicassoProcessorsHolder( } - override fun applyImage(entity: OmegaImage, imageView: ImageView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor) { - createRequestCreator(entity)?.apply { + override fun applyImage( + image: OmegaImage, + imageView: ImageView, + holder: OmegaImageProcessorsHolder, + extractor: OmegaResourceExtractor + ) { + createRequestCreator(image)?.apply { fit() @Suppress("NON_EXHAUSTIVE_WHEN") when (imageView.scaleType) { @@ -82,101 +96,133 @@ class OmegaPicassoProcessorsHolder( ImageView.ScaleType.CENTER_CROP -> centerCrop() } into(imageView) - } ?: defaultHolder.getProcessor(entity).applyImage(entity, imageView, holder, extractor) + } ?: defaultHolder.getProcessor(image).applyImage(image, imageView, holder, extractor) } override fun applyBackground( - entity: OmegaImage, + image: OmegaImage, view: View, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor ) { - createRequestCreator(entity)?.apply { + createRequestCreator(image)?.apply { if (view.width <= 0 || view.height <= 0) { ImageSizeExtractor(view) { - applyBackground(entity, view, holder, extractor) + applyBackground(image, view, holder, extractor) } } else { resize(view.width, view.height) - val viewWeak = WeakReference(view) - into(object : Target { - override fun onPrepareLoad(placeHolderDrawable: Drawable?) { - viewWeak.get()?.let { - OmegaImageProcessor.applyBackground(view, placeHolderDrawable) - } + into(object : DisposableTarget(view) { + override fun onPrepareLoad(view: View, placeHolderDrawable: Drawable?) { + OmegaImageProcessor.applyBackground(view, placeHolderDrawable) } - override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) { - viewWeak.get()?.let { - OmegaImageProcessor.applyBackground(view, errorDrawable) - } + override fun onBitmapFailed(view: View, errorDrawable: Drawable?) { + OmegaImageProcessor.applyBackground(view, errorDrawable) } - override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { - viewWeak.get()?.let { - OmegaImageProcessor.applyBackground(view, BitmapDrawable(it.resources, bitmap)) - } + override fun onBitmapLoaded(view: View, bitmap: Bitmap?) { + OmegaImageProcessor.applyBackground(view, bitmap.toDrawable(view.resources)) } }) } - } ?: defaultHolder.getProcessor(entity).applyBackground(entity, view, holder, extractor) + } ?: defaultHolder.getProcessor(image).applyBackground(image, view, holder, extractor) } - override fun applyCompoundImage(entity: OmegaImage, index: Int, textView: TextView, holder: OmegaImageProcessorsHolder, extractor: OmegaResourceExtractor) { - createRequestCreator(entity)?.run { - into(object : Target { - override fun onPrepareLoad(placeHolderDrawable: Drawable?) { - OmegaImageProcessor.applyCompoundDrawable(textView, placeHolderDrawable, index) + override fun applyCompoundImage( + image: OmegaImage, + index: Int, + textView: TextView, + holder: OmegaImageProcessorsHolder, + extractor: OmegaResourceExtractor + ) { + createRequestCreator(image)?.run { + into(object : DisposableTarget(textView) { + override fun onPrepareLoad(view: TextView, placeHolderDrawable: Drawable?) { + OmegaImageProcessor.applyCompoundDrawable(view, placeHolderDrawable, index) } - override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) { - OmegaImageProcessor.applyCompoundDrawable(textView, errorDrawable, index) + override fun onBitmapFailed(view: TextView, errorDrawable: Drawable?) { + OmegaImageProcessor.applyCompoundDrawable(view, errorDrawable, index) } - override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { - OmegaImageProcessor.applyCompoundDrawable( - textView, - bitmap?.let { BitmapDrawable(textView.resources, bitmap) }, - index - ) + override fun onBitmapLoaded(view: TextView, bitmap: Bitmap?) { + OmegaImageProcessor.applyCompoundDrawable(view, bitmap.toDrawable(view.resources), index) } }) } } - override suspend fun getInput( - entity: OmegaImage, - extractor: OmegaResourceExtractor, - format: OmegaImage.Format, - quality: Int - ): Input? { - return createRequestCreator(entity)?.run { + override suspend fun getInput(image: OmegaImage, extractor: OmegaResourceExtractor, format: Format, quality: Int): Input? { + return createRequestCreator(image)?.run { withContext(Dispatchers.Main) { val stream = WrapperInputStream() - into(object : Target { + val target = object : Target { override fun onPrepareLoad(placeHolderDrawable: Drawable?) { // stream can only send data once } override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) { stream.inputStream = null + targetList.remove(this) } override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { - if (bitmap == null) { - stream.inputStream = null - } else { - stream.inputStream = bitmap.toInputStream(format, quality) - } + stream.inputStream = bitmap?.toInputStream(format, quality) + targetList.remove(this) } - }) + } + targetList.add(target) + into(target) stream.asInput() } - } ?: defaultHolder.getProcessor(entity).getInput(entity, extractor, format, quality) + } ?: defaultHolder.getProcessor(image).getInput(image, extractor, format, quality) } - override fun preload(entity: OmegaImage, extractor: OmegaResourceExtractor) { - createRequestCreator(entity)?.fetch() ?: defaultHolder.getProcessor(entity).preload(entity, extractor) + override fun preload(image: OmegaImage, extractor: OmegaResourceExtractor) { + createRequestCreator(image)?.fetch() ?: defaultHolder.getProcessor(image).preload(image, extractor) + } + + private fun Bitmap?.toDrawable(resources: Resources): Drawable? = this?.let { BitmapDrawable(resources, this) } + + private abstract inner class DisposableTarget(view: T) : Target { + + private val weakViewReference = WeakReference(view) + + init { + targetMap[view.id]?.let { + Picasso.get().cancelRequest(it) + targetMap.remove(view.id) + } + targetMap[view.id] = this + } + + override fun onPrepareLoad(placeHolderDrawable: Drawable?) { + weakViewReference.get()?.let { view -> + onPrepareLoad(view, placeHolderDrawable) + } + } + + abstract fun onPrepareLoad(view: T, placeHolderDrawable: Drawable?) + + override fun onBitmapFailed(e: java.lang.Exception?, errorDrawable: Drawable?) { + weakViewReference.get()?.let { view -> + onBitmapFailed(view, errorDrawable) + targetMap.remove(view.id) + } + } + + abstract fun onBitmapFailed(view: T, errorDrawable: Drawable?) + + override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { + weakViewReference.get()?.let { view -> + onBitmapLoaded(view, bitmap) + targetMap.remove(view.id) + } + } + + abstract fun onBitmapLoaded(view: T, bitmap: Bitmap?) + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 6b33cab..4474d0f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,5 +26,6 @@ include("examples:android") include("examples") include("glide") include("picasso") +include("coil") enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file